CleanScheduleHelper.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package com.bgy.autosale.helpers;
  2. import android.graphics.Color;
  3. import android.text.SpannableString;
  4. import android.text.Spanned;
  5. import android.text.style.ForegroundColorSpan;
  6. import com.bgy.autosale.App;
  7. import com.bgy.autosale.Constant;
  8. import com.bgy.autosale.IceCreamDeviceConstants;
  9. import com.bgy.autosale.R;
  10. import com.bgy.autosale.ui.operator.fragments.CleanConfigFragment;
  11. import com.bgy.autosale.utils.PlcLog;
  12. import com.bgy.autosale.utils.ReadCacheInfoUtils;
  13. import com.bgy.autosale.utils.SPUtils;
  14. import java.util.concurrent.TimeUnit;
  15. import io.reactivex.android.schedulers.AndroidSchedulers;
  16. import io.reactivex.disposables.Disposable;
  17. import io.reactivex.schedulers.Schedulers;
  18. /**
  19. * Created by cjx on 2021-01-12
  20. * 说明:清洗提醒控制类
  21. */
  22. public class CleanScheduleHelper {
  23. private final String TAG = "CleanScheduleHelper";
  24. private final String SHARE_PREFERENCE_CLEAN_WARN = "SHARE_PREFERENCE_CLEAN_WARN";
  25. private long CLEAN_RECYCLE_TIME = 259200000; // 清洗周期 默认3天
  26. private long WARN_FIRST_TIME = 43200000; // 第一次清洗提醒, 比清洗周期少12小时
  27. private long WARN_SECOND_TIME = 21600000; // 最后一次清洗提醒, 比清洗周期少6小时
  28. private long ERROR_MESSAGE_TIME = 3600000; // 第二次清洗提醒通知, 比清洗周期多1小时
  29. private static CleanScheduleHelper helper;
  30. private Disposable timeSchedule;
  31. private Disposable warnSchedule;
  32. // 为了避免多次进入发送消息的模块
  33. private boolean checkWarn = false;
  34. private boolean checkError = false;
  35. private boolean cleanTimeOutDisable = false; // 到期未清洗禁止点餐
  36. public static CleanScheduleHelper getInstance() {
  37. if (helper == null) {
  38. synchronized (CleanScheduleHelper.class) {
  39. if (helper == null) {
  40. helper = new CleanScheduleHelper();
  41. }
  42. }
  43. }
  44. return helper;
  45. }
  46. private CleanScheduleHelper() {
  47. }
  48. public void destroy() {
  49. checkWarn = false;
  50. checkError = false;
  51. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
  52. if (timeSchedule != null) {
  53. timeSchedule.dispose();
  54. timeSchedule = null;
  55. }
  56. if (warnSchedule != null) {
  57. warnSchedule.dispose();
  58. warnSchedule = null;
  59. }
  60. }
  61. // 获取当前清洗开关
  62. public void initCleanScheduleParams() {
  63. cleanTimeOutDisable = SPUtils.getInstance(App.app).getBoolean(CleanConfigFragment.SHARED_PREFERENCE_LOCK_SWITCH, false);
  64. if (!cleanTimeOutDisable) {
  65. ErrorViewHelper.getInstance().hideErrorView(R.string.error_device_clean);
  66. }
  67. // 清洗功能开关
  68. boolean cleanScheduleSwitch = SPUtils.getInstance(App.app).getBoolean(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_SWITCH, false);
  69. try {
  70. int days = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_SCHEDULE, 3);
  71. log(String.format(App.app.getString(R.string.clean_recycle), days));
  72. long time = days * 86400000L; // 3600000; // 86400000;
  73. if (time > 0) {
  74. CLEAN_RECYCLE_TIME = time;
  75. }
  76. int first = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_FIRST, 12);
  77. WARN_FIRST_TIME = first * 3600000L;
  78. int second = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_SECOND, 6);
  79. WARN_SECOND_TIME = second * 3600000L;
  80. int last = SPUtils.getInstance(App.app).getInt(CleanConfigFragment.SHARED_PREFERENCE_CLEAN_LAST, 1);
  81. ERROR_MESSAGE_TIME = last * 3600000L;
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85. if (cleanScheduleSwitch) {
  86. destroy();
  87. startCleanSchedule();
  88. }
  89. }
  90. public void checkIfNeedShowError(boolean startTimeSchedule) {
  91. long startTime = ReadCacheInfoUtils.getInstance().getCleanDate();
  92. if (startTime == 0L) {
  93. return;
  94. }
  95. long cleanTime = NetTimeClock.getInstance().getNetLongTime() - startTime;
  96. if (cleanTime > CLEAN_RECYCLE_TIME) {
  97. showCleanError(cleanTime);
  98. } else if (startTimeSchedule) {
  99. checkWarnMessage(cleanTime);
  100. if (timeSchedule != null) {
  101. timeSchedule.dispose();
  102. }
  103. timeSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
  104. @Override
  105. public void run() {
  106. showCleanError(CLEAN_RECYCLE_TIME);
  107. }
  108. }, CLEAN_RECYCLE_TIME - cleanTime, TimeUnit.MILLISECONDS);
  109. }
  110. }
  111. // 检查当前清洗状态
  112. private void check() {
  113. if (timeSchedule != null) {
  114. return;
  115. }
  116. checkIfNeedShowError(true);
  117. }
  118. // 满足条件, 开始清洗倒计时
  119. public void startCleanSchedule() {
  120. long time = ReadCacheInfoUtils.getInstance().getCleanDate();
  121. if (time == 0L) {
  122. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
  123. log("开始记录清洗倒计时");
  124. ReadCacheInfoUtils.getInstance().saveCleanDate(NetTimeClock.getInstance().getNetLongTime());
  125. log("记录清洗时间 " + NetTimeClock.getInstance().getNetLongTime());
  126. }
  127. check();
  128. }
  129. // 清洗完成/强制解除 重置清洗倒计时
  130. public void resetCleanSchedule() {
  131. destroy();
  132. if (NetTimeClock.getInstance().netTimeReady()) {
  133. ReadCacheInfoUtils.getInstance().saveCleanDate(NetTimeClock.getInstance().getNetLongTime());
  134. log("记录清洗时间 " + NetTimeClock.getInstance().getNetLongTime());
  135. } else {
  136. ReadCacheInfoUtils.getInstance().saveCleanDate(0);
  137. log("记录清洗时间 0");
  138. Schedulers.io().scheduleDirect(runnable, 30, TimeUnit.SECONDS);
  139. }
  140. ErrorViewHelper.getInstance().hideErrorView(R.string.error_device_clean);
  141. log("重置了清洗倒计时");
  142. check();
  143. }
  144. private Runnable runnable = new Runnable() {
  145. @Override
  146. public void run() {
  147. if (NetTimeClock.getInstance().netTimeReady()) {
  148. ReadCacheInfoUtils.getInstance().saveCleanDate(NetTimeClock.getInstance().getNetLongTime());
  149. log("2记录清洗时间 " + NetTimeClock.getInstance().getNetLongTime());
  150. }
  151. }
  152. };
  153. // 显示当前清洗时间周期
  154. public SpannableString getCleanTime() {
  155. long startTime = ReadCacheInfoUtils.getInstance().getCleanDate();
  156. if (startTime == 0L) {
  157. return null;
  158. }
  159. SpannableString spannableString;
  160. if (!NetTimeClock.getInstance().netTimeReady()) {
  161. spannableString = new SpannableString(App.app.getString(R.string.time_ready));
  162. spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
  163. return spannableString;
  164. }
  165. long cleanTime = NetTimeClock.getInstance().getNetLongTime() - startTime;
  166. if (cleanTime > CLEAN_RECYCLE_TIME) {
  167. spannableString = new SpannableString(App.app.getString(R.string.setting_clean_countdown_time_out) + getTimeString(cleanTime - CLEAN_RECYCLE_TIME));
  168. spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
  169. } else {
  170. String start = App.app.getString(R.string.setting_clean_countdown_time);
  171. spannableString = new SpannableString(start + getTimeString(CLEAN_RECYCLE_TIME - cleanTime));
  172. spannableString.setSpan(new ForegroundColorSpan(Color.RED), start.length(), spannableString.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
  173. }
  174. return spannableString;
  175. }
  176. // 是否发送清洗预警通知
  177. private void checkWarnMessage(long time) {
  178. if (checkWarn) {
  179. return;
  180. }
  181. checkWarn = true;
  182. int progress = SPUtils.getInstance(App.app).getInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
  183. if (progress > 1) {
  184. return;
  185. }
  186. if (time >= CLEAN_RECYCLE_TIME - WARN_SECOND_TIME) {
  187. log(App.app.getString(R.string.clean_lock_notify_last));
  188. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 2);
  189. // TODO 发送预警通知到云端
  190. return;
  191. }
  192. if (progress == 0) { // 没有提醒过
  193. if (warnSchedule != null) {
  194. warnSchedule.dispose();
  195. }
  196. long d = CLEAN_RECYCLE_TIME - WARN_FIRST_TIME - time;
  197. if (d < 0) {
  198. d = 0;
  199. }
  200. warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
  201. @Override
  202. public void run() {
  203. log(App.app.getString(R.string.clean_lock_notify_first));
  204. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 1);
  205. // TODO 发送预警通知到云端
  206. long delay = WARN_FIRST_TIME - WARN_SECOND_TIME;
  207. // 开启第二次预警倒计时
  208. warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
  209. @Override
  210. public void run() {
  211. log(App.app.getString(R.string.clean_lock_notify_second));
  212. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 2);
  213. // TODO 发送预警通知到云端
  214. }
  215. }, delay, TimeUnit.MILLISECONDS);
  216. }
  217. }, d, TimeUnit.MILLISECONDS);
  218. } else if (progress == 1) { // 提醒过一次
  219. if (warnSchedule != null) {
  220. warnSchedule.dispose();
  221. }
  222. long delay = CLEAN_RECYCLE_TIME - WARN_SECOND_TIME - time;
  223. warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
  224. @Override
  225. public void run() {
  226. log(App.app.getString(R.string.clean_lock_notify_second));
  227. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 2);
  228. // TODO 发送预警通知到云端
  229. }
  230. }, delay, TimeUnit.MILLISECONDS);
  231. }
  232. }
  233. private void checkErrorMessage(long time) {
  234. if (checkError) {
  235. return;
  236. }
  237. checkError = true;
  238. int progress = SPUtils.getInstance(App.app).getInt(SHARE_PREFERENCE_CLEAN_WARN, 0);
  239. if (progress > 3) {
  240. return;
  241. }
  242. if (time >= ERROR_MESSAGE_TIME + CLEAN_RECYCLE_TIME) {
  243. log(App.app.getString(R.string.clean_lock_warning_last));
  244. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 4);
  245. // TODO 发送锁屏警告到云端
  246. } else if (progress < 3) {
  247. log(App.app.getString(R.string.clean_lock_warning_first));
  248. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 3);
  249. // TODO 发送锁屏警告到云端
  250. if (warnSchedule != null) {
  251. warnSchedule.dispose();
  252. }
  253. warnSchedule = AndroidSchedulers.mainThread().scheduleDirect(new Runnable() {
  254. @Override
  255. public void run() {
  256. log(App.app.getString(R.string.clean_lock_warning_second));
  257. SPUtils.getInstance(App.app).putInt(SHARE_PREFERENCE_CLEAN_WARN, 4);
  258. // TODO 发送锁屏警告到云端
  259. }
  260. }, ERROR_MESSAGE_TIME + CLEAN_RECYCLE_TIME - time, TimeUnit.MILLISECONDS);
  261. }
  262. }
  263. private String getTimeString(long cleanTime) {
  264. String timeString;
  265. if (cleanTime > 3600000) {
  266. timeString = (cleanTime / 3600000) + App.app.getString(R.string.setting_clean_countdown_time_hour);
  267. } else {
  268. timeString = (cleanTime / 60000) + App.app.getString(R.string.setting_clean_countdown_time_minute);
  269. }
  270. return timeString;
  271. }
  272. private String getTimeDetailString(long cleanTime) {
  273. StringBuilder timeString = new StringBuilder();
  274. if (cleanTime > 3600000) {
  275. timeString.append(cleanTime / 3600000).append("小时");
  276. }
  277. cleanTime = cleanTime % 3600000;
  278. timeString.append(cleanTime / 60000).append("分钟");
  279. cleanTime = cleanTime % 60000;
  280. timeString.append(cleanTime / 1000).append("秒");
  281. return timeString.toString();
  282. }
  283. private void showCleanError(long time) {
  284. checkErrorMessage(time);
  285. if (!cleanTimeOutDisable) {
  286. return;
  287. }
  288. if (Constant.inSaleView) {
  289. return;
  290. }
  291. String[] lastErrorMessage = new String[]{App.app.getString(R.string.setting_clean_countdown_error_tip),
  292. App.app.getString(R.string.setting_clean_countdown_error_describe)};
  293. ErrorViewHelper.getInstance().showErrorView(R.string.error_device_clean, lastErrorMessage);
  294. }
  295. private void log(String message) {
  296. PlcLog.getInstance().e_s(TAG, message);
  297. }
  298. }