summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java48
1 files changed, 48 insertions, 0 deletions
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 50f393b53277..ef324c2147bf 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -39,6 +39,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE
import static com.android.internal.annotations.VisibleForTesting.Visibility.PROTECTED;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.annotation.UiThread;
@@ -67,6 +68,7 @@ import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Insets;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
@@ -92,6 +94,7 @@ import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
@@ -481,6 +484,14 @@ public class ResolverActivity extends Activity implements
rdl.setOnApplyWindowInsetsListener(this::onApplyWindowInsets);
mResolverDrawerLayout = rdl;
+
+ for (int i = 0, size = mMultiProfilePagerAdapter.getCount(); i < size; i++) {
+ View view = mMultiProfilePagerAdapter.getItem(i).rootView.findViewById(
+ R.id.resolver_list);
+ if (view != null) {
+ view.setAccessibilityDelegate(new AppListAccessibilityDelegate(rdl));
+ }
+ }
}
mProfileView = findViewById(R.id.profile_button);
@@ -2600,4 +2611,41 @@ public class ResolverActivity extends Activity implements
}
return resolveInfo.userHandle;
}
+
+ /**
+ * 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 {
+ private final ResolverDrawerLayout mDrawer;
+ @Nullable
+ private final View mBottomBar;
+ private final Rect mRect = new Rect();
+
+ private AppListAccessibilityDelegate(ResolverDrawerLayout drawer) {
+ mDrawer = drawer;
+ mBottomBar = mDrawer.findViewById(R.id.button_bar_container);
+ }
+
+ @Override
+ public boolean onRequestSendAccessibilityEvent(@androidx.annotation.NonNull ViewGroup host,
+ @NonNull View child,
+ @NonNull AccessibilityEvent event) {
+ boolean result = super.onRequestSendAccessibilityEvent(host, child, event);
+ if (result && event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED
+ && mDrawer.isCollapsed()) {
+ child.getBoundsOnScreen(mRect);
+ int childTop = mRect.top;
+ int childBottom = mRect.bottom;
+ mDrawer.getBoundsOnScreen(mRect, true);
+ int bottomBarHeight = mBottomBar == null ? 0 : mBottomBar.getHeight();
+ int drawerTop = mRect.top;
+ int drawerBottom = mRect.bottom - bottomBarHeight;
+ if (drawerTop > childTop || childBottom > drawerBottom) {
+ mDrawer.setCollapsed(false);
+ }
+ }
+ return result;
+ }
+ }
}