diff options
| author | 2023-09-12 16:14:56 +0000 | |
|---|---|---|
| committer | 2023-09-12 16:14:56 +0000 | |
| commit | 4ac51f16e9da3ccc48de40e5bc6b2a213b37f19b (patch) | |
| tree | ad3fb078b8224d44656602a732f34c26cd165e9e | |
| parent | f1f3666c2745f31c8ef4f0e28feaac3bdeba78bd (diff) | |
| parent | db3c781898cad627eb67289c0d3662a0d37aaa87 (diff) | |
Merge "Merge "Fixing App Selector scrolling with Talkback" into udc-qpr-dev am: b563e76698 am: 1582a3403b" into main
5 files changed, 57 insertions, 7 deletions
diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index 5e2eceb23789..dee49350d93e 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -177,7 +177,7 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { * <code>1</code> would return the work profile {@link ProfileDescriptor}.</li> * </ul> */ - abstract ProfileDescriptor getItem(int pageIndex); + public abstract ProfileDescriptor getItem(int pageIndex); /** * Returns the number of {@link ProfileDescriptor} objects. @@ -438,8 +438,8 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { && isQuietModeEnabled(mWorkProfileUserHandle)); } - protected class ProfileDescriptor { - final ViewGroup rootView; + public static class ProfileDescriptor { + public final ViewGroup rootView; private final ViewGroup mEmptyStateView; ProfileDescriptor(ViewGroup rootView) { this.rootView = rootView; diff --git a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java index 7beb059fb648..8197e265ca29 100644 --- a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java @@ -94,7 +94,7 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd } @Override - ChooserProfileDescriptor getItem(int pageIndex) { + public ChooserProfileDescriptor getItem(int pageIndex) { return mItems[pageIndex]; } diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index ac15f11ee989..7534d2960b7c 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -2623,13 +2623,13 @@ public class ResolverActivity extends Activity implements * An a11y delegate that expands resolver drawer when gesture navigation reaches a partially * invisible target in the list. */ - private static class AppListAccessibilityDelegate extends View.AccessibilityDelegate { + public static class AppListAccessibilityDelegate extends View.AccessibilityDelegate { private final ResolverDrawerLayout mDrawer; @Nullable private final View mBottomBar; private final Rect mRect = new Rect(); - private AppListAccessibilityDelegate(ResolverDrawerLayout drawer) { + public AppListAccessibilityDelegate(ResolverDrawerLayout drawer) { mDrawer = drawer; mBottomBar = mDrawer.findViewById(R.id.button_bar_container); } diff --git a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java index 767791263673..031f9d3168bf 100644 --- a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java @@ -79,7 +79,7 @@ public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerA } @Override - ResolverProfileDescriptor getItem(int pageIndex) { + public ResolverProfileDescriptor getItem(int pageIndex) { return mItems[pageIndex]; } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt index 053c9b56ef96..60fd10492628 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt @@ -29,7 +29,10 @@ import android.os.Bundle import android.os.IBinder import android.os.ResultReceiver import android.os.UserHandle +import android.util.Log +import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry @@ -40,6 +43,9 @@ 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.internal.widget.RecyclerView +import com.android.internal.widget.RecyclerViewAccessibilityDelegate +import com.android.internal.widget.ResolverDrawerLayout import com.android.systemui.R import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorComponent import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorController @@ -105,6 +111,10 @@ class MediaProjectionAppSelectorActivity( super.onCreate(bundle) controller.init() + // we override AppList's AccessibilityDelegate set in ResolverActivity.onCreate because in + // our case this delegate must extend RecyclerViewAccessibilityDelegate, otherwise + // RecyclerView scrolling is broken + setAppListAccessibilityDelegate() } override fun onStart() { @@ -277,6 +287,8 @@ class MediaProjectionAppSelectorActivity( recentsViewController.createView(parent) companion object { + const val TAG = "MediaProjectionAppSelectorActivity" + /** * When EXTRA_CAPTURE_REGION_RESULT_RECEIVER is passed as intent extra the activity will * send the [CaptureRegion] to the result receiver instead of returning media projection @@ -313,4 +325,42 @@ class MediaProjectionAppSelectorActivity( putExtra(EXTRA_SELECTED_PROFILE, selectedProfile) } } + + private fun setAppListAccessibilityDelegate() { + val rdl = requireViewById<ResolverDrawerLayout>(com.android.internal.R.id.contentPanel) + for (i in 0 until mMultiProfilePagerAdapter.count) { + val list = + mMultiProfilePagerAdapter + .getItem(i) + .rootView + .findViewById<View>(com.android.internal.R.id.resolver_list) + if (list == null || list !is RecyclerView) { + Log.wtf(TAG, "MediaProjection only supports RecyclerView") + } else { + list.accessibilityDelegate = RecyclerViewExpandingAccessibilityDelegate(rdl, list) + } + } + } + + /** + * An a11y delegate propagating all a11y events to [AppListAccessibilityDelegate] so that it can + * expand drawer when needed. It needs to extend [RecyclerViewAccessibilityDelegate] because + * that superclass handles RecyclerView scrolling while using a11y services. + */ + private class RecyclerViewExpandingAccessibilityDelegate( + rdl: ResolverDrawerLayout, + view: RecyclerView + ) : RecyclerViewAccessibilityDelegate(view) { + + private val delegate = AppListAccessibilityDelegate(rdl) + + override fun onRequestSendAccessibilityEvent( + host: ViewGroup, + child: View, + event: AccessibilityEvent + ): Boolean { + super.onRequestSendAccessibilityEvent(host, child, event) + return delegate.onRequestSendAccessibilityEvent(host, child, event) + } + } } |