ModesDetailActivity.kt 85 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429
  1. package com.develop.step.ui
  2. import android.annotation.SuppressLint
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.os.Bundle
  6. import android.os.Handler
  7. import android.util.Log
  8. import android.view.Gravity
  9. import android.view.KeyEvent
  10. import android.view.KeyEvent.ACTION_DOWN
  11. import android.view.LayoutInflater
  12. import android.view.MotionEvent
  13. import android.view.View
  14. import android.widget.RelativeLayout
  15. import androidx.appcompat.widget.AppCompatTextView
  16. import androidx.core.graphics.drawable.DrawableCompat
  17. import androidx.databinding.ViewDataBinding
  18. import com.alibaba.android.arouter.facade.annotation.Route
  19. import com.bumptech.glide.Glide
  20. import com.develop.base.ext.getModelNum
  21. import com.develop.base.ext.getSN
  22. import com.develop.base.ext.isBrand011A
  23. import com.develop.base.ext.isBrand062
  24. import com.develop.base.ext.isNightTheme
  25. import com.develop.base.ext.navigateTo
  26. import com.develop.base.ext.runOnMainThread
  27. import com.develop.base.ext.setGone
  28. import com.develop.base.ext.setVisible
  29. import com.develop.base.ext.src
  30. import com.develop.base.ext.updateText
  31. import com.develop.base.util.ThreadUtils
  32. import com.develop.base.widgets.CommonPopupWindow
  33. import com.develop.common.bean.TuyaEvent
  34. import com.develop.common.bean.WorkMode
  35. import com.develop.common.data_repo.db.ModesType
  36. import com.develop.common.dialog.CancelConfirmDialog
  37. import com.develop.common.dialog.PotCoverUnlockedDialog
  38. import com.develop.common.event.CookStepEvent
  39. import com.develop.common.food_sdk.FloatWindowManager
  40. import com.develop.common.food_sdk.FoodSdkUtils
  41. import com.develop.common.router.Screens
  42. import com.develop.common.tag.MODE_TYPE
  43. import com.develop.common.tag.PRESS_DOWN_KEY_CODE
  44. import com.develop.common.tag.TURN_DOWN_KEY_CODE
  45. import com.develop.common.tag.TURN_UP_KEY_CODE
  46. import com.develop.common.ui.CommonBVMActivity
  47. import com.develop.common.utils.CofarUtils
  48. import com.develop.common.utils.ConfigUtils
  49. import com.develop.common.utils.getTimeStr
  50. import com.develop.common.widget.DirectionView
  51. import com.develop.common.widget.EggsSelectorLayout
  52. import com.develop.common.widget.RingControlView
  53. import com.develop.common.widget.TimePickerView
  54. import com.develop.step.CookSettingType
  55. import com.develop.step.databinding.ActivityModeDetailBinding
  56. import com.develop.step.viewmodel.ModesViewMode
  57. import com.drake.net.time.Interval
  58. import com.kuyuntech.cofarcooking.device.sdk.constant.core.CommonEventTypes
  59. import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevModes
  60. import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevStatus
  61. import com.kuyuntech.cofarcooking.device.sdk.constant.core.HeatModes
  62. import com.kuyuntech.cofarcooking.device.sdk.constant.core.MotorDirections
  63. import com.kuyuntech.cofarcooking.device.sdk.constant.core.WorkModes
  64. import com.kuyuntech.cofarcooking.device.sdk.eventbus.core.DevInfo
  65. import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevCommonEvent
  66. import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevStatusEvent
  67. import com.kuyuntech.cofarcooking.device.sdk.util.core.CofarSDK
  68. import org.greenrobot.eventbus.Subscribe
  69. import org.greenrobot.eventbus.ThreadMode
  70. import java.util.concurrent.TimeUnit
  71. /**
  72. * 模式详情页
  73. */
  74. @Route(path = Screens.Cook.COOK_MODES)
  75. class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesViewMode>() {
  76. private var modeType = ModesType.CHOP.name
  77. private var lastModeType = ModesType.CHOP.name
  78. private var userChanging = false //当前是否用户在操作
  79. private var currDevInfo = DevInfo()
  80. private var modeChange = false
  81. private var mSettingInstId = ""
  82. private var mRunningInstId = ""
  83. private var mRunningState = 0
  84. private var currentTemp = 0
  85. private var currentMotorGer = 0
  86. private var currentWaterGear = 0;
  87. private var maxTemp = 0
  88. private var minTemp = 0
  89. private var maxMotorGear = 0
  90. private var minMotorGear = 0
  91. private var maxWaterGear = 0
  92. private var minWaterGear = 0
  93. private var currTime = 0L
  94. private var maxTime = 0L
  95. private var minTime = 0L
  96. private var isTempChange = false
  97. private var isTimeChange = false
  98. private var isMotorGearChange = false
  99. private var isMotorDirectionGearChange = false
  100. private var isWaterGearChange = false
  101. private var initModeData = false
  102. private var pressStartTime = -1L
  103. private var canStart = true
  104. private var whereIndex = -1
  105. private var modeName = ""
  106. private var opMode = "HAND"
  107. lateinit var ctx: Context
  108. private var confirmType: Boolean = false
  109. private var eggConfirm: AppCompatTextView? = null
  110. private var potCloverInterval: Interval? = null
  111. private var workMode: WorkMode? = null
  112. private var sdkDevMode: String = ""
  113. private var isClickType = 0
  114. private var isDevModes = true
  115. private var isModelNum = ""
  116. private var devMode = ""
  117. private var is062 = false
  118. private var is011 = false
  119. private val deviceStateDialog by lazy {
  120. CancelConfirmDialog()
  121. }
  122. private val backRequestDialog by lazy {
  123. CancelConfirmDialog()
  124. }
  125. private val overrideModeDialog by lazy {
  126. CancelConfirmDialog()
  127. }
  128. private val eggsPopupWindow by lazy {
  129. CommonPopupWindow.ViewBuilder<EggsSelectorLayout>()
  130. .width(RelativeLayout.LayoutParams.WRAP_CONTENT)
  131. .height(RelativeLayout.LayoutParams.WRAP_CONTENT)
  132. .outsideTouchable(true).focusable(true).alpha(0.5f).clippingEnabled(false)
  133. .view(EggsSelectorLayout(this)).intercept { popupWindow, view ->
  134. }.onShowBefore { popupWindow, view ->
  135. var pop_eggs_all_layout: RelativeLayout =
  136. view.findViewById(com.develop.common.R.id.pop_eggs_all_layout)
  137. pop_eggs_all_layout.setOnClickListener {
  138. // popupWindow.dismiss()
  139. }
  140. eggConfirm = view.findViewById(com.develop.common.R.id.egg_btn_confirm)
  141. eggConfirm?.setOnClickListener {
  142. var size = view.getSizeCheckType()
  143. var hardness = view.getHardnessCheckType()
  144. setEggTime(size, hardness)
  145. popupWindow.dismiss()
  146. }
  147. }.build<ViewDataBinding>(this)
  148. }
  149. override fun createViewModel(): ModesViewMode {
  150. return getViewModel(ModesViewMode::class.java)
  151. }
  152. override fun createViewBinding(inflater: LayoutInflater): ActivityModeDetailBinding {
  153. return ActivityModeDetailBinding.inflate(inflater)
  154. }
  155. private fun turnDevModeUI() {
  156. if (CofarSDK.devInfo().devMode == DevModes.AIR_FRYER) {
  157. binding.clCookTemp.visibility = View.VISIBLE
  158. binding.clCookTime.visibility = View.VISIBLE
  159. //隐藏点击
  160. binding.clCookDirection.visibility = View.GONE;
  161. binding.clCookSpeed.visibility = View.GONE;
  162. /**
  163. * 2023.11.21 空炸部分把喷水功能隐藏
  164. * */
  165. binding.clCookWater.visibility = View.GONE
  166. // binding.clCookWater.visibility = View.VISIBLE
  167. binding.ivTurbo.visibility = View.GONE
  168. //中间要有个占位
  169. binding.clTextView.visibility = View.INVISIBLE
  170. }
  171. if (CofarSDK.devInfo().devMode == DevModes.SOUP) {
  172. //隐藏点击
  173. binding.clCookTemp.visibility = View.VISIBLE
  174. binding.clCookTime.visibility = View.VISIBLE
  175. binding.clCookDirection.visibility = View.VISIBLE;
  176. binding.clCookSpeed.visibility = View.VISIBLE;
  177. binding.clCookWater.visibility = View.GONE
  178. // binding.ivTurbo.visibility = View.VISIBLE
  179. binding.clCookWater.visibility = View.GONE
  180. binding.clTextView.visibility = View.GONE
  181. }
  182. // if (CofarSDK.devInfo().devMode=="AF_AIR_FRYER"){
  183. // binding.clCookDirection.visibility = View.GONE;
  184. // binding.clCookSpeed.visibility = View.GONE;
  185. // /**
  186. // * 2023.11.21 空炸部分把喷水功能隐藏
  187. // * */
  188. // binding.clCookWater.visibility = View.GONE
  189. // binding.ivTurbo.visibility = View.GONE
  190. // }
  191. }
  192. override fun onCreate(savedInstanceState: Bundle?) {
  193. super.onCreate(savedInstanceState)
  194. hasShowScreenSaver = true
  195. configLock = true
  196. is062 = isBrand062()
  197. is011 = isBrand011A()
  198. devMode = CofarSDK.devInfo().devMode
  199. isModelNum = getModelNum()
  200. if (!isNightTheme()) {
  201. var color =
  202. if (is062) com.develop.common.R.color.white else if(is011) com.develop.common.R.color.view_change_011 else com.develop.common.R.color.view_change
  203. binding.ivBack.drawable?.apply {
  204. DrawableCompat.setTint(
  205. this,
  206. resources.getColor(color)
  207. )
  208. }
  209. }
  210. //2023.12.11 000A客户需要隐藏电磁阀
  211. binding.tvCount.setGone()
  212. binding.ivPotCover.setGone()
  213. // if (!getSN().startsWith("000")) {
  214. // binding.tvCount.setGone()
  215. // binding.ivPotCover.setGone()
  216. // }
  217. turnDevModeUI();
  218. viewModel.modeType = intent.extras?.getString(MODE_TYPE, ModesType.CHOP.name) ?: ""
  219. modeName = intent.extras?.getString("mode_name", "") ?: ""
  220. opMode = intent.extras?.getString("OP_MODE", "HAND") ?: "HAND"
  221. viewModel.lastModeType = viewModel.modeType
  222. lastModeType = viewModel.modeType
  223. modeType = lastModeType
  224. workMode = ConfigUtils.getMode(modeType)
  225. sdkDevMode = CofarSDK.devInfo().devMode
  226. if (!isNightTheme()) {
  227. if (workMode == null) {
  228. binding.ivBanner.setImageResource(com.develop.common.R.drawable.ic_mode_diy)
  229. // Glide.with(this).load(com.develop.common.R.drawable.ic_mode_diy)
  230. // .into(binding.ivBanner)
  231. } else {
  232. binding.ivBanner.setImageResource(
  233. resources.getIdentifier(
  234. workMode?.bg,
  235. "drawable",
  236. this.packageName
  237. )
  238. )
  239. // Glide.with(this).load(
  240. // resources.getIdentifier(
  241. // workMode?.bg,
  242. // "drawable",
  243. // this.packageName
  244. // )
  245. // ).into(binding.ivBanner)
  246. }
  247. }
  248. //初始化模式数据
  249. initModeData(lastModeType)
  250. initData()
  251. initListener()
  252. ThreadUtils.runOnMainThread({ configLock = false }, 500)
  253. ctx = this
  254. }
  255. override fun onDestroy() {
  256. super.onDestroy()
  257. isWidget = false
  258. viewModel.stopTurbo()
  259. viewModel.cancelAnimator()
  260. hasShowScreenSaver = false
  261. }
  262. /**
  263. * 旋转物理键
  264. */
  265. var lastKeyTime = 0L
  266. override fun dispatchKeyEvent(event: KeyEvent): Boolean {
  267. val spend = (System.currentTimeMillis() - lastKeyTime);
  268. if (spend < 10) {
  269. return super.dispatchKeyEvent(event);
  270. }
  271. lastKeyTime = System.currentTimeMillis();
  272. val currentStep = viewModel.currentStep.value
  273. Log.d("aaaaaa", "${event.keyCode}")
  274. if (event.action != KeyEvent.ACTION_UP) {
  275. when (event.keyCode) {
  276. //旋转+
  277. TURN_UP_KEY_CODE -> {
  278. when (currentStep) {
  279. CookSettingType.TEMP_SETTING -> {
  280. if (isTempChange) {
  281. //当前调节温度
  282. currentTemp += CofarSDK.getTempInterval()
  283. if (currentTemp > maxTemp) {
  284. currentTemp = maxTemp
  285. }
  286. currentTemp = FoodSdkUtils.parseTemp(currentTemp.toShort()).toInt();
  287. Log.d("aaaaaa++++", "curr=${currentTemp} max=${maxTemp}")
  288. binding.tempRingView.updateProgress(currentTemp)
  289. tempRingEvent(currentTemp)
  290. }
  291. }
  292. CookSettingType.SPEED_SETTING -> {
  293. if (isMotorGearChange) {
  294. //当前调节转速
  295. currentMotorGer += 1
  296. if (currentMotorGer > maxMotorGear) {
  297. currentMotorGer = maxMotorGear
  298. }
  299. binding.speedRingView.updateProgress(currentMotorGer)
  300. motorGearSpeedEvent(currentMotorGer)
  301. }
  302. }
  303. CookSettingType.WATER_SPRY -> {
  304. if (isWaterGearChange) {
  305. //当前调节转速
  306. currentWaterGear += 1
  307. if (currentWaterGear > maxWaterGear) {
  308. currentWaterGear = maxWaterGear
  309. }
  310. binding.waterRingView.updateProgress(currentWaterGear)
  311. waterGearSpeedEvent(currentWaterGear)
  312. }
  313. }
  314. CookSettingType.TIME_SETTING -> {
  315. if (isTimeChange) {
  316. //当前调节时间
  317. //dealWithTimeByOperation(true)
  318. handleRotateTimeChange(true)
  319. }
  320. }
  321. CookSettingType.DIRECTION_SETTING -> {
  322. motorGearDirectionClick(DirectionView.Direction.RIGHT)
  323. }
  324. else -> {
  325. }
  326. }
  327. }
  328. //旋转-
  329. TURN_DOWN_KEY_CODE -> {
  330. when (currentStep) {
  331. CookSettingType.TEMP_SETTING -> {
  332. if (isTempChange) {
  333. //当前调节温度
  334. currentTemp -= CofarSDK.getTempInterval()
  335. if (currentTemp < minTemp) {
  336. currentTemp = minTemp
  337. }
  338. if (currentTemp < 35) { //小于37度置0
  339. currentTemp = 0
  340. }
  341. currentTemp = FoodSdkUtils.parseTemp(currentTemp.toShort()).toInt();
  342. Log.d("aaaaaa------", "curr=${currentTemp} min=${minTemp}")
  343. binding.tempRingView.updateProgress(currentTemp)
  344. tempRingEvent(currentTemp)
  345. }
  346. }
  347. CookSettingType.SPEED_SETTING -> {
  348. if (isMotorGearChange) {
  349. //当前调节转速
  350. currentMotorGer -= 1
  351. if (currentMotorGer < minMotorGear) {
  352. currentMotorGer = minMotorGear
  353. }
  354. binding.speedRingView.updateProgress(currentMotorGer)
  355. motorGearSpeedEvent(currentMotorGer)
  356. }
  357. }
  358. CookSettingType.WATER_SPRY -> {
  359. if (isWaterGearChange) {
  360. //当前调节转速
  361. currentWaterGear -= 1
  362. if (currentWaterGear > maxWaterGear) {
  363. currentWaterGear = maxWaterGear
  364. }
  365. binding.waterRingView.updateProgress(currentWaterGear)
  366. waterGearSpeedEvent(currentWaterGear)
  367. }
  368. }
  369. CookSettingType.TIME_SETTING -> {
  370. if (isTimeChange) {
  371. //当前调节时间
  372. //dealWithTimeByOperation(false)
  373. handleRotateTimeChange(false)
  374. }
  375. }
  376. CookSettingType.DIRECTION_SETTING -> {
  377. motorGearDirectionClick(DirectionView.Direction.LEFT)
  378. }
  379. else -> {
  380. }
  381. }
  382. }
  383. }
  384. }
  385. return super.dispatchKeyEvent(event)
  386. }
  387. /**
  388. * 物理键按下事件
  389. */
  390. override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
  391. if (keyCode == PRESS_DOWN_KEY_CODE) {
  392. //
  393. // if (backRequestDialog.isShow){
  394. // backRequestDialog.onConfirmClick()
  395. // }else if (overrideModeDialog.isShow){
  396. // overrideModeDialog.onConfirmClick()
  397. // }
  398. //当前是turbo模式下
  399. if (viewModel.modeType == ModesType.TURBO.name) {
  400. turboDownEvent()
  401. } else {
  402. if (pressStartTime == -1L) {
  403. pressStartTime = System.currentTimeMillis()
  404. }
  405. if (pressStartTime != -1L && (System.currentTimeMillis() - pressStartTime) >
  406. 1000 && event.keyCode == PRESS_DOWN_KEY_CODE
  407. ) {
  408. this.onKeyLongPress(keyCode, event);
  409. event.startTracking()
  410. pressStartTime = -1L
  411. canStart = false;
  412. return false
  413. }
  414. }
  415. }
  416. return super.onKeyDown(keyCode, event)
  417. }
  418. /**
  419. * 物理键长按事件
  420. */
  421. override fun onKeyLongPress(keyCode: Int, event: KeyEvent?): Boolean {
  422. if (CofarSDK.devInfo().isWeightStatus) {
  423. weightClearClick()
  424. } else if (mRunningState == DevStatus.RUNNING.toInt() || currDevInfo.status == DevStatus.PAUSE.toInt()) {
  425. stopClick()
  426. } else if (mRunningState == DevStatus.STOP.toInt()) {
  427. setResult(50, Intent().putExtra("type",true))
  428. finish()
  429. // startClick()
  430. }
  431. return super.onKeyLongPress(keyCode, event)
  432. }
  433. /**
  434. * 物理键离开事件
  435. */
  436. override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  437. if (viewModel.modeType == ModesType.TURBO.name && event.keyCode == PRESS_DOWN_KEY_CODE) {
  438. //当前是turbo模式下,并且是物理键按下
  439. Log.d("dddddd", "物理键Up")
  440. turboUpEvent()
  441. return false
  442. }
  443. pressStartTime = -1L
  444. if (!CofarSDK.devInfo().isWeightStatus && viewModel.modeType != ModesType.TURBO.name && event.keyCode == PRESS_DOWN_KEY_CODE && canStart) {
  445. //非turbo模式
  446. if (userChanging && currDevInfo.status.toByte() != DevStatus.STOP) {
  447. //用户调节中
  448. confirmClick()
  449. } else {
  450. if (mRunningState == DevStatus.RUNNING.toInt()) {
  451. pauseClick()
  452. } else if (currDevInfo.status == DevStatus.PAUSE.toInt()) {
  453. resumeClick();
  454. } else if (mRunningState == DevStatus.STOP.toInt()) {
  455. startClick()
  456. }
  457. }
  458. }
  459. if (CofarSDK.devInfo().isWeightStatus) {
  460. weightClearClick();
  461. }
  462. canStart = true
  463. return super.onKeyUp(keyCode, event)
  464. }
  465. @Subscribe
  466. fun onTuyaEvent(event: TuyaEvent) {
  467. if ("start" == event.type) {
  468. if (DevStatus.PAUSE.toInt() == CofarSDK.devInfo().status) {
  469. CofarSDK.confirm()
  470. resumeClick()
  471. } else {
  472. startClick(false)
  473. }
  474. }
  475. if ("stop" == event.type) {
  476. stopClick(false)
  477. }
  478. if ("pause" == event.type) {
  479. pauseClick()
  480. }
  481. if ("change_time" == event.type) {
  482. ThreadUtils.runOnMainThread {
  483. //当前调节时间
  484. var targetTime = currDevInfo.targetTime
  485. if (currDevInfo.remainTime != 0) {
  486. targetTime = currDevInfo.remainTime
  487. }
  488. if (currDevInfo.targetTimeBuffer != -1) {
  489. targetTime = currDevInfo.targetTimeBuffer
  490. }
  491. if (targetTime < 0) {
  492. targetTime = 0;
  493. }
  494. if (targetTime > currDevInfo.mode.maxTime) {
  495. targetTime = currDevInfo.mode.maxTime
  496. }
  497. if (targetTime < currDevInfo.mode.minTime) {
  498. targetTime = currDevInfo.mode.minTime
  499. }
  500. val sec = targetTime % 60
  501. val min = ((targetTime / 60) % 60)
  502. val hour = (targetTime / 3600)
  503. var time = ""
  504. if (hour > 0) {
  505. time += if (hour < 10) {
  506. "0${hour}"
  507. } else {
  508. "$hour"
  509. }
  510. time += if (min < 10) {
  511. ":0${min}"
  512. } else {
  513. ":${min}"
  514. }
  515. } else {
  516. time += if (min < 10) {
  517. "0${min}"
  518. } else {
  519. "$min"
  520. }
  521. time += if (sec < 10) {
  522. ":0${sec}"
  523. } else {
  524. ":${sec}"
  525. }
  526. }
  527. rollTimeEvent(hour, min, sec, time, setByUser = true, "change_time")
  528. currDevInfo.apply {
  529. updateTimeUI(
  530. mode.minTime,
  531. mode.maxTime,
  532. remainTime,
  533. targetTime.toLong(),
  534. true, false, "change_time"
  535. )
  536. }
  537. binding.clSetTime.setTimeInternal(
  538. hour,
  539. min,
  540. sec,
  541. changeSetting = true,
  542. setByUser = true
  543. )
  544. }
  545. }
  546. if ("change_temp" == event.type) {
  547. ThreadUtils.runOnMainThread({
  548. updateTempUI(
  549. minTemp.toFloat(),
  550. maxTemp.toFloat(),
  551. if (currDevInfo.status == DevStatus.STOP.toInt()) currDevInfo.targetTemp.toInt()
  552. else currDevInfo.temp.toInt(),
  553. if (currDevInfo.targetTempBuffer.toInt() != -1) currDevInfo.targetTempBuffer.toString() else currDevInfo.targetTemp.toString(),
  554. isTempChange,
  555. focusUpdate = true
  556. )
  557. }, 500)
  558. }
  559. }
  560. //======================================烹饪设备回调监听==================================\\
  561. @Subscribe
  562. fun onDevCommonEvent(event: DevCommonEvent) {
  563. if (configLock) {
  564. return;
  565. }
  566. ThreadUtils.runOnMainThread({
  567. //currDevInfo.targetTime,
  568. // currDevInfo.targetTime.toLong()
  569. if (CommonEventTypes.MOTOR_GEAR_RATHER_THEN_7 == event.type) {
  570. CofarSDK.cfgTime((10 * 60))
  571. currDevInfo.mode.apply {
  572. updateTimeUI(
  573. minTime,
  574. maxTime,
  575. if (currDevInfo.status == DevStatus.STOP.toInt()) if (currDevInfo.targetTimeBuffer != -1) currDevInfo.targetTimeBuffer else currDevInfo.targetTime
  576. else currDevInfo.remainTime,
  577. if (currDevInfo.targetTimeBuffer != -1) currDevInfo.targetTimeBuffer.toLong() else currDevInfo.targetTime.toLong(),
  578. isTimeChange = true,
  579. focusUpdate = true, "onDevCommonEvent"
  580. )
  581. }
  582. }
  583. if (CommonEventTypes.MAX_MOTOR_GEAR_RATHER_THEN_WITH_TEMP == event.type) {
  584. CofarSDK.cfgMotorGear(CofarSDK.devInfo().mode.maxMotorWithTemp.toByte())
  585. currDevInfo.mode.apply {
  586. updateMotorGearUI(
  587. minMotorGear.toFloat(),
  588. maxMotorGear.toFloat(),
  589. CofarSDK.devInfo().mode.maxMotorWithTemp,
  590. isMotorGearChange
  591. )
  592. }
  593. }
  594. if (CommonEventTypes.MOTOR_REVERSE_CAN_NOT_RATHER_THEN_3 == event.type) {
  595. CofarSDK.cfgMotorGear(3)
  596. currDevInfo.mode.apply {
  597. updateMotorGearUI(
  598. minMotorGear.toFloat(),
  599. maxMotorGear.toFloat(),
  600. 3,
  601. isMotorGearChange
  602. )
  603. }
  604. }
  605. }, 500)
  606. }
  607. private var potCloverEleStatus = 0
  608. private var currentBgId = com.develop.common.R.drawable.pot_clover_ele_unlock //0是开锁图,1上锁图
  609. @Subscribe(threadMode = ThreadMode.MAIN)
  610. fun onDevStateEvent(event: DevStatusEvent) {
  611. if (!initModeData) {
  612. return
  613. }
  614. Log.d("TAG DevStateEvent", "event:" + event.devInfo.toString())
  615. //由于sdk没有判断E7到E16 需要判断运行和暂停过程中,设备发生故障弹出窗口告知故障
  616. if ((isClickType == DevStatus.RUNNING.toInt() || isClickType == DevStatus.PAUSE.toInt()
  617. || isClickType == DevStatus.STOP.toInt()) && viewModel.modeType != ModesType.WIGHT.name
  618. ) {
  619. if (ConfigUtils.getBooleanErrCode(event.devInfo.errCode.toInt()) && event.devInfo.devMode == DevModes.AIR_FRYER) {
  620. showErrCodeDialog(event.devInfo.errCode.toInt())
  621. isClickType = event.devInfo.status
  622. return
  623. }
  624. }
  625. ////devInfo.potStatus 0是有锅 1是没锅
  626. //处理换锅问题
  627. if (isModelNum == "5037" && event.devInfo.potStatus.toInt() == 1) {
  628. // isDevModes 避免重复刷新
  629. // if (isDevModes && workMode?.devMode!=DevModes.SOUP) {
  630. // isDevModes = false
  631. // CofarSDK.changeDevModeFocus(DevModes.SOUP)
  632. // return
  633. // }
  634. } else if (isModelNum == "5037" && event.devInfo.potStatus.toInt() == 0 && workMode?.type != "WIGHT") {
  635. /**
  636. * 由于客户无锅状态下是默认汤锅列表,但是在一进来是空炸锅,拿出来(无锅的时候已经换了汤锅模式),
  637. * 但重新放空炸锅,onDevModeChange 是不会回调的,固需要用potCoverType 锅盖协议来判断是否需要重新换模式
  638. * */
  639. //potCoverType 0 是汤锅 1是空炸
  640. if (event.devInfo.potCloverType.toInt() == 1 && devMode == DevModes.SOUP) {
  641. CofarSDK.changeDevModeFocus(DevModes.AIR_FRYER)
  642. return
  643. } else if (event.devInfo.potCloverType.toInt() == 0 && devMode == DevModes.AIR_FRYER) {
  644. CofarSDK.changeDevModeFocus(DevModes.SOUP)
  645. return
  646. }
  647. isDevModes = true
  648. }
  649. //处理中途换换锅问题
  650. if (sdkDevMode != event.devInfo.devMode) {
  651. return
  652. }
  653. ThreadUtils.runOnMainThread {
  654. currDevInfo = event.devInfo
  655. mRunningState = currDevInfo.runningStatus.toInt()
  656. mRunningInstId = currDevInfo.runningInstId
  657. mSettingInstId = currDevInfo.settingInstId
  658. updateStatusBtn(currDevInfo.status.toByte())
  659. if (getSN().startsWith("000")) {
  660. if (!CofarSDK.devInfo().isWeightStatus && currDevInfo.mode.mode != "TURBO") {
  661. //电磁阀在非称重/切碎下显示开锁和上锁
  662. if (currDevInfo.potCloverEleStatus.toInt() == 0 && potCloverEleStatus != 0) {
  663. potCloverEleStatus = 0
  664. potCloverInterval?.cancel()
  665. if (currentBgId == com.develop.common.R.drawable.pot_clover_ele_unlock) {
  666. binding.tvCount.setGone()
  667. } else {
  668. binding.tvCount.setGone()
  669. potCloverInterval = Interval(0, 1, TimeUnit.SECONDS, 5).life(this)
  670. .subscribe {
  671. binding.tvCount.updateText(it.toString())
  672. }.finish {
  673. binding.tvCount.setGone()
  674. currentBgId =
  675. com.develop.common.R.drawable.pot_clover_ele_unlock
  676. binding.ivPotCover.setBackgroundResource(com.develop.common.R.drawable.pot_clover_ele_unlock)
  677. }
  678. .start()
  679. }
  680. } else if (currDevInfo.potCloverEleStatus.toInt() == 1 && potCloverEleStatus != 1) {
  681. potCloverEleStatus = 1
  682. potCloverInterval?.cancel()
  683. if (currentBgId == com.develop.common.R.drawable.pot_clover_ele_lock) {
  684. binding.tvCount.setGone()
  685. } else {
  686. binding.tvCount.setGone()
  687. currentBgId = com.develop.common.R.drawable.pot_clover_ele_lock
  688. binding.ivPotCover.setBackgroundResource(com.develop.common.R.drawable.pot_clover_ele_lock)
  689. }
  690. } else if (currDevInfo.potCloverEleStatus.toInt() == 2 && potCloverEleStatus != 2) {
  691. potCloverEleStatus = 2
  692. binding.tvCount.setGone()
  693. }
  694. }
  695. }
  696. currDevInfo.mode.apply {
  697. updateTempUI(
  698. minTemp.toFloat(),
  699. maxTemp.toFloat(),
  700. if (currDevInfo.status == DevStatus.STOP.toInt()) currDevInfo.targetTemp.toInt()
  701. else currDevInfo.temp.toInt(),
  702. if (currDevInfo.targetTempBuffer.toInt() != -1) currDevInfo.targetTempBuffer.toString() else currDevInfo.targetTemp.toString(),
  703. isTempChange
  704. )
  705. updateTimeUI(
  706. if (currDevInfo.status == DevStatus.STOP.toInt() || userChanging) minTime else 0,
  707. maxTime,
  708. if (currDevInfo.status == DevStatus.STOP.toInt()) if (currDevInfo.targetTimeBuffer != -1) currDevInfo.targetTimeBuffer else currDevInfo.targetTime
  709. else currDevInfo.remainTime,
  710. if (currDevInfo.targetTimeBuffer != -1) currDevInfo.targetTimeBuffer.toLong() else currDevInfo.targetTime.toLong(),
  711. isTimeChange, false, "onDevStateEvent"
  712. )
  713. var motorGear = currDevInfo.motorGear.toInt()
  714. if (currDevInfo.motorGearBuffer.toInt() != -1) {
  715. motorGear = currDevInfo.motorGearBuffer.toInt()
  716. }
  717. updateMotorGearUI(
  718. minMotorGear.toFloat(),
  719. maxMotorGear.toFloat(),
  720. motorGear,
  721. isMotorGearChange
  722. )
  723. var waterGear =
  724. if (currDevInfo.waterGear != null) currDevInfo.waterGear.toInt() else defaultMotorGear;
  725. if (currDevInfo.waterGearBuffer != null && currDevInfo.waterGearBuffer.toInt() != -1) {
  726. waterGear = currDevInfo.waterGearBuffer.toInt()
  727. }
  728. updateWaterGearUI(
  729. minWaterGear.toFloat(),
  730. maxWaterGear.toFloat(),
  731. waterGear,
  732. isWaterGearChange
  733. )
  734. updateMotorDirectionUI(
  735. if (currDevInfo.motorDirectionBuffer.toInt() == -1) currDevInfo.motorDirection.toInt() else currDevInfo.motorDirectionBuffer.toInt(),
  736. isMotorDirectionChange
  737. )
  738. updateWeightUI(currDevInfo.weight.toFloat())
  739. }
  740. }
  741. }
  742. //======================================初始化数据和监听去==================================\\
  743. private fun initData() {
  744. if (modeName.isNotEmpty() || workMode?.name == null) {
  745. binding.tvModeName.text = modeName
  746. } else {
  747. binding.tvModeName.text =
  748. getString(resources.getIdentifier(workMode?.name, "string", this.packageName))
  749. }
  750. // // 获取ImageView的宽度和高度
  751. // val imageViewWidth = binding.ivBanner.width
  752. // val imageViewHeight = binding.ivBanner.height
  753. //
  754. // // 设置ImageView的尺寸和scaleType属性
  755. // binding.ivBanner.layoutParams.width = imageViewWidth
  756. // binding.ivBanner.layoutParams.height = imageViewHeight
  757. // binding.ivBanner.scaleType = ImageView.ScaleType.FIT_CENTER
  758. //
  759. // // 设置ImageView的图片
  760. // val bitmap = BitmapFactory.decodeResource(resources, resources.getIdentifier(workMode?.bg,"drawable",this.packageName))
  761. // binding.ivBanner.setImageBitmap(bitmap)
  762. //点击切换的模式来显示对应的UI
  763. viewModel.currentStep.observe(this) {
  764. if (it == null) {
  765. return@observe
  766. }
  767. if (it != CookSettingType.WEIGHT) {
  768. CofarSDK.stoptWeight()
  769. }
  770. when (it) {
  771. CookSettingType.WEIGHT -> {
  772. changeWeightStep()
  773. }
  774. CookSettingType.TEMP_SETTING -> {
  775. changeTempSettingStep()
  776. }
  777. CookSettingType.TIME_SETTING -> {
  778. changeTimeSettingStep()
  779. }
  780. CookSettingType.SPEED_SETTING -> {
  781. changeSpeedSettingStep()
  782. }
  783. CookSettingType.WATER_SPRY -> {
  784. // changeSpeedSettingStep()
  785. changeWaterSprySettingStep()
  786. }
  787. CookSettingType.DIRECTION_SETTING -> {
  788. changeDirectionSettingStep()
  789. }
  790. CookSettingType.TURBO -> {
  791. changeTurboStep()
  792. }
  793. }
  794. }
  795. }
  796. var configLock = false;
  797. private fun initModeData(type: String, keep: Boolean = false) {
  798. Log.d("TAG initModeData", "viewModel.modeType:" + viewModel.modeType)
  799. viewModel.modeType.apply {
  800. val baseMode = CofarSDK.devMode(this)
  801. //显示对应模式UI
  802. if (this == ModesType.WIGHT.name) {
  803. CofarSDK.recordConfig()
  804. //称重模式
  805. viewModel.changeStep(CookSettingType.WEIGHT)
  806. //CofarSDK.changeMode(baseMode)
  807. } else if (this == ModesType.TURBO.name) {
  808. CofarSDK.recordConfig()
  809. viewModel.changeStep(CookSettingType.TURBO)
  810. CofarSDK.changeMode(baseMode)
  811. } else {
  812. //其他模式
  813. changeCommonStep()
  814. viewModel.changeStep(CookSettingType.TEMP_SETTING)
  815. this@ModesDetailActivity.isMotorDirectionGearChange =
  816. baseMode.isMotorDirectionChange
  817. if (CofarSDK.devInfo().status != DevStatus.PAUSE.toInt() && CofarSDK.devInfo().status != DevStatus.RUNNING.toInt()) {
  818. Log.d("TAG initModeData", "baseMode :" + baseMode.toString())
  819. var targetTemp = baseMode.defaultTemp.toShort()
  820. var motorDirection = baseMode.motorDirection.toByte()
  821. var motorGear = baseMode.defaultMotorGear.toByte()
  822. var targetTime = baseMode.defaultTime.toInt()
  823. if (keep) {
  824. var restoreConfig: DevInfo? = null
  825. configLock = true;
  826. restoreConfig = CofarSDK.changeMode(type, baseMode, true)
  827. ThreadUtils.runOnMainThread({
  828. configLock = false;
  829. }, 500);
  830. if (restoreConfig != null) {
  831. targetTemp = restoreConfig.targetTemp;
  832. motorDirection = restoreConfig.motorDirection;
  833. motorGear = restoreConfig.motorGear;
  834. targetTime = restoreConfig.targetTime;
  835. }
  836. } else {
  837. CofarSDK.changeMode(type, baseMode)
  838. }
  839. // currDevInfo.apply {
  840. // targetTemp = baseMode.defaultTemp.toShort()
  841. // motorDirection = baseMode.motorDirection.toByte()
  842. // motorGear = baseMode.defaultMotorGear.toByte()
  843. // targetTime = baseMode.defaultTime.toInt()
  844. // }
  845. baseMode.apply {
  846. currentTemp = targetTemp.toInt()
  847. updateTempUI(
  848. minTemp.toFloat(),
  849. maxTemp.toFloat(),
  850. currentTemp,
  851. targetTemp.toString(),
  852. isTempChange,
  853. true
  854. )
  855. currTime = targetTime.toLong()
  856. updateTimeUI(
  857. minTime,
  858. maxTime,
  859. currTime.toInt(),
  860. targetTime.toLong(),
  861. isTimeChange,
  862. true, "initModeData"
  863. )
  864. currentMotorGer = defaultMotorGear
  865. updateMotorGearUI(
  866. minMotorGear.toFloat(),
  867. maxMotorGear.toFloat(),
  868. motorGear.toInt(),
  869. isMotorGearChange,
  870. focusUpdate = true
  871. )
  872. updateMotorDirectionUI(motorDirection.toInt(), isMotorDirectionChange)
  873. updateWeightUI(currDevInfo.weight.toFloat())
  874. }
  875. }
  876. }
  877. initModeData = true
  878. }
  879. }
  880. @SuppressLint("ClickableViewAccessibility")
  881. private fun initListener() {
  882. binding.ivBack.setOnClickListener {
  883. backClick()
  884. }
  885. binding.clCookTemp.setOnClickListener {
  886. viewModel.changeStep(CookSettingType.TEMP_SETTING)
  887. }
  888. binding.clCookTime.setOnClickListener {
  889. viewModel.changeStep(CookSettingType.TIME_SETTING)
  890. }
  891. binding.clCookSpeed.setOnClickListener {
  892. viewModel.changeStep(CookSettingType.SPEED_SETTING)
  893. }
  894. binding.clCookDirection.setOnClickListener {
  895. viewModel.changeStep(CookSettingType.DIRECTION_SETTING)
  896. }
  897. binding.clCookWater.setOnClickListener {
  898. viewModel.changeStep(CookSettingType.WATER_SPRY)
  899. }
  900. binding.ivTurbo.setOnClickListener {
  901. turboClick()
  902. }
  903. binding.ivEggs.setOnClickListener {
  904. eggsPopupWindow.showAtLocation(binding.titleLayout, Gravity.CENTER, 0, 0)
  905. }
  906. binding.ivWeight.setOnClickListener {
  907. weightClick()
  908. }
  909. binding.btnStart.setOnClickListener {
  910. startClick()
  911. }
  912. binding.btnResume.setOnClickListener {
  913. resumeClick()
  914. }
  915. binding.btnPause.setOnClickListener {
  916. pauseClick()
  917. }
  918. binding.btnStop.setOnClickListener {
  919. stopClick()
  920. }
  921. binding.btnCancel.setOnClickListener {
  922. cancelClick()
  923. }
  924. binding.btnConfirm.setOnClickListener {
  925. confirmClick()
  926. }
  927. binding.tvWeightTare.setOnClickListener {
  928. weightClearClick()
  929. }
  930. binding.btnReset.setOnClickListener {
  931. resetConfigClick()
  932. }
  933. binding.jiahao.setOnClickListener {
  934. var event = KeyEvent(0, 0, ACTION_DOWN, TURN_UP_KEY_CODE, 0);
  935. this.dispatchKeyEvent(event);
  936. }
  937. binding.jianhao.setOnClickListener {
  938. var event = KeyEvent(0, 0, ACTION_DOWN, TURN_DOWN_KEY_CODE, 0);
  939. this.dispatchKeyEvent(event);
  940. }
  941. binding.tempRingView.onRingViewListener = object : RingControlView.OnRingViewListener {
  942. override fun onProgressChange(progress: Int) {
  943. val pg = FoodSdkUtils.parseTemp(progress.toShort()).toInt()
  944. currentTemp = pg
  945. tempRingEvent(pg)
  946. }
  947. }
  948. val packageName = this.packageName;
  949. val ctx = this
  950. backRequestDialog.apply {
  951. title = ctx.getString(com.develop.common.R.string.keep_cooking_in_the_background)
  952. onDialogClickListener = object : CancelConfirmDialog.OnDialogClickListener {
  953. override fun onConfirm() {
  954. runOnMainThread {
  955. var workMode = ConfigUtils.getMode(modeType)
  956. val cookStepEvent = CookStepEvent(
  957. coverPath = ctx.theme.resources.getIdentifier(
  958. workMode?.icon,
  959. "drawable",
  960. packageName
  961. ),
  962. isMode = true,
  963. modeType = viewModel.modeType,
  964. modeName = getString(
  965. resources.getIdentifier(
  966. workMode?.name,
  967. "string",
  968. packageName
  969. )
  970. )
  971. )
  972. FloatWindowManager.showStepFlowWindow(cookStepEvent)
  973. finish()
  974. }
  975. }
  976. override fun onCancel() {
  977. runOnMainThread {
  978. FloatWindowManager.hideStepFlowWindow()
  979. CofarSDK.stop()
  980. finish()
  981. }
  982. }
  983. }
  984. }
  985. overrideModeDialog.apply {
  986. title =
  987. "Overwrite current cooking process?\n By overwriting,your current progress will got lost."
  988. onDialogClickListener = object : CancelConfirmDialog.OnDialogClickListener {
  989. override fun onConfirm() {
  990. val cookStepEvent = CookStepEvent(
  991. coverPath = viewModel.getBanner(),
  992. isMode = true,
  993. modeName = viewModel.modeType
  994. )
  995. FloatWindowManager.showStepFlowWindow(cookStepEvent)
  996. when (viewModel.modeType) {
  997. ModesType.WIGHT.name -> {
  998. CofarSDK.stop(false)
  999. CofarSDK.startWeight()
  1000. }
  1001. ModesType.TURBO.name -> {
  1002. CofarSDK.stop(false)
  1003. }
  1004. else -> {
  1005. userChanging = false
  1006. CofarSDK.startRunning(viewModel.modeType)
  1007. }
  1008. }
  1009. }
  1010. override fun onCancel() {
  1011. }
  1012. }
  1013. }
  1014. binding.speedRingView.onRingViewListener = object : RingControlView.OnRingViewListener {
  1015. override fun onProgressChange(progress: Int) {
  1016. currentMotorGer = progress
  1017. motorGearSpeedEvent(progress)
  1018. }
  1019. }
  1020. binding.waterRingView.onRingViewListener = object : RingControlView.OnRingViewListener {
  1021. override fun onProgressChange(progress: Int) {
  1022. currentWaterGear = progress
  1023. waterGearSpeedEvent(progress)
  1024. }
  1025. }
  1026. binding.clSetTime.onTimePickerCallback = object : TimePickerView.OnTimePickerCallback {
  1027. override fun onTimePicker(
  1028. hours: Int, minute: Int, second: Int, time: String, setByUser: Boolean
  1029. ) {
  1030. if (setByUser) {
  1031. // currTime = time.toLong()
  1032. rollTimeEvent(hours, minute, second, time, setByUser, "rCallback")
  1033. }
  1034. }
  1035. override fun onTimePickerTouchFirst(where: Int) {
  1036. whereIndex = where
  1037. userChanging = true
  1038. }
  1039. }
  1040. binding.flDirection.onDirectionClickListener =
  1041. object : DirectionView.OnDirectionClickListener {
  1042. override fun onDirectionClick(direction: DirectionView.Direction) {
  1043. motorGearDirectionClick(direction)
  1044. }
  1045. }
  1046. //TODO 2023年06月22日16:45:43 这里原来点击图标两侧也可以启动,现在修改只能点击图标启动
  1047. /**
  1048. * turbo触摸事件
  1049. */
  1050. binding.ivTurboView.setOnTouchListener { view, motionEvent ->
  1051. when (motionEvent.action) {
  1052. MotionEvent.ACTION_DOWN -> {
  1053. Log.d("dddddd", "按下(${motionEvent.x},${motionEvent.y})")
  1054. turboDownEvent()
  1055. }
  1056. MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
  1057. Log.d("dddddd", "异常点击(${motionEvent.x},${motionEvent.y})")
  1058. if (motionEvent.x == 0f && motionEvent.y == 0f) {
  1059. Log.d("dddddd", "异常点击(0,0)")
  1060. } else {
  1061. Log.d("dddddd", "物理键Up${motionEvent.action}")
  1062. turboUpEvent()
  1063. }
  1064. }
  1065. }
  1066. true
  1067. }
  1068. }
  1069. //======================================UI更新的方法==================================\\
  1070. /**默认显示的UI,切换到温度*/
  1071. private fun changeCommonStep() {
  1072. whereIndex = -1
  1073. binding.clSetTime.stopAlphaAnim()
  1074. binding.functionLayout.visibility = View.VISIBLE
  1075. binding.llWeightView.visibility = View.GONE
  1076. // 2023.12.11客户需要隐藏
  1077. // if (getSN().startsWith("000")){
  1078. // binding.ivPotCover.setVisible()
  1079. // }
  1080. if (viewModel.modeType == ModesType.WIGHT.name || viewModel.modeType == ModesType.TURBO.name) {
  1081. binding.ivWeight.visibility = View.GONE
  1082. binding.ivTurbo.visibility = View.GONE
  1083. //设置鸡蛋
  1084. visibilityEgg(View.GONE)
  1085. if (viewModel.modeType == ModesType.TURBO.name) {
  1086. binding.llTurboView.visibility = View.VISIBLE
  1087. }
  1088. } else {
  1089. // isWidget = true
  1090. binding.ivWeight.visibility = View.VISIBLE
  1091. binding.ivTurbo.visibility = View.VISIBLE
  1092. visibilityEgg(View.VISIBLE)
  1093. }
  1094. turnDevModeUI()
  1095. changeTempSettingStep()
  1096. }
  1097. /**切换到称重*/
  1098. private fun changeWeightStep() {
  1099. whereIndex = -1
  1100. binding.clSetTime.stopAlphaAnim()
  1101. isWidget = false
  1102. binding.ivWeight.visibility = View.GONE
  1103. binding.ivTurbo.visibility = View.GONE
  1104. visibilityEgg(View.GONE)
  1105. binding.functionLayout.visibility = View.GONE
  1106. binding.llWeightView.visibility = View.VISIBLE
  1107. binding.llTurboView.visibility = View.GONE
  1108. //开始称重
  1109. CofarSDK.startWeight()
  1110. }
  1111. /**切换到切碎*/
  1112. private fun changeTurboStep() {
  1113. whereIndex = -1
  1114. binding.clSetTime.stopAlphaAnim()
  1115. isWidget = false
  1116. binding.ivWeight.visibility = View.GONE
  1117. binding.ivTurbo.visibility = View.GONE
  1118. visibilityEgg(View.GONE)
  1119. binding.functionLayout.visibility = View.GONE
  1120. binding.llTurboView.visibility = View.VISIBLE
  1121. binding.llWeightView.visibility = View.GONE
  1122. }
  1123. /**切换到温度*/
  1124. private fun changeTempSettingStep() {
  1125. binding.jianhao.setVisible()
  1126. binding.jiahao.setVisible()
  1127. binding.steamFire.visibility = View.GONE
  1128. binding.llWeightView.visibility = View.GONE
  1129. binding.functionLayout.visibility = View.VISIBLE
  1130. binding.tempRingView.visibility = View.VISIBLE
  1131. binding.tempRingText.visibility = View.VISIBLE
  1132. binding.speedRingView.visibility = View.GONE
  1133. binding.speedRingText.visibility = View.GONE
  1134. binding.tempRingTextCooking.visibility = View.GONE
  1135. binding.clSetTime.visibility = View.GONE
  1136. binding.flDirection.visibility = View.GONE
  1137. binding.waterRingView.visibility = View.GONE
  1138. binding.waterSprayShow.visibility = View.GONE
  1139. //处理蒸汽模式
  1140. if (modeType == ModesType.STEAM.name) {
  1141. binding.tempRingText.visibility = View.GONE;
  1142. binding.clCookTemp.turnSteamMode();
  1143. binding.steamFire.visibility = View.VISIBLE
  1144. } else {
  1145. binding.clCookTemp.turnCommonMode();
  1146. }
  1147. setPanelViewProperty(CookSettingType.TEMP_SETTING)
  1148. }
  1149. /**切换到时间*/
  1150. private fun changeTimeSettingStep() {
  1151. binding.steamFire.visibility = View.GONE
  1152. binding.jianhao.setVisible()
  1153. binding.jiahao.setVisible()
  1154. binding.llWeightView.visibility = View.GONE
  1155. binding.functionLayout.visibility = View.VISIBLE
  1156. binding.tempRingView.visibility = View.INVISIBLE
  1157. binding.speedRingView.visibility = View.GONE
  1158. binding.speedRingText.visibility = View.GONE
  1159. binding.tempRingText.visibility = View.GONE
  1160. binding.tempRingTextCooking.visibility = View.GONE
  1161. binding.clSetTime.visibility = View.VISIBLE
  1162. binding.flDirection.visibility = View.GONE
  1163. binding.waterRingView.visibility = View.GONE
  1164. binding.waterSprayShow.visibility = View.GONE
  1165. setPanelViewProperty(CookSettingType.TIME_SETTING)
  1166. }
  1167. /**切换到转速*/
  1168. private fun changeSpeedSettingStep() {
  1169. whereIndex = -1
  1170. binding.clSetTime.stopAlphaAnim()
  1171. binding.steamFire.visibility = View.GONE
  1172. binding.jianhao.setVisible()
  1173. binding.jiahao.setVisible()
  1174. binding.llWeightView.visibility = View.GONE
  1175. binding.functionLayout.visibility = View.VISIBLE
  1176. binding.tempRingView.visibility = View.INVISIBLE
  1177. binding.tempRingText.visibility = View.INVISIBLE
  1178. binding.speedRingView.visibility = View.VISIBLE
  1179. binding.speedRingText.visibility = View.VISIBLE
  1180. binding.tempRingTextCooking.visibility = View.GONE
  1181. binding.clSetTime.visibility = View.GONE
  1182. binding.flDirection.visibility = View.GONE
  1183. binding.waterRingView.visibility = View.GONE
  1184. binding.waterSprayShow.visibility = View.GONE
  1185. setPanelViewProperty(CookSettingType.SPEED_SETTING)
  1186. }
  1187. /**切换到方向*/
  1188. private fun changeDirectionSettingStep() {
  1189. whereIndex = -1
  1190. binding.clSetTime.stopAlphaAnim()
  1191. binding.steamFire.visibility = View.GONE
  1192. binding.jianhao.setGone()
  1193. binding.jiahao.setGone()
  1194. binding.llWeightView.visibility = View.GONE
  1195. binding.functionLayout.visibility = View.VISIBLE
  1196. binding.tempRingView.visibility = View.INVISIBLE
  1197. binding.tempRingText.visibility = View.GONE
  1198. binding.speedRingView.visibility = View.GONE
  1199. binding.speedRingText.visibility = View.GONE
  1200. binding.tempRingTextCooking.visibility = View.GONE
  1201. binding.clSetTime.visibility = View.GONE
  1202. binding.flDirection.visibility = View.VISIBLE
  1203. binding.waterRingView.visibility = View.GONE
  1204. binding.waterSprayShow.visibility = View.GONE
  1205. setPanelViewProperty(CookSettingType.DIRECTION_SETTING)
  1206. }
  1207. /**切换到*/
  1208. private fun changeWaterSprySettingStep() {
  1209. whereIndex = -1
  1210. binding.clSetTime.stopAlphaAnim()
  1211. binding.steamFire.visibility = View.GONE
  1212. binding.jianhao.setVisible()
  1213. binding.jiahao.setVisible()
  1214. binding.llWeightView.visibility = View.GONE
  1215. binding.functionLayout.visibility = View.VISIBLE
  1216. binding.tempRingView.visibility = View.INVISIBLE
  1217. binding.tempRingText.visibility = View.GONE
  1218. binding.speedRingView.visibility = View.GONE
  1219. binding.speedRingText.visibility = View.GONE
  1220. binding.tempRingTextCooking.visibility = View.GONE
  1221. binding.clSetTime.visibility = View.GONE
  1222. binding.flDirection.visibility = View.GONE
  1223. binding.clCookWater.visibility = View.VISIBLE
  1224. binding.waterRingView.visibility = View.VISIBLE
  1225. binding.waterSprayShow.visibility = View.VISIBLE
  1226. setPanelViewProperty(CookSettingType.WATER_SPRY)
  1227. }
  1228. private fun setPanelViewProperty(selectStep: CookSettingType) {
  1229. binding.apply {
  1230. clCookTemp.upSelectedView(false)
  1231. clCookTime.upSelectedView(false)
  1232. clCookSpeed.upSelectedView(false)
  1233. clCookDirection.upSelectedView(false)
  1234. clCookWater.upSelectedView(false)
  1235. when (selectStep) {
  1236. CookSettingType.TEMP_SETTING -> {
  1237. clCookTemp.upSelectedView(true)
  1238. }
  1239. CookSettingType.TIME_SETTING -> {
  1240. clCookTime.upSelectedView(true)
  1241. }
  1242. CookSettingType.SPEED_SETTING -> {
  1243. clCookSpeed.upSelectedView(true)
  1244. }
  1245. CookSettingType.DIRECTION_SETTING -> {
  1246. clCookDirection.upSelectedView(true)
  1247. }
  1248. CookSettingType.WATER_SPRY -> {
  1249. clCookWater.upSelectedView(true)
  1250. }
  1251. CookSettingType.WEIGHT -> {
  1252. // do nothing
  1253. }
  1254. CookSettingType.TURBO -> {
  1255. }
  1256. }
  1257. }
  1258. }
  1259. /**旋转按钮切换时间*/
  1260. private fun handleRotateTimeChange(increase: Boolean) {
  1261. ThreadUtils.runOnMainThread {
  1262. //当前调节时间
  1263. var targetTime = currDevInfo.targetTime
  1264. if (currDevInfo.remainTime != 0) {
  1265. targetTime = currDevInfo.remainTime
  1266. }
  1267. if (currDevInfo.targetTimeBuffer != -1) {
  1268. targetTime = currDevInfo.targetTimeBuffer
  1269. }
  1270. var step = 0
  1271. if (whereIndex == 1) {
  1272. step += rotateMinOrHourStep()
  1273. } else {
  1274. step = rotateSecOrMinStep()
  1275. }
  1276. if (increase) {
  1277. targetTime += step
  1278. } else {
  1279. targetTime -= step
  1280. }
  1281. Log.d("kkkkkkk", "$whereIndex===$step===$targetTime")
  1282. if (targetTime < 0) {
  1283. targetTime = 0;
  1284. }
  1285. if (targetTime > currDevInfo.mode.maxTime) {
  1286. targetTime = currDevInfo.mode.maxTime
  1287. }
  1288. if (targetTime < currDevInfo.mode.minTime) {
  1289. targetTime = currDevInfo.mode.minTime
  1290. }
  1291. val sec = targetTime % 60
  1292. val min = ((targetTime / 60) % 60)
  1293. val hour = (targetTime / 3600)
  1294. var time = ""
  1295. if (hour > 0) {
  1296. time += if (hour < 10) {
  1297. "0${hour}"
  1298. } else {
  1299. "$hour"
  1300. }
  1301. time += if (min < 10) {
  1302. ":0${min}"
  1303. } else {
  1304. ":${min}"
  1305. }
  1306. } else {
  1307. time += if (min < 10) {
  1308. "0${min}"
  1309. } else {
  1310. "$min"
  1311. }
  1312. time += if (sec < 10) {
  1313. ":0${sec}"
  1314. } else {
  1315. ":${sec}"
  1316. }
  1317. }
  1318. rollTimeEvent(hour, min, sec, time, setByUser = true, "TimeChange")
  1319. currDevInfo.apply {
  1320. updateTimeUI(
  1321. mode.minTime,
  1322. mode.maxTime,
  1323. remainTime,
  1324. targetTime.toLong(),
  1325. true, false, "TimeChange"
  1326. )
  1327. }
  1328. binding.clSetTime.setTimeInternal(
  1329. hour,
  1330. min,
  1331. sec,
  1332. changeSetting = true,
  1333. setByUser = true
  1334. )
  1335. }
  1336. }
  1337. /**旋转按钮步进
  1338. * 右边分/秒的步进
  1339. * */
  1340. private fun rotateSecOrMinStep(): Int {
  1341. if (currDevInfo.targetTime in 0..59) {
  1342. return 1
  1343. }
  1344. if (currDevInfo.targetTime >= 60 && currDevInfo.targetTime < 10 * 60) {
  1345. return 10
  1346. }
  1347. if (currDevInfo.targetTime >= 10 * 60 && currDevInfo.targetTime < 60 * 60) {
  1348. return 30
  1349. }
  1350. if (currDevInfo.targetTime >= 60 * 60) {
  1351. return 60
  1352. }
  1353. return 1
  1354. }
  1355. /**旋转按钮步进
  1356. * 左边边分/时的步进
  1357. * */
  1358. private fun rotateMinOrHourStep(): Int {
  1359. if (currDevInfo.targetTime >= 60 && currDevInfo.targetTime < 60 * 60) {
  1360. return 60
  1361. }
  1362. if (currDevInfo.targetTime >= 60 * 60) {
  1363. return 60 * 60
  1364. }
  1365. return 60
  1366. }
  1367. /**
  1368. * 更新温度相关的UI
  1369. * @param minTemp 最小温度
  1370. * @param maxTemp 最大温度
  1371. * @param currentTemp 当前温度(或默认温度)
  1372. * @param targetTemp 设置的目标温度
  1373. * @param isTempChange 温度是否可以改变
  1374. */
  1375. @SuppressLint("SetTextI18n")
  1376. private fun updateTempUI(
  1377. minTemp: Float,
  1378. maxTemp: Float,
  1379. currentTemp: Int,
  1380. targetTemp: String,
  1381. isTempChange: Boolean,
  1382. focusUpdate: Boolean = false
  1383. ) {
  1384. this.maxTemp = maxTemp.toInt()
  1385. this.minTemp = minTemp.toInt()
  1386. this.isTempChange = isTempChange
  1387. binding.apply {
  1388. if (targetTemp.toInt() > maxTemp) {
  1389. CofarSDK.cfgHeat(maxTemp.toInt().toShort(), HeatModes.PU_TONG);
  1390. clCookTemp.setConfigValue(
  1391. "--${
  1392. CofarUtils.parseTemp(
  1393. maxTemp.toInt().toShort()
  1394. )
  1395. }°C--"
  1396. )
  1397. tempRingView.updateProgress(CofarUtils.parseTemp(maxTemp.toInt().toShort()).toInt())
  1398. tempRingText.text = ("${CofarUtils.parseTemp(maxTemp.toInt().toShort()).toInt()}°C")
  1399. }
  1400. clCookTemp.updateChangeValue("${FoodSdkUtils.parseTemp(currDevInfo.temp)}°C")
  1401. tempRingView.setRange(minTemp, maxTemp)
  1402. tempRingView.setCanTouch(isTempChange)
  1403. var tempBuffer = CofarSDK.devInfo().targetTempBuffer
  1404. steamFire.configNum(
  1405. CofarUtils.parseTemp(if (tempBuffer.toInt() != -1) tempBuffer else targetTemp.toShort())
  1406. .toInt()
  1407. )
  1408. clCookTemp.configSteamFire(
  1409. CofarUtils.parseTemp(if (tempBuffer.toInt() != -1) tempBuffer else targetTemp.toShort())
  1410. .toInt()
  1411. )
  1412. if (!userChanging || focusUpdate) {
  1413. clCookTemp.setConfigValue("--${FoodSdkUtils.parseTemp(if (tempBuffer.toInt() != -1) tempBuffer else targetTemp.toShort())}°C--")
  1414. tempRingView.updateProgress(FoodSdkUtils.parseTemp(currentTemp.toShort()).toInt())
  1415. tempRingText.text = ("${FoodSdkUtils.parseTemp(currentTemp.toShort()).toInt()}°C")
  1416. }
  1417. }
  1418. }
  1419. /**
  1420. * 更新时间相关的UI
  1421. * @param minTime 最小时间
  1422. * @param maxTime 最大时间
  1423. * @param remainTime 剩余时间(或默认时间)
  1424. * @param targetTime 设置的目标时间
  1425. * @param isTimeChange 时间是否可以修复
  1426. */
  1427. private fun updateTimeUI(
  1428. minTime: Int,
  1429. maxTime: Int,
  1430. remainTime: Int,
  1431. targetTime: Long,
  1432. isTimeChange: Boolean,
  1433. focusUpdate: Boolean = false, type: String
  1434. ) {
  1435. // Log.d(
  1436. // "TAG updateTimeUI",
  1437. // "minTime:$minTime maxTime:$maxTime remainTime:$remainTime targetTime:$targetTime isTimeChange:$isTimeChange focusUpdate$focusUpdate type :$type"
  1438. // )
  1439. this.isTimeChange = isTimeChange
  1440. this.maxTime = maxTime.toLong()
  1441. this.minTime = minTime.toLong()
  1442. binding.apply {
  1443. clCookTime.updateChangeValue(getTimeStr(currDevInfo.remainTime.toLong()))
  1444. var hours = 0
  1445. var minute = 0
  1446. var sec = 0
  1447. /**
  1448. * 由于速度大于7或等于7的时候 ,SDK会回调onDevCommonEvent方法,这个方法focusUpdate传入true,
  1449. * 就会调用下面if方法,故下面clSetTime.setTimeInternal,由于之前的minute sec 方法计算错误,现特殊处理minute sec 计算
  1450. * */
  1451. if (type == "onDevCommonEvent") {
  1452. minute = (targetTime / 60).toInt()
  1453. sec = (targetTime % 60).toInt()
  1454. } else {
  1455. if (remainTime > 3600) {
  1456. hours = remainTime / 3600
  1457. minute = remainTime % 3600 / 60
  1458. } else {
  1459. minute = remainTime / 60
  1460. sec = remainTime % 60
  1461. }
  1462. }
  1463. clSetTime.isTimeCanChange(isTimeChange)
  1464. clSetTime.setTimeRange(minTime, maxTime)
  1465. if (!userChanging || focusUpdate) {
  1466. clCookTime.setConfigValue("--${getTimeStr(targetTime)}--")
  1467. clSetTime.setTimeInternal(hours, minute, sec, true)
  1468. clSetTime.setTargetTime("--${getTimeStr(targetTime)}--")
  1469. }
  1470. }
  1471. }
  1472. /**
  1473. * 更新电机方向的UI
  1474. * @param motorDirection 电机方向
  1475. * @param isMotorDirectionChange 方向是否可以修改
  1476. */
  1477. private fun updateMotorDirectionUI(motorDirection: Int, isMotorDirectionChange: Boolean) {
  1478. binding.apply {
  1479. flDirection.isCanChangeDirection(isMotorDirectionChange)
  1480. if (!userChanging) {
  1481. clCookDirection.updateChangeValue(
  1482. viewModel.getDirectionStr(
  1483. motorDirection == MotorDirections.REVERSE.toInt(), resources
  1484. )
  1485. )
  1486. flDirection.updateDirectionView(
  1487. if (motorDirection == MotorDirections.FORWARD.toInt()) DirectionView.Direction.RIGHT
  1488. else DirectionView.Direction.LEFT
  1489. )
  1490. }
  1491. if (mRunningState == DevStatus.RUNNING.toInt() && currDevInfo.motorGear > 0) {
  1492. viewModel.playRotateAnimator(
  1493. CofarSDK.devInfo().motorDirection.toInt(),
  1494. binding.clCookDirection.binding.viewIcon
  1495. )
  1496. } else {
  1497. viewModel.pauseRotateAnimator(binding.clCookDirection.binding.viewIcon)
  1498. }
  1499. }
  1500. }
  1501. /**
  1502. * 更新电机转速的UI
  1503. * @param minMotorGear 电机最小转速
  1504. * @param maxMotorGear 电机最大转速
  1505. * @param currentMotorGer 电机当前转速
  1506. * @param isMotorGearChange 转速是否可以修改
  1507. */
  1508. private fun updateMotorGearUI(
  1509. minMotorGear: Float,
  1510. maxMotorGear: Float,
  1511. currentMotorGer: Int,
  1512. isMotorGearChange: Boolean,
  1513. focusUpdate: Boolean = false
  1514. ) {
  1515. if (CofarSDK.devInfo().devMode != DevModes.SOUP) {
  1516. return
  1517. }
  1518. this.minMotorGear = minMotorGear.toInt()
  1519. this.maxMotorGear = maxMotorGear.toInt()
  1520. this.isMotorGearChange = isMotorGearChange
  1521. binding.apply {
  1522. clCookSpeed.updateChangeValue(currentMotorGer.toString())
  1523. speedRingView.setRange(minMotorGear, maxMotorGear)
  1524. speedRingView.setCanTouch(isMotorGearChange)
  1525. if (!userChanging || focusUpdate) {
  1526. speedRingView.updateProgress(currentMotorGer)
  1527. speedRingText.text = currentMotorGer.toString()
  1528. }
  1529. }
  1530. }
  1531. /**
  1532. * 更新喷水档位的UI
  1533. * @param minWaterGear 最小转速
  1534. * @param maxWaterGear 电机最大转速
  1535. * @param currentMotorGer 电机当前转速
  1536. * @param isWaterGearChange 转速是否可以修改
  1537. */
  1538. private fun updateWaterGearUI(
  1539. minWaterGear: Float,
  1540. maxWaterGear: Float,
  1541. currentMotorGer: Int,
  1542. isWaterGearChange: Boolean,
  1543. focusUpdate: Boolean = false
  1544. ) {
  1545. if (CofarSDK.devInfo().devMode != DevModes.AIR_FRYER) {
  1546. return
  1547. }
  1548. this.minWaterGear = minWaterGear.toInt()
  1549. this.maxWaterGear = maxWaterGear.toInt()
  1550. this.isWaterGearChange = isWaterGearChange
  1551. binding.apply {
  1552. clCookSpeed.updateChangeValue(currentMotorGer.toString())
  1553. waterRingView.setRange(minWaterGear, maxWaterGear)
  1554. waterRingView.setCanTouch(isWaterGearChange)
  1555. waterSprayShow.updateGear(currentMotorGer)
  1556. binding.clCookWater.binding.waterSprayShow.updateGear(currentWaterGear)
  1557. if (!userChanging) {
  1558. waterRingView.updateProgress(currentMotorGer)
  1559. }
  1560. }
  1561. }
  1562. /**
  1563. * 更新电机转速的UI
  1564. * @param weight 当前的重量
  1565. */
  1566. @SuppressLint("SetTextI18n")
  1567. private fun updateWeightUI(weight: Float) {
  1568. binding.tvWeightNum.text = "${weight}g"
  1569. binding.weightView.setWeightNumber(weight)
  1570. }
  1571. /**
  1572. * 更新各种状态的按钮
  1573. * @param status 设备运行状态
  1574. */
  1575. private fun updateStatusBtn(status: Byte) {
  1576. //当前用户正在修改不更新按钮状态
  1577. if (userChanging) return
  1578. //切碎功能隐藏按钮
  1579. if (viewModel.modeType == ModesType.TURBO.name) {
  1580. binding.apply {
  1581. btnStart.visibility = View.GONE
  1582. btnResume.visibility = View.GONE
  1583. btnPause.visibility = View.GONE
  1584. btnStop.visibility = View.GONE
  1585. btnCancel.visibility = View.GONE
  1586. btnConfirm.visibility = View.GONE
  1587. }
  1588. return
  1589. }
  1590. if (viewModel.modeType == ModesType.WIGHT.name) {
  1591. binding.apply {
  1592. btnStart.visibility = View.GONE
  1593. btnResume.visibility = View.GONE
  1594. btnPause.visibility = View.GONE
  1595. btnStop.visibility = View.GONE
  1596. btnCancel.visibility = View.GONE
  1597. btnConfirm.visibility = View.GONE
  1598. }
  1599. return
  1600. }
  1601. when (status) {
  1602. DevStatus.RUNNING -> {
  1603. binding.apply {
  1604. ivWeight.visibility = View.GONE
  1605. ivTurbo.visibility = View.GONE
  1606. ivEggs.visibility = View.GONE
  1607. btnStart.visibility = View.INVISIBLE
  1608. btnStop.visibility = View.VISIBLE
  1609. btnResume.visibility = View.INVISIBLE
  1610. btnPause.visibility = View.VISIBLE
  1611. btnReset.visibility = View.INVISIBLE
  1612. //2023.11.21 运行过程中暂停,修改参数之后点一次就启动 处理标识
  1613. confirmType = false
  1614. }
  1615. }
  1616. DevStatus.PAUSE -> {
  1617. /**
  1618. * 2023.11.21 运行过程中暂停,修改参数之后点一次就启动
  1619. * 由于调用resume 会触发 updateStatusBtn ,会导致按钮显示一下在隐藏
  1620. * 故写一个confirmType来辨别是confirmClick 点击
  1621. * 逻辑走后,需要在runing 重新设置 confirmType设置false
  1622. * */
  1623. binding.apply {
  1624. ivWeight.visibility = View.VISIBLE
  1625. ivTurbo.visibility = View.GONE
  1626. btnStart.visibility = View.INVISIBLE
  1627. if (confirmType) btnResume.visibility =
  1628. View.INVISIBLE else btnResume.visibility = View.VISIBLE
  1629. // btnResume.visibility = View.VISIBLE
  1630. btnPause.visibility = View.INVISIBLE
  1631. btnStop.visibility = View.VISIBLE
  1632. btnCancel.visibility = View.INVISIBLE
  1633. btnConfirm.visibility = View.INVISIBLE
  1634. btnReset.visibility = View.INVISIBLE
  1635. }
  1636. }
  1637. DevStatus.STOP -> {
  1638. binding.apply {
  1639. ivWeight.visibility = View.VISIBLE
  1640. ivTurbo.visibility = View.VISIBLE
  1641. visibilityEgg(View.VISIBLE)
  1642. btnStop.visibility = View.INVISIBLE
  1643. btnStart.visibility = View.VISIBLE
  1644. btnPause.visibility = View.INVISIBLE
  1645. btnResume.visibility = View.INVISIBLE
  1646. btnCancel.visibility = View.INVISIBLE
  1647. btnConfirm.visibility = View.INVISIBLE
  1648. btnReset.visibility = View.VISIBLE
  1649. }
  1650. }
  1651. }
  1652. turnDevModeUI()
  1653. }
  1654. /**
  1655. * 显示/隐藏 确认取消按钮
  1656. */
  1657. private fun showConfirmAndCancelBtn() {
  1658. if (currDevInfo.status.toByte() != DevStatus.STOP) {
  1659. binding.btnCancel.visibility = View.VISIBLE
  1660. binding.btnConfirm.visibility = View.VISIBLE
  1661. binding.btnStop.visibility = View.GONE
  1662. binding.btnPause.visibility = View.GONE
  1663. binding.btnResume.visibility = View.GONE
  1664. binding.btnReset.visibility = View.GONE
  1665. binding.btnStart.visibility = View.GONE
  1666. }
  1667. }
  1668. //============================================================操作事件的响应方法=================================================\\
  1669. /**
  1670. * 点击开始操作
  1671. */
  1672. private fun startClick(showStopTips: Boolean = true) {
  1673. var devInfo = CofarSDK.devInfo()
  1674. //判断是否是空炸错误,由于汤锅错误SDK 已经做了
  1675. if (ConfigUtils.getBooleanErrCode(devInfo.errCode.toInt()) && devInfo.devMode == DevModes.AIR_FRYER) {
  1676. lastMsg = ""
  1677. showErrCodeDialog(devInfo.errCode.toInt())
  1678. } else {
  1679. //devInfo.potStatus 0是有锅 1是没锅
  1680. // //devInfo.potCloverStatus 0是合盖,1是没盒盖
  1681. // if (CofarSDK.devInfo().potCloverStatus.toInt() == 1) {
  1682. // showPotCloverDialog()
  1683. // }
  1684. if (CofarSDK.devInfo().potStatus.toInt() == 1) {
  1685. showErrMsgDialog("mei_fang_guo_yi_chan")
  1686. } else if (CofarSDK.devInfo().potStatus.toInt() == 0 && CofarSDK.devInfo().potCloverStatus.toInt() == 1) {
  1687. showPotCloverDialog()
  1688. } else if (mRunningInstId != mSettingInstId) {
  1689. overrideModeDialog.showDialog(supportFragmentManager, "overrideModeDialog")
  1690. overrideModeDialog.onConfirmClick()
  1691. } else {
  1692. userChanging = false
  1693. isClickType = 1
  1694. CofarSDK.cancel()
  1695. CofarSDK.devInfo().runningRecipeId = null
  1696. var startConfig = HashMap<String, Any>()
  1697. startConfig.put("stopTips", showStopTips)
  1698. CofarSDK.startWithConfig(viewModel.modeType, startConfig)
  1699. whereIndex = -1
  1700. binding.clSetTime.stopAlphaAnim()
  1701. }
  1702. }
  1703. }
  1704. private fun showPotCloverDialog() {
  1705. val warnDialog = PotCoverUnlockedDialog()
  1706. warnDialog.showDialog(supportFragmentManager, "PotCloverDialog")
  1707. }
  1708. /**
  1709. * 点击恢复操作
  1710. */
  1711. private fun resumeClick() {
  1712. userChanging = false
  1713. CofarSDK.resume()
  1714. }
  1715. /**
  1716. * 点击取消操作
  1717. */
  1718. private fun cancelClick() {
  1719. //取消
  1720. userChanging = false
  1721. CofarSDK.cancel()
  1722. binding.btnCancel.visibility = View.GONE
  1723. binding.btnConfirm.visibility = View.GONE
  1724. }
  1725. /**
  1726. * 点击确认操作
  1727. */
  1728. private fun confirmClick() {
  1729. whereIndex = -1
  1730. binding.clSetTime.stopAlphaAnim()
  1731. //确认
  1732. userChanging = false
  1733. //配置
  1734. CofarSDK.confirm()
  1735. binding.btnCancel.visibility = View.GONE
  1736. binding.btnConfirm.visibility = View.GONE
  1737. /**
  1738. * 2023.11.21 运行过程中暂停,修改参数之后点一次就启动
  1739. * 由于调用resume 会触发 updateStatusBtn ,会导致按钮显示一下在隐藏
  1740. * 故写一个confirmType来辨别是confirmClick 点击
  1741. * */
  1742. confirmType = true //确定是 confirm
  1743. binding.btnResume.visibility = View.INVISIBLE
  1744. userChanging = false
  1745. Handler().postDelayed({
  1746. CofarSDK.resume()
  1747. }, 200)
  1748. }
  1749. private fun resetConfigClick() {
  1750. //确认
  1751. userChanging = false
  1752. initModeData(modeType)
  1753. }
  1754. /**
  1755. * 点击停止操作
  1756. */
  1757. private fun stopClick(tips: Boolean = true) {
  1758. userChanging = false
  1759. //中途系统出现故障记录
  1760. isClickType = 0
  1761. //结束
  1762. CofarSDK.stop(tips)
  1763. try {
  1764. FloatWindowManager.hideStepFlowWindow()
  1765. } catch (e: Exception) {
  1766. print(e)
  1767. }
  1768. }
  1769. /**
  1770. * 点击暂停操作
  1771. */
  1772. private fun pauseClick() {
  1773. userChanging = false
  1774. isClickType = 2
  1775. CofarSDK.pause()
  1776. }
  1777. /**
  1778. * 点击称重操作
  1779. */
  1780. private fun weightClick() {
  1781. // CofarSDK.stop(false)
  1782. whereIndex = -1
  1783. binding.clSetTime.stopAlphaAnim()
  1784. modeChange = true
  1785. viewModel.modeType = ModesType.WIGHT.name
  1786. modeType = viewModel.modeType
  1787. initModeData(viewModel.modeType)
  1788. viewModel.changeStep(CookSettingType.WEIGHT)
  1789. binding.ivTurbo.visibility = View.GONE
  1790. visibilityEgg(View.GONE)
  1791. binding.ivTurbo.visibility = View.INVISIBLE
  1792. binding.ivPotCover.setGone()
  1793. binding.tvCount.setGone()
  1794. isWidget = false
  1795. binding.ivWeight.visibility = View.INVISIBLE
  1796. binding.tvModeName.text = viewModel.getModeTitle(resources)
  1797. }
  1798. /**
  1799. * 点击turbo操作
  1800. */
  1801. private fun turboClick() {
  1802. binding.ivPotCover.setGone()
  1803. binding.tvCount.setGone()
  1804. CofarSDK.stop(false)
  1805. whereIndex = -1
  1806. binding.clSetTime.stopAlphaAnim()
  1807. modeChange = true
  1808. viewModel.modeType = ModesType.TURBO.name
  1809. modeType = viewModel.modeType
  1810. initModeData(viewModel.modeType)
  1811. viewModel.changeStep(CookSettingType.TURBO)
  1812. binding.tvModeName.text = viewModel.getModeTitle(resources)
  1813. binding.ivTurbo.visibility = View.GONE
  1814. visibilityEgg(View.GONE)
  1815. isWidget = false
  1816. binding.ivWeight.visibility = View.INVISIBLE
  1817. Log.d("dddddd", "llTurboView===VISIBLE")
  1818. binding.llTurboView.visibility = View.VISIBLE
  1819. }
  1820. /**
  1821. * 点击称重清0操作
  1822. */
  1823. private fun weightClearClick() {
  1824. //称重清0
  1825. userChanging = false
  1826. CofarSDK.clearWeight()
  1827. }
  1828. /**
  1829. * 点击返回按钮操作
  1830. */
  1831. private fun backClick() {
  1832. if (modeChange) {
  1833. if (modeType == ModesType.TURBO.name) { //TURBO未停止之前不能退出
  1834. CofarSDK.stop(false)
  1835. if (DevStatus.STOP != CofarSDK.devInfo().status.toByte()) {
  1836. return
  1837. }
  1838. //先注释掉,忘记有什么用了
  1839. // turboLock = true
  1840. // ThreadUtils.runOnMainThread({turboLock = false},2000);
  1841. }
  1842. ThreadUtils.runOnMainThread {
  1843. var cm = viewModel.modeType;
  1844. modeType = viewModel.lastModeType
  1845. viewModel.modeType = viewModel.lastModeType
  1846. //binding.tvModeName.text = viewModel.getModeTitle(resources)
  1847. var workMode = ConfigUtils.getMode(modeType)
  1848. if (!isNightTheme()) {
  1849. if (workMode == null) {
  1850. Glide.with(this).load(com.develop.common.R.drawable.ic_mode_diy)
  1851. .into(binding.ivBanner)
  1852. } else {
  1853. Glide.with(this).load(
  1854. resources.getIdentifier(
  1855. workMode.bg,
  1856. "drawable",
  1857. this.packageName
  1858. )
  1859. )
  1860. .into(binding.ivBanner)
  1861. }
  1862. }
  1863. binding.tvModeName.text =
  1864. getString(resources.getIdentifier(workMode?.name, "string", this.packageName))
  1865. modeChange = false
  1866. Log.d("dddddd", "llTurboView===GONE")
  1867. binding.llTurboView.visibility = View.GONE
  1868. initModeData(modeType, cm == ModesType.WIGHT.name || cm == ModesType.TURBO.name)
  1869. changeCommonStep()
  1870. }
  1871. } else if (mRunningState != 0 && viewModel.modeType != ModesType.WIGHT.name && viewModel.modeType != ModesType.TURBO.name) {
  1872. if (CofarSDK.devInfo().runningInstId == viewModel.modeType) backRequestDialog.showDialog(
  1873. supportFragmentManager, "backRequestDialog"
  1874. )
  1875. else {
  1876. CofarSDK.stoptWeight()
  1877. finish()
  1878. }
  1879. } else {
  1880. CofarSDK.stoptWeight()
  1881. finish()
  1882. }
  1883. }
  1884. /**
  1885. * 旋转温度事件
  1886. */
  1887. private fun tempRingEvent(progress: Int) {
  1888. userChanging = true
  1889. binding.tempRingText.text = "${progress}°C"
  1890. binding.clCookTemp.setConfigValue("--${progress}°C--")
  1891. CofarSDK.cfgHeat(progress.toShort(), HeatModes.PU_TONG);
  1892. showConfirmAndCancelBtn()
  1893. }
  1894. private fun waterGearSpeedEvent(progress: Int) {
  1895. userChanging = true
  1896. CofarSDK.cfgWaterBear(progress);
  1897. showConfirmAndCancelBtn()
  1898. }
  1899. /**
  1900. * 旋转电机转速事件
  1901. */
  1902. private fun motorGearSpeedEvent(progress: Int) {
  1903. userChanging = true
  1904. binding.speedRingText.text = "$progress"
  1905. CofarSDK.cfgMotorGear(progress.toByte());
  1906. showConfirmAndCancelBtn()
  1907. }
  1908. /**
  1909. * 点击电机方向事件
  1910. */
  1911. private fun motorGearDirectionClick(direction: DirectionView.Direction) {
  1912. if (isMotorDirectionGearChange) {
  1913. userChanging = true
  1914. binding.clCookDirection.updateChangeValue(
  1915. viewModel.getDirectionStr(
  1916. direction == DirectionView.Direction.LEFT, resources
  1917. )
  1918. )
  1919. binding.flDirection.updateDirectionView(
  1920. if (direction == DirectionView.Direction.LEFT) DirectionView.Direction.LEFT
  1921. else DirectionView.Direction.RIGHT
  1922. )
  1923. if (direction != DirectionView.Direction.RIGHT) {
  1924. CofarSDK.cfgMotorDirection(MotorDirections.REVERSE);
  1925. updateMotorDirectionUI(MotorDirections.REVERSE.toInt(), true);
  1926. } else {
  1927. CofarSDK.cfgMotorDirection(MotorDirections.FORWARD);
  1928. updateMotorDirectionUI(MotorDirections.FORWARD.toInt(), true);
  1929. }
  1930. showConfirmAndCancelBtn()
  1931. }
  1932. }
  1933. /**
  1934. * 滑动时间事件
  1935. */
  1936. private fun rollTimeEvent(
  1937. hours: Int, minute: Int, second: Int, time: String, setByUser: Boolean, type: String
  1938. ) {
  1939. if (setByUser) {
  1940. userChanging = true
  1941. binding.clCookTime.setConfigValue("--${time}--")
  1942. CofarSDK.cfgTime((second + (minute + hours * 60) * 60))
  1943. showConfirmAndCancelBtn()
  1944. }
  1945. }
  1946. /**
  1947. * turbo按下事件
  1948. */
  1949. private fun turboDownEvent() {
  1950. binding.ivTurboView.src = com.develop.common.R.drawable.ic_turbo_selected
  1951. viewModel.startTurbo()
  1952. }
  1953. /**
  1954. * turbo离开事件
  1955. */
  1956. private fun turboUpEvent() {
  1957. binding.ivTurboView.src = com.develop.common.R.drawable.ic_turbo_unselected
  1958. viewModel.stopTurbo()
  1959. }
  1960. private fun setEggTime(size: Int, hardness: Int) {
  1961. var time: Int = 0
  1962. when (size) {
  1963. 1 -> {//小
  1964. when (hardness) {
  1965. 1 -> {//软
  1966. time = 6 * 60
  1967. }
  1968. 2 -> {//中
  1969. time = 9 * 60
  1970. }
  1971. 3 -> {//硬
  1972. time = 13 * 60
  1973. }
  1974. else -> {
  1975. time = 0
  1976. }
  1977. }
  1978. }
  1979. 2 -> {//中
  1980. when (hardness) {
  1981. 1 -> {//软
  1982. time = 7 * 60
  1983. }
  1984. 2 -> {//中
  1985. time = 10 * 60
  1986. }
  1987. 3 -> {//硬
  1988. time = 14 * 60
  1989. }
  1990. else -> {
  1991. time = 0
  1992. }
  1993. }
  1994. }
  1995. 3 -> {//大
  1996. when (hardness) {
  1997. 1 -> {//软
  1998. time = 8 * 60
  1999. }
  2000. 2 -> {//中
  2001. time = 11 * 60
  2002. }
  2003. 3 -> {//硬
  2004. time = 15 * 60
  2005. }
  2006. else -> {
  2007. time = 0
  2008. }
  2009. }
  2010. }
  2011. else -> {
  2012. time = 0
  2013. }
  2014. }
  2015. if (time == 0) {
  2016. return
  2017. }
  2018. //确认
  2019. userChanging = false
  2020. CofarSDK.cfgMotorGear(1)
  2021. CofarSDK.cfgTime(time)
  2022. CofarSDK.confirm()
  2023. }
  2024. private fun visibilityEgg(visibility: Int) {
  2025. //2023.12.11 000A客户,鸡蛋程序还未完整,需隐藏
  2026. if ("COOK_EGGS" == viewModel.modeType) {
  2027. binding.ivEggs.visibility = visibility
  2028. //由于鸡蛋SDK默认时间只有20秒,需要自己另行设置
  2029. CofarSDK.devInfo().mode.maxTime = 20 * 60
  2030. } else {
  2031. binding.ivEggs.visibility = View.GONE
  2032. }
  2033. }
  2034. private fun showErrCodeDialog(code: Int) {
  2035. var errCodeStr = ConfigUtils.getErrCodeStr(this, code)
  2036. if (errCodeStr.isNullOrEmpty() || lastMsg == "e" + code + "_errCode") {
  2037. return
  2038. }
  2039. lastMsg = "e" + code + "_errCode"
  2040. deviceStateDialog.showCancel = false
  2041. deviceStateDialog.showConfirm = true
  2042. deviceStateDialog.confirmStr = getString(com.develop.common.R.string.confirm)
  2043. deviceStateDialog.title = errCodeStr
  2044. deviceStateDialog.showDialog(supportFragmentManager, "errCodeCancelDialog")
  2045. deviceStateDialog.onDialogClickListener =
  2046. object : CancelConfirmDialog.OnDialogClickListener {
  2047. override fun onConfirm() {
  2048. deviceStateDialog.removeSelf();
  2049. // lastMsg = "";
  2050. }
  2051. override fun onCancel() {
  2052. deviceStateDialog.removeSelf();
  2053. // lastMsg = "";
  2054. }
  2055. }
  2056. }
  2057. private fun showErrMsgDialog(msg: String) {
  2058. if (lastMsg == msg) {
  2059. return
  2060. }
  2061. lastMsg = msg
  2062. deviceStateDialog.showCancel = false
  2063. deviceStateDialog.showConfirm = true
  2064. deviceStateDialog.confirmStr = getString(com.develop.common.R.string.confirm)
  2065. deviceStateDialog.title = resources.getString(
  2066. resources.getIdentifier(
  2067. lastMsg, "string", this.packageName
  2068. )
  2069. )
  2070. deviceStateDialog.showDialog(supportFragmentManager, "errCodeCancelDialog")
  2071. deviceStateDialog.onDialogClickListener =
  2072. object : CancelConfirmDialog.OnDialogClickListener {
  2073. override fun onConfirm() {
  2074. deviceStateDialog.removeSelf();
  2075. lastMsg = "";
  2076. }
  2077. override fun onCancel() {
  2078. deviceStateDialog.removeSelf();
  2079. lastMsg = "";
  2080. }
  2081. }
  2082. }
  2083. //当换锅的时候,需要做的逻辑
  2084. @Subscribe
  2085. fun onDevModeChange(event: DevCommonEvent) {
  2086. //在当前页面,换了模式以后 重新启动
  2087. if (CommonEventTypes.DEV_MODE_CHANGE == event.type) {
  2088. //针对DIY处理
  2089. if (workMode?.devMode != CofarSDK.devInfo().devMode && (lastModeType == WorkModes.ADAPTED_COOKING || lastModeType == WorkModes.AF_DIY)) {
  2090. // isWidget = false
  2091. // viewModel.stopTurbo()
  2092. // viewModel.cancelAnimator()
  2093. // hasShowScreenSaver = false
  2094. navigateTo(Screens.Cook.COOK_MODES) {
  2095. if (DevModes.SOUP == CofarSDK.devInfo().devMode) {
  2096. val bundle = Bundle()
  2097. bundle.putString(MODE_TYPE, WorkModes.ADAPTED_COOKING)
  2098. bundle.putString(
  2099. "mode_name",
  2100. resources.getString(com.develop.common.R.string.adapted_cooking)
  2101. )
  2102. with(bundle)
  2103. } else {
  2104. val bundle = Bundle()
  2105. bundle.putString(MODE_TYPE, WorkModes.AF_DIY)
  2106. with(bundle)
  2107. }
  2108. }
  2109. finish()
  2110. } else {
  2111. //称重留在当前页面
  2112. if (workMode?.devMode == CofarSDK.devInfo().devMode || workMode?.type == "WIGHT") {
  2113. return
  2114. } else {
  2115. finish()
  2116. }
  2117. }
  2118. }
  2119. }
  2120. }