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

Commit 1d08f704 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Accessibility: Page re-ordering in overview mode

Change-Id: I5fc0ad326a63b6768cb1fae55ee6e05a9fc2b659
parent deb189fd
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -100,4 +100,6 @@
    <item type="id" name="action_add_to_workspace" />
    <item type="id" name="action_move" />
    <item type="id" name="action_move_to_workspace" />
    <item type="id" name="action_move_screen_backwards" />
    <item type="id" name="action_move_screen_forwards" />
</resources>
+9 −0
Original line number Diff line number Diff line
@@ -243,4 +243,13 @@

    <!-- Accessibility action to move an item from folder to workspace. [CHAR_LIMIT=30] [DO NOT TRANSLATE] -->
    <string name="action_move_to_workspace">Move to home screen</string>

    <!-- Accessibility action to move an homescreen to the left. [CHAR_LIMIT=30] [DO NOT TRANSLATE] -->
    <string name="action_move_screen_left">Move screen to left</string>

    <!-- Accessibility action to move an homescreen to the right. [CHAR_LIMIT=30] [DO NOT TRANSLATE] -->
    <string name="action_move_screen_right">Move screen to right</string>

    <!-- Accessibility confirmation when a screen was moved [DO NOT TRANSLATE] -->
    <string name="screen_moved">Screen moved</string>
</resources>
+3 −3
Original line number Diff line number Diff line
@@ -559,7 +559,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
    /**
     * Sets the current page.
     */
    void setCurrentPage(int currentPage) {
    public void setCurrentPage(int currentPage) {
        if (!mScroller.isFinished()) {
            abortScrollerAnimation(true);
        }
@@ -2535,7 +2535,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
        }
    }

    protected void onStartReordering() {
    public void onStartReordering() {
        // Set the touch state to reordering (allows snapping to pages, dragging a child, etc.)
        mTouchState = TOUCH_STATE_REORDERING;
        mIsReordering = true;
@@ -2555,7 +2555,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
        }
    }

    protected void onEndReordering() {
    public void onEndReordering() {
        mIsReordering = false;
    }

+50 −9
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ import com.android.launcher3.Launcher.LauncherOverlay;
import com.android.launcher3.LauncherAccessibilityDelegate.AccessibilityDragSource;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.UninstallDropTarget.UninstallSource;
import com.android.launcher3.accessibility.OverviewScreenAccessibilityDelegate;
import com.android.launcher3.compat.UserHandleCompat;
import com.android.launcher3.util.LongArrayMap;
import com.android.launcher3.util.Thunk;
@@ -277,6 +278,8 @@ public class Workspace extends SmoothPagedView
    // Handles workspace state transitions
    private WorkspaceStateTransitionAnimation mStateTransitionAnimation;

    private AccessibilityDelegate mPagesAccessibilityDelegate;

    private final Runnable mBindPages = new Runnable() {
        @Override
        public void run() {
@@ -2000,14 +2003,14 @@ public class Workspace extends SmoothPagedView
        range[1] = Math.max(0,  end);
    }

    protected void onStartReordering() {
    public void onStartReordering() {
        super.onStartReordering();
        showOutlines();
        // Reordering handles its own animations, disable the automatic ones.
        disableLayoutTransitions();
    }

    protected void onEndReordering() {
    public void onEndReordering() {
        super.onEndReordering();

        if (mLauncher.isWorkspaceLoading()) {
@@ -2068,12 +2071,46 @@ public class Workspace extends SmoothPagedView
        return mState;
    }

    private void updateAccessibilityFlags() {
    public void updateAccessibilityFlags() {
        if (Utilities.isLmpOrAbove()) {
            int total = getPageCount();
            for (int i = numCustomPages(); i < total; i++) {
                updateAccessibilityFlags((CellLayout) getPageAt(i), i);
            }
            if (mState == State.NORMAL) {
                setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
            } else {
                setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
            }
        } else {
            int accessible = mState == State.NORMAL ?
                    IMPORTANT_FOR_ACCESSIBILITY_NO :
                        IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
            setImportantForAccessibility(accessible);
        }
    }

    private void updateAccessibilityFlags(CellLayout page, int pageNo) {
        if (mState == State.OVERVIEW) {
            page.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
            page.getShortcutsAndWidgets().setImportantForAccessibility(
                    IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
            page.setContentDescription(getPageDescription(pageNo));

            if (mPagesAccessibilityDelegate == null) {
                mPagesAccessibilityDelegate = new OverviewScreenAccessibilityDelegate(this);
            }
            page.setAccessibilityDelegate(mPagesAccessibilityDelegate);
        } else {
            int accessible = mState == State.NORMAL ?
                    IMPORTANT_FOR_ACCESSIBILITY_NO :
                        IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
            page.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
            page.getShortcutsAndWidgets().setImportantForAccessibility(accessible);
            page.setContentDescription(null);
            page.setAccessibilityDelegate(null);
        }
    }

    @Override
    public void onLauncherTransitionPrepare(Launcher l, boolean animated, boolean toWorkspace) {
@@ -4460,11 +4497,15 @@ public class Workspace extends SmoothPagedView
    }

    protected String getCurrentPageDescription() {
        int page = (mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage;
        int delta = numCustomPages();
        if (hasCustomContent() && getNextPage() == 0) {
            return mCustomContentDescription;
        }
        int page = (mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage;
        return getPageDescription(page);
    }

    private String getPageDescription(int page) {
        int delta = numCustomPages();
        return String.format(getContext().getString(R.string.workspace_scroll_format),
                page + 1 - delta, getChildCount() - delta);
    }
+15 −2
Original line number Diff line number Diff line
@@ -24,8 +24,11 @@ import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.DecelerateInterpolator;

import com.android.launcher3.util.Thunk;

import java.util.HashMap;
@@ -190,7 +193,7 @@ public class WorkspaceStateTransitionAnimation {
                              final HashMap<View, Integer> layerViews) {
        AccessibilityManager am = (AccessibilityManager)
                mLauncher.getSystemService(Context.ACCESSIBILITY_SERVICE);
        boolean accessibilityEnabled = am.isEnabled();
        final boolean accessibilityEnabled = am.isEnabled();

        // Reinitialize animation arrays for the current workspace state
        reinitializeAnimationArrays();
@@ -301,7 +304,7 @@ public class WorkspaceStateTransitionAnimation {
        }

        final View searchBar = mLauncher.getOrCreateQsbBar();
        final View overviewPanel = mLauncher.getOverviewPanel();
        final ViewGroup overviewPanel = mLauncher.getOverviewPanel();
        final View hotseat = mLauncher.getHotseat();
        final View pageIndicator = mWorkspace.getPageIndicator();
        if (animated) {
@@ -424,6 +427,11 @@ public class WorkspaceStateTransitionAnimation {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mStateAnimator = null;

                    if (accessibilityEnabled && overviewPanel.getVisibility() == View.VISIBLE) {
                        overviewPanel.getChildAt(0).performAccessibilityAction(
                                AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
                    }
                }
            });
        } else {
@@ -443,6 +451,11 @@ public class WorkspaceStateTransitionAnimation {
            mWorkspace.setScaleX(mNewScale);
            mWorkspace.setScaleY(mNewScale);
            mWorkspace.setTranslationY(finalWorkspaceTranslationY);

            if (accessibilityEnabled && overviewPanel.getVisibility() == View.VISIBLE) {
                overviewPanel.getChildAt(0).performAccessibilityAction(
                        AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
            }
        }

        if (stateIsNormal) {
Loading