Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +12 −19 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -1365,7 +1359,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin /* onAspectRatioSettingsClickListener= */ mOnChangeAspectRatioClickListener, /* openInBrowserClickListener= */ (intent) -> { mOpenInBrowserClickListener.accept(intent); onCapturedLinkExpired(); onCapturedLinkUsed(); if (Flags.enableDesktopWindowingAppToWebEducationIntegration()) { mWindowDecorCaptionHandleRepository.onAppToWebUsage(); } Loading Loading @@ -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; } } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +19 −47 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading @@ -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 */, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +12 −19 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -1365,7 +1359,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin /* onAspectRatioSettingsClickListener= */ mOnChangeAspectRatioClickListener, /* openInBrowserClickListener= */ (intent) -> { mOpenInBrowserClickListener.accept(intent); onCapturedLinkExpired(); onCapturedLinkUsed(); if (Flags.enableDesktopWindowingAppToWebEducationIntegration()) { mWindowDecorCaptionHandleRepository.onAppToWebUsage(); } Loading Loading @@ -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; } } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +19 −47 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading @@ -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 */, Loading