diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 363d601..f272c1d 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -17,7 +17,6 @@
 package com.android.settings;
 
 import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
-import static com.android.settingslib.media.PhoneMediaDevice.isDesktop;
 
 import android.app.Activity;
 import android.app.Dialog;
@@ -187,13 +186,6 @@
 
     /** Returns if catalyst is enabled on current screen. */
     public final boolean isCatalystEnabled() {
-        // TODO(b/379130874): make Catalyst compatible with desktop device, such as user restriction
-        // check.
-        Context context = getContext();
-        if (context != null && isDesktop(context)) {
-            return false;
-        }
-
         return getPreferenceScreenCreator() != null;
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
index 32d2a11..d520cd6 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java
@@ -144,7 +144,7 @@
 
     @Override
     protected void startEnrollmentInternal() {
-        super.startEnrollment();
+        super.startEnrollmentInternal();
         mPreviewFragment = (FaceEnrollPreviewFragment) getSupportFragmentManager()
                 .findFragmentByTag(TAG_FACE_PREVIEW);
         if (mPreviewFragment == null) {
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
index bf0084d..52a3281 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
@@ -54,7 +54,7 @@
       .stateIn(
         scope,
         SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
-        false,
+        accessibilityManager.isEnabled,
       )
 
   override val isEnabled: Boolean
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java b/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java
index 36a14aa..33eba10 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBase.java
@@ -48,6 +48,8 @@
 import com.android.settingslib.bluetooth.HearingAidStatsLogUtils;
 import com.android.settingslib.utils.ThreadUtils;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -58,8 +60,11 @@
  * device pairing detail page.
  */
 public abstract class BluetoothDevicePairingDetailBase extends DeviceListPreferenceFragment {
-    private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(10);
+    private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(15);
     private static final int AUTO_DISMISS_MESSAGE_ID = 1001;
+    private static final ImmutableList<Integer> AUDIO_SHARING_PROFILES = ImmutableList.of(
+            BluetoothProfile.LE_AUDIO,
+            BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT, BluetoothProfile.VOLUME_CONTROL);
 
     protected boolean mInitialScanStarted;
     @VisibleForTesting
@@ -229,12 +234,13 @@
             if (device != null
                     && mSelectedList.contains(device)) {
                 if (BluetoothUtils.isAudioSharingUIAvailable(getContext())) {
-                    if (bluetoothProfile == BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT
+                    if (mShouldTriggerAudioSharingShareThenPairFlow
                             && state == BluetoothAdapter.STATE_CONNECTED
                             && device.equals(mJustBonded)
-                            && mShouldTriggerAudioSharingShareThenPairFlow) {
+                            && AUDIO_SHARING_PROFILES.contains(bluetoothProfile)
+                            && isReadyForAudioSharing(cachedDevice, bluetoothProfile)) {
                         Log.d(getLogTag(),
-                                "onProfileConnectionStateChanged, assistant profile connected");
+                                "onProfileConnectionStateChanged, ready for audio sharing");
                         dismissConnectingDialog();
                         mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID);
                         finishFragmentWithResultForAudioSharing(device);
@@ -322,6 +328,35 @@
         return false;
     }
 
+    private boolean isReadyForAudioSharing(@NonNull CachedBluetoothDevice cachedDevice,
+            int justConnectedProfile) {
+        for (int profile : AUDIO_SHARING_PROFILES) {
+            // Skip checking connection state for just connected profile
+            if (profile == justConnectedProfile) continue;
+            switch (profile) {
+                case BluetoothProfile.LE_AUDIO -> {
+                    if (!cachedDevice.isConnectedLeAudioDevice()) {
+                        Log.d(getLogTag(), "isReadyForAudioSharing, LE_AUDIO not ready");
+                        return false;
+                    }
+                }
+                case BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT -> {
+                    if (!cachedDevice.isConnectedLeAudioBroadcastAssistantDevice()) {
+                        Log.d(getLogTag(), "isReadyForAudioSharing, ASSISTANT not ready");
+                        return false;
+                    }
+                }
+                case BluetoothProfile.VOLUME_CONTROL -> {
+                    if (!cachedDevice.isConnectedVolumeControlDevice()) {
+                        Log.d(getLogTag(), "isReadyForAudioSharing, VC not ready");
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
     private void addOnMetadataChangedListener(@Nullable BluetoothDevice device) {
         var unused = ThreadUtils.postOnBackgroundThread(() -> {
             if (mBluetoothAdapter != null && device != null
diff --git a/src/com/android/settings/network/tether/TetherSettings.java b/src/com/android/settings/network/tether/TetherSettings.java
index 57715be..53de9f6 100644
--- a/src/com/android/settings/network/tether/TetherSettings.java
+++ b/src/com/android/settings/network/tether/TetherSettings.java
@@ -72,7 +72,6 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
-// LINT.IfChange
 /**
  * Displays preferences for Tethering.
  */
@@ -209,19 +208,16 @@
             mWifiTetherPreferenceController.displayPreference(getPreferenceScreen());
         }
 
-        if (!isCatalystEnabled()) {
-            if (!bluetoothAvailable) {
-                mBluetoothTether.setVisible(false);
+        if (!bluetoothAvailable) {
+            getPreferenceScreen().removePreference(mBluetoothTether);
+        } else {
+            BluetoothPan pan = mBluetoothPan.get();
+            if (pan != null && pan.isTetheringOn()) {
+                mBluetoothTether.setChecked(true);
             } else {
-                BluetoothPan pan = mBluetoothPan.get();
-                if (pan != null && pan.isTetheringOn()) {
-                    mBluetoothTether.setChecked(true);
-                } else {
-                    mBluetoothTether.setChecked(false);
-                }
+                mBluetoothTether.setChecked(false);
             }
         }
-
         if (!ethernetAvailable) getPreferenceScreen().removePreference(mEthernetTether);
         // Set initial state based on Data Saver mode.
         onDataSaverChanged(mDataSaverBackend.isDataSaverEnabled());
@@ -274,9 +270,7 @@
             mWifiTetherPreferenceController.setDataSaverEnabled(mDataSaverEnabled);
         }
         mUsbTether.setEnabled(!mDataSaverEnabled);
-        if (!isCatalystEnabled()) {
-            mBluetoothTether.setEnabled(!mDataSaverEnabled);
-        }
+        mBluetoothTether.setEnabled(!mDataSaverEnabled);
         mEthernetTether.setEnabled(!mDataSaverEnabled);
         mDataSaverFooter.setVisible(mDataSaverEnabled);
     }
@@ -526,8 +520,6 @@
     }
 
     private void updateBluetoothState() {
-        if (isCatalystEnabled()) return;
-
         final int btState = getBluetoothState();
         if (DEBUG) {
             Log.d(TAG, "updateBluetoothState() btState : " + btState);
@@ -583,7 +575,7 @@
     }
 
     private void startTethering(int choice) {
-        if (choice == TETHERING_BLUETOOTH && !isCatalystEnabled()) {
+        if (choice == TETHERING_BLUETOOTH) {
             // Turn on Bluetooth first.
             BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
             if (adapter.getState() == BluetoothAdapter.STATE_OFF) {
@@ -605,7 +597,7 @@
             } else {
                 mCm.stopTethering(TETHERING_USB);
             }
-        } else if (preference == mBluetoothTether && !isCatalystEnabled()) {
+        } else if (preference == mBluetoothTether) {
             if (mBluetoothTether.isChecked()) {
                 startTethering(TETHERING_BLUETOOTH);
             } else {
@@ -753,4 +745,3 @@
         return TetherScreen.KEY;
     }
 }
-// LINT.ThenChange(BluetoothTetherSwitchPreference.kt)
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index eb7d667..80f73b9 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -691,7 +691,8 @@
                 return;
             }
 
-            final TextView sucTitleView = view.findViewById(R.id.suc_layout_title);
+            final TextView sucTitleView = view.findViewById(
+                    com.google.android.setupdesign.R.id.suc_layout_title);
             final ViewGroup.MarginLayoutParams titleLayoutParams =
                     (ViewGroup.MarginLayoutParams) sucTitleView.getLayoutParams();
             mPasswordRestrictionView = new RecyclerView(getActivity());
diff --git a/src/com/android/settings/password/PasswordUtils.java b/src/com/android/settings/password/PasswordUtils.java
index 8c8afc2..da2ad63 100644
--- a/src/com/android/settings/password/PasswordUtils.java
+++ b/src/com/android/settings/password/PasswordUtils.java
@@ -109,7 +109,8 @@
     public static void setupScreenLockOptionsButton(Context context, View view, Button optButton) {
         final LinearLayout headerLayout = view.findViewById(
                 com.google.android.setupdesign.R.id.sud_layout_header);
-        final TextView sucTitleView = headerLayout.findViewById(R.id.suc_layout_title);
+        final TextView sucTitleView = headerLayout.findViewById(
+                com.google.android.setupdesign.R.id.suc_layout_title);
         if (headerLayout != null && sucTitleView != null) {
             final ViewGroup.MarginLayoutParams layoutTitleParams =
                     (ViewGroup.MarginLayoutParams) sucTitleView.getLayoutParams();
diff --git a/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt b/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt
index 16104de..a1329c2 100644
--- a/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt
+++ b/src/com/android/settings/restriction/UserRestrictionBindingHelper.kt
@@ -25,9 +25,9 @@
 
 /** Helper to rebind preference immediately when user restriction is changed. */
 class UserRestrictionBindingHelper(
-    context: Context,
+    private val context: Context,
     private val screenBindingHelper: PreferenceScreenBindingHelper,
-) : AutoCloseable {
+) : KeyedObserver<String>, AutoCloseable {
     private val restrictionKeysToPreferenceKeys: Map<String, MutableSet<String>> =
         mutableMapOf<String, MutableSet<String>>()
             .apply {
@@ -42,27 +42,29 @@
             }
             .toMap()
 
-    private val userRestrictionObserver: KeyedObserver<String?>?
-
     init {
-        if (restrictionKeysToPreferenceKeys.isEmpty()) {
-            userRestrictionObserver = null
-        } else {
-            val observer =
-                KeyedObserver<String?> { restrictionKey, _ ->
-                    restrictionKey?.let { notifyRestrictionChanged(it) }
-                }
-            UserRestrictions.addObserver(context, observer, HandlerExecutor.main)
-            userRestrictionObserver = observer
+        val restrictionKeys = restrictionKeysToPreferenceKeys.keys
+        if (restrictionKeys.isNotEmpty()) {
+            val userRestrictions = UserRestrictions.get(context)
+            val executor = HandlerExecutor.main
+            for (restrictionKey in restrictionKeys) {
+                userRestrictions.addObserver(restrictionKey, this, executor)
+            }
         }
     }
 
-    private fun notifyRestrictionChanged(restrictionKey: String) {
+    override fun onKeyChanged(restrictionKey: String, reason: Int) {
         val keys = restrictionKeysToPreferenceKeys[restrictionKey] ?: return
         for (key in keys) screenBindingHelper.notifyChange(key, CHANGE_REASON_STATE)
     }
 
     override fun close() {
-        userRestrictionObserver?.let { UserRestrictions.removeObserver(it) }
+        val restrictionKeys = restrictionKeysToPreferenceKeys.keys
+        if (restrictionKeys.isNotEmpty()) {
+            val userRestrictions = UserRestrictions.get(context)
+            for (restrictionKey in restrictionKeys) {
+                userRestrictions.removeObserver(restrictionKey, this)
+            }
+        }
     }
 }
diff --git a/src/com/android/settings/restriction/UserRestrictions.kt b/src/com/android/settings/restriction/UserRestrictions.kt
index 1fa6830..880aa5d 100644
--- a/src/com/android/settings/restriction/UserRestrictions.kt
+++ b/src/com/android/settings/restriction/UserRestrictions.kt
@@ -16,68 +16,58 @@
 
 package com.android.settings.restriction
 
+import android.content.BroadcastReceiver
 import android.content.Context
-import android.os.Bundle
-import android.os.IUserRestrictionsListener
+import android.content.Intent
+import android.content.IntentFilter
 import android.os.UserManager
-import com.android.settingslib.datastore.KeyedDataObservable
+import com.android.settingslib.datastore.AbstractKeyedDataObservable
+import com.android.settingslib.datastore.DataChangeReason
 import com.android.settingslib.datastore.KeyedObserver
 import java.util.concurrent.Executor
-import java.util.concurrent.atomic.AtomicBoolean
 
 /** Helper class to monitor user restriction changes. */
-object UserRestrictions {
-    private val observable = KeyedDataObservable<String>()
+class UserRestrictions private constructor(private val applicationContext: Context) {
 
-    private val userRestrictionsListener =
-        object : IUserRestrictionsListener.Stub() {
-            override fun onUserRestrictionsChanged(
-                userId: Int,
-                newRestrictions: Bundle,
-                prevRestrictions: Bundle,
-            ) {
-                // there is no API to remove listener, do a quick check to avoid unnecessary work
-                if (!observable.hasAnyObserver()) return
+    private val observable =
+        object : AbstractKeyedDataObservable<String>() {
+            override fun onFirstObserverAdded() {
+                val intentFilter = IntentFilter()
+                intentFilter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED)
+                applicationContext.registerReceiver(broadcastReceiver, intentFilter)
+            }
 
-                val changedKeys = mutableSetOf<String>()
-                val keys = newRestrictions.keySet() + prevRestrictions.keySet()
-                for (key in keys) {
-                    if (newRestrictions.getBoolean(key) != prevRestrictions.getBoolean(key)) {
-                        changedKeys.add(key)
-                    }
-                }
-
-                for (key in changedKeys) observable.notifyChange(key, 0)
+            override fun onLastObserverRemoved() {
+                applicationContext.unregisterReceiver(broadcastReceiver)
             }
         }
 
-    private val listenerAdded = AtomicBoolean()
+    private val broadcastReceiver: BroadcastReceiver =
+        object : BroadcastReceiver() {
+            override fun onReceive(context: Context, intent: Intent) {
+                // there is no way to get the changed keys, just notify all observers
+                observable.notifyChange(DataChangeReason.UPDATE)
+            }
+        }
 
-    fun addObserver(context: Context, observer: KeyedObserver<String?>, executor: Executor) {
-        context.addUserRestrictionsListener()
+    fun addObserver(observer: KeyedObserver<String?>, executor: Executor) =
         observable.addObserver(observer, executor)
-    }
 
-    fun addObserver(
-        context: Context,
-        key: String,
-        observer: KeyedObserver<String>,
-        executor: Executor,
-    ) {
-        context.addUserRestrictionsListener()
+    fun addObserver(key: String, observer: KeyedObserver<String>, executor: Executor) =
         observable.addObserver(key, observer, executor)
-    }
-
-    private fun Context.addUserRestrictionsListener() {
-        if (listenerAdded.getAndSet(true)) return
-        // surprisingly, there is no way to remove the listener
-        applicationContext
-            .getSystemService(UserManager::class.java)
-            .addUserRestrictionsListener(userRestrictionsListener)
-    }
 
     fun removeObserver(observer: KeyedObserver<String?>) = observable.removeObserver(observer)
 
     fun removeObserver(key: String, observer: KeyedObserver<String>) =
         observable.removeObserver(key, observer)
+
+    companion object {
+        @Volatile private var instance: UserRestrictions? = null
+
+        fun get(context: Context) =
+            instance
+                ?: synchronized(this) {
+                    instance ?: UserRestrictions(context.applicationContext).also { instance = it }
+                }
+    }
 }
diff --git a/src/com/android/settings/wifi/WepNetworksPreferenceController.kt b/src/com/android/settings/wifi/WepNetworksPreferenceController.kt
index bad7201..92716be 100644
--- a/src/com/android/settings/wifi/WepNetworksPreferenceController.kt
+++ b/src/com/android/settings/wifi/WepNetworksPreferenceController.kt
@@ -18,6 +18,9 @@
 
 import android.content.Context
 import android.net.wifi.WifiManager
+import android.security.advancedprotection.AdvancedProtectionManager
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
@@ -27,6 +30,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.text.style.TextAlign
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settings.R
@@ -50,6 +54,9 @@
     ComposePreferenceController(context, preferenceKey) {
 
     var wifiManager = context.getSystemService(WifiManager::class.java)!!
+    var aapmManager = if (android.security.Flags.aapmApi() && Flags.wepDisabledInApm())
+        context.getSystemService(AdvancedProtectionManager::class.java)!!
+    else null
 
     override fun getAvailabilityStatus() =
         if (Flags.androidVWifiApi()) AVAILABLE else UNSUPPORTED_ON_DEVICE
@@ -60,27 +67,49 @@
             isWepSupportedFlow.collectAsStateWithLifecycle(initialValue = null).value
         val isWepAllowed: Boolean? =
             wepAllowedFlow.flow.collectAsStateWithLifecycle(initialValue = null).value
-        var openDialog by rememberSaveable { mutableStateOf(false) }
-        SwitchPreference(
-            object : SwitchPreferenceModel {
-                override val title = stringResource(R.string.wifi_allow_wep_networks)
-                override val summary = { getSummary(isWepSupported) }
-                override val checked = {
-                    if (isWepSupported == true) isWepAllowed else isWepSupported
-                }
-                override val changeable: () -> Boolean
-                    get() = { isWepSupported == true }
+        val isAapmEnabled: Boolean? = if (android.security.Flags.aapmApi()
+            && Flags.wepDisabledInApm())
+                isAapmEnabledFlow.collectAsStateWithLifecycle(initialValue = null).value
+        else false
 
-                override val onCheckedChange: (Boolean) -> Unit = { newChecked ->
-                    val wifiInfo = wifiManager.connectionInfo
-                    if (!newChecked && wifiInfo.currentSecurityType == WifiEntry.SECURITY_WEP) {
-                        openDialog = true
-                    } else {
-                        wifiManager.setWepAllowed(newChecked)
-                        wepAllowedFlow.override(newChecked)
+        var openDialog by rememberSaveable { mutableStateOf(false) }
+
+        RestrictionWrapper(
+            restricted = isAapmEnabled == true
+        ) {
+            SwitchPreference(
+                object : SwitchPreferenceModel {
+                    override val title = stringResource(R.string.wifi_allow_wep_networks)
+                    override val summary = { getSummary(isWepSupported) }
+                    override val checked = {
+                        when {
+                            isWepSupported == false -> false
+                            isAapmEnabled == true -> false
+                            else -> isWepAllowed
+                        }
                     }
+                    override val changeable: () -> Boolean
+                        get() = { isWepSupported == true && isAapmEnabled == false }
+
+                    override val onCheckedChange: ((Boolean) -> Unit)? =
+                        if (isAapmEnabled == true) {
+                            null
+                        } else {
+                            { newChecked ->
+                                val wifiInfo = wifiManager.connectionInfo
+                                if (!newChecked &&
+                                    wifiInfo.currentSecurityType == WifiEntry.SECURITY_WEP
+                                ) {
+                                    openDialog = true
+                                } else {
+                                    wifiManager.setWepAllowed(newChecked)
+                                    wepAllowedFlow.override(newChecked)
+                                }
+                            }
+                        }
                 }
-            })
+            )
+        }
         if (openDialog) {
             SettingsAlertDialogWithIcon(
                 onDismissRequest = { openDialog = false },
@@ -103,6 +132,21 @@
         }
     }
 
+    @Composable
+    private fun RestrictionWrapper(restricted: Boolean, content: @Composable () -> Unit) {
+        if (restricted) {
+            Box(
+                Modifier.clickable(
+                    enabled = true,
+                    role = Role.Switch,
+                    onClick = ::startSupportIntent
+                )
+            ) { content() }
+        } else {
+            content()
+        }
+    }
+
     private fun getSummary(isWepSupported: Boolean?): String =
         mContext.getString(
             when (isWepSupported) {
@@ -114,6 +158,16 @@
     private val isWepSupportedFlow =
         flow { emit(wifiManager.isWepSupported) }.flowOn(Dispatchers.Default)
 
+    private val isAapmEnabledFlow = flow {
+        emit(aapmManager?.isAdvancedProtectionEnabled ?: false) }.flowOn(Dispatchers.Default)
+
+    private fun startSupportIntent() {
+        aapmManager?.createSupportIntent(
+            AdvancedProtectionManager.FEATURE_ID_DISALLOW_WEP,
+            AdvancedProtectionManager.SUPPORT_DIALOG_TYPE_DISABLED_SETTING
+        )?.let { mContext.startActivity(it) }
+    }
+
     val wepAllowedFlow =
         OverridableFlow(
             callbackFlow {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBaseTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBaseTest.java
index 949b3d8..bd6ac4b 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBaseTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePairingDetailBaseTest.java
@@ -308,6 +308,9 @@
         shadowOf(Looper.getMainLooper()).idle();
 
         when(mCachedBluetoothDevice.isConnected()).thenReturn(true);
+        when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true);
+        when(mCachedBluetoothDevice.isConnectedLeAudioBroadcastAssistantDevice()).thenReturn(true);
+        when(mCachedBluetoothDevice.isConnectedVolumeControlDevice()).thenReturn(true);
 
         mFragment.onProfileConnectionStateChanged(mCachedBluetoothDevice,
                 BluetoothAdapter.STATE_CONNECTED, BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT);
diff --git a/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt
index 9183096..1f0a491 100644
--- a/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/wifi/WepNetworksPreferenceControllerTest.kt
@@ -17,8 +17,10 @@
 package com.android.settings.wifi
 
 import android.content.Context
+import android.content.Intent
 import android.net.wifi.WifiInfo
 import android.net.wifi.WifiManager
+import android.security.advancedprotection.AdvancedProtectionManager
 import androidx.compose.ui.test.assertIsOff
 import androidx.compose.ui.test.assertIsOn
 import androidx.compose.ui.test.isDisplayed
@@ -43,9 +45,12 @@
 import org.mockito.kotlin.any
 import org.mockito.kotlin.doAnswer
 import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.doNothing
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.spy
 import org.mockito.kotlin.stub
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @RunWith(AndroidJUnit4::class)
 class WepNetworksPreferenceControllerTest {
@@ -71,9 +76,15 @@
             on { connectionInfo } doReturn mockWifiInfo
         }
 
+    private var mockAapmManager =
+        mock<AdvancedProtectionManager> {
+            on { isAdvancedProtectionEnabled } doReturn false
+        }
+
     private var context: Context =
         spy(ApplicationProvider.getApplicationContext()) {
             on { getSystemService(WifiManager::class.java) } doReturn mockWifiManager
+            on { getSystemService(AdvancedProtectionManager::class.java) } doReturn mockAapmManager
         }
 
     private var controller = WepNetworksPreferenceController(context, TEST_KEY)
@@ -185,6 +196,23 @@
             .isNotDisplayed()
     }
 
+    @Test
+    fun whenClick_aapmEnabled_openDialog() {
+        mockAapmManager.stub {
+            on { isAdvancedProtectionEnabled } doReturn true
+            on { createSupportIntent(any(), any()) } doReturn Intent()
+        }
+        doNothing().whenever(context).startActivity(any())
+        composeTestRule.setContent { controller.Content() }
+
+        composeTestRule.onRoot().performClick()
+
+        composeTestRule
+            .onDialogText(context.getString(R.string.wifi_disconnect_button_text))
+            .isNotDisplayed()
+        verify(context).startActivity(any())
+    }
+
     private companion object {
         const val TEST_KEY = "test_key"
         const val SSID = "ssid"
diff --git a/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
index 3fa3808..29e0c1c 100644
--- a/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
@@ -116,6 +116,7 @@
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
                 anyInt());
         doReturn(2).when(mTelephonyManager).getCardIdForDefaultEuicc();
+        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mTelephonyManager).getVoiceNetworkType();
         doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mTelephonyManager).getDataNetworkType();
 
         mUpdatePhoneNumberCount = new AtomicInteger();
