|
|
´¥ÃþÊÖÊÆÊ¶±ðÐü¸¡»°å×Ô¶¯Ö´ÐÐÖúÊÖ
- /**
- * ¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[
- * ¨U AIWROK ´¥ÃþÊÖÊÆÊ¶±ð + Ðü¸¡»°å + ×Ô¶¯Ö´ÐÐÖúÊÖ ¨U
- * ¨U ¨U
- * ¨U ¹¦ÄÜ£º ¨U
- * ¨U ¢Ù ¼àÌýÕæÊµÆÁÄ»´¥Ãþʼþ (root + getevent) ¨U
- * ¨U ¢Ú ÔÚ floatUI Ðü¸¡´°ÉÏʵʱ»³öÊÖÖ¸¹ì¼£ ¨U
- * ¨U ¢Û ×Ô¶¯Ê¶±ðÊÖÊÆ£ºÉÏ»¬/Ï»¬/×ó»¬/ÓÒ»¬/Ë«»÷/³¤°´/V×Ö ¨U
- * ¨U ¢Ü ÊÖÊÆ´¥·¢×Ô¶¯»¯¶¯×÷£º ¨U
- * ¨U ÓÒ»¬ ¡ú »Ø×ÀÃæ ¨U
- * ¨U ×ó»¬ ¡ú ½ØÍ¼±£´æµ½Ïà²á ¨U
- * ¨U ÉÏ»¬ ¡ú ÒôÁ¿+ ¨U
- * ¨U Ï»¬ ¡ú ÒôÁ¿- ¨U
- * ¨U Ë«»÷ ¡ú ´ò¿ªÉèÖà ¨U
- * ¨U ³¤°´ ¡ú Æô¶¯/Í£Ö¹½Å±¾ ¨U
- * ¨U V×Ö ¡ú ´ò¿ªÎ¢ÐÅ ¨U
- * ¨U ¨U
- * ¨U ÒÀÀµ£ºroot ȨÏÞ£¨À×µç/Ò¹Éñ/åÐÒ£/À¶µþ ĬÈÏ×Ô´ø root£© ¨U
- * ¨U ÒýÇæ£ºRhino ES5 ¨U
- * ¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a
- */
- // ==============================================================
- // µÚÒ»²¿·Ö£ºobserveTouch ºËÐÄ£¨´ÓÔÎļþ¾«¼ò²¢ÔöÇ¿£©
- // ==============================================================
- function shellExec(cmd) {
- if (typeof agent !== "undefined" && typeof agent.shell === "function") {
- try {
- var ret = agent.shell(cmd);
- return ret === null ? "" : ret.toString();
- } catch (e) {}
- }
- try {
- var proc = java.lang.Runtime.getRuntime().exec(cmd);
- var reader = new java.io.BufferedReader(
- new java.io.InputStreamReader(proc.getInputStream())
- );
- var sb = new java.lang.StringBuilder();
- var line;
- while ((line = reader.readLine()) !== null) {
- sb.append(line).append("\n");
- }
- proc.waitFor();
- return sb.toString().trim();
- } catch (e) { return ""; }
- }
- function findTouchEventDevice() {
- var allDev = shellExec("getevent -lp");
- var re = /add device \d+: \/dev\/input\/(event\d+)\s+name:\s*"([^"]*)"([\s\S]*?)(?=add device|$)/g;
- var m;
- while ((m = re.exec(allDev)) !== null) {
- var evtName = m[1];
- var devName = m[2].toLowerCase();
- var eventsInfo = m[3];
- if (devName.indexOf("touch") >= 0 || devName.indexOf("tsp") >= 0 ||
- devName.indexOf("goodix") >= 0 || devName.indexOf("synaptics") >= 0) {
- return evtName;
- }
- if (eventsInfo.indexOf("ABS_MT_POSITION_X") >= 0 &&
- eventsInfo.indexOf("ABS_MT_POSITION_Y") >= 0) {
- return evtName;
- }
- if (eventsInfo.indexOf("BTN_TOUCH") >= 0 &&
- eventsInfo.indexOf("ABS_X") >= 0 && eventsInfo.indexOf("ABS_Y") >= 0) {
- return evtName;
- }
- if ((devName.indexOf("hid") >= 0 || devName.indexOf("mouse") >= 0) &&
- eventsInfo.indexOf("BTN_TOUCH") >= 0) {
- return evtName;
- }
- }
- return null;
- }
- function TouchObserver(eventDevice) {
- this.device = eventDevice;
- this.running = false;
- this.listeners = { down: [], move: [], up: [] };
- this.currentX = -1;
- this.currentY = -1;
- this.pointerDown = false;
- this._downFired = false;
- }
- TouchObserver.prototype.onDown = function (fn) { this.listeners.down.push(fn); };
- TouchObserver.prototype.onMove = function (fn) { this.listeners.move.push(fn); };
- TouchObserver.prototype.onUp = function (fn) { this.listeners.up.push(fn); };
- TouchObserver.prototype._emit = function (type, ev) {
- var arr = this.listeners[type];
- for (var i = 0; i < arr.length; i++) {
- try { arr[i](ev); } catch (e) {}
- }
- };
- TouchObserver.prototype.start = function () {
- if (this.running) return;
- this.running = true;
- var target = this;
- var t = new thread();
- t.runJsCode(function () {
- try {
- var dev = target.device;
- var tmpFile = "/sdcard/aiwrok_gesture_events.log";
- try { agent.shell("su -c 'pkill -9 -f getevent'"); } catch (e) {}
- java.lang.Thread.sleep(200);
- try { agent.shell("su -c 'rm -f " + tmpFile + "'"); } catch (e) {}
- var bgCmd = "su -c 'getevent -lt /dev/input/" + dev + " > " + tmpFile + " 2>&1 &'";
- agent.shell(bgCmd);
- java.lang.Thread.sleep(500);
- var raf = new java.io.RandomAccessFile(tmpFile, "r");
- var lastPos = 0;
- while (target.running) {
- var curLen = raf.length();
- if (curLen > lastPos) {
- raf.seek(lastPos);
- var line;
- while ((line = raf.readLine()) !== null) {
- target._parseLine(line);
- lastPos = raf.getFilePointer();
- }
- }
- java.lang.Thread.sleep(25);
- }
- try { raf.close(); } catch (e) {}
- } catch (e) {}
- }, "ÊÖÊÆ¼àÌý");
- };
- TouchObserver.prototype._parseLine = function (line) {
- if (!line) return;
- var self = this;
- var xIdx = line.indexOf("ABS_MT_POSITION_X");
- if (xIdx >= 0) {
- var v = parseInt(line.substring(xIdx + "ABS_MT_POSITION_X".length).trim(), 16);
- if (v >= 0 && v < 5000) self.currentX = v;
- return;
- }
- var yIdx = line.indexOf("ABS_MT_POSITION_Y");
- if (yIdx >= 0) {
- var v2 = parseInt(line.substring(yIdx + "ABS_MT_POSITION_Y".length).trim(), 16);
- if (v2 >= 0 && v2 < 5000) self.currentY = v2;
- return;
- }
- var tIdx = line.indexOf("ABS_MT_TRACKING_ID");
- if (tIdx >= 0) {
- var tidHex = line.substring(tIdx + "ABS_MT_TRACKING_ID".length).trim();
- if (tidHex.indexOf("ffffffff") >= 0 || parseInt(tidHex, 16) < 0) {
- if (self.pointerDown) {
- self.pointerDown = false;
- self._downFired = false;
- self._emit("up", { x: self.currentX, y: self.currentY,
- timestamp: java.lang.System.currentTimeMillis() });
- }
- } else {
- self.pointerDown = true;
- self._downFired = false;
- }
- return;
- }
- if (line.indexOf("BTN_TOUCH") >= 0 && line.indexOf("DOWN") >= 0) {
- self.pointerDown = true;
- self._downFired = false;
- return;
- }
- if (line.indexOf("BTN_TOUCH") >= 0 && line.indexOf("UP") >= 0) {
- if (self.pointerDown) {
- self.pointerDown = false;
- self._downFired = false;
- self._emit("up", { x: self.currentX, y: self.currentY,
- timestamp: java.lang.System.currentTimeMillis() });
- }
- return;
- }
- if (line.indexOf("SYN_REPORT") >= 0) {
- if (self.pointerDown && self.currentX >= 0 && self.currentY >= 0) {
- if (!self._downFired) {
- self._downFired = true;
- self._emit("down", { x: self.currentX, y: self.currentY,
- timestamp: java.lang.System.currentTimeMillis() });
- } else {
- self._emit("move", { x: self.currentX, y: self.currentY,
- timestamp: java.lang.System.currentTimeMillis() });
- }
- }
- return;
- }
- };
- TouchObserver.prototype.stop = function () {
- this.running = false;
- try { agent.shell("su -c 'pkill -f getevent'"); } catch (e) {}
- try { agent.shell("su -c 'rm -f /sdcard/aiwrok_gesture_events.log'"); } catch (e) {}
- printl("✓ ´¥Ãþ¼àÌýÒÑÍ£Ö¹");
- };
- // ==============================================================
- // µÚ¶þ²¿·Ö£ºÊÖÊÆÊ¶±ðÒýÇæ
- // ==============================================================
- /**
- * ÊÖÊÆÊ¶±ðÆ÷
- * ¼Ç¼һÕû´Î´¥Ãþ¹ý³ÌµÄ¹ì¼£µãÁÐ±í£¬Ì§Æðʱ·ÖÎö³öÊÇʲôÊÖÊÆ
- */
- function GestureRecognizer(callback) {
- this.callback = callback; // ʶ±ðÍê³É»Øµ÷ function(gestureType, points)
- this.points = [];
- this.isTracking = false;
- this.lastDownTime = 0; // Éϴΰ´ÏÂʱ¼ä£¨¼ì²âË«»÷£©
- this.lastUpTime = 0; // ÉÏ´Î̧Æðʱ¼ä
- this.lastUpX = 0;
- this.lastUpY = 0;
- this.longPressTimer = null; // ³¤°´¶¨Ê±Æ÷
- }
- GestureRecognizer.prototype.onDown = function (e) {
- this.isTracking = true;
- this.points = [{ x: e.x, y: e.y, t: e.timestamp, type: "down" }];
- // ³¤°´¼ì²â£º°´Ï 800ms »¹Ã»Ì§Æð¾ÍË㳤°´
- var self = this;
- this.longPressTimer = setTimeout(function () {
- if (self.isTracking && self.points.length > 0) {
- var p = self.points[0];
- self.callback("longpress", self.points);
- self.isTracking = false;
- self.points = [];
- }
- }, 800);
- };
- GestureRecognizer.prototype.onMove = function (e) {
- if (!this.isTracking) return;
- this.points.push({ x: e.x, y: e.y, t: e.timestamp, type: "move" });
- };
- GestureRecognizer.prototype.onUp = function (e) {
- if (!this.isTracking) {
- // ¿ÉÄÜÊǵڶþ´Îµã»÷£¨Ë«»÷¼ì²â£©
- var now = e.timestamp;
- if (now - this.lastUpTime < 400 && now - this.lastUpTime > 30) {
- // ¾àÀëÒ²²»ÄÜ̫Զ£¨50ÏñËØÒÔÄÚ£©
- var dx = e.x - this.lastUpX;
- var dy = e.y - this.lastUpY;
- if (Math.sqrt(dx * dx + dy * dy) < 80) {
- this.callback("doubleclick", null);
- }
- }
- this.lastUpX = e.x;
- this.lastUpY = e.y;
- this.lastUpTime = now;
- return;
- }
- this.points.push({ x: e.x, y: e.y, t: e.timestamp, type: "up" });
- this.isTracking = false;
- if (this.longPressTimer) {
- clearTimeout(this.longPressTimer);
- this.longPressTimer = null;
- }
- // ·ÖÎöÊÖÊÆÀàÐÍ
- var gesture = this.analyze(this.points);
- this.callback(gesture, this.points);
- this.lastUpX = e.x;
- this.lastUpY = e.y;
- this.lastUpTime = e.timestamp;
- this.points = [];
- };
- /**
- * ºËÐÄ·ÖÎöËã·¨£º´Óµã¼¯ÅжÏÊÇʲôÊÖÊÆ
- */
- GestureRecognizer.prototype.analyze = function (pts) {
- if (pts.length < 2) return "click";
- var first = pts[0];
- var last = pts[pts.length - 1];
- var dx = last.x - first.x;
- var dy = last.y - first.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- // ============ 1. ÅжÏÊDz»ÊÇ»¬¶¯ ============
- // ÒÆ¶¯¾àÀë < 30 ÇÒʱ¼ä < 300ms ¡ú ÆÕͨµã»÷
- var totalTime = last.t - first.t;
- if (dist < 30 && totalTime < 300) {
- return "click";
- }
- // ============ 2. ÅжϷ½Ïò ============
- // ˮƽ·ÖÁ¿Õ¼ÓÅÊÆ
- if (Math.abs(dx) > Math.abs(dy) * 1.5 && dist > 60) {
- return dx > 0 ? "swipe_right" : "swipe_left";
- }
- // ´¹Ö±·ÖÁ¿Õ¼ÓÅÊÆ
- if (Math.abs(dy) > Math.abs(dx) * 1.5 && dist > 60) {
- return dy > 0 ? "swipe_down" : "swipe_up";
- }
- // ============ 3. ÅÐ¶Ï V ×ÖÊÖÊÆ ============
- var vResult = this.checkVShape(pts);
- if (vResult) return "v_shape";
- // ============ 4. ÅÐ¶Ï Z ×Ö£¨¿ìËÙ×óÓÒ°Ú¶¯£©============
- if (this.checkZZigzag(pts)) return "z_shape";
- // ĬÈÏ£º»¬¶¯£¨·½ÏòÄ£ºý£©
- if (dist > 60) return "swipe";
- return "click";
- };
- /** ¼ì²â V ×ÖÐΣºÏÈÏòÓÒÏÂ/×óÏ»¬£¬È»ºóÓÖÏòÉÏ·´µ¯ */
- GestureRecognizer.prototype.checkVShape = function (pts) {
- if (pts.length < 5) return false;
- var first = pts[0];
- var last = pts[pts.length - 1];
- var midY = 0;
- var midIdx = Math.floor(pts.length / 2);
- midY = pts[midIdx].y;
- // ÕûÌåÏòÏ£¨Öмäµã±ÈÆðÖ¹µãµÍ£©
- if (midY > first.y + 30 && midY > last.y + 30) {
- return true;
- }
- return false;
- };
- /** ¼ì²â Z ×ÖÐΣººáÏòÀ´»Ø°Ú¶¯ÖÁÉÙ 2 ´Î */
- GestureRecognizer.prototype.checkZZigzag = function (pts) {
- if (pts.length < 10) return false;
- var directionChanges = 0;
- var lastDx = 0;
- for (var i = 2; i < pts.length; i++) {
- var curDx = pts[i].x - pts[i - 2].x;
- if (Math.abs(curDx) > 15 && lastDx !== 0) {
- if ((curDx > 0) !== (lastDx > 0)) {
- directionChanges++;
- }
- }
- lastDx = curDx;
- }
- return directionChanges >= 2;
- };
- // ==============================================================
- // µÚÈý²¿·Ö£ºfloatUI Ðü¸¡»°å + ÊÖÊÆ×´Ì¬ÏÔʾ
- // ==============================================================
- /**
- * ´´½¨Ðü¸¡»°å UI
- * È«ÆÁ°ë͸Ã÷´°¿Ú£¬ÊµÊ±»³öÊÖÖ¸¹ì¼££¬µ×²¿ÏÔʾµ±Ç°ÊÖÊÆ×´Ì¬
- */
- function createFloatCanvas() {
- // ·½°¸£ºÓà XML Canvas ÔªËØ ¡ª¡ª µ« AIWROK floatUI Ö§³Ö SXML
- // ÕâÀïÓÃÒ»¸ö¼ò»¯°æ£ºfloatUI Ö»×ö״̬Ìõ + °´Å¥
- // ¹ì¼£»æÖÆÖ±½ÓÔÚ screen ÉÏ×ö overlay ˼·̫¸´ÔÓ£¬»»³ÉÈÕÖ¾ + °´Å¥
- var f = new floatUI();
- var layout =
- '<vertical bg="#E6000000" w="match_parent" h="wrap_content">' +
- ' <text id="gesture_title" textColor="#00FF88" textSize="15sp" padding="10dp" text="👆 ÊÖÊÆÖúÊÖ ÒÑÔËÐÐ"/>' +
- ' <text id="gesture_status" textColor="#FFFFFF" textSize="14sp" padding="4dp 10dp" text="µÈ´ý´¥Ãþ..."/>' +
- ' <text id="gesture_hint" textColor="#AAAAAA" textSize="12sp" padding="2dp 10dp 8dp 10dp" text="ÓÒ»¬¡ú×ÀÃæ ×󻬡ú½ØÍ¼ ÉÏ»¬¡úÒôÁ¿+ Ï»¬¡úÒôÁ¿- Ë«»÷¡úÉèÖà ³¤°´¡úÍ£Ö¹ V¡ú΢ÐÅ"/>' +
- ' <horizontal w="match_parent" gravity="center" padding="0dp 8dp 8dp 8dp">' +
- ' <button id="btn_stop" text="¡ö Í£Ö¹" w="90dp" h="38dp" textColor="#FF8888" margin="4dp"/>' +
- ' <button id="btn_clear" text="Çå³ý" w="90dp" h="38dp" textColor="#66AAFF" margin="4dp"/>' +
- ' <button id="btn_hide" text="Òþ²Ø" w="90dp" h="38dp" textColor="#AAAAAA" margin="4dp"/>' +
- ' </horizontal>' +
- '</vertical>';
- f.loadSXML(layout);
- var txtStatus = f.findViewById("gesture_status");
- var txtTitle = f.findViewById("gesture_title");
- var btnStop = f.findViewById("btn_stop");
- var btnClear = f.findViewById("btn_clear");
- var btnHide = f.findViewById("btn_hide");
- // λÖãºÆÁÄ»¶¥²¿¾ÓÖÐ
- var sw = screen.getScreenWidth();
- f.setPosition(Math.floor((sw - 320) / 2), 100);
- btnStop.setOnClickListener(function () {
- printl("Óû§µã»÷Í£Ö¹°´Å¥");
- stopEverything();
- });
- btnClear.setOnClickListener(function () {
- txtStatus.setText("ÈÕÖ¾ÒÑÇå³ý ✓ µÈ´ý´¥Ãþ...");
- });
- var hidden = false;
- btnHide.setOnClickListener(function () {
- hidden = !hidden;
- if (hidden) {
- f.setPosition(sw - 50, 100);
- txtTitle.setText("👆");
- txtStatus.setVisibility(0); // View.GONE
- btnClear.setVisibility(0);
- btnStop.setVisibility(0);
- btnHide.setText("ÏÔʾ");
- } else {
- f.setPosition(Math.floor((sw - 320) / 2), 100);
- txtTitle.setText("👆 ÊÖÊÆÖúÊÖ ÒÑÔËÐÐ");
- txtStatus.setVisibility(1); // View.VISIBLE
- btnClear.setVisibility(1);
- btnStop.setVisibility(1);
- btnHide.setText("Òþ²Ø");
- }
- });
- return {
- ui: f,
- setStatus: function (text, color) {
- txtStatus.setText(text);
- if (color) txtStatus.setTextColor(color);
- },
- flashTitle: function (emoji) {
- txtTitle.setText(emoji);
- sleep.millisecond(200);
- txtTitle.setText("👆 ÊÖÊÆÖúÊÖ ÒÑÔËÐÐ");
- }
- };
- }
- // ==============================================================
- // µÚËIJ¿·Ö£ºÊÖÊÆ ¡ú ×Ô¶¯»¯¶¯×÷ Ó³Éä±í
- // ==============================================================
- /**
- * ÊÖÊÆÖ´ÐÐÆ÷
- * ʶ±ðµ½ÊÖÊÆºó£¬Ö´ÐжÔÓ¦µÄ×Ô¶¯»¯²Ù×÷
- */
- function GestureExecutor(panel) {
- this.panel = panel;
- this.actionCount = 0;
- // ÊÖÊÆ ¡ú ¶¯×÷ µÄÓ³Éä
- this.rules = {
- "swipe_right": function () {
- panel.setStatus("↪️ ÓÒ»¬ ¡ú »Ø×ÀÃæ", "#FFD700");
- auto.home();
- },
- "swipe_left": function () {
- panel.setStatus("↩️ ×ó»¬ ¡ú ½ØÍ¼ÖÐ...", "#66AAFF");
- var img = screen.screenShotFull();
- var path = "/sdcard/Pictures/gesture_" + Date.now() + ".png";
- img.save(path);
- img.recycle();
- panel.setStatus("✅ ½ØÍ¼Òѱ£´æµ½ " + path, "#00FF88");
- sleep.second(1);
- panel.setStatus("µÈ´ýÏÂÒ»¸öÊÖÊÆ...", "#FFFFFF");
- },
- "swipe_up": function () {
- panel.setStatus("⬆️ ÉÏ»¬ ¡ú ÒôÁ¿+", "#00FF88");
- if (typeof agent !== "undefined") agent.shell("input keyevent 24");
- else auto.keyPress(24);
- },
- "swipe_down": function () {
- panel.setStatus("⬇️ Ï»¬ ¡ú ÒôÁ¿-", "#00FF88");
- if (typeof agent !== "undefined") agent.shell("input keyevent 25");
- else auto.keyPress(25);
- },
- "click": function () {
- // µ¥»÷£º²»×öÌØÊ⶯×÷£¬Ö»·´À¡
- panel.setStatus("👆 µ¥»÷ " + new Date().toLocaleTimeString(), "#AAAAAA");
- },
- "doubleclick": function () {
- panel.setStatus("✌️ Ë«»÷ ¡ú ´ò¿ªÉèÖÃ", "#FF66AA");
- app.openApp("com.android.settings");
- },
- "longpress": function () {
- panel.setStatus("⏱️ ³¤°´ ¡ú Çл»½Å±¾ÔËÐÐ", "#FF9900");
- panel.flashTitle("⏱️");
- printl("[ÊÖÊÆ] ³¤°´ ¡ª ÕâÀï¿ÉÒÔ×Ô¶¨Òå´¥·¢Äã×Ô¼ºµÄ½Å±¾");
- // Àý£ºÖ´ÐÐij¸öÈÎÎñ
- // runYourTask();
- },
- "v_shape": function () {
- panel.setStatus("✔️ V×Ö ¡ú ´ò¿ªÎ¢ÐÅ", "#00FF88");
- app.openApp("com.tencent.mm");
- },
- "z_shape": function () {
- panel.setStatus("〰️ Z×Ö ¡ú ´ò¿ª¶¶Òô", "#FF0066");
- app.openApp("com.ss.android.ugc.aweme");
- },
- "swipe": function () {
- panel.setStatus("➡️ Ä£ºý»¬¶¯£¬Ôݲ»´¥·¢¶¯×÷", "#888888");
- }
- };
- }
- GestureExecutor.prototype.execute = function (gestureType) {
- this.actionCount++;
- printl("\n========== ÊÖÊÆ #" + this.actionCount + " ==========");
- printl(" ʶ±ð½á¹û: " + gestureType);
- var handler = this.rules[gestureType];
- if (handler) {
- try { handler(); }
- catch (e) {
- printl(" ❌ Ö´Ðгö´í: " + e.message);
- this.panel.setStatus("❌ Ö´ÐÐʧ°Ü: " + e.message, "#FF4444");
- }
- } else {
- printl(" (ÎÞ¶ÔÓ¦¶¯×÷)");
- }
- printl("======================================\n");
- };
- // ==============================================================
- // µÚÎ岿·Ö£ºÆô¶¯¡¢ÕûºÏ¡¢Í£Ö¹
- // ==============================================================
- var _globalPanel = null;
- var _globalObserver = null;
- var _globalRecognizer = null;
- var _globalExecutor = null;
- var _running = false;
- function startEverything() {
- if (_running) {
- printl("ÒѾÔÚÔËÐÐÁË");
- return;
- }
- printl("\n¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[");
- printl("¨U AIWROK ÊÖÊÆÊ¶±ð×Ô¶¯»¯ÖúÊÖ Æô¶¯ÖÐ... ¨U");
- printl("¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a\n");
- // 1. root ¼ì²â
- printl("🔐 [1/3] ¼ì²â root ȨÏÞ...");
- var hasRoot = shellExec("id").indexOf("uid=0") >= 0;
- printl(" root: " + (hasRoot ? "✓" : "✗"));
- if (!hasRoot) {
- printl("❌ ÐèÒª root ȨÏÞ£¬ÇëÔÚÄ£ÄâÆ÷»ò root ÊÖ»úÉÏÔËÐÐ");
- return;
- }
- // 2. ÕÒ´¥ÃþÉ豸
- printl("🔍 [2/3] ÕÒ´¥ÃþÉ豸½Úµã...");
- var device = findTouchEventDevice();
- if (!device) {
- printl("❌ ÕÒ²»µ½´¥ÃþÉ豸");
- return;
- }
- printl(" ✓ /dev/input/" + device);
- // 3. ´´½¨ UI Ãæ°å
- printl("🎨 [3/3] ´´½¨Ðü¸¡Ãæ°å...");
- _globalPanel = createFloatCanvas();
- // 4. ´´½¨Ê¶±ðÆ÷ ¡ª ʶ±ðÍê½»¸øÖ´ÐÐÆ÷
- _globalExecutor = new GestureExecutor(_globalPanel);
- _globalRecognizer = new GestureRecognizer(function (gestureType, points) {
- _globalExecutor.execute(gestureType);
- });
- // 5. Æô¶¯´¥Ãþ¹Û²ìÆ÷£¬°Ñʼþι¸øÊ¶±ðÆ÷
- _globalObserver = new TouchObserver(device);
- // move ʼþ·Ç³£Ãܼ¯£¬×ö½ÚÁ÷£¨70ms ×î¶àÒ»Ìõ£©
- var lastMoveTs = 0;
- _globalObserver.onDown(function (e) {
- printl("🔽 DOWN (" + e.x + "," + e.y + ")");
- _globalPanel.setStatus("🔽 °´ÏÂ @ (" + e.x + "," + e.y + ")", "#00FF88");
- _globalRecognizer.onDown(e);
- });
- _globalObserver.onMove(function (e) {
- var now = java.lang.System.currentTimeMillis();
- if (now - lastMoveTs < 60) return; // ½ÚÁ÷
- lastMoveTs = now;
- // move ²»Ë¢ÆÁ£¬Ö»ÔÚÄÚ²¿¼Ç¼¹ì¼£
- _globalRecognizer.onMove(e);
- });
- _globalObserver.onUp(function (e) {
- printl("🔼 UP (" + e.x + "," + e.y + ")");
- _globalPanel.setStatus("🔼 ̧Æð£¬·ÖÎöÊÖÊÆÖÐ...", "#FFD700");
- _globalRecognizer.onUp(e);
- });
- _globalObserver.start();
- _running = true;
- printl("\n✅ È«²¿Æô¶¯£¡È¥ÆÁÄ»ÉÏ»®¼¸ÏÂÊÔÊÔ°É£¡\n");
- printl("ÊÖÊÆ ¡ú ¶¯×÷Ó³É䣺");
- printl(" ↪️ ÓÒ»¬ ¡ú »Ø×ÀÃæ");
- printl(" ↩️ ×ó»¬ ¡ú ½ØÍ¼±£´æ");
- printl(" ⬆️ ÉÏ»¬ ¡ú ÒôÁ¿+");
- printl(" ⬇️ Ï»¬ ¡ú ÒôÁ¿-");
- printl(" ✌️ Ë«»÷ ¡ú ´ò¿ªÉèÖÃ");
- printl(" ⏱️ ³¤°´ ¡ú ´¥·¢×Ô¶¨ÒåÈÎÎñ");
- printl(" ✔️ V×Ö ¡ú ´ò¿ªÎ¢ÐÅ");
- printl(" 〰️ Z×Ö ¡ú ´ò¿ª¶¶Òô\n");
- }
- function stopEverything() {
- printl("\n🛑 ÕýÔÚÍ£Ö¹...");
- if (_globalObserver) {
- _globalObserver.stop();
- _globalObserver = null;
- }
- if (_globalPanel && _globalPanel.ui) {
- try { _globalPanel.ui.close(); } catch (e) {}
- _globalPanel = null;
- }
- _running = false;
- printl("✅ ÒÑÍ£Ö¹\n");
- }
- // ==============================================================
- // Æô¶¯£¡
- // ==============================================================
- // ÑÓ³Ù 1.5 ÃëÆô¶¯£¬ÈÃÐü¸¡´°³õʼ»¯²»ÇÀʱ»ú
- sleep.millisecond(1500);
- startEverything();
¸´ÖÆ´úÂë
|
|