修复闹钟没有循环的bug
This commit is contained in:
@@ -9,15 +9,17 @@ author:
|
|||||||
2. $ {VERSION_CODE} (去掉空格),会自动替换实际修订号,比如 1.1.4.$ {VERSION_CODE}
|
2. $ {VERSION_CODE} (去掉空格),会自动替换实际修订号,比如 1.1.4.$ {VERSION_CODE}
|
||||||
-->
|
-->
|
||||||
|
|
||||||
### [1.0.6.$ {VERSION_CODE}] - 2026.3.X
|
### [1.1.0.${VERSION_CODE}] - 2026.3.13
|
||||||
|
|
||||||
#### 文件下载
|
#### 文件下载
|
||||||
|
|
||||||
* [dashboardclient_1.0.6.apk](dashboardclient_1.0.6.apk)
|
* [dashboardclient_1.1.0.apk](dashboardclient_1.1.0.apk)
|
||||||
|
|
||||||
#### 更新记录
|
#### 更新记录
|
||||||
* 设置界面增加电源开关测试
|
* WebView 启用 LocalStorage,支持新版前端
|
||||||
* App 启动时默认不发送开机指令
|
* 优化定时开关机逻辑,增加不控制和本地控制
|
||||||
|
* 命令发送3次,避免命令丢失
|
||||||
|
* 支持老款网关检测
|
||||||
|
|
||||||
### [1.0.5.26] - 2026.3.5
|
### [1.0.5.26] - 2026.3.5
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
@@ -55,5 +54,4 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -276,6 +276,10 @@ public class PowerAlarmManager {
|
|||||||
Intent intent = new Intent(context, CommandBroadcastReceiver.class);
|
Intent intent = new Intent(context, CommandBroadcastReceiver.class);
|
||||||
intent.setAction(CommandBroadcastReceiver.ACTION_SEND_COMMAND);
|
intent.setAction(CommandBroadcastReceiver.ACTION_SEND_COMMAND);
|
||||||
intent.putExtra(CommandBroadcastReceiver.EXTRA_COMMAND_HEX, cmdHex);
|
intent.putExtra(CommandBroadcastReceiver.EXTRA_COMMAND_HEX, cmdHex);
|
||||||
|
// 传递时间信息和 alarmId,用于重新设置下一个闹钟
|
||||||
|
intent.putExtra(CommandBroadcastReceiver.EXTRA_HOUR, hour);
|
||||||
|
intent.putExtra(CommandBroadcastReceiver.EXTRA_MINUTE, minute);
|
||||||
|
intent.putExtra(CommandBroadcastReceiver.EXTRA_ALARM_ID, alarmId);
|
||||||
|
|
||||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
||||||
context, alarmId, intent,
|
context, alarmId, intent,
|
||||||
|
|||||||
@@ -1,11 +1,18 @@
|
|||||||
package cn.ykbox.dashboard.receiver;
|
package cn.ykbox.dashboard.receiver;
|
||||||
|
|
||||||
|
import android.app.AlarmManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
import cn.ykbox.dashboard.perferences.PreferenceConfiguration;
|
import cn.ykbox.dashboard.perferences.PreferenceConfiguration;
|
||||||
import cn.ykbox.dashboard.serial.SerialPortDetector;
|
import cn.ykbox.dashboard.serial.SerialPortDetector;
|
||||||
|
|
||||||
@@ -13,6 +20,9 @@ public class CommandBroadcastReceiver extends BroadcastReceiver {
|
|||||||
private static final String TAG = "CommandReceiver";
|
private static final String TAG = "CommandReceiver";
|
||||||
public static final String ACTION_SEND_COMMAND = "cn.ykbox.dashboard.ACTION_SEND_COMMAND";
|
public static final String ACTION_SEND_COMMAND = "cn.ykbox.dashboard.ACTION_SEND_COMMAND";
|
||||||
public static final String EXTRA_COMMAND_HEX = "EXTRA_COMMAND_HEX";
|
public static final String EXTRA_COMMAND_HEX = "EXTRA_COMMAND_HEX";
|
||||||
|
public static final String EXTRA_HOUR = "EXTRA_HOUR";
|
||||||
|
public static final String EXTRA_MINUTE = "EXTRA_MINUTE";
|
||||||
|
public static final String EXTRA_ALARM_ID = "EXTRA_ALARM_ID";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@@ -30,7 +40,61 @@ public class CommandBroadcastReceiver extends BroadcastReceiver {
|
|||||||
if (!success) {
|
if (!success) {
|
||||||
Log.e(TAG, "Failed to send command via broadcast receiver.");
|
Log.e(TAG, "Failed to send command via broadcast receiver.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重新设置明天的闹钟(实现每天循环)
|
||||||
|
Integer hour = intent.getIntExtra(EXTRA_HOUR, -1);
|
||||||
|
Integer minute = intent.getIntExtra(EXTRA_MINUTE, -1);
|
||||||
|
int alarmId = intent.getIntExtra(EXTRA_ALARM_ID, 0);
|
||||||
|
|
||||||
|
if (hour >= 0 && minute >= 0) {
|
||||||
|
scheduleNextAlarm(context, alarmId, hexCommand, hour, minute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调度下一个闹钟(明天同一时间)
|
||||||
|
*/
|
||||||
|
private void scheduleNextAlarm(Context context, int alarmId, String cmdHex, int hour, int minute) {
|
||||||
|
new Handler(Looper.getMainLooper()).post(() -> {
|
||||||
|
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||||
|
|
||||||
|
Intent intent = new Intent(context, CommandBroadcastReceiver.class);
|
||||||
|
intent.setAction(ACTION_SEND_COMMAND);
|
||||||
|
intent.putExtra(EXTRA_COMMAND_HEX, cmdHex);
|
||||||
|
intent.putExtra(EXTRA_HOUR, hour);
|
||||||
|
intent.putExtra(EXTRA_MINUTE, minute);
|
||||||
|
intent.putExtra(EXTRA_ALARM_ID, alarmId);
|
||||||
|
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
||||||
|
context, alarmId, intent,
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
|
||||||
|
);
|
||||||
|
|
||||||
|
// 计算明天的触发时间
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.add(Calendar.DAY_OF_YEAR, 1);
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, hour);
|
||||||
|
calendar.set(Calendar.MINUTE, minute);
|
||||||
|
calendar.set(Calendar.SECOND, 0);
|
||||||
|
|
||||||
|
// 使用精确的一次性闹钟
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
alarmManager.setExactAndAllowWhileIdle(
|
||||||
|
AlarmManager.RTC_WAKEUP,
|
||||||
|
calendar.getTimeInMillis(), pendingIntent);
|
||||||
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
|
alarmManager.setExact(
|
||||||
|
AlarmManager.RTC_WAKEUP,
|
||||||
|
calendar.getTimeInMillis(), pendingIntent);
|
||||||
|
} else {
|
||||||
|
alarmManager.set(
|
||||||
|
AlarmManager.RTC_WAKEUP,
|
||||||
|
calendar.getTimeInMillis(), pendingIntent);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "Next alarm scheduled for " + hour + ":" + minute + " tomorrow (ID: " + alarmId + ")");
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public class SerialPortDetector {
|
|||||||
public static final String TEST_CMD_ON = "ACEAB400ED"; // 打开设备
|
public static final String TEST_CMD_ON = "ACEAB400ED"; // 打开设备
|
||||||
|
|
||||||
// 响应超时时间(毫秒)
|
// 响应超时时间(毫秒)
|
||||||
private static final long RESPONSE_TIMEOUT = 4000;
|
private static final long RESPONSE_TIMEOUT = 6000;
|
||||||
|
|
||||||
private DetectionCallback callback;
|
private DetectionCallback callback;
|
||||||
private Handler mainHandler;
|
private Handler mainHandler;
|
||||||
@@ -190,14 +190,6 @@ public class SerialPortDetector {
|
|||||||
notifyDetectionProgress(portPath, i + 1, devicePaths.length);
|
notifyDetectionProgress(portPath, i + 1, devicePaths.length);
|
||||||
|
|
||||||
Log.d(TAG, "Testing port: " + portPath + " at " + baudRate + " baud");
|
Log.d(TAG, "Testing port: " + portPath + " at " + baudRate + " baud");
|
||||||
|
|
||||||
// 老设备没有反馈,如果测试成功,很快就进入下个测试,导致用户看不清串口路径,这里添加延时
|
|
||||||
try {
|
|
||||||
Thread.sleep(2000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Log.e(TAG, "Sleep interrupted", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (testSerialPort(portPath, baudRate, ensurePowerOn)) {
|
if (testSerialPort(portPath, baudRate, ensurePowerOn)) {
|
||||||
Log.i(TAG, "Serial port detected successfully: " + portPath);
|
Log.i(TAG, "Serial port detected successfully: " + portPath);
|
||||||
notifyDetectionSuccess(portPath);
|
notifyDetectionSuccess(portPath);
|
||||||
@@ -228,6 +220,7 @@ public class SerialPortDetector {
|
|||||||
Log.d(TAG, "Ensuring device power on by sending both commands");
|
Log.d(TAG, "Ensuring device power on by sending both commands");
|
||||||
|
|
||||||
boolean cmd1Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_OFF);
|
boolean cmd1Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_OFF);
|
||||||
|
Thread.sleep(1000);
|
||||||
boolean cmd2Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_ON);
|
boolean cmd2Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_ON);
|
||||||
|
|
||||||
// 只要有一个命令收到有效响应就认为串口可用
|
// 只要有一个命令收到有效响应就认为串口可用
|
||||||
|
|||||||
Reference in New Issue
Block a user