diff --git a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java
index 829fdbdf..a54a9536 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java
@@ -32,6 +32,7 @@ import com.hjq.permissions.XXPermissions;
import com.hjq.toast.ToastUtils;
import com.idormy.sms.forwarder.adapter.LogAdapter;
import com.idormy.sms.forwarder.model.vo.LogVo;
+import com.idormy.sms.forwarder.sender.BatteryReportCronTask;
import com.idormy.sms.forwarder.sender.HttpServer;
import com.idormy.sms.forwarder.sender.SendUtil;
import com.idormy.sms.forwarder.sender.SenderUtil;
@@ -148,6 +149,15 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I
}
}
+ //电池状态定时推送
+ if (SettingUtil.getSwitchEnableBatteryCron()) {
+ try {
+ BatteryReportCronTask.getSingleton().updateTimer();
+ } catch (Exception e) {
+ Log.e(TAG, "BatteryReportCronTask:", e);
+ }
+ }
+
}
@Override
diff --git a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
index 92b4c1dd..e7125052 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
@@ -2,6 +2,7 @@ package com.idormy.sms.forwarder;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
+import android.app.TimePickerDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -35,6 +36,7 @@ import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjq.toast.ToastUtils;
import com.idormy.sms.forwarder.receiver.RebootBroadcastReceiver;
+import com.idormy.sms.forwarder.sender.BatteryReportCronTask;
import com.idormy.sms.forwarder.sender.HttpServer;
import com.idormy.sms.forwarder.sender.SenderUtil;
import com.idormy.sms.forwarder.sender.SmsHubApiTask;
@@ -53,6 +55,7 @@ import com.idormy.sms.forwarder.view.StepBar;
import java.lang.reflect.Method;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -101,6 +104,10 @@ public class SettingActivity extends AppCompatActivity {
switchBatteryReceiver(findViewById(R.id.switch_battery_receiver));
//电量预警
editBatteryLevelAlarm(findViewById(R.id.et_battery_level_alarm_min), findViewById(R.id.et_battery_level_alarm_max), findViewById(R.id.cb_battery_level_alarm_once));
+ //定时推送电池状态
+ switchBatteryCron(findViewById(R.id.switch_battery_cron));
+ //设置推送电池状态时机
+ editBatteryCronTiming(findViewById(R.id.et_battery_cron_start_time), findViewById(R.id.et_battery_cron_interval));
//开机启动
checkWithReboot(findViewById(R.id.switch_with_reboot), findViewById(R.id.tv_auto_startup));
@@ -432,6 +439,71 @@ public class SettingActivity extends AppCompatActivity {
});
}
+ //定时推送电池状态
+ @SuppressLint("UseSwitchCompatOrMaterialCode")
+ private void switchBatteryCron(Switch switch_battery_cron) {
+ boolean isOn = SettingUtil.getSwitchEnableBatteryCron();
+ switch_battery_cron.setChecked(isOn);
+
+ final LinearLayout layout_battery_cron = findViewById(R.id.layout_battery_cron);
+ layout_battery_cron.setVisibility(isOn ? View.VISIBLE : View.GONE);
+
+ switch_battery_cron.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ Log.d(TAG, "onCheckedChanged:" + isChecked);
+ layout_battery_cron.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ SettingUtil.switchEnableBatteryCron(isChecked);
+ BatteryReportCronTask.getSingleton().updateTimer();
+ });
+ }
+
+ //设置推送电池状态时机
+ private void editBatteryCronTiming(final EditText et_battery_cron_start_time, final EditText et_battery_cron_interval) {
+ et_battery_cron_start_time.setText(SettingUtil.getBatteryCronStartTime());
+
+ Calendar calendar = Calendar.getInstance();
+ et_battery_cron_start_time.setOnClickListener(view -> {
+ TimePickerDialog dialog = new TimePickerDialog(SettingActivity.this, (timePicker, hourOfDay, minute) -> {
+ StringBuilder sb = new StringBuilder();
+ if (hourOfDay < 10) {
+ sb.append("0");
+ }
+ sb.append(hourOfDay);
+ sb.append(":");
+ if (minute < 10) {
+ sb.append("0");
+ }
+ sb.append(minute);
+ String startTime = sb.toString();
+ et_battery_cron_start_time.setText(startTime);
+ SettingUtil.setBatteryCronStartTime(startTime);
+ BatteryReportCronTask.getSingleton().updateTimer();
+ }, calendar.get(Calendar.HOUR_OF_DAY) + 1, 0, true);
+ dialog.show();
+ });
+
+ et_battery_cron_interval.setText(String.valueOf(SettingUtil.getBatteryCronInterval()));
+ et_battery_cron_interval.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ String interval = et_battery_cron_interval.getText().toString().trim();
+ if (!interval.isEmpty() && Integer.parseInt(interval) > 0) {
+ SettingUtil.setBatteryCronInterval(Integer.parseInt(interval));
+ BatteryReportCronTask.getSingleton().updateTimer();
+ } else {
+ SettingUtil.setBatteryCronInterval(60);
+ }
+ }
+ });
+ }
+
//开机启动
private void checkWithReboot(@SuppressLint("UseSwitchCompatOrMaterialCode") Switch withrebootSwitch, TextView tvAutoStartup) {
tvAutoStartup.setText(getAutoStartTips());
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/BatteryReportCronTask.java b/app/src/main/java/com/idormy/sms/forwarder/sender/BatteryReportCronTask.java
new file mode 100644
index 00000000..5b43510d
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/BatteryReportCronTask.java
@@ -0,0 +1,104 @@
+package com.idormy.sms.forwarder.sender;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
+
+import com.idormy.sms.forwarder.MyApplication;
+import com.idormy.sms.forwarder.model.vo.SmsHubVo;
+import com.idormy.sms.forwarder.model.vo.SmsVo;
+import com.idormy.sms.forwarder.utils.BatteryUtils;
+import com.idormy.sms.forwarder.utils.SettingUtil;
+import com.idormy.sms.forwarder.utils.SmsHubActionHandler;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class BatteryReportCronTask {
+ private static final String TAG = "BatteryReportCronTask";
+ private volatile static BatteryReportCronTask singleton;
+ private static Timer timer;
+
+ private BatteryReportCronTask() {
+ }
+
+ public static BatteryReportCronTask getSingleton() {
+ if (singleton == null) {
+ synchronized (BatteryReportCronTask.class) {
+ if (singleton == null) {
+ singleton = new BatteryReportCronTask();
+ }
+ }
+ }
+ return singleton;
+ }
+
+ public void updateTimer() {
+ cancelTimer();
+ if (SettingUtil.getSwitchEnableBatteryCron()) {
+ startTimer();
+ } else {
+ Log.d(TAG, "Cancel Task");
+ }
+ }
+
+ private void cancelTimer() {
+ if (timer != null) {
+ timer.cancel();
+ timer = null;
+ }
+ }
+
+ private void startTimer() {
+ String startTime = SettingUtil.getBatteryCronStartTime();
+ int interval = SettingUtil.getBatteryCronInterval();
+ Log.i(TAG, "Task started, startTime: " + startTime + ", interval: " + interval);
+
+ int hour = Integer.parseInt(startTime.split(":")[0]);
+ int minute = Integer.parseInt(startTime.split(":")[1]);
+
+ Calendar startTimeCalendar = Calendar.getInstance();
+ startTimeCalendar.set(Calendar.HOUR_OF_DAY, hour);
+ startTimeCalendar.set(Calendar.MINUTE, minute);
+ startTimeCalendar.set(Calendar.SECOND, 0);
+
+ Calendar currentTimeCalendar = Calendar.getInstance();
+ if (startTimeCalendar.before(currentTimeCalendar)) {
+ //首次发送时间在当前时间之前,日期加一天
+ startTimeCalendar.add(Calendar.DATE, 1);
+ }
+ Log.d(TAG, startTimeCalendar.getTime().toString());
+
+ timer = new Timer("BatteryReportCronTimer", true);
+ timer.schedule(new Task(), startTimeCalendar.getTime(), interval * 60 * 1000L);
+ }
+
+ static class Task extends TimerTask {
+ @Override
+ public void run() {
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+ Intent intent = MyApplication.getContext().registerReceiver(null, intentFilter);
+ String msg = BatteryUtils.getBatteryInfo(intent);
+ sendMessage(MyApplication.getContext(), msg);
+ }
+
+ //发送信息
+ private void sendMessage(Context context, String msg) {
+ Log.i(TAG, msg);
+ try {
+ SmsVo smsVo = new SmsVo("88888888", msg, new Date(), "电池状态定时推送");
+ SendUtil.send_msg(context, smsVo, 1, "app");
+
+ //SmsHubApi
+ if (SettingUtil.getSwitchEnableSmsHubApi()) {
+ SmsHubActionHandler.putData(new SmsHubVo(SmsHubVo.Type.phone, null, msg, "电池状态定时推送"));
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "sendMessage e:" + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.java b/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.java
index b2fead11..70c7c264 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.java
@@ -6,7 +6,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.os.BatteryManager;
import android.os.IBinder;
import android.util.Log;
@@ -14,6 +13,7 @@ import com.idormy.sms.forwarder.MyApplication;
import com.idormy.sms.forwarder.model.vo.SmsHubVo;
import com.idormy.sms.forwarder.model.vo.SmsVo;
import com.idormy.sms.forwarder.sender.SendUtil;
+import com.idormy.sms.forwarder.utils.BatteryUtils;
import com.idormy.sms.forwarder.utils.SettingUtil;
import com.idormy.sms.forwarder.utils.SmsHubActionHandler;
@@ -74,7 +74,7 @@ public class BatteryService extends Service {
int levelCur = intent.getIntExtra("level", 0);
int levelPre = SettingUtil.getBatteryLevelCurrent();
if (levelCur != levelPre) {
- String msg = batteryReceiver(intent);
+ String msg = BatteryUtils.getBatteryInfo(intent);
SettingUtil.setBatteryLevelCurrent(levelCur);
int levelMin = SettingUtil.getBatteryLevelAlarmMin();
@@ -103,99 +103,15 @@ public class BatteryService extends Service {
if (SettingUtil.getSwitchEnableBatteryReceiver()) {
int oldStatus = SettingUtil.getBatteryStatus();
if (status != oldStatus) {
- String msg = batteryReceiver(intent);
+ String msg = BatteryUtils.getBatteryInfo(intent);
SettingUtil.setBatteryStatus(status);
- msg = "【充电状态】发生变化:" + getStatus(oldStatus) + " → " + getStatus(status) + msg;
+ msg = "【充电状态】发生变化:" + BatteryUtils.getStatus(oldStatus) + " → " + BatteryUtils.getStatus(status) + msg;
sendMessage(context, msg);
}
}
}
};
- @SuppressLint("DefaultLocale")
- private String batteryReceiver(Intent intent) {
- Log.i(TAG, "BatteryReceiver--------------");
- String action = intent.getAction();
- Log.i(TAG, " 0 action:" + action);
- Log.i(TAG, "ACTION_BATTERY_CHANGED");
- int status = intent.getIntExtra("status", 0);
- int health = intent.getIntExtra("health", 0);
- //boolean present = intent.getBooleanExtra("present", false);
- int levelCur = intent.getIntExtra("level", 0);
- int scale = intent.getIntExtra("scale", 0);
- //int icon_small = intent.getIntExtra("icon-small", 0);
- int plugged = intent.getIntExtra("plugged", 0);
- int voltage = intent.getIntExtra("voltage", 0);
- int temperature = intent.getIntExtra("temperature", 0);
- //String technology = intent.getStringExtra("technology");
-
- String msg = "";
- msg += "\n剩余电量:" + levelCur + "%";
-
- if (scale > 0) msg += "\n充满电量:" + scale + "%";
-
- if (voltage > 0) msg += "\n当前电压:" + String.format("%.2f", voltage / 1000F) + "V";
-
- if (temperature > 0) msg += "\n当前温度:" + String.format("%.2f", temperature / 10F) + "℃";
-
- msg += "\n电池状态:" + getStatus(status);
-
- if (health > 0) msg += "\n健康度:" + getHealth(health);
-
- switch (plugged) {
- case BatteryManager.BATTERY_PLUGGED_AC:
- msg += "\n充电器:AC";
- break;
- case BatteryManager.BATTERY_PLUGGED_USB:
- msg += "\n充电器:USB";
- break;
- case BatteryManager.BATTERY_PLUGGED_WIRELESS:
- msg += "\n充电器:无线";
- break;
- }
-
- Log.i(TAG, msg);
- return msg;
- }
-
- //电池状态
- private String getStatus(int status) {
- switch (status) {
- case BatteryManager.BATTERY_STATUS_CHARGING:
- return "充电中";
- case BatteryManager.BATTERY_STATUS_DISCHARGING:
- return "放电中";
- case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
- return "未充电";
- case BatteryManager.BATTERY_STATUS_FULL:
- return "充满电";
- case BatteryManager.BATTERY_STATUS_UNKNOWN:
- default:
- return "未知";
- }
- }
-
- //健康度
- private String getHealth(int health) {
- switch (health) {
- case 2:
- return "良好";
- case 3:
- return "过热";
- case 4:
- return "没电";
- case 5:
- return "过电压";
- case 6:
- return "未知错误";
- case 7:
- return "温度过低";
- default:
- case 1:
- return "未知";
- }
- }
-
//发送信息
private void sendMessage(Context context, String msg) {
Log.i(TAG, msg);
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.java b/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.java
new file mode 100644
index 00000000..f2b6a480
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/BatteryUtils.java
@@ -0,0 +1,94 @@
+package com.idormy.sms.forwarder.utils;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.BatteryManager;
+import android.util.Log;
+
+public class BatteryUtils {
+ private static final String TAG = "BatteryUtils";
+
+ @SuppressLint("DefaultLocale")
+ public static String getBatteryInfo(Intent intent) {
+ Log.i(TAG, "getBatteryInfo--------------");
+ String action = intent.getAction();
+ Log.i(TAG, " 0 action:" + action);
+ Log.i(TAG, "ACTION_BATTERY_CHANGED");
+ int status = intent.getIntExtra("status", 0);
+ int health = intent.getIntExtra("health", 0);
+ //boolean present = intent.getBooleanExtra("present", false);
+ int levelCur = intent.getIntExtra("level", 0);
+ int scale = intent.getIntExtra("scale", 0);
+ //int icon_small = intent.getIntExtra("icon-small", 0);
+ int plugged = intent.getIntExtra("plugged", 0);
+ int voltage = intent.getIntExtra("voltage", 0);
+ int temperature = intent.getIntExtra("temperature", 0);
+ //String technology = intent.getStringExtra("technology");
+
+ String msg = "";
+ msg += "\n剩余电量:" + levelCur + "%";
+
+ if (scale > 0) msg += "\n充满电量:" + scale + "%";
+
+ if (voltage > 0) msg += "\n当前电压:" + String.format("%.2f", voltage / 1000F) + "V";
+
+ if (temperature > 0) msg += "\n当前温度:" + String.format("%.2f", temperature / 10F) + "℃";
+
+ msg += "\n电池状态:" + getStatus(status);
+
+ if (health > 0) msg += "\n健康度:" + getHealth(health);
+
+ switch (plugged) {
+ case BatteryManager.BATTERY_PLUGGED_AC:
+ msg += "\n充电器:AC";
+ break;
+ case BatteryManager.BATTERY_PLUGGED_USB:
+ msg += "\n充电器:USB";
+ break;
+ case BatteryManager.BATTERY_PLUGGED_WIRELESS:
+ msg += "\n充电器:无线";
+ break;
+ }
+
+ Log.i(TAG, msg);
+ return msg;
+ }
+
+ //电池状态
+ public static String getStatus(int status) {
+ switch (status) {
+ case BatteryManager.BATTERY_STATUS_CHARGING:
+ return "充电中";
+ case BatteryManager.BATTERY_STATUS_DISCHARGING:
+ return "放电中";
+ case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
+ return "未充电";
+ case BatteryManager.BATTERY_STATUS_FULL:
+ return "充满电";
+ case BatteryManager.BATTERY_STATUS_UNKNOWN:
+ default:
+ return "未知";
+ }
+ }
+
+ //健康度
+ public static String getHealth(int health) {
+ switch (health) {
+ case 2:
+ return "良好";
+ case 3:
+ return "过热";
+ case 4:
+ return "没电";
+ case 5:
+ return "过电压";
+ case 6:
+ return "未知错误";
+ case 7:
+ return "温度过低";
+ default:
+ case 1:
+ return "未知";
+ }
+ }
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java b/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java
index c453c3bd..b1a5c8f0 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java
@@ -20,6 +20,9 @@ public class Define {
public static final String SP_MSG_KEY_STRING_SMS_TEMPLATE = "tsms_msg_key_string_sms_template";
public static final String SP_MSG_KEY_STRING_BATTERY_STATUS = "tsms_msg_key_string_battery_status";
public static final String SP_MSG_KEY_STRING_BATTERY_RECEIVER = "tsms_msg_key_switch_battery_receiver";
+ public static final String SP_MSG_KEY_STRING_BATTERY_CRON = "tsms_msg_key_switch_battery_cron";
+ public static final String SP_MSG_KEY_STRING_BATTERY_CRON_START_TIME = "tsms_msg_key_switch_battery_cron_start_time";
+ public static final String SP_MSG_KEY_STRING_BATTERY_CRON_INTERVAL = "tsms_msg_key_switch_battery_cron_interval";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_CURRENT = "tsms_msg_key_string_battery_level_current";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_ALARM = "tsms_msg_key_string_battery_level_alarm";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_MAX = "tsms_msg_key_string_battery_level_max";
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java
index a00e5066..558bef1f 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java
@@ -282,6 +282,30 @@ public class SettingUtil {
sp_setting.edit().putInt(Define.SP_MSG_KEY_STRING_DELAY_TIME, delay_time).apply();
}
+ public static void switchEnableBatteryCron(Boolean enable) {
+ sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_BATTERY_CRON, enable).apply();
+ }
+
+ public static boolean getSwitchEnableBatteryCron() {
+ return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_BATTERY_CRON, false);
+ }
+
+ public static void setBatteryCronStartTime(String startTime) {
+ sp_setting.edit().putString(Define.SP_MSG_KEY_STRING_BATTERY_CRON_START_TIME, startTime).apply();
+ }
+
+ public static String getBatteryCronStartTime() {
+ return sp_setting.getString(Define.SP_MSG_KEY_STRING_BATTERY_CRON_START_TIME, "00:00");
+ }
+
+ public static void setBatteryCronInterval(int interval) {
+ sp_setting.edit().putInt(Define.SP_MSG_KEY_STRING_BATTERY_CRON_INTERVAL, interval).apply();
+ }
+
+ public static int getBatteryCronInterval() {
+ return sp_setting.getInt(Define.SP_MSG_KEY_STRING_BATTERY_CRON_INTERVAL, 60);
+ }
+
//获取当前版本名称
public static String getVersionName() {
// 获取PackageManager的实例
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
index 619139eb..838358ad 100644
--- a/app/src/main/res/layout/activity_setting.xml
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -512,6 +512,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0
Monitor battery status changes
Notify when charging status changes (charging/discharging/uncharged/fully charged)
+ Regularly report battery status
+ Timer rule
+ First time:
+ Interval(minutes):
Proxy Settings
None
HTTP
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b46145a5..82f9ae95 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -272,6 +272,10 @@
0
监听电池状态变化
充电状态改变(充电中/放电中/未充电/已充满)时发出通知
+ 定时推送电池状态
+ 定时规则
+ 首次发送时间:
+ 间隔(分钟):
代理设置
无代理
HTTP