Loading packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt +14 −2 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.settings.UserTracker import com.android.systemui.util.ActivityTaskManagerProxy import com.android.systemui.util.asIndenting import com.android.systemui.util.indentIfPossible import java.io.PrintWriter Loading Loading @@ -67,6 +68,7 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( @Background private val backgroundExecutor: Executor, private val serviceListingBuilder: (Context) -> ServiceListing, private val userTracker: UserTracker, private val activityTaskManagerProxy: ActivityTaskManagerProxy, dumpManager: DumpManager, private val featureFlags: FeatureFlags ) : ControlsListingController, Dumpable { Loading @@ -76,9 +78,18 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( context: Context, @Background executor: Executor, userTracker: UserTracker, activityTaskManagerProxy: ActivityTaskManagerProxy, dumpManager: DumpManager, featureFlags: FeatureFlags ) : this(context, executor, ::createServiceListing, userTracker, dumpManager, featureFlags) ) : this( context, executor, ::createServiceListing, userTracker, activityTaskManagerProxy, dumpManager, featureFlags ) private var serviceListing = serviceListingBuilder(context) // All operations in background thread Loading Loading @@ -113,7 +124,8 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( } private fun updateServices(newServices: List<ControlsServiceInfo>) { if (featureFlags.isEnabled(Flags.USE_APP_PANELS)) { if (featureFlags.isEnabled(Flags.USE_APP_PANELS) && activityTaskManagerProxy.supportsMultiWindow(context)) { val allowAllApps = featureFlags.isEnabled(Flags.APP_PANELS_ALL_APPS_ALLOWED) newServices.forEach { it.resolvePanelActivity(allowAllApps) } Loading packages/SystemUI/src/com/android/systemui/util/ActivityTaskManagerProxy.kt 0 → 100644 +30 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.systemui.util import android.app.ActivityTaskManager import android.content.Context import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject /** Proxy for static calls to [ActivityTaskManager]. */ @SysUISingleton class ActivityTaskManagerProxy @Inject constructor() { /** Calls [ActivityTaskManager.supportsMultiWindow] */ fun supportsMultiWindow(context: Context) = ActivityTaskManager.supportsMultiWindow(context) } packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt +33 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags.APP_PANELS_ALL_APPS_ALLOWED import com.android.systemui.flags.Flags.USE_APP_PANELS import com.android.systemui.settings.UserTracker import com.android.systemui.util.ActivityTaskManagerProxy import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argThat Loading Loading @@ -88,6 +89,8 @@ class ControlsListingControllerImplTest : SysuiTestCase() { private lateinit var packageManager: PackageManager @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var activityTaskManagerProxy: ActivityTaskManagerProxy private var componentName = ComponentName("pkg", "class1") private var activityName = ComponentName("pkg", "activity") Loading @@ -112,6 +115,7 @@ class ControlsListingControllerImplTest : SysuiTestCase() { // Return disabled by default `when`(packageManager.getComponentEnabledSetting(any())) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED) `when`(activityTaskManagerProxy.supportsMultiWindow(any())).thenReturn(true) mContext.setMockPackageManager(packageManager) mContext.orCreateTestableResources Loading @@ -136,6 +140,7 @@ class ControlsListingControllerImplTest : SysuiTestCase() { executor, { mockSL }, userTracker, activityTaskManagerProxy, dumpManager, featureFlags ) Loading Loading @@ -171,6 +176,7 @@ class ControlsListingControllerImplTest : SysuiTestCase() { exec, { mockServiceListing }, userTracker, activityTaskManagerProxy, dumpManager, featureFlags ) Loading Loading @@ -637,7 +643,34 @@ class ControlsListingControllerImplTest : SysuiTestCase() { assertThat(services[0].serviceInfo.componentName).isEqualTo(componentName) } @Test fun testNoPanelIfMultiWindowNotSupported() { `when`(activityTaskManagerProxy.supportsMultiWindow(any())).thenReturn(false) val serviceInfo = ServiceInfo( componentName, activityName ) `when`(packageManager.getComponentEnabledSetting(eq(activityName))) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) setUpQueryResult(listOf( ActivityInfo( activityName, enabled = true, exported = true, permission = Manifest.permission.BIND_CONTROLS ) )) val list = listOf(serviceInfo) serviceListingCallbackCaptor.value.onServicesReloaded(list) executor.runAllReady() assertNull(controller.getCurrentServices()[0].panelActivity) } private fun ServiceInfo( componentName: ComponentName, Loading Loading
packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt +14 −2 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.settings.UserTracker import com.android.systemui.util.ActivityTaskManagerProxy import com.android.systemui.util.asIndenting import com.android.systemui.util.indentIfPossible import java.io.PrintWriter Loading Loading @@ -67,6 +68,7 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( @Background private val backgroundExecutor: Executor, private val serviceListingBuilder: (Context) -> ServiceListing, private val userTracker: UserTracker, private val activityTaskManagerProxy: ActivityTaskManagerProxy, dumpManager: DumpManager, private val featureFlags: FeatureFlags ) : ControlsListingController, Dumpable { Loading @@ -76,9 +78,18 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( context: Context, @Background executor: Executor, userTracker: UserTracker, activityTaskManagerProxy: ActivityTaskManagerProxy, dumpManager: DumpManager, featureFlags: FeatureFlags ) : this(context, executor, ::createServiceListing, userTracker, dumpManager, featureFlags) ) : this( context, executor, ::createServiceListing, userTracker, activityTaskManagerProxy, dumpManager, featureFlags ) private var serviceListing = serviceListingBuilder(context) // All operations in background thread Loading Loading @@ -113,7 +124,8 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( } private fun updateServices(newServices: List<ControlsServiceInfo>) { if (featureFlags.isEnabled(Flags.USE_APP_PANELS)) { if (featureFlags.isEnabled(Flags.USE_APP_PANELS) && activityTaskManagerProxy.supportsMultiWindow(context)) { val allowAllApps = featureFlags.isEnabled(Flags.APP_PANELS_ALL_APPS_ALLOWED) newServices.forEach { it.resolvePanelActivity(allowAllApps) } Loading
packages/SystemUI/src/com/android/systemui/util/ActivityTaskManagerProxy.kt 0 → 100644 +30 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.systemui.util import android.app.ActivityTaskManager import android.content.Context import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject /** Proxy for static calls to [ActivityTaskManager]. */ @SysUISingleton class ActivityTaskManagerProxy @Inject constructor() { /** Calls [ActivityTaskManager.supportsMultiWindow] */ fun supportsMultiWindow(context: Context) = ActivityTaskManager.supportsMultiWindow(context) }
packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsListingControllerImplTest.kt +33 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags.APP_PANELS_ALL_APPS_ALLOWED import com.android.systemui.flags.Flags.USE_APP_PANELS import com.android.systemui.settings.UserTracker import com.android.systemui.util.ActivityTaskManagerProxy import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argThat Loading Loading @@ -88,6 +89,8 @@ class ControlsListingControllerImplTest : SysuiTestCase() { private lateinit var packageManager: PackageManager @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var activityTaskManagerProxy: ActivityTaskManagerProxy private var componentName = ComponentName("pkg", "class1") private var activityName = ComponentName("pkg", "activity") Loading @@ -112,6 +115,7 @@ class ControlsListingControllerImplTest : SysuiTestCase() { // Return disabled by default `when`(packageManager.getComponentEnabledSetting(any())) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED) `when`(activityTaskManagerProxy.supportsMultiWindow(any())).thenReturn(true) mContext.setMockPackageManager(packageManager) mContext.orCreateTestableResources Loading @@ -136,6 +140,7 @@ class ControlsListingControllerImplTest : SysuiTestCase() { executor, { mockSL }, userTracker, activityTaskManagerProxy, dumpManager, featureFlags ) Loading Loading @@ -171,6 +176,7 @@ class ControlsListingControllerImplTest : SysuiTestCase() { exec, { mockServiceListing }, userTracker, activityTaskManagerProxy, dumpManager, featureFlags ) Loading Loading @@ -637,7 +643,34 @@ class ControlsListingControllerImplTest : SysuiTestCase() { assertThat(services[0].serviceInfo.componentName).isEqualTo(componentName) } @Test fun testNoPanelIfMultiWindowNotSupported() { `when`(activityTaskManagerProxy.supportsMultiWindow(any())).thenReturn(false) val serviceInfo = ServiceInfo( componentName, activityName ) `when`(packageManager.getComponentEnabledSetting(eq(activityName))) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) setUpQueryResult(listOf( ActivityInfo( activityName, enabled = true, exported = true, permission = Manifest.permission.BIND_CONTROLS ) )) val list = listOf(serviceInfo) serviceListingCallbackCaptor.value.onServicesReloaded(list) executor.runAllReady() assertNull(controller.getCurrentServices()[0].panelActivity) } private fun ServiceInfo( componentName: ComponentName, Loading