diff --git a/app/src/main/java/com/auto/clicker/autoclicker/room/entity/Solution.java b/app/src/main/java/com/auto/clicker/autoclicker/room/entity/Solution.java index a09fb4e..da92f39 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/room/entity/Solution.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/room/entity/Solution.java @@ -16,12 +16,35 @@ public class Solution { @ColumnInfo(name = "solution_name") public String solutionName; - public Solution(String solutionName) { + @ColumnInfo(name = "mode") + public int mode; + + public Solution(String solutionName, int mode) { this.solutionName = solutionName; + this.mode = mode; } - public long getSolutionId() { return solutionId; } - public void setSolutionId(long solutionId) { this.solutionId = solutionId; } - public String getSolutionName() { return solutionName; } - public void setSolutionName(String solutionName) { this.solutionName = solutionName; } + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public long getSolutionId() { + return solutionId; + } + + public void setSolutionId(long solutionId) { + this.solutionId = solutionId; + } + + public String getSolutionName() { + return solutionName; + } + + public void setSolutionName(String solutionName) { + this.solutionName = solutionName; + } } diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/BatteryLimitFreeActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/BatteryLimitFreeActivity.java index 8364da9..7b49b6a 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/BatteryLimitFreeActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/BatteryLimitFreeActivity.java @@ -9,18 +9,23 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.auto.clicker.autoclicker.R; +import com.auto.clicker.autoclicker.databinding.ActivityBatteryLimitFreeBinding; public class BatteryLimitFreeActivity extends AppCompatActivity { + private ActivityBatteryLimitFreeBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); - setContentView(R.layout.activity_battery_limit_free); + binding = ActivityBatteryLimitFreeBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + binding.back.setOnClickListener(v -> finish()); } } \ No newline at end of file diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/FeedbackActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/FeedbackActivity.java index cf5f863..752e139 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/FeedbackActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/FeedbackActivity.java @@ -9,18 +9,24 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.auto.clicker.autoclicker.R; +import com.auto.clicker.autoclicker.databinding.ActivityBatteryLimitFreeBinding; +import com.auto.clicker.autoclicker.databinding.ActivityFeedbackBinding; public class FeedbackActivity extends AppCompatActivity { + private ActivityFeedbackBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); - setContentView(R.layout.activity_feedback); + binding = ActivityFeedbackBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + binding.backArrow.setOnClickListener(v -> finish()); } } \ No newline at end of file diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/HowToUseActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/HowToUseActivity.java index b38480b..4a850c1 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/HowToUseActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/HowToUseActivity.java @@ -34,6 +34,8 @@ public class HowToUseActivity extends AppCompatActivity { initTabs(); binding.howViewpager.setCurrentItem(0, false); + + binding.back.setOnClickListener(v -> finish()); } private void initPagerAdapter() { diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/ScriptsActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/ScriptsActivity.java index 17fc777..dfb6b95 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/ScriptsActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/ScriptsActivity.java @@ -9,18 +9,24 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.auto.clicker.autoclicker.R; +import com.auto.clicker.autoclicker.databinding.ActivityFeedbackBinding; +import com.auto.clicker.autoclicker.databinding.ActivityScriptsBinding; public class ScriptsActivity extends AppCompatActivity { + private ActivityScriptsBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); - setContentView(R.layout.activity_scripts); + binding = ActivityScriptsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + binding.btnBack.setOnClickListener(v -> finish()); } } \ No newline at end of file diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/TroubleshootingActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/TroubleshootingActivity.java index 709e6d4..e7f5262 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/TroubleshootingActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/menu/TroubleshootingActivity.java @@ -8,18 +8,24 @@ import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.auto.clicker.autoclicker.R; +import com.auto.clicker.autoclicker.databinding.ActivityFeedbackBinding; +import com.auto.clicker.autoclicker.databinding.ActivityTroubleshootingBinding; public class TroubleshootingActivity extends AppCompatActivity { + private ActivityTroubleshootingBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); - setContentView(R.layout.activity_troubleshooting); + binding = ActivityTroubleshootingBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + binding.back.setOnClickListener(v -> finish()); } } \ No newline at end of file diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/setting/SettingActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/setting/SettingActivity.java index c3e5588..0fb44d8 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/setting/SettingActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/setting/SettingActivity.java @@ -34,6 +34,8 @@ public class SettingActivity extends AppCompatActivity { initTabs(); binding.settingViewpager.setCurrentItem(0, false); + + binding.back.setOnClickListener(v -> finish()); } private void initPagerAdapter() { diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/adapter/floating/SolutionAdapter.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/adapter/floating/SolutionAdapter.java index 2f7a07f..7a26f02 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/adapter/floating/SolutionAdapter.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/adapter/floating/SolutionAdapter.java @@ -3,10 +3,12 @@ package com.auto.clicker.autoclicker.ui.adapter.floating; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.auto.clicker.autoclicker.R; import com.auto.clicker.autoclicker.room.entity.Solution; import java.util.List; @@ -29,7 +31,7 @@ public class SolutionAdapter extends RecyclerView.Adapter { + holder.solutionPlayImageView.setOnClickListener(v -> { if (listener != null) { listener.onSolutionClick(solution); } }); + } @Override @@ -60,10 +68,14 @@ public class SolutionAdapter extends RecyclerView.Adapter showUnitSelection(v, TYPE_INTERVAL)); + binding.unitSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_SWIPE_DURATION)); - binding.unitSelectorContainer.setOnClickListener(this::showSwipeDurationUnitSelection); + setupRepeatMode(); + + setupAdvancedMode(); return binding.getRoot(); } - private void showIntervalUnitSelection(View anchorView) { - // 加载弹窗布局 - View popupView = getLayoutInflater().inflate(R.layout.dialog_unit_selection, null); - PopupWindow popupWindow = new PopupWindow( - popupView, - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, - true // 设置为 true,以便点击外部区域时自动关闭 - ); - - // 设置背景,否则点击外部无法关闭 - popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - popupWindow.setOutsideTouchable(true); - - // 获取弹窗中的TextViews - TextView tvMs = popupView.findViewById(R.id.tv_unit_ms); - TextView tvSec = popupView.findViewById(R.id.tv_unit_sec); - TextView tvMin = popupView.findViewById(R.id.tv_unit_min); - - // Interval 单位有:毫秒,秒,分钟 - tvMs.setVisibility(View.VISIBLE); - tvSec.setVisibility(View.VISIBLE); - tvMin.setVisibility(View.VISIBLE); - - tvMs.setOnClickListener(v -> { - binding.intervalSelectedUnit.setText(getString(R.string.milliseconds_unit)); - popupWindow.dismiss(); - showInputValue("Interval", binding.etIntervalValue.getText().toString(), getString(R.string.milliseconds_unit)); + private void setupRepeatMode() { + binding.repeatSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + binding.repeatInput.setVisibility(View.VISIBLE); + binding.repeatSelectorContainer.setVisibility(View.VISIBLE); + binding.repeatSelectedUnit.setText(getString(R.string.infinitely_unit)); + binding.etRepeatValue.setText(""); + binding.etRepeatValue.setEnabled(false); + binding.etRepeatValue.setInputType(InputType.TYPE_NULL); + } else { + binding.repeatInput.setVisibility(View.GONE); + binding.repeatSelectorContainer.setVisibility(View.GONE); + } }); - tvSec.setOnClickListener(v -> { - binding.intervalSelectedUnit.setText(getString(R.string.seconds_unit)); - popupWindow.dismiss(); - showInputValue("Interval", binding.etIntervalValue.getText().toString(), getString(R.string.seconds_unit)); - }); + if (!binding.repeatSwitch.isChecked()) { + binding.repeatInput.setVisibility(View.GONE); + binding.repeatSelectorContainer.setVisibility(View.GONE); + } else { + binding.repeatSelectedUnit.setText(getString(R.string.infinitely_unit)); + binding.etRepeatValue.setText(""); + binding.etRepeatValue.setEnabled(false); + binding.etRepeatValue.setInputType(InputType.TYPE_NULL); + } - tvMin.setOnClickListener(v -> { - binding.intervalSelectedUnit.setText(getString(R.string.minutes_unit)); - popupWindow.dismiss(); - showInputValue("Interval", binding.etIntervalValue.getText().toString(), getString(R.string.minutes_unit)); - }); - - // 显示弹窗,使其显示在anchorView下方 - popupWindow.showAsDropDown(anchorView); + binding.repeatSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_REPEAT)); } - private void showSwipeDurationUnitSelection(View anchorView) { - // 加载弹窗布局 + private void setupAdvancedMode() { + binding.advancedSwitch.setChecked(true); + + binding.advancedSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + Toast.makeText(getContext(), "Anti-Detection mode is ON", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(getContext(), "Anti-Detection mode is OFF", Toast.LENGTH_SHORT).show(); + } + }); + } + + private void showUnitSelection(View anchorView, int type) { View popupView = getLayoutInflater().inflate(R.layout.dialog_unit_selection, null); PopupWindow popupWindow = new PopupWindow( popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, - true // 设置为 true,以便点击外部区域时自动关闭 + true ); - // 设置背景,否则点击外部无法关闭 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); - // 获取弹窗中的TextViews TextView tvMs = popupView.findViewById(R.id.tv_unit_ms); TextView tvSec = popupView.findViewById(R.id.tv_unit_sec); TextView tvMin = popupView.findViewById(R.id.tv_unit_min); + TextView tvInfinitely = popupView.findViewById(R.id.tv_unit_infinitely); + TextView tvDuration = popupView.findViewById(R.id.tv_unit_duration); + TextView tvCycle = popupView.findViewById(R.id.tv_unit_cycle); - // Swipe duration 单位只有:毫秒,秒 - tvMs.setVisibility(View.VISIBLE); - tvSec.setVisibility(View.VISIBLE); - tvMin.setVisibility(View.GONE); // 隐藏分钟选项 - tvMs.setOnClickListener(v -> { - binding.tvSelectedUnit.setText(getString(R.string.milliseconds_unit)); - popupWindow.dismiss(); - showInputValue("Swipe Duration", binding.etDurationValue.getText().toString(), getString(R.string.milliseconds_unit)); - }); + switch (type) { + case TYPE_INTERVAL: + tvMs.setVisibility(View.VISIBLE); + tvSec.setVisibility(View.VISIBLE); + tvMin.setVisibility(View.VISIBLE); + tvInfinitely.setVisibility(View.GONE); + tvDuration.setVisibility(View.GONE); + tvCycle.setVisibility(View.GONE); + break; + case TYPE_SWIPE_DURATION: + tvMs.setVisibility(View.VISIBLE); + tvSec.setVisibility(View.VISIBLE); + tvMin.setVisibility(View.GONE); + tvInfinitely.setVisibility(View.GONE); + tvDuration.setVisibility(View.GONE); + tvCycle.setVisibility(View.GONE); + break; + case TYPE_REPEAT: + tvMs.setVisibility(View.GONE); + tvSec.setVisibility(View.GONE); + tvMin.setVisibility(View.GONE); + tvInfinitely.setVisibility(View.VISIBLE); + tvDuration.setVisibility(View.VISIBLE); + tvCycle.setVisibility(View.VISIBLE); + break; + } - tvSec.setOnClickListener(v -> { - binding.tvSelectedUnit.setText(getString(R.string.seconds_unit)); - popupWindow.dismiss(); - showInputValue("Swipe Duration", binding.etDurationValue.getText().toString(), getString(R.string.seconds_unit)); - }); + if (type == TYPE_INTERVAL || type == TYPE_SWIPE_DURATION) { + tvMs.setOnClickListener(v -> { + String unitText = getString(R.string.milliseconds_unit); + if (type == TYPE_INTERVAL) { + binding.intervalSelectedUnit.setText(unitText); + showInputValue("Interval", binding.etIntervalValue.getText().toString(), unitText); + } else { + binding.tvSelectedUnit.setText(unitText); + showInputValue("Swipe Duration", binding.etDurationValue.getText().toString(), unitText); + } + popupWindow.dismiss(); + }); + + tvSec.setOnClickListener(v -> { + String unitText = getString(R.string.seconds_unit); + if (type == TYPE_INTERVAL) { + binding.intervalSelectedUnit.setText(unitText); + showInputValue("Interval", binding.etIntervalValue.getText().toString(), unitText); + } else { + binding.tvSelectedUnit.setText(unitText); + showInputValue("Swipe Duration", binding.etDurationValue.getText().toString(), unitText); + } + popupWindow.dismiss(); + }); + + if (type == TYPE_INTERVAL) { + tvMin.setOnClickListener(v -> { + String unitText = getString(R.string.minutes_unit); + binding.intervalSelectedUnit.setText(unitText); + popupWindow.dismiss(); + showInputValue("Interval", binding.etIntervalValue.getText().toString(), unitText); + }); + } + } + + if (type == TYPE_REPEAT) { + tvInfinitely.setOnClickListener(v -> { + binding.repeatSelectedUnit.setText(getString(R.string.infinitely_unit)); + binding.etRepeatValue.setText(""); + binding.etRepeatValue.setEnabled(false); + binding.etRepeatValue.setInputType(InputType.TYPE_NULL); + popupWindow.dismiss(); + showInputValue("Repeat", binding.etRepeatValue.getText().toString(), getString(R.string.infinitely_unit)); + }); + + tvDuration.setOnClickListener(v -> { + binding.repeatSelectedUnit.setText(getString(R.string.duration_unit)); + binding.etRepeatValue.setText(""); + binding.etRepeatValue.setEnabled(true); + binding.etRepeatValue.setInputType(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME); // 设置为时间格式 + popupWindow.dismiss(); + showInputValue("Repeat", binding.etRepeatValue.getText().toString(), getString(R.string.duration_unit)); + }); + + tvCycle.setOnClickListener(v -> { + binding.repeatSelectedUnit.setText(getString(R.string.cycle_unit)); + binding.etRepeatValue.setText(""); + binding.etRepeatValue.setEnabled(true); + binding.etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER); + popupWindow.dismiss(); + showInputValue("Repeat", binding.etRepeatValue.getText().toString(), getString(R.string.cycle_unit)); + }); + } - // 显示弹窗,使其显示在anchorView下方 popupWindow.showAsDropDown(anchorView); } @@ -120,13 +198,28 @@ public class ActionFragment extends Fragment { String message = type + " 值: " + (value.isEmpty() ? "未输入" : value) + ", 单位: " + unit; Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show(); - if (type.equals("Interval")) { - long intervalValue = value.isEmpty() ? 0 : Long.parseLong(value); - // 根据 unit 进行单位转换或保存 - } else if (type.equals("Swipe Duration")) { - long durationValue = value.isEmpty() ? 0 : Long.parseLong(value); - // 根据 unit 进行单位转换或保存 - } + if (type.equals("Interval")) { + long intervalValue = value.isEmpty() ? 0 : Long.parseLong(value); + // 根据 unit 进行单位转换或保存 Interval 值 + // 例如:if (unit.equals(getString(R.string.seconds_unit))) { ... } + } else if (type.equals("Swipe Duration")) { + long durationValue = value.isEmpty() ? 0 : Long.parseLong(value); + // 根据 unit 进行单位转换或保存 Swipe Duration 值 + } else if (type.equals("Repeat")) { + if (unit.equals(getString(R.string.infinitely_unit))) { + // Repeat 为无限次,不需要处理输入值 + } else if (unit.equals(getString(R.string.duration_unit))) { + // Repeat 为时长,处理时间格式的输入 + // 您需要在这里添加解析时间格式的逻辑 + String durationValue = value.isEmpty() ? "0" : value; + // long parsedDuration = parseDurationString(durationValue); // 自定义方法解析时间 + Toast.makeText(getContext(), "Repeat Duration: " + durationValue, Toast.LENGTH_SHORT).show(); + } else if (unit.equals(getString(R.string.cycle_unit))) { + // Repeat 为次数,处理整数输入 + int repeatCount = value.isEmpty() ? 0 : Integer.parseInt(value); + Toast.makeText(getContext(), "Repeat Cycles: " + repeatCount, Toast.LENGTH_SHORT).show(); + } + } } @Override diff --git a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingTabDialogManager.java b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingTabDialogManager.java index 34db8b7..055aca0 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingTabDialogManager.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingTabDialogManager.java @@ -11,7 +11,6 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; @@ -45,7 +44,8 @@ public class FloatingTabDialogManager { private EditText inputName; private Button saveButton; - private Button closeButton; + private Button closeSaveButton; + private Button closeLoadButton; private RecyclerView loadRecyclerview; private SolutionAdapter solutionsAdapter; @@ -80,7 +80,8 @@ public class FloatingTabDialogManager { inputName = savePage.findViewById(R.id.script_name_input); saveButton = savePage.findViewById(R.id.save); - closeButton = savePage.findViewById(R.id.close); + closeSaveButton = savePage.findViewById(R.id.close); + closeLoadButton = loadPage.findViewById(R.id.close); saveButton.setOnClickListener(v -> { String solutionName = inputName.getText().toString().trim(); @@ -109,13 +110,15 @@ public class FloatingTabDialogManager { }); - closeButton.setOnClickListener(v -> removeFloatingTabDialog()); + closeSaveButton.setOnClickListener(v -> removeFloatingTabDialog()); + closeLoadButton.setOnClickListener(v -> removeFloatingTabDialog()); loadRecyclerview = loadPage.findViewById(R.id.script_list); loadRecyclerview.setLayoutManager(new LinearLayoutManager(context)); solutionsAdapter = new SolutionAdapter(solutionList, solution -> { if (floatingViewManager != null) { + floatingViewManager.showFloatingViews(solution.getMode()); floatingViewManager.loadSolution(solution.solutionId); Toast.makeText(context, "正在加载方案: " + solution.getSolutionName(), Toast.LENGTH_SHORT).show(); } else { 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 44c49a8..d4e09e8 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 @@ -57,6 +57,8 @@ public class FloatingViewManager { private static final String TAG = "FloatingViewManager"; public static final long DEBOUNCE_INTERVAL = 500; + private int mode; + private int touchPointSize; private int controlBarWidth; @@ -109,6 +111,8 @@ public class FloatingViewManager { throw new SecurityException("需要悬浮窗许可"); } + this.mode = mode; + removeAllFloatingViews(); showMultipleModeViews(mode); @@ -117,7 +121,7 @@ public class FloatingViewManager { private void showMultipleModeViews(int mode) { initMultipleTouchPointView(); - initMultipleControlBar(); + initMultipleControlBar(mode); if (multipleControlBarView != null) { windowManager.addView(multipleControlBarView, multipleControlBarParams); @@ -129,7 +133,7 @@ public class FloatingViewManager { eventOrderCounter = 1; } - private void initMultipleControlBar() { + private void initMultipleControlBar(int mode) { if (multipleControlBarView != null) { safeRemoveView(multipleControlBarView); multipleControlBarView = null; @@ -142,7 +146,7 @@ public class FloatingViewManager { multipleControlBarParams.height = WindowManager.LayoutParams.WRAP_CONTENT; setupDraggableView(multipleControlBarView, multipleControlBarParams, this::updateMoreControlBarPosition); - setupControlButtons(multipleControlBarView); + setupControlButtons(multipleControlBarView,mode); updateControlBarImageViews(multipleControlBarView, this.controlBarWidth); } @@ -220,7 +224,7 @@ public class FloatingViewManager { windowManager.updateViewLayout(multipleControlBarView, multipleControlBarParams); } - private void setupControlButtons(LinearLayout controlBar) { + private void setupControlButtons(LinearLayout controlBar,int mode) { ImageView playButton = controlBar.findViewById(R.id.play_button); ImageView addButton = controlBar.findViewById(R.id.add_button); ImageView removeButton = controlBar.findViewById(R.id.remove_button); @@ -230,6 +234,12 @@ public class FloatingViewManager { ImageView settingButton = controlBar.findViewById(R.id.settings_button); ImageView closeButton = controlBar.findViewById(R.id.close_button); + if (mode == 1){ + addButton.setVisibility(View.GONE); + removeButton.setVisibility(View.GONE); + slideButton.setVisibility(View.GONE); + } + playButton.setOnClickListener(v -> toggleMultipleClicking()); addButton.setOnClickListener(v -> addPointEvent()); removeButton.setOnClickListener(v -> removeLastEvent()); @@ -620,32 +630,25 @@ public class FloatingViewManager { public void saveCurrentEventsAsSolution(String solutionName, EventRepository.RepositoryCallback callback) { if (solutionName == null || solutionName.trim().isEmpty()) { Toast.makeText(context, "方案名称不能为空", Toast.LENGTH_SHORT).show(); - // 在这里调用回调的 onError,或者 onComplete 返回一个表示失败的值 - // 确保 FloatingTabDialogManager 收到反馈 if (callback != null) { - callback.onComplete(-1L); // 返回一个表示失败的值 + callback.onComplete(-1L); } return; } if (runtimeEvents.isEmpty()) { Toast.makeText(context, "当前没有事件可以保存", Toast.LENGTH_SHORT).show(); if (callback != null) { - callback.onComplete(-1L); // 返回一个表示失败的值 + callback.onComplete(-1L); } return; } - Solution newSolution = new Solution(solutionName); + Solution newSolution = new Solution(solutionName,mode); eventRepository.insertSolutionWithEvents(newSolution, runtimeEvents, new EventRepository.RepositoryCallback() { @Override public void onComplete(Long solutionId) { - // 成功保存,Toast 可以在这里显示,也可以在 FloatingTabDialogManager 中显示 - // 为了职责分离,建议在这里显示一个简单的"保存成功" Toast,然后让 FloatingTabDialogManager 决定是否关闭 - // Toast.makeText(context, "方案 '" + solutionName + "' 保存成功!", Toast.LENGTH_SHORT).show(); - // 保存失败,Toast 可以在这里显示 - // Toast.makeText(context, "保存方案失败。", Toast.LENGTH_SHORT).show(); if (callback != null) { - callback.onComplete(solutionId); // 将结果传递给调用者 + callback.onComplete(solutionId); } } diff --git a/app/src/main/res/drawable/btn_border_background.xml b/app/src/main/res/drawable/btn_border_background.xml index b0c33ee..4f5b8f1 100644 --- a/app/src/main/res/drawable/btn_border_background.xml +++ b/app/src/main/res/drawable/btn_border_background.xml @@ -1,6 +1,8 @@ - + diff --git a/app/src/main/res/drawable/close_bg.xml b/app/src/main/res/drawable/close_bg.xml new file mode 100644 index 0000000..359bff7 --- /dev/null +++ b/app/src/main/res/drawable/close_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/script_option.xml b/app/src/main/res/drawable/script_option.xml new file mode 100644 index 0000000..9073b4b --- /dev/null +++ b/app/src/main/res/drawable/script_option.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/solution_play.xml b/app/src/main/res/drawable/solution_play.xml new file mode 100644 index 0000000..c3ad325 --- /dev/null +++ b/app/src/main/res/drawable/solution_play.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_battery_limit_free.xml b/app/src/main/res/layout/activity_battery_limit_free.xml index de8f42b..1a40ddb 100644 --- a/app/src/main/res/layout/activity_battery_limit_free.xml +++ b/app/src/main/res/layout/activity_battery_limit_free.xml @@ -22,6 +22,7 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_action.xml b/app/src/main/res/layout/fragment_action.xml index 610332f..8318a37 100644 --- a/app/src/main/res/layout/fragment_action.xml +++ b/app/src/main/res/layout/fragment_action.xml @@ -11,367 +11,369 @@ android:layout_height="wrap_content" android:paddingBottom="25dp"> - - - - - - - - - + app:layout_constraintTop_toTopOf="parent"> - + + + + + android:textSize="14sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_default_actions_title" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:paddingEnd="12dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_interval_label"> - + android:textColorHint="@color/gray" /> - + + + + + + - - + - + - + + + + + + + + + + + + + + + + - - - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/default_actions_container"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_script.xml b/app/src/main/res/layout/item_script.xml index 77d9ef6..3f57b4d 100644 --- a/app/src/main/res/layout/item_script.xml +++ b/app/src/main/res/layout/item_script.xml @@ -1,6 +1,54 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="292dp" + android:layout_height="wrap_content" + android:background="@drawable/bg_rounded_rect" + android:backgroundTint="#164958" + android:padding="16dp"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_solution.xml b/app/src/main/res/layout/item_solution.xml new file mode 100644 index 0000000..2491fe7 --- /dev/null +++ b/app/src/main/res/layout/item_solution.xml @@ -0,0 +1,45 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/save_script_page.xml b/app/src/main/res/layout/save_script_page.xml index 7f212dd..b277b83 100644 --- a/app/src/main/res/layout/save_script_page.xml +++ b/app/src/main/res/layout/save_script_page.xml @@ -48,7 +48,7 @@ android:id="@+id/close" android:layout_width="223dp" android:layout_height="48dp" - android:background="@drawable/btn_border_background" + android:background="@drawable/close_bg" android:text="Close" android:textAllCaps="false" android:textSize="18sp" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5288f3d..d9996db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,4 +48,7 @@ functionalities. milliseconds seconds minutes + infinitely + Duration + Cycle \ No newline at end of file