Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ac51f16 authored by Automerger Merge Worker's avatar Automerger Merge Worker Committed by Android (Google) Code Review
Browse files

Merge "Merge "Fixing App Selector scrolling with Talkback" into udc-qpr-dev...

Merge "Merge "Fixing App Selector scrolling with Talkback" into udc-qpr-dev am: b563e766 am: 1582a340" into main
parents f1f3666c db3c7818
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd
    }

    @Override
    ChooserProfileDescriptor getItem(int pageIndex) {
    public ChooserProfileDescriptor getItem(int pageIndex) {
        return mItems[pageIndex];
    }

+2 −2
Original line number Diff line number Diff line
@@ -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);
        }
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerA
    }

    @Override
    ResolverProfileDescriptor getItem(int pageIndex) {
    public ResolverProfileDescriptor getItem(int pageIndex) {
        return mItems[pageIndex];
    }

+50 −0
Original line number Diff line number Diff line
@@ -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)
        }
    }
}