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

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

Merge "Remove CLIPBOARD_MINIMIZED_LAYOUT flag" into udc-dev am: 1a9b6b14

parents 34f22849 1a9b6b14
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import static android.content.ClipDescription.CLASSIFICATION_COMPLETE;
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_ENTERED;
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_UPDATED;
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_TOAST_SHOWN;
import static com.android.systemui.flags.Flags.CLIPBOARD_MINIMIZED_LAYOUT;

import static com.google.android.setupcompat.util.WizardManagerHelper.SETTINGS_SECURE_USER_SETUP_COMPLETE;

@@ -36,7 +35,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;

import javax.inject.Inject;
import javax.inject.Provider;
@@ -59,7 +57,6 @@ public class ClipboardListener implements
    private final Provider<ClipboardOverlayController> mOverlayProvider;
    private final ClipboardToast mClipboardToast;
    private final ClipboardManager mClipboardManager;
    private final FeatureFlags mFeatureFlags;
    private final UiEventLogger mUiEventLogger;
    private ClipboardOverlay mClipboardOverlay;

@@ -68,13 +65,11 @@ public class ClipboardListener implements
            Provider<ClipboardOverlayController> clipboardOverlayControllerProvider,
            ClipboardToast clipboardToast,
            ClipboardManager clipboardManager,
            FeatureFlags featureFlags,
            UiEventLogger uiEventLogger) {
        mContext = context;
        mOverlayProvider = clipboardOverlayControllerProvider;
        mClipboardToast = clipboardToast;
        mClipboardManager = clipboardManager;
        mFeatureFlags = featureFlags;
        mUiEventLogger = uiEventLogger;
    }

@@ -113,11 +108,7 @@ public class ClipboardListener implements
        } else {
            mUiEventLogger.log(CLIPBOARD_OVERLAY_UPDATED, 0, clipSource);
        }
        if (mFeatureFlags.isEnabled(CLIPBOARD_MINIMIZED_LAYOUT)) {
        mClipboardOverlay.setClipData(clipData, clipSource);
        } else {
            mClipboardOverlay.setClipDataLegacy(clipData, clipSource);
        }
        mClipboardOverlay.setOnSessionCompleteListener(() -> {
            // Session is complete, free memory until it's needed again.
            mClipboardOverlay = null;
@@ -160,8 +151,6 @@ public class ClipboardListener implements
    }

    interface ClipboardOverlay {
        void setClipDataLegacy(ClipData clipData, String clipSource);

        void setClipData(ClipData clipData, String clipSource);

        void setOnSessionCompleteListener(Runnable runnable);
+4 −124
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBO
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_SWIPE_DISMISSED;
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_TAP_OUTSIDE;
import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBOARD_OVERLAY_TIMED_OUT;
import static com.android.systemui.flags.Flags.CLIPBOARD_MINIMIZED_LAYOUT;
import static com.android.systemui.flags.Flags.CLIPBOARD_REMOTE_BEHAVIOR;

import android.animation.Animator;
@@ -40,20 +39,14 @@ import android.animation.AnimatorListenerAdapter;
import android.app.RemoteAction;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.hardware.input.InputManager;
import android.net.Uri;
import android.os.Looper;
import android.provider.DeviceConfig;
import android.text.TextUtils;
import android.util.Log;
import android.util.Size;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.InputMonitor;
@@ -72,7 +65,6 @@ import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.screenshot.TimeoutHandler;

import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.Executor;

@@ -170,10 +162,8 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv

                @Override
                public void onMinimizedViewTapped() {
                    if (mFeatureFlags.isEnabled(CLIPBOARD_MINIMIZED_LAYOUT)) {
                    animateFromMinimized();
                }
                }
            };

    @Inject
@@ -255,13 +245,11 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
    @VisibleForTesting
    void onInsetsChanged(WindowInsets insets, int orientation) {
        mView.setInsets(insets, orientation);
        if (mFeatureFlags.isEnabled(CLIPBOARD_MINIMIZED_LAYOUT)) {
        if (shouldShowMinimized(insets) && !mIsMinimized) {
            mIsMinimized = true;
            mView.setMinimized(true);
        }
    }
    }

    @Override // ClipboardListener.ClipboardOverlay
    public void setClipData(ClipData data, String source) {
@@ -401,61 +389,6 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
        });
    }

    @Override // ClipboardListener.ClipboardOverlay
    public void setClipDataLegacy(ClipData clipData, String clipSource) {
        if (mExitAnimator != null && mExitAnimator.isRunning()) {
            mExitAnimator.cancel();
        }
        reset();
        mClipboardLogger.setClipSource(clipSource);
        String accessibilityAnnouncement = mContext.getString(R.string.clipboard_content_copied);

        boolean isSensitive = clipData != null && clipData.getDescription().getExtras() != null
                && clipData.getDescription().getExtras()
                .getBoolean(ClipDescription.EXTRA_IS_SENSITIVE);
        boolean isRemote = mFeatureFlags.isEnabled(CLIPBOARD_REMOTE_BEHAVIOR)
                && mClipboardUtils.isRemoteCopy(mContext, clipData, clipSource);
        if (clipData == null || clipData.getItemCount() == 0) {
            mView.showDefaultTextPreview();
        } else if (!TextUtils.isEmpty(clipData.getItemAt(0).getText())) {
            ClipData.Item item = clipData.getItemAt(0);
            if (isRemote || DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
                    CLIPBOARD_OVERLAY_SHOW_ACTIONS, false)) {
                if (item.getTextLinks() != null) {
                    classifyText(clipData.getItemAt(0), clipSource);
                }
            }
            if (isSensitive) {
                showEditableText(mContext.getString(R.string.clipboard_asterisks), true);
            } else {
                showEditableText(item.getText(), false);
            }
            mOnShareTapped = () -> shareContent(clipData);
            mView.showShareChip();
            accessibilityAnnouncement = mContext.getString(R.string.clipboard_text_copied);
        } else if (clipData.getItemAt(0).getUri() != null) {
            if (tryShowEditableImage(clipData.getItemAt(0).getUri(), isSensitive)) {
                accessibilityAnnouncement = mContext.getString(R.string.clipboard_image_copied);
            }
            mOnShareTapped = () -> shareContent(clipData);
            mView.showShareChip();
        } else {
            mView.showDefaultTextPreview();
        }
        if (!isRemote) {
            maybeShowRemoteCopy(clipData);
        }
        animateIn();
        mView.announceForAccessibility(accessibilityAnnouncement);
        if (isRemote) {
            mTimeoutHandler.cancelTimeout();
            mOnUiUpdate = null;
        } else {
            mOnUiUpdate = mTimeoutHandler::resetTimeout;
            mOnUiUpdate.run();
        }
    }

    private void maybeShowRemoteCopy(ClipData clipData) {
        Intent remoteCopyIntent = IntentCreator.getRemoteCopyIntent(clipData, mContext);
        // Only show remote copy if it's available.
@@ -478,22 +411,6 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
        mOnSessionCompleteListener = runnable;
    }

    private void classifyText(ClipData.Item item, String source) {
        mBgExecutor.execute(() -> {
            Optional<RemoteAction> action = mClipboardUtils.getAction(item, source);
            mView.post(() -> {
                mView.resetActionChips();
                action.ifPresent(remoteAction -> {
                    mView.setActionChip(remoteAction, () -> {
                        mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_ACTION_TAPPED);
                        animateOut();
                    });
                    mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_ACTION_SHOWN);
                });
            });
        });
    }

    private void monitorOutsideTouches() {
        InputManager inputManager = mContext.getSystemService(InputManager.class);
        mInputMonitor = inputManager.monitorGestureInput("clipboard overlay", 0);
@@ -534,43 +451,6 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
        animateOut();
    }

    private void showEditableText(CharSequence text, boolean hidden) {
        mView.showTextPreview(text.toString(), hidden);
        mView.setEditAccessibilityAction(true);
        mOnPreviewTapped = this::editText;
    }

    private boolean tryShowEditableImage(Uri uri, boolean isSensitive) {
        Runnable listener = () -> editImage(uri);
        ContentResolver resolver = mContext.getContentResolver();
        String mimeType = resolver.getType(uri);
        boolean isEditableImage = mimeType != null && mimeType.startsWith("image");
        if (isSensitive) {
            mView.showImagePreview(null);
            if (isEditableImage) {
                mOnPreviewTapped = listener;
                mView.setEditAccessibilityAction(true);
            }
        } 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);
                mView.showImagePreview(thumbnail);
                mView.setEditAccessibilityAction(true);
                mOnPreviewTapped = listener;
            } catch (IOException e) {
                Log.e(TAG, "Thumbnail loading failed", e);
                mView.showDefaultTextPreview();
                isEditableImage = false;
            }
        } else {
            mView.showDefaultTextPreview();
        }
        return isEditableImage;
    }

    private void animateIn() {
        if (mEnterAnimator != null && mEnterAnimator.isRunning()) {
            return;
+0 −21
Original line number Diff line number Diff line
@@ -88,25 +88,4 @@ class ClipboardOverlayUtils {
        }
        return actions;
    }

    public Optional<RemoteAction> getAction(ClipData.Item item, String source) {
        return getActions(item).stream().filter(remoteAction -> {
            ComponentName component = remoteAction.getActionIntent().getIntent().getComponent();
            return component != null && !TextUtils.equals(source, component.getPackageName());
        }).findFirst();
    }

    private ArrayList<RemoteAction> getActions(ClipData.Item item) {
        ArrayList<RemoteAction> actions = new ArrayList<>();
        for (TextLinks.TextLink link : item.getTextLinks().getLinks()) {
            // skip classification for incidental entities
            if (link.getEnd() - link.getStart()
                    >= item.getText().length() * MINIMUM_ENTITY_PROPORTION) {
                TextClassification classification = mTextClassifier.classifyText(
                        item.getText(), link.getStart(), link.getEnd(), null);
                actions.addAll(classification.getActions());
            }
        }
        return actions;
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -610,8 +610,6 @@ object Flags {

    // 1700 - clipboard
    @JvmField val CLIPBOARD_REMOTE_BEHAVIOR = releasedFlag(1701, "clipboard_remote_behavior")
    // TODO(b/267162944): Tracking bug
    @JvmField val CLIPBOARD_MINIMIZED_LAYOUT = releasedFlag(1702, "clipboard_data_model")

    // 1800 - shade container
    @JvmField
+1 −37
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.systemui.clipboardoverlay;

import static com.android.systemui.flags.Flags.CLIPBOARD_MINIMIZED_LAYOUT;

import static com.google.android.setupcompat.util.WizardManagerHelper.SETTINGS_SECURE_USER_SETUP_COMPLETE;

import static org.junit.Assert.assertEquals;
@@ -40,7 +38,6 @@ import androidx.test.runner.AndroidJUnit4;

import com.android.internal.logging.UiEventLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.flags.FakeFeatureFlags;

import org.junit.Before;
import org.junit.Test;
@@ -65,7 +62,6 @@ public class ClipboardListenerTest extends SysuiTestCase {
    private ClipboardOverlayController mOverlayController;
    @Mock
    private ClipboardToast mClipboardToast;
    private FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
    @Mock
    private UiEventLogger mUiEventLogger;

@@ -99,10 +95,8 @@ public class ClipboardListenerTest extends SysuiTestCase {
        when(mClipboardManager.getPrimaryClip()).thenReturn(mSampleClipData);
        when(mClipboardManager.getPrimaryClipSource()).thenReturn(mSampleSource);

        mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, true);

        mClipboardListener = new ClipboardListener(getContext(), mOverlayControllerProvider,
                mClipboardToast, mClipboardManager, mFeatureFlags, mUiEventLogger);
                mClipboardToast, mClipboardManager, mUiEventLogger);
    }


@@ -222,34 +216,4 @@ public class ClipboardListenerTest extends SysuiTestCase {
        verify(mClipboardToast, times(1)).showCopiedToast();
        verifyZeroInteractions(mOverlayControllerProvider);
    }

    @Test
    public void test_minimizedLayoutFlagOff_usesLegacy() {
        mFeatureFlags.set(CLIPBOARD_MINIMIZED_LAYOUT, false);

        mClipboardListener.start();
        mClipboardListener.onPrimaryClipChanged();

        verify(mOverlayControllerProvider).get();

        verify(mOverlayController).setClipDataLegacy(
                mClipDataCaptor.capture(), mStringCaptor.capture());

        assertEquals(mSampleClipData, mClipDataCaptor.getValue());
        assertEquals(mSampleSource, mStringCaptor.getValue());
    }

    @Test
    public void test_minimizedLayoutFlagOn_usesNew() {
        mClipboardListener.start();
        mClipboardListener.onPrimaryClipChanged();

        verify(mOverlayControllerProvider).get();

        verify(mOverlayController).setClipData(
                mClipDataCaptor.capture(), mStringCaptor.capture());

        assertEquals(mSampleClipData, mClipDataCaptor.getValue());
        assertEquals(mSampleSource, mStringCaptor.getValue());
    }
}
Loading