Merge "Settings search for Carrier settings version" into main
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
index 825d72c..4f16e12 100644
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -176,12 +176,11 @@
             settings:searchable="false"
             settings:controller="com.android.settings.network.telephony.EnabledNetworkModePreferenceController"/>
 
+        <!-- Settings search is handled by CarrierSettingsVersionSearchItem. -->
         <Preference
             android:key="carrier_settings_version_key"
             android:title="@string/carrier_settings_version"
-            android:enabled="false"
-            android:shouldDisableView="false"
-            android:selectable="false"
+            settings:searchable="false"
             settings:controller="com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController"
             settings:enableCopying="true"/>
 
diff --git a/src/com/android/settings/network/telephony/CarrierConfigRepository.kt b/src/com/android/settings/network/telephony/CarrierConfigRepository.kt
index 3ec529d..3f5c06e 100644
--- a/src/com/android/settings/network/telephony/CarrierConfigRepository.kt
+++ b/src/com/android/settings/network/telephony/CarrierConfigRepository.kt
@@ -199,7 +199,7 @@
         }
 
         @VisibleForTesting
-        fun setStringForTest(subId: Int, key: String, value: String) {
+        fun setStringForTest(subId: Int, key: String, value: String?) {
             check(key.endsWith("_string")) { "String key should ends with _string" }
             getPerSubCache(subId)[key] = StringConfigValue(value)
         }
diff --git a/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.java b/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.java
deleted file mode 100644
index 575d19c..0000000
--- a/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2019 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.network.telephony;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
-
-import com.android.settings.core.BasePreferenceController;
-import com.android.settings.network.CarrierConfigCache;
-
-public class CarrierSettingsVersionPreferenceController extends BasePreferenceController {
-
-    private int mSubscriptionId;
-    private CarrierConfigCache mCarrierConfigCache;
-
-    public CarrierSettingsVersionPreferenceController(Context context, String preferenceKey) {
-        super(context, preferenceKey);
-        mCarrierConfigCache = CarrierConfigCache.getInstance(context);
-        mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-    }
-
-    public void init(int subscriptionId) {
-        mSubscriptionId = subscriptionId;
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        final PersistableBundle config = mCarrierConfigCache.getConfigForSubId(mSubscriptionId);
-        if (config == null) {
-            return null;
-        }
-        return config.getString(CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING);
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        return TextUtils.isEmpty(getSummary()) ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
-    }
-}
diff --git a/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.kt b/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.kt
new file mode 100644
index 0000000..f949ab8
--- /dev/null
+++ b/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceController.kt
@@ -0,0 +1,62 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.CarrierConfigManager
+import android.telephony.SubscriptionManager
+import com.android.settings.R
+import com.android.settings.core.BasePreferenceController
+import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem
+import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
+
+class CarrierSettingsVersionPreferenceController(context: Context, preferenceKey: String) :
+    BasePreferenceController(context, preferenceKey) {
+
+    private var subId: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+    private val searchItem = CarrierSettingsVersionSearchItem(context)
+
+    fun init(subId: Int) {
+        this.subId = subId
+    }
+
+    override fun getSummary() = searchItem.getSummary(subId)
+
+    override fun getAvailabilityStatus() =
+        if (searchItem.isAvailable(subId)) AVAILABLE else CONDITIONALLY_UNAVAILABLE
+
+    companion object {
+        class CarrierSettingsVersionSearchItem(private val context: Context) :
+            MobileNetworkSettingsSearchItem {
+            private val carrierConfigRepository = CarrierConfigRepository(context)
+
+            fun getSummary(subId: Int): String? =
+                carrierConfigRepository.getString(
+                    subId, CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING)
+
+            fun isAvailable(subId: Int): Boolean = !getSummary(subId).isNullOrEmpty()
+
+            override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? {
+                if (!isAvailable(subId)) return null
+                return MobileNetworkSettingsSearchResult(
+                    key = "carrier_settings_version_key",
+                    title = context.getString(R.string.carrier_settings_version),
+                )
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt
index 55cb1fa..c63e7d2 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt
@@ -21,6 +21,7 @@
 import android.telephony.SubscriptionInfo
 import com.android.settings.R
 import com.android.settings.network.SubscriptionUtil
+import com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController.Companion.CarrierSettingsVersionSearchItem
 import com.android.settings.network.telephony.DataUsagePreferenceController.Companion.DataUsageSearchItem
 import com.android.settings.network.telephony.MmsMessagePreferenceController.Companion.MmsMessageSearchItem
 import com.android.settings.network.telephony.NrAdvancedCallingPreferenceController.Companion.NrAdvancedCallingSearchItem
@@ -115,6 +116,7 @@
 
         fun createSearchItems(context: Context): List<MobileNetworkSettingsSearchItem> =
             listOf(
+                CarrierSettingsVersionSearchItem(context),
                 DataUsageSearchItem(context),
                 MmsMessageSearchItem(context),
                 NrAdvancedCallingSearchItem(context),
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.kt
new file mode 100644
index 0000000..ed6c027
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * 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.network.telephony
+
+import android.content.Context
+import android.telephony.CarrierConfigManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class CarrierSettingsVersionPreferenceControllerTest {
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+
+    private val controller =
+        CarrierSettingsVersionPreferenceController(context, TEST_KEY).apply { init(SUB_ID) }
+
+    @Before
+    fun setUp() {
+        CarrierConfigRepository.resetForTest()
+    }
+
+    @Test
+    fun getSummary_nullConfig_noCrash() {
+        controller.getSummary()
+    }
+
+    @Test
+    fun getSummary_nullVersionString_returnNull() {
+        CarrierConfigRepository.setStringForTest(
+            SUB_ID, CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING, null)
+
+        val summary = controller.getSummary()
+
+        assertThat(summary).isNull()
+    }
+
+    @Test
+    fun getSummary_hasVersionString_returnCorrectSummary() {
+        CarrierConfigRepository.setStringForTest(
+            SUB_ID, CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING, "test_version_123")
+
+        val summary = controller.getSummary()
+
+        assertThat(summary).isEqualTo("test_version_123")
+    }
+
+    private companion object {
+        const val TEST_KEY = "test_key"
+        const val SUB_ID = 10
+    }
+}
diff --git a/tests/unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java
deleted file mode 100644
index 40be07f..0000000
--- a/tests/unit/src/com/android/settings/network/telephony/CarrierSettingsVersionPreferenceControllerTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2020 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.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.network.CarrierConfigCache;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class CarrierSettingsVersionPreferenceControllerTest {
-    @Mock
-    private CarrierConfigCache mCarrierConfigCache;
-
-    private CarrierSettingsVersionPreferenceController mController;
-    private int mSubscriptionId = 1234;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        Context context = spy(ApplicationProvider.getApplicationContext());
-        CarrierConfigCache.setTestInstance(context, mCarrierConfigCache);
-        mController = new CarrierSettingsVersionPreferenceController(context, "mock_key");
-        mController.init(mSubscriptionId);
-    }
-
-    @Test
-    public void getSummary_nullConfig_noCrash() {
-        doReturn(null).when(mCarrierConfigCache).getConfigForSubId(mSubscriptionId);
-
-        assertThat(mController.getSummary()).isNull();
-    }
-
-    @Test
-    public void getSummary_nullVersionString_noCrash() {
-        doReturn(new PersistableBundle()).when(mCarrierConfigCache)
-                .getConfigForSubId(mSubscriptionId);
-        assertThat(mController.getSummary()).isNull();
-    }
-
-    @Test
-    public void getSummary_hasVersionString_correctSummary() {
-        final PersistableBundle bundle = new PersistableBundle();
-        bundle.putString(CarrierConfigManager.KEY_CARRIER_CONFIG_VERSION_STRING,
-                "test_version_123");
-        doReturn(bundle).when(mCarrierConfigCache).getConfigForSubId(mSubscriptionId);
-
-        assertThat(mController.getSummary()).isEqualTo("test_version_123");
-    }
-}