diff --git a/app/src/main/java/com/auto/clicker/autoclicker/util/FloatingTabDialogManager.java b/app/src/main/java/com/auto/clicker/autoclicker/util/FloatingTabDialogManager.java index 9448247..e6b89d1 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/util/FloatingTabDialogManager.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/util/FloatingTabDialogManager.java @@ -91,22 +91,24 @@ public class FloatingTabDialogManager { @Override public void onComplete(Long solutionId) { if (solutionId != -1) { - Toast.makeText(context, "方案 '" + solutionName + "' 保存成功!", Toast.LENGTH_SHORT).show(); + showToastOnUi(context, "方案 '" + solutionName + "' 保存成功!"); removeFloatingTabDialog(); } else { - Toast.makeText(context, "保存方案失败。", Toast.LENGTH_SHORT).show(); + showToastOnUi(context, "保存方案失败。"); } } @Override public void onError(Exception e) { Log.e(TAG, "保存方案失败: " + e.getMessage(), e); - Toast.makeText(context, "保存方案失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + showToastOnUi(context, "保存方案失败: " + e.getMessage()); } }); - // ✅ 只在验证通过时才显示 - Toast.makeText(context, "正在保存方案...", Toast.LENGTH_SHORT).show(); + + // 这个可能也是在后台线程,保险起见也用主线程 + showToastOnUi(context, "正在保存方案..."); } + }); closeButton.setOnClickListener(v -> removeFloatingTabDialog()); @@ -242,4 +244,11 @@ public class FloatingTabDialogManager { } } } + + public static void showToastOnUi(Context context, String msg) { + new Handler(Looper.getMainLooper()).post(() -> + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() + ); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java index 5f4a4d4..04d780a 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingViewManager.java @@ -11,6 +11,8 @@ import android.graphics.PixelFormat; import android.graphics.Point; import android.net.Uri; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.provider.Settings; import android.text.InputType; import android.util.Log; @@ -679,6 +681,11 @@ public class FloatingViewManager { PointEvent end = slideEvent.getEndPoint(); ConnectingLineView lineView = slideEvent.getLineView(); + if (lineView == null) { + Log.e(TAG, "updateLinePosition: lineView is null, cannot update line"); + return; + } + 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; @@ -862,79 +869,86 @@ public class FloatingViewManager { eventRepository.getSolutionWithEventsAndPoints(solutionId, new EventRepository.RepositoryCallback() { @Override public void onComplete(SolutionWithEventsAndPoints solutionData) { - if (solutionData != null && solutionData.events != null) { - removeFloatingViews(); - runtimeEvents.clear(); - eventOrderCounter = 1; + new Handler(Looper.getMainLooper()).post(() -> { + if (solutionData != null && solutionData.events != null) { + removeFloatingViews(); + runtimeEvents.clear(); + eventOrderCounter = 1; - for (SolutionWithEventsAndPoints.EventWithPoints eventWithPoints : solutionData.events) { - EventEntity eventEntity = eventWithPoints.eventEntity; - EventWrapper.EventType type = EventWrapper.EventType.valueOf(eventEntity.eventType); + for (SolutionWithEventsAndPoints.EventWithPoints eventWithPoints : solutionData.events) { + EventEntity eventEntity = eventWithPoints.eventEntity; + EventWrapper.EventType type = EventWrapper.EventType.valueOf(eventEntity.eventType); - if (type == EventWrapper.EventType.POINT) { - TouchPoint clickPoint = eventWithPoints.clickTouchPoint; - if (clickPoint != null) { - PointEvent pointEvent = new PointEvent(eventEntity.orderInSolution, clickPoint.x, clickPoint.y); - TextView pointView = createTouchPointView(String.valueOf(pointEvent.getId())); - WindowManager.LayoutParams params = createTouchPointParams(); - params.x = pointEvent.getX(); - params.y = pointEvent.getY(); - pointView.setLayoutParams(params); - pointEvent.setView(pointView); - setupDraggablePoint(pointView, params, pointEvent); - windowManager.addView(pointView, params); - runtimeEvents.add(new EventWrapper(type, pointEvent, pointEvent.getId())); + if (type == EventWrapper.EventType.POINT) { + TouchPoint clickPoint = eventWithPoints.clickTouchPoint; + if (clickPoint != null) { + PointEvent pointEvent = new PointEvent(eventEntity.orderInSolution, clickPoint.x, clickPoint.y); + TextView pointView = createTouchPointView(String.valueOf(pointEvent.getId())); + WindowManager.LayoutParams params = createTouchPointParams(); + params.x = pointEvent.getX(); + params.y = pointEvent.getY(); + pointView.setLayoutParams(params); + pointEvent.setView(pointView); + setupDraggablePoint(pointView, params, pointEvent); + windowManager.addView(pointView, params); + runtimeEvents.add(new EventWrapper(type, pointEvent, pointEvent.getId())); + } + } else if (type == EventWrapper.EventType.SLIDE) { + TouchPoint startPointData = eventWithPoints.slideStartTouchPoint; + TouchPoint endPointData = eventWithPoints.slideEndTouchPoint; + if (startPointData != null && endPointData != null) { + PointEvent startPointEvent = new PointEvent(eventEntity.orderInSolution, startPointData.x, startPointData.y); + PointEvent endPointEvent = new PointEvent(eventEntity.orderInSolution, endPointData.x, endPointData.y); + + TextView startPointView = createTouchPointView(String.valueOf(startPointEvent.getId())); + WindowManager.LayoutParams startParams = createTouchPointParams(); + startParams.x = startPointEvent.getX(); + startParams.y = startPointEvent.getY(); + startPointView.setLayoutParams(startParams); + + TextView endPointView = createTouchPointView(String.valueOf(endPointEvent.getId())); + WindowManager.LayoutParams endParams = createTouchPointParams(); + endParams.x = endPointEvent.getX(); + endParams.y = endPointEvent.getY(); + endPointView.setLayoutParams(endParams); + + ConnectingLineView lineView = new ConnectingLineView(context); + WindowManager.LayoutParams lineParams = createLineViewParams(); + + SlideEvent slideEvent = new SlideEvent(eventEntity.orderInSolution, startPointEvent, endPointEvent); + slideEvent.setLineView(lineView); + slideEvent.setLineParams(lineParams); + + setupDraggableSlidePoint(startPointView, startParams, startPointEvent, slideEvent); + setupDraggableSlidePoint(endPointView, endParams, endPointEvent, slideEvent); + + windowManager.addView(lineView, lineParams); + windowManager.addView(startPointView, startParams); + windowManager.addView(endPointView, endParams); + + updateLinePosition(slideEvent); + runtimeEvents.add(new EventWrapper(type, slideEvent, slideEvent.getId())); + } } - } else if (type == EventWrapper.EventType.SLIDE) { - TouchPoint startPointData = eventWithPoints.slideStartTouchPoint; - TouchPoint endPointData = eventWithPoints.slideEndTouchPoint; - if (startPointData != null && endPointData != null) { - PointEvent startPointEvent = new PointEvent(eventEntity.orderInSolution, startPointData.x, startPointData.y); - PointEvent endPointEvent = new PointEvent(eventEntity.orderInSolution, endPointData.x, endPointData.y); - TextView startPointView = createTouchPointView(String.valueOf(startPointEvent.getId())); - WindowManager.LayoutParams startParams = createTouchPointParams(); - startParams.x = startPointEvent.getX(); - startParams.y = startPointEvent.getY(); - startPointView.setLayoutParams(startParams); - - TextView endPointView = createTouchPointView(String.valueOf(endPointEvent.getId())); - WindowManager.LayoutParams endParams = createTouchPointParams(); - endParams.x = endPointEvent.getX(); - endParams.y = endPointEvent.getY(); - endPointView.setLayoutParams(endParams); - - ConnectingLineView lineView = new ConnectingLineView(context); - WindowManager.LayoutParams lineParams = createLineViewParams(); - - SlideEvent slideEvent = new SlideEvent(eventEntity.orderInSolution, startPointEvent, endPointEvent); - - setupDraggableSlidePoint(startPointView, startParams, startPointEvent, slideEvent); - setupDraggableSlidePoint(endPointView, endParams, endPointEvent, slideEvent); - - windowManager.addView(lineView, lineParams); - windowManager.addView(startPointView, startParams); - windowManager.addView(endPointView, endParams); - - updateLinePosition(slideEvent); - runtimeEvents.add(new EventWrapper(type, slideEvent, slideEvent.getId())); + if (eventEntity.orderInSolution >= eventOrderCounter) { + eventOrderCounter = eventEntity.orderInSolution + 1; } } - if (eventEntity.orderInSolution >= eventOrderCounter) { - eventOrderCounter = eventEntity.orderInSolution + 1; - } + updateServicePositions(); + Toast.makeText(context, "方案 '" + solutionData.solution.solutionName + "' 加载成功!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(context, "加载方案失败或方案不存在。", Toast.LENGTH_SHORT).show(); } - updateServicePositions(); - Toast.makeText(context, "方案 '" + solutionData.solution.solutionName + "' 加载成功!", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(context, "加载方案失败或方案不存在。", Toast.LENGTH_SHORT).show(); - } + }); } @Override public void onError(Exception e) { Log.e(TAG, "加载方案失败: " + e.getMessage(), e); - Toast.makeText(context, "加载方案失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + new Handler(Looper.getMainLooper()).post(() -> + Toast.makeText(context, "加载方案失败: " + e.getMessage(), Toast.LENGTH_SHORT).show() + ); } }); }