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

Commit 340ab17f authored by Ben Lin's avatar Ben Lin
Browse files

Fixing Keyboard Navigation to match spec.

Couple known problems still:
- Tabs go to the search/sort/etc icons first, as opposed to the
breadcrumb.
- There's no "focus" indicator for the sort items.

Test: Manually checked, works.

Bug: 32411179
Bug: 34243462
Bug: 31995556
Change-Id: I39240c0bafee9236f5ea5b760eff437739074cd3
parent e4ffd06b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -20,5 +20,5 @@
    android:layout_height="match_parent"
    android:paddingTop="8dp"
    android:listSelector="@drawable/root_list_selector"
    android:divider="@null"
    android:background="@drawable/roots_list_border" />
    acndroid:background="@drawable/roots_list_border"
    android:divider="@null" />
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
  android:layout_width="wrap_content"
  android:layout_height="@dimen/breadcrumb_item_height"
  android:layout_alignParentTop="true"
  android:focusable="true"
  android:gravity="center_vertical"
  android:orientation="horizontal">

@@ -38,6 +39,7 @@
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:duplicateParentState="true"
        android:textAppearance="@android:style/TextAppearance.Material.Widget.ActionBar.Title"
        android:background="@drawable/breadcrumb_item_background" />

+4 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.widget.TextView;
import com.android.documentsui.base.EventListener;
import com.android.documentsui.base.Events;
import com.android.documentsui.base.Procedure;
import com.android.documentsui.base.Shared;
import com.android.documentsui.dirlist.DocumentHolder;
import com.android.documentsui.dirlist.DocumentsAdapter;
import com.android.documentsui.dirlist.FocusHandler;
@@ -81,6 +82,9 @@ public final class FocusManager implements FocusHandler {

    @Override
    public boolean advanceFocusArea() {
        // This should only be called in pre-O devices.
        // O has built-in keyboard navigation support.
        assert(!Shared.ENABLE_OMC_API_FEATURES);
        boolean focusChanged = false;
        if (mNavDrawerHasFocus) {
            mDrawer.setOpen(false);
+16 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -69,7 +70,7 @@ public final class HorizontalBreadcrumb extends RecyclerView
        mLayoutManager = new LinearLayoutManager(
                getContext(), LinearLayoutManager.HORIZONTAL, false);
        mAdapter = new BreadcrumbAdapter(
                state, env, new ItemDragListener<>(this));
                state, env, new ItemDragListener<>(this), this::onKey);
        // Since we are using GestureDetector to detect click events, a11y services don't know which views
        // are clickable because we aren't using View.OnClickListener. Thus, we need to use a custom
        // accessibility delegate to route click events correctly. See AccessibilityClickEventRouter
@@ -126,6 +127,15 @@ public final class HorizontalBreadcrumb extends RecyclerView
        return false;
    }

    private boolean onKey(View v, int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_ENTER:
                return onAccessibilityClick(v);
            default:
                return false;
        }
    }

    @Override
    public void postUpdate() {
    }
@@ -175,15 +185,18 @@ public final class HorizontalBreadcrumb extends RecyclerView
        private final Environment mEnv;
        private final com.android.documentsui.base.State mState;
        private final OnDragListener mDragListener;
        private final View.OnKeyListener mClickListener;
        // We keep the old item size so the breadcrumb will only re-render views that are necessary
        private int mLastItemSize;

        public BreadcrumbAdapter(com.android.documentsui.base.State state,
                Environment env,
                OnDragListener dragListener) {
                OnDragListener dragListener,
                View.OnKeyListener clickListener) {
            mState = state;
            mEnv = env;
            mDragListener = dragListener;
            mClickListener = clickListener;
            mLastItemSize = mState.stack.size();
        }

@@ -215,6 +228,7 @@ public final class HorizontalBreadcrumb extends RecyclerView
                holder.arrow.setVisibility(View.VISIBLE);
            }
            holder.itemView.setOnDragListener(mDragListener);
            holder.itemView.setOnKeyListener(mClickListener);
        }

        private DocumentInfo getItem(int position) {
+4 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.view.KeyEvent;

import com.android.documentsui.base.Events;
import com.android.documentsui.base.Procedure;
import com.android.documentsui.base.Shared;

public class SharedInputHandler {

@@ -37,8 +38,10 @@ public class SharedInputHandler {
            // which is probably what the user is trying to do.
            mFocusManager.focusDirectoryList();
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_TAB) {
        } else if (keyCode == KeyEvent.KEYCODE_TAB && !Shared.ENABLE_OMC_API_FEATURES) {
            // Tab toggles focus on the navigation drawer.
            // This should only be called in pre-O devices, since O has built-in keyboard navigation
            // support.
            mFocusManager.advanceFocusArea();
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_DEL) {
Loading