diff --git a/res/drawable/screen_resolution_1080p.xml b/res/drawable/screen_resolution_1080p.xml
new file mode 100644
index 0000000..a9d89ee
--- /dev/null
+++ b/res/drawable/screen_resolution_1080p.xml
@@ -0,0 +1,19 @@
+<?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.
+  -->
+
+<shape>
+</shape>
\ No newline at end of file
diff --git a/res/drawable/screen_resolution_1440p.xml b/res/drawable/screen_resolution_1440p.xml
new file mode 100644
index 0000000..a9d89ee
--- /dev/null
+++ b/res/drawable/screen_resolution_1440p.xml
@@ -0,0 +1,19 @@
+<?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.
+  -->
+
+<shape>
+</shape>
\ No newline at end of file
diff --git a/res/values/config.xml b/res/values/config.xml
index 216d9e0..8933305 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -580,6 +580,18 @@
         -->
     </string-array>
 
+    <!-- The option list for switch screen resolution -->
+    <string-array name="config_screen_resolution_options_strings" translatable="false">
+        <item>@string/screen_resolution_option_high</item>
+        <item>@string/screen_resolution_option_highest</item>
+    </string-array>
+
+    <!-- The option summary list for screen resolution -->
+    <string-array name="config_screen_resolution_summaries_strings" translatable="false">
+        <item>@string/screen_resolution_summary_high</item>
+        <item>@string/screen_resolution_summary_highest</item>
+    </string-array>
+
     <!-- Whether to aggregate for network selection list-->
     <bool name="config_network_selection_list_aggregation_enabled">false</bool>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 87272b5..d16a63e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2908,6 +2908,18 @@
     <string name="auto_rotate_option_face_based">On - Face-based</string>
     <!-- SmartAutoRotatePreferenceFragment settings screen, face-based rotation switch label [CHAR LIMIT=30] -->
     <string name="auto_rotate_switch_face_based">Enable Face Detection</string>
+
+    <!-- Display settings screen, screen resolution settings title [CHAR LIMIT=30] -->
+    <string name="screen_resolution_title">Screen resolution</string>
+    <!-- Display settings screen, screen resolution option for "FHD+" [CHAR LIMIT=45] -->
+    <string name="screen_resolution_option_high">High resolution</string>
+    <!-- Display settings screen, screen resolution option for "QHD+" [CHAR LIMIT=45] -->
+    <string name="screen_resolution_option_highest">Highest resolution</string>
+    <!-- Display settings screen, "FHD+" screen resolution summary [CHAR LIMIT=NONE] -->
+    <string name="screen_resolution_summary_high">1080p FHD+</string>
+    <!-- Display settings screen, "QHD+" screen resolution summary [CHAR LIMIT=NONE] -->
+    <string name="screen_resolution_summary_highest">1440p QHD+</string>
+
     <!-- Display settings screen, Color mode settings title [CHAR LIMIT=30] -->
     <string name="color_mode_title">Colors</string>
     <!-- Display settings screen, Color mode option for "natural(sRGB) color"  [CHAR LIMIT=45] -->
@@ -5200,9 +5212,9 @@
     <!-- Title for accessibility shortcut preference for magnification. [CHAR LIMIT=60] -->
     <string name="accessibility_screen_magnification_shortcut_title">Magnification shortcut</string>
     <!-- Title for accessibility follow typing preference for magnification. [CHAR LIMIT=35] -->
-    <string name="accessibility_screen_magnification_follow_typing_title">Follow typing</string>
+    <string name="accessibility_screen_magnification_follow_typing_title">Magnify typing</string>
     <!-- Summary for accessibility follow typing preference for magnification. [CHAR LIMIT=none] -->
-    <string name="accessibility_screen_magnification_follow_typing_summary">Magnification area automatically follows the text as you type</string>
+    <string name="accessibility_screen_magnification_follow_typing_summary">Magnifier follows text as you type</string>
     <!-- Title for screen magnification footer. [CHAR LIMIT=60] -->
     <string name="accessibility_screen_magnification_about_title">About magnification</string>
     <!-- Screen magnification footer link content description [CHAR LIMIT=NONE] -->
@@ -8269,6 +8281,8 @@
     <string name="keywords_default_apps">apps, default</string>
     <string name="keywords_ignore_optimizations">ignore optimizations, doze, app standby</string>
     <string name="keywords_color_mode">vibrant, RGB, sRGB, color, natural, standard</string>
+    <!-- Search keyword for "screen resolution" settings [CHAR_LIMIT=NONE]-->
+    <string name="keywords_screen_resolution">FHD, QHD, resolution, 1080p, 1440p</string>
     <string name="keywords_color_temperature">color, temperature, D65, D73, white, yellow, blue, warm, cool</string>
     <string name="keywords_lockscreen">slide to unlock, password, pattern, PIN</string>
     <!-- Search keyword for App pinning Settings [CHAR LIMIT=NONE] -->
@@ -11829,8 +11843,14 @@
     <string name="one_handed_mode_swipe_down_category">Swipe down to</string>
     <!-- Category title for one handed use the shortcut [CHAR_LIMIT=60] -->
     <string name="one_handed_mode_use_shortcut_category">Use the shortcut to</string>
+    <!-- One-handed mode intro Text [CHAR_LIMIT=NONE] -->
+    <string name="one_handed_mode_intro_text">Pull down the top half of your screen so it\u2019s easier to reach with one hand</string>
     <!-- One-handed mode Intro Text [CHAR_LIMIT=NONE] -->
-    <string name="one_handed_mode_intro_text">To use one handed mode, swipe down from the bottom edge of the screen. To use this feature, make sure gesture navigation is turned on in system navigation settings.</string>
+    <string name="one_handed_mode_footer_text">
+        <b>How to use one-handed mode</b>\n
+        • Make sure gesture navigation is selected in system navigation settings\n
+        • Swipe down near the bottom edge of the screen
+    </string>
     <!-- One-handed mode pull down screen into reach action title [CHAR_LIMIT=60] -->
     <string name="one_handed_action_pull_down_screen_title">Pull screen into reach</string>
     <!-- One-handed mode pull down screen into reach action title [CHAR_LIMIT=NONE] -->
@@ -13360,7 +13380,7 @@
     <!-- Device controls toggle name [CHAR LIMIT=60] -->
     <string name="lockscreen_privacy_controls_setting_toggle">Show device controls</string>
     <!-- Device controls summary [CHAR LIMIT=NONE] -->
-    <string name="lockscreen_privacy_controls_summary">Access controls when locked</string>
+    <string name="lockscreen_privacy_controls_summary">Show controls for external devices from the lock screen</string>
     <!-- Trivial Device controls toggle name [CHAR LIMIT=60] -->
     <string name="lockscreen_trivial_controls_setting_toggle">Control from locked device</string>
     <!-- Trivial Device controls summary [CHAR LIMIT=NONE] -->
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index ba52a30..03d073b 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -117,6 +117,13 @@
             settings:keywords="@string/keywords_auto_rotate"
             settings:controller="com.android.settings.display.DeviceStateAutoRotateOverviewController"/>
 
+        <Preference
+            android:key="screen_resolution"
+            android:title="@string/screen_resolution_title"
+            android:fragment="com.android.settings.display.ScreenResolutionFragment"
+            settings:keywords="@string/keywords_screen_resolution"
+            settings:controller="com.android.settings.display.ScreenResolutionController"/>
+
         <SwitchPreference
             android:key="display_white_balance"
             android:title="@string/display_white_balance_title"
diff --git a/res/xml/one_handed_settings.xml b/res/xml/one_handed_settings.xml
index 523cf4d..7406993 100644
--- a/res/xml/one_handed_settings.xml
+++ b/res/xml/one_handed_settings.xml
@@ -22,6 +22,10 @@
     android:persistent="false"
     android:title="@string/one_handed_title">
 
+    <com.android.settingslib.widget.TopIntroPreference
+        android:key="gesture_one_handed_mode_intro"
+        android:title="@string/one_handed_mode_intro_text"/>
+
     <com.android.settingslib.widget.IllustrationPreference
         android:key="one_handed_header"
         settings:searchable="false"
@@ -33,10 +37,6 @@
         settings:keywords="@string/keywords_one_handed"
         settings:controller="com.android.settings.gestures.OneHandedMainSwitchPreferenceController"/>
 
-    <com.android.settingslib.widget.TopIntroPreference
-        android:key="gesture_one_handed_mode_intro_text"
-        android:title="@string/one_handed_mode_intro_text"/>
-
     <PreferenceCategory
         android:key="gesture_one_handed_mode_swipe_down"
         android:title="@string/one_handed_mode_swipe_down_category"
@@ -46,13 +46,18 @@
             android:key="gesture_one_handed_action_pull_screen_down"
             android:title="@string/one_handed_action_pull_down_screen_title"
             android:summary="@string/one_handed_action_pull_down_screen_summary"
-            settings:controller="com.android.settings.gestures.OneHandedActionPullDownPrefController"/>
+            settings:controller="com.android.settings.gesture_one_handed_mode_footer_textgestures.OneHandedActionPullDownPrefController"/>
 
         <com.android.settingslib.widget.SelectorWithWidgetPreference
             android:key="gesture_one_handed_action_show_notification"
             android:title="@string/one_handed_action_show_notification_title"
             android:summary="@string/one_handed_action_show_notification_summary"
             settings:controller="com.android.settings.gestures.OneHandedActionShowNotificationPrefController"/>
-
     </PreferenceCategory>
+
+    <com.android.settingslib.widget.FooterPreference
+        android:key="one_handed_mode_footer"
+        android:title="@string/one_handed_mode_footer_text"
+        android:selectable="false"
+        settings:searchable="false"/>
 </PreferenceScreen>
diff --git a/res/xml/screen_resolution_settings.xml b/res/xml/screen_resolution_settings.xml
new file mode 100644
index 0000000..a305488
--- /dev/null
+++ b/res/xml/screen_resolution_settings.xml
@@ -0,0 +1,21 @@
+<?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.
+  -->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:title="@string/screen_resolution_title"
+    android:key="screen_resolution" />
diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java
index c679330..0ff960f 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java
@@ -42,7 +42,7 @@
         final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
         final String title = getContext().getString(
                 R.string.accessibility_text_reading_options_title);
-        final Drawable icon = getContext().getDrawable(R.drawable.ic_font_download);
+        final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
         icon.setTintList(Utils.getColorAttr(getContext(), android.R.attr.colorPrimary));
         AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
                 /* description= */ null, icon);
diff --git a/src/com/android/settings/biometrics/face/FaceUpdater.java b/src/com/android/settings/biometrics/face/FaceUpdater.java
index bb77cae..3a1f77c 100644
--- a/src/com/android/settings/biometrics/face/FaceUpdater.java
+++ b/src/com/android/settings/biometrics/face/FaceUpdater.java
@@ -104,7 +104,7 @@
         public void onEnrollmentProgress(int remaining) {
             mCallback.onEnrollmentProgress(remaining);
             if (remaining == 0) {
-                BiometricsSafetySource.sendSafetyData(mContext); // biometrics data changed
+                BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed
             }
         }
     }
@@ -131,7 +131,7 @@
         @Override
         public void onRemovalSucceeded(@Nullable Face fp, int remaining) {
             mCallback.onRemovalSucceeded(fp, remaining);
-            BiometricsSafetySource.sendSafetyData(mContext); // biometrics data changed
+            BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed
         }
     }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java b/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java
index 75d8f7b..66ed085 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java
@@ -88,7 +88,7 @@
         public void onEnrollmentProgress(int remaining) {
             mCallback.onEnrollmentProgress(remaining);
             if (remaining == 0) {
-                BiometricsSafetySource.sendSafetyData(mContext); // biometrics data changed
+                BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed
             }
         }
     }
@@ -115,7 +115,7 @@
         @Override
         public void onRemovalSucceeded(@Nullable Fingerprint fp, int remaining) {
             mCallback.onRemovalSucceeded(fp, remaining);
-            BiometricsSafetySource.sendSafetyData(mContext); // biometrics data changed
+            BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed
         }
     }
 }
diff --git a/src/com/android/settings/display/ScreenResolutionController.java b/src/com/android/settings/display/ScreenResolutionController.java
new file mode 100644
index 0000000..dca1275
--- /dev/null
+++ b/src/com/android/settings/display/ScreenResolutionController.java
@@ -0,0 +1,87 @@
+/*
+ * 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.settings.display;
+
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.view.Display;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+/** Controller that switch the screen resolution. */
+public class ScreenResolutionController extends BasePreferenceController {
+
+    static final int FHD_WIDTH = 1080;
+    static final int QHD_WIDTH = 1440;
+
+    private Display mDisplay;
+
+    public ScreenResolutionController(Context context, String key) {
+        super(context, key);
+
+        mDisplay =
+                mContext.getSystemService(DisplayManager.class).getDisplay(Display.DEFAULT_DISPLAY);
+    }
+
+    /** Check if the width is supported by the display. */
+    private boolean isSupportedMode(int width) {
+        for (Display.Mode mode : getSupportedModes()) {
+            if (mode.getPhysicalWidth() == width) return true;
+        }
+        return false;
+    }
+
+    /** Return true if the device contains two (or more) resolutions. */
+    protected boolean checkSupportedResolutions() {
+        return isSupportedMode(FHD_WIDTH) && isSupportedMode(QHD_WIDTH);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return (checkSupportedResolutions()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        String summary = null;
+        switch (getDisplayWidth()) {
+            case FHD_WIDTH:
+                summary = mContext.getString(R.string.screen_resolution_summary_high);
+                break;
+            case QHD_WIDTH:
+                summary = mContext.getString(R.string.screen_resolution_summary_highest);
+                break;
+            default:
+                summary = mContext.getString(R.string.screen_resolution_title);
+        }
+
+        return summary;
+    }
+
+    @VisibleForTesting
+    public int getDisplayWidth() {
+        return mDisplay.getMode().getPhysicalWidth();
+    }
+
+    @VisibleForTesting
+    public Display.Mode[] getSupportedModes() {
+        return mDisplay.getSupportedModes();
+    }
+}
diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java
new file mode 100644
index 0000000..3195772
--- /dev/null
+++ b/src/com/android/settings/display/ScreenResolutionFragment.java
@@ -0,0 +1,217 @@
+/*
+ * 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.settings.display;
+
+import static com.android.settings.display.ScreenResolutionController.FHD_WIDTH;
+import static com.android.settings.display.ScreenResolutionController.QHD_WIDTH;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.drawable.Drawable;
+import android.hardware.display.DisplayManager;
+import android.text.TextUtils;
+import android.view.Display;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.widget.CandidateInfo;
+import com.android.settingslib.widget.IllustrationPreference;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Preference fragment used for switch screen resolution */
+@SearchIndexable
+public class ScreenResolutionFragment extends RadioButtonPickerFragment {
+
+    private static final String TAG = "ScreenResolution";
+
+    private Resources mResources;
+    private static final int FHD_INDEX = 0;
+    private static final int QHD_INDEX = 1;
+    private Display mDefaultDisplay;
+    private String[] mScreenResolutionOptions;
+    private Set<Point> mResolutions;
+
+    private IllustrationPreference mImagePreference;
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mDefaultDisplay =
+                context.getSystemService(DisplayManager.class).getDisplay(Display.DEFAULT_DISPLAY);
+        mResources = context.getResources();
+        mScreenResolutionOptions =
+                mResources.getStringArray(R.array.config_screen_resolution_options_strings);
+        mResolutions = getAllSupportedResolution();
+        mImagePreference = new IllustrationPreference(context);
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.screen_resolution_settings;
+    }
+
+    @Override
+    protected void addStaticPreferences(PreferenceScreen screen) {
+        updateIllustrationImage(mImagePreference);
+        screen.addPreference(mImagePreference);
+    }
+
+    @Override
+    protected List<? extends CandidateInfo> getCandidates() {
+        final List<ScreenResolutionCandidateInfo> candidates = new ArrayList<>();
+
+        for (int i = 0; i < mScreenResolutionOptions.length; i++) {
+            candidates.add(
+                    new ScreenResolutionCandidateInfo(
+                            mScreenResolutionOptions[i],
+                            mScreenResolutionOptions[i],
+                            true /* enabled */));
+        }
+
+        return candidates;
+    }
+
+    /** Get all supported resolutions on the device. */
+    private Set<Point> getAllSupportedResolution() {
+        Set<Point> resolutions = new HashSet<>();
+        for (Display.Mode mode : mDefaultDisplay.getSupportedModes()) {
+            resolutions.add(new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight()));
+        }
+
+        return resolutions;
+    }
+
+    /** Get prefer display mode. */
+    private Display.Mode getPreferMode(int width) {
+        for (Point resolution : mResolutions) {
+            if (resolution.x == width) {
+                return new Display.Mode(
+                        resolution.x, resolution.y, getDisplayMode().getRefreshRate());
+            }
+        }
+
+        return getDisplayMode();
+    }
+
+    /** Get current display mode. */
+    @VisibleForTesting
+    public Display.Mode getDisplayMode() {
+        return mDefaultDisplay.getMode();
+    }
+
+    /** Using display manager to set the display mode. */
+    @VisibleForTesting
+    public void setDisplayMode(int width) {
+        mDefaultDisplay.setUserPreferredDisplayMode(getPreferMode(width));
+    }
+
+    /** Get the key corresponding to the resolution. */
+    @VisibleForTesting
+    String getKeyForResolution(int width) {
+        return width == FHD_WIDTH
+                ? mScreenResolutionOptions[FHD_INDEX]
+                : width == QHD_WIDTH ? mScreenResolutionOptions[QHD_INDEX] : null;
+    }
+
+    @Override
+    protected String getDefaultKey() {
+        int physicalWidth = getDisplayMode().getPhysicalWidth();
+
+        return getKeyForResolution(physicalWidth);
+    }
+
+    @Override
+    protected boolean setDefaultKey(String key) {
+        if (mScreenResolutionOptions[FHD_INDEX].equals(key)) {
+            setDisplayMode(FHD_WIDTH);
+
+        } else if (mScreenResolutionOptions[QHD_INDEX].equals(key)) {
+            setDisplayMode(QHD_WIDTH);
+        }
+
+        updateIllustrationImage(mImagePreference);
+        return true;
+    }
+
+    /** Update the resolution image according display mode. */
+    private void updateIllustrationImage(IllustrationPreference preference) {
+        String key = getDefaultKey();
+
+        if (TextUtils.equals(mScreenResolutionOptions[FHD_INDEX], key)) {
+            preference.setLottieAnimationResId(R.drawable.screen_resolution_1080p);
+        } else if (TextUtils.equals(mScreenResolutionOptions[QHD_INDEX], key)) {
+            preference.setLottieAnimationResId(R.drawable.screen_resolution_1440p);
+        }
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.SCREEN_RESOLUTION;
+    }
+
+    static class ScreenResolutionCandidateInfo extends CandidateInfo {
+        private final CharSequence mLabel;
+        private final String mKey;
+
+        ScreenResolutionCandidateInfo(CharSequence label, String key, boolean enabled) {
+            super(enabled);
+            mLabel = label;
+            mKey = key;
+        }
+
+        @Override
+        public CharSequence loadLabel() {
+            return mLabel;
+        }
+
+        @Override
+        public Drawable loadIcon() {
+            return null;
+        }
+
+        @Override
+        public String getKey() {
+            return mKey;
+        }
+    }
+
+    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider(R.xml.screen_resolution_settings) {
+
+                boolean mIsFHDSupport = false;
+                boolean mIsQHDSupport = false;
+
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    ScreenResolutionController mController =
+                            new ScreenResolutionController(context, "fragment");
+                    return mController.checkSupportedResolutions();
+                }
+            };
+}
diff --git a/src/com/android/settings/flashlight/FlashlightHandleActivity.java b/src/com/android/settings/flashlight/FlashlightHandleActivity.java
index 5894965..0847d49 100644
--- a/src/com/android/settings/flashlight/FlashlightHandleActivity.java
+++ b/src/com/android/settings/flashlight/FlashlightHandleActivity.java
@@ -21,12 +21,13 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings;
+import android.util.Log;
 
 import com.android.settings.R;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.search.Indexable;
-import com.android.settingslib.search.SearchIndexableRaw;
 import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.search.SearchIndexableRaw;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,6 +40,9 @@
 
     public static final String EXTRA_FALLBACK_TO_HOMEPAGE = "fallback_to_homepage";
 
+    private static final String TAG = "FlashlightActivity";
+    private static final String DATA_KEY = "flashlight";
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -69,10 +73,20 @@
                     data.intentTargetPackage = context.getPackageName();
                     data.intentTargetClass = FlashlightHandleActivity.class.getName();
                     data.intentAction = Intent.ACTION_MAIN;
-                    data.key = "flashlight";
+                    data.key = DATA_KEY;
                     result.add(data);
 
                     return result;
                 }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    List<String> keys = super.getNonIndexableKeys(context);
+                    if (!FlashlightSlice.isFlashlightAvailable(context)) {
+                        Log.i(TAG, "Flashlight is unavailable");
+                        keys.add(DATA_KEY);
+                    }
+                    return keys;
+                }
             };
 }
diff --git a/src/com/android/settings/flashlight/FlashlightSlice.java b/src/com/android/settings/flashlight/FlashlightSlice.java
index eaf059a..5feaf4f 100644
--- a/src/com/android/settings/flashlight/FlashlightSlice.java
+++ b/src/com/android/settings/flashlight/FlashlightSlice.java
@@ -39,7 +39,6 @@
 import androidx.slice.builders.ListBuilder.RowBuilder;
 import androidx.slice.builders.SliceAction;
 
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.slices.CustomSliceRegistry;
@@ -138,7 +137,6 @@
         return null;
     }
 
-    @VisibleForTesting
     static boolean isFlashlightAvailable(Context context) {
         int defaultAvailability = 0;
         try {
diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
index 6a93bda..59408c7 100644
--- a/src/com/android/settings/safetycenter/BiometricsSafetySource.java
+++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
@@ -22,6 +22,7 @@
 import android.hardware.face.FaceManager;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
+import android.safetycenter.SafetyEvent;
 import android.safetycenter.SafetySourceData;
 import android.safetycenter.SafetySourceStatus;
 
@@ -38,11 +39,10 @@
 
     public static final String SAFETY_SOURCE_ID = "Biometrics";
 
-    private BiometricsSafetySource() {
-    }
+    private BiometricsSafetySource() {}
 
-    /** Sends biometric safety data to Safety Center. */
-    public static void sendSafetyData(Context context) {
+    /** Sets biometric safety data for Safety Center. */
+    public static void setSafetySourceData(Context context, SafetyEvent safetyEvent) {
         if (!SafetyCenterManagerWrapper.get().isEnabled(context)) {
             return;
         }
@@ -54,13 +54,14 @@
         if (combinedBiometricStatusUtils.isAvailable()) {
             final RestrictedLockUtils.EnforcedAdmin disablingAdmin =
                     combinedBiometricStatusUtils.getDisablingAdmin();
-            sendBiometricSafetySourceData(context,
+            setBiometricSafetySourceData(context,
                     context.getString(R.string.security_settings_biometric_preference_title),
                     combinedBiometricStatusUtils.getSummary(),
                     biometricNavigationUtils.getBiometricSettingsIntent(context,
                             combinedBiometricStatusUtils.getSettingsClassName(), disablingAdmin,
                             Bundle.EMPTY),
-                    disablingAdmin == null /* enabled */);
+                    disablingAdmin == null /* enabled */,
+                    safetyEvent);
             return;
         }
 
@@ -70,13 +71,15 @@
         if (faceStatusUtils.isAvailable()) {
             final RestrictedLockUtils.EnforcedAdmin disablingAdmin =
                     faceStatusUtils.getDisablingAdmin();
-            sendBiometricSafetySourceData(context,
+            setBiometricSafetySourceData(context,
                     context.getString(R.string.security_settings_face_preference_title),
                     faceStatusUtils.getSummary(),
                     biometricNavigationUtils.getBiometricSettingsIntent(context,
                             faceStatusUtils.getSettingsClassName(), disablingAdmin,
                             Bundle.EMPTY),
-                    disablingAdmin == null /* enabled */);
+                    disablingAdmin == null /* enabled */,
+                    safetyEvent);
+
             return;
         }
 
@@ -87,27 +90,37 @@
         if (fingerprintStatusUtils.isAvailable()) {
             final RestrictedLockUtils.EnforcedAdmin disablingAdmin =
                     fingerprintStatusUtils.getDisablingAdmin();
-            sendBiometricSafetySourceData(context,
+            setBiometricSafetySourceData(context,
                     context.getString(R.string.security_settings_fingerprint_preference_title),
                     fingerprintStatusUtils.getSummary(),
                     biometricNavigationUtils.getBiometricSettingsIntent(context,
                             fingerprintStatusUtils.getSettingsClassName(), disablingAdmin,
                             Bundle.EMPTY),
-                    disablingAdmin == null /* enabled */);
+                    disablingAdmin == null /* enabled */,
+                    safetyEvent);
         }
     }
 
-    private static void sendBiometricSafetySourceData(Context context, String title, String summary,
-            Intent clickIntent, boolean enabled) {
+    /** Notifies Safety Center of a change in biometrics settings. */
+    public static void onBiometricsChanged(Context context) {
+        setSafetySourceData(
+                context,
+                new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build()
+        );
+    }
+
+    private static void setBiometricSafetySourceData(Context context, String title, String summary,
+            Intent clickIntent, boolean enabled, SafetyEvent safetyEvent) {
         final PendingIntent pendingIntent = createPendingIntent(context, clickIntent);
 
         final SafetySourceStatus status = new SafetySourceStatus.Builder(title, summary,
                 SafetySourceStatus.STATUS_LEVEL_NONE, pendingIntent)
                 .setEnabled(enabled).build();
-        final SafetySourceData safetySourceData = new SafetySourceData.Builder(SAFETY_SOURCE_ID)
-                .setStatus(status).build();
+        final SafetySourceData safetySourceData =
+                new SafetySourceData.Builder().setStatus(status).build();
 
-        SafetyCenterManagerWrapper.get().sendSafetyCenterUpdate(context, safetySourceData);
+        SafetyCenterManagerWrapper.get().setSafetySourceData(
+                context, SAFETY_SOURCE_ID, safetySourceData, safetyEvent);
     }
 
     private static PendingIntent createPendingIntent(Context context, Intent intent) {
diff --git a/src/com/android/settings/safetycenter/LockScreenSafetySource.java b/src/com/android/settings/safetycenter/LockScreenSafetySource.java
index d010821..ad0bd3a 100644
--- a/src/com/android/settings/safetycenter/LockScreenSafetySource.java
+++ b/src/com/android/settings/safetycenter/LockScreenSafetySource.java
@@ -16,11 +16,14 @@
 
 package com.android.settings.safetycenter;
 
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED;
+
 import android.app.PendingIntent;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
 import android.os.UserHandle;
+import android.safetycenter.SafetyEvent;
 import android.safetycenter.SafetySourceData;
 import android.safetycenter.SafetySourceIssue;
 import android.safetycenter.SafetySourceStatus;
@@ -42,9 +45,10 @@
     private LockScreenSafetySource() {
     }
 
-    /** Sends lock screen safety data to Safety Center. */
-    public static void sendSafetyData(Context context,
-            ScreenLockPreferenceDetailsUtils screenLockPreferenceDetailsUtils) {
+    /** Sets lock screen safety data for Safety Center. */
+    public static void setSafetySourceData(Context context,
+            ScreenLockPreferenceDetailsUtils screenLockPreferenceDetailsUtils,
+            SafetyEvent safetyEvent) {
         if (!SafetyCenterManagerWrapper.get().isEnabled(context)) {
             return;
         }
@@ -71,21 +75,27 @@
                 .setEnabled(
                         !screenLockPreferenceDetailsUtils.isPasswordQualityManaged(userId, admin))
                 .setIconAction(gearMenuIconAction).build();
-        final SafetySourceData.Builder safetySourceDataBuilder = new SafetySourceData.Builder(
-                SAFETY_SOURCE_ID).setStatus(status);
+        final SafetySourceData.Builder safetySourceDataBuilder =
+                new SafetySourceData.Builder().setStatus(status);
         if (!screenLockPreferenceDetailsUtils.isLockPatternSecure()) {
             safetySourceDataBuilder.addIssue(createNoScreenLockIssue(context, pendingIntent));
         }
         final SafetySourceData safetySourceData = safetySourceDataBuilder.build();
 
-        SafetyCenterManagerWrapper.get().sendSafetyCenterUpdate(context, safetySourceData);
+        SafetyCenterManagerWrapper.get().setSafetySourceData(
+                context,
+                SAFETY_SOURCE_ID,
+                safetySourceData,
+                safetyEvent
+        );
     }
 
     /** Notifies Safety Center of a change in lock screen settings. */
     public static void onLockScreenChange(Context context) {
-        sendSafetyData(
+        setSafetySourceData(
                 context,
-                new ScreenLockPreferenceDetailsUtils(context, SettingsEnums.SAFETY_CENTER));
+                new ScreenLockPreferenceDetailsUtils(context, SettingsEnums.SAFETY_CENTER),
+                new SafetyEvent.Builder(SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build());
     }
 
     private static IconAction createGearMenuIconAction(Context context,
diff --git a/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java b/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java
index e4a1d67..e720526 100644
--- a/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java
+++ b/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.safetycenter.SafetyCenterManager;
+import android.safetycenter.SafetyEvent;
 import android.safetycenter.SafetySourceData;
 import android.util.Log;
 
@@ -26,7 +27,12 @@
 /** A wrapper for the SafetyCenterManager system service. */
 public class SafetyCenterManagerWrapper {
 
-    private static final String TAG = "SafetyCenterManagerWrapper";
+    /**
+     * Tag for logging.
+     *
+     * <p>The tag is restricted to 23 characters (the maximum allowed for Android logging).
+     */
+    private static final String TAG = "SafetyCenterManagerWrap";
 
     @VisibleForTesting
     public static SafetyCenterManagerWrapper sInstance;
@@ -41,8 +47,10 @@
         return sInstance;
     }
 
-    /** Sends updated safety source data to Safety Center. */
-    public void sendSafetyCenterUpdate(Context context, SafetySourceData safetySourceData) {
+    /** Sets the latest safety source data for Safety Center. */
+    public void setSafetySourceData(Context context, String safetySourceId,
+            SafetySourceData safetySourceData,
+            SafetyEvent safetyEvent) {
         SafetyCenterManager safetyCenterManager =
                 context.getSystemService(SafetyCenterManager.class);
 
@@ -52,7 +60,11 @@
         }
 
         try {
-            safetyCenterManager.sendSafetyCenterUpdate(safetySourceData);
+            safetyCenterManager.setSafetySourceData(
+                    safetySourceId,
+                    safetySourceData,
+                    safetyEvent
+            );
         } catch (Exception e) {
             Log.e(TAG, "Failed to send SafetySourceData", e);
             return;
diff --git a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
index a0d18c7..38458d9 100644
--- a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
+++ b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
@@ -19,11 +19,14 @@
 import static android.content.Intent.ACTION_BOOT_COMPLETED;
 import static android.safetycenter.SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES;
 import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED;
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED;
 
 import android.app.settings.SettingsEnums;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.safetycenter.SafetyEvent;
 
 import com.android.settings.security.ScreenLockPreferenceDetailsUtils;
 
@@ -34,6 +37,11 @@
 /** Broadcast receiver for handling requests from Safety Center for fresh data. */
 public class SafetySourceBroadcastReceiver extends BroadcastReceiver {
 
+    private static final SafetyEvent EVENT_REFRESH_REQUESTED =
+            new SafetyEvent.Builder(SAFETY_EVENT_TYPE_REFRESH_REQUESTED).build();
+    private static final SafetyEvent EVENT_DEVICE_REBOOTED =
+            new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build();
+
     @Override
     public void onReceive(Context context, Intent intent) {
         if (!SafetyCenterManagerWrapper.get().isEnabled(context)) {
@@ -44,31 +52,37 @@
             String[] sourceIdsExtra =
                     intent.getStringArrayExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS);
             if (sourceIdsExtra != null && sourceIdsExtra.length > 0) {
-                refreshSafetySources(context, ImmutableList.copyOf(sourceIdsExtra));
+                refreshSafetySources(
+                        context,
+                        ImmutableList.copyOf(sourceIdsExtra),
+                        EVENT_REFRESH_REQUESTED);
             }
             return;
         }
 
 
         if (ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
-            refreshAllSafetySources(context);
+            refreshAllSafetySources(context, EVENT_DEVICE_REBOOTED);
         }
     }
 
-    private static void refreshSafetySources(Context context, List<String> sourceIds) {
+    private static void refreshSafetySources(Context context, List<String> sourceIds,
+            SafetyEvent safetyEvent) {
         if (sourceIds.contains(LockScreenSafetySource.SAFETY_SOURCE_ID)) {
-            LockScreenSafetySource.sendSafetyData(context,
-                    new ScreenLockPreferenceDetailsUtils(context, SettingsEnums.SAFETY_CENTER));
+            LockScreenSafetySource.setSafetySourceData(context,
+                    new ScreenLockPreferenceDetailsUtils(context, SettingsEnums.SAFETY_CENTER),
+                    safetyEvent);
         }
 
         if (sourceIds.contains(BiometricsSafetySource.SAFETY_SOURCE_ID)) {
-            BiometricsSafetySource.sendSafetyData(context);
+            BiometricsSafetySource.setSafetySourceData(context, safetyEvent);
         }
     }
 
-    private static void refreshAllSafetySources(Context context) {
-        LockScreenSafetySource.sendSafetyData(context,
-                new ScreenLockPreferenceDetailsUtils(context, SettingsEnums.SAFETY_CENTER));
-        BiometricsSafetySource.sendSafetyData(context);
+    private static void refreshAllSafetySources(Context context, SafetyEvent safetyEvent) {
+        LockScreenSafetySource.setSafetySourceData(context,
+                new ScreenLockPreferenceDetailsUtils(context, SettingsEnums.SAFETY_CENTER),
+                safetyEvent);
+        BiometricsSafetySource.setSafetySourceData(context, safetyEvent);
     }
 }
diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java
index c3657be..a3c8e69 100644
--- a/src/com/android/settings/users/UserDetailsSettings.java
+++ b/src/com/android/settings/users/UserDetailsSettings.java
@@ -256,7 +256,7 @@
 
         mSwitchUserPref.setTitle(
                 context.getString(com.android.settingslib.R.string.user_switch_to_user,
-                        UserSettings.getUserName(context, mUserInfo)));
+                        mUserInfo.name));
 
         if (mUserCaps.mDisallowSwitchUser) {
             mSwitchUserPref.setDisabledByAdmin(RestrictedLockUtilsInternal.getDeviceOwner(context));
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 9878b44..64a65a4 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.users;
 
-import android.annotation.NonNull;
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.Dialog;
@@ -562,11 +561,10 @@
         extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userInfo.id);
         extras.putBoolean(AppRestrictionsFragment.EXTRA_NEW_USER, newUser);
 
-        final Context context = getContext();
-        SubSettingLauncher launcher = new SubSettingLauncher(context)
+        SubSettingLauncher launcher = new SubSettingLauncher(getContext())
                 .setDestination(UserDetailsSettings.class.getName())
                 .setArguments(extras)
-                .setTitleText(getUserName(context, userInfo))
+                .setTitleText(userInfo.name)
                 .setSourceMetricsCategory(getMetricsCategory());
         if (mGuestUserAutoCreated && userInfo.isGuest()) {
             launcher.setResultListener(this, REQUEST_EDIT_GUEST);
@@ -956,8 +954,7 @@
             // "Resetting guest..."
             mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
             mExecutor.execute(() -> {
-                UserInfo guest = mUserManager.createGuest(
-                        getContext(), getString(com.android.settingslib.R.string.user_guest));
+                UserInfo guest = mUserManager.createGuest(getContext());
                 mGuestCreationScheduled.set(false);
                 if (guest == null) {
                     Log.e(TAG, "Unable to automatically recreate guest user");
@@ -996,9 +993,8 @@
             if (user.id == UserHandle.myUserId()) {
                 pref = mMePreference;
             } else {
-                final Context prefContext = getPrefContext();
-                pref = new UserPreference(prefContext, null, user.id);
-                pref.setTitle(getUserName(prefContext, user));
+                pref = new UserPreference(getPrefContext(), null, user.id);
+                pref.setTitle(user.name);
                 userPreferences.add(pref);
                 pref.setOnPreferenceClickListener(this);
                 pref.setEnabled(canOpenUserDetails);
@@ -1228,14 +1224,6 @@
         }
     }
 
-    /** Returns the user's name, or the appropriate string in the case of a Guest. */
-    public static String getUserName(Context context, @NonNull UserInfo userInfo) {
-        if (userInfo.isGuest()) {
-            return context.getString(R.string.user_guest);
-        }
-        return userInfo.name;
-    }
-
     @Override
     public boolean onPreferenceClick(Preference pref) {
         if (pref == mMePreference) {
@@ -1272,8 +1260,7 @@
             mAddGuest.setEnabled(false); // prevent multiple tap issue
             mMetricsFeatureProvider.action(getActivity(), SettingsEnums.ACTION_USER_GUEST_ADD);
             Trace.beginSection("UserSettings.addGuest");
-            UserInfo guest = mUserManager.createGuest(
-                    getContext(), getString(com.android.settingslib.R.string.user_guest));
+            UserInfo guest = mUserManager.createGuest(getContext());
             Trace.endSection();
             if (guest == null) {
                 Toast.makeText(getContext(),
diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
index 0fa3d5c..1376712 100644
--- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
@@ -662,12 +662,12 @@
     public void onPreferenceClick_addGuestClicked_createGuestAndOpenDetails() {
         UserInfo createdGuest = getGuest(false);
         removeFlag(createdGuest, UserInfo.FLAG_INITIALIZED);
-        doReturn(createdGuest).when(mUserManager).createGuest(mActivity, "Guest");
+        doReturn(createdGuest).when(mUserManager).createGuest(mActivity);
         doReturn(mActivity).when(mFragment).getContext();
 
         mFragment.onPreferenceClick(mAddGuestPreference);
 
-        verify(mUserManager).createGuest(mActivity, "Guest");
+        verify(mUserManager).createGuest(mActivity);
         Intent startedIntent = shadowOf(mActivity).getNextStartedActivity();
         ShadowIntent shadowIntent = shadowOf(startedIntent);
         assertThat(shadowIntent.getIntentClass()).isEqualTo(SubSettings.class);
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
new file mode 100644
index 0000000..a32904e
--- /dev/null
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.view.Display;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.core.BasePreferenceController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ScreenResolutionControllerTest {
+
+    private static final int FHD_WIDTH = 1080;
+    private static final int QHD_WIDTH = 1440;
+
+    private ScreenResolutionController mController;
+
+    @Before
+    public void setUp() {
+        Context context = spy(ApplicationProvider.getApplicationContext());
+        mController = spy(new ScreenResolutionController(context, "test"));
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasFhdAndQhdModes_returnAvailable() {
+        Display.Mode modeA = new Display.Mode(0, FHD_WIDTH, 0, 0);
+        Display.Mode modeB = new Display.Mode(0, QHD_WIDTH, 0, 0);
+        Display.Mode[] modes = {modeA, modeB};
+        doReturn(modes).when(mController).getSupportedModes();
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasOneMode_returnUnsupported() {
+        Display.Mode modeA = new Display.Mode(0, FHD_WIDTH, 0, 0);
+        Display.Mode[] modes = {modeA};
+        doReturn(modes).when(mController).getSupportedModes();
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void updateState_screenResolutionFHD_shouldSetSummaryToFHD() {
+        int width = FHD_WIDTH;
+        doReturn(width).when(mController).getDisplayWidth();
+
+        assertThat(mController.getSummary().toString()).isEqualTo("1080p FHD+");
+    }
+
+    @Test
+    public void updateState_screenResolutionQHD_shouldSetSummaryToQHD() {
+        int width = QHD_WIDTH;
+        doReturn(width).when(mController).getDisplayWidth();
+
+        assertThat(mController.getSummary().toString()).isEqualTo("1440p QHD+");
+    }
+}
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
new file mode 100644
index 0000000..225a1d9
--- /dev/null
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.view.Display;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ScreenResolutionFragmentTest {
+
+    private Context mContext;
+    private ScreenResolutionFragment mFragment;
+
+    private static final int FHD_WIDTH = 1080;
+    private static final int QHD_WIDTH = 1440;
+
+    @Before
+    @UiThreadTest
+    public void setup() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mFragment = spy(new ScreenResolutionFragment());
+    }
+
+    @Test
+    @UiThreadTest
+    public void getDefaultKey_FHD() {
+        Display.Mode mode = new Display.Mode(0, FHD_WIDTH, 0, 0);
+        doReturn(mode).when(mFragment).getDisplayMode();
+
+        mFragment.onAttach(mContext);
+        assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(FHD_WIDTH));
+    }
+
+    @Test
+    @UiThreadTest
+    public void getDefaultKey_QHD() {
+        Display.Mode mode = new Display.Mode(0, QHD_WIDTH, 0, 0);
+        doReturn(mode).when(mFragment).getDisplayMode();
+
+        mFragment.onAttach(mContext);
+        assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(QHD_WIDTH));
+    }
+
+    @Test
+    @UiThreadTest
+    public void setDefaultKey_FHD() {
+        mFragment.onAttach(mContext);
+
+        mFragment.setDefaultKey(mFragment.getKeyForResolution(FHD_WIDTH));
+
+        verify(mFragment).setDisplayMode(FHD_WIDTH);
+    }
+
+    @Test
+    @UiThreadTest
+    public void setDefaultKey_QHD() {
+        mFragment.onAttach(mContext);
+
+        mFragment.setDefaultKey(mFragment.getKeyForResolution(QHD_WIDTH));
+
+        verify(mFragment).setDisplayMode(QHD_WIDTH);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
index 4a91e8f..13778f7 100644
--- a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.safetycenter;
 
 import static android.provider.Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS;
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -36,6 +37,7 @@
 import android.hardware.fingerprint.Fingerprint;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.UserHandle;
+import android.safetycenter.SafetyEvent;
 import android.safetycenter.SafetySourceData;
 import android.safetycenter.SafetySourceStatus;
 
@@ -66,6 +68,8 @@
     private static final ComponentName COMPONENT_NAME =
             new ComponentName("package", "class");
     private static final UserHandle USER_HANDLE = new UserHandle(UserHandle.myUserId());
+    private static final SafetyEvent EVENT_SOURCE_STATE_CHANGED =
+            new SafetyEvent.Builder(SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
 
     private Context mApplicationContext;
 
@@ -103,27 +107,61 @@
     }
 
     @Test
-    public void sendSafetyData_whenSafetyCenterIsDisabled_sendsNoData() {
+    public void setSafetyData_whenSafetyCenterIsDisabled_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_whenSafetyCenterIsEnabled_withoutBiometrics_sendsNoData() {
+    public void setSafetySourceData_whenSafetyCenterIsEnabled_withoutBiometrics_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
         when(mFaceManager.isHardwareDetected()).thenReturn(false);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_withFingerprintNotEnrolled_whenDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_setsDataForBiometricSource() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        when(mFaceManager.isHardwareDetected()).thenReturn(false);
+        when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+        when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
+
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), captor.capture(), any(), any());
+
+        assertThat(captor.getValue()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
+    }
+
+    @Test
+    public void setSafetySourceData_setsDataWithCorrectSafetyEvent() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        when(mFaceManager.isHardwareDetected()).thenReturn(false);
+        when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+        when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
+
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+        ArgumentCaptor<SafetyEvent> captor = ArgumentCaptor.forClass(SafetyEvent.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), any(), captor.capture());
+
+        assertThat(captor.getValue()).isEqualTo(EVENT_SOURCE_STATE_CHANGED);
+    }
+
+    @Test
+    public void setSafetySourceData_withFingerprintNotEnrolled_whenDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(false);
@@ -131,31 +169,31 @@
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceDisabledDataSentWithSingularSummary(
+        assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_fingerprint_preference_title",
                 "security_settings_fingerprint_preference_summary_none");
     }
 
     @Test
-    public void sendSafetyData_withFingerprintNotEnrolled_whenNotDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFingerprintNotEnrolled_whenNotDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(false);
         when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_fingerprint_preference_title",
                 "security_settings_fingerprint_preference_summary_none",
                 FingerprintEnrollIntroduction.class.getName());
     }
 
     @Test
-    public void sendSafetyData_withFingerprintsEnrolled_whenDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFingerprintsEnrolled_whenDisabledByAdmin_setsData() {
         final int enrolledFingerprintsCount = 2;
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
@@ -166,16 +204,16 @@
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceDisabledDataSentWithPluralSummary(
+        assertSafetySourceDisabledDataSetWithPluralSummary(
                 "security_settings_fingerprint_preference_title",
                 "security_settings_fingerprint_preference_summary",
                 enrolledFingerprintsCount);
     }
 
     @Test
-    public void sendSafetyData_withFingerprintsEnrolled_whenNotDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFingerprintsEnrolled_whenNotDisabledByAdmin_setsData() {
         final int enrolledFingerprintsCount = 2;
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
@@ -185,16 +223,16 @@
                 .thenReturn(createFingerprintList(enrolledFingerprintsCount));
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithPluralSummary(
+        assertSafetySourceEnabledDataSetWithPluralSummary(
                 "security_settings_fingerprint_preference_title",
                 "security_settings_fingerprint_preference_summary", enrolledFingerprintsCount,
                 FingerprintSettings.class.getName());
     }
 
     @Test
-    public void sendSafetyData_withFaceNotEnrolled_whenDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFaceNotEnrolled_whenDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
@@ -202,31 +240,31 @@
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceDisabledDataSentWithSingularSummary(
+        assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title",
                 "security_settings_face_preference_summary_none");
     }
 
     @Test
-    public void sendSafetyData_withFaceNotEnrolled_whenNotDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFaceNotEnrolled_whenNotDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title",
                 "security_settings_face_preference_summary_none",
                 FaceEnrollIntroduction.class.getName());
     }
 
     @Test
-    public void sendSafetyData_withFaceEnrolled_whenDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFaceEnrolled_whenDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
@@ -234,78 +272,78 @@
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceDisabledDataSentWithSingularSummary(
+        assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title",
                 "security_settings_face_preference_summary");
     }
 
     @Test
-    public void sendSafetyData_withFaceEnrolled_whenNotDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFaceEnrolled_whenNotDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title",
                 "security_settings_face_preference_summary",
                 Settings.FaceSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenBothNotDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFaceAndFingerprint_whenBothNotDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_none_enrolled",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenFaceDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_withFaceAndFingerprint_whenFaceDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_none_enrolled",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenFingerprintDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_faceAndFingerprint_whenFingerprintDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_none_enrolled",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenBothDisabledByAdmin_sendsData() {
+    public void setSafetySourceData_faceAndFingerprint_whenBothDisabledByAdmin_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
@@ -313,15 +351,15 @@
                 .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE
                         | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceDisabledDataSentWithSingularSummary(
+        assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_none_enrolled");
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenFaceEnrolled_withMpFingers_sendsData() {
+    public void setSafetySourceData_faceAndFingerprint_whenFaceEnrolled_withMpFingers_setsData() {
         final int enrolledFingerprintsCount = 2;
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
@@ -330,16 +368,16 @@
         when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
                 createFingerprintList(enrolledFingerprintsCount));
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_both_fp_multiple",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenFaceEnrolled_withOneFinger_sendsData() {
+    public void setSafetySourceData_faceAndFingerprint_whenFaceEnrolled_withOneFinger_setsData() {
         final int enrolledFingerprintsCount = 1;
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
@@ -348,16 +386,16 @@
         when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
                 createFingerprintList(enrolledFingerprintsCount));
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_both_fp_single",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenFaceEnrolled_withNoFingers_sendsData() {
+    public void setSafetySourceData_faceAndFingerprint_whenFaceEnrolled_withNoFingers_setsData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
@@ -365,16 +403,16 @@
         when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
                 Collections.emptyList());
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithSingularSummary(
+        assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_face_preference_summary",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
     @Test
-    public void sandSafetyData_withFaceAndFingerprint_whenNoFaceEnrolled_withFingers_sendsData() {
+    public void setSafetySourceData_faceAndFingerprint_whenNoFaceEnrolled_withFingers_setsData() {
         final int enrolledFingerprintsCount = 1;
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
@@ -383,38 +421,38 @@
         when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
                 createFingerprintList(enrolledFingerprintsCount));
 
-        BiometricsSafetySource.sendSafetyData(mApplicationContext);
+        BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        assertSafetySourceEnabledDataSentWithPluralSummary(
+        assertSafetySourceEnabledDataSetWithPluralSummary(
                 "security_settings_biometric_preference_title",
                 "security_settings_fingerprint_preference_summary", enrolledFingerprintsCount,
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
-    private void assertSafetySourceDisabledDataSentWithSingularSummary(String expectedTitleResName,
+    private void assertSafetySourceDisabledDataSetWithSingularSummary(String expectedTitleResName,
             String expectedSummaryResName) {
-        assertSafetySourceDisabledDataSent(
+        assertSafetySourceDisabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName)
         );
     }
 
-    private void assertSafetySourceEnabledDataSentWithSingularSummary(String expectedTitleResName,
+    private void assertSafetySourceEnabledDataSetWithSingularSummary(String expectedTitleResName,
             String expectedSummaryResName,
             String expectedSettingsClassName) {
-        assertSafetySourceEnabledDataSent(
+        assertSafetySourceEnabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName),
                 expectedSettingsClassName
         );
     }
 
-    private void assertSafetySourceDisabledDataSentWithPluralSummary(String expectedTitleResName,
+    private void assertSafetySourceDisabledDataSetWithPluralSummary(String expectedTitleResName,
             String expectedSummaryResName, int expectedSummaryQuantity) {
         final int stringResId = ResourcesUtils.getResourcesId(
                 ApplicationProvider.getApplicationContext(), "plurals",
                 expectedSummaryResName);
-        assertSafetySourceDisabledDataSent(
+        assertSafetySourceDisabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
                 mApplicationContext.getResources().getQuantityString(stringResId,
                         expectedSummaryQuantity /* quantity */,
@@ -422,13 +460,13 @@
         );
     }
 
-    private void assertSafetySourceEnabledDataSentWithPluralSummary(String expectedTitleResName,
+    private void assertSafetySourceEnabledDataSetWithPluralSummary(String expectedTitleResName,
             String expectedSummaryResName, int expectedSummaryQuantity,
             String expectedSettingsClassName) {
         final int stringResId = ResourcesUtils.getResourcesId(
                 ApplicationProvider.getApplicationContext(), "plurals",
                 expectedSummaryResName);
-        assertSafetySourceEnabledDataSent(
+        assertSafetySourceEnabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
                 mApplicationContext.getResources().getQuantityString(stringResId,
                         expectedSummaryQuantity /* quantity */,
@@ -437,13 +475,13 @@
         );
     }
 
-    private void assertSafetySourceDisabledDataSent(String expectedTitle, String expectedSummary) {
+    private void assertSafetySourceDisabledDataSet(String expectedTitle, String expectedSummary) {
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
-        assertThat(safetySourceData.getId()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
         assertThat(safetySourceStatus.getTitle().toString()).isEqualTo(expectedTitle);
         assertThat(safetySourceStatus.getSummary().toString()).isEqualTo(expectedSummary);
         assertThat(safetySourceStatus.isEnabled()).isFalse();
@@ -452,14 +490,14 @@
         assertThat(clickIntent.getAction()).isEqualTo(ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
     }
 
-    private void assertSafetySourceEnabledDataSent(String expectedTitle, String expectedSummary,
+    private void assertSafetySourceEnabledDataSet(String expectedTitle, String expectedSummary,
             String expectedSettingsClassName) {
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
-        assertThat(safetySourceData.getId()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
         assertThat(safetySourceStatus.getTitle().toString()).isEqualTo(expectedTitle);
         assertThat(safetySourceStatus.getSummary().toString()).isEqualTo(expectedSummary);
         assertThat(safetySourceStatus.isEnabled()).isTrue();
diff --git a/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
index 90a24aa..db2702d 100644
--- a/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/LockScreenSafetySourceTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.safetycenter;
 
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -26,6 +28,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.safetycenter.SafetyEvent;
 import android.safetycenter.SafetySourceData;
 import android.safetycenter.SafetySourceIssue;
 import android.safetycenter.SafetySourceStatus;
@@ -53,6 +56,8 @@
     private static final String SUMMARY = "summary";
     private static final String FAKE_ACTION_CHOOSE_LOCK_GENERIC_FRAGMENT = "choose_lock_generic";
     private static final String FAKE_ACTION_SCREEN_LOCK_SETTINGS = "screen_lock_settings";
+    private static final SafetyEvent EVENT_SOURCE_STATE_CHANGED =
+            new SafetyEvent.Builder(SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
 
     private Context mApplicationContext;
 
@@ -81,42 +86,74 @@
     }
 
     @Test
-    public void sendSafetyData_whenScreenLockIsEnabled_whenSafetyCenterIsDisabled_sendsNoData() {
+    public void setSafetySourceData_whenScreenLockEnabled_safetyCenterDisabled_doesNotSetData() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
         when(mScreenLockPreferenceDetailsUtils.isAvailable()).thenReturn(true);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_whenScreenLockIsDisabled_sendsNoData() {
+    public void setSafetySourceData_whenScreenLockIsDisabled_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isAvailable()).thenReturn(false);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_whenScreenLockIsEnabled_sendsData() {
+    public void setSafetySourceData_setsDataForLockscreenSafetySource() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
+        ArgumentCaptor<String> idCaptor = ArgumentCaptor.forClass(String.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), idCaptor.capture(), any(), any());
+        String safetySourceId = idCaptor.getValue();
+
+        assertThat(safetySourceId).isEqualTo(LockScreenSafetySource.SAFETY_SOURCE_ID);
+    }
+
+    @Test
+    public void setSafetySourceData_setsDataWithCorrectSafetyEvent() {
+        whenScreenLockIsEnabled();
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
+        ArgumentCaptor<SafetyEvent> eventCaptor = ArgumentCaptor.forClass(SafetyEvent.class);
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), any(), eventCaptor.capture());
+        SafetyEvent safetyEvent = eventCaptor.getValue();
+
+        assertThat(safetyEvent).isEqualTo(EVENT_SOURCE_STATE_CHANGED);
+    }
+
+    @Test
+    public void setSafetySourceData_whenScreenLockIsEnabled_setData() {
+        whenScreenLockIsEnabled();
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
-        assertThat(safetySourceData.getId()).isEqualTo(LockScreenSafetySource.SAFETY_SOURCE_ID);
         assertThat(safetySourceStatus.getTitle().toString())
                 .isEqualTo(ResourcesUtils.getResourcesString(
                         mApplicationContext,
@@ -129,16 +166,17 @@
     }
 
     @Test
-    public void sendSafetyData_whenLockPatternIsSecure_sendsStatusLevelOk() {
+    public void setSafetySourceData_whenLockPatternIsSecure_setStatusLevelOk() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isLockPatternSecure()).thenReturn(true);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -147,16 +185,17 @@
     }
 
     @Test
-    public void sendSafetyData_whenLockPatternIsNotSecure_sendsStatusLevelRecommendation() {
+    public void setSafetySourceData_whenLockPatternIsNotSecure_setStatusLevelRecommendation() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isLockPatternSecure()).thenReturn(false);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -165,32 +204,34 @@
     }
 
     @Test
-    public void sendSafetyData_whenLockPatternIsSecure_sendsNoIssues() {
+    public void setSafetySourceData_whenLockPatternIsSecure_doesNotSetIssues() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isLockPatternSecure()).thenReturn(true);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
 
         assertThat(safetySourceData.getIssues()).isEmpty();
     }
 
     @Test
-    public void sendSafetyData_whenLockPatternIsNotSecure_sendsIssue() {
+    public void setSafetySourceData_whenLockPatternIsNotSecure_setIssue() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isLockPatternSecure()).thenReturn(false);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
 
         assertThat(safetySourceData.getIssues()).hasSize(1);
@@ -218,17 +259,18 @@
     }
 
     @Test
-    public void sendSafetyData_whenPasswordQualityIsManaged_sendsDisabled() {
+    public void setSafetySourceData_whenPasswordQualityIsManaged_setDisabled() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isPasswordQualityManaged(anyInt(), any()))
                 .thenReturn(true);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -236,17 +278,18 @@
     }
 
     @Test
-    public void sendSafetyData_whenPasswordQualityIsNotManaged_sendsEnabled() {
+    public void setSafetySourceData_whenPasswordQualityIsNotManaged_setEnabled() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.isPasswordQualityManaged(anyInt(), any()))
                 .thenReturn(false);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -254,7 +297,7 @@
     }
 
     @Test
-    public void sendSafetyData_whenShouldShowGearMenu_sendsGearMenuActionIcon() {
+    public void setSafetySourceData_whenShouldShowGearMenu_setGearMenuActionIcon() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         final Intent launchScreenLockSettings = new Intent(FAKE_ACTION_SCREEN_LOCK_SETTINGS);
@@ -262,12 +305,13 @@
                 .thenReturn(launchScreenLockSettings);
         when(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).thenReturn(true);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         final ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(
                 SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         final IconAction iconAction = captor.getValue().getStatus().getIconAction();
 
         assertThat(iconAction.getIconType()).isEqualTo(IconAction.ICON_TYPE_GEAR);
@@ -276,16 +320,17 @@
     }
 
     @Test
-    public void sendSafetyData_whenShouldNotShowGearMenu_sendsNoGearMenuActionIcon() {
+    public void setSafetySourceData_whenShouldNotShowGearMenu_doesNotSetGearMenuActionIcon() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mScreenLockPreferenceDetailsUtils.shouldShowGearMenu()).thenReturn(false);
 
-        LockScreenSafetySource.sendSafetyData(mApplicationContext,
-                mScreenLockPreferenceDetailsUtils);
+        LockScreenSafetySource.setSafetySourceData(mApplicationContext,
+                mScreenLockPreferenceDetailsUtils, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), captor.capture());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+                any(), any(), captor.capture(), any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -293,23 +338,24 @@
     }
 
     @Test
-    public void onLockScreenChange_whenSafetyCenterEnabled_sendsData() {
+    public void onLockScreenChange_whenSafetyCenterEnabled_setData() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
 
         LockScreenSafetySource.onLockScreenChange(mApplicationContext);
 
-        verify(mSafetyCenterManagerWrapper).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper).setSafetySourceData(any(), any(), any(), any());
     }
 
     @Test
-    public void onLockScreenChange_whenSafetyCenterDisabled_sendsNoData() {
+    public void onLockScreenChange_whenSafetyCenterDisabled_doesNotSetData() {
         whenScreenLockIsEnabled();
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
 
         LockScreenSafetySource.onLockScreenChange(mApplicationContext);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     private void whenScreenLockIsEnabled() {
diff --git a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
index f042c22..8a4214c 100644
--- a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
@@ -18,6 +18,8 @@
 
 import static android.safetycenter.SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES;
 import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED;
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -29,7 +31,7 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetyEvent;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -45,6 +47,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.Arrays;
 import java.util.List;
 
 @RunWith(AndroidJUnit4.class)
@@ -74,17 +77,18 @@
     }
 
     @Test
-    public void sendSafetyData_whenSafetyCenterIsEnabled_withNoIntentAction_sendsNoData() {
+    public void onReceive_onRefresh_whenSafetyCenterIsEnabled_withNoIntentAction_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent = new Intent().putExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS, new String[]{});
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_whenSafetyCenterIsDisabled_sendsNoData() {
+    public void onReceive_onRefresh_whenSafetyCenterIsDisabled_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
         Intent intent =
                 new Intent()
@@ -95,21 +99,23 @@
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_whenSafetyCenterIsEnabled_withNullSourceIds_sendsNoData() {
+    public void onReceive_onRefresh_whenSafetyCenterIsEnabled_withNullSourceIds_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent = new Intent().setAction(ACTION_REFRESH_SAFETY_SOURCES);
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_whenSafetyCenterIsEnabled_withNoSourceIds_sendsNoData() {
+    public void onReceive_onRefresh_whenSafetyCenterIsEnabled_withNoSourceIds_doesNotSetData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent =
                 new Intent()
@@ -118,11 +124,12 @@
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
 
-        verify(mSafetyCenterManagerWrapper, never()).sendSafetyCenterUpdate(any(), any());
+        verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+                any(), any(), any(), any());
     }
 
     @Test
-    public void sendSafetyData_withLockscreenSourceId_sendsLockscreenData() {
+    public void onReceive_onRefresh_setsRefreshEvent() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent =
                 new Intent()
@@ -132,16 +139,34 @@
                                 new String[]{ LockScreenSafetySource.SAFETY_SOURCE_ID });
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
-        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        ArgumentCaptor<SafetyEvent> captor = ArgumentCaptor.forClass(SafetyEvent.class);
         verify(mSafetyCenterManagerWrapper, times(1))
-                .sendSafetyCenterUpdate(any(), captor.capture());
-        SafetySourceData safetySourceData = captor.getValue();
+                .setSafetySourceData(any(), any(), any(), captor.capture());
 
-        assertThat(safetySourceData.getId()).isEqualTo(LockScreenSafetySource.SAFETY_SOURCE_ID);
+        assertThat(captor.getValue()).isEqualTo(
+                new SafetyEvent.Builder(SAFETY_EVENT_TYPE_REFRESH_REQUESTED).build());
     }
 
     @Test
-    public void sendSafetyData_withBiometricsSourceId_sendsBiometricData() {
+    public void onReceive_onRefresh_withLockscreenSourceId_setsLockscreenData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+        Intent intent =
+                new Intent()
+                        .setAction(ACTION_REFRESH_SAFETY_SOURCES)
+                        .putExtra(
+                                EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+                                new String[]{ LockScreenSafetySource.SAFETY_SOURCE_ID });
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+        verify(mSafetyCenterManagerWrapper, times(1))
+                .setSafetySourceData(any(), captor.capture(), any(), any());
+
+        assertThat(captor.getValue()).isEqualTo(LockScreenSafetySource.SAFETY_SOURCE_ID);
+    }
+
+    @Test
+    public void onReceive_onRefresh_withBiometricsSourceId_setsBiometricData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent =
                 new Intent()
@@ -151,28 +176,42 @@
                                 new String[]{ BiometricsSafetySource.SAFETY_SOURCE_ID });
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
-        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
         verify(mSafetyCenterManagerWrapper, times(1))
-                .sendSafetyCenterUpdate(any(), captor.capture());
-        SafetySourceData safetySourceData = captor.getValue();
+                .setSafetySourceData(any(), captor.capture(), any(), any());
 
-        assertThat(safetySourceData.getId()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
+        assertThat(captor.getValue()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
     }
 
     @Test
-    public void sendSafetyData_onBootCompleted_sendsBiometricAndLockscreenData() {
+    public void onReceive_onBootCompleted_setsBootCompleteEvent() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         Intent intent = new Intent().setAction(Intent.ACTION_BOOT_COMPLETED);
 
         new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
-        ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+        ArgumentCaptor<SafetyEvent> captor = ArgumentCaptor.forClass(SafetyEvent.class);
         verify(mSafetyCenterManagerWrapper, times(2))
-                .sendSafetyCenterUpdate(any(), captor.capture());
-        List<SafetySourceData> safetySourceDataList = captor.getAllValues();
+                .setSafetySourceData(any(), any(), any(), captor.capture());
 
-        assertThat(safetySourceDataList.stream().anyMatch(
-                data -> data.getId().equals(LockScreenSafetySource.SAFETY_SOURCE_ID))).isTrue();
-        assertThat(safetySourceDataList.stream().anyMatch(
-                data -> data.getId().equals(BiometricsSafetySource.SAFETY_SOURCE_ID))).isTrue();
+        SafetyEvent bootEvent = new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build();
+        assertThat(captor.getAllValues())
+                .containsExactlyElementsIn(Arrays.asList(bootEvent, bootEvent));
+    }
+
+    @Test
+    public void onReceive_onBootCompleted_sendsBiometricAndLockscreenData() {
+        when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+        Intent intent = new Intent().setAction(Intent.ACTION_BOOT_COMPLETED);
+
+        new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+        verify(mSafetyCenterManagerWrapper, times(2))
+                .setSafetySourceData(any(), captor.capture(), any(), any());
+        List<String> safetySourceIdList = captor.getAllValues();
+
+        assertThat(safetySourceIdList.stream().anyMatch(
+                id -> id.equals(LockScreenSafetySource.SAFETY_SOURCE_ID))).isTrue();
+        assertThat(safetySourceIdList.stream().anyMatch(
+                id -> id.equals(BiometricsSafetySource.SAFETY_SOURCE_ID))).isTrue();
     }
 }
