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

Commit c7677a29 authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Guard clipboard overlay logging method

Currently, there's no enforcement in the clipboard logs of the fact
that the overlay can only be dismissed once per session -- e.g. if
the user taps multiple times outside the UI to get it dismiss, we
log all of those as separate events. This change guards the logs
so that we only log one dismissal per session (unguarding on a
reset).

Bug: 241548007
Test: manual
Change-Id: I4857a0344287f5f1d795ce14c8fce69b4af70c93
parent 6c11adfa
Loading
Loading
Loading
Loading
+37 −14
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;

@@ -132,7 +133,7 @@ public class ClipboardOverlayController {
    private static final int FONT_SEARCH_STEP_PX = 4;

    private final Context mContext;
    private final UiEventLogger mUiEventLogger;
    private final ClipboardLogger mClipboardLogger;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final DisplayManager mDisplayManager;
    private final DisplayMetrics mDisplayMetrics;
@@ -181,7 +182,7 @@ public class ClipboardOverlayController {
        final Context displayContext = context.createDisplayContext(getDefaultDisplay());
        mContext = displayContext.createWindowContext(TYPE_SCREENSHOT, null);

        mUiEventLogger = uiEventLogger;
        mClipboardLogger = new ClipboardLogger(uiEventLogger);

        mAccessibilityManager = AccessibilityManager.getInstance(mContext);
        mTextClassifier = requireNonNull(context.getSystemService(TextClassificationManager.class))
@@ -231,7 +232,7 @@ public class ClipboardOverlayController {

            @Override
            public void onSwipeDismissInitiated(Animator animator) {
                mUiEventLogger.log(CLIPBOARD_OVERLAY_SWIPE_DISMISSED);
                mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_SWIPE_DISMISSED);
                mExitAnimator = animator;
            }

@@ -249,7 +250,7 @@ public class ClipboardOverlayController {
        });

        mDismissButton.setOnClickListener(view -> {
            mUiEventLogger.log(CLIPBOARD_OVERLAY_DISMISS_TAPPED);
            mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_DISMISS_TAPPED);
            animateOut();
        });

@@ -285,7 +286,8 @@ public class ClipboardOverlayController {
                                int newDisplayId) {
                            if (mContext.getResources().getConfiguration().orientation
                                    != mOrientation) {
                                mUiEventLogger.log(CLIPBOARD_OVERLAY_DISMISSED_OTHER);
                                mClipboardLogger.logSessionComplete(
                                        CLIPBOARD_OVERLAY_DISMISSED_OTHER);
                                hideImmediate();
                            }
                        }
@@ -300,7 +302,7 @@ public class ClipboardOverlayController {
        });

        mTimeoutHandler.setOnTimeoutRunnable(() -> {
            mUiEventLogger.log(CLIPBOARD_OVERLAY_TIMED_OUT);
            mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_TIMED_OUT);
            animateOut();
        });

@@ -308,7 +310,7 @@ public class ClipboardOverlayController {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
                    mUiEventLogger.log(CLIPBOARD_OVERLAY_DISMISSED_OTHER);
                    mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_DISMISSED_OTHER);
                    animateOut();
                }
            }
@@ -320,7 +322,7 @@ public class ClipboardOverlayController {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (SCREENSHOT_ACTION.equals(intent.getAction())) {
                    mUiEventLogger.log(CLIPBOARD_OVERLAY_DISMISSED_OTHER);
                    mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_DISMISSED_OTHER);
                    animateOut();
                }
            }
@@ -390,7 +392,7 @@ public class ClipboardOverlayController {
                    mContext.getString(R.string.clipboard_send_nearby_description));
            mRemoteCopyChip.setVisibility(View.VISIBLE);
            mRemoteCopyChip.setOnClickListener((v) -> {
                mUiEventLogger.log(CLIPBOARD_OVERLAY_REMOTE_COPY_TAPPED);
                mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_REMOTE_COPY_TAPPED);
                mContext.startActivity(remoteCopyIntent);
                animateOut();
            });
@@ -450,7 +452,7 @@ public class ClipboardOverlayController {
        chip.setContentDescription(action.getTitle());
        chip.setIcon(action.getIcon(), false);
        chip.setPendingIntent(action.getActionIntent(), () -> {
            mUiEventLogger.log(CLIPBOARD_OVERLAY_ACTION_TAPPED);
            mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_ACTION_TAPPED);
            animateOut();
        });
        chip.setAlpha(1);
@@ -486,7 +488,7 @@ public class ClipboardOverlayController {
                        touchRegion.op(tmpRect, Region.Op.UNION);
                        if (!touchRegion.contains(
                                (int) motionEvent.getRawX(), (int) motionEvent.getRawY())) {
                            mUiEventLogger.log(CLIPBOARD_OVERLAY_TAP_OUTSIDE);
                            mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_TAP_OUTSIDE);
                            animateOut();
                        }
                    }
@@ -497,7 +499,7 @@ public class ClipboardOverlayController {
    }

    private void editImage(Uri uri) {
        mUiEventLogger.log(CLIPBOARD_OVERLAY_EDIT_TAPPED);
        mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_EDIT_TAPPED);
        String editorPackage = mContext.getString(R.string.config_screenshotEditor);
        Intent editIntent = new Intent(Intent.ACTION_EDIT);
        if (!TextUtils.isEmpty(editorPackage)) {
@@ -512,7 +514,7 @@ public class ClipboardOverlayController {
    }

    private void editText() {
        mUiEventLogger.log(CLIPBOARD_OVERLAY_EDIT_TAPPED);
        mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_EDIT_TAPPED);
        Intent editIntent = new Intent(mContext, EditTextActivity.class);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        mContext.startActivity(editIntent);
@@ -520,7 +522,7 @@ public class ClipboardOverlayController {
    }

    private void shareContent(ClipData clip) {
        mUiEventLogger.log(CLIPBOARD_OVERLAY_SHARE_TAPPED);
        mClipboardLogger.logSessionComplete(CLIPBOARD_OVERLAY_SHARE_TAPPED);
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, clip.getItemAt(0).getText().toString());
        shareIntent.setDataAndType(
@@ -864,6 +866,7 @@ public class ClipboardOverlayController {
        mRemoteCopyChip.setVisibility(View.GONE);
        resetActionChips();
        mTimeoutHandler.cancelTimeout();
        mClipboardLogger.reset();
    }

    @MainThread
@@ -969,4 +972,24 @@ public class ClipboardOverlayController {
            mWindowManager.updateViewLayout(decorView, mWindowLayoutParams);
        }
    }

    static class ClipboardLogger {
        private final UiEventLogger mUiEventLogger;
        private boolean mGuarded = false;

        ClipboardLogger(UiEventLogger uiEventLogger) {
            mUiEventLogger = uiEventLogger;
        }

        void logSessionComplete(@NonNull UiEventLogger.UiEventEnum event) {
            if (!mGuarded) {
                mGuarded = true;
                mUiEventLogger.log(event);
            }
        }

        void reset() {
            mGuarded = false;
        }
    }
}