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

Commit 0d41dcc6 authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Use live region to announce clipboard status

Switch to using contentDescription on a live region rather than a
disruptive announcement

Bug: 378856296
Flag: com.android.systemui.clipboard_announce_live_region
Test: manual with flag on/off; atest ClipboardOverlayControllerTest
Change-Id: I9af6c8bebbcbd5d0275d968a76b182b3c9c4b34e
parent 2c813015
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -710,6 +710,16 @@ flag {
    bug: "368308908"
}

flag {
    name: "clipboard_announce_live_region"
    namespace: "systemui"
    description: "Use live region for clipboard status announcement"
    bug: "378856296"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "screen_reactions"
    namespace: "systemui"
+7 −0
Original line number Diff line number Diff line
@@ -24,6 +24,13 @@
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="@string/clipboard_overlay_window_name">
    <View
        android:id="@+id/clipboard_announcement_live_region"
        android:layout_width="1dp"
        android:layout_height="1dp"
        android:accessibilityLiveRegion="polite"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>
    <!-- Min edge spacing guideline off of which the preview and actions can be anchored (without
         this we'd need to express margins as the sum of two different dimens). -->
    <androidx.constraintlayout.widget.Guideline
+31 −6
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.clipboardoverlay;
import static android.content.Intent.ACTION_CLOSE_SYSTEM_DIALOGS;

import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.CLIPBOARD_OVERLAY_SHOW_ACTIONS;
import static com.android.systemui.Flags.clipboardAnnounceLiveRegion;
import static com.android.systemui.Flags.clipboardSharedTransitions;
import static com.android.systemui.Flags.showClipboardIndication;
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ACTION_SHOWN;
@@ -307,13 +308,25 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
                mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_MINIMIZED);
                mIsMinimized = true;
                mView.setMinimized(true);
                if (clipboardAnnounceLiveRegion()) {
                    animateInWithAnnouncement(mClipboardModel.getType());
                } else {
                    animateIn();
                }
            } else {
                mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_EXPANDED);
                setExpandedView(this::animateIn);
                setExpandedView(() -> {
                    if (clipboardAnnounceLiveRegion()) {
                        animateInWithAnnouncement(mClipboardModel.getType());
                    } else {
                        animateIn();
                    }
                });
            }
            if (!clipboardAnnounceLiveRegion()) {
                mWindow.withWindowAttached(() -> mView.announceForAccessibility(
                        getAccessibilityAnnouncement(mClipboardModel.getType())));
            }
        } else if (!mIsMinimized) {
            setExpandedView(() -> {
            });
@@ -501,9 +514,20 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
        animateOut();
    }

    private void animateIn() {
    private void animateInWithAnnouncement(ClipboardModel.Type type) {
        Animator entrance = animateIn();
        entrance.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                mView.announce(getAccessibilityAnnouncement(type));
            }
        });
    }

    private Animator animateIn() {
        if (mEnterAnimator != null && mEnterAnimator.isRunning()) {
            return;
            return mEnterAnimator;
        }
        mEnterAnimator = mView.getEnterAnimation();
        mEnterAnimator.addListener(new AnimatorListenerAdapter() {
@@ -526,6 +550,7 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
            }
        });
        mEnterAnimator.start();
        return mEnterAnimator;
    }

    private void finish(ClipboardOverlayEvent event) {
+7 −0
Original line number Diff line number Diff line
@@ -223,6 +223,13 @@ public class ClipboardOverlayView extends DraggableConstraintLayout {
        mIndicationContainer.setVisibility(visibility);
    }

    void announce(CharSequence text) {
        View announce = findViewById(R.id.clipboard_announcement_live_region);
        // clear the description to announce even if successive copies are the same type
        announce.setContentDescription("");
        announce.setContentDescription(text);
    }

    void setMinimized(boolean minimized) {
        if (minimized) {
            mMinimizedPreview.setVisibility(View.VISIBLE);