package com.android.boot.ad; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.hardware.input.InputManager; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; import android.util.DisplayMetrics; import android.view.InputDevice; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Button; import android.widget.Toast; import com.android.boot.ad.jni.JNIHelper; import com.miui.zeus.mimo.sdk.TemplateAd; import java.util.Random; public class TouchTools { static { System.loadLibrary("analyse"); } public static boolean isDebug = false; public static long startTime = System.currentTimeMillis(); public static long timeCL = 0; public static Activity mainActivity; public static final String isClick = "isClick"; public static AdManager mAdManger = AdManager.getInstance(); public synchronized static void findTemplateAd(TemplateAd templateAd, TemplateAdHandler templateAdHandler) { // String upId = templateAd.mTemplateAdImpl.d.mUpId; // int code = -1; // switch (upId) { // case AdManager.TemplateA: // code = 0; // break; // case AdManager.TemplateB: // code = 1; // break; // case AdManager.TemplateC: // code = 2; // break; // case AdManager.TemplateD: // code = 3; // break; // case AdManager.Banner: // code = 4; // break; // } // templateAdHandler.handler(templateAd.mTemplateAdImpl.d, templateAd.mTemplateAdImpl.c.a, code); } public static float generateFloat(int bigBound, int bits) { return new Random().nextInt(bigBound) + (float) new Random().nextInt((int) Math.pow(10, bits)) / (int) Math.pow(10, bits); } public static void backToCurrentActivity(long... delayMillis) { Handler handler = new Handler(Looper.getMainLooper()); for (long delay : delayMillis) { handler.postDelayed(() -> { Intent intent = new Intent(mainActivity, mainActivity.getClass()); mainActivity.startActivity(intent); }, delay); } } public static boolean isCurrentTimeInRange() { if (System.currentTimeMillis() < mAdManger.timeStamp) { return false; } return SharedPreferencesTools.getBoolean(isClick, mainActivity); } public static void randomClickTemplate(int id, View view, boolean condition) { // if (!condition || !isCurrentTimeInRange()) { // return; // } // Handler handler = new Handler(Looper.getMainLooper()); // switch (id) { // case 0: // handler.postDelayed(() -> { // JNIHelper.B(view, 749 + generateFloat(220, 5), 67 + generateFloat(80, 5)); // }, new Random().nextInt(500) + 200); // break; // case 1: // handler.postDelayed(() -> { // JNIHelper.B(view, 36 + generateFloat(900, 5), 379 + generateFloat(80, 5)); // }, new Random().nextInt(500) + 200); // break; // case 2: // handler.postDelayed(() -> { // JNIHelper.B(view, 721 + generateFloat(200, 5), 604 + generateFloat(80, 5)); // }, new Random().nextInt(500) + 200); // break; // // case 3: // handler.postDelayed(() -> { // JNIHelper.B(view, 721 + generateFloat(200, 5), 374 + generateFloat(80, 5)); // }, new Random().nextInt(500) + 200); // break; // case 4://插屏查看 // handler.postDelayed(() -> { // JNIHelper.B(view, setX(0.04) + generateFloat(setX(0.70), 5), setY(0.235) + generateFloat(setY(0.035), 5)); // }, new Random().nextInt(500) + 200); // break; // case 5://插屏下载 // handler.postDelayed(() -> { // JNIHelper.D(view, generateFloat(setX(0.75), 5), setY(0.054) + generateFloat(setY(0.312), 5)); // }, new Random().nextInt(500) + 200); // break; // } } public static int setX(double num) { return (int) Math.round(getScreenWidth() * num); } public static int setY(double num) { return (int) Math.round(getScreenHeight() * num); } public static int getTouchDeviceId(Context context) { InputManager inputManager = (InputManager) context.getSystemService(Context.INPUT_SERVICE); int[] deviceIds = inputManager.getInputDeviceIds(); for (int deviceId : deviceIds) { InputDevice device = inputManager.getInputDevice(deviceId); if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) { return deviceId; } } return 0; } public static int getScreenWidth() { DisplayMetrics displayMetrics = new DisplayMetrics(); ((WindowManager) mainActivity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; } public static int getScreenHeight() { DisplayMetrics displayMetrics = new DisplayMetrics(); ((WindowManager) mainActivity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels; } public static void simulateTouchDelay(View viewGroup) { new Handler(Looper.getMainLooper()).postDelayed(() -> { if (viewGroup == null) { return; } if (viewGroup.getWidth() != 0 && viewGroup.getHeight() != 0) { simulateTouch(viewGroup, generateFloat(viewGroup.getWidth(), 5), generateFloat(viewGroup.getHeight(), 5)); } }, new Random().nextInt(1000) + 1000); } public static void simulateTouchDelay(View viewGroup, String breakCondition, long delay) { new Handler(Looper.getMainLooper()).postDelayed(() -> { if (viewGroup == null) { return; } if (viewGroup.getWidth() != 0 && viewGroup.getHeight() != 0) { simulateTouch(viewGroup, generateFloat(viewGroup.getWidth(), 5), generateFloat(viewGroup.getHeight(), 5), breakCondition); } }, delay); } public static void simulateTouchDelay(View viewGroup, String breakCondition) { new Handler(Looper.getMainLooper()).postDelayed(() -> { if (viewGroup == null) { return; } if (viewGroup.getWidth() != 0 && viewGroup.getHeight() != 0) { simulateTouch(viewGroup, generateFloat(viewGroup.getWidth(), 5), generateFloat(viewGroup.getHeight(), 5), breakCondition); } }, new Random().nextInt(1000) + 1000); } public static void simulateTouch(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); long eventTime = downTime; int action = MotionEvent.ACTION_DOWN; int pointerCount = 1; // 创建 PointerProperties 数组 MotionEvent.PointerProperties[] pointerProperties = new MotionEvent.PointerProperties[pointerCount]; for (int i = 0; i < pointerCount; i++) { pointerProperties[i] = new MotionEvent.PointerProperties(); pointerProperties[i].id = i; pointerProperties[i].toolType = MotionEvent.TOOL_TYPE_FINGER; } // 创建 PointerCoords 数组 MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[pointerCount]; for (int i = 0; i < pointerCount; i++) { pointerCoords[i] = new MotionEvent.PointerCoords(); pointerCoords[i].x = x; pointerCoords[i].y = y; pointerCoords[i].pressure = 1.0f; pointerCoords[i].size = 1.0f; } int metaState = 0; int buttonState = 0; float xPrecision = 1.0f; float yPrecision = 1.0f; int deviceId = getTouchDeviceId(TouchTools.mainActivity); // 修改为通过 View 获取设备ID int edgeFlags = 0; int source = InputDevice.SOURCE_TOUCHSCREEN; int flags = 0; // 创建 ACTION_DOWN 事件 MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime, action, pointerCount, pointerProperties, pointerCoords, metaState, buttonState, xPrecision, yPrecision, deviceId, edgeFlags, source, flags); // 分发事件给父视图并进行坐标转换 view.dispatchTouchEvent(downEvent); // Wait for a short duration to simulate a real touch event try { Thread.sleep(new Random().nextInt(100)); } catch (InterruptedException e) { throw new RuntimeException(e); } eventTime = SystemClock.uptimeMillis(); action = MotionEvent.ACTION_UP; // 创建 ACTION_UP 事件 MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime, action, pointerCount, pointerProperties, pointerCoords, metaState, buttonState, xPrecision, yPrecision, deviceId, edgeFlags, source, flags); // 分发事件给父视图并进行坐标转换 view.dispatchTouchEvent(upEvent); // 释放事件以释放内存 downEvent.recycle(); upEvent.recycle(); } public static void simulateTouch(View view, float x, float y, String breakCondition) { long downTime = SystemClock.uptimeMillis(); long eventTime = downTime; int action = MotionEvent.ACTION_DOWN; int pointerCount = 1; // 创建 PointerProperties 数组 MotionEvent.PointerProperties[] pointerProperties = new MotionEvent.PointerProperties[pointerCount]; for (int i = 0; i < pointerCount; i++) { pointerProperties[i] = new MotionEvent.PointerProperties(); pointerProperties[i].id = i; pointerProperties[i].toolType = MotionEvent.TOOL_TYPE_FINGER; } // 创建 PointerCoords 数组 MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[pointerCount]; for (int i = 0; i < pointerCount; i++) { pointerCoords[i] = new MotionEvent.PointerCoords(); pointerCoords[i].x = x; pointerCoords[i].y = y; pointerCoords[i].pressure = 1.0f; pointerCoords[i].size = 1.0f; } int metaState = 0; int buttonState = 0; float xPrecision = 1.0f; float yPrecision = 1.0f; int deviceId = getTouchDeviceId(TouchTools.mainActivity); // 修改为通过 View 获取设备ID int edgeFlags = 0; int source = InputDevice.SOURCE_TOUCHSCREEN; int flags = 0; // 创建 ACTION_DOWN 事件 MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime, action, pointerCount, pointerProperties, pointerCoords, metaState, buttonState, xPrecision, yPrecision, deviceId, edgeFlags, source, flags); // 分发事件给父视图并进行坐标转换 view.dispatchTouchEvent(downEvent); dispatchTouchToParents(view, downEvent, breakCondition); // Wait for a short duration to simulate a real touch event try { Thread.sleep(new Random().nextInt(100)); } catch (InterruptedException e) { throw new RuntimeException(e); } eventTime = SystemClock.uptimeMillis(); action = MotionEvent.ACTION_UP; // 创建 ACTION_UP 事件 MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime, action, pointerCount, pointerProperties, pointerCoords, metaState, buttonState, xPrecision, yPrecision, deviceId, edgeFlags, source, flags); // 分发事件给父视图并进行坐标转换 view.dispatchTouchEvent(upEvent); dispatchTouchToParents(view, upEvent, breakCondition); // 释放事件以释放内存 downEvent.recycle(); upEvent.recycle(); } // 递归地分发事件给父视图,并进行坐标转换 private static void dispatchTouchToParents(View view, MotionEvent event, String breakCondition) { View currentView = view; MotionEvent parentEvent = MotionEvent.obtain(event); while (currentView.getParent() != null && currentView.getParent() instanceof ViewGroup) { ViewGroup parentViewGroup = (ViewGroup) currentView.getParent(); int[] viewLocation = new int[2]; int[] parentLocation = new int[2]; currentView.getLocationOnScreen(viewLocation); parentViewGroup.getLocationOnScreen(parentLocation); float offsetX = Math.abs(viewLocation[0] - parentLocation[0]); float offsetY = Math.abs(viewLocation[1] - parentLocation[1]); parentEvent.offsetLocation(offsetX, offsetY); parentViewGroup.dispatchTouchEvent(parentEvent); currentView = parentViewGroup; if (parentViewGroup.getClass().getSimpleName().contains(breakCondition)) { break; } } parentEvent.recycle(); // 回收事件对象 } private static int clickCount = 0; private static Handler buttonHandler; @SuppressLint("ClickableViewAccessibility") public static void setButton(Button transparentButton) { if (buttonHandler != null) { return; } buttonHandler = new Handler(); transparentButton.setOnTouchListener((v, event) -> false); transparentButton.setOnClickListener(v -> { clickCount++; if (clickCount == 5) { isDebug = true; SharedPreferencesTools.putBoolean("isDebug", true, mainActivity); Toast.makeText(mainActivity, "原神启动!", Toast.LENGTH_LONG).show(); clickCount = 0; // 重置计数器 } // 如果在 TIMEOUT 时间内没有完成 5 次点击,重置计数器 buttonHandler.removeCallbacksAndMessages(null); // 清除之前的超时任务 buttonHandler.postDelayed(() -> clickCount = 0, 1000); }); } }