From 23a15efd8cb7a9409f165decd44509e7b0d16cb4 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Mon, 21 Nov 2022 10:17:35 -0500 Subject: [PATCH] Restrict panels to preferred apps Test: manual test app vs preferred Test: atest ControlsListingControllerImplTest Fixes: 257283507 Change-Id: I197944e3e25969f1a21534d4c5c30cbfcfce59bf --- .../systemui/controls/ControlsServiceInfo.kt | 7 +++- .../ControlsListingControllerImplTest.kt | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt b/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt index 4dfcd6398a4d6..66e5d7c4a3bcd 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ControlsServiceInfo.kt @@ -30,6 +30,7 @@ import android.os.UserHandle import android.service.controls.ControlsProviderService import androidx.annotation.WorkerThread import com.android.settingslib.applications.DefaultAppInfo +import com.android.systemui.R import java.util.Objects class ControlsServiceInfo( @@ -59,7 +60,8 @@ class ControlsServiceInfo( * instead of using the controls rendered by SystemUI. * * The activity must be in the same package, exported, enabled and protected by the - * [Manifest.permission.BIND_CONTROLS] permission. + * [Manifest.permission.BIND_CONTROLS] permission. Additionally, only packages declared in + * [R.array.config_controlsPreferredPackages] can declare activities for use as a panel. */ var panelActivity: ComponentName? = null private set @@ -70,6 +72,9 @@ class ControlsServiceInfo( fun resolvePanelActivity() { if (resolved) return resolved = true + val validPackages = context.resources + .getStringArray(R.array.config_controlsPreferredPackages) + if (componentName.packageName !in validPackages) return panelActivity = _panelActivity?.let { val resolveInfos = mPm.queryIntentActivitiesAsUser( Intent().setComponent(it), diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt index 98ff8d1d8845f..c677f19f93e50 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt @@ -31,6 +31,7 @@ import android.service.controls.ControlsProviderService import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.settingslib.applications.ServiceListing +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.dump.DumpManager @@ -110,6 +111,12 @@ class ControlsListingControllerImplTest : SysuiTestCase() { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED) mContext.setMockPackageManager(packageManager) + mContext.orCreateTestableResources + .addOverride( + R.array.config_controlsPreferredPackages, + arrayOf(componentName.packageName) + ) + // Return true by default, we'll test the false path `when`(featureFlags.isEnabled(USE_APP_PANELS)).thenReturn(true) @@ -481,6 +488,35 @@ class ControlsListingControllerImplTest : SysuiTestCase() { assertNull(controller.getCurrentServices()[0].panelActivity) } + @Test + fun testPackageNotPreferred_nullPanel() { + mContext.orCreateTestableResources + .addOverride(R.array.config_controlsPreferredPackages, arrayOf()) + + val serviceInfo = ServiceInfo( + componentName, + activityName + ) + + `when`(packageManager.getComponentEnabledSetting(eq(activityName))) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED) + + setUpQueryResult(listOf( + ActivityInfo( + activityName, + exported = true, + permission = Manifest.permission.BIND_CONTROLS + ) + )) + + val list = listOf(serviceInfo) + serviceListingCallbackCaptor.value.onServicesReloaded(list) + + executor.runAllReady() + + assertNull(controller.getCurrentServices()[0].panelActivity) + } + @Test fun testListingsNotModifiedByCallback() { // This test checks that if the list passed to the callback is modified, it has no effect