diff --git a/app/src/main/java/com/auto/autoclicker/AutoClickService.java b/app/src/main/java/com/auto/autoclicker/AutoClickService.java index 000e825..3d8df76 100644 --- a/app/src/main/java/com/auto/autoclicker/AutoClickService.java +++ b/app/src/main/java/com/auto/autoclicker/AutoClickService.java @@ -12,10 +12,14 @@ import android.view.accessibility.AccessibilityEvent; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import com.auto.autoclicker.data.Event; +import com.auto.autoclicker.data.EventWrapper; +import com.auto.autoclicker.data.PointEvent; +import com.auto.autoclicker.data.SlideEvent; import com.auto.autoclicker.util.ScreenUtils; -import com.auto.autoclicker.util.ViewUtils; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class AutoClickService extends AccessibilityService { @@ -29,15 +33,14 @@ public class AutoClickService extends AccessibilityService { private static final int MIN_SLIDE_DURATION = 100; private static final int MAX_SLIDE_DURATION = 2000; - private final List eventQueue = new ArrayList<>(); + private List runtimeEvents = new ArrayList<>(); + private final Handler handler = new Handler(Looper.getMainLooper()); private boolean isRunning = false; private long clickInterval = 1000; private int clickDuration = 200; private int slideDuration = 500; - private int screenWidth; - private int screenHeight; private int currentEventIndex = 0; @Override @@ -45,8 +48,8 @@ public class AutoClickService extends AccessibilityService { super.onCreate(); instance = this; Point screenSize = ScreenUtils.getScreenSize(this); - screenWidth = screenSize.x; - screenHeight = screenSize.y; + int screenWidth = screenSize.x; + int screenHeight = screenSize.y; logDebug("屏幕尺寸: " + screenWidth + "x" + screenHeight); } @@ -66,50 +69,16 @@ public class AutoClickService extends AccessibilityService { logDebug("无障碍服务中断"); } - public void setClickPosition(float x, float y) { - Point constrained = ViewUtils.constrainToScreen(x, y, screenWidth, screenHeight); - clearEvents(); - eventQueue.add(new ClickEvent(constrained.x, constrained.y, -1)); - logDebug("设置单点点击位置: 原始 (" + x + ", " + y + ") -> 修正 (" + constrained.x + ", " + constrained.y + ")"); - } - public void clearEvents() { - eventQueue.clear(); + runtimeEvents.clear(); logDebug("清除所有事件"); } - public void addClickEvent(int x, int y, int index) { - Point constrained = ViewUtils.constrainToScreen(x, y, screenWidth, screenHeight); - eventQueue.add(new ClickEvent(constrained.x, constrained.y, index)); - logDebug("添加点击事件 #" + index + ": (" + constrained.x + ", " + constrained.y + ")"); - } - - public void addMultipleClickEvents(List positions) { + public void addMultipleClickEvents(List eventWrapperList) { clearEvents(); - for (int i = 0; i < positions.size(); i++) { - Point p = positions.get(i); - addClickEvent(p.x, p.y, i); - } - logDebug("设置多点点击事件: " + positions.size() + " 个点"); - } - public void addSlideEvent(int startX, int startY, int endX, int endY) { - Point constrainedStart = ViewUtils.constrainToScreen(startX, startY, screenWidth, screenHeight); - Point constrainedEnd = ViewUtils.constrainToScreen(endX, endY, screenWidth, screenHeight); - - eventQueue.add(new SlideMultipleEvent( - constrainedStart.x, constrainedStart.y, - constrainedEnd.x, constrainedEnd.y)); - - logDebug("添加滑动事件: 从 (" + constrainedStart.x + ", " + constrainedStart.y + - ") 到 (" + constrainedEnd.x + ", " + constrainedEnd.y + ")"); - } - - public void addMultipleSlideEvents(List slides) { - for (Slide slide : slides) { - addSlideEvent(slide.startX, slide.startY, slide.endX, slide.endY); - } - logDebug("添加多个滑动事件: " + slides.size() + " 个"); + runtimeEvents = new ArrayList<>(eventWrapperList); + logDebug("设置多点点击事件: " + eventWrapperList.size() + " 个点"); } public void setClickInterval(long interval) { @@ -141,15 +110,15 @@ public class AutoClickService extends AccessibilityService { public void startClicking() { if (!isRunning) { - if (eventQueue.isEmpty()) { + if (runtimeEvents.isEmpty()) { Log.w(TAG, "无事件队列,忽略开始"); return; } isRunning = true; currentEventIndex = 0; - logDebug("开始执行事件队列 - 共 " + eventQueue.size() + " 个事件"); - executeNextEvent(); + logDebug("开始执行事件队列 - 共 " + runtimeEvents.size() + " 个事件"); + executeEventsByType(); } } @@ -165,46 +134,40 @@ public class AutoClickService extends AccessibilityService { return isRunning; } - private void executeNextEvent() { - if (!isRunning || eventQueue.isEmpty()) { + private void executeEventsByType() { + if (!isRunning || runtimeEvents.isEmpty()) { logDebug("跳过执行:服务未运行或事件队列为空"); return; } - Event event = eventQueue.get(currentEventIndex); + runtimeEvents.sort(Comparator.comparingInt(EventWrapper::getOrder)); - if (event instanceof ClickEvent) { - ClickEvent clickEvent = (ClickEvent) event; - logDebug("即将执行点击事件: (" + clickEvent.getX() + ", " + clickEvent.getY() + "), index=" + clickEvent.getAdditionalInfo()); - } else if (event instanceof SlideMultipleEvent) { - SlideMultipleEvent slideMultipleEvent = (SlideMultipleEvent) event; - logDebug("即将执行滑动事件: 从 (" + slideMultipleEvent.startX + ", " + slideMultipleEvent.startY + ") 到 (" + slideMultipleEvent.endX + ", " + slideMultipleEvent.endY + ")"); - } else { - logDebug("未知事件类型: " + event.getClass().getSimpleName()); + if (currentEventIndex >= runtimeEvents.size()) { + currentEventIndex = 0; } - if (event instanceof ClickEvent) { - ClickEvent clickEvent = (ClickEvent) event; - Point clickPoint = new Point(clickEvent.getX(), clickEvent.getY()); - performSingleClick(clickPoint, clickEvent.getAdditionalInfo()); - } else if (event instanceof SlideMultipleEvent) { - SlideMultipleEvent slideMultipleEvent = (SlideMultipleEvent) event; - performSlide(slideMultipleEvent); - } else { - logDebug("未知事件类型,跳过执行: " + event.getClass().getSimpleName()); - // 也可以选择继续执行下一个 - handler.postDelayed(this::executeNextEvent, clickInterval); - } + EventWrapper wrapper = runtimeEvents.get(currentEventIndex); + Event event = wrapper.getEvent(); - // 准备下一个事件 - currentEventIndex = (currentEventIndex + 1) % eventQueue.size(); + if (wrapper.getType() == EventWrapper.EventType.POINT && event instanceof PointEvent) { + performSingleClick((PointEvent) event); + } else if (wrapper.getType() == EventWrapper.EventType.SLIDE && event instanceof SlideEvent) { + performSlide((SlideEvent) event); + } else { + logDebug("未知或不匹配的事件类型,跳过执行: " + wrapper.getType()); + currentEventIndex++; + handler.postDelayed(this::executeEventsByType, clickInterval); + } } - private void performSingleClick(Point clickPoint, int index) { - logDebug("执行点击: (" + clickPoint.x + ", " + clickPoint.y + ")"); + private void performSingleClick(PointEvent pointEvent) { + int x = pointEvent.getX(); + int y = pointEvent.getY(); + + logDebug("执行点击: (" + x + ", " + y + ")"); Path path = new Path(); - path.moveTo(clickPoint.x, clickPoint.y); + path.moveTo(x, y); GestureDescription.StrokeDescription stroke = new GestureDescription.StrokeDescription(path, 0, clickDuration); GestureDescription gesture = @@ -215,8 +178,10 @@ public class AutoClickService extends AccessibilityService { public void onCompleted(GestureDescription gestureDescription) { logDebug("点击完成"); if (isRunning) { - handler.postDelayed(() -> executeNextEvent(), clickInterval); - flashTouchFeedback(index); + int feedbackIndex = currentEventIndex; + currentEventIndex++; + handler.postDelayed(() -> executeEventsByType(), clickInterval); + flashTouchFeedback(feedbackIndex); } } @@ -224,19 +189,26 @@ public class AutoClickService extends AccessibilityService { public void onCancelled(GestureDescription gestureDescription) { Log.e(TAG, "点击被取消"); if (isRunning) { - handler.postDelayed(() -> executeNextEvent(), clickInterval + 300); + currentEventIndex++; + handler.postDelayed(() -> executeEventsByType(), clickInterval + 300); } } }, null); } - private void performSlide(SlideMultipleEvent slide) { - logDebug("执行滑动: 从 (" + slide.startX + ", " + slide.startY + - ") 到 (" + slide.endX + ", " + slide.endY + ")"); + private void performSlide(SlideEvent slideEvent) { + PointEvent start = slideEvent.getStartPoint(); + PointEvent end = slideEvent.getEndPoint(); + int startX = start.getX(); + int startY = start.getY(); + int endX = end.getX(); + int endY = end.getY(); + + logDebug("执行滑动: 从 (" + startX + ", " + startY + ") 到 (" + endX + ", " + endY + ")"); Path path = new Path(); - path.moveTo(slide.startX, slide.startY); - path.lineTo(slide.endX, slide.endY); + path.moveTo(startX, startY); + path.lineTo(endX, endY); GestureDescription.StrokeDescription stroke = new GestureDescription.StrokeDescription(path, 0, slideDuration); GestureDescription gesture = @@ -247,7 +219,10 @@ public class AutoClickService extends AccessibilityService { public void onCompleted(GestureDescription gestureDescription) { logDebug("滑动完成"); if (isRunning) { - handler.postDelayed(() -> executeNextEvent(), clickInterval); + int feedbackIndex = currentEventIndex; + currentEventIndex++; + handler.postDelayed(() -> executeEventsByType(), clickInterval); + flashTouchFeedback(feedbackIndex); } } @@ -255,7 +230,8 @@ public class AutoClickService extends AccessibilityService { public void onCancelled(GestureDescription gestureDescription) { Log.e(TAG, "滑动被取消"); if (isRunning) { - handler.postDelayed(() -> executeNextEvent(), clickInterval + 300); + currentEventIndex++; + handler.postDelayed(() -> executeEventsByType(), clickInterval + 300); } } }, null); diff --git a/app/src/main/java/com/auto/autoclicker/ClickEvent.java b/app/src/main/java/com/auto/autoclicker/ClickEvent.java deleted file mode 100644 index 3e6599c..0000000 --- a/app/src/main/java/com/auto/autoclicker/ClickEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.auto.autoclicker; - -public class ClickEvent extends Event { - private int additionalInfo; - - public ClickEvent(int x, int y, int additionalInfo) { - super(additionalInfo, x, y); - this.additionalInfo = additionalInfo; - } - - public int getAdditionalInfo() { - return additionalInfo; - } - - public void setAdditionalInfo(int additionalInfo) { - this.additionalInfo = additionalInfo; - } -} - diff --git a/app/src/main/java/com/auto/autoclicker/Event.java b/app/src/main/java/com/auto/autoclicker/Event.java deleted file mode 100644 index 3b6a2f5..0000000 --- a/app/src/main/java/com/auto/autoclicker/Event.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.auto.autoclicker; - -public class Event { - protected int id; - protected int x; - protected int y; - - public Event(int id, int x, int y) { - this.id = id; - this.x = x; - this.y = y; - } - - // Getter 方法 - public int getId() { - return id; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } -} diff --git a/app/src/main/java/com/auto/autoclicker/FloatingViewManager.java b/app/src/main/java/com/auto/autoclicker/FloatingViewManager.java index 59d9f12..a82ab3e 100644 --- a/app/src/main/java/com/auto/autoclicker/FloatingViewManager.java +++ b/app/src/main/java/com/auto/autoclicker/FloatingViewManager.java @@ -28,6 +28,11 @@ import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import com.auto.autoclicker.data.Event; +import com.auto.autoclicker.data.EventWrapper; +import com.auto.autoclicker.data.PointEvent; +import com.auto.autoclicker.data.PositionUpdater; +import com.auto.autoclicker.data.SlideEvent; import com.auto.autoclicker.util.PrefUtils; import com.auto.autoclicker.util.ScreenUtils; import com.auto.autoclicker.util.ViewUtils; @@ -40,33 +45,17 @@ public class FloatingViewManager { private static final long DEBOUNCE_INTERVAL = 500; private static final int TOUCH_POINT_SIZE = 100; - private static final int MODE_SINGLE = 1; - private static final int MODE_MULTIPLE = 2; - private final Context context; private final WindowManager windowManager; private final int screenWidth; private final int screenHeight; - private final List eventQueue = new ArrayList<>(); - private TextView singleTouchPointView; - private WindowManager.LayoutParams singleTouchPointParams; - private LinearLayout singleControlBarView; - private WindowManager.LayoutParams singleControlBarParams; + private final List runtimeEvents = new ArrayList<>(); + private int eventOrderCounter = 1; + private LinearLayout multipleControlBarView; private WindowManager.LayoutParams multipleControlBarParams; - private final List multipleTouchPointViews = new ArrayList<>(); - private final List multipleTouchPointParams = new ArrayList<>(); - private int touchPointNumber = 1; - private int eventIdCounter = 1; - - private final List clickPointEvents = new ArrayList<>(); - private final List slideEvents = new ArrayList<>(); - - private float touchPointX = 500; - private float touchPointY = 500; - private boolean isRunning = false; private boolean isMultipleRunning = false; private long lastToggleTime = 0; @@ -80,57 +69,81 @@ public class FloatingViewManager { Log.d(TAG, "Screen size: " + screenWidth + "x" + screenHeight); } - private void registerBroadcastReceiver() { - LocalBroadcastManager.getInstance(context).registerReceiver( - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if ("com.auto.autoclicker.FLASH_TOUCH_POINT".equals(intent.getAction())) { - int index = intent.getIntExtra("index", -1); - flashTouchPoint(index); - } - } - }, - new IntentFilter("com.auto.autoclicker.FLASH_TOUCH_POINT") - ); - } - public void showFloatingViews(int mode) throws SecurityException { if (!Settings.canDrawOverlays(context)) { - throw new SecurityException("Overlay permission required"); + throw new SecurityException("需要悬浮窗许可"); } removeFloatingViews(); + showMultipleModeViews(mode); - switch (mode) { - case MODE_SINGLE: - showSingleModeViews(); - break; - case MODE_MULTIPLE: - showMultipleModeViews(); - break; - default: - Log.e(TAG, "Invalid mode: " + mode); - break; - } - - Log.d(TAG, "Floating views added, mode = " + mode); + Log.d(TAG, "添加悬浮窗, 模式 = " + mode); } - private void showSingleModeViews() { - initSingleTouchPointView(); - initSingleControlBar(); + public void removeFloatingViews() { + try { + for (EventWrapper wrapper : new ArrayList<>(runtimeEvents)) { + if (wrapper.getType() == EventWrapper.EventType.POINT) { + PointEvent pe = (PointEvent) wrapper.getEvent(); + safeRemoveView(pe.getView()); + } + } - if (singleTouchPointView != null) { - windowManager.addView(singleTouchPointView, singleTouchPointParams); - } + for (EventWrapper wrapper : new ArrayList<>(runtimeEvents)) { + if (wrapper.getType() == EventWrapper.EventType.SLIDE) { + SlideEvent se = (SlideEvent) wrapper.getEvent(); + safeRemoveView(se.getStartPoint().getView()); + safeRemoveView(se.getEndPoint().getView()); + safeRemoveView(se.getLineView()); + } + } - if (singleControlBarView != null) { - windowManager.addView(singleControlBarView, singleControlBarParams); + runtimeEvents.clear(); + + Log.d(TAG, "remove runtimeEvents: " + runtimeEvents.size() + " eventOrderCounter :" + eventOrderCounter); + + if (multipleControlBarView != null) { + safeRemoveView(multipleControlBarView); + multipleControlBarView = null; + } + + isMultipleRunning = false; + Log.d(TAG, "悬浮窗已移除"); + } catch (Exception e) { + Log.e(TAG, "移除悬浮窗失败", e); + isMultipleRunning = false; } } - private void showMultipleModeViews() { + private void safeRemoveView(View view) { + try { + windowManager.removeView(view); + } catch (Exception e) { + Log.w(TAG, "移除视图失败: " + view, e); + } + } + + private void closeFloatingViews() { + AutoClickService service = AutoClickService.getInstance(); + if (service != null) { + service.stopClicking(); + } else { + Log.d(TAG, "自动点击服务没有初始化"); + Toast.makeText(context, "请同意无障碍服务权限", Toast.LENGTH_SHORT).show(); + } + + updateTouchPointsBackground(R.drawable.un_touch_point); + removeFloatingViews(); + + context.stopService(new Intent(context, ForegroundService.class)); + PrefUtils.setFloatingShown(context, 0); + + Intent intent = new Intent("com.auto.autoclicker.FLOATING_WINDOW_STATE_CHANGED"); + intent.putExtra("isShown", false); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } + + private void showMultipleModeViews(int mode) { initMultipleTouchPointView(); initMultipleControlBar(); @@ -139,62 +152,37 @@ public class FloatingViewManager { } } - @SuppressLint("ClickableViewAccessibility") - private void initSingleTouchPointView() { - singleTouchPointView = createTouchPointView("1"); - - singleTouchPointParams = createTouchPointParams(); - singleTouchPointParams.x = (int) touchPointX; - singleTouchPointParams.y = (int) touchPointY; - - singleTouchPointView.setOnTouchListener(new View.OnTouchListener() { - private float lastX, lastY; - private float paramX, paramY; - - @Override - public boolean onTouch(View v, MotionEvent event) { - if (isRunning && event.getAction() == MotionEvent.ACTION_UP) { - v.performClick(); - return true; - } - - if (isRunning) { - return false; - } - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - lastX = event.getRawX(); - lastY = event.getRawY(); - paramX = singleTouchPointParams.x; - paramY = singleTouchPointParams.y; - break; - case MotionEvent.ACTION_MOVE: - float dx = event.getRawX() - lastX; - float dy = event.getRawY() - lastY; - updateTouchPointPosition(paramX, paramY, dx, dy); - updateServiceClickPosition(); - break; - } - return true; - } - }); - } - - private void updateServiceClickPosition() { - AutoClickService service = AutoClickService.getInstance(); - if (service != null) { - service.setClickPosition(touchPointX, touchPointY); - Log.d(TAG, "Single touch point moved to: (" + touchPointX + ", " + touchPointY + ")"); - } - } - private void initMultipleTouchPointView() { - multipleTouchPointViews.clear(); - multipleTouchPointParams.clear(); - eventQueue.clear(); - eventIdCounter = 1; - touchPointNumber = 1; + runtimeEvents.clear(); + eventOrderCounter = 1; + + Log.d(TAG, "init runtimeEvents: " + runtimeEvents.size() + " eventOrderCounter :" + eventOrderCounter); + } + + @SuppressLint("ClickableViewAccessibility") + private void initMultipleControlBar() { + multipleControlBarView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.multiple_control_bar, null); + multipleControlBarParams = createControlBarParams(); + + setupDraggableView(multipleControlBarView, multipleControlBarParams, this::updateMoreControlBarPosition); + + setupControlButtons(multipleControlBarView); + } + + private void setupControlButtons(LinearLayout controlBar) { + ImageView playButton = controlBar.findViewById(R.id.play_button); + ImageView addButton = controlBar.findViewById(R.id.add_button); + ImageView removeButton = controlBar.findViewById(R.id.remove_button); + ImageView slideButton = controlBar.findViewById(R.id.slide_button); + ImageView closeButton = controlBar.findViewById(R.id.close_button); + ImageView settingButton = controlBar.findViewById(R.id.settings_button); + + playButton.setOnClickListener(v -> toggleMultipleClicking()); + addButton.setOnClickListener(v -> addPointEvent()); + removeButton.setOnClickListener(v -> removeLastEvent()); + slideButton.setOnClickListener(v -> addSlideEvent()); + closeButton.setOnClickListener(v -> closeFloatingViews()); + settingButton.setOnClickListener(v -> showInputDialog()); } private TextView createTouchPointView(String label) { @@ -223,44 +211,6 @@ public class FloatingViewManager { return params; } - @SuppressLint("ClickableViewAccessibility") - private void initSingleControlBar() { - singleControlBarView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.single_control_bar, null); - singleControlBarParams = createControlBarParams(); - - setupDraggableView(singleControlBarView, singleControlBarParams, this::updateSingleControlBarPosition); - - ImageView play = singleControlBarView.findViewById(R.id.play_button); - ImageView close = singleControlBarView.findViewById(R.id.close_button); - ImageView setting = singleControlBarView.findViewById(R.id.settings_button); - - play.setOnClickListener(v -> toggleSingleClicking(play)); - close.setOnClickListener(v -> closeFloatingViews()); - setting.setOnClickListener(v -> showInputDialog()); - } - - @SuppressLint("ClickableViewAccessibility") - private void initMultipleControlBar() { - multipleControlBarView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.multiple_control_bar, null); - multipleControlBarParams = createControlBarParams(); - - setupDraggableView(multipleControlBarView, multipleControlBarParams, this::updateMoreControlBarPosition); - - ImageView playButton = multipleControlBarView.findViewById(R.id.play_button); - ImageView addButton = multipleControlBarView.findViewById(R.id.add_button); - ImageView removeButton = multipleControlBarView.findViewById(R.id.remove_button); - ImageView slideButton = multipleControlBarView.findViewById(R.id.slide_button); - ImageView closeButton = multipleControlBarView.findViewById(R.id.close_button); - ImageView settingButton = multipleControlBarView.findViewById(R.id.settings_button); - - playButton.setOnClickListener(v -> toggleMultipleClicking()); - addButton.setOnClickListener(v -> addPointEvent()); - removeButton.setOnClickListener(v -> removeLastEvent()); - slideButton.setOnClickListener(v -> addSlideEvent()); - closeButton.setOnClickListener(v -> closeFloatingViews()); - settingButton.setOnClickListener(v -> showInputDialog()); - } - private WindowManager.LayoutParams createControlBarParams() { int overlayType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : @@ -280,8 +230,204 @@ public class FloatingViewManager { return params; } - interface PositionUpdater { - void update(float paramX, float paramY, float dx, float dy); + private WindowManager.LayoutParams createLineViewParams() { + int overlayType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : + WindowManager.LayoutParams.TYPE_PHONE; + + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT, + overlayType, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, + PixelFormat.TRANSLUCENT + ); + params.gravity = Gravity.TOP | Gravity.START; + params.x = 0; + params.y = 0; + return params; + } + + @SuppressLint("ClickableViewAccessibility") + private void addPointEvent() { + if (isMultipleRunning) { + Toast.makeText(context, "请停止点击", Toast.LENGTH_SHORT).show(); + return; + } + + TextView point = createTouchPointView(String.valueOf(eventOrderCounter)); + + WindowManager.LayoutParams params = createTouchPointParams(); + params.x = screenWidth / 2 - TOUCH_POINT_SIZE / 2; + params.y = screenHeight / 2 - TOUCH_POINT_SIZE / 2; + + PointEvent pointEvent = new PointEvent(eventOrderCounter, params.x, params.y, point, params); + + runtimeEvents.add(new EventWrapper(EventWrapper.EventType.POINT, pointEvent, eventOrderCounter)); + eventOrderCounter++; + + Log.d(TAG, "addPoint runtimeEvents: " + runtimeEvents.size() + " eventOrderCounter :" + eventOrderCounter); + + setupDraggablePoint(point, params, pointEvent); + windowManager.addView(point, params); + updateServicePositions(); + } + + @SuppressLint("ClickableViewAccessibility") + private void addSlideEvent() { + if (isMultipleRunning) { + Toast.makeText(context, "请先停止点击", Toast.LENGTH_SHORT).show(); + return; + } + + TextView startPoint = createTouchPointView(String.valueOf(eventOrderCounter)); + WindowManager.LayoutParams startParams = createTouchPointParams(); + startParams.x = screenWidth / 2 - 100; + startParams.y = screenHeight / 2 - 50; + PointEvent startPointEvent = new PointEvent(eventOrderCounter, startParams.x, startParams.y, startPoint, startParams); + + TextView endPoint = createTouchPointView(String.valueOf(eventOrderCounter)); + WindowManager.LayoutParams endParams = createTouchPointParams(); + endParams.x = screenWidth / 2 + 100; + endParams.y = screenHeight / 2 - 50; + PointEvent endPointEvent = new PointEvent(eventOrderCounter, endParams.x, endParams.y, endPoint, endParams); + + ConnectingLineView lineView = new ConnectingLineView(context); + WindowManager.LayoutParams lineParams = createLineViewParams(); + + SlideEvent slideEvent = new SlideEvent(eventOrderCounter, startPointEvent, endPointEvent, lineView, lineParams); + + runtimeEvents.add(new EventWrapper(EventWrapper.EventType.SLIDE, slideEvent, eventOrderCounter)); + eventOrderCounter++; + + Log.d(TAG, "addSlide runtimeEvents: " + runtimeEvents.size() + " eventOrderCounter :" + eventOrderCounter); + + setupDraggableSlidePoint(startPoint, startParams, startPointEvent, slideEvent); + setupDraggableSlidePoint(endPoint, endParams, endPointEvent, slideEvent); + + windowManager.addView(lineView, lineParams); + windowManager.addView(startPoint, startParams); + windowManager.addView(endPoint, endParams); + + updateLinePosition(slideEvent); + updateServicePositions(); + } + + private void removeLastEvent() { + if (isMultipleRunning) { + Toast.makeText(context, "请先停止点击", Toast.LENGTH_SHORT).show(); + return; + } + + if (runtimeEvents.isEmpty()) { + Toast.makeText(context, "没有更多的事件需要删除", Toast.LENGTH_SHORT).show(); + return; + } + + Event lastEvent = runtimeEvents.remove(runtimeEvents.size() - 1).getEvent(); + removeEvent(lastEvent); + eventOrderCounter--; + updateServicePositions(); + } + + private void removeEvent(Event event) { + try { + if (event instanceof PointEvent) { + PointEvent pointEvent = (PointEvent) event; + windowManager.removeView(pointEvent.getView()); + } else if (event instanceof SlideEvent) { + SlideEvent slideEvent = (SlideEvent) event; + windowManager.removeView(slideEvent.getStartPoint().getView()); + windowManager.removeView(slideEvent.getEndPoint().getView()); + windowManager.removeView(slideEvent.getLineView()); + } + } catch (Exception e) { + Log.w(TAG, "删除事件失败", e); + } + } + + private void updateServicePositions() { + AutoClickService service = AutoClickService.getInstance(); + if (service != null) { + service.addMultipleClickEvents(runtimeEvents); + } + } + + private void toggleMultipleClicking() { + if (isDebounced()) return; + + AutoClickService service = AutoClickService.getInstance(); + if (service == null) { + handleMissingService(); + return; + } + + if (runtimeEvents.isEmpty()) { + Toast.makeText(context, "请添加一个触摸点或者滑动事件", Toast.LENGTH_SHORT).show(); + return; + } + + if (isMultipleRunning) { + stopMultiClicking(service); + } else { + startMultiClicking(service); + } + + isMultipleRunning = !isMultipleRunning; + Log.d(TAG, "多点点击服务状态: " + service.isClicking()); + } + + private void startMultiClicking(AutoClickService service) { + service.addMultipleClickEvents(runtimeEvents); + service.startClicking(); + + Log.d(TAG, "开始多点点击事件 " + runtimeEvents.size()); + Toast.makeText(context, "多点点击开始", Toast.LENGTH_SHORT).show(); + + updateTouchPointsBackground(R.drawable.touch_point); + } + + private void stopMultiClicking(AutoClickService service) { + service.stopClicking(); + Toast.makeText(context, "多点点击停止", Toast.LENGTH_SHORT).show(); + + updateTouchPointsBackground(R.drawable.un_touch_point); + } + + private void updateTouchPointsBackground(int resourceId) { + for (EventWrapper wrapper : new ArrayList<>(runtimeEvents)) { + if (wrapper.getType() == EventWrapper.EventType.POINT) { + PointEvent pe = (PointEvent) wrapper.getEvent(); + pe.getView().setBackgroundResource(resourceId); + } + } + + for (EventWrapper wrapper : new ArrayList<>(runtimeEvents)) { + if (wrapper.getType() == EventWrapper.EventType.SLIDE) { + SlideEvent se = (SlideEvent) wrapper.getEvent(); + se.getStartPoint().getView().setBackgroundResource(resourceId); + se.getEndPoint().getView().setBackgroundResource(resourceId); + } + } + } + + private void handleMissingService() { + Log.e(TAG, "自动点击服务没有初始化"); + Toast.makeText(context, "请在设置里同意无障碍服务", Toast.LENGTH_LONG).show(); + Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + private boolean isDebounced() { + long currentTime = System.currentTimeMillis(); + if (currentTime - lastToggleTime < DEBOUNCE_INTERVAL) { + return true; + } + lastToggleTime = currentTime; + return false; } @SuppressLint("ClickableViewAccessibility") @@ -293,9 +439,7 @@ public class FloatingViewManager { @Override public boolean onTouch(View v, MotionEvent event) { - boolean clickingState = view == multipleControlBarView ? isMultipleRunning : isRunning; - - if (clickingState) { + if (isMultipleRunning) { if (event.getAction() == MotionEvent.ACTION_UP) { v.performClick(); return true; @@ -331,148 +475,6 @@ public class FloatingViewManager { }); } - private void toggleSingleClicking(ImageView playButton) { - if (isDebounced()) return; - - AutoClickService service = AutoClickService.getInstance(); - if (service == null) { - handleMissingService(); - return; - } - - if (isRunning) { - stopSingleClicking(service, playButton); - } else { - startSingleClicking(service, playButton); - } - - isRunning = !isRunning; - Log.d(TAG, "Single service clicking state: " + service.isClicking()); - } - - private void startSingleClicking(AutoClickService service, ImageView playButton) { - service.setClickPosition(touchPointX, touchPointY); - service.startClicking(); - playButton.setBackgroundResource(R.drawable.pause); - singleTouchPointView.setBackgroundResource(R.drawable.touch_point); - Toast.makeText(context, "Auto clicking started", Toast.LENGTH_SHORT).show(); - } - - private void stopSingleClicking(AutoClickService service, ImageView playButton) { - service.stopClicking(); - playButton.setBackgroundResource(R.drawable.play); - singleTouchPointView.setBackgroundResource(R.drawable.un_touch_point); - Toast.makeText(context, "Auto clicking stopped", Toast.LENGTH_SHORT).show(); - } - - private void closeFloatingViews() { - AutoClickService service = AutoClickService.getInstance(); - if (service != null) { - service.stopClicking(); - } else { - Log.d(TAG, "AutoClickService not initialized"); - Toast.makeText(context, "Please enable accessibility service", Toast.LENGTH_SHORT).show(); - } - - updateTouchPointsBackground(R.drawable.un_touch_point); - removeFloatingViews(); - - context.stopService(new Intent(context, ForegroundService.class)); - PrefUtils.setFloatingShown(context, 0); - - Intent intent = new Intent("com.auto.autoclicker.FLOATING_WINDOW_STATE_CHANGED"); - intent.putExtra("isShown", false); - LocalBroadcastManager.getInstance(context).sendBroadcast(intent); - } - - private void updateTouchPointsBackground(int resourceId) { - if (singleTouchPointView != null) { - singleTouchPointView.setBackgroundResource(resourceId); - } - - for (View point : multipleTouchPointViews) { - point.setBackgroundResource(resourceId); - } - } - - private void toggleMultipleClicking() { - if (isDebounced()) return; - - AutoClickService service = AutoClickService.getInstance(); - if (service == null) { - handleMissingService(); - return; - } - - if (eventQueue.isEmpty()) { - Toast.makeText(context, "Please add touch points or slide events first", Toast.LENGTH_SHORT).show(); - return; - } - - if (isMultipleRunning) { - stopMultiClicking(service); - } else { - startMultiClicking(service); - } - - isMultipleRunning = !isMultipleRunning; - Log.d(TAG, "Multi service clicking state: " + service.isClicking()); - } - - private void startMultiClicking(AutoClickService service) { - service.addMultipleClickEvents(getMoreTouchPositions()); - service.addMultipleSlideEvents(getSlideEvents()); - service.startClicking(); - Toast.makeText(context, "Multi-point clicking started", Toast.LENGTH_SHORT).show(); - Log.d(TAG, "开始多点点击事件 " + getMoreTouchPositions()); - - for (View point : multipleTouchPointViews) { - point.setBackgroundResource(R.drawable.touch_point); - } - } - - private void stopMultiClicking(AutoClickService service) { - service.stopClicking(); - Toast.makeText(context, "Multi-point clicking stopped", Toast.LENGTH_SHORT).show(); - - for (View point : multipleTouchPointViews) { - point.setBackgroundResource(R.drawable.un_touch_point); - } - } - - private void handleMissingService() { - Log.e(TAG, "AutoClickService not initialized"); - Toast.makeText(context, "Please enable accessibility service in settings", Toast.LENGTH_LONG).show(); - Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - - @SuppressLint("ClickableViewAccessibility") - private void addPointEvent() { - if (isMultipleRunning) { - Toast.makeText(context, "Please stop clicking first", Toast.LENGTH_SHORT).show(); - return; - } - - TextView point = createTouchPointView(String.valueOf(touchPointNumber)); - touchPointNumber++; - - WindowManager.LayoutParams params = createTouchPointParams(); - params.x = screenWidth / 2 - TOUCH_POINT_SIZE / 2; - params.y = screenHeight / 2 - TOUCH_POINT_SIZE / 2; - - PointEvent pointEvent = new PointEvent(eventIdCounter++, params.x, params.y, point, params); - eventQueue.add(pointEvent); - clickPointEvents.add(pointEvent); - multipleTouchPointViews.add(point); - multipleTouchPointParams.add(params); - - setupDraggablePoint(point, params, pointEvent); - windowManager.addView(point, params); - updateServicePositions(); - } - @SuppressLint("ClickableViewAccessibility") private void setupDraggablePoint(TextView point, WindowManager.LayoutParams params, PointEvent pointEvent) { point.setOnTouchListener(new View.OnTouchListener() { @@ -504,8 +506,8 @@ public class FloatingViewManager { screenWidth - point.getWidth(), screenHeight - point.getHeight()); params.x = constrainedPoint.x; params.y = constrainedPoint.y; - pointEvent.x = params.x; - pointEvent.y = params.y; + pointEvent.setX(params.x); + pointEvent.setY(params.y); windowManager.updateViewLayout(point, params); updateServicePositions(); return true; @@ -518,68 +520,6 @@ public class FloatingViewManager { }); } - @SuppressLint("ClickableViewAccessibility") - private void addSlideEvent() { - if (isMultipleRunning) { - Toast.makeText(context, "Please stop clicking first", Toast.LENGTH_SHORT).show(); - return; - } - - TextView startPoint = createTouchPointView(String.valueOf(touchPointNumber)); - WindowManager.LayoutParams startParams = createTouchPointParams(); - startParams.x = screenWidth / 2 - 100; - startParams.y = screenHeight / 2 - 50; - PointEvent startPointEvent = new PointEvent(eventIdCounter++, startParams.x, startParams.y, startPoint, startParams); - - TextView endPoint = createTouchPointView(String.valueOf(touchPointNumber)); - touchPointNumber++; - WindowManager.LayoutParams endParams = createTouchPointParams(); - endParams.x = screenWidth / 2 + 100; - endParams.y = screenHeight / 2 - 50; - PointEvent endPointEvent = new PointEvent(eventIdCounter++, endParams.x, endParams.y, endPoint, endParams); - - ConnectingLineView lineView = new ConnectingLineView(context); - WindowManager.LayoutParams lineParams = createLineViewParams(); - - SlideEvent slideEvent = new SlideEvent(eventIdCounter++, startPointEvent, endPointEvent, lineView, lineParams); - eventQueue.add(slideEvent); - slideEvents.add(slideEvent); - multipleTouchPointViews.add(startPoint); - multipleTouchPointViews.add(endPoint); - multipleTouchPointParams.add(startParams); - multipleTouchPointParams.add(endParams); - - setupDraggableSlidePoint(startPoint, startParams, startPointEvent, slideEvent); - setupDraggableSlidePoint(endPoint, endParams, endPointEvent, slideEvent); - - windowManager.addView(lineView, lineParams); - windowManager.addView(startPoint, startParams); - windowManager.addView(endPoint, endParams); - - updateLinePosition(slideEvent); - updateServicePositions(); - } - - private WindowManager.LayoutParams createLineViewParams() { - int overlayType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? - WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : - WindowManager.LayoutParams.TYPE_PHONE; - - WindowManager.LayoutParams params = new WindowManager.LayoutParams( - WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.MATCH_PARENT, - overlayType, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | - WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, - PixelFormat.TRANSLUCENT - ); - params.gravity = Gravity.TOP | Gravity.START; - params.x = 0; - params.y = 0; - return params; - } - @SuppressLint("ClickableViewAccessibility") private void setupDraggableSlidePoint(TextView point, WindowManager.LayoutParams params, PointEvent pointEvent, SlideEvent slideEvent) { @@ -612,8 +552,8 @@ public class FloatingViewManager { screenWidth - point.getWidth(), screenHeight - point.getHeight()); params.x = constrainedPoint.x; params.y = constrainedPoint.y; - pointEvent.x = params.x; - pointEvent.y = params.y; + pointEvent.setX(params.x); + pointEvent.setY(params.y); windowManager.updateViewLayout(point, params); updateLinePosition(slideEvent); @@ -628,173 +568,27 @@ public class FloatingViewManager { }); } - private void updateLinePosition(SlideEvent slideEvent) { - PointEvent start = slideEvent.getStartPoint(); - PointEvent end = slideEvent.getEndPoint(); - ConnectingLineView lineView = slideEvent.getLineView(); - - float startCenterX = start.x + (float) TOUCH_POINT_SIZE / 2; - float startCenterY = start.y + (float) TOUCH_POINT_SIZE / 2; - float endCenterX = end.x + (float) TOUCH_POINT_SIZE / 2; - float endCenterY = end.y + (float) TOUCH_POINT_SIZE / 2; - - lineView.setPoints(startCenterX, startCenterY, endCenterX, endCenterY); - } - - private void removeLastEvent() { - if (isMultipleRunning) { - Toast.makeText(context, "Please stop clicking first", Toast.LENGTH_SHORT).show(); - return; - } - - if (eventQueue.isEmpty()) { - Toast.makeText(context, "No more events to remove", Toast.LENGTH_SHORT).show(); - return; - } - - Event lastEvent = eventQueue.remove(eventQueue.size() - 1); - removeEvent(lastEvent); - touchPointNumber--; - updateServicePositions(); - } - - private void removeEvent(Event event) { - try { - if (event instanceof PointEvent) { - PointEvent pointEvent = (PointEvent) event; - windowManager.removeView(pointEvent.getView()); - multipleTouchPointViews.remove(pointEvent.getView()); - multipleTouchPointParams.remove(pointEvent.getParams()); - } else if (event instanceof SlideEvent) { - SlideEvent slideEvent = (SlideEvent) event; - windowManager.removeView(slideEvent.getStartPoint().getView()); - windowManager.removeView(slideEvent.getEndPoint().getView()); - windowManager.removeView(slideEvent.getLineView()); - multipleTouchPointViews.remove(slideEvent.getStartPoint().getView()); - multipleTouchPointViews.remove(slideEvent.getEndPoint().getView()); - multipleTouchPointParams.remove(slideEvent.getStartPoint().getParams()); - multipleTouchPointParams.remove(slideEvent.getEndPoint().getParams()); - } - } catch (Exception e) { - Log.w(TAG, "Failed to remove event", e); - } - } - - private void updateServicePositions() { - List points = new ArrayList<>(); - List slides = new ArrayList<>(); - for (Event event : eventQueue) { - if (event instanceof PointEvent) { - PointEvent pe = (PointEvent) event; - points.add(new Point(pe.x, pe.y)); - } else if (event instanceof SlideEvent) { - SlideEvent se = (SlideEvent) event; - slides.add(new Slide(se.getStartPoint().x, se.getStartPoint().y, se.getEndPoint().x, se.getEndPoint().y)); - } - } - - AutoClickService service = AutoClickService.getInstance(); - if (service != null) { - service.addMultipleClickEvents(points); - service.addMultipleSlideEvents(slides); - Log.d(TAG, "添加多点点击事件 " + points); - } - } - - public void removeFloatingViews() { - try { - if (singleTouchPointView != null) { - try { - windowManager.removeView(singleTouchPointView); - } catch (Exception e) { - Log.w(TAG, "移除 singleTouchPointView 失败", e); - } - singleTouchPointView = null; - } - - List pointsToRemove = new ArrayList<>(multipleTouchPointViews); - for (View point : pointsToRemove) { - try { - windowManager.removeView(point); - multipleTouchPointViews.remove(point); - } catch (Exception e) { - Log.w(TAG, "移除 multiTouchPoint 失败", e); - } - } - multipleTouchPointParams.clear(); - - for (Event event : new ArrayList<>(eventQueue)) { - if (event instanceof SlideEvent) { - SlideEvent se = (SlideEvent) event; - try { - windowManager.removeView(se.getLineView()); - } catch (Exception e) { - Log.w(TAG, "移除滑动线失败", e); - } - } - } - eventQueue.clear(); - - if (singleControlBarView != null) { - try { - windowManager.removeView(singleControlBarView); - } catch (Exception e) { - Log.w(TAG, "移除 singleControlBarView 失败", e); - } - singleControlBarView = null; - } - - if (multipleControlBarView != null) { - try { - windowManager.removeView(multipleControlBarView); - } catch (Exception e) { - Log.w(TAG, "移除 multipleControlBarView 失败", e); - } - multipleControlBarView = null; - } - - isRunning = false; - isMultipleRunning = false; - Log.d(TAG, "悬浮窗已移除"); - } catch (Exception e) { - Log.e(TAG, "移除悬浮窗失败", e); - isRunning = false; - isMultipleRunning = false; - } - } - - private void updateTouchPointPosition(float paramX, float paramY, float dx, float dy) { - Point constrainedPoint = ViewUtils.constrainToScreen( - paramX + dx, paramY + dy, screenWidth - singleTouchPointView.getWidth(), screenHeight - singleTouchPointView.getHeight()); - singleTouchPointParams.x = constrainedPoint.x; - singleTouchPointParams.y = constrainedPoint.y; - touchPointX = singleTouchPointParams.x; - touchPointY = singleTouchPointParams.y; - windowManager.updateViewLayout(singleTouchPointView, singleTouchPointParams); - } - - private void updateSingleControlBarPosition(float paramX, float paramY, float dx, float dy) { - Point constrainedPoint = ViewUtils.constrainToScreen( - paramX + dx, paramY + dy, screenWidth - singleControlBarView.getWidth(), screenHeight - singleControlBarView.getHeight()); - singleControlBarParams.x = constrainedPoint.x; - singleControlBarParams.y = constrainedPoint.y; - windowManager.updateViewLayout(singleControlBarView, singleControlBarParams); - } - private void updateMoreControlBarPosition(float paramX, float paramY, float dx, float dy) { Point constrainedPoint = ViewUtils.constrainToScreen( - paramX + dx, paramY + dy, screenWidth - multipleControlBarView.getWidth(), screenHeight - multipleControlBarView.getHeight()); + paramX + dx, paramY + dy, + screenWidth - multipleControlBarView.getWidth(), + screenHeight - multipleControlBarView.getHeight()); multipleControlBarParams.x = constrainedPoint.x; multipleControlBarParams.y = constrainedPoint.y; windowManager.updateViewLayout(multipleControlBarView, multipleControlBarParams); } - private List getMoreTouchPositions() { - List points = new ArrayList<>(); - for (PointEvent pointEvent : clickPointEvents) { - points.add(new Point(pointEvent.getX(), pointEvent.getY())); - } - return points; + private void updateLinePosition(SlideEvent slideEvent) { + PointEvent start = slideEvent.getStartPoint(); + PointEvent end = slideEvent.getEndPoint(); + ConnectingLineView lineView = slideEvent.getLineView(); + + float startCenterX = start.getX() + (float) TOUCH_POINT_SIZE / 2; + float startCenterY = start.getY() + (float) TOUCH_POINT_SIZE / 2; + float endCenterX = end.getX() + (float) TOUCH_POINT_SIZE / 2; + float endCenterY = end.getY() + (float) TOUCH_POINT_SIZE / 2; + + lineView.setPoints(startCenterX, startCenterY, endCenterX, endCenterY); } public void showInputDialog() { @@ -846,55 +640,46 @@ public class FloatingViewManager { }); } - private List getSlideEvents() { - List slides = new ArrayList<>(); - for (Event event : eventQueue) { - if (event instanceof SlideEvent) { - SlideEvent se = (SlideEvent) event; - slides.add(new Slide(se.getStartPoint().x, se.getStartPoint().y, se.getEndPoint().x, se.getEndPoint().y)); - } - } - return slides; - } - public void flashTouchPoint(int index) { - if (index == -1) { - if (singleTouchPointView != null) { - singleTouchPointView.animate() - .alpha(0.3f) - .setDuration(100) - .withEndAction(() -> - singleTouchPointView.animate() - .alpha(1.0f) - .setDuration(100) - .start() - ) - .start(); - } - } else { - if (index >= 0 && index < multipleTouchPointViews.size()) { - View point = multipleTouchPointViews.get(index); - point.animate() - .alpha(0.3f) - .setDuration(100) - .withEndAction(() -> - point.animate() - .alpha(1.0f) - .setDuration(100) - .start() - ) - .start(); + if (index >= 0 && index < runtimeEvents.size()) { + Event event = runtimeEvents.get(index).getEvent(); + Log.d(TAG, "index : " + index); + + if (event instanceof PointEvent) { + flashView(((PointEvent) event).getView()); + } else if (event instanceof SlideEvent) { + SlideEvent slide = (SlideEvent) event; + flashView(slide.getStartPoint().getView()); + flashView(slide.getEndPoint().getView()); } } } - private boolean isDebounced() { - long currentTime = System.currentTimeMillis(); - if (currentTime - lastToggleTime < DEBOUNCE_INTERVAL) { - return true; + private void flashView(View view) { + if (view != null) { + view.animate() + .alpha(0.3f) + .setDuration(100) + .withEndAction(() -> view.animate() + .alpha(1.0f) + .setDuration(100) + .start()) + .start(); } - lastToggleTime = currentTime; - return false; } + private void registerBroadcastReceiver() { + LocalBroadcastManager.getInstance(context).registerReceiver( + new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if ("com.auto.autoclicker.FLASH_TOUCH_POINT".equals(intent.getAction())) { + int index = intent.getIntExtra("index", -1); + flashTouchPoint(index); + } + } + }, + new IntentFilter("com.auto.autoclicker.FLASH_TOUCH_POINT") + ); + } } \ No newline at end of file diff --git a/app/src/main/java/com/auto/autoclicker/ForegroundService.java b/app/src/main/java/com/auto/autoclicker/ForegroundService.java index e74de4b..b90367a 100644 --- a/app/src/main/java/com/auto/autoclicker/ForegroundService.java +++ b/app/src/main/java/com/auto/autoclicker/ForegroundService.java @@ -64,7 +64,6 @@ public class ForegroundService extends Service { return START_STICKY; } - private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( diff --git a/app/src/main/java/com/auto/autoclicker/PointEvent.java b/app/src/main/java/com/auto/autoclicker/PointEvent.java deleted file mode 100644 index 1571a46..0000000 --- a/app/src/main/java/com/auto/autoclicker/PointEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.auto.autoclicker; - -import android.view.WindowManager; -import android.widget.TextView; - -public class PointEvent extends Event { - private TextView view; - private WindowManager.LayoutParams params; - - public PointEvent(int id, int x, int y, TextView view, WindowManager.LayoutParams params) { - super(id, x, y); - this.view = view; - this.params = params; - } - - public TextView getView() { - return view; - } - - public WindowManager.LayoutParams getParams() { - return params; - } - - public void setView(TextView view) { - this.view = view; - } - - public void setParams(WindowManager.LayoutParams params) { - this.params = params; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/auto/autoclicker/Slide.java b/app/src/main/java/com/auto/autoclicker/Slide.java deleted file mode 100644 index 4b0dc84..0000000 --- a/app/src/main/java/com/auto/autoclicker/Slide.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.auto.autoclicker; - -public class Slide { - public final int startX; - public final int startY; - public final int endX; - public final int endY; - - public Slide(int startX, int startY, int endX, int endY) { - this.startX = startX; - this.startY = startY; - this.endX = endX; - this.endY = endY; - } -} - diff --git a/app/src/main/java/com/auto/autoclicker/SlideMultipleEvent.java b/app/src/main/java/com/auto/autoclicker/SlideMultipleEvent.java deleted file mode 100644 index b2e264f..0000000 --- a/app/src/main/java/com/auto/autoclicker/SlideMultipleEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.auto.autoclicker; - -public class SlideMultipleEvent extends Event { - public int startX; - public int startY; - public int endX; - public int endY; - - public SlideMultipleEvent(int startX, int startY, int endX, int endY) { - super(-1, startX, startY); - this.startX = startX; - this.startY = startY; - this.endX = endX; - this.endY = endY; - } - - public SlideMultipleEvent(int id, int startX, int startY, int endX, int endY) { - super(id, startX, startY); - this.startX = startX; - this.startY = startY; - this.endX = endX; - this.endY = endY; - } -} - - diff --git a/app/src/main/java/com/auto/autoclicker/data/Event.java b/app/src/main/java/com/auto/autoclicker/data/Event.java new file mode 100644 index 0000000..fd2a223 --- /dev/null +++ b/app/src/main/java/com/auto/autoclicker/data/Event.java @@ -0,0 +1,13 @@ +package com.auto.autoclicker.data; + +public abstract class Event { + protected int id; + + public Event(int id) { + this.id = id; + } + + public int getId() { + return id; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/auto/autoclicker/data/EventWrapper.java b/app/src/main/java/com/auto/autoclicker/data/EventWrapper.java new file mode 100644 index 0000000..27e9778 --- /dev/null +++ b/app/src/main/java/com/auto/autoclicker/data/EventWrapper.java @@ -0,0 +1,40 @@ +package com.auto.autoclicker.data; + +public class EventWrapper { + public enum EventType { POINT, SLIDE } + + private EventType type; + private Event event; + private int order; // 添加顺序编号(用于UI编号) + + public EventWrapper(EventType type, Event event, int order) { + this.type = type; + this.event = event; + this.order = order; + } + + + public EventType getType() { + return type; + } + + public void setType(EventType type) { + this.type = type; + } + + public Event getEvent() { + return event; + } + + public void setEvent(Event event) { + this.event = event; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } +} diff --git a/app/src/main/java/com/auto/autoclicker/data/PointEvent.java b/app/src/main/java/com/auto/autoclicker/data/PointEvent.java new file mode 100644 index 0000000..22eeec3 --- /dev/null +++ b/app/src/main/java/com/auto/autoclicker/data/PointEvent.java @@ -0,0 +1,52 @@ +package com.auto.autoclicker.data; + +import android.view.View; +import android.view.WindowManager; +import android.widget.TextView; + +public class PointEvent extends Event { + private int x; + private int y; + private TextView view; // 悬浮窗上的控件 + private WindowManager.LayoutParams layoutParams; + + public PointEvent(int id, int x, int y, TextView view, WindowManager.LayoutParams layoutParams) { + super(id); + this.x = x; + this.y = y; + this.view = view; + this.layoutParams = layoutParams; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public View getView() { + return view; + } + + public void setView(TextView view) { + this.view = view; + } + + public WindowManager.LayoutParams getLayoutParams() { + return layoutParams; + } + + public void setLayoutParams(WindowManager.LayoutParams layoutParams) { + this.layoutParams = layoutParams; + } +} diff --git a/app/src/main/java/com/auto/autoclicker/data/PositionUpdater.java b/app/src/main/java/com/auto/autoclicker/data/PositionUpdater.java new file mode 100644 index 0000000..b12fc27 --- /dev/null +++ b/app/src/main/java/com/auto/autoclicker/data/PositionUpdater.java @@ -0,0 +1,5 @@ +package com.auto.autoclicker.data; + +public interface PositionUpdater { + void update(float paramX, float paramY, float dx, float dy); +} diff --git a/app/src/main/java/com/auto/autoclicker/SlideEvent.java b/app/src/main/java/com/auto/autoclicker/data/SlideEvent.java similarity index 79% rename from app/src/main/java/com/auto/autoclicker/SlideEvent.java rename to app/src/main/java/com/auto/autoclicker/data/SlideEvent.java index 8d50c8b..4336ed3 100644 --- a/app/src/main/java/com/auto/autoclicker/SlideEvent.java +++ b/app/src/main/java/com/auto/autoclicker/data/SlideEvent.java @@ -1,16 +1,19 @@ -package com.auto.autoclicker; +package com.auto.autoclicker.data; import android.view.WindowManager; +import com.auto.autoclicker.ConnectingLineView; + public class SlideEvent extends Event { private PointEvent startPoint; private PointEvent endPoint; private ConnectingLineView lineView; private WindowManager.LayoutParams lineParams; + private long durationMillis; // 滑动时间 public SlideEvent(int id, PointEvent startPoint, PointEvent endPoint, ConnectingLineView lineView, WindowManager.LayoutParams lineParams) { - super(id, 0, 0); + super(id); this.startPoint = startPoint; this.endPoint = endPoint; this.lineView = lineView; @@ -21,32 +24,39 @@ public class SlideEvent extends Event { return startPoint; } - public PointEvent getEndPoint() { - return endPoint; - } - - public ConnectingLineView getLineView() { - return lineView; - } - - public WindowManager.LayoutParams getLineParams() { - return lineParams; - } - public void setStartPoint(PointEvent startPoint) { this.startPoint = startPoint; } + public PointEvent getEndPoint() { + return endPoint; + } + public void setEndPoint(PointEvent endPoint) { this.endPoint = endPoint; } + public ConnectingLineView getLineView() { + return lineView; + } + public void setLineView(ConnectingLineView lineView) { this.lineView = lineView; } + public WindowManager.LayoutParams getLineParams() { + return lineParams; + } + public void setLineParams(WindowManager.LayoutParams lineParams) { this.lineParams = lineParams; } -} + public long getDurationMillis() { + return durationMillis; + } + + public void setDurationMillis(long durationMillis) { + this.durationMillis = durationMillis; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/single_control_bar.xml b/app/src/main/res/layout/single_control_bar.xml deleted file mode 100644 index e8ced22..0000000 --- a/app/src/main/res/layout/single_control_bar.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file