Snap for 11521484 from bec4c9573ef92c583e235f57e9f220e68572e39d to 24Q2-release

Change-Id: I086a5d8514a9b53b90a94e4e4eb47dac4e074bcf
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/network/telephony/SubscriptionRepository.kt b/src/com/android/settings/network/telephony/SubscriptionRepository.kt
index ee4ac1e..9a46272 100644
--- a/src/com/android/settings/network/telephony/SubscriptionRepository.kt
+++ b/src/com/android/settings/network/telephony/SubscriptionRepository.kt
@@ -25,10 +25,17 @@
 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.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..cc8a5d1
--- /dev/null
+++ b/src/com/android/settings/spa/network/SimsSection.kt
@@ -0,0 +1,98 @@
+/*
+ * 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.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)
+    //TODO: Add the Restricted TwoTargetSwitchPreference in SPA
+    TwoTargetSwitchPreference(
+        object : SwitchPreferenceModel {
+            override val title = subInfo.displayName.toString()
+            override val summary = { subInfo.number }
+            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/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();
-    }
-}