Merge "[MEP] psim's logical slot index is 0" into tm-dev
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();
     }
 }