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

Commit 66792c3d authored by Evan Chen's avatar Evan Chen
Browse files

[A11y] Scroll up/down for voice access mode

Ensure users can scroll up and down using voice commands.

Test: cts
Fix: 322855383
Change-Id: If581cc8a34b0067c4fdf2151345082060ba4136e
parent 77c6fd2c
Loading
Loading
Loading
Loading
+31 −19
Original line number Original line Diff line number Diff line
@@ -27,13 +27,13 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE


import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState;
import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState;
import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState.FINISHED_TIMEOUT;
import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState.FINISHED_TIMEOUT;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_PERMISSIONS;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_NAMES;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_ICONS;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_ICONS;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_NAMES;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_PERMISSIONS;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_SUMMARIES;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_SUMMARIES;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_TITLES;
import static com.android.companiondevicemanager.CompanionDeviceResources.SUPPORTED_PROFILES;
import static com.android.companiondevicemanager.CompanionDeviceResources.SUPPORTED_PROFILES;
import static com.android.companiondevicemanager.CompanionDeviceResources.SUPPORTED_SELF_MANAGED_PROFILES;
import static com.android.companiondevicemanager.CompanionDeviceResources.SUPPORTED_SELF_MANAGED_PROFILES;
import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_TITLES;
import static com.android.companiondevicemanager.Utils.getApplicationLabel;
import static com.android.companiondevicemanager.Utils.getApplicationLabel;
import static com.android.companiondevicemanager.Utils.getHtmlFromResources;
import static com.android.companiondevicemanager.Utils.getHtmlFromResources;
import static com.android.companiondevicemanager.Utils.getIcon;
import static com.android.companiondevicemanager.Utils.getIcon;
@@ -68,6 +68,7 @@ import android.text.Spanned;
import android.util.Log;
import android.util.Log;
import android.view.View;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Button;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ImageView;
@@ -697,14 +698,15 @@ public class CompanionDeviceActivity extends FragmentActivity implements


        disableButtons();
        disableButtons();


        LinearLayoutManager permissionListLayoutManager =
                (LinearLayoutManager) mPermissionListRecyclerView
                        .getLayoutManager();

        // Enable buttons once users scroll down to the bottom of the permission list.
        // Enable buttons once users scroll down to the bottom of the permission list.
        mPermissionListRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        mPermissionListRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrollStateChanged(recyclerView, newState);
                enableAllowButtonIfNeeded(permissionListLayoutManager);
                if (!recyclerView.canScrollVertically(1)) {
                    enableButtons();
                }
            }
            }
        });
        });
        // Enable buttons if last item in the permission list is visible to the users when
        // Enable buttons if last item in the permission list is visible to the users when
@@ -713,26 +715,36 @@ public class CompanionDeviceActivity extends FragmentActivity implements
                new ViewTreeObserver.OnGlobalLayoutListener() {
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    @Override
                    public void onGlobalLayout() {
                    public void onGlobalLayout() {
                        LinearLayoutManager layoutManager =
                        enableAllowButtonIfNeeded(permissionListLayoutManager);
                                (LinearLayoutManager) mPermissionListRecyclerView
                                        .getLayoutManager();
                        int lastVisibleItemPosition =
                                layoutManager.findLastCompletelyVisibleItemPosition();
                        int numItems = mPermissionListRecyclerView.getAdapter().getItemCount();

                        if (lastVisibleItemPosition >= numItems - 1) {
                            enableButtons();
                        }

                        mPermissionListRecyclerView.getViewTreeObserver()
                        mPermissionListRecyclerView.getViewTreeObserver()
                                .removeOnGlobalLayoutListener(this);
                                .removeOnGlobalLayoutListener(this);
                    }
                    }
                });
                });


        // Set accessibility for the recyclerView that to be able scroll up/down for voice access.
        mPermissionListRecyclerView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
            public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
                super.onInitializeAccessibilityNodeInfo(host, info);
                info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN);
                info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP);
            }
        });

        mConstraintList.setVisibility(View.VISIBLE);
        mConstraintList.setVisibility(View.VISIBLE);
        mPermissionListRecyclerView.setVisibility(View.VISIBLE);
        mPermissionListRecyclerView.setVisibility(View.VISIBLE);
    }
    }


    // Enable the Allow button if the last element in the PermissionListRecyclerView is reached.
    private void enableAllowButtonIfNeeded(LinearLayoutManager layoutManager) {
        int lastVisibleItemPosition =
                layoutManager.findLastCompletelyVisibleItemPosition();
        int numItems = mPermissionListRecyclerView.getAdapter().getItemCount();

        if (lastVisibleItemPosition >= numItems - 1) {
            enableButtons();
        }
    }

    // Disable and grey out the Allow and Don't allow buttons if the last permission in the
    // Disable and grey out the Allow and Don't allow buttons if the last permission in the
    // permission list is not visible to the users.
    // permission list is not visible to the users.
    private void disableButtons() {
    private void disableButtons() {