From c15869e3199fbfefeaf317a40004f0e0b508b528 Mon Sep 17 00:00:00 2001 From: 7015725 Date: Fri, 22 May 2026 03:24:12 +0800 Subject: [PATCH] fix: restore stable color picker overlay --- code/th_14_panels.js | 121 +++---------------------------------------- manifest.json | 6 +-- manifest.sig | 2 +- 3 files changed, 12 insertions(+), 117 deletions(-) diff --git a/code/th_14_panels.js b/code/th_14_panels.js index a0c8a2c..9cb4fcd 100644 --- a/code/th_14_panels.js +++ b/code/th_14_panels.js @@ -4755,11 +4755,8 @@ FloatBallAppWM.prototype.showPopupOverlay = function(opts) { var wm = this.state.wm; var root = new android.widget.FrameLayout(context); - var overlayBaseAlpha = isDark ? 0.58 : 0.42; - root.setBackgroundColor(self.withAlpha(isDark ? 0xFF000000 : 0xFFFFFFFF, overlayBaseAlpha)); + root.setBackgroundColor(self.withAlpha(isDark ? 0xFF000000 : 0xFFFFFFFF, isDark ? 0.58 : 0.42)); root.setClickable(true); - root.setFocusable(true); - root.setFocusableInTouchMode(true); var card = new android.widget.LinearLayout(context); card.setOrientation(android.widget.LinearLayout.VERTICAL); @@ -4787,31 +4784,19 @@ FloatBallAppWM.prototype.showPopupOverlay = function(opts) { }); closeBtn.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 18); closeBtn.setTypeface(null, android.graphics.Typeface.BOLD); - closeBtn.setGravity(android.view.Gravity.CENTER); - closeBtn.setMinWidth(self.dp(48)); - closeBtn.setMinHeight(self.dp(42)); - closeBtn.setClickable(true); - closeBtn.setPadding(0, 0, 0, 0); try { closeBtn.setBackground(self.ui.createStrokeDrawable(T.primarySoft, self.withAlpha(T.primaryDeep, isDark ? 0.30 : 0.22), self.dp(1), self.dp(18))); } catch(eCloseBg) {} - header.addView(closeBtn, new android.widget.LinearLayout.LayoutParams(self.dp(48), self.dp(42))); + header.addView(closeBtn, new android.widget.LinearLayout.LayoutParams(self.dp(42), self.dp(38))); card.addView(header); - var scroll = new android.widget.ScrollView(context); - scroll.setFillViewport(false); - try { scroll.setOverScrollMode(android.view.View.OVER_SCROLL_IF_CONTENT_SCROLLS); } catch(eScrollMode) {} var content = new android.widget.LinearLayout(context); content.setOrientation(android.widget.LinearLayout.VERTICAL); - content.setPadding(0, self.dp(8), 0, self.dp(6)); - scroll.addView(content, new android.widget.ScrollView.LayoutParams( - android.widget.ScrollView.LayoutParams.MATCH_PARENT, - android.widget.ScrollView.LayoutParams.WRAP_CONTENT - )); + content.setPadding(0, self.dp(8), 0, 0); var contentLp = new android.widget.LinearLayout.LayoutParams( android.widget.LinearLayout.LayoutParams.MATCH_PARENT, - 0 + android.widget.LinearLayout.LayoutParams.MATCH_PARENT ); - contentLp.weight = 1; - card.addView(scroll, contentLp); + content.setLayoutParams(contentLp); + card.addView(content); root.addView(card); @@ -4836,110 +4821,20 @@ FloatBallAppWM.prototype.showPopupOverlay = function(opts) { lp.softInputMode = android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING | android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN; - var popupClosed = false; - var backDispatcher = null; - var backCallback = null; - - function applyPopupBackProgress(progress, edge) { - try { - var p = Number(progress || 0); - if (isNaN(p)) p = 0; - if (p < 0) p = 0; - if (p > 1) p = 1; - var eased = 1 - Math.pow(1 - p, 2.0); - var dir = Number(edge) === 1 ? -1 : 1; - card.setTranslationX(dir * self.dp(72) * eased); - card.setAlpha(1.0 - 0.18 * eased); - var scale = 1.0 - 0.035 * eased; - card.setScaleX(scale); - card.setScaleY(scale); - root.setAlpha(1.0 - 0.28 * eased); - } catch(eProg) { safeLog(self.L, 'w', "popup back progress fail: " + String(eProg)); } - } - - function resetPopupBackVisual() { - try { - card.animate().cancel(); - root.animate().cancel(); - card.animate().translationX(0).alpha(1).scaleX(1).scaleY(1).setDuration(160).setInterpolator(new android.view.animation.DecelerateInterpolator()).start(); - root.animate().alpha(1).setDuration(160).setInterpolator(new android.view.animation.DecelerateInterpolator()).start(); - } catch(eReset) { - try { card.setTranslationX(0); card.setAlpha(1); card.setScaleX(1); card.setScaleY(1); root.setAlpha(1); } catch(eReset2) {} - } - } - - function unregisterPopupBack() { - try { if (backDispatcher && backCallback) backDispatcher.unregisterOnBackInvokedCallback(backCallback); } catch(eUnreg) {} - backDispatcher = null; - backCallback = null; - } + try { wm.addView(root, lp); } catch(eAdd) { safeLog(self.L, 'e', "popup addView fail: " + String(eAdd)); return null; } function closePopup() { - if (popupClosed) return; - popupClosed = true; - unregisterPopupBack(); try { wm.removeView(root); } catch(e) { safeLog(null, 'e', "catch " + String(e)); } if (typeof onDismiss === "function") { try { onDismiss(); } catch(eD) { safeLog(null, 'e', "catch " + String(eD)); } } } - function registerPopupBack() { - try { - root.requestFocus(); - if (android.os.Build.VERSION.SDK_INT >= 33) { - try { backDispatcher = root.findOnBackInvokedDispatcher(); } catch(eFind) { backDispatcher = null; } - if (backDispatcher) { - var cb = null; - var mode = "OnBackInvokedCallback"; - if (android.os.Build.VERSION.SDK_INT >= 34) { - try { - var animCls = java.lang.Class.forName("android.window.OnBackAnimationCallback"); - cb = new JavaAdapter(Packages.android.window.OnBackAnimationCallback, { - onBackStarted: function(event) { var edge = 0; try { edge = Number(event.getSwipeEdge()); } catch(eEdge) {} applyPopupBackProgress(0, edge); }, - onBackProgressed: function(event) { var p = 0; var edge = 0; try { p = Number(event.getProgress()); } catch(eP) {} try { edge = Number(event.getSwipeEdge()); } catch(eEdge2) {} applyPopupBackProgress(p, edge); }, - onBackCancelled: function() { resetPopupBackVisual(); }, - onBackInvoked: function() { closePopup(); } - }); - if (!animCls.isInstance(cb)) { - safeLog(self.L, 'w', "popup OnBackAnimationCallback proxy not instance; fallback final-only"); - cb = null; - } else { mode = "OnBackAnimationCallback"; } - } catch(eAnim) { safeLog(self.L, 'w', "popup create OnBackAnimationCallback fail: " + String(eAnim)); cb = null; } - } - if (!cb) { - var cbCls = java.lang.Class.forName("android.window.OnBackInvokedCallback"); - cb = new JavaAdapter(cbCls, { onBackInvoked: function() { closePopup(); } }); - } - var priority = 0; - try { priority = android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT; } catch(ePri) { priority = 0; } - backDispatcher.registerOnBackInvokedCallback(priority, cb); - backCallback = cb; - safeLog(self.L, 'i', "popup back callback registered mode=" + mode + " priority=" + String(priority)); - } - } - } catch(eBackReg) { safeLog(self.L, 'w', "popup back callback register fail: " + String(eBackReg)); } - } - - root.setOnKeyListener(new JavaAdapter(android.view.View.OnKeyListener, { - onKey: function(v, keyCode, event) { - try { - if (!event) return false; - if (event.getAction() !== android.view.KeyEvent.ACTION_UP) return false; - if (keyCode === android.view.KeyEvent.KEYCODE_BACK || keyCode === android.view.KeyEvent.KEYCODE_ESCAPE) { closePopup(); return true; } - } catch(eKey) { safeLog(self.L, 'w', "popup key back fail: " + String(eKey)); } - return false; - } - })); - - try { wm.addView(root, lp); } catch(eAdd) { safeLog(self.L, 'e', "popup addView fail: " + String(eAdd)); return null; } - try { root.post(new java.lang.Runnable({ run: registerPopupBack })); } catch(ePostBack) { registerPopupBack(); } - if (typeof builder === "function") { try { builder(content, closePopup); } catch(eB) { safeLog(self.L, 'e', "popup builder fail: " + String(eB)); } } - return { close: closePopup, content: content, root: root, card: card }; + return { close: closePopup, content: content }; }; FloatBallAppWM.prototype.showShortXIconPickerPopup = function(opts) { diff --git a/manifest.json b/manifest.json index 740e65e..e98af55 100644 --- a/manifest.json +++ b/manifest.json @@ -54,8 +54,8 @@ "size": 21198 }, "th_14_panels.js": { - "sha256": "75ffeb41de6bda8c22ee68b61299b4821b8344d416bdac7f1471eb420bae8205", - "size": 295981 + "sha256": "39dfa96ac08f9bd67381b2d98b3019f9a4f86d663887d91917bf9b8ddcc112b2", + "size": 290958 }, "th_15_extra.js": { "sha256": "11a9866ba156c2a7862633530eb0d796a9955698a0c3fad4199dcccd4bb27c47", @@ -68,5 +68,5 @@ }, "keyId": "toolhub-targets-2026-rsa3072", "schema": 2, - "version": 20260521191529 + "version": 20260521192350 } diff --git a/manifest.sig b/manifest.sig index 62d1c00..1b06f22 100644 --- a/manifest.sig +++ b/manifest.sig @@ -1 +1 @@ -Pa5x3nJGOpVKBXL/R2Z8dBxlCDXP+Qb4mTLRpZ4aOsEg2s3VANGy2XtxxL41kvQp6Qsltlx6E6p20sAn78xbEc/uQCLz+LWeYExvurVLf5B4WRYevhiMobdg21x0mXss50mhJqAOJF3oxQl7yGyupPA9oORVbxk9TwbbvmAx+d9zLXnX1Ayf5g3SPJI6i4vp+oIfJIEEPKiCxBKjaIKI4Gpnmn5N7zzKSbk0FGCO9aosQ9d1l1T2owdY0zlCj+9zsyx2MnkqJpI6sCjfHiJGuFd3hPepAfHL+BS/lnBHJnLdIA23WU7ARirn4fpceLrflWhQIOChs9tl87f2mQG5N2AnOlgIFyH0cpaABZs100cNzwjlDFi+9yzIED0SoWwFLz3vJxOcfEHW4XpOYEImmiOuYwM+hpjglawiw+KTMFgj6Z1VSStfjLf+samDkv4uh6lA9tb+G6oVagqU9MZjKJUYvQR9oWAVTXVS3/EljO/suP6K8bD6/kMcnrmcPJJO +HK+q5fbdIDSfXIEcYdEijX81pNwIcEKx8DF8C6BKNpTQLSvVCTrRzITgIBoub0lrHoF0UZNOEFlPCuQb36azjGWYFQ7GYXCP3gJ273mCdNUBXQbqHQXdoeFpKmeaGqEm/BBbdxXcGqjsPRPqk0tby1TsRNSNEaGfwlSfPjmVwdIOg+7pIjTiXkr+kgoHswzNzliey9Ev6J4GX7aLywKM0/cVJ+58bm4vS/WAlocsvxwEJTFZcKrF3ZLri1S8kn6PDFTLj6CEnRBw7mN76lV7ceGSwJ4jFGGbdGNshEORoKdN3B1W3xPzHujgGAKfzeq3An+V5kCMWdQJGjZOM7xfGXfa8Ku9EpWAFsNyGQFhQtUMyRuiMD9po7OoU9oCPRGNQRU0NqDgyUnNpT1JL66QaON387wFQk3RZAg9gpcE6k9smAJSJ3o44pfSxyrlAl6U0iqS8/NvFKWect15q68CvAu+/NwmenWC85mRbdMts7B3yfJivKZo/aT2LfBHCx4M