feat: add system navigation button actions

This commit is contained in:
7015725
2026-05-12 10:16:31 +08:00
parent 0037aefcb7
commit 5c95d04fab
4 changed files with 134 additions and 9 deletions

View File

@@ -1,5 +1,50 @@
// @version 1.0.1
// =======================【WM 线程:按钮动作执行】======================
FloatBallAppWM.prototype.execSystemNavigation = function(navAction) {
var ret = { ok: false, method: "", action: String(navAction || ""), err: "" };
var a = ret.action;
var keyCode = 0;
if (a === "back") keyCode = android.view.KeyEvent.KEYCODE_BACK;
else if (a === "home") keyCode = android.view.KeyEvent.KEYCODE_HOME;
else if (a === "recents") keyCode = android.view.KeyEvent.KEYCODE_APP_SWITCH;
else { ret.err = "unknown nav action: " + a; return ret; }
try {
var now = android.os.SystemClock.uptimeMillis();
var KeyEvent = android.view.KeyEvent;
var InputDevice = android.view.InputDevice;
var InputManager = android.hardware.input.InputManager;
var down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0, 0, KeyEvent.KEYCODE_UNKNOWN, 0, KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD);
var up = new KeyEvent(now, android.os.SystemClock.uptimeMillis(), KeyEvent.ACTION_UP, keyCode, 0, 0, KeyEvent.KEYCODE_UNKNOWN, 0, KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD);
var im = InputManager.getInstance();
var mode = InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH;
var ok1 = im.injectInputEvent(down, mode);
var ok2 = im.injectInputEvent(up, mode);
ret.ok = !!(ok1 && ok2);
ret.method = "InputManager.keyevent";
if (!ret.ok) ret.err = "injectInputEvent returned false";
return ret;
} catch (eKey) {
ret.err = String(eKey);
}
try {
var cmd = "input keyevent " + String(keyCode);
var b64 = encodeBase64Utf8(cmd);
var r = this.execShellSmart(b64, true);
if (r && r.ok) {
ret.ok = true;
ret.method = "BroadcastBridge.input_keyevent";
ret.err = "";
return ret;
}
ret.err = ret.err + "; shell fallback failed: " + JSON.stringify(r || {});
} catch (eShell) {
ret.err = ret.err + "; shell fallback exception: " + String(eShell);
}
return ret;
};
FloatBallAppWM.prototype.execButtonAction = function(btn, idx) {
// # 点击防抖
// 这段代码的主要内容/用途:防止在按钮面板上连续/乱点导致重复执行与 UI 状态机冲突(可能触发 system_server 异常重启)。
@@ -52,6 +97,21 @@ FloatBallAppWM.prototype.execButtonAction = function(btn, idx) {
return;
}
if (t === "nav") {
var navAction = btn.navAction ? String(btn.navAction) : "";
if (!navAction && btn.key) navAction = String(btn.key);
if (!navAction) { this.toast("按钮#" + idx + " 缺少导航动作"); return; }
try { this.hideAllPanels(); } catch (eHideNav) {}
var rn = this.execSystemNavigation(navAction);
if (rn && rn.ok) {
safeLog(this.L, 'i', "nav ok action=" + navAction + " via=" + String(rn.method || ""));
return;
}
this.toast("导航键执行失败: " + navAction);
safeLog(this.L, 'e', "nav fail action=" + navAction + " ret=" + JSON.stringify(rn || {}));
return;
}
if (t === "app") {
var pkg = btn.pkg ? String(btn.pkg) : "";
if (!pkg) { this.toast("按钮#" + idx + " 缺少 pkg"); return; }