V1.0.0(1)完成版

This commit is contained in:
lihongwei 2025-06-30 17:13:45 +08:00
parent 4d7f9b8f39
commit 474f01b83c
19 changed files with 242 additions and 125 deletions

BIN
app/AutoClicker.jks Normal file

Binary file not shown.

View File

@ -1,7 +1,10 @@
import java.text.SimpleDateFormat
import java.util.Date
plugins {
alias(libs.plugins.android.application)
}
val timestamp: String = SimpleDateFormat("MM_dd_HH_mm").format(Date())
android {
namespace = "com.auto.clicker.autoclicker"
compileSdk = 35
@ -12,7 +15,10 @@ android {
targetSdk = 35
versionCode = 1
versionName = "1.0.0"
setProperty(
"archivesBaseName",
"Auto Clicker_V" + versionName + "(${versionCode})_$timestamp"
)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -19,3 +19,18 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keepclassmembers class com.auto.clicker.autoclicker.MyApplication {
public static final java.lang.String DB_NAME;
public static final int DB_VERSION;
}
-keepclassmembers class * {
@androidx.room.Query <methods>;
}
-keep class com.auto.clicker.autoclicker.room.AppDatabase { *; }
-keep class com.auto.clicker.autoclicker.room.entity.TouchPoint { *; }
-keep class com.auto.clicker.autoclicker.room.entity.EventEntity { *; }
-keep class com.auto.clicker.autoclicker.room.entity.Solution { *; }
-keep class com.auto.clicker.autoclicker.room.SolutionWithEventsAndPoints { *; }

View File

@ -184,6 +184,10 @@ public class AutoClickService extends AccessibilityService {
startTimeMillis = 0;
logDebug("停止执行事件");
Intent stopIntent = new Intent("com.auto.clicker.autoclicker.FLASH_TOUCH_POINT");
stopIntent.putExtra("isStopEvent", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(stopIntent);
}
}

View File

@ -15,7 +15,6 @@ import android.provider.Settings;
import android.util.Log;
import android.view.accessibility.AccessibilityManager;
import android.widget.Toast;
import android.widget.VideoView;
import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResultLauncher;
@ -185,7 +184,7 @@ public class MainActivity extends AppCompatActivity {
if (!accessibilityGranted) {
logDebug("无障碍服务未启用,请求权限");
showPermissionRequest(Settings.ACTION_ACCESSIBILITY_SETTINGS, "Please enable accessibility services to ensure the application works properly", "Accessibility Settings cannot be enabled");
showPermissionRequest();
setStartButtonEnabled(false);
return false;
}
@ -243,7 +242,7 @@ public class MainActivity extends AppCompatActivity {
if (!accessibilityGranted) {
logDebug("无障碍服务未启用,请求权限");
showPermissionRequest(Settings.ACTION_ACCESSIBILITY_SETTINGS, "Please enable accessibility services to ensure the application works properly", "Accessibility Settings cannot be enabled");
showPermissionRequest();
setStartButtonEnabled(false);
return;
@ -273,15 +272,15 @@ public class MainActivity extends AppCompatActivity {
}
private void showPermissionRequest(String action, String toastMessage, String errorMessage) {
private void showPermissionRequest() {
try {
Intent intent = new Intent(action);
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
permissionLauncher.launch(intent);
Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show();
logDebug("尝试启动权限设置页面: " + action);
Toast.makeText(this, "Please enable accessibility services to ensure the application works properly", Toast.LENGTH_LONG).show();
logDebug("尝试启动权限设置页面: " + Settings.ACTION_ACCESSIBILITY_SETTINGS);
} catch (Exception e) {
Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
logDebug("打开设置页面失败: " + errorMessage + ", 异常: " + e.getMessage());
Toast.makeText(this, "Accessibility Settings cannot be enabled", Toast.LENGTH_LONG).show();
logDebug("打开设置页面失败: " + "Accessibility Settings cannot be enabled" + ", 异常: " + e.getMessage());
}
}

View File

@ -1,6 +1,11 @@
package com.auto.clicker.autoclicker.ui.activity.menu;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
@ -27,5 +32,16 @@ public class BatteryLimitFreeActivity extends AppCompatActivity {
});
binding.back.setOnClickListener(v -> finish());
Button grantButton = binding.grant;
grantButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);
}
});
}
}

View File

@ -69,6 +69,20 @@ public class MenuActivity extends AppCompatActivity {
Intent intent = new Intent(this, HowToUseActivity.class);
startActivity(intent);
});
binding.share.arrow.setOnClickListener(v -> {
String packageName = getPackageName();
String appShareLink = "https://play.google.com/store/apps/details?id=" + packageName;
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Check out this awesome app!");
shareIntent.putExtra(Intent.EXTRA_TEXT, "Hey, you should check out this app! " + appShareLink);
startActivity(Intent.createChooser(shareIntent, "Share app via..."));
});
}
private void setupItem(int viewId, int iconRes, String title, String subtitle) {

View File

@ -1,6 +1,10 @@
package com.auto.clicker.autoclicker.ui.activity.menu;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
@ -27,5 +31,15 @@ public class TroubleshootingActivity extends AppCompatActivity {
});
binding.back.setOnClickListener(v -> finish());
Button regrantButton = binding.Regrant;
regrantButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);
}
});
}
}

View File

@ -14,8 +14,9 @@ public class LauncherActivity extends AppCompatActivity {
boolean agreed = getSharedPreferences("app_prefs", MODE_PRIVATE)
.getBoolean("agreed_privacy", false);
Intent intent = new Intent(this,
agreed ? SplashActivity.class : AgreementActivity.class);
// Intent intent = new Intent(this,
// agreed ? SplashActivity.class : AgreementActivity.class);
Intent intent = new Intent(this, SplashActivity.class);
startActivity(intent);
finish();
}

View File

@ -18,7 +18,7 @@ import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
public class SplashActivity extends AppCompatActivity {
private ActivitySplashBinding binding;
private static final long TOTAL_TIME = 100;
private static final long TOTAL_TIME = 1000;
private CountDownTimer countDownTimer;
@Override

View File

@ -36,6 +36,14 @@ public class FloatingSettingDialogManager {
private ConstraintLayout floatingDialogView;
private WindowManager.LayoutParams floatingDialogParams;
private enum UnitType {
MS, SEC, MIN, INFINITELY, DURATION, CYCLE, UNKNOWN
}
private UnitType currentIntervalUnit = UnitType.MS;
private UnitType currentSwipeDurationUnit = UnitType.MS;
private UnitType currentRepeatUnit = UnitType.INFINITELY;
private static final int TYPE_INTERVAL = 0;
private static final int TYPE_SWIPE_DURATION = 1;
private static final int TYPE_REPEAT = 2;
@ -54,9 +62,6 @@ public class FloatingSettingDialogManager {
private AppCompatButton saveButton;
private AppCompatButton closeButton;
private String currentIntervalUnit = "";
private String currentSwipeDurationUnit = "";
private String currentRepeatUnit = "";
private String currentIntervalValue = "";
private String currentDurationValue = "";
private String currentRepeatValue = "";
@ -65,6 +70,9 @@ public class FloatingSettingDialogManager {
public FloatingSettingDialogManager(Context context) {
this.context = context;
this.windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
currentIntervalUnit = UnitType.MS;
currentSwipeDurationUnit = UnitType.MS;
currentRepeatUnit = UnitType.INFINITELY;
}
public void showFloatingTabDialog() {
@ -201,28 +209,6 @@ public class FloatingSettingDialogManager {
repeatSelectorContainer.setOnClickListener(v -> showUnitSelection(v, TYPE_REPEAT));
}
private void updateRepeatUI(boolean isChecked) {
if (isChecked) {
repeatInput.setVisibility(View.VISIBLE);
repeatSelectorContainer.setVisibility(View.VISIBLE);
if (currentRepeatUnit.equals(context.getString(R.string.infinitely_unit)) || repeatSelectedUnit.getText().toString().equals(context.getString(R.string.infinitely_unit))) {
etRepeatValue.setText("");
etRepeatValue.setEnabled(false);
etRepeatValue.setInputType(InputType.TYPE_NULL);
repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit));
} else {
etRepeatValue.setEnabled(true);
etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
etRepeatValue.setText(currentRepeatValue);
repeatSelectedUnit.setText(currentRepeatUnit.isEmpty() ? context.getString(R.string.cycle_unit) : currentRepeatUnit);
}
} else {
repeatInput.setVisibility(View.GONE);
repeatSelectorContainer.setVisibility(View.GONE);
}
}
private void showUnitSelection(View anchorView, int type) {
View popupView = LayoutInflater.from(context).inflate(R.layout.dialog_unit_selection, null);
PopupWindow popupWindow = new PopupWindow(
@ -272,34 +258,24 @@ public class FloatingSettingDialogManager {
if (type == TYPE_INTERVAL || type == TYPE_SWIPE_DURATION) {
tvMs.setOnClickListener(v -> {
UnitType selectedUnitType = UnitType.MS;
String unitText = context.getString(R.string.milliseconds_unit);
if (type == TYPE_INTERVAL) {
intervalSelectedUnit.setText(unitText);
currentIntervalUnit = unitText;
} else {
tvSelectedUnit.setText(unitText);
currentSwipeDurationUnit = unitText;
}
updateUIAndSaveSettings(type, selectedUnitType, unitText);
popupWindow.dismiss();
});
tvSec.setOnClickListener(v -> {
UnitType selectedUnitType = UnitType.SEC;
String unitText = context.getString(R.string.seconds_unit);
if (type == TYPE_INTERVAL) {
intervalSelectedUnit.setText(unitText);
currentIntervalUnit = unitText;
} else {
tvSelectedUnit.setText(unitText);
currentSwipeDurationUnit = unitText;
}
updateUIAndSaveSettings(type, selectedUnitType, unitText);
popupWindow.dismiss();
});
if (type == TYPE_INTERVAL) {
tvMin.setOnClickListener(v -> {
UnitType selectedUnitType = UnitType.MIN;
String unitText = context.getString(R.string.minutes_unit);
intervalSelectedUnit.setText(unitText);
currentIntervalUnit = unitText;
updateUIAndSaveSettings(type, selectedUnitType, unitText);
popupWindow.dismiss();
});
}
@ -307,32 +283,26 @@ public class FloatingSettingDialogManager {
if (type == TYPE_REPEAT) {
tvInfinitely.setOnClickListener(v -> {
UnitType selectedUnitType = UnitType.INFINITELY;
String unitText = context.getString(R.string.infinitely_unit);
repeatSelectedUnit.setText(unitText);
currentRepeatUnit = unitText;
etRepeatValue.setText("");
etRepeatValue.setEnabled(false);
etRepeatValue.setInputType(InputType.TYPE_NULL);
updateUIAndSaveSettings(type, selectedUnitType, unitText);
updateRepeatUI(true); // 悬浮窗中需要在选择后立即更新UI
popupWindow.dismiss();
});
tvDuration.setOnClickListener(v -> {
UnitType selectedUnitType = UnitType.DURATION;
String unitText = context.getString(R.string.duration_unit);
repeatSelectedUnit.setText(unitText);
currentRepeatUnit = unitText;
etRepeatValue.setText("");
etRepeatValue.setEnabled(true);
etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
updateUIAndSaveSettings(type, selectedUnitType, unitText);
updateRepeatUI(true);
popupWindow.dismiss();
});
tvCycle.setOnClickListener(v -> {
UnitType selectedUnitType = UnitType.CYCLE;
String unitText = context.getString(R.string.cycle_unit);
repeatSelectedUnit.setText(unitText);
currentRepeatUnit = unitText;
etRepeatValue.setText("");
etRepeatValue.setEnabled(true);
etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
updateUIAndSaveSettings(type, selectedUnitType, unitText);
updateRepeatUI(true);
popupWindow.dismiss();
});
}
@ -344,6 +314,49 @@ public class FloatingSettingDialogManager {
}
}
private void updateUIAndSaveSettings(int type, UnitType selectedUnitType, String unitText) {
switch (type) {
case TYPE_INTERVAL:
intervalSelectedUnit.setText(unitText);
currentIntervalUnit = selectedUnitType;
break;
case TYPE_SWIPE_DURATION:
tvSelectedUnit.setText(unitText);
currentSwipeDurationUnit = selectedUnitType;
break;
case TYPE_REPEAT:
repeatSelectedUnit.setText(unitText);
currentRepeatUnit = selectedUnitType;
break;
}
}
private void updateRepeatUI(boolean isChecked) {
if (isChecked) {
repeatInput.setVisibility(View.VISIBLE);
repeatSelectorContainer.setVisibility(View.VISIBLE);
if (currentRepeatUnit == UnitType.INFINITELY) {
etRepeatValue.setText("");
etRepeatValue.setEnabled(false);
etRepeatValue.setInputType(InputType.TYPE_NULL);
repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit));
} else if (currentRepeatUnit == UnitType.DURATION) {
etRepeatValue.setText(currentRepeatValue);
etRepeatValue.setEnabled(true);
etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
repeatSelectedUnit.setText(context.getString(R.string.duration_unit));
} else if (currentRepeatUnit == UnitType.CYCLE) {
etRepeatValue.setText(currentRepeatValue);
etRepeatValue.setEnabled(true);
etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
repeatSelectedUnit.setText(context.getString(R.string.cycle_unit));
}
} else {
repeatInput.setVisibility(View.GONE);
repeatSelectorContainer.setVisibility(View.GONE);
}
}
private void saveCurrentSettings() {
currentIntervalValue = etIntervalValue.getText().toString();
currentDurationValue = etDurationValue.getText().toString();
@ -363,14 +376,13 @@ public class FloatingSettingDialogManager {
return;
}
// 应用点击间隔
long intervalValue = 0;
if (!currentIntervalValue.isEmpty()) {
try {
intervalValue = Long.parseLong(currentIntervalValue);
if (currentIntervalUnit.equals(context.getString(R.string.seconds_unit))) {
if (currentIntervalUnit == UnitType.SEC) {
intervalValue *= 1000;
} else if (currentIntervalUnit.equals(context.getString(R.string.minutes_unit))) {
} else if (currentIntervalUnit == UnitType.MIN) {
intervalValue *= 60 * 1000;
}
service.setClickInterval(intervalValue);
@ -387,7 +399,7 @@ public class FloatingSettingDialogManager {
if (!currentDurationValue.isEmpty()) {
try {
slideDurationValue = Integer.parseInt(currentDurationValue);
if (currentSwipeDurationUnit.equals(context.getString(R.string.seconds_unit))) {
if (currentSwipeDurationUnit == UnitType.SEC) {
slideDurationValue *= 1000;
}
service.setSlideDuration(slideDurationValue);
@ -401,10 +413,10 @@ public class FloatingSettingDialogManager {
}
if (isRepeatSwitchChecked) {
if (currentRepeatUnit.equals(context.getString(R.string.infinitely_unit))) {
service.setLoopCount(0); // 无限循环
if (currentRepeatUnit == UnitType.INFINITELY) {
service.setLoopCount(0);
Log.d(TAG, "应用重复模式: 无限次。");
} else if (currentRepeatUnit.equals(context.getString(R.string.duration_unit))) {
} else if (currentRepeatUnit == UnitType.DURATION) {
long repeatDurationMillis = 0;
if (!currentRepeatValue.isEmpty()) {
try {
@ -421,7 +433,7 @@ public class FloatingSettingDialogManager {
Log.d(TAG, "重复时长值为空,取消时间循环。");
}
service.setLoopCount(0); // 确保与时间循环互斥
} else if (currentRepeatUnit.equals(context.getString(R.string.cycle_unit))) {
} else if (currentRepeatUnit == UnitType.CYCLE) {
int repeatCount = 0;
if (!currentRepeatValue.isEmpty()) {
try {
@ -447,51 +459,40 @@ public class FloatingSettingDialogManager {
}
private void restoreUIState() {
// 恢复点击间隔
if (!currentIntervalValue.isEmpty()) {
etIntervalValue.setText(currentIntervalValue);
}
if (!currentIntervalUnit.isEmpty()) {
intervalSelectedUnit.setText(currentIntervalUnit);
} else {
intervalSelectedUnit.setText(context.getString(R.string.milliseconds_unit)); // 默认单位
currentIntervalUnit = context.getString(R.string.milliseconds_unit);
}
intervalSelectedUnit.setText(getUnitString(currentIntervalUnit));
// 恢复滑动时长
if (!currentDurationValue.isEmpty()) {
etDurationValue.setText(currentDurationValue);
}
if (!currentSwipeDurationUnit.isEmpty()) {
tvSelectedUnit.setText(currentSwipeDurationUnit);
} else {
tvSelectedUnit.setText(context.getString(R.string.milliseconds_unit));
currentSwipeDurationUnit = context.getString(R.string.milliseconds_unit);
}
tvSelectedUnit.setText(getUnitString(currentSwipeDurationUnit));
// 恢复重复设置
repeatSwitch.setChecked(isRepeatSwitchChecked);
updateRepeatUI(isRepeatSwitchChecked);
if (isRepeatSwitchChecked) {
if (currentRepeatUnit.isEmpty()) {
repeatSelectedUnit.setText(context.getString(R.string.infinitely_unit));
currentRepeatUnit = context.getString(R.string.infinitely_unit);
etRepeatValue.setText("");
etRepeatValue.setEnabled(false);
etRepeatValue.setInputType(InputType.TYPE_NULL);
} else {
repeatSelectedUnit.setText(currentRepeatUnit);
if (currentRepeatUnit.equals(context.getString(R.string.infinitely_unit))) {
etRepeatValue.setText("");
etRepeatValue.setEnabled(false);
etRepeatValue.setInputType(InputType.TYPE_NULL);
} else {
etRepeatValue.setText(currentRepeatValue);
etRepeatValue.setEnabled(true);
etRepeatValue.setInputType(InputType.TYPE_CLASS_NUMBER);
repeatSelectedUnit.setText(getUnitString(currentRepeatUnit));
}
}
private String getUnitString(UnitType unitType) {
switch (unitType) {
case MS:
return context.getString(R.string.milliseconds_unit);
case SEC:
return context.getString(R.string.seconds_unit);
case MIN:
return context.getString(R.string.minutes_unit);
case INFINITELY:
return context.getString(R.string.infinitely_unit);
case DURATION:
return context.getString(R.string.duration_unit);
case CYCLE:
return context.getString(R.string.cycle_unit);
default:
return "";
}
}

View File

@ -639,10 +639,20 @@ public class FloatingViewManager {
@Override
public void onReceive(Context context, Intent intent) {
if ("com.auto.clicker.autoclicker.FLASH_TOUCH_POINT".equals(intent.getAction())) {
boolean isStopEvent = intent.getBooleanExtra("isStopEvent", false);
if (isStopEvent) {
Log.d(TAG, "接收到停止点击完成广播,更新触点背景");
updateTouchPointsBackground(R.drawable.ring_has_bg);
setControlButtonsEnabled(true);
isMultipleRunning = false;
updatePlayButtonImage(false);
} else {
int index = intent.getIntExtra("index", -1);
flashTouchPoint(index);
}
}
}
},
new IntentFilter("com.auto.clicker.autoclicker.FLASH_TOUCH_POINT")
);
@ -740,9 +750,9 @@ public class FloatingViewManager {
}
}
updateServicePositions();
Toast.makeText(context, "方案 '" + solutionData.solution.solutionName + "' 加载成功", Toast.LENGTH_SHORT).show();
Toast.makeText(context, "Script '" + solutionData.solution.solutionName + "' Loading successful", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "加载方案失败或方案不存在", Toast.LENGTH_SHORT).show();
Toast.makeText(context, "The loading scheme fails or the scheme does not exist", Toast.LENGTH_SHORT).show();
}
});
}
@ -751,7 +761,7 @@ public class FloatingViewManager {
public void onError(Exception e) {
Log.e(TAG, "加载方案失败: " + e.getMessage(), e);
new Handler(Looper.getMainLooper()).post(() ->
Toast.makeText(context, "加载方案失败: " + e.getMessage(), Toast.LENGTH_SHORT).show()
Toast.makeText(context, "The loading scheme failed.: " + e.getMessage(), Toast.LENGTH_SHORT).show()
);
}
});

View File

@ -87,6 +87,7 @@ Feedback"
android:textSize="16sp" />
<Button
android:id="@+id/grant"
android:layout_width="127dp"
android:layout_height="42dp"
android:layout_gravity="center"

View File

@ -38,6 +38,7 @@
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
app:layout_constraintTop_toBottomOf="@+id/how_title"
app:tabIndicatorHeight="0dp"
app:tabRippleColor="@android:color/transparent" />
<androidx.viewpager2.widget.ViewPager2

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.menu.MenuActivity">
<LinearLayout
@ -81,15 +81,18 @@
<include
android:id="@+id/feedback"
layout="@layout/item_menu" />
layout="@layout/item_menu"
android:visibility="gone" />
<include
android:id="@+id/privacy"
layout="@layout/item_menu" />
layout="@layout/item_menu"
android:visibility="gone" />
<include
android:id="@+id/term"
layout="@layout/item_menu" />
layout="@layout/item_menu"
android:visibility="gone" />
</LinearLayout>
</ScrollView>

View File

@ -38,6 +38,7 @@
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
app:layout_constraintTop_toBottomOf="@+id/setting_title"
app:tabIndicatorHeight="0dp"
app:tabRippleColor="@android:color/transparent" />
<androidx.viewpager2.widget.ViewPager2

View File

@ -64,6 +64,7 @@
android:textSize="16sp" />
<Button
android:id="@+id/Regrant"
android:layout_width="127dp"
android:layout_height="42dp"
android:layout_gravity="center"

View File

@ -2,7 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="321dp"
android:layout_height="420dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_rounded_rect"
android:paddingBottom="25dp">
@ -96,6 +96,18 @@
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tv_interval_range_hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="36dp"
android:layout_marginTop="4dp"
android:text="范围: 40ms - 10000ms"
android:textColor="@color/gray"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/input_interval" />
<ImageView
android:id="@+id/duration_icon"
android:layout_width="20dp"
@ -114,7 +126,7 @@
android:textColor="@color/white"
android:textSize="14sp"
app:layout_constraintStart_toStartOf="@+id/tv_interval_label"
app:layout_constraintTop_toBottomOf="@id/input_interval" />
app:layout_constraintTop_toBottomOf="@id/tv_interval_range_hint" />
<TextView
android:id="@+id/tv_preview_label"
@ -184,6 +196,18 @@
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tv_duration_range_hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="36dp"
android:layout_marginTop="4dp"
android:text="范围: 100ms - 2000ms"
android:textColor="@color/gray"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/input_with_unit_container" />
<TextView
android:id="@+id/default_cycle_title"
android:layout_width="wrap_content"
@ -195,7 +219,7 @@
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/input_with_unit_container" />
app:layout_constraintTop_toBottomOf="@+id/tv_duration_range_hint" />
<ImageView
android:id="@+id/repeat_icon"

6
keystore.properties Normal file
View File

@ -0,0 +1,6 @@
app_name=Auto Clicker
package_name=com.auto.clicker.autoclicker
keystoreFile=app/AutoClicker.jks
key_alias=AutoClickerkey0
key_store_password=AutoClicker
key_password=AutoClicker