Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/Android.bp b/Android.bp
index a9c3ea0..b716117 100644
--- a/Android.bp
+++ b/Android.bp
@@ -90,6 +90,7 @@
         "MediaDrmSettingsFlagsLib",
         "Settings-change-ids",
         "SettingsLib",
+        "SettingsLibDataStore",
         "SettingsLibActivityEmbedding",
         "aconfig_settings_flags_lib",
         "accessibility_settings_flags_lib",
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9a8aa75..aed51f3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4698,22 +4698,6 @@
         </activity>
 
         <activity
-            android:name="Settings$AudioStreamConfirmDialogActivity"
-            android:exported="true"
-            android:theme="@style/Transparent"
-            android:permission="android.permission.BLUETOOTH_CONNECT"
-            android:configChanges="orientation|keyboardHidden|screenSize">
-            <intent-filter android:priority="1">
-                <action android:name="android.settings.AUDIO_STREAM_DIALOG" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamConfirmDialog" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
-        </activity>
-
-        <activity
             android:name=".Settings$PreviouslyConnectedDeviceActivity"
             android:label="@string/connected_device_saved_title"
             android:exported="true"
@@ -5068,16 +5052,6 @@
         </activity>
 
         <activity
-            android:name="com.android.settings.connecteddevice.audiosharing.audiostreams.qrcode.QrCodeScanModeActivity"
-            android:permission="android.permission.BLUETOOTH_CONNECT"
-            android:exported="false">
-            <intent-filter>
-                <action android:name="android.settings.BLUETOOTH_LE_AUDIO_QR_CODE_SCANNER"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
-        </activity>
-
-        <activity
             android:name=".spa.SpaActivity"
             android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
             android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
@@ -5153,8 +5127,9 @@
 
         <activity
             android:name="com.android.settings.network.WepNetworkDialogActivity"
-            android:exported="false"
-            android:theme="@style/Theme.SpaLib.Dialog">
+            android:exported="true"
+            android:theme="@style/Theme.SpaLib.Dialog"
+            android:permission="android.permission.NETWORK_SETTINGS">
         </activity>
 
         <!-- This is the longest AndroidManifest.xml ever. -->
diff --git a/res/drawable/ic_bt_audio_sharing.xml b/res/drawable/ic_bt_audio_sharing.xml
deleted file mode 100644
index 6186773..0000000
--- a/res/drawable/ic_bt_audio_sharing.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:autoMirrored="true"
-        android:height="24dp"
-        android:width="24dp"
-        android:viewportHeight="24"
-        android:viewportWidth="24"
-        android:tint="?android:attr/colorControlNormal">
-    <path
-        android:fillColor="#000000"
-        android:pathData="M16.984,24H7.279L12.131,15.508L16.984,24ZM10.481,22.144H13.781L12.131,19.257L10.481,22.144Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M12.131,14.295C13.471,14.295 14.558,13.209 14.558,11.869C14.558,10.529 13.471,9.442 12.131,9.442C10.791,9.442 9.705,10.529 9.705,11.869C9.705,13.209 10.791,14.295 12.131,14.295Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M4.573,21.368C4.052,20.943 3.967,20.179 4.379,19.657C4.804,19.136 5.568,19.051 6.09,19.463C6.611,19.876 6.696,20.64 6.284,21.174C6.041,21.465 5.689,21.623 5.338,21.623C5.071,21.623 4.804,21.538 4.573,21.368Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M17.991,21.162C17.579,20.628 17.663,19.876 18.185,19.451C18.707,19.039 19.471,19.124 19.896,19.646C20.308,20.167 20.223,20.931 19.702,21.344C19.471,21.526 19.204,21.611 18.949,21.611C18.586,21.611 18.234,21.453 17.991,21.162Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M1.213,17.145C0.91,16.551 1.165,15.823 1.771,15.532C2.378,15.241 3.093,15.495 3.397,16.09C3.688,16.697 3.433,17.424 2.827,17.715C2.657,17.8 2.475,17.837 2.305,17.837C1.844,17.837 1.419,17.582 1.213,17.145Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M21.449,17.691C20.842,17.4 20.588,16.684 20.879,16.077C21.17,15.471 21.898,15.216 22.504,15.507C23.099,15.798 23.354,16.526 23.062,17.133C22.856,17.557 22.419,17.812 21.971,17.812C21.789,17.812 21.619,17.776 21.449,17.691Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M0,11.892C0,11.225 0.546,10.679 1.213,10.679C1.88,10.679 2.426,11.212 2.426,11.892C2.426,12.559 1.88,13.105 1.213,13.105C0.546,13.105 0,12.559 0,11.892Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M21.837,11.869C21.837,11.857 21.837,11.845 21.837,11.833C21.824,11.153 22.37,10.62 23.05,10.607C23.717,10.607 24.251,11.153 24.263,11.821C24.263,11.833 24.263,11.845 24.263,11.845C24.263,11.857 24.263,11.869 24.263,11.869C24.263,12.536 23.717,13.082 23.05,13.082C22.382,13.082 21.837,12.536 21.837,11.869Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M1.759,8.242C1.152,7.963 0.898,7.235 1.189,6.628C1.48,6.022 2.196,5.767 2.802,6.058C3.409,6.349 3.664,7.077 3.372,7.684C3.166,8.108 2.729,8.363 2.281,8.363C2.099,8.363 1.929,8.327 1.759,8.242Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M20.866,7.622C20.563,7.028 20.818,6.3 21.424,6.009C22.019,5.706 22.747,5.96 23.038,6.567C23.038,6.567 23.038,6.567 23.05,6.567C23.341,7.161 23.087,7.889 22.48,8.181C22.31,8.265 22.128,8.302 21.958,8.302C21.509,8.302 21.073,8.059 20.866,7.622Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M4.355,4.104C3.931,3.582 4.016,2.818 4.537,2.406C5.071,1.981 5.823,2.066 6.248,2.588C6.672,3.109 6.588,3.874 6.066,4.298C5.835,4.48 5.569,4.565 5.302,4.565C4.95,4.565 4.598,4.407 4.355,4.104Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M18.161,4.262C17.627,3.838 17.542,3.073 17.955,2.552C18.379,2.03 19.132,1.945 19.666,2.358C20.187,2.77 20.272,3.534 19.86,4.068C19.617,4.359 19.265,4.517 18.913,4.517C18.646,4.517 18.379,4.432 18.161,4.262Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M8.492,1.497C8.334,0.854 8.747,0.199 9.402,0.041C10.057,-0.105 10.7,0.308 10.858,0.963C11.003,1.606 10.591,2.261 9.948,2.407C9.851,2.431 9.754,2.443 9.669,2.443C9.123,2.443 8.613,2.067 8.492,1.497Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M14.267,2.395C13.599,2.249 13.199,1.606 13.345,0.951C13.49,0.296 14.133,-0.116 14.788,0.029C15.443,0.175 15.856,0.83 15.71,1.485C15.589,2.043 15.08,2.431 14.534,2.431C14.437,2.431 14.352,2.419 14.267,2.395Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M7,17.037C6.527,16.564 6.527,15.8 7,15.326C7.473,14.841 8.237,14.841 8.71,15.314C9.196,15.787 9.196,16.552 8.723,17.025C8.48,17.267 8.177,17.389 7.861,17.389C7.546,17.389 7.242,17.267 7,17.037Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M15.565,17.012C15.092,16.539 15.092,15.762 15.565,15.289C16.038,14.816 16.814,14.816 17.288,15.289C17.761,15.762 17.761,16.539 17.288,17.012C17.045,17.243 16.742,17.364 16.426,17.364C16.111,17.364 15.807,17.243 15.565,17.012Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M4.853,11.917C4.853,11.237 5.386,10.691 6.054,10.691C6.721,10.691 7.279,11.225 7.279,11.892C7.279,12.56 6.745,13.106 6.078,13.118C5.398,13.118 4.853,12.584 4.853,11.917Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M16.984,11.868C16.984,11.856 16.984,11.844 16.984,11.832C16.984,11.832 16.984,11.82 16.984,11.807C16.972,11.14 17.506,10.582 18.185,10.582C18.852,10.57 19.398,11.116 19.41,11.783C19.41,11.795 19.41,11.82 19.41,11.832C19.41,11.844 19.41,11.856 19.41,11.868C19.41,12.535 18.865,13.081 18.197,13.081C17.53,13.081 16.984,12.535 16.984,11.868Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M6.952,8.471C6.478,7.997 6.478,7.233 6.952,6.76C6.952,6.76 6.952,6.76 6.939,6.76C7.413,6.275 8.189,6.275 8.662,6.748C9.135,7.221 9.147,7.985 8.674,8.458C8.432,8.701 8.116,8.822 7.813,8.822C7.497,8.822 7.194,8.701 6.952,8.471Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M15.529,8.399C15.043,7.938 15.043,7.161 15.504,6.688C15.977,6.203 16.742,6.203 17.227,6.664C17.7,7.137 17.712,7.901 17.239,8.387C17.009,8.629 16.693,8.751 16.378,8.751C16.075,8.751 15.759,8.629 15.529,8.399Z"/>
-    <path
-        android:fillColor="#000000"
-        android:pathData="M10.87,5.815C10.858,5.148 11.392,4.59 12.071,4.59C12.738,4.578 13.284,5.124 13.284,5.791C13.296,6.458 12.762,7.016 12.083,7.016C11.416,7.016 10.87,6.483 10.87,5.815Z"/>
-</vector>
diff --git a/res/layout/preference_widget_lock.xml b/res/layout/preference_widget_lock.xml
deleted file mode 100644
index a5ee455..0000000
--- a/res/layout/preference_widget_lock.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2023 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- A lock icon for preference in the audio streams page. -->
-<ImageView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/lock_icon"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:layout_gravity="center"
-    android:paddingStart="24dp"
-    android:paddingEnd="24dp"
-    android:background="?android:attr/selectableItemBackground"
-    android:scaleType="center"
-    android:src="@drawable/ic_lock_closed"
-    android:importantForAccessibility="no" />
-
diff --git a/res/xml/accessibility_hearing_aids.xml b/res/xml/accessibility_hearing_aids.xml
index 57a0fe2..9c6e661 100644
--- a/res/xml/accessibility_hearing_aids.xml
+++ b/res/xml/accessibility_hearing_aids.xml
@@ -32,6 +32,7 @@
         android:title="@string/bluetooth_pairing_pref_title"
         android:icon="@drawable/ic_add_24dp"
         android:summary="@string/connected_device_add_device_summary"
+        android:fragment="com.android.settings.accessibility.HearingDevicePairingFragment"
         settings:userRestriction="no_config_bluetooth"
         settings:useAdminDisabledSummary="true"
         settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/>
diff --git a/res/xml/audio_stream_details_fragment.xml b/res/xml/audio_stream_details_fragment.xml
deleted file mode 100644
index 2a84939..0000000
--- a/res/xml/audio_stream_details_fragment.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:title="Audio stream details">
-
-    <com.android.settingslib.widget.LayoutPreference
-        android:key="audio_stream_header"
-        android:layout="@layout/settings_entity_header"
-        android:selectable="false"
-        settings:allowDividerBelow="true"
-        settings:searchable="false"
-        settings:controller="com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamHeaderController" />
-
-    <com.android.settingslib.widget.ActionButtonsPreference
-        android:key="audio_stream_button"
-        settings:allowDividerBelow="true"
-        settings:controller="com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamButtonController" />
-
-</PreferenceScreen>
diff --git a/res/xml/bluetooth_audio_streams_dialog.xml b/res/xml/bluetooth_audio_streams_dialog.xml
deleted file mode 100644
index 024e537..0000000
--- a/res/xml/bluetooth_audio_streams_dialog.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2024 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <LinearLayout
-        android:id="@+id/dialog_bg"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingStart="25dp"
-        android:paddingEnd="25dp"
-        android:orientation="vertical">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="25dp"
-            android:orientation="vertical">
-
-            <ImageView
-                android:id="@+id/dialog_icon"
-                android:layout_width="30dp"
-                android:layout_height="30dp"
-                android:layout_marginTop="24dp"
-                android:layout_gravity="center"
-                android:src="@drawable/ic_bt_audio_sharing"/>
-
-            <TextView
-                android:id="@+id/dialog_title"
-                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Headline"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="15dp"
-                android:gravity="center"
-                android:layout_gravity="center"/>
-
-            <TextView
-                android:id="@+id/dialog_subtitle"
-                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                android:textStyle="bold"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="15dp"
-                android:gravity="center"
-                android:layout_gravity="center"
-                android:visibility="gone"/>
-
-            <TextView
-                android:id="@+id/dialog_subtitle_2"
-                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="15dp"
-                android:gravity="center"
-                android:layout_gravity="center"
-                android:visibility="gone"/>
-        </LinearLayout>
-
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="@dimen/broadcast_dialog_margin">
-            <Button
-                android:id="@+id/left_button"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:visibility="gone"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                style="@style/BroadcastActionButton"/>
-            <Button
-                android:id="@+id/right_button"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:visibility="gone"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                style="@style/BroadcastActionButton"/>
-        </androidx.constraintlayout.widget.ConstraintLayout>
-
-    </LinearLayout>
-</FrameLayout>
\ No newline at end of file
diff --git a/res/xml/bluetooth_audio_streams_qr_code.xml b/res/xml/bluetooth_audio_streams_qr_code.xml
deleted file mode 100644
index 50b1429..0000000
--- a/res/xml/bluetooth_audio_streams_qr_code.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:clipToPadding="false"
-        android:paddingLeft="25dp"
-        android:paddingRight="25dp"
-        android:gravity="center_horizontal"
-        android:orientation="vertical">
-
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="start"
-            android:textSize="15sp"
-            android:textColor="?android:attr/textColorPrimary"
-            android:text="To listen to this audio stream, other people can connect compatible headphones to their Android device. They can then scan this QR code."/>
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:orientation="vertical"
-            android:paddingTop="70dp">
-
-            <ImageView
-                android:id="@+id/qrcode_view"
-                android:layout_width="@dimen/qrcode_size"
-                android:layout_height="@dimen/qrcode_size"
-                android:src="@android:color/transparent"/>
-
-            <TextView
-                android:id="@+id/password"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textSize="15sp"
-                android:textColor="?android:attr/textColorPrimary"/>
-        </LinearLayout>
-
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 92e3efd..2f6f04a 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -403,7 +403,6 @@
     public static class StylusUsiDetailsActivity extends SettingsActivity { /* empty */ }
     public static class BluetoothBroadcastActivity extends SettingsActivity { /* empty */ }
     public static class BluetoothFindBroadcastsActivity extends SettingsActivity { /* empty */ }
-    public static class AudioStreamConfirmDialogActivity extends SettingsActivity { /* empty */ }
     public static class WifiCallingDisclaimerActivity extends SettingsActivity { /* empty */ }
     public static class MobileNetworkListActivity extends SettingsActivity {}
     public static class PowerMenuSettingsActivity extends SettingsActivity {}
diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java
index 528576d..1a53b83 100644
--- a/src/com/android/settings/SettingsApplication.java
+++ b/src/com/android/settings/SettingsApplication.java
@@ -28,11 +28,13 @@
 import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.core.instrumentation.ElapsedTimeUtils;
+import com.android.settings.fuelgauge.BatterySettingsStorage;
 import com.android.settings.homepage.SettingsHomepageActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.overlay.FeatureFactoryImpl;
 import com.android.settings.spa.SettingsSpaEnvironment;
 import com.android.settingslib.applications.AppIconCacheManager;
+import com.android.settingslib.datastore.BackupRestoreStorageManager;
 import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -54,6 +56,8 @@
     public void onCreate() {
         super.onCreate();
 
+        BackupRestoreStorageManager.getInstance(this).add(new BatterySettingsStorage(this));
+
         // Add null checking to avoid test case failed.
         if (getApplicationContext() != null) {
             ElapsedTimeUtils.assignSuwFinishedTimeStamp(getApplicationContext());
@@ -73,6 +77,12 @@
         }
     }
 
+    @Override
+    public void onTerminate() {
+        BackupRestoreStorageManager.getInstance(this).removeAll();
+        super.onTerminate();
+    }
+
     @NonNull
     protected FeatureFactory getFeatureFactory() {
         return new FeatureFactoryImpl();
diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java
index 80a03c6..cad2186 100644
--- a/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityHearingAidsFragment.java
@@ -38,7 +38,6 @@
 public class AccessibilityHearingAidsFragment extends AccessibilityShortcutPreferenceFragment {
     private static final String TAG = "AccessibilityHearingAidsFragment";
     private static final String KEY_HEARING_OPTIONS_CATEGORY = "hearing_options_category";
-    public static final String KEY_HEARING_DEVICE_ADD_BT_DEVICES = "hearing_device_add_bt_devices";
     private static final int SHORTCUT_PREFERENCE_IN_CATEGORY_INDEX = 20;
     private String mFeatureName;
 
diff --git a/src/com/android/settings/accessibility/HearingDevicePairingDetail.java b/src/com/android/settings/accessibility/HearingDevicePairingDetail.java
deleted file mode 100644
index 117a8ed..0000000
--- a/src/com/android/settings/accessibility/HearingDevicePairingDetail.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.accessibility;
-
-import android.app.settings.SettingsEnums;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothUuid;
-import android.bluetooth.le.ScanFilter;
-import android.content.Context;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.bluetooth.BluetoothDevicePairingDetailBase;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * HearingDevicePairingDetail is a page to scan hearing devices. This page shows scanning icons and
- * pairing them.
- */
-public class HearingDevicePairingDetail extends BluetoothDevicePairingDetailBase {
-
-    private static final String TAG = "HearingDevicePairingDetail";
-    @VisibleForTesting
-    static final String KEY_AVAILABLE_HEARING_DEVICES = "available_hearing_devices";
-
-    public HearingDevicePairingDetail() {
-        super();
-        final List<ScanFilter> filterList = new ArrayList<>();
-        // Filters for ASHA hearing aids
-        filterList.add(new ScanFilter.Builder().setServiceUuid(BluetoothUuid.HEARING_AID).build());
-        filterList.add(new ScanFilter.Builder()
-                .setServiceData(BluetoothUuid.HEARING_AID, new byte[0]).build());
-        // Filters for LE audio hearing aids
-        filterList.add(new ScanFilter.Builder().setServiceUuid(BluetoothUuid.HAS).build());
-        filterList.add(new ScanFilter.Builder()
-                .setServiceData(BluetoothUuid.HAS, new byte[0]).build());
-        setFilter(filterList);
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        use(ViewAllBluetoothDevicesPreferenceController.class).init(this);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        mAvailableDevicesCategory.setProgress(mBluetoothAdapter.isEnabled());
-    }
-
-    @Override
-    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
-        super.onDeviceBondStateChanged(cachedDevice, bondState);
-
-        mAvailableDevicesCategory.setProgress(bondState == BluetoothDevice.BOND_NONE);
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.HEARING_AID_PAIRING;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.hearing_device_pairing_detail;
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    public String getDeviceListKey() {
-        return KEY_AVAILABLE_HEARING_DEVICES;
-    }
-}
diff --git a/src/com/android/settings/backup/SettingsBackupHelper.java b/src/com/android/settings/backup/SettingsBackupHelper.java
index ecf4c71..0861af2 100644
--- a/src/com/android/settings/backup/SettingsBackupHelper.java
+++ b/src/com/android/settings/backup/SettingsBackupHelper.java
@@ -22,10 +22,10 @@
 import android.app.backup.SharedPreferencesBackupHelper;
 
 import com.android.settings.flags.Flags;
-import com.android.settings.fuelgauge.BatteryBackupHelper;
 import com.android.settings.onboarding.OnboardingFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.shortcut.CreateShortcutPreferenceController;
+import com.android.settingslib.datastore.BackupRestoreStorageManager;
 
 /** Backup agent for Settings APK */
 public class SettingsBackupHelper extends BackupAgentHelper {
@@ -35,7 +35,7 @@
     @Override
     public void onCreate() {
         super.onCreate();
-        addHelper(BatteryBackupHelper.TAG, new BatteryBackupHelper(this));
+        BackupRestoreStorageManager.getInstance(this).addBackupAgentHelpers(this);
         addHelper(PREF_LOCALE_NOTIFICATION,
                 new SharedPreferencesBackupHelper(this, LOCALE_NOTIFICATION));
         if (Flags.enableSoundBackup()) {
@@ -51,6 +51,7 @@
     @Override
     public void onRestoreFinished() {
         super.onRestoreFinished();
+        BackupRestoreStorageManager.getInstance(this).onRestoreFinished();
         CreateShortcutPreferenceController.updateRestoredShortcuts(this);
     }
 }
diff --git a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java
index 3a16e3e..73c7d73 100644
--- a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java
+++ b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java
@@ -28,11 +28,9 @@
 import androidx.appcompat.app.AlertDialog;
 
 import com.android.settings.R;
-import com.android.settings.accessibility.HearingDevicePairingDetail;
 import com.android.settings.accessibility.HearingDevicePairingFragment;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.flags.Flags;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.HearingAidInfo;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -125,11 +123,8 @@
         final int launchPage = getArguments().getInt(KEY_LAUNCH_PAGE);
         final boolean launchFromA11y = (launchPage == SettingsEnums.ACCESSIBILITY)
                 || (launchPage == SettingsEnums.ACCESSIBILITY_HEARING_AID_SETTINGS);
-        final String a11yDestination = Flags.newHearingDevicePairingPage()
-                ? HearingDevicePairingFragment.class.getName()
-                : HearingDevicePairingDetail.class.getName();
         final String destination = launchFromA11y
-                ? a11yDestination
+                ? HearingDevicePairingFragment.class.getName()
                 : BluetoothPairingDetail.class.getName();
         new SubSettingLauncher(getActivity())
                 .setDestination(destination)
diff --git a/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java b/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java
index a0b249d..a023420 100644
--- a/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java
+++ b/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java
@@ -18,6 +18,7 @@
 
 import static com.android.settingslib.bluetooth.BluetoothBroadcastUtils.EXTRA_BLUETOOTH_DEVICE_SINK;
 import static com.android.settingslib.bluetooth.BluetoothBroadcastUtils.EXTRA_BLUETOOTH_SINK_IS_GROUP;
+import static com.android.settingslib.flags.Flags.legacyLeAudioSharing;
 
 import android.bluetooth.BluetoothDevice;
 import android.content.Intent;
@@ -53,6 +54,10 @@
 
     @Override
     protected void handleIntent(Intent intent) {
+        if (!legacyLeAudioSharing()) {
+            finish();
+        }
+
         String action = intent != null ? intent.getAction() : null;
         if (DEBUG) {
             Log.d(TAG, "handleIntent(), action = " + action);
diff --git a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
index ef44843..d2bc319 100644
--- a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
@@ -15,25 +15,18 @@
  */
 package com.android.settings.connecteddevice;
 
-import static com.android.settings.accessibility.AccessibilityHearingAidsFragment.KEY_HEARING_DEVICE_ADD_BT_DEVICES;
-
 import android.bluetooth.BluetoothAdapter;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
-import android.text.TextUtils;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
-import com.android.settings.accessibility.HearingDevicePairingDetail;
-import com.android.settings.accessibility.HearingDevicePairingFragment;
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.flags.Flags;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -83,21 +76,6 @@
     }
 
     @Override
-    public boolean handlePreferenceTreeClick(Preference preference) {
-        if (TextUtils.equals(preference.getKey(), KEY_HEARING_DEVICE_ADD_BT_DEVICES)) {
-            String destination = Flags.newHearingDevicePairingPage()
-                    ? HearingDevicePairingFragment.class.getName()
-                    : HearingDevicePairingDetail.class.getName();
-            new SubSettingLauncher(preference.getContext())
-                    .setDestination(destination)
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .launch();
-            return true;
-        }
-        return super.handlePreferenceTreeClick(preference);
-    }
-
-    @Override
     public int getAvailabilityStatus() {
         return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
                 ? AVAILABLE
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 6b38b28..cfa4a58 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -686,7 +686,6 @@
         controllers.add(new BluetoothA2dpHwOffloadPreferenceController(context, fragment));
         controllers.add(new BluetoothLeAudioHwOffloadPreferenceController(context, fragment));
         controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context));
-        controllers.add(new NfcStackDebugLogPreferenceController(context));
         controllers.add(new NfcSnoopLogPreferenceController(context, fragment));
         controllers.add(new NfcVerboseVendorLogPreferenceController(context, fragment));
         controllers.add(new ShowTapsPreferenceController(context));
diff --git a/src/com/android/settings/development/NfcStackDebugLogPreferenceController.java b/src/com/android/settings/development/NfcStackDebugLogPreferenceController.java
deleted file mode 100644
index 4464923..0000000
--- a/src/com/android/settings/development/NfcStackDebugLogPreferenceController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2021 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.development;
-
-import android.content.Context;
-import android.os.SystemProperties;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.TwoStatePreference;
-
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-
-public class NfcStackDebugLogPreferenceController extends
-        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
-        PreferenceControllerMixin {
-
-    private static final String NFC_STACK_DEBUGLOG_ENABLED_KEY =
-            "nfc_stack_debuglog_enabled";
-    @VisibleForTesting
-    static final String NFC_STACK_DEBUGLOG_ENABLED_PROPERTY =
-            "persist.nfc.debug_enabled";
-
-    public NfcStackDebugLogPreferenceController(Context context) {
-        super(context);
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return NFC_STACK_DEBUGLOG_ENABLED_KEY;
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        final boolean isEnabled = (Boolean) newValue;
-        try {
-            SystemProperties.set(NFC_STACK_DEBUGLOG_ENABLED_PROPERTY,
-                    isEnabled ? "true" : "false");
-        } catch (RuntimeException e) {
-            Log.e(TAG, "Fail to set nfc system property: " + e.getMessage());
-        }
-        return true;
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        try {
-            final boolean isEnabled = SystemProperties.getBoolean(
-                    NFC_STACK_DEBUGLOG_ENABLED_PROPERTY, false /* default */);
-            ((TwoStatePreference) mPreference).setChecked(isEnabled);
-        } catch (RuntimeException e) {
-            Log.e(TAG, "Fail to get nfc system property: " + e.getMessage());
-        }
-    }
-
-    @Override
-    protected void onDeveloperOptionsSwitchDisabled() {
-        super.onDeveloperOptionsSwitchDisabled();
-        try {
-            SystemProperties.set(NFC_STACK_DEBUGLOG_ENABLED_PROPERTY, "false");
-            ((TwoStatePreference) mPreference).setChecked(false);
-        } catch (RuntimeException e) {
-            Log.e(TAG, "Fail to set nfc system property: " + e.getMessage());
-        }
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 6b04d3c..6ef5aa8 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -20,7 +20,6 @@
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.backup.BackupManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -53,6 +52,7 @@
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.instrumentation.Instrumentable;
+import com.android.settingslib.datastore.ChangeReason;
 import com.android.settingslib.widget.LayoutPreference;
 
 import java.util.ArrayList;
@@ -105,7 +105,6 @@
     @VisibleForTesting @BatteryOptimizeUtils.OptimizationMode
     int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
 
-    @VisibleForTesting BackupManager mBackupManager;
     @VisibleForTesting StringBuilder mLogStringBuilder;
 
     // A wrapper class to carry LaunchBatteryDetailPage required arguments.
@@ -293,9 +292,7 @@
     @VisibleForTesting
     void notifyBackupManager() {
         if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
-            final BackupManager backupManager =
-                    mBackupManager != null ? mBackupManager : new BackupManager(getContext());
-            backupManager.dataChanged();
+            BatterySettingsStorage.get(getContext()).notifyChange(ChangeReason.UPDATE);
         }
     }
 
diff --git a/src/com/android/settings/fuelgauge/BatterySettingsStorage.java b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
new file mode 100644
index 0000000..ff3223f
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
@@ -0,0 +1,370 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import android.app.AppGlobals;
+import android.app.AppOpsManager;
+import android.app.Application;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.os.Build;
+import android.os.IDeviceIdleController;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.datastore.BackupContext;
+import com.android.settingslib.datastore.BackupRestoreEntity;
+import com.android.settingslib.datastore.BackupRestoreStorageManager;
+import com.android.settingslib.datastore.EntityBackupResult;
+import com.android.settingslib.datastore.ObservableBackupRestoreStorage;
+import com.android.settingslib.datastore.RestoreContext;
+import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** An implementation to backup and restore battery configurations. */
+public final class BatterySettingsStorage extends ObservableBackupRestoreStorage {
+    public static final String TAG = "BatteryBackupHelper";
+
+    // Definition for the device build information.
+    public static final String KEY_BUILD_BRAND = "device_build_brand";
+    public static final String KEY_BUILD_PRODUCT = "device_build_product";
+    public static final String KEY_BUILD_MANUFACTURER = "device_build_manufacture";
+    public static final String KEY_BUILD_FINGERPRINT = "device_build_fingerprint";
+    // Customized fields for device extra information.
+    public static final String KEY_BUILD_METADATA_1 = "device_build_metadata_1";
+    public static final String KEY_BUILD_METADATA_2 = "device_build_metadata_2";
+
+    private static final String DEVICE_IDLE_SERVICE = "deviceidle";
+    private static final String BATTERY_OPTIMIZE_BACKUP_FILE_NAME =
+            "battery_optimize_backup_historical_logs";
+    private static final int DEVICE_BUILD_INFO_SIZE = 6;
+
+    static final String DELIMITER = ",";
+    static final String DELIMITER_MODE = ":";
+    static final String KEY_OPTIMIZATION_LIST = "optimization_mode_list";
+
+    @Nullable private byte[] mOptimizationModeBytes;
+
+    private final Application mApplication;
+    // Device information map from restore.
+    private final ArrayMap<String, String> mDeviceBuildInfoMap =
+            new ArrayMap<>(DEVICE_BUILD_INFO_SIZE);
+
+    /**
+     * Returns the {@link BatterySettingsStorage} registered to {@link BackupRestoreStorageManager}.
+     */
+    public static @NonNull BatterySettingsStorage get(@NonNull Context context) {
+        return (BatterySettingsStorage)
+                BackupRestoreStorageManager.getInstance(context).getOrThrow(TAG);
+    }
+
+    public BatterySettingsStorage(@NonNull Context context) {
+        mApplication = (Application) context.getApplicationContext();
+    }
+
+    @NonNull
+    @Override
+    public String getName() {
+        return TAG;
+    }
+
+    @Override
+    public boolean enableBackup(@NonNull BackupContext backupContext) {
+        return isOwner();
+    }
+
+    @Override
+    public boolean enableRestore() {
+        return isOwner();
+    }
+
+    static boolean isOwner() {
+        return UserHandle.myUserId() == UserHandle.USER_SYSTEM;
+    }
+
+    @NonNull
+    @Override
+    public List<BackupRestoreEntity> createBackupRestoreEntities() {
+        List<String> allowlistedApps = getFullPowerList();
+        if (allowlistedApps == null) {
+            return Collections.emptyList();
+        }
+        PowerUsageFeatureProvider provider =
+                FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
+        return Arrays.asList(
+                new StringEntity(KEY_BUILD_BRAND, Build.BRAND),
+                new StringEntity(KEY_BUILD_PRODUCT, Build.PRODUCT),
+                new StringEntity(KEY_BUILD_MANUFACTURER, Build.MANUFACTURER),
+                new StringEntity(KEY_BUILD_FINGERPRINT, Build.FINGERPRINT),
+                new StringEntity(KEY_BUILD_METADATA_1, provider.getBuildMetadata1(mApplication)),
+                new StringEntity(KEY_BUILD_METADATA_2, provider.getBuildMetadata2(mApplication)),
+                new OptimizationModeEntity(allowlistedApps));
+    }
+
+    private @Nullable List<String> getFullPowerList() {
+        final long timestamp = System.currentTimeMillis();
+        String[] allowlistedApps;
+        try {
+            IDeviceIdleController deviceIdleController =
+                    IDeviceIdleController.Stub.asInterface(
+                            ServiceManager.getService(DEVICE_IDLE_SERVICE));
+            allowlistedApps = deviceIdleController.getFullPowerWhitelist();
+        } catch (RemoteException e) {
+            Log.e(TAG, "backupFullPowerList() failed", e);
+            return null;
+        }
+        // Ignores unexpected empty result case.
+        if (allowlistedApps == null || allowlistedApps.length == 0) {
+            Log.w(TAG, "no data found in the getFullPowerList()");
+            return Collections.emptyList();
+        }
+        Log.d(
+                TAG,
+                String.format(
+                        "getFullPowerList() size=%d in %d/ms",
+                        allowlistedApps.length, (System.currentTimeMillis() - timestamp)));
+        return Arrays.asList(allowlistedApps);
+    }
+
+    @Override
+    public void writeNewStateDescription(@NonNull ParcelFileDescriptor newState) {
+        BatterySettingsMigrateChecker.verifySaverConfiguration(mApplication);
+        performRestoreIfNeeded();
+    }
+
+    private void performRestoreIfNeeded() {
+        byte[] bytes = mOptimizationModeBytes;
+        mOptimizationModeBytes = null; // clear data
+        if (bytes == null || bytes.length == 0) {
+            return;
+        }
+        final PowerUsageFeatureProvider provider =
+                FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider();
+        if (!provider.isValidToRestoreOptimizationMode(mDeviceBuildInfoMap)) {
+            return;
+        }
+        // Start to restore the app optimization mode data.
+        final int restoreCount = restoreOptimizationMode(bytes);
+        if (restoreCount > 0) {
+            BatterySettingsMigrateChecker.verifyBatteryOptimizeModes(mApplication);
+        }
+    }
+
+    int restoreOptimizationMode(byte[] dataBytes) {
+        final long timestamp = System.currentTimeMillis();
+        final String dataContent = new String(dataBytes, UTF_8);
+        if (dataContent.isEmpty()) {
+            Log.w(TAG, "no data found in the restoreOptimizationMode()");
+            return 0;
+        }
+        final String[] appConfigurations = dataContent.split(BatteryBackupHelper.DELIMITER);
+        if (appConfigurations.length == 0) {
+            Log.w(TAG, "no data found from the split() processing");
+            return 0;
+        }
+        int restoreCount = 0;
+        for (String appConfiguration : appConfigurations) {
+            final String[] results = appConfiguration.split(BatteryBackupHelper.DELIMITER_MODE);
+            // Example format: com.android.systemui:2 we should have length=2
+            if (results.length != 2) {
+                Log.w(TAG, "invalid raw data found:" + appConfiguration);
+                continue;
+            }
+            final String packageName = results[0];
+            final int uid = BatteryUtils.getInstance(mApplication).getPackageUid(packageName);
+            // Ignores system/default apps.
+            if (isSystemOrDefaultApp(packageName, uid)) {
+                Log.w(TAG, "ignore from isSystemOrDefaultApp():" + packageName);
+                continue;
+            }
+            @BatteryOptimizeUtils.OptimizationMode int optimizationMode;
+            try {
+                optimizationMode = Integer.parseInt(results[1]);
+            } catch (NumberFormatException e) {
+                Log.e(TAG, "failed to parse the optimization mode: " + appConfiguration, e);
+                continue;
+            }
+            restoreOptimizationMode(packageName, optimizationMode);
+            restoreCount++;
+        }
+        Log.d(
+                TAG,
+                String.format(
+                        "restoreOptimizationMode() count=%d in %d/ms",
+                        restoreCount, (System.currentTimeMillis() - timestamp)));
+        return restoreCount;
+    }
+
+    private void restoreOptimizationMode(
+            String packageName, @BatteryOptimizeUtils.OptimizationMode int mode) {
+        final BatteryOptimizeUtils batteryOptimizeUtils =
+                newBatteryOptimizeUtils(mApplication, packageName);
+        if (batteryOptimizeUtils == null) {
+            return;
+        }
+        batteryOptimizeUtils.setAppUsageState(
+                mode, BatteryOptimizeHistoricalLogEntry.Action.RESTORE);
+        Log.d(TAG, String.format("restore:%s mode=%d", packageName, mode));
+    }
+
+    @Nullable
+    static BatteryOptimizeUtils newBatteryOptimizeUtils(Context context, String packageName) {
+        final int uid = BatteryUtils.getInstance(context).getPackageUid(packageName);
+        return uid == BatteryUtils.UID_NULL
+                ? null
+                : new BatteryOptimizeUtils(context, uid, packageName);
+    }
+
+    private boolean isSystemOrDefaultApp(String packageName, int uid) {
+        return BatteryOptimizeUtils.isSystemOrDefaultApp(
+                mApplication, PowerAllowlistBackend.getInstance(mApplication), packageName, uid);
+    }
+
+    private class StringEntity implements BackupRestoreEntity {
+        private final String mKey;
+        private final String mValue;
+
+        StringEntity(String key, String value) {
+            this.mKey = key;
+            this.mValue = value;
+        }
+
+        @NonNull
+        @Override
+        public String getKey() {
+            return mKey;
+        }
+
+        @Override
+        public @NonNull EntityBackupResult backup(
+                @NonNull BackupContext backupContext, @NonNull OutputStream outputStream)
+                throws IOException {
+            Log.d(TAG, String.format("backup:%s:%s", mKey, mValue));
+            outputStream.write(mValue.getBytes(UTF_8));
+            return EntityBackupResult.UPDATE;
+        }
+
+        @Override
+        public void restore(
+                @NonNull RestoreContext restoreContext, @NonNull InputStream inputStream)
+                throws IOException {
+            String dataContent = new String(inputStream.readAllBytes(), UTF_8);
+            mDeviceBuildInfoMap.put(mKey, dataContent);
+            Log.d(TAG, String.format("restore:%s:%s", mKey, dataContent));
+        }
+    }
+
+    private class OptimizationModeEntity implements BackupRestoreEntity {
+        private final List<String> mAllowlistedApps;
+
+        private OptimizationModeEntity(List<String> allowlistedApps) {
+            this.mAllowlistedApps = allowlistedApps;
+        }
+
+        @NonNull
+        @Override
+        public String getKey() {
+            return KEY_OPTIMIZATION_LIST;
+        }
+
+        @Override
+        public @NonNull EntityBackupResult backup(
+                @NonNull BackupContext backupContext, @NonNull OutputStream outputStream)
+                throws IOException {
+            final long timestamp = System.currentTimeMillis();
+            final ArraySet<ApplicationInfo> applications = getInstalledApplications();
+            if (applications == null || applications.isEmpty()) {
+                Log.w(TAG, "no data found in the getInstalledApplications()");
+                return EntityBackupResult.DELETE;
+            }
+            int backupCount = 0;
+            final StringBuilder builder = new StringBuilder();
+            final AppOpsManager appOps = mApplication.getSystemService(AppOpsManager.class);
+            final SharedPreferences sharedPreferences = getSharedPreferences(mApplication);
+            // Converts application into the AppUsageState.
+            for (ApplicationInfo info : applications) {
+                final int mode = BatteryOptimizeUtils.getMode(appOps, info.uid, info.packageName);
+                @BatteryOptimizeUtils.OptimizationMode
+                final int optimizationMode =
+                        BatteryOptimizeUtils.getAppOptimizationMode(
+                                mode, mAllowlistedApps.contains(info.packageName));
+                // Ignores default optimized/unknown state or system/default apps.
+                if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
+                        || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
+                        || isSystemOrDefaultApp(info.packageName, info.uid)) {
+                    continue;
+                }
+                final String packageOptimizeMode =
+                        info.packageName + DELIMITER_MODE + optimizationMode;
+                builder.append(packageOptimizeMode).append(DELIMITER);
+                Log.d(TAG, "backupOptimizationMode: " + packageOptimizeMode);
+                BatteryOptimizeLogUtils.writeLog(
+                        sharedPreferences,
+                        Action.BACKUP,
+                        info.packageName,
+                        /* actionDescription */ "mode: " + optimizationMode);
+                backupCount++;
+            }
+
+            outputStream.write(builder.toString().getBytes(UTF_8));
+            Log.d(
+                    TAG,
+                    String.format(
+                            "backup getInstalledApplications():%d count=%d in %d/ms",
+                            applications.size(),
+                            backupCount,
+                            (System.currentTimeMillis() - timestamp)));
+            return EntityBackupResult.UPDATE;
+        }
+
+        private @Nullable ArraySet<ApplicationInfo> getInstalledApplications() {
+            return BatteryOptimizeUtils.getInstalledApplications(
+                    mApplication, AppGlobals.getPackageManager());
+        }
+
+        static @NonNull SharedPreferences getSharedPreferences(Context context) {
+            return context.getSharedPreferences(
+                    BATTERY_OPTIMIZE_BACKUP_FILE_NAME, Context.MODE_PRIVATE);
+        }
+
+        @Override
+        public void restore(
+                @NonNull RestoreContext restoreContext, @NonNull InputStream inputStream)
+                throws IOException {
+            mOptimizationModeBytes = inputStream.readAllBytes();
+        }
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
index 2067456..56702cf 100644
--- a/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetail.java
@@ -19,7 +19,6 @@
 import static com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action;
 
 import android.app.Activity;
-import android.app.backup.BackupManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -42,6 +41,7 @@
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.datastore.ChangeReason;
 import com.android.settingslib.widget.FooterPreference;
 import com.android.settingslib.widget.LayoutPreference;
 import com.android.settingslib.widget.MainSwitchPreference;
@@ -78,7 +78,6 @@
     @VisibleForTesting SelectorWithWidgetPreference mUnrestrictedPreference;
     @VisibleForTesting MainSwitchPreference mMainSwitchPreference;
     @VisibleForTesting FooterPreference mFooterPreference;
-    @VisibleForTesting BackupManager mBackupManager;
     @VisibleForTesting StringBuilder mLogStringBuilder;
 
     @VisibleForTesting @BatteryOptimizeUtils.OptimizationMode
@@ -187,9 +186,7 @@
     @VisibleForTesting
     void notifyBackupManager() {
         if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
-            final BackupManager backupManager =
-                    mBackupManager != null ? mBackupManager : new BackupManager(getContext());
-            backupManager.dataChanged();
+            BatterySettingsStorage.get(getContext()).notifyChange(ChangeReason.UPDATE);
         }
     }
 
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
index 0ffd090..47c171e 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
@@ -65,6 +65,8 @@
     private static final String SPINNER_PREFERENCE_KEY = "battery_usage_spinner";
     private static final String APP_LIST_PREFERENCE_KEY = "app_list";
     private static final String PACKAGE_NAME_NONE = "none";
+    private static final String SLOT_TIMESTAMP = "slot_timestamp";
+    private static final String ANOMALY_KEY = "anomaly_key";
     private static final List<BatteryDiffEntry> EMPTY_ENTRY_LIST = new ArrayList<>();
 
     private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
@@ -77,7 +79,7 @@
     @VisibleForTesting final Map<String, Preference> mPreferenceCache = new ArrayMap<>();
 
     private int mSpinnerPosition;
-    private String mSlotTimestamp;
+    private String mSlotInformation;
 
     @VisibleForTesting Context mPrefContext;
     @VisibleForTesting PreferenceCategory mRootPreference;
@@ -87,7 +89,7 @@
     @VisibleForTesting BatteryDiffData mBatteryDiffData;
     @VisibleForTesting String mPercentLessThanThresholdText;
     @VisibleForTesting boolean mIsHighlightSlot;
-    @VisibleForTesting String mAnomalyEventId;
+    @VisibleForTesting int mAnomalyKeyNumber;
     @VisibleForTesting String mAnomalyEntryKey;
     @VisibleForTesting String mAnomalyHintString;
     @VisibleForTesting String mAnomalyHintPrefKey;
@@ -142,12 +144,25 @@
                 && mAnomalyEntryKey.equals(entry.getKey());
     }
 
-    private String getActionKey(BatteryDiffEntry entry) {
-        final String actionKey =
+    private void logPreferenceClickedMetrics(BatteryDiffEntry entry) {
+        final int attribution = SettingsEnums.OPEN_BATTERY_USAGE;
+        final int action = entry.isSystemEntry()
+                ? SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM
+                : SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM;
+        final int pageId = SettingsEnums.OPEN_BATTERY_USAGE;
+        final String packageName =
                 TextUtils.isEmpty(entry.getPackageName())
                         ? PACKAGE_NAME_NONE
                         : entry.getPackageName();
-        return !isAnomalyBatteryDiffEntry(entry) ? actionKey : actionKey + "|" + mAnomalyEventId;
+        final int percentage = (int) Math.round(entry.getPercentage());
+        final int slotTimestamp = (int) (mBatteryDiffData.getStartTimestamp() / 1000);
+        mMetricsFeatureProvider.action(attribution, action, pageId, packageName, percentage);
+        mMetricsFeatureProvider.action(attribution, action, pageId, SLOT_TIMESTAMP, slotTimestamp);
+
+        if (isAnomalyBatteryDiffEntry(entry)) {
+            mMetricsFeatureProvider.action(
+                    attribution, action, pageId, ANOMALY_KEY, mAnomalyKeyNumber);
+        }
     }
 
     @Override
@@ -157,14 +172,7 @@
         }
         final PowerGaugePreference powerPref = (PowerGaugePreference) preference;
         final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
-        mMetricsFeatureProvider.action(
-                /* attribution */ SettingsEnums.OPEN_BATTERY_USAGE,
-                /* action */ diffEntry.isSystemEntry()
-                        ? SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM
-                        : SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
-                /* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
-                getActionKey(diffEntry),
-                (int) Math.round(diffEntry.getPercentage()));
+        logPreferenceClickedMetrics(diffEntry);
         Log.d(
                 TAG,
                 String.format(
@@ -179,7 +187,7 @@
                 mFragment.getMetricsCategory(),
                 diffEntry,
                 powerPref.getPercentage(),
-                mSlotTimestamp,
+                mSlotInformation,
                 /* showTimeInformation= */ true,
                 anomalyHintPrefKey,
                 anomalyHintText);
@@ -245,13 +253,14 @@
             boolean isHighlightSlot,
             Optional<AnomalyEventWrapper> optionalAnomalyEventWrapper) {
         mBatteryDiffData = slotUsageData;
-        mSlotTimestamp = slotTimestamp;
+        mSlotInformation = slotTimestamp;
         mIsHighlightSlot = isHighlightSlot;
 
         if (optionalAnomalyEventWrapper != null) {
             final AnomalyEventWrapper anomalyEventWrapper =
                     optionalAnomalyEventWrapper.orElse(null);
-            mAnomalyEventId = anomalyEventWrapper != null ? anomalyEventWrapper.getEventId() : null;
+            mAnomalyKeyNumber =
+                    anomalyEventWrapper != null ? anomalyEventWrapper.getAnomalyKeyNumber() : -1;
             mAnomalyEntryKey =
                     anomalyEventWrapper != null ? anomalyEventWrapper.getAnomalyEntryKey() : null;
             mAnomalyHintString =
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index 1482117..29839e9 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -274,8 +274,7 @@
         if (!isResumed() || anomalyEventList == null) {
             return;
         }
-        Log.d(TAG, "anomalyEventList = " + anomalyEventList);
-
+        logPowerAnomalyEventList(anomalyEventList);
         final Set<String> dismissedPowerAnomalyKeys =
                 DatabaseUtils.getDismissedPowerAnomalyKeys(getContext());
         Log.d(TAG, "dismissedPowerAnomalyKeys = " + dismissedPowerAnomalyKeys);
@@ -429,10 +428,19 @@
                         .filter(predicate)
                         .max(Comparator.comparing(PowerAnomalyEvent::getScore))
                         .orElse(null);
-        Log.d(TAG, "filterAnomalyEvent = " + filterAnomalyEvent);
+        Log.d(TAG, "filterAnomalyEvent = "
+                + (filterAnomalyEvent == null ? null : filterAnomalyEvent.getEventId()));
         return filterAnomalyEvent;
     }
 
+    private static void logPowerAnomalyEventList(PowerAnomalyEventList anomalyEventList) {
+        final StringBuilder stringBuilder = new StringBuilder();
+        for (PowerAnomalyEvent anomalyEvent : anomalyEventList.getPowerAnomalyEventsList()) {
+            stringBuilder.append(anomalyEvent.getEventId()).append(", ");
+        }
+        Log.d(TAG, "anomalyEventList = [" + stringBuilder + "]");
+    }
+
     private static BatteryDiffData getAllBatteryDiffData(
             Map<Integer, Map<Integer, BatteryDiffData>> batteryUsageMap) {
         return batteryUsageMap == null
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index bcf0d00..0bc426c 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -1263,7 +1263,7 @@
 
         if (Flags.androidVWifiApi() && wifiEntry.getSecurityTypes()
                 .contains(WifiEntry.SECURITY_WEP)) {
-            WepNetworkDialogActivity.checkWepAllowed(
+            WifiUtils.checkWepAllowed(
                     getContext(), getViewLifecycleOwner(), wifiEntry.getSsid(), () -> {
                         wifiEntry.connect(callback);
                         return null;
diff --git a/src/com/android/settings/network/SwitchSlotSidecar.java b/src/com/android/settings/network/SwitchSlotSidecar.java
index 7005452..72ece04 100644
--- a/src/com/android/settings/network/SwitchSlotSidecar.java
+++ b/src/com/android/settings/network/SwitchSlotSidecar.java
@@ -130,11 +130,13 @@
         } catch (UiccSlotsException e) {
             result.exception = e;
         }
+        Log.i(TAG, "return command.");
         return result;
     }
 
     @Override
     protected void onPostExecute(Result result) {
+        Log.i(TAG, "onPostExecute: get result");
         if (result.exception == null) {
             setState(State.SUCCESS, Substate.UNUSED);
         } else {
diff --git a/src/com/android/settings/network/WepNetworkDialogActivity.kt b/src/com/android/settings/network/WepNetworkDialogActivity.kt
index d69630f..fef93ef 100644
--- a/src/com/android/settings/network/WepNetworkDialogActivity.kt
+++ b/src/com/android/settings/network/WepNetworkDialogActivity.kt
@@ -17,8 +17,6 @@
 package com.android.settings.network
 
 import android.app.settings.SettingsEnums
-import android.content.Context
-import android.content.Intent
 import android.net.wifi.WifiManager
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material3.Text
@@ -26,20 +24,13 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.text.style.TextAlign
-import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.lifecycleScope
 import com.android.settings.R
 import com.android.settings.core.SubSettingLauncher
 import com.android.settings.wifi.ConfigureWifiSettings
 import com.android.settingslib.spa.SpaBaseDialogActivity
 import com.android.settingslib.spa.widget.dialog.AlertDialogButton
 import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogWithIcon
-import kotlin.coroutines.resume
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.asExecutor
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.suspendCancellableCoroutine
-import kotlinx.coroutines.withContext
+import com.android.settingslib.wifi.WifiUtils.Companion.SSID
 
 class WepNetworkDialogActivity : SpaBaseDialogActivity() {
     @Composable
@@ -76,37 +67,4 @@
                 )
             })
     }
-
-    companion object {
-        @JvmStatic
-        fun checkWepAllowed(
-            context: Context,
-            lifecycleOwner: LifecycleOwner,
-            ssid: String,
-            onAllowed: () -> Unit,
-        ) {
-            lifecycleOwner.lifecycleScope.launch {
-                val wifiManager = context.getSystemService(WifiManager::class.java) ?: return@launch
-                if (wifiManager.queryWepAllowed()) {
-                    onAllowed()
-                } else {
-                    val intent = Intent(context, WepNetworkDialogActivity::class.java).apply {
-                        putExtra(SSID, ssid)
-                    }
-                    context.startActivity(intent)
-                }
-            }
-        }
-
-        private suspend fun WifiManager.queryWepAllowed(): Boolean =
-            withContext(Dispatchers.Default) {
-                suspendCancellableCoroutine { continuation ->
-                    queryWepAllowed(Dispatchers.Default.asExecutor()) {
-                        continuation.resume(it)
-                    }
-                }
-            }
-
-        const val SSID = "ssid"
-    }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/SubscriptionRepository.kt b/src/com/android/settings/network/telephony/SubscriptionRepository.kt
index ee4ac1e..e44b577 100644
--- a/src/com/android/settings/network/telephony/SubscriptionRepository.kt
+++ b/src/com/android/settings/network/telephony/SubscriptionRepository.kt
@@ -17,18 +17,31 @@
 package com.android.settings.network.telephony
 
 import android.content.Context
+import android.telephony.SubscriptionInfo
 import android.telephony.SubscriptionManager
 import android.util.Log
+import com.android.settings.network.SubscriptionUtil
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.asExecutor
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.callbackFlow
 import kotlinx.coroutines.flow.conflate
 import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 
 private const val TAG = "SubscriptionRepository"
 
+fun Context.isSubscriptionEnabledFlow(subId: Int) = subscriptionsChangedFlow().map {
+    val subscriptionManager = getSystemService(SubscriptionManager::class.java)
+
+    subscriptionManager?.isSubscriptionEnabled(subId) ?: false
+}.flowOn(Dispatchers.Default)
+
+fun Context.phoneNumberFlow(subscriptionInfo: SubscriptionInfo) = subscriptionsChangedFlow().map {
+    SubscriptionUtil.getFormattedPhoneNumber(this, subscriptionInfo)
+}.flowOn(Dispatchers.Default)
+
 fun Context.subscriptionsChangedFlow() = callbackFlow {
     val subscriptionManager = getSystemService(SubscriptionManager::class.java)!!
 
diff --git a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
index 351ac77..a0c363a 100644
--- a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
+++ b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
@@ -16,37 +16,33 @@
 
 package com.android.settings.spa.network
 
-import android.app.Application
 import android.content.Context
-import android.content.Intent
 import android.content.IntentFilter
 import android.os.Bundle
-import android.os.UserManager
 import android.telephony.SubscriptionInfo
 import android.telephony.SubscriptionManager
 import android.telephony.TelephonyManager
-import android.telephony.euicc.EuiccManager
 import android.util.Log
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.automirrored.outlined.Message
-import androidx.compose.material.icons.outlined.Add
 import androidx.compose.material.icons.outlined.DataUsage
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableIntState
+import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableIntStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.toMutableStateList
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.vectorResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.viewmodel.compose.viewModel
 import com.android.settings.R
 import com.android.settings.network.SubscriptionInfoListViewModel
-import com.android.settings.network.SubscriptionUtil
 import com.android.settings.network.telephony.MobileNetworkUtils
 import com.android.settings.wifi.WifiPickerTrackerHelper
 import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
@@ -59,17 +55,13 @@
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spa.widget.preference.SwitchPreference
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
-import com.android.settingslib.spa.widget.preference.TwoTargetSwitchPreference
 import com.android.settingslib.spa.widget.scaffold.RegularScaffold
 import com.android.settingslib.spa.widget.ui.Category
-import com.android.settingslib.spa.widget.ui.SettingsIcon
 import com.android.settingslib.spaprivileged.framework.common.broadcastReceiverFlow
-
-import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
-import com.android.settingslib.spaprivileged.template.preference.RestrictedPreference
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.conflate
 import kotlinx.coroutines.flow.flowOf
@@ -85,10 +77,8 @@
 object NetworkCellularGroupProvider : SettingsPageProvider {
     override val name = "NetworkCellularGroupProvider"
 
-    private lateinit var subscriptionViewModel: SubscriptionInfoListViewModel
     private val owner = createSettingsPage()
 
-    var selectableSubscriptionInfoList: List<SubscriptionInfo> = listOf()
     var defaultVoiceSubId: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
     var defaultSmsSubId: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
     var defaultDataSubId: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
@@ -106,9 +96,6 @@
     @Composable
     override fun Page(arguments: Bundle?) {
         val context = LocalContext.current
-        var selectableSubscriptionInfoListRemember = remember {
-            mutableListOf<SubscriptionInfo>().toMutableStateList()
-        }
         var callsSelectedId = rememberSaveable {
             mutableIntStateOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
         }
@@ -122,24 +109,24 @@
             mutableIntStateOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
         }
 
-        subscriptionViewModel = SubscriptionInfoListViewModel(
-                context.applicationContext as Application)
+        val subscriptionViewModel = viewModel<SubscriptionInfoListViewModel>()
 
-        allOfFlows(context, subscriptionViewModel.selectableSubscriptionInfoListFlow)
-                .collectLatestWithLifecycle(LocalLifecycleOwner.current) {
-                    selectableSubscriptionInfoListRemember.clear()
-                    selectableSubscriptionInfoListRemember.addAll(selectableSubscriptionInfoList)
-                    callsSelectedId.intValue = defaultVoiceSubId
-                    textsSelectedId.intValue = defaultSmsSubId
-                    mobileDataSelectedId.intValue = defaultDataSubId
-                    nonDdsRemember.intValue = nonDds
-                }
+        remember {
+            allOfFlows(context, subscriptionViewModel.selectableSubscriptionInfoListFlow)
+        }.collectLatestWithLifecycle(LocalLifecycleOwner.current) {
+            callsSelectedId.intValue = defaultVoiceSubId
+            textsSelectedId.intValue = defaultSmsSubId
+            mobileDataSelectedId.intValue = defaultDataSubId
+            nonDdsRemember.intValue = nonDds
+        }
 
-        PageImpl(selectableSubscriptionInfoListRemember,
-                callsSelectedId,
-                textsSelectedId,
-                mobileDataSelectedId,
-                nonDdsRemember)
+        PageImpl(
+            subscriptionViewModel.selectableSubscriptionInfoListFlow,
+            callsSelectedId,
+            textsSelectedId,
+            mobileDataSelectedId,
+            nonDdsRemember
+        )
     }
 
     private fun allOfFlows(context: Context,
@@ -152,13 +139,12 @@
                     NetworkCellularGroupProvider::refreshUiStates,
             ).flowOn(Dispatchers.Default)
 
-    fun refreshUiStates(
-            inputSelectableSubscriptionInfoList: List<SubscriptionInfo>,
-            inputDefaultVoiceSubId: Int,
-            inputDefaultSmsSubId: Int,
-            inputDefaultDateSubId: Int
-    ): Unit {
-        selectableSubscriptionInfoList = inputSelectableSubscriptionInfoList
+    private fun refreshUiStates(
+        selectableSubscriptionInfoList: List<SubscriptionInfo>,
+        inputDefaultVoiceSubId: Int,
+        inputDefaultSmsSubId: Int,
+        inputDefaultDateSubId: Int
+    ) {
         defaultVoiceSubId = inputDefaultVoiceSubId
         defaultSmsSubId = inputDefaultSmsSubId
         defaultDataSubId = inputDefaultDateSubId
@@ -178,25 +164,23 @@
 }
 
 @Composable
-fun PageImpl(selectableSubscriptionInfoList: List<SubscriptionInfo>,
-             defaultVoiceSubId: MutableIntState,
-             defaultSmsSubId: MutableIntState,
-             defaultDataSubId: MutableIntState,
-             nonDds: MutableIntState) {
-    val context = LocalContext.current
-    var activeSubscriptionInfoList: List<SubscriptionInfo> =
-            selectableSubscriptionInfoList.filter { subscriptionInfo ->
-                subscriptionInfo.simSlotIndex != -1
-            }
-    var subscriptionManager = context.getSystemService(SubscriptionManager::class.java)
+fun PageImpl(
+    selectableSubscriptionInfoListFlow: StateFlow<List<SubscriptionInfo>>,
+    defaultVoiceSubId: MutableIntState,
+    defaultSmsSubId: MutableIntState,
+    defaultDataSubId: MutableIntState,
+    nonDds: MutableIntState
+) {
+    val selectableSubscriptionInfoList by selectableSubscriptionInfoListFlow
+        .collectAsStateWithLifecycle(initialValue = emptyList())
+    val activeSubscriptionInfoList: List<SubscriptionInfo> =
+        selectableSubscriptionInfoList.filter { subscriptionInfo ->
+            subscriptionInfo.simSlotIndex != -1
+        }
 
     val stringSims = stringResource(R.string.provider_network_settings_title)
     RegularScaffold(title = stringSims) {
-        SimsSectionImpl(
-                context,
-                subscriptionManager,
-                selectableSubscriptionInfoList
-        )
+        SimsSection(selectableSubscriptionInfoList)
         PrimarySimSectionImpl(
                 activeSubscriptionInfoList,
                 defaultVoiceSubId,
@@ -208,56 +192,6 @@
 }
 
 @Composable
-fun SimsSectionImpl(
-        context: Context,
-        subscriptionManager: SubscriptionManager?,
-        subscriptionInfoList: List<SubscriptionInfo>
-) {
-    val coroutineScope = rememberCoroutineScope()
-    for (subInfo in subscriptionInfoList) {
-        val checked = rememberSaveable() {
-            mutableStateOf(false)
-        }
-        //TODO: Add the Restricted TwoTargetSwitchPreference in SPA
-        TwoTargetSwitchPreference(
-                object : SwitchPreferenceModel {
-                    override val title = subInfo.displayName.toString()
-                    override val summary = { subInfo.number }
-                    override val checked = {
-                        coroutineScope.launch {
-                            withContext(Dispatchers.Default) {
-                                checked.value = subscriptionManager?.isSubscriptionEnabled(
-                                    subInfo.subscriptionId)?:false
-                            }
-                        }
-                        checked.value
-                    }
-                    override val onCheckedChange = { newChecked: Boolean ->
-                        startToggleSubscriptionDialog(context, subInfo, newChecked)
-                    }
-                }
-        ) {
-            startMobileNetworkSettings(context, subInfo)
-        }
-    }
-
-    // + add sim
-    if (showEuiccSettings(context)) {
-        RestrictedPreference(
-                model = object : PreferenceModel {
-                    override val title = stringResource(id = R.string.mobile_network_list_add_more)
-                    override val icon = @Composable { SettingsIcon(Icons.Outlined.Add) }
-                    override val onClick = {
-                        startAddSimFlow(context)
-                    }
-                },
-                restrictions = Restrictions(keys =
-                        listOf(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)),
-        )
-    }
-}
-
-@Composable
 fun PrimarySimImpl(
     subscriptionInfoList: List<SubscriptionInfo>,
     callsSelectedId: MutableIntState,
@@ -440,32 +374,6 @@
         ).map { SubscriptionManager.getDefaultDataSubscriptionId() }
                 .conflate().flowOn(Dispatchers.Default)
 
-private fun startToggleSubscriptionDialog(
-        context: Context,
-        subInfo: SubscriptionInfo,
-        newStatus: Boolean
-) {
-    SubscriptionUtil.startToggleSubscriptionDialogActivity(
-            context,
-            subInfo.subscriptionId,
-            newStatus
-    )
-}
-
-private fun startMobileNetworkSettings(context: Context, subInfo: SubscriptionInfo) {
-    MobileNetworkUtils.launchMobileNetworkSettings(context, subInfo)
-}
-
-private fun startAddSimFlow(context: Context) {
-    val intent = Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION)
-    intent.putExtra(EuiccManager.EXTRA_FORCE_PROVISION, true)
-    context.startActivity(intent)
-}
-
-private fun showEuiccSettings(context: Context): Boolean {
-    return MobileNetworkUtils.showEuiccSettings(context)
-}
-
 suspend fun setDefaultVoice(
     subscriptionManager: SubscriptionManager?,
     subId: Int
diff --git a/src/com/android/settings/spa/network/SimsSection.kt b/src/com/android/settings/spa/network/SimsSection.kt
new file mode 100644
index 0000000..334ca61
--- /dev/null
+++ b/src/com/android/settings/spa/network/SimsSection.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.spa.network
+
+import android.content.Context
+import android.content.Intent
+import android.os.UserManager
+import android.telephony.SubscriptionInfo
+import android.telephony.euicc.EuiccManager
+import androidx.compose.foundation.layout.Column
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.Add
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.settings.R
+import com.android.settings.network.SubscriptionUtil
+import com.android.settings.network.telephony.MobileNetworkUtils
+import com.android.settings.network.telephony.isSubscriptionEnabledFlow
+import com.android.settings.network.telephony.phoneNumberFlow
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
+import com.android.settingslib.spa.widget.preference.TwoTargetSwitchPreference
+import com.android.settingslib.spa.widget.ui.SettingsIcon
+import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
+import com.android.settingslib.spaprivileged.template.preference.RestrictedPreference
+
+@Composable
+fun SimsSection(subscriptionInfoList: List<SubscriptionInfo>) {
+    Column {
+        for (subInfo in subscriptionInfoList) {
+            SimPreference(subInfo)
+        }
+
+        AddSim()
+    }
+}
+
+@Composable
+private fun SimPreference(subInfo: SubscriptionInfo) {
+    val context = LocalContext.current
+    val checked = remember(subInfo.subscriptionId) {
+        context.isSubscriptionEnabledFlow(subInfo.subscriptionId)
+    }.collectAsStateWithLifecycle(initialValue = false)
+    val phoneNumber = remember(subInfo) {
+        context.phoneNumberFlow(subInfo)
+    }.collectAsStateWithLifecycle(initialValue = null)
+    //TODO: Add the Restricted TwoTargetSwitchPreference in SPA
+    TwoTargetSwitchPreference(
+        object : SwitchPreferenceModel {
+            override val title = subInfo.displayName.toString()
+            override val summary = { phoneNumber.value ?: "" }
+            override val checked = { checked.value }
+            override val onCheckedChange = { newChecked: Boolean ->
+                SubscriptionUtil.startToggleSubscriptionDialogActivity(
+                    context,
+                    subInfo.subscriptionId,
+                    newChecked,
+                )
+            }
+        }
+    ) {
+        MobileNetworkUtils.launchMobileNetworkSettings(context, subInfo)
+    }
+}
+
+@Composable
+private fun AddSim() {
+    val context = LocalContext.current
+    if (remember { MobileNetworkUtils.showEuiccSettings(context) }) {
+        RestrictedPreference(
+            model = object : PreferenceModel {
+                override val title = stringResource(id = R.string.mobile_network_list_add_more)
+                override val icon = @Composable { SettingsIcon(Icons.Outlined.Add) }
+                override val onClick = { startAddSimFlow(context) }
+            },
+            restrictions = Restrictions(keys = listOf(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)),
+        )
+    }
+}
+
+private fun startAddSimFlow(context: Context) {
+    val intent = Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION)
+    intent.putExtra(EuiccManager.EXTRA_FORCE_PROVISION, true)
+    context.startActivity(intent)
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
index bd57e9d..d082b1f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
@@ -32,10 +32,6 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
-import android.platform.test.annotations.RequiresFlagsDisabled;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
@@ -47,7 +43,6 @@
 import com.android.settings.bluetooth.BluetoothPairingDetail;
 import com.android.settings.bluetooth.HearingAidPairingDialogFragment;
 import com.android.settings.bluetooth.Utils;
-import com.android.settings.flags.Flags;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -82,9 +77,6 @@
     @Rule
     public final MockitoRule mockito = MockitoJUnit.rule();
 
-    @Rule
-    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
     private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1";
     private static final int TEST_LAUNCH_PAGE = SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY;
 
@@ -137,8 +129,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE)
-    public void dialogPositiveButtonClick_intentToNewA11yPairingPage() {
+    public void dialogPositiveButtonClick_intentToA11yPairingPage() {
         setupDialog(SettingsEnums.ACCESSIBILITY);
         final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY);
         dialog.show();
@@ -151,20 +142,6 @@
     }
 
     @Test
-    @RequiresFlagsDisabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE)
-    public void dialogPositiveButtonClick_intentToOldA11yPairingPage() {
-        setupDialog(SettingsEnums.ACCESSIBILITY);
-        final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY);
-        dialog.show();
-
-        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
-
-        final Intent intent = shadowOf(mActivity).getNextStartedActivity();
-        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
-                .isEqualTo(HearingDevicePairingDetail.class.getName());
-    }
-
-    @Test
     public void dialogNegativeButtonClick_dismissDialog() {
         final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY);
         dialog.show();
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java
deleted file mode 100644
index e1651d9..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingDetailTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.accessibility;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.settings.bluetooth.BluetoothProgressCategory;
-import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-/** Tests for {@link HearingDevicePairingDetail}. */
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBluetoothAdapter.class})
-public class HearingDevicePairingDetailTest {
-
-    @Rule
-    public final MockitoRule mockito = MockitoJUnit.rule();
-
-    private final Context mContext = ApplicationProvider.getApplicationContext();
-
-    @Mock
-    private CachedBluetoothDevice mCachedBluetoothDevice;
-    private BluetoothProgressCategory mProgressCategory;
-    private TestHearingDevicePairingDetail mFragment;
-
-    @Before
-    public void setUp() {
-        final BluetoothAdapter bluetoothAdapter = spy(BluetoothAdapter.getDefaultAdapter());
-        final ShadowBluetoothAdapter shadowBluetoothAdapter = Shadow.extract(
-                BluetoothAdapter.getDefaultAdapter());
-        shadowBluetoothAdapter.setEnabled(true);
-
-        mProgressCategory = spy(new BluetoothProgressCategory(mContext));
-        mFragment = spy(new TestHearingDevicePairingDetail());
-        when(mFragment.getContext()).thenReturn(mContext);
-        when(mFragment.findPreference(
-                HearingDevicePairingDetail.KEY_AVAILABLE_HEARING_DEVICES)).thenReturn(
-                mProgressCategory);
-        mFragment.setBluetoothAdapter(bluetoothAdapter);
-
-    }
-
-    @Test
-    public void getDeviceListKey_expectedKey() {
-        assertThat(mFragment.getDeviceListKey()).isEqualTo(
-                HearingDevicePairingDetail.KEY_AVAILABLE_HEARING_DEVICES);
-    }
-
-    @Test
-    public void onDeviceBondStateChanged_bondNone_setProgressFalse() {
-        mFragment.initPreferencesFromPreferenceScreen();
-
-        mFragment.onDeviceBondStateChanged(mCachedBluetoothDevice, BluetoothDevice.BOND_NONE);
-
-        verify(mProgressCategory).setProgress(true);
-    }
-
-    @Test
-    public void onDeviceBondStateChanged_bonding_setProgressTrue() {
-        mFragment.initPreferencesFromPreferenceScreen();
-
-        mFragment.onDeviceBondStateChanged(mCachedBluetoothDevice, BluetoothDevice.BOND_BONDING);
-
-        verify(mProgressCategory).setProgress(false);
-    }
-
-    private static class TestHearingDevicePairingDetail extends HearingDevicePairingDetail {
-        TestHearingDevicePairingDetail() {
-            super();
-        }
-
-        public void setBluetoothAdapter(BluetoothAdapter bluetoothAdapter) {
-            this.mBluetoothAdapter = bluetoothAdapter;
-        }
-
-        public void enableScanning() {
-            super.enableScanning();
-        }
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
index 1f9fbeb..b368a22 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
@@ -56,7 +56,7 @@
     private final String TEST_KEY = "test_key";
 
     @Spy
-    private HearingDevicePairingDetail mFragment = new HearingDevicePairingDetail();
+    private HearingDevicePairingFragment mFragment = new HearingDevicePairingFragment();
     private FragmentActivity mActivity;
     @Mock
     private PreferenceScreen mScreen;
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java
index 63fa88d..70c73a6 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java
@@ -15,16 +15,12 @@
  */
 package com.android.settings.connecteddevice;
 
-import static com.android.settings.accessibility.AccessibilityHearingAidsFragment.KEY_HEARING_DEVICE_ADD_BT_DEVICES;
 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.robolectric.Shadows.shadowOf;
 
@@ -33,27 +29,17 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.platform.test.annotations.RequiresFlagsDisabled;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.text.TextUtils;
 
 import androidx.preference.PreferenceScreen;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.accessibility.HearingDevicePairingDetail;
-import com.android.settings.accessibility.HearingDevicePairingFragment;
-import com.android.settings.flags.Flags;
 import com.android.settingslib.RestrictedPreference;
 
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
@@ -65,10 +51,6 @@
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = ShadowApplicationPackageManager.class)
 public class AddDevicePreferenceControllerTest {
-
-    @Rule
-    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
     @Mock
     private PreferenceScreen mScreen;
     @Mock
@@ -100,8 +82,6 @@
         when(mBluetoothAdapter.isEnabled()).thenReturn(true);
         when(mScreen.findPreference(key)).thenReturn(mAddDevicePreference);
         mAddDevicePreferenceController.displayPreference(mScreen);
-
-        doNothing().when(mContext).startActivity(any(Intent.class));
     }
 
     @Test
@@ -157,30 +137,4 @@
         assertThat(mAddDevicePreferenceController.getAvailabilityStatus())
                 .isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
-
-    @Test
-    @RequiresFlagsEnabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE)
-    public void handlePreferenceClick_A11yPreference_redirectToNewPairingPage() {
-        mAddDevicePreference.setKey(KEY_HEARING_DEVICE_ADD_BT_DEVICES);
-        final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-
-        mAddDevicePreferenceController.handlePreferenceTreeClick(mAddDevicePreference);
-
-        verify(mContext).startActivity(intentCaptor.capture());
-        assertThat(intentCaptor.getValue().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
-                .isEqualTo(HearingDevicePairingFragment.class.getName());
-    }
-
-    @Test
-    @RequiresFlagsDisabled(Flags.FLAG_NEW_HEARING_DEVICE_PAIRING_PAGE)
-    public void handlePreferenceClick_A11yPreference_redirectToOldPairingPage() {
-        mAddDevicePreference.setKey(KEY_HEARING_DEVICE_ADD_BT_DEVICES);
-        final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-
-        mAddDevicePreferenceController.handlePreferenceTreeClick(mAddDevicePreference);
-
-        verify(mContext).startActivity(intentCaptor.capture());
-        assertThat(intentCaptor.getValue().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
-                .isEqualTo(HearingDevicePairingDetail.class.getName());
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 583db5e..0648de4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -33,7 +33,6 @@
 import static org.mockito.Mockito.when;
 
 import android.app.AppOpsManager;
-import android.app.backup.BackupManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -61,8 +60,12 @@
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.datastore.ChangeReason;
+import com.android.settingslib.datastore.Observer;
 import com.android.settingslib.widget.LayoutPreference;
 
+import com.google.common.util.concurrent.MoreExecutors;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -116,9 +119,10 @@
     @Mock private AppOpsManager mAppOpsManager;
     @Mock private LoaderManager mLoaderManager;
     @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils;
-    @Mock private BackupManager mBackupManager;
+    @Mock private Observer mObserver;
 
     private Context mContext;
+    private BatterySettingsStorage mBatterySettingsStorage;
     private PrimarySwitchPreference mAllowBackgroundUsagePreference;
     private AdvancedPowerUsageDetail mFragment;
     private SettingsActivity mTestActivity;
@@ -130,6 +134,7 @@
     @Before
     public void setUp() {
         mContext = spy(ApplicationProvider.getApplicationContext());
+        mBatterySettingsStorage = BatterySettingsStorage.get(mContext);
         when(mContext.getPackageName()).thenReturn("foo");
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
@@ -200,7 +205,6 @@
         mFragment.mHeaderPreference = mHeaderPreference;
         mFragment.mState = mState;
         mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
-        mFragment.mBackupManager = mBackupManager;
         mFragment.mLogStringBuilder = new StringBuilder();
         mAppEntry.info = mock(ApplicationInfo.class);
 
@@ -447,23 +451,25 @@
 
     @Test
     public void notifyBackupManager_optimizationModeIsNotChanged_notInvokeDataChanged() {
+        mBatterySettingsStorage.addObserver(mObserver, MoreExecutors.directExecutor());
         final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
         mFragment.mOptimizationMode = mode;
         when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
 
         mFragment.notifyBackupManager();
 
-        verifyNoInteractions(mBackupManager);
+        verifyNoInteractions(mObserver);
     }
 
     @Test
     public void notifyBackupManager_optimizationModeIsChanged_invokeDataChanged() {
+        mBatterySettingsStorage.addObserver(mObserver, MoreExecutors.directExecutor());
         mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED;
         when(mBatteryOptimizeUtils.getAppOptimizationMode())
                 .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
 
         mFragment.notifyBackupManager();
 
-        verify(mBackupManager).dataChanged();
+        verify(mObserver).onChanged(ChangeReason.UPDATE);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java
index b6caa7f..9061117 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerBackgroundUsageDetailTest.java
@@ -33,7 +33,6 @@
 import static org.mockito.Mockito.when;
 
 import android.app.AppOpsManager;
-import android.app.backup.BackupManager;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
@@ -119,7 +118,6 @@
     @Mock private LoaderManager mLoaderManager;
     @Mock private ApplicationsState.AppEntry mAppEntry;
     @Mock private BatteryEntry mBatteryEntry;
-    @Mock private BackupManager mBackupManager;
     @Mock private PackageManager mPackageManager;
     @Mock private AppOpsManager mAppOpsManager;
     @Mock private CompoundButton mMockSwitch;
@@ -174,7 +172,6 @@
         mFragment.mHeaderPreference = mHeaderPreference;
         mFragment.mState = mState;
         mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
-        mFragment.mBackupManager = mBackupManager;
         mAppEntry.info = mock(ApplicationInfo.class);
 
         mTestActivity = spy(new SettingsActivity());
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt
index 2887134..a59bf93 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt
@@ -33,6 +33,7 @@
 import org.mockito.kotlin.doReturn
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
 
 @RunWith(AndroidJUnit4::class)
 class SubscriptionRepositoryTest {
@@ -50,6 +51,17 @@
     }
 
     @Test
+    fun isSubscriptionEnabledFlow() = runBlocking {
+        mockSubscriptionManager.stub {
+            on { isSubscriptionEnabled(SUB_ID) } doReturn true
+        }
+
+        val isEnabled = context.isSubscriptionEnabledFlow(SUB_ID).firstWithTimeoutOrNull()
+
+        assertThat(isEnabled).isTrue()
+    }
+
+    @Test
     fun subscriptionsChangedFlow_hasInitialValue() = runBlocking {
         val initialValue = context.subscriptionsChangedFlow().firstWithTimeoutOrNull()
 
@@ -67,4 +79,8 @@
 
         assertThat(listDeferred.await()).hasSize(2)
     }
+
+    private companion object {
+        const val SUB_ID = 1
+    }
 }
diff --git a/tests/unit/src/com/android/settings/development/NfcStackDebugLogPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/NfcStackDebugLogPreferenceControllerTest.java
deleted file mode 100644
index 914d01d..0000000
--- a/tests/unit/src/com/android/settings/development/NfcStackDebugLogPreferenceControllerTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2021 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.development;
-
-import static com.android.settings.development.NfcStackDebugLogPreferenceController
-        .NFC_STACK_DEBUGLOG_ENABLED_PROPERTY;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.os.Looper;
-import android.os.SystemProperties;
-
-import androidx.preference.SwitchPreference;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class NfcStackDebugLogPreferenceControllerTest {
-
-    private Context mContext;
-    private NfcStackDebugLogPreferenceController mController;
-    private SwitchPreference mPreference;
-
-    @Before
-    public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
-        mController = new NfcStackDebugLogPreferenceController(mContext);
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-
-        final PreferenceManager preferenceManager = new PreferenceManager(mContext);
-        final PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
-        mPreference = new SwitchPreference(mContext);
-        mPreference.setKey(mController.getPreferenceKey());
-        screen.addPreference(mPreference);
-        mController.displayPreference(screen);
-    }
-
-    @Test
-    public void onPreferenceChanged_settingDisabled_shouldTurnOffNfcStackDebugLog() {
-        mController.onPreferenceChange(mPreference, false /* new value */);
-
-        final boolean mode = SystemProperties.getBoolean(
-                NFC_STACK_DEBUGLOG_ENABLED_PROPERTY, false /* default */);
-
-        assertThat(mode).isFalse();
-    }
-
-    @Test
-    public void onPreferenceChanged_settingEnabled_shouldTurnOnNfcStackDebugLog() {
-        mController.onPreferenceChange(mPreference, true /* new value */);
-
-        final boolean mode = SystemProperties.getBoolean(
-                NFC_STACK_DEBUGLOG_ENABLED_PROPERTY, false /* default */);
-
-        assertThat(mode).isTrue();
-    }
-
-    @Test
-    public void updateState_settingEnabled_preferenceShouldBeChecked() {
-        SystemProperties.set(NFC_STACK_DEBUGLOG_ENABLED_PROPERTY,
-                Boolean.toString(true));
-
-        mController.updateState(mPreference);
-        assertThat(mPreference.isChecked()).isTrue();
-    }
-
-    @Test
-    public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
-        SystemProperties.set(NFC_STACK_DEBUGLOG_ENABLED_PROPERTY,
-                Boolean.toString(false));
-
-        mController.updateState(mPreference);
-        assertThat(mPreference.isChecked()).isFalse();
-    }
-
-    @Test
-    public void onDeveloperOptionsDisabled_shouldDisablePreference() {
-        mController.onDeveloperOptionsSwitchDisabled();
-        final boolean mode = SystemProperties.getBoolean(
-                NFC_STACK_DEBUGLOG_ENABLED_PROPERTY,
-                false /* default */);
-
-        mController.updateState(mPreference);
-
-        assertThat(mode).isFalse();
-        assertThat(mPreference.isChecked()).isFalse();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
index be3815d..1231c01 100644
--- a/tests/unit/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
@@ -78,6 +78,7 @@
         mContext = spy(ApplicationProvider.getApplicationContext());
         when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
         when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+        when(mSubscriptionManager.createForAllUserProfiles()).thenReturn(mSubscriptionManager);
         when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
         if (Looper.myLooper() == null) {
             Looper.prepare();
diff --git a/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.kt b/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.kt
index 9546d69..18a6f0b 100644
--- a/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.kt
+++ b/tests/unit/src/com/android/settings/sim/SimDialogActivityTest.kt
@@ -45,10 +45,11 @@
     @Mock
     private lateinit var userManager: UserManager
 
-    private var activity = MockSimDialogActivity()
+    private lateinit var activity: SimDialogActivity
 
     @Before
     fun setUp() {
+        activity = MockSimDialogActivity()
         whenever(context.userManager).thenReturn(userManager)
         whenever(userManager.isGuestUser).thenReturn(false)
         whenever(userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS))
diff --git a/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java b/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
index 3d2d9a8..d84d5ad 100644
--- a/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
+++ b/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
@@ -34,6 +34,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -42,6 +43,7 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
+@Ignore
 @RunWith(AndroidJUnit4.class)
 public class RequestToggleWiFiActivityTest {
 
diff --git a/tests/unit/src/com/android/settings/wifi/WifiDialog2Test.kt b/tests/unit/src/com/android/settings/wifi/WifiDialog2Test.kt
index ef50433..0b14790 100644
--- a/tests/unit/src/com/android/settings/wifi/WifiDialog2Test.kt
+++ b/tests/unit/src/com/android/settings/wifi/WifiDialog2Test.kt
@@ -23,6 +23,7 @@
 import com.android.settings.wifi.WifiDialog2.WifiDialog2Listener
 import com.android.wifitrackerlib.WifiEntry
 import com.google.common.truth.Truth.assertThat
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -30,6 +31,7 @@
 import org.mockito.junit.MockitoJUnit
 import org.mockito.junit.MockitoRule
 
+@Ignore
 @RunWith(AndroidJUnit4::class)
 class WifiDialog2Test {
     @get:Rule
diff --git a/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java b/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
index 2826310..d5d4c7f 100644
--- a/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
+++ b/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
@@ -35,6 +35,7 @@
 import com.android.wifitrackerlib.WifiEntry;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -143,6 +144,7 @@
                 null /* scanResult */);
     }
 
+    @Ignore
     @Test
     public void checkShowWifiHotspot_allReady_returnTrue() {
         assertThat(WifiUtils.checkShowWifiHotspot(mContext)).isTrue();