diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java index 58d7b7c..8709064 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/activity/main/MainActivity.java @@ -364,6 +364,12 @@ public class MainActivity extends AppCompatActivity { binding.single.setEnabled(isFloatingShown == FLOATING_NONE); binding.multi.setEnabled(isFloatingShown == FLOATING_NONE); + + if (isFloatingShown == FLOATING_NONE) { + setVideo(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bolangblue)); + } else { + setVideo(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bolangred)); + } } private void setStartButtonEnabled(boolean enabled) { diff --git a/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java b/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java index 01b6f86..cc08bfb 100644 --- a/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java +++ b/app/src/main/java/com/auto/clicker/autoclicker/ui/fragment/setting/ActionFragment.java @@ -17,7 +17,6 @@ import androidx.fragment.app.Fragment; import com.auto.clicker.autoclicker.R; import com.auto.clicker.autoclicker.databinding.FragmentActionBinding; - public class ActionFragment extends Fragment { private FragmentActionBinding binding; diff --git a/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingSettingDialogManager.java b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingSettingDialogManager.java new file mode 100644 index 0000000..88ec55e --- /dev/null +++ b/app/src/main/java/com/auto/clicker/autoclicker/view/FloatingSettingDialogManager.java @@ -0,0 +1,410 @@ +package com.auto.clicker.autoclicker.view; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.text.InputType; +import android.util.Log; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.widget.SwitchCompat; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.auto.clicker.autoclicker.R; +import com.auto.clicker.autoclicker.service.AutoClickService; + +public class FloatingSettingDialogManager { + + private static final String TAG = "FloatingSettingDialogManager"; + private final Context context; + private final WindowManager windowManager; + private ConstraintLayout floatingDialogView; + private WindowManager.LayoutParams floatingDialogParams; + + private FloatingViewManager floatingViewManager; + + private static final int TYPE_INTERVAL = 0; + private static final int TYPE_SWIPE_DURATION = 1; + private static final int TYPE_REPEAT = 2; + + private LinearLayout intervalSelectorContainer; + private LinearLayout unitSelectorContainer; + private SwitchCompat repeatSwitch; + private LinearLayout repeatInput; + private LinearLayout repeatSelectorContainer; + private EditText etIntervalValue; + private TextView intervalSelectedUnit; + private EditText etDurationValue; + private TextView tvSelectedUnit; + private EditText etRepeatValue; + private TextView repeatSelectedUnit; + + public FloatingSettingDialogManager(Context context) { + this.context = context; + this.windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + } + + public void setFloatingViewManager(FloatingViewManager manager) { + this.floatingViewManager = manager; + } + + public void showFloatingTabDialog() { + if (floatingDialogView != null) { + removeFloatingTabDialog(); + } + + Context themedContext = new ContextThemeWrapper(context, R.style.Theme_AutoClicker); + + floatingDialogView = (ConstraintLayout) LayoutInflater.from(themedContext).inflate(R.layout.floating_setting_dialog, null); + floatingDialogParams = createFloatingDialogParams(); + + intervalSelectorContainer = floatingDialogView.findViewById(R.id.dialog_interval_selector_container); + unitSelectorContainer = floatingDialogView.findViewById(R.id.dialog_unit_selector_container); + repeatSwitch = floatingDialogView.findViewById(R.id.dialog_repeat_switch); + repeatInput = floatingDialogView.findViewById(R.id.dialog_repeat_input); + repeatSelectorContainer = floatingDialogView.findViewById(R.id.dialog_repeat_selector_container); + etIntervalValue = floatingDialogView.findViewById(R.id.dialog_et_interval_value); + intervalSelectedUnit = floatingDialogView.findViewById(R.id.dialog_interval_selected_unit); + etDurationValue = floatingDialogView.findViewById(R.id.dialog_et_duration_value); + tvSelectedUnit = floatingDialogView.findViewById(R.id.dialog_tv_selected_unit); + etRepeatValue = floatingDialogView.findViewById(R.id.dialog_et_repeat_value); + repeatSelectedUnit = floatingDialogView.findViewById(R.id.dialog_repeat_selected_unit); + + intervalSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_INTERVAL)); + unitSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_SWIPE_DURATION)); + + setupRepeatMode(); + + floatingDialogView.setOnTouchListener((v, event) -> { + if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { + // 如果是外部点击事件,就关闭对话框 + removeFloatingTabDialog(); + Log.d(TAG, "检测到外部点击,浮动标签页弹窗已关闭。"); + return true; // 消费此事件 + } + return false; // 其他事件不处理 + }); + + try { + windowManager.addView(floatingDialogView, floatingDialogParams); + Log.d(TAG, "浮动标签页弹窗已显示"); + } catch (WindowManager.BadTokenException e) { + Log.e(TAG, "无法添加浮动标签页弹窗,可能是权限问题或上下文无效", e); + showToastOnUi(context, "显示弹窗失败,请检查权限。"); + } catch (SecurityException e) { + Log.e(TAG, "需要悬浮窗权限才能显示浮动弹窗", e); + showToastOnUi(context, "请授予悬浮窗权限以便显示。"); + } + } + + public void removeFloatingTabDialog() { + if (floatingDialogView != null) { + try { + windowManager.removeView(floatingDialogView); + floatingDialogView = null; + intervalSelectorContainer = null; + unitSelectorContainer = null; + repeatSwitch = null; + repeatInput = null; + repeatSelectorContainer = null; + etIntervalValue = null; + intervalSelectedUnit = null; + etDurationValue = null; + tvSelectedUnit = null; + etRepeatValue = null; + repeatSelectedUnit = null; + + Log.d(TAG, "浮动标签页弹窗已移除"); + } catch (IllegalArgumentException e) { + Log.w(TAG, "尝试移除不存在的视图", e); + } + } + } + + private WindowManager.LayoutParams createFloatingDialogParams() { + 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.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + overlayType, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL // 允许将触摸事件传递到其下方窗口 + | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, // 监听外部触摸事件 + PixelFormat.TRANSLUCENT + ); + params.gravity = Gravity.CENTER; + return params; + } + + private void setupRepeatMode() { + if (repeatSwitch == null || repeatInput == null || repeatSelectorContainer == null || + repeatSelectedUnit == null || etRepeatValue == null) { + Log.e(TAG, "repeat mode UI components not found. Skipping setupRepeatMode."); + return; + } + + repeatSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + repeatInput.setVisibility(View.VISIBLE); + repeatSelectorContainer.setVisibility(View.VISIBLE); + repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit)); + etRepeatValue.setText(""); + etRepeatValue.setEnabled(false); + etRepeatValue.setInputType(InputType.TYPE_NULL); + } else { + repeatInput.setVisibility(View.GONE); + repeatSelectorContainer.setVisibility(View.GONE); + } + }); + + // 根据初始状态设置可见性 + if (!repeatSwitch.isChecked()) { + repeatInput.setVisibility(View.GONE); + repeatSelectorContainer.setVisibility(View.GONE); + } else { + repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit)); + etRepeatValue.setText(""); + etRepeatValue.setEnabled(false); + etRepeatValue.setInputType(InputType.TYPE_NULL); + } + + repeatSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_REPEAT)); + } + + private void showUnitSelection(View anchorView, int type) { + View popupView = LayoutInflater.from(context).inflate(R.layout.dialog_unit_selection, null); + PopupWindow popupWindow = new PopupWindow( + popupView, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ); + + popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + popupWindow.setOutsideTouchable(true); + + 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); + + 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); + Log.d(TAG, "TYPE_REPEAT: infinitely, duration, cycle visible."); + break; + } + + if (type == TYPE_INTERVAL || type == TYPE_SWIPE_DURATION) { + tvMs.setOnClickListener(v -> { + String unitText = context.getString(R.string.milliseconds_unit); + if (type == TYPE_INTERVAL) { + intervalSelectedUnit.setText(unitText); + showInputValue("Interval", etIntervalValue.getText().toString(), unitText); + } else { + tvSelectedUnit.setText(unitText); + showInputValue("Swipe Duration", etDurationValue.getText().toString(), unitText); + } + popupWindow.dismiss(); + }); + + tvSec.setOnClickListener(v -> { + String unitText = context.getString(R.string.seconds_unit); + if (type == TYPE_INTERVAL) { + intervalSelectedUnit.setText(unitText); + showInputValue("Interval", etIntervalValue.getText().toString(), unitText); + } else { + tvSelectedUnit.setText(unitText); + showInputValue("Swipe Duration", etDurationValue.getText().toString(), unitText); + } + popupWindow.dismiss(); + }); + + if (type == TYPE_INTERVAL) { + tvMin.setOnClickListener(v -> { + String unitText = context.getString(R.string.minutes_unit); + intervalSelectedUnit.setText(unitText); + popupWindow.dismiss(); + showInputValue("Interval", etIntervalValue.getText().toString(), unitText); + }); + } + } + + if (type == TYPE_REPEAT) { + tvInfinitely.setOnClickListener(v -> { + repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit)); + etRepeatValue.setText(""); + etRepeatValue.setEnabled(false); + etRepeatValue.setInputType(InputType.TYPE_NULL); + popupWindow.dismiss(); + showInputValue("Repeat", etRepeatValue.getText().toString(), context.getString(R.string.infinitely_unit)); + }); + + tvDuration.setOnClickListener(v -> { + repeatSelectedUnit.setText(context.getString(R.string.duration_unit)); + etRepeatValue.setText(""); + etRepeatValue.setEnabled(true); + etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER); + popupWindow.dismiss(); + showInputValue("Repeat", etRepeatValue.getText().toString(), context.getString(R.string.duration_unit)); + }); + + tvCycle.setOnClickListener(v -> { + repeatSelectedUnit.setText(context.getString(R.string.cycle_unit)); + etRepeatValue.setText(""); + etRepeatValue.setEnabled(true); + etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER); + popupWindow.dismiss(); + showInputValue("Repeat", etRepeatValue.getText().toString(), context.getString(R.string.cycle_unit)); + }); + } + + if (type == TYPE_REPEAT) { + popupWindow.showAsDropDown(anchorView, 0, -500); + } else { + popupWindow.showAsDropDown(anchorView); + } + + } + + private void showInputValue(String type, String value, String unit) { + String message = type + " 值: " + (value.isEmpty() ? "未输入" : value) + ", 单位: " + unit; + showToastOnUi(context, message); + + AutoClickService service = AutoClickService.getInstance(); + + switch (type) { + case "Interval": + long intervalValue = 0; + if (!value.isEmpty()) { + try { + intervalValue = Long.parseLong(value); + // 根据 unit 进行单位转换 + if (unit.equals(context.getString(R.string.seconds_unit))) { + intervalValue *= 1000; // 如果单位是秒,转换为毫秒 + } + if (service != null) { + service.setClickInterval(intervalValue); + } else { + Log.e(TAG, "AutoClickService 实例为空,无法设置点击间隔。"); + } + } catch (NumberFormatException e) { + Log.e(TAG, "点击间隔值解析错误: " + value, e); + showToastOnUi(context, "点击间隔值无效,请输入有效数字。"); + } + } + // 你可以在这里将 intervalValue 保存到你的数据模型或 SharedPreferences + break; + + case "Swipe Duration": + int slideDurationValue = 0; + if (!value.isEmpty()) { + try { + slideDurationValue = Integer.parseInt(value); + if (unit.equals(context.getString(R.string.seconds_unit))) { + slideDurationValue *= 1000; // 如果单位是秒,转换为毫秒 + } + if (service != null) { + service.setSlideDuration(slideDurationValue); + } else { + Log.e(TAG, "AutoClickService 实例为空,无法设置滑动时长。"); + } + } catch (NumberFormatException e) { + Log.e(TAG, "滑动时长值解析错误: " + value, e); + showToastOnUi(context, "滑动时长值无效,请输入有效数字。"); + } + } + // 你可以在这里将 slideDurationValue 保存到你的数据模型或 SharedPreferences + break; + + case "Repeat": + if (unit.equals(context.getString(R.string.infinitely_unit))) { + // Repeat 为无限次,不需要处理输入值 + // 确保 etRepeatValue 是禁用的 + etRepeatValue.setText(""); + etRepeatValue.setEnabled(false); + etRepeatValue.setInputType(InputType.TYPE_NULL); + showToastOnUi(context, "重复模式: 无限次"); + // AutoClickService 内部已是循环执行,无限次意味着一直运行直到用户停止。 + // 如果需要更明确的无限次模式,可以在 AutoClickService 中设置一个标志位。 + } else if (unit.equals(context.getString(R.string.duration_unit))) { + // Repeat 为时长,处理时间格式的输入 (例如 "HH:mm:ss" -> 毫秒) + String durationValueStr = value.isEmpty() ? "0" : value; + // TODO: 你需要在这里添加解析时间格式的逻辑,例如: + // long parsedDuration = parseDurationString(durationValueStr); // 自定义方法解析时间 + // 如果 AutoClickService 需要总运行时间限制,你需要修改 AutoClickService 来支持。 + // 否则,你可能需要在悬浮窗管理类中实现一个计时器,当达到设定时长时调用 service.stopClicking()。 + etRepeatValue.setEnabled(true); + etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER); // 这里暂时设置为数字,如果需要特定时间输入,需要更复杂的实现 + showToastOnUi(context, "重复时长: " + durationValueStr); + } else if (unit.equals(context.getString(R.string.cycle_unit))) { + // Repeat 为次数,处理整数输入 + int repeatCount = 0; + if (!value.isEmpty()) { + try { + repeatCount = Integer.parseInt(value); + // TODO: 如果 AutoClickService 需要总循环次数限制,你需要修改 AutoClickService 来支持。 + // 可以在 AutoClickService 中添加一个变量来跟踪剩余循环次数,并在每次事件队列执行完毕后递减。 + // 当次数为 0 时,调用 stopClicking()。 + } catch (NumberFormatException e) { + Log.e(TAG, "重复次数值解析错误: " + value, e); + showToastOnUi(context, "重复次数值无效,请输入有效数字。"); + } + } + etRepeatValue.setEnabled(true); + etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER); + showToastOnUi(context, "重复次数: " + repeatCount); + } + break; + } + } + + 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 d4e09e8..e2e5e8e 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 @@ -1,6 +1,5 @@ package com.auto.clicker.autoclicker.view; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -12,7 +11,6 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.provider.Settings; -import android.text.InputType; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; @@ -21,15 +19,12 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.auto.clicker.autoclicker.R; @@ -80,6 +75,7 @@ public class FloatingViewManager { private boolean areEventsVisible = true; private final FloatingTabDialogManager floatingTabDialogManager; + private final FloatingSettingDialogManager floatingSettingDialogManager; private final EventRepository eventRepository; @@ -97,7 +93,9 @@ public class FloatingViewManager { this.screenWidth = screenSize.x; this.screenHeight = screenSize.y; this.floatingTabDialogManager = new FloatingTabDialogManager(context); + this.floatingSettingDialogManager = new FloatingSettingDialogManager(context); this.floatingTabDialogManager.setFloatingViewManager(this); + this.floatingSettingDialogManager.setFloatingViewManager(this); this.eventRepository = new EventRepository(context.getApplicationContext()); this.touchPointSize = 100; @@ -238,6 +236,7 @@ public class FloatingViewManager { addButton.setVisibility(View.GONE); removeButton.setVisibility(View.GONE); slideButton.setVisibility(View.GONE); + addPointEvent(); } playButton.setOnClickListener(v -> toggleMultipleClicking()); @@ -259,7 +258,9 @@ public class FloatingViewManager { } }); - settingButton.setOnClickListener(v -> showInputDialog()); + settingButton.setOnClickListener(v -> { + floatingSettingDialogManager.showFloatingTabDialog(); + }); closeButton.setOnClickListener(v -> closeFloatingViews()); } @@ -413,7 +414,7 @@ public class FloatingViewManager { PrefUtils.setFloatingShown(context, 0); Intent intent = new Intent("com.auto.clicker.autoclicker.FLOATING_WINDOW_STATE_CHANGED"); - intent.putExtra("isShown", false); + intent.putExtra("isShown", 0); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } @@ -459,6 +460,10 @@ public class FloatingViewManager { floatingTabDialogManager.removeFloatingTabDialog(); } + if (floatingSettingDialogManager != null) { + floatingSettingDialogManager.removeFloatingTabDialog(); + } + Log.d(TAG, "所有浮动视图(包括控制栏和事件)已移除"); } @@ -535,55 +540,6 @@ public class FloatingViewManager { } } - public void showInputDialog() { - EditText input = new EditText(context); - input.setInputType(InputType.TYPE_CLASS_NUMBER); - input.setHint("输入点击间隔(ms)"); - input.setFocusableInTouchMode(true); - - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle("设置点击间隔") - .setView(input) - .setPositiveButton("确定", (dialog, which) -> { - String value = input.getText().toString(); - try { - long interval = Long.parseLong(value); - AutoClickService service = AutoClickService.getInstance(); - if (service != null) { - service.setClickInterval(interval); - } else { - Log.w("InputDialog", "AutoClickService 未初始化"); - } - } catch (NumberFormatException e) { - Toast.makeText(context, "无效输入", Toast.LENGTH_SHORT).show(); - } - dialog.dismiss(); - }) - .setNegativeButton("取消", (dialog, which) -> dialog.dismiss()); - - AlertDialog dialog = builder.create(); - - if (!(context instanceof Activity)) { - if (dialog.getWindow() != null) { - dialog.getWindow().setType( - Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? - WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : - WindowManager.LayoutParams.TYPE_PHONE - ); - } - } - - dialog.show(); - - input.requestFocus(); - input.post(() -> { - InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - if (imm != null) { - imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); - } - }); - } - public void flashTouchPoint(int index) { if (index >= 0 && index < runtimeEvents.size()) { Event event = runtimeEvents.get(index).getEvent(); diff --git a/app/src/main/res/drawable/green_ring.xml b/app/src/main/res/drawable/green_ring.xml new file mode 100644 index 0000000..f985f17 --- /dev/null +++ b/app/src/main/res/drawable/green_ring.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/touch_point.xml b/app/src/main/res/drawable/touch_point.xml index 53630de..4e98262 100644 --- a/app/src/main/res/drawable/touch_point.xml +++ b/app/src/main/res/drawable/touch_point.xml @@ -1,9 +1,6 @@ - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/floating_setting_dialog.xml b/app/src/main/res/layout/floating_setting_dialog.xml new file mode 100644 index 0000000..6bb6769 --- /dev/null +++ b/app/src/main/res/layout/floating_setting_dialog.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file