From ec80b12bc3fc44dd78623157039bd3bb891130b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20G=C3=B6llner?= Date: Thu, 20 Jul 2023 16:20:49 +0100 Subject: [PATCH] Partial Screen Sharing - Use new app chooser base class The old one in the framework is deprecated, and not developed anymore. Partial Screen Sharing is the only thing still using it, and preventing it from being removed. There also bug fixes and improvements in the new one, that the Partial Screen Sharing feature would benefit from. Bug: 265905535 Test: MediaProjectionAppSelectorScreenshotTest Test: Manually build and run to trigger the app selector Change-Id: Icbc5b3bcf641288e12fc99973d8dae3467256a2c --- data/etc/com.android.systemui.xml | 1 + packages/SystemUI/Android.bp | 2 + .../layout/media_projection_app_selector.xml | 6 +-- .../MediaProjectionAppSelectorActivity.kt | 49 +++---------------- ...ediaProjectionBlockerEmptyStateProvider.kt | 6 +-- 5 files changed, 17 insertions(+), 47 deletions(-) diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml index 43683ffad432c..c6a9033210e3e 100644 --- a/data/etc/com.android.systemui.xml +++ b/data/etc/com.android.systemui.xml @@ -87,5 +87,6 @@ + diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index e2599a3583c73..9987c60a0b07b 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -199,6 +199,7 @@ android_library { "lottie", "LowLightDreamLib", "motion_tool_lib", + "IntentResolver-core", ], manifest: "AndroidManifest.xml", @@ -379,6 +380,7 @@ android_library { "motion_tool_lib", "androidx.core_core-animation-testing-nodeps", "androidx.compose.ui_ui", + "IntentResolver-core", ], } diff --git a/packages/SystemUI/res/layout/media_projection_app_selector.xml b/packages/SystemUI/res/layout/media_projection_app_selector.xml index e4749381243a0..5404cfad25c5d 100644 --- a/packages/SystemUI/res/layout/media_projection_app_selector.xml +++ b/packages/SystemUI/res/layout/media_projection_app_selector.xml @@ -14,7 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - @@ -92,4 +92,4 @@ - + diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt index 42164c795b060..fdb3ddd7294fc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt @@ -30,16 +30,11 @@ import android.os.IBinder import android.os.ResultReceiver import android.os.UserHandle import android.view.ViewGroup -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry +import com.android.intentresolver.AbstractMultiProfilePagerAdapter.EmptyStateProvider +import com.android.intentresolver.AbstractMultiProfilePagerAdapter.MyUserIdProvider +import com.android.intentresolver.ChooserActivity +import com.android.intentresolver.chooser.TargetInfo import com.android.internal.annotations.VisibleForTesting -import com.android.internal.app.AbstractMultiProfilePagerAdapter.EmptyStateProvider -import com.android.internal.app.AbstractMultiProfilePagerAdapter.MyUserIdProvider -import com.android.internal.app.ChooserActivity -import com.android.internal.app.ResolverListController -import com.android.internal.app.chooser.NotSelectableTargetInfo -import com.android.internal.app.chooser.TargetInfo import com.android.systemui.R import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorComponent import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorController @@ -56,12 +51,8 @@ class MediaProjectionAppSelectorActivity( private val activityLauncher: AsyncActivityLauncher, /** This is used to override the dependency in a screenshot test */ @VisibleForTesting - private val listControllerFactory: ((userHandle: UserHandle) -> ResolverListController)? -) : - ChooserActivity(), - MediaProjectionAppSelectorView, - MediaProjectionAppSelectorResultHandler, - LifecycleOwner { + private val listControllerFactory: ((userHandle: UserHandle) -> ChooserListController)? +) : ChooserActivity(), MediaProjectionAppSelectorView, MediaProjectionAppSelectorResultHandler { @Inject constructor( @@ -69,8 +60,6 @@ class MediaProjectionAppSelectorActivity( activityLauncher: AsyncActivityLauncher ) : this(componentFactory, activityLauncher, listControllerFactory = null) - private val lifecycleRegistry = LifecycleRegistry(this) - override val lifecycle = lifecycleRegistry private lateinit var configurationController: ConfigurationController private lateinit var controller: MediaProjectionAppSelectorController private lateinit var recentsViewController: MediaProjectionRecentsViewController @@ -84,7 +73,6 @@ class MediaProjectionAppSelectorActivity( override fun getLayoutResource() = R.layout.media_projection_app_selector public override fun onCreate(bundle: Bundle?) { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) component = componentFactory.create(view = this, resultHandler = this) component.lifecycleObservers.forEach { lifecycle.addObserver(it) } @@ -107,26 +95,6 @@ class MediaProjectionAppSelectorActivity( controller.init() } - override fun onStart() { - super.onStart() - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START) - } - - override fun onResume() { - super.onResume() - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) - } - - override fun onPause() { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE) - super.onPause() - } - - override fun onStop() { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP) - super.onStop() - } - override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) configurationController.onConfigurationChanged(newConfig) @@ -137,13 +105,13 @@ class MediaProjectionAppSelectorActivity( override fun createBlockerEmptyStateProvider(): EmptyStateProvider = component.emptyStateProvider - override fun createListController(userHandle: UserHandle): ResolverListController = + override fun createListController(userHandle: UserHandle): ChooserListController = listControllerFactory?.invoke(userHandle) ?: super.createListController(userHandle) override fun startSelected(which: Int, always: Boolean, filtered: Boolean) { val currentListAdapter = mChooserMultiProfilePagerAdapter.activeListAdapter val targetInfo = currentListAdapter.targetInfoForPosition(which, filtered) ?: return - if (targetInfo is NotSelectableTargetInfo) return + if (targetInfo.isNotSelectableTargetInfo) return val intent = createIntent(targetInfo) @@ -183,7 +151,6 @@ class MediaProjectionAppSelectorActivity( } override fun onDestroy() { - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) component.lifecycleObservers.forEach { lifecycle.removeObserver(it) } // onDestroy is also called when an app is selected, in that case we only want to send // RECORD_CONTENT_TASK but not RECORD_CANCEL diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionBlockerEmptyStateProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionBlockerEmptyStateProvider.kt index 829b0ddbe3a82..fd14e2b9a96b7 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionBlockerEmptyStateProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionBlockerEmptyStateProvider.kt @@ -17,10 +17,10 @@ package com.android.systemui.mediaprojection.appselector import android.content.Context import android.os.UserHandle +import com.android.intentresolver.AbstractMultiProfilePagerAdapter.EmptyState +import com.android.intentresolver.AbstractMultiProfilePagerAdapter.EmptyStateProvider +import com.android.intentresolver.ResolverListAdapter import com.android.internal.R as AndroidR -import com.android.internal.app.AbstractMultiProfilePagerAdapter.EmptyState -import com.android.internal.app.AbstractMultiProfilePagerAdapter.EmptyStateProvider -import com.android.internal.app.ResolverListAdapter import com.android.systemui.R import com.android.systemui.mediaprojection.devicepolicy.PersonalProfile import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver