From ba80e9749ef3d6fe0a8fd5aad977677b41a36e37 Mon Sep 17 00:00:00 2001 From: Andrew Gunnerson Date: Mon, 15 Jun 2026 02:15:15 -0400 Subject: [PATCH] WebUiScreen: Close dropdown menus with back button This has highest priority, followed by modals, WebView history, and finally the Activity. Signed-off-by: Andrew Gunnerson --- .../chiller3/basicsync/settings/WebUiScreen.kt | 16 ++++++++++++++-- app/src/main/res/raw/webview_bridge.js | 18 +++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/chiller3/basicsync/settings/WebUiScreen.kt b/app/src/main/java/com/chiller3/basicsync/settings/WebUiScreen.kt index 39872b4..63a0868 100644 --- a/app/src/main/java/com/chiller3/basicsync/settings/WebUiScreen.kt +++ b/app/src/main/java/com/chiller3/basicsync/settings/WebUiScreen.kt @@ -141,16 +141,23 @@ fun WebUiScreen(onExit: () -> Unit) { webView.evaluateJavascript("bridgeInit($isTv);") {} } + fun closeAllDropdowns() { + webView.evaluateJavascript("closeAllDropdowns();") {} + } + fun closeTopModal() { webView.evaluateJavascript("closeTopModal();") {} } + var dropdownsOpen by remember { mutableIntStateOf(0) } var modalsOpen by remember { mutableIntStateOf(0) } var hasBrowserHistory by remember { mutableStateOf(false) } BackHandler( - enabled = modalsOpen > 0 || hasBrowserHistory, + enabled = dropdownsOpen > 0 || modalsOpen > 0 || hasBrowserHistory, onBack = { - if (modalsOpen > 0) { + if (dropdownsOpen > 0) { + closeAllDropdowns() + } else if (modalsOpen > 0) { closeTopModal() } else if (hasBrowserHistory) { webView.goBack() @@ -206,6 +213,11 @@ fun WebUiScreen(onExit: () -> Unit) { requestQrScanner.launch(Intent(context, QrScannerActivity::class.java)) } + @JavascriptInterface + fun onDropdownsOpenChanged(count: Int) { + dropdownsOpen = count + } + @JavascriptInterface fun onModalsOpenChanged(count: Int) { modalsOpen = count diff --git a/app/src/main/res/raw/webview_bridge.js b/app/src/main/res/raw/webview_bridge.js index 802e566..770287d 100644 --- a/app/src/main/res/raw/webview_bridge.js +++ b/app/src/main/res/raw/webview_bridge.js @@ -182,6 +182,10 @@ function onDeviceIdScanned(deviceId) { elemDeviceId.dispatchEvent(new InputEvent('input')); } +function closeAllDropdowns() { + $('.dropdown.open > .dropdown-toggle').dropdown('toggle'); +} + function closeTopModal() { const modals = document.getElementsByClassName('modal'); var topModal = null; @@ -223,6 +227,18 @@ function bridgeInit(isTv) { }); } + var dropdownsOpen = 0; + + $(document).on('shown.bs.dropdown', function (e) { + dropdownsOpen++; + BasicSync.onDropdownsOpenChanged(dropdownsOpen); + }); + + $(document).on('hidden.bs.dropdown', function (e) { + dropdownsOpen--; + BasicSync.onDropdownsOpenChanged(dropdownsOpen); + }); + var modalsOpen = 0; $(document).on('shown.bs.modal', function (e) { @@ -282,7 +298,7 @@ function bridgeInit(isTv) { * possible to scroll the menus by scrolling the page itself. We have to make the menus * individually scrollable instead. */ - .dropdown-menu { + .navbar-fixed-top .dropdown-menu { column-count: auto !important; height: unset !important; /* Roughly the amount of free space excluding insets and nav bar. */