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

Commit 23ce612e authored by Maryam Dehaini's avatar Maryam Dehaini
Browse files

Remove captured link expiration

Captured link should no longer expire after 7 seconds.

Bug: 349695493
Test: Use open in browser button in header menu after clicking on link
Flag: com.android.window.flags.enable_desktop_windowing_app_to_web

Change-Id: I54168b654904b572404c08edb694a7239c55550c
parent badee29d
Loading
Loading
Loading
Loading
+12 −19
Original line number Diff line number Diff line
@@ -128,7 +128,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;
@@ -203,7 +202,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;
@@ -625,22 +623,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;
@@ -752,7 +740,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() {
@@ -1434,7 +1428,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
                /* onAspectRatioSettingsClickListener= */ mOnChangeAspectRatioClickListener,
                /* openInBrowserClickListener= */ (intent) -> {
                    mOpenInBrowserClickListener.accept(intent);
                    onCapturedLinkExpired();
                    onCapturedLinkUsed();
                    if (Flags.enableDesktopWindowingAppToWebEducationIntegration()) {
                        mWindowDecorCaptionHandleRepository.onAppToWebUsage();
                    }
@@ -1866,16 +1860,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
@@ -38,7 +38,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;
@@ -1291,25 +1290,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() {
@@ -1317,44 +1297,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 */,