From 56b40ba99c204353c9c3823b00647ede17a88e06 Mon Sep 17 00:00:00 2001 From: haanhvu Date: Sat, 8 Feb 2025 19:10:35 +0700 Subject: [PATCH] Add full screen mode feature for 2D browsing This commit adds a Fullscreen item in the hamburger menu to set the current window in the fullscreen mode. The commit also enables three edge cases: - When users sets fullscreen mode, go into a fullscreen video, exit fullscreen video, the fullscreen mode is reserved. - When users sets fullscreen mode, opens a new tab, that tab is opened in fullscreen mode too. - When exitFullScreenMode() is called (e.g., in onPause()), fullscreen mode is exited correctly. Fixes Igalia#1494 --- .../ui/widgets/NavigationBarWidget.java | 16 +++++++++++ .../wolvic/ui/widgets/WindowWidget.java | 27 +++++++++++++++++++ .../com/igalia/wolvic/ui/widgets/Windows.java | 6 +++++ .../ui/widgets/menus/HamburgerMenuWidget.java | 13 +++++++++ app/src/main/res/values/strings.xml | 4 +++ 5 files changed, 66 insertions(+) diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java index 4b1fc2ad50..0cfa320751 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/NavigationBarWidget.java @@ -367,6 +367,12 @@ private void updateUI() { if (mAttachedWindow != null) { mAttachedWindow.setIsFullScreen(false); } + if (mAttachedWindow.getKeepFullscreenInHamburgerMenu()) { + postDelayed(() -> { + mAttachedWindow.setIsFullScreen(true); + mAttachedWindow.setKeepFullscreenInHamburgerMenu(false); + }, 2000); + } if (mAudio != null) { mAudio.playSound(AudioEngine.Sound.CLICK); } @@ -792,6 +798,11 @@ private void exitFullScreenMode() { if (getSession().isInFullScreen()) { getSession().exitFullScreen(); } + if (mAttachedWindow.getKeepFullscreenInHamburgerMenu()) { + mAttachedWindow.setIsFullScreen(false); + mAttachedWindow.setFullscreenInHamburgerMenuEnabled(false); + mAttachedWindow.setKeepFullscreenInHamburgerMenu(false); + } }, 50); mWidgetManager.updateWidget(mAttachedWindow); @@ -1358,6 +1369,11 @@ public void onResize() { enterResizeMode(); } + @Override + public void onFullScreen() { + mAttachedWindow.setFullscreenInHamburgerMenu(); + } + @Override public void onPassthrough() { mWidgetManager.togglePassthrough(); diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java index a649d365ad..5cb3e127b9 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java @@ -155,6 +155,8 @@ public class WindowWidget extends UIWidget implements SessionChangeListener, private SharedPreferences mPrefs; private DownloadsManager mDownloadsManager; private float mBrowserDensity; + private boolean fullscreenInHamburgerMenuEnabled; + private boolean keepFullscreenInHamburgerMenu; public interface WindowListener { default void onFocusRequest(@NonNull WindowWidget aWindow) {} @@ -966,7 +968,16 @@ public boolean isResizing() { return mIsResizing; } + public void setFullscreenInHamburgerMenu() { + setIsFullScreen(true); + setFullscreenInHamburgerMenuEnabled(true); + } + public void setIsFullScreen(boolean isFullScreen) { + if (isFullScreen && fullscreenInHamburgerMenuEnabled) { + keepFullscreenInHamburgerMenu = true; + } + if (mViewModel.getIsFullscreen().getValue().get() != isFullScreen) { mViewModel.setIsFullscreen(isFullScreen); for (WindowListener listener: mListeners) { @@ -2367,4 +2378,20 @@ private float getBrowserDensity() { } return mBrowserDensity; } + + public boolean getFullscreenInHamburgerMenuEnabled() { + return fullscreenInHamburgerMenuEnabled; + } + + public void setFullscreenInHamburgerMenuEnabled(boolean fullscreenInHamburgerMenuEnabled) { + this.fullscreenInHamburgerMenuEnabled = fullscreenInHamburgerMenuEnabled; + } + + public boolean getKeepFullscreenInHamburgerMenu() { + return keepFullscreenInHamburgerMenu; + } + + public void setKeepFullscreenInHamburgerMenu(boolean keepFullscreenInHamburgerMenu) { + this.keepFullscreenInHamburgerMenu = keepFullscreenInHamburgerMenu; + } } diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java index 04d405dc5b..705683802f 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java @@ -1771,6 +1771,12 @@ public void showTabAddedNotification() { } } + if (mFocusedWindow.getFullscreenInHamburgerMenuEnabled()) { + mFocusedWindow.postDelayed(() -> { + mFocusedWindow.setIsFullScreen(true); + mFocusedWindow.setKeepFullscreenInHamburgerMenu(false); + }, 2000); + } } public void showTabSentNotification() { diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/menus/HamburgerMenuWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/menus/HamburgerMenuWidget.java index 3cf3266b2e..5dab59bdf0 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/menus/HamburgerMenuWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/menus/HamburgerMenuWidget.java @@ -55,6 +55,7 @@ public interface MenuDelegate { void onPageZoomIn(); void onPageZoomOut(); int getCurrentZoomLevel(); + void onFullScreen(); } public static final int SWITCH_ITEM_ID = 0; @@ -189,6 +190,18 @@ private void updateItems() { // In kiosk mode, only resize, find in page and passthrough are available. if (!mWidgetManager.getFocusedWindow().isKioskMode()) { + mItems.add(new HamburgerMenuAdapter.MenuItem.Builder( + HamburgerMenuAdapter.MenuItem.TYPE_DEFAULT, + (menuItem) -> { + if (mDelegate != null) { + mDelegate.onFullScreen(); + } + return null; + }) + .withTitle(getContext().getString(R.string.hamburger_menu_fullscreen)) + .withIcon(R.drawable.fullscreen_button) + .build()); + final Session activeSession = SessionStore.get().getActiveSession(); if (!BuildConfig.FLAVOR_backend.equals("chromium")) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48a18f0a2b..f141851016 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2089,6 +2089,10 @@ the Select` button. When clicked it bookmarks all the previously selected tabs - it saves the Web App provided by the current page --> Save Web app… + + Fullscreen + Menu