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

Commit 3bf1ea36 authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Fix logging for successive screenshots

When two screenshots are taken in quick succession, we don't show
UI for the first one (but do still continue the task for saving
the screenshot in the background). However, the logging was done
as part of the UI flow, meaning that we currently don't log when
the first screenshot is saved.

This change fixes the logic flow so that we log success/failure of
the saving task in all cases, but only show UI for the last
successive screenshot.

Bug: 157244123
Fix: 157244123
Test: manual; tested that we don't see the log before the fix and
do after

Change-Id: I7646f4a3cb6cfd0f903472e101fb385cef58ddea
parent 12416fba
Loading
Loading
Loading
Loading
+58 −38
Original line number Diff line number Diff line
@@ -431,7 +431,13 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
        data.createDeleteAction = false;

        if (mSaveInBgTask != null) {
            mSaveInBgTask.ignoreResult();
            // just log success/failure for the pre-existing screenshot
            mSaveInBgTask.setActionsReadyListener(new ActionsReadyListener() {
                @Override
                void onActionsReady(SavedImageData imageData) {
                    logSuccessOnActionsReady(imageData);
                }
            });
        }

        mSaveInBgTask = new SaveImageInBackgroundTask(mContext, data);
@@ -637,43 +643,24 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
    }

    /**
     * Starts the animation after taking the screenshot
     * Sets up the action shade and its entrance animation, once we get the screenshot URI.
     */
    private void startAnimation(final Consumer<Uri> finisher, int w, int h,
            @Nullable Rect screenRect) {
        // If power save is on, show a toast so there is some visual indication that a
        // screenshot has been taken.
        PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        if (powerManager.isPowerSaveMode()) {
            Toast.makeText(mContext, R.string.screenshot_saved_title, Toast.LENGTH_SHORT).show();
        }

        mScreenshotAnimation = createScreenshotDropInAnimation(w, h, screenRect);

        saveScreenshotInWorkerThread(finisher, new ActionsReadyListener() {
            @Override
            void onActionsReady(SavedImageData imageData) {
                finisher.accept(imageData.uri);
                if (imageData.uri == null) {
                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED);
                    mNotificationsController.notifyScreenshotError(
                            R.string.screenshot_failed_to_capture_text);
                } else {
                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED);
    private void showUiOnActionsReady(SavedImageData imageData) {
        logSuccessOnActionsReady(imageData);
        if (imageData.uri != null) {
            mScreenshotHandler.post(() -> {
                if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) {
                            mScreenshotAnimation.addListener(
                                    new AnimatorListenerAdapter() {
                    mScreenshotAnimation.addListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            super.onAnimationEnd(animation);
                                            createScreenshotActionsShadeAnimation(imageData)
                                                    .start();
                            createScreenshotActionsShadeAnimation(imageData).start();
                        }
                    });
                } else {
                    createScreenshotActionsShadeAnimation(imageData).start();
                }

                AccessibilityManager accessibilityManager = (AccessibilityManager)
                        mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
                long timeoutMs = accessibilityManager.getRecommendedTimeoutMillis(
@@ -687,6 +674,39 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset
            });
        }
    }

    /**
     * Logs success/failure of the screenshot saving task, and shows an error if it failed.
     */
    private void logSuccessOnActionsReady(SavedImageData imageData) {
        if (imageData.uri == null) {
            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED);
            mNotificationsController.notifyScreenshotError(
                    R.string.screenshot_failed_to_capture_text);
        } else {
            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED);
        }
    }

    /**
     * Starts the animation after taking the screenshot
     */
    private void startAnimation(final Consumer<Uri> finisher, int w, int h,
            @Nullable Rect screenRect) {
        // If power save is on, show a toast so there is some visual indication that a
        // screenshot has been taken.
        PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        if (powerManager.isPowerSaveMode()) {
            Toast.makeText(mContext, R.string.screenshot_saved_title, Toast.LENGTH_SHORT).show();
        }

        mScreenshotAnimation = createScreenshotDropInAnimation(w, h, screenRect);

        saveScreenshotInWorkerThread(finisher, new ActionsReadyListener() {
                    @Override
                    void onActionsReady(SavedImageData imageData) {
                        showUiOnActionsReady(imageData);
                    }
                });
        mScreenshotHandler.post(() -> {
            if (!mScreenshotLayout.isAttachedToWindow()) {
+6 −9
Original line number Diff line number Diff line
@@ -215,6 +215,7 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
            mImageData.deleteAction = createDeleteAction(mContext, mContext.getResources(), uri);

            mParams.mActionsReadyListener.onActionsReady(mImageData);
            mParams.finisher.accept(mImageData.uri);
            mParams.image = null;
            mParams.errorMsgResId = 0;
        } catch (Exception e) {
@@ -225,22 +226,18 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
            mParams.errorMsgResId = R.string.screenshot_failed_to_save_text;
            mImageData.reset();
            mParams.mActionsReadyListener.onActionsReady(mImageData);
            mParams.finisher.accept(null);
        }

        return null;
    }

    /**
     * If we get a new screenshot request while this one is saving, we want to continue saving in
     * the background but not return anything.
     * Update the listener run when the saving task completes. Used to avoid showing UI for the
     * first screenshot when a second one is taken.
     */
    void ignoreResult() {
        mParams.mActionsReadyListener = new GlobalScreenshot.ActionsReadyListener() {
            @Override
            void onActionsReady(GlobalScreenshot.SavedImageData imageData) {
                // do nothing
            }
        };
    void setActionsReadyListener(GlobalScreenshot.ActionsReadyListener listener) {
        mParams.mActionsReadyListener = listener;
    }

    @Override