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)