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

Commit e70db7fc authored by Miranda Kephart's avatar Miranda Kephart Committed by Automerger Merge Worker
Browse files

Merge "Announce clipboard entrance in accessibility mode" into tm-dev am: 52ed8bad

parents b3a23775 52ed8bad
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -67,9 +67,9 @@
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/overlay_offset_x"
        android:layout_marginBottom="8dp"
        android:layout_marginBottom="12dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="@id/actions_container_background"
        app:layout_constraintBottom_toBottomOf="parent"
        android:elevation="7dp"
        app:layout_constraintEnd_toEndOf="@id/clipboard_preview_end"
        app:layout_constraintTop_toTopOf="@id/clipboard_preview_top"
+6 −0
Original line number Diff line number Diff line
@@ -2484,6 +2484,12 @@
    <string name="clipboard_send_nearby_description">Send to nearby device</string>
    <!-- Text informing user that copied content is hidden [CHAR LIMIT=NONE] -->
    <string name="clipboard_text_hidden">Tap to view</string>
    <!-- Accessibility announcement informing user that text has been copied [CHAR LIMIT=NONE] -->
    <string name="clipboard_text_copied">Text copied</string>
    <!-- Accessibility announcement informing user that text has been copied [CHAR LIMIT=NONE] -->
    <string name="clipboard_image_copied">Image copied</string>
    <!-- Accessibility announcement informing user that something has been copied [CHAR LIMIT=NONE] -->
    <string name="clipboard_content_copied">Content copied</string>

    <!-- Generic "add" string [CHAR LIMIT=NONE] -->
    <string name="add">Add</string>
+39 −14
Original line number Diff line number Diff line
@@ -302,6 +302,7 @@ public class ClipboardOverlayController {
            mExitAnimator.cancel();
        }
        reset();
        String accessibilityAnnouncement;

        boolean isSensitive = clipData != null && clipData.getDescription().getExtras() != null
                && clipData.getDescription().getExtras()
@@ -310,6 +311,7 @@ public class ClipboardOverlayController {
            showTextPreview(
                    mContext.getResources().getString(R.string.clipboard_overlay_text_copied),
                    mTextPreview);
            accessibilityAnnouncement = mContext.getString(R.string.clipboard_content_copied);
        } else if (!TextUtils.isEmpty(clipData.getItemAt(0).getText())) {
            ClipData.Item item = clipData.getItemAt(0);
            if (item.getTextLinks() != null) {
@@ -321,13 +323,18 @@ public class ClipboardOverlayController {
            } else {
                showEditableText(item.getText(), false);
            }
            accessibilityAnnouncement = mContext.getString(R.string.clipboard_text_copied);
        } else if (clipData.getItemAt(0).getUri() != null) {
            // How to handle non-image URIs?
            showEditableImage(clipData.getItemAt(0).getUri(), isSensitive);
            if (tryShowEditableImage(clipData.getItemAt(0).getUri(), isSensitive)) {
                accessibilityAnnouncement = mContext.getString(R.string.clipboard_image_copied);
            } else {
                accessibilityAnnouncement = mContext.getString(R.string.clipboard_content_copied);
            }
        } else {
            showTextPreview(
                    mContext.getResources().getString(R.string.clipboard_overlay_text_copied),
                    mTextPreview);
            accessibilityAnnouncement = mContext.getString(R.string.clipboard_content_copied);
        }
        Intent remoteCopyIntent = getRemoteCopyIntent(clipData);
        // Only show remote copy if it's available.
@@ -344,7 +351,12 @@ public class ClipboardOverlayController {
        } else {
            mRemoteCopyChip.setVisibility(View.GONE);
        }
        withWindowAttached(() -> mView.post(this::animateIn));
        withWindowAttached(() -> {
            updateInsets(
                    mWindowManager.getCurrentWindowMetrics().getWindowInsets());
            mView.post(this::animateIn);
            mView.announceForAccessibility(accessibilityAnnouncement);
        });
        mTimeoutHandler.resetTimeout();
    }

@@ -476,34 +488,47 @@ public class ClipboardOverlayController {
        textView.setOnClickListener(listener);
    }

    private void showEditableImage(Uri uri, boolean isSensitive) {
        mEditChip.setAlpha(1f);
        mActionContainerBackground.setVisibility(View.VISIBLE);
    private boolean tryShowEditableImage(Uri uri, boolean isSensitive) {
        View.OnClickListener listener = v -> editImage(uri);
        ContentResolver resolver = mContext.getContentResolver();
        String mimeType = resolver.getType(uri);
        boolean isEditableImage = mimeType != null && mimeType.startsWith("image");
        if (isSensitive) {
            showSinglePreview(mHiddenImagePreview);
            if (isEditableImage) {
                mHiddenImagePreview.setOnClickListener(listener);
        } else {
            showSinglePreview(mImagePreview);
            ContentResolver resolver = mContext.getContentResolver();
            }
        } else if (isEditableImage) { // if the MIMEtype is image, try to load
            try {
                int size = mContext.getResources().getDimensionPixelSize(R.dimen.overlay_x_scale);
                // The width of the view is capped, height maintains aspect ratio, so allow it to be
                // taller if needed.
                Bitmap thumbnail = resolver.loadThumbnail(uri, new Size(size, size * 4), null);
                showSinglePreview(mImagePreview);
                mImagePreview.setImageBitmap(thumbnail);
                mImagePreview.setOnClickListener(listener);
            } catch (IOException e) {
                Log.e(TAG, "Thumbnail loading failed", e);
                showTextPreview(
                        mContext.getResources().getString(R.string.clipboard_overlay_text_copied),
                        mTextPreview);
                isEditableImage = false;
            }
            mImagePreview.setOnClickListener(listener);
        } else {
            showTextPreview(
                    mContext.getResources().getString(R.string.clipboard_overlay_text_copied),
                    mTextPreview);
        }
        if (isEditableImage) {
            mEditChip.setVisibility(View.VISIBLE);
            mEditChip.setAlpha(1f);
            mActionContainerBackground.setVisibility(View.VISIBLE);
            mEditChip.setOnClickListener(listener);
            mEditChip.setContentDescription(
                    mContext.getString(R.string.clipboard_edit_image_description));
        }
        return isEditableImage;
    }

    private Intent getRemoteCopyIntent(ClipData clipData) {
        String remoteCopyPackage = mContext.getString(R.string.config_remoteCopyPackage);
+5 −9
Original line number Diff line number Diff line
@@ -78,7 +78,6 @@ import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.widget.Toast;
import android.window.WindowContext;
@@ -559,14 +558,9 @@ public class ScreenshotController {

    private void saveScreenshot(Bitmap screenshot, Consumer<Uri> finisher, Rect screenRect,
            Insets screenInsets, ComponentName topComponent, boolean showFlash) {
        if (mAccessibilityManager.isEnabled()) {
            AccessibilityEvent event =
                    new AccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
            event.setContentDescription(
                    mContext.getResources().getString(R.string.screenshot_saving_title));
            mAccessibilityManager.sendAccessibilityEvent(event);
        }

        withWindowAttached(() ->
                mScreenshotView.announceForAccessibility(
                        mContext.getResources().getString(R.string.screenshot_saving_title)));

        if (mScreenshotView.isAttachedToWindow()) {
            // if we didn't already dismiss for another reason
@@ -633,6 +627,7 @@ public class ScreenshotController {
                                }
                            }
                        }

                        @Override
                        public void requestCompatCameraControl(boolean showControl,
                                boolean transformationApplied,
@@ -718,6 +713,7 @@ public class ScreenshotController {
            Log.e(TAG, "requestScrollCapture failed", e);
        }
    }

    ListenableFuture<ScrollCaptureController.LongScreenshot> mLongScreenshotFuture;

    private void runBatchScrollCapture(ScrollCaptureResponse response) {