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

Commit 122841e3 authored by Maryam Dehaini's avatar Maryam Dehaini Committed by Android (Google) Code Review
Browse files

Merge "Remove captured link expiration" into main

parents a970ef3b 23ce612e
Loading
Loading
Loading
Loading
+12 −19
Original line number Diff line number Diff line
@@ -127,7 +127,6 @@ import java.util.function.Supplier;
 */
public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLinearLayout> {
    private static final String TAG = "DesktopModeWindowDecoration";
    private static final int CAPTURED_LINK_TIMEOUT_MS = 7000;

    @VisibleForTesting
    static final long CLOSE_MAXIMIZE_MENU_DELAY_MS = 150L;
@@ -199,7 +198,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
    // being hovered. There's a small delay after stopping the hover, to allow a quick reentry
    // to cancel the close.
    private final Runnable mCloseMaximizeWindowRunnable = this::closeMaximizeMenu;
    private final Runnable mCapturedLinkExpiredRunnable = this::onCapturedLinkExpired;
    private final MultiInstanceHelper mMultiInstanceHelper;
    private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository;
    private final DesktopUserRepositories mDesktopUserRepositories;
@@ -548,22 +546,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
            return;
        }
        mCapturedLink = new CapturedLink(capturedLink, timeStamp);
        mHandler.postDelayed(mCapturedLinkExpiredRunnable, CAPTURED_LINK_TIMEOUT_MS);
    }

    private void onCapturedLinkExpired() {
        mHandler.removeCallbacks(mCapturedLinkExpiredRunnable);
        if (mCapturedLink != null) {
            mCapturedLink.setExpired();
        }
    }

    @Nullable
    private Intent getBrowserLink() {
        final Uri browserLink;
        // If the captured link is available and has not expired, return the captured link.
        // Otherwise, return the generic link which is set to null if a generic link is unavailable.
        if (mCapturedLink != null && !mCapturedLink.mExpired) {
        if (isCapturedLinkAvailable()) {
            browserLink = mCapturedLink.mUri;
        } else if (mWebUri != null) {
            browserLink = mWebUri;
@@ -675,7 +663,13 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
    }

    private boolean isCapturedLinkAvailable() {
        return mCapturedLink != null && !mCapturedLink.mExpired;
        return mCapturedLink != null && !mCapturedLink.mUsed;
    }

    private void onCapturedLinkUsed() {
        if (mCapturedLink != null) {
            mCapturedLink.setUsed();
        }
    }

    private void notifyNoCaptionHandle() {
@@ -1365,7 +1359,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
                /* onAspectRatioSettingsClickListener= */ mOnChangeAspectRatioClickListener,
                /* openInBrowserClickListener= */ (intent) -> {
                    mOpenInBrowserClickListener.accept(intent);
                    onCapturedLinkExpired();
                    onCapturedLinkUsed();
                    if (Flags.enableDesktopWindowingAppToWebEducationIntegration()) {
                        mWindowDecorCaptionHandleRepository.onAppToWebUsage();
                    }
@@ -1796,16 +1790,15 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
    static class CapturedLink {
        private final long mTimeStamp;
        private final Uri mUri;
        private boolean mExpired;
        private boolean mUsed;

        CapturedLink(@NonNull Uri uri, long timeStamp) {
            mUri = uri;
            mTimeStamp = timeStamp;
            mExpired = false;
        }

        void setExpired() {
            mExpired = true;
        private void setUsed() {
            mUsed = true;
        }
    }

+19 −47
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
@@ -1325,25 +1324,6 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
        verifyHandleMenuCreated(TEST_URI1);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
    public void capturedLink_postsOnCapturedLinkExpiredRunnable() {
        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
        final DesktopModeWindowDecoration decor = createWindowDecoration(
                taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
                null /* generic link */);
        final ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class);

        // Run runnable to set captured link to expired
        verify(mMockHandler).postDelayed(runnableArgument.capture(), anyLong());
        runnableArgument.getValue().run();

        // Verify captured link is no longer valid by verifying link is not set as handle menu
        // browser link.
        createHandleMenu(decor);
        verifyHandleMenuCreated(null /* uri */);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
    public void capturedLink_capturedLinkNotResetToSameLink() {
@@ -1351,44 +1331,36 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase {
        final DesktopModeWindowDecoration decor = createWindowDecoration(
                taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
                null /* generic link */);
        final ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class);
        final ArgumentCaptor<Function1<Intent, Unit>> openInBrowserCaptor =
                ArgumentCaptor.forClass(Function1.class);

        // Run runnable to set captured link to expired
        verify(mMockHandler).postDelayed(runnableArgument.capture(), anyLong());
        runnableArgument.getValue().run();
        createHandleMenu(decor);
        verify(mMockHandleMenu).show(any(),
                any(),
                any(),
                any(),
                any(),
                any(),
                openInBrowserCaptor.capture(),
                any(),
                any(),
                any(),
                anyBoolean()
        );
        // Run runnable to set captured link to used
        openInBrowserCaptor.getValue().invoke(new Intent(Intent.ACTION_MAIN, TEST_URI1));

        // Relayout decor with same captured link
        decor.relayout(taskInfo, true /* hasGlobalFocus */, mExclusionRegion);

        // Verify handle menu's browser link not set to captured link since link is expired
        // Verify handle menu's browser link not set to captured link since link is already used
        createHandleMenu(decor);
        verifyHandleMenuCreated(null /* uri */);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
    public void capturedLink_capturedLinkStillUsedIfExpiredAfterHandleMenuCreation() {
        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
        final DesktopModeWindowDecoration decor = createWindowDecoration(
                taskInfo, TEST_URI1 /* captured link */, null /* web uri */,
                null /* generic link */);
        final ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class);

        // Create handle menu before link expires
        createHandleMenu(decor);

        // Run runnable to set captured link to expired
        verify(mMockHandler).postDelayed(runnableArgument.capture(), anyLong());
        runnableArgument.getValue().run();

        // Verify handle menu's browser link is set to captured link since menu was opened before
        // captured link expired
        verifyHandleMenuCreated(TEST_URI1);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_TO_WEB)
    public void capturedLink_capturedLinkExpiresAfterClick() {
    public void capturedLink_capturedLinkSetToUsedAfterClick() {
        final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(true /* visible */);
        final DesktopModeWindowDecoration decor = createWindowDecoration(
                taskInfo, TEST_URI1 /* captured link */, null /* web uri */,