From 408ac032b8d25fe09a26aa79b3b6133b996494d3 Mon Sep 17 00:00:00 2001 From: Matt Casey Date: Thu, 2 Jun 2022 19:08:27 +0000 Subject: [PATCH] Accessibility fixes for clipboard overlay Add/fix content descriptions for content preview, share button and remote copy. Add labels for the overlay window and the edit activity. Reset timeout on hover so that a11y exploration keeps the UI up. Bug: 232485623 Bug: 232494683 Bug: 232487324 Test: Manual evaluation with talkback enabled. Change-Id: I995083a8b00f68d85d0a1c3f699a7f27a3c40aad --- packages/SystemUI/AndroidManifest.xml | 1 + .../SystemUI/res/layout/clipboard_overlay.xml | 4 +++- packages/SystemUI/res/values/strings.xml | 8 ++++++++ .../ClipboardOverlayController.java | 15 +++++++++++++++ .../screenshot/DraggableConstraintLayout.java | 8 ++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 5dd1b09b06a2..490a3f53fd6a 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -788,6 +788,7 @@ android:theme="@style/EditTextActivity" android:exported="false" android:excludeFromRecents="true" + android:label="@string/clipboard_editor" /> + android:layout_height="match_parent" + android:contentDescription="@string/clipboard_overlay_window_name"> Image copied Content copied + + Clipboard Editor + + Clipboard + + Image preview + + edit Add diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java index eab374508913..aa67ecd30627 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java @@ -97,6 +97,9 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.core.view.ViewCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; + import com.android.internal.logging.UiEventLogger; import com.android.internal.policy.PhoneWindow; import com.android.systemui.R; @@ -218,6 +221,7 @@ public class ClipboardOverlayController { mRemoteCopyChip.setAlpha(1); mDismissButton = requireNonNull(mView.findViewById(R.id.dismiss_button)); + mShareChip.setContentDescription(mContext.getString(com.android.internal.R.string.share)); mView.setCallbacks(new DraggableConstraintLayout.SwipeDismissCallbacks() { @Override public void onInteraction() { @@ -367,6 +371,8 @@ public class ClipboardOverlayController { PackageManager packageManager = mContext.getPackageManager(); if (packageManager.resolveActivity( remoteCopyIntent, PackageManager.ResolveInfoFlags.of(0)) != null) { + mRemoteCopyChip.setContentDescription( + mContext.getString(R.string.clipboard_send_nearby_description)); mRemoteCopyChip.setVisibility(View.VISIBLE); mRemoteCopyChip.setOnClickListener((v) -> { mUiEventLogger.log(CLIPBOARD_OVERLAY_REMOTE_COPY_TAPPED); @@ -581,6 +587,7 @@ public class ClipboardOverlayController { TextView textView = hidden ? mHiddenPreview : mTextPreview; showTextPreview(text, textView); View.OnClickListener listener = v -> editText(); + setAccessibilityActionToEdit(textView); if (DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, CLIPBOARD_OVERLAY_SHOW_EDIT_BUTTON, false)) { mEditChip.setVisibility(View.VISIBLE); @@ -602,6 +609,7 @@ public class ClipboardOverlayController { showSinglePreview(mHiddenPreview); if (isEditableImage) { mHiddenPreview.setOnClickListener(listener); + setAccessibilityActionToEdit(mHiddenPreview); } } else if (isEditableImage) { // if the MIMEtype is image, try to load try { @@ -612,6 +620,7 @@ public class ClipboardOverlayController { showSinglePreview(mImagePreview); mImagePreview.setImageBitmap(thumbnail); mImagePreview.setOnClickListener(listener); + setAccessibilityActionToEdit(mImagePreview); } catch (IOException e) { Log.e(TAG, "Thumbnail loading failed", e); showTextPreview( @@ -635,6 +644,12 @@ public class ClipboardOverlayController { return isEditableImage; } + private void setAccessibilityActionToEdit(View view) { + ViewCompat.replaceAccessibilityAction(view, + AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK, + mContext.getString(R.string.clipboard_edit), null); + } + private Intent getRemoteCopyIntent(ClipData clipData) { Intent nearbyIntent = new Intent(REMOTE_COPY_ACTION); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/DraggableConstraintLayout.java b/packages/SystemUI/src/com/android/systemui/screenshot/DraggableConstraintLayout.java index f3c87d08e381..950806d89422 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/DraggableConstraintLayout.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/DraggableConstraintLayout.java @@ -117,6 +117,14 @@ public class DraggableConstraintLayout extends ConstraintLayout mCallbacks = callbacks; } + @Override + public boolean onInterceptHoverEvent(MotionEvent event) { + if (mCallbacks != null) { + mCallbacks.onInteraction(); + } + return super.onInterceptHoverEvent(event); + } + @Override // View protected void onFinishInflate() { mActionsContainer = findViewById(R.id.actions_container);