diff --git a/code/th_09_animation.js b/code/th_09_animation.js index c6ebb2c..7504ec2 100644 --- a/code/th_09_animation.js +++ b/code/th_09_animation.js @@ -425,8 +425,12 @@ FloatBallAppWM.prototype.registerPanelPredictiveBack = function(panel, which) { var usedAnimation = false; if (android.os.Build.VERSION.SDK_INT >= 34) { try { + // 关键:不要只把 Class.forName() 的 Class 对象传给 JavaAdapter。 + // 在部分 ColorOS/Rhino 组合里这样会被系统识别成普通 OnBackInvokedCallback,log 里表现为 mIsAnimationCallback=false。 + // 先 forName 预热,再用 Packages.android.window.OnBackAnimationCallback 这个接口对象创建代理,确保 instanceof 命中。 var animCls = java.lang.Class.forName("android.window.OnBackAnimationCallback"); - cb = new JavaAdapter(animCls, { + var animIface = Packages.android.window.OnBackAnimationCallback; + cb = new JavaAdapter(animIface, { onBackStarted: function(event) { self.applyPanelPredictiveBackProgress(panel, event); }, onBackProgressed: function(event) { self.applyPanelPredictiveBackProgress(panel, event); }, onBackCancelled: function() { self.resetPanelPredictiveBackVisual(panel); }, @@ -441,8 +445,12 @@ FloatBallAppWM.prototype.registerPanelPredictiveBack = function(panel, which) { self.handlePanelBack(which, "predictive_back"); } }); - usedAnimation = true; + usedAnimation = !!animCls.isInstance(cb); + if (!usedAnimation) { + safeLog(self.L, 'w', "OnBackAnimationCallback proxy not instance; fallback may show mIsAnimationCallback=false"); + } } catch (eAnim) { + safeLog(self.L, 'w', "create OnBackAnimationCallback fail: " + String(eAnim)); cb = null; } } @@ -459,7 +467,13 @@ FloatBallAppWM.prototype.registerPanelPredictiveBack = function(panel, which) { if (!cb) return false; var priority = 0; - try { priority = android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT; } catch (ePri) { priority = 0; } + try { + if (String(which || "") === "tool_app" && android.window.OnBackInvokedDispatcher.PRIORITY_OVERLAY !== undefined) { + priority = android.window.OnBackInvokedDispatcher.PRIORITY_OVERLAY; + } else { + priority = android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT; + } + } catch (ePri) { priority = 0; } dispatcher.registerOnBackInvokedCallback(priority, cb); if (!this.state.panelBackCallbackEntries) this.state.panelBackCallbackEntries = []; this.state.panelBackCallbackEntries.push({ view: panel, dispatcher: dispatcher, callback: cb, which: String(which || ""), animation: usedAnimation }); diff --git a/manifest.json b/manifest.json index d5e1666..4b7d05f 100644 --- a/manifest.json +++ b/manifest.json @@ -34,8 +34,8 @@ "size": 7938 }, "th_09_animation.js": { - "sha256": "5f5e8743438af92238c377d864a8ab54ba0f5c1fb9198e4003f2530ee1fb4bf5", - "size": 36684 + "sha256": "aeaae4c69212000c549d3a5835b4e13efc2665c08b98c76835ead092bab6afc3", + "size": 37646 }, "th_10_shell.js": { "sha256": "0ed793079c2f6ba7d29f4c0d411705cb72419f45f572cbe37ed32ac16527a8bc", @@ -68,5 +68,5 @@ }, "keyId": "toolhub-targets-2026-rsa3072", "schema": 2, - "version": 20260513191013 + "version": 20260513192204 } diff --git a/manifest.sig b/manifest.sig index 84979e4..3c3f4f8 100644 --- a/manifest.sig +++ b/manifest.sig @@ -1 +1 @@ -MDFkuupKMa3WOF6k4FEjEUDpEgxCnwNtCPOyqgB62IWvxKNGLcru5te81MGFNGIyfOKd/eq7CJQ+g18iXdOx618qeMKI6cHpUTVPSOOeLsvRijlJp7/mWip5OG2OPOUziiaMNafBLddQRrRHn0siNoWG5hte3SYfUcVLw8SpJTAwjJCoX56MB6E2tkdkv2Beg+76my7LBd0IK5bAms/cj5v5wDGxnj58iJxIgt5JjpW0TZp3OzMLBjmk4uvUm2rqVeoEIoHwrFN87P9TNZ2K8YoR6DskyRhZAvwZd3RCN92UKK7xu8XqY0YeSYFHdcZe8ntMfvt/vDOe5RMWD1VbU0F6l960aYhZx1wH3eU+nQ/zy920ryRjH/S904q9ZLC+S4QDX4u3xKRTUjQVKh9TBE5ZwnAI3PKDt7W1y/tiOE9X5j8cLtvzSySkvrG1SY+pbfKTdonlVAV6QXOSYZRsJp7Gr8MSVQOhJwVz4HoByOI2EiQSbLwxLexuFUJhIKvN +ncqYbwM/RAG7BkNXDAmWjUnEsO+Fy4SyYu4LOvH9FgU6kQ2xojzYoKXLL1dmRs7xKCXEfiECFl+qI4+w6X4KETfC3O+N+X8UuhYKgi96WtLp70//7LzU75t8EQx/StPPckzsVD3UluoAdJ4Dv3PYdNSWN39HdQQaqDqT0+3VByRKITCxwmNfcE/oTXA15vIZ+UU01r6zZSTCgIiqofCpsM8PHz0/laQvpNiFxqGRgmFWZUUU1q/U+QFg1lUpu5yU9uESslwW6PiVSIWjqcWPqGVhfIvKgRo/11caKhuKERG78IzT0F/WSXLrmkndh1ItRH7789QLziyMrCQARUlzHkS0qEAChjb+v4Lb7k15dDtkyI7vAwEAykJNY6+WwZ2Xxb77+9ncwNHm2qxubjo6hUZc+CwHbk2JOgKLQSNv/mvUuKfa7pd7rZ+oKtBIEY56OIfYEHMaMt+ZDnU8WcYcuhlZyv3dnUPV28pPwzmlfQcq3TDiSYACZnP3ssa+ESaw