Update web content filters screen title and summary using messenger service.

Code changes from KM side: cl/751548333.

Test: atest SupervisionWebContentFiltersScreenTest
Bug: 412359783
Flag: android.app.supervision.flags.enable_web_content_filters_screen
Change-Id: I47bdba802fe70eafcbca8d4f4267c219345c6538
diff --git a/src/com/android/settings/supervision/SupervisionWebContentFiltersScreen.kt b/src/com/android/settings/supervision/SupervisionWebContentFiltersScreen.kt
index f61baeb..b063694 100644
--- a/src/com/android/settings/supervision/SupervisionWebContentFiltersScreen.kt
+++ b/src/com/android/settings/supervision/SupervisionWebContentFiltersScreen.kt
@@ -17,15 +17,26 @@
 
 import android.app.supervision.flags.Flags
 import android.content.Context
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
 import com.android.settings.R
+import com.android.settings.supervision.ipc.SupervisionMessengerClient
 import com.android.settingslib.metadata.PreferenceCategory
+import com.android.settingslib.metadata.PreferenceLifecycleContext
+import com.android.settingslib.metadata.PreferenceLifecycleProvider
 import com.android.settingslib.metadata.ProvidePreferenceScreen
 import com.android.settingslib.metadata.preferenceHierarchy
 import com.android.settingslib.preference.PreferenceScreenCreator
+import com.android.settingslib.preference.forEachRecursively
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
 
 /** Web content filters landing page (Settings > Supervision > Web content filters). */
 @ProvidePreferenceScreen(SupervisionWebContentFiltersScreen.KEY)
-class SupervisionWebContentFiltersScreen : PreferenceScreenCreator {
+class SupervisionWebContentFiltersScreen : PreferenceScreenCreator, PreferenceLifecycleProvider {
+    private var supervisionClient: SupervisionMessengerClient? = null
+
     override fun isFlagEnabled(context: Context) = Flags.enableWebContentFiltersScreen()
 
     override val key: String
@@ -39,6 +50,15 @@
 
     override fun fragmentClass() = SupervisionWebContentFiltersFragment::class.java
 
+    override fun onCreate(context: PreferenceLifecycleContext) {
+        supervisionClient = getSupervisionClient(context)
+        updatePreferenceData(context)
+    }
+
+    override fun onDestroy(context: PreferenceLifecycleContext) {
+        supervisionClient?.close()
+    }
+
     override fun getPreferenceHierarchy(context: Context) =
         preferenceHierarchy(context, this) {
             +PreferenceCategory(
@@ -62,6 +82,34 @@
             +SupervisionWebContentFiltersFooterPreference()
         }
 
+    private fun updatePreferenceData(context: PreferenceLifecycleContext) {
+        val preferenceScreen = context.findPreference<Preference>(key)
+        if (preferenceScreen is PreferenceScreen) {
+            val preferenceKeys =
+                buildList<String> { preferenceScreen.forEachRecursively { add(it.key) } }
+            context.lifecycleScope.launch {
+                val preferenceDataMap =
+                    withContext(Dispatchers.IO) {
+                        supervisionClient?.getPreferenceData(preferenceKeys)
+                    }
+                preferenceScreen.forEachRecursively {
+                    val preferenceData = preferenceDataMap?.get(it.key)
+                    val newTitle = preferenceData?.title
+                    if (newTitle != null) {
+                        it.title = newTitle
+                    }
+                    val newSummary = preferenceData?.summary
+                    if (newSummary != null) {
+                        it.summary = newSummary
+                    }
+                }
+            }
+        }
+    }
+
+    private fun getSupervisionClient(context: Context) =
+        supervisionClient ?: SupervisionMessengerClient(context).also { supervisionClient = it }
+
     companion object {
         const val KEY = "supervision_web_content_filters"
         internal const val BROWSER_RADIO_BUTTON_GROUP = "browser_radio_button_group"
diff --git a/tests/robotests/src/com/android/settings/supervision/SupervisionWebContentFiltersScreenTest.kt b/tests/robotests/src/com/android/settings/supervision/SupervisionWebContentFiltersScreenTest.kt
index 71e96ad..c8c941c 100644
--- a/tests/robotests/src/com/android/settings/supervision/SupervisionWebContentFiltersScreenTest.kt
+++ b/tests/robotests/src/com/android/settings/supervision/SupervisionWebContentFiltersScreenTest.kt
@@ -27,6 +27,8 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.android.settings.R
+import com.android.settings.supervision.ipc.SupervisionMessengerClient
+import com.android.settingslib.ipc.MessengerServiceRule
 import com.android.settingslib.widget.FooterPreference
 import com.android.settingslib.widget.SelectorWithWidgetPreference
 import com.google.common.truth.Truth.assertThat
@@ -35,16 +37,24 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.Shadows.shadowOf
+import org.robolectric.annotation.LooperMode
 import org.robolectric.shadows.ShadowPackageManager
 
 @RunWith(AndroidJUnit4::class)
+@LooperMode(LooperMode.Mode.INSTRUMENTATION_TEST)
 class SupervisionWebContentFiltersScreenTest {
-    @get:Rule val setFlagsRule = SetFlagsRule()
     private val context: Context = ApplicationProvider.getApplicationContext()
     private lateinit var supervisionWebContentFiltersScreen: SupervisionWebContentFiltersScreen
-
     private lateinit var shadowPackageManager: ShadowPackageManager
 
+    @get:Rule val setFlagsRule = SetFlagsRule()
+
+    @get:Rule
+    val serviceRule =
+        MessengerServiceRule<SupervisionMessengerClient>(
+            TestSupervisionMessengerService::class.java
+        )
+
     @Before
     fun setUp() {
         shadowPackageManager = shadowOf(context.packageManager)