123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- package com.bgy.autosale.helpers;
- import android.graphics.Color;
- import android.text.SpannableString;
- import android.text.Spanned;
- import android.text.style.ForegroundColorSpan;
- import com.bgy.autosale.App;
- import com.bgy.autosale.Constant;
- import com.bgy.autosale.IceCreamDeviceConstants;
- import com.bgy.autosale.R;
- import com.bgy.autosale.ui.operator.fragments.CleanConfigFragment;
- import com.bgy.autosale.utils.PlcLog;
- import com.bgy.autosale.utils.ReadCacheInfoUtils;
- import com.bgy.autosale.utils.SPUtils;
- import java.util.concurrent.TimeUnit;
- import io.reactivex.android.schedulers.AndroidSchedulers;
- import io.reactivex.disposables.Disposable;
- import io.reactivex.schedulers.Schedulers;
- /**
- * Created by cjx on 2021-01-12
- * 说明:清洗提醒控制类
- */
- public class CleanScheduleHelper {
- private final String TAG = "CleanScheduleHelper";
- private final String SHARE_PREFERENCE_CLEAN_WARN = "SHARE_PREFERENCE_CLEAN_WARN";
- private long CLEAN_RECYCLE_TIME = 259200000; // 清洗周期 默认3天
- private long WARN_FIRST_TIME = 43200000; // 第一次清洗提醒, 比清洗周期少12小时
- private long WARN_SECOND_TIME = 21600000; // 最后一次清洗提醒, 比清洗周期少6小时
- private long ERROR_MESSAGE_TIME = 3600000; // 第二次清洗提醒通知, 比清洗周期多1小时
- private static CleanScheduleHelper helper;
- private Disposable timeSchedule;
- private Disposable warnSchedule;
- // 为了避免多次进入发送消息的模块
- private boolean checkWarn = false;
- private boolean checkError = false;
- private boolean cleanTimeOutDisable = false; // 到期未清洗禁止点餐
- public static CleanScheduleHelper getInstance() {
- if (helper == null) {
- synchronized (CleanScheduleHelper.class) {
- if (helper == null) {
- helper = new CleanScheduleHelper();
- }
- }
- }
- return helper;
- }
- private CleanScheduleHelper() {
- }
- public void destroy() {
- checkWarn = false;
- checkError = false;
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
- if (timeSchedule != null) {
- timeSchedule.dispose();
- timeSchedule = null;
- }
- if (warnSchedule != null) {
- warnSchedule.dispose();
- warnSchedule = null;
- }
- }
- // 获取当前清洗开关
- public void initCleanScheduleParams() {
- cleanTimeOutDisable = SPUtils.getInstance(App.app).getBoolean(CleanConfigFragment.SHARED_PREFERENCE_LOCK_SWITCH, false);
- if (!cleanTimeOutDisable) {
- ErrorViewHelper.getInstance().hideErrorView(R.string.error_device_clean);
- }
- // 清洗功能开关
- boolean cleanScheduleSwitch = SPUtils.getInstance(App.app).getBoolean(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_SWITCH, false);
- try {
- int days = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_SCHEDULE, 3);
- log(String.format(App.app.getString(R.string.clean_recycle), days));
- long time = days * 86400000L; // 3600000; // 86400000;
- if (time > 0) {
- CLEAN_RECYCLE_TIME = time;
- }
- int first = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_FIRST, 12);
- WARN_FIRST_TIME = first * 3600000L;
- int second = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_SECOND, 6);
- WARN_SECOND_TIME = second * 3600000L;
- int last = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_LAST, 1);
- ERROR_MESSAGE_TIME = last * 3600000L;
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (cleanScheduleSwitch) {
- destroy();
- startCleanSchedule();
- }
- }
- public void checkIfNeedShowError(boolean startTimeSchedule) {
- long startTime = ReadCacheInfoUtils.getInstance().getCleanDate();
- if (startTime == 0L) {
- return;
- }
- long cleanTime = NetTimeClock.getInstance().getNetLongTime() - startTime;
- if (cleanTime > CLEAN_RECYCLE_TIME) {
- showCleanError(cleanTime);
- } else if (startTimeSchedule) {
- checkWarnMessage(cleanTime);
- if (timeSchedule != null) {
- timeSchedule.dispose();
- }
- timeSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
- @Override
- public void run() {
- showCleanError(CLEAN_RECYCLE_TIME);
- }
- }, CLEAN_RECYCLE_TIME - cleanTime, TimeUnit.MILLISECONDS);
- }
- }
- // 检查当前清洗状态
- private void check() {
- if (timeSchedule != null) {
- return;
- }
- checkIfNeedShowError(true);
- }
- // 满足条件, 开始清洗倒计时
- public void startCleanSchedule() {
- long time = ReadCacheInfoUtils.getInstance().getCleanDate();
- if (time == 0L) {
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
- log("开始记录清洗倒计时");
- ReadCacheInfoUtils.getInstance().saveCleanDate(NetTimeClock.getInstance().getNetLongTime());
- log("记录清洗时间 " + NetTimeClock.getInstance().getNetLongTime());
- }
- check();
- }
- // 清洗完成/强制解除 重置清洗倒计时
- public void resetCleanSchedule() {
- destroy();
- if (NetTimeClock.getInstance().netTimeReady()) {
- ReadCacheInfoUtils.getInstance().saveCleanDate(NetTimeClock.getInstance().getNetLongTime());
- log("记录清洗时间 " + NetTimeClock.getInstance().getNetLongTime());
- } else {
- ReadCacheInfoUtils.getInstance().saveCleanDate(0);
- log("记录清洗时间 0");
- Schedulers.io().scheduleDirect(runnable, 30, TimeUnit.SECONDS);
- }
- ErrorViewHelper.getInstance().hideErrorView(R.string.error_device_clean);
- log("重置了清洗倒计时");
- check();
- }
- private Runnable runnable = new Runnable() {
- @Override
- public void run() {
- if (NetTimeClock.getInstance().netTimeReady()) {
- ReadCacheInfoUtils.getInstance().saveCleanDate(NetTimeClock.getInstance().getNetLongTime());
- log("2记录清洗时间 " + NetTimeClock.getInstance().getNetLongTime());
- }
- }
- };
- // 显示当前清洗时间周期
- public SpannableString getCleanTime() {
- long startTime = ReadCacheInfoUtils.getInstance().getCleanDate();
- if (startTime == 0L) {
- return null;
- }
- SpannableString spannableString;
- if (!NetTimeClock.getInstance().netTimeReady()) {
- spannableString = new SpannableString(App.app.getString(R.string.time_ready));
- spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
- return spannableString;
- }
- long cleanTime = NetTimeClock.getInstance().getNetLongTime() - startTime;
- if (cleanTime > CLEAN_RECYCLE_TIME) {
- spannableString = new SpannableString(App.app.getString(R.string.setting_clean_countdown_time_out) + getTimeString(cleanTime - CLEAN_RECYCLE_TIME));
- spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
- } else {
- String start = App.app.getString(R.string.setting_clean_countdown_time);
- spannableString = new SpannableString(start + getTimeString(CLEAN_RECYCLE_TIME - cleanTime));
- spannableString.setSpan(new ForegroundColorSpan(Color.RED), start.length(), spannableString.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
- }
- return spannableString;
- }
- // 是否发送清洗预警通知
- private void checkWarnMessage(long time) {
- if (checkWarn) {
- return;
- }
- checkWarn = true;
- int progress = SPUtils.getInstance(App.app).getInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
- if (progress > 1) {
- return;
- }
- if (time >= CLEAN_RECYCLE_TIME - WARN_SECOND_TIME) {
- log(App.app.getString(R.string.clean_lock_notify_last));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 2);
- // TODO 发送预警通知到云端
- return;
- }
- if (progress == 0) { // 没有提醒过
- if (warnSchedule != null) {
- warnSchedule.dispose();
- }
- long d = CLEAN_RECYCLE_TIME - WARN_FIRST_TIME - time;
- if (d < 0) {
- d = 0;
- }
- warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
- @Override
- public void run() {
- log(App.app.getString(R.string.clean_lock_notify_first));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 1);
- // TODO 发送预警通知到云端
- long delay = WARN_FIRST_TIME - WARN_SECOND_TIME;
- // 开启第二次预警倒计时
- warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
- @Override
- public void run() {
- log(App.app.getString(R.string.clean_lock_notify_second));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 2);
- // TODO 发送预警通知到云端
- }
- }, delay, TimeUnit.MILLISECONDS);
- }
- }, d, TimeUnit.MILLISECONDS);
- } else if (progress == 1) { // 提醒过一次
- if (warnSchedule != null) {
- warnSchedule.dispose();
- }
- long delay = CLEAN_RECYCLE_TIME - WARN_SECOND_TIME - time;
- warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
- @Override
- public void run() {
- log(App.app.getString(R.string.clean_lock_notify_second));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 2);
- // TODO 发送预警通知到云端
- }
- }, delay, TimeUnit.MILLISECONDS);
- }
- }
- private void checkErrorMessage(long time) {
- if (checkError) {
- return;
- }
- checkError = true;
- int progress = SPUtils.getInstance(App.app).getInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
- if (progress > 3) {
- return;
- }
- if (time >= ERROR_MESSAGE_TIME + CLEAN_RECYCLE_TIME) {
- log(App.app.getString(R.string.clean_lock_warning_last));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 4);
- // TODO 发送锁屏警告到云端
- } else if (progress < 3) {
- log(App.app.getString(R.string.clean_lock_warning_first));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 3);
- // TODO 发送锁屏警告到云端
- if (warnSchedule != null) {
- warnSchedule.dispose();
- }
- warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
- @Override
- public void run() {
- log(App.app.getString(R.string.clean_lock_warning_second));
- SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 4);
- // TODO 发送锁屏警告到云端
- }
- }, ERROR_MESSAGE_TIME + CLEAN_RECYCLE_TIME - time, TimeUnit.MILLISECONDS);
- }
- }
- private String getTimeString(long cleanTime) {
- String timeString;
- if (cleanTime > 3600000) {
- timeString = (cleanTime / 3600000) + App.app.getString(R.string.setting_clean_countdown_time_hour);
- } else {
- timeString = (cleanTime / 60000) + App.app.getString(R.string.setting_clean_countdown_time_minute);
- }
- return timeString;
- }
- private String getTimeDetailString(long cleanTime) {
- StringBuilder timeString = new StringBuilder();
- if (cleanTime > 3600000) {
- timeString.append(cleanTime / 3600000).append("小时");
- }
- cleanTime = cleanTime % 3600000;
- timeString.append(cleanTime / 60000).append("分钟");
- cleanTime = cleanTime % 60000;
- timeString.append(cleanTime / 1000).append("秒");
- return timeString.toString();
- }
- private void showCleanError(long time) {
- checkErrorMessage(time);
- if (!cleanTimeOutDisable) {
- return;
- }
- if (Constant.inSaleView) {
- return;
- }
- String[] lastErrorMessage = new String[]{App.app.getString(R.string.setting_clean_countdown_error_tip),
- App.app.getString(R.string.setting_clean_countdown_error_describe)};
- ErrorViewHelper.getInstance().showErrorView(R.string.error_device_clean, lastErrorMessage);
- }
- private void log(String message) {
- PlcLog.getInstance().e_s(TAG, message);
- }
- }
|