SettingMainActivity.kt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. package com.develop.setting.ui
  2. import android.annotation.SuppressLint
  3. import android.content.Intent
  4. import android.graphics.Rect
  5. import android.net.NetworkInfo
  6. import android.os.Bundle
  7. import android.os.CountDownTimer
  8. import android.os.Handler
  9. import android.util.Log
  10. import android.view.LayoutInflater
  11. import android.view.View
  12. import android.widget.ImageView
  13. import androidx.appcompat.widget.AppCompatTextView
  14. import androidx.recyclerview.widget.RecyclerView
  15. import com.alibaba.android.arouter.facade.annotation.Route
  16. import com.blankj.utilcode.util.ToastUtils
  17. import com.develop.base.ext.getCobotmix
  18. import com.develop.base.ext.getGoneLogin
  19. import com.develop.base.ext.getGoneTuYa
  20. import com.develop.base.ext.getSN
  21. import com.develop.base.ext.navigateTo
  22. import com.develop.base.ext.resId2Dimension
  23. import com.develop.base.ext.setVisible
  24. import com.develop.base.ext.src
  25. import com.develop.base.ext.updateText
  26. import com.develop.base.manager.WifiHelp
  27. import com.develop.base.util.FileKit
  28. import com.develop.base.util.MMkvUtils
  29. import com.develop.base.util.TopResumedAtyHolder
  30. import com.develop.common.data_repo.db.DataFactory
  31. import com.develop.common.data_repo.db.SettingModel
  32. import com.develop.common.data_repo.db.SettingType
  33. import com.develop.common.data_repo.net.Api
  34. import com.develop.common.data_repo.net.model.request.DeviceInfoBody
  35. import com.develop.common.data_repo.net.model.response.DevInfoResult
  36. import com.develop.common.dialog.CancelConfirmImageDialog
  37. import com.develop.common.dialog.PotCoverUnlockedDialog
  38. import com.develop.common.dialog.TuyaLoadingDialog
  39. import com.develop.common.dialog.TuyaRequestDialog
  40. import com.develop.common.router.Screens
  41. import com.develop.common.tag.ISTUYA
  42. import com.develop.common.tag.LANGUAGE_FROM_SETTING
  43. import com.develop.common.tag.WIFI_FROM_MAIN_SETTING
  44. import com.develop.common.ui.CommonBindingActivity
  45. import com.develop.common.utils.ConfigUtils
  46. import com.develop.common.utils.TuyaUtils
  47. import com.develop.setting.R
  48. import com.develop.setting.databinding.ActivitySettingMainBinding
  49. import com.drake.brv.utils.bindingAdapter
  50. import com.drake.brv.utils.grid
  51. import com.drake.brv.utils.models
  52. import com.drake.brv.utils.setup
  53. import com.drake.net.Post
  54. import com.drake.net.utils.scopeNetLife
  55. import com.google.gson.Gson
  56. import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevStatus
  57. import com.kuyuntech.cofarcooking.device.sdk.util.core.CofarSDK
  58. @Route(path = Screens.Setting.MAIN_SETTING)
  59. class SettingMainActivity : CommonBindingActivity<ActivitySettingMainBinding>() {
  60. private var dataList = mutableListOf<SettingModel>()
  61. private var isTuya = false
  62. var exitTime: Long = 0 // 退出时间
  63. private var onIsResume = true
  64. private var isNetwork = false
  65. private var sn = getSN()
  66. private var isNetWordLoading = false
  67. private val tuyaLoadingDialog = TuyaLoadingDialog()
  68. private var tuyaRequestDialog: TuyaRequestDialog? = null
  69. private var timer: CountDownTimer? = null
  70. override fun createViewBinding(inflater: LayoutInflater): ActivitySettingMainBinding {
  71. return ActivitySettingMainBinding.inflate(layoutInflater)
  72. }
  73. ///sn.startsWith("032D") || sn.startsWith("011A") || sn.startsWith("030A")|| sn.startsWith("010F")
  74. override fun onCreate(savedInstanceState: Bundle?) {
  75. super.onCreate(savedInstanceState)
  76. var ctx = this
  77. isTuya = MMkvUtils.getBool(ISTUYA, false)
  78. tuyaRequestDialog = TuyaRequestDialog()
  79. tuyaRequestDialog?.onDialogClickListener =
  80. object : TuyaRequestDialog.OnDialogClickListener {
  81. override fun onCancel() {
  82. tuyaRequestDialog?.stopImageLoading()
  83. tuyaRequestDialog?.removeSelf()
  84. }
  85. }
  86. // dataList = if (getSN().startsWith("010D")) {
  87. // DataFactory.genSetting010DModesList(resources)
  88. // } else if (getGoneLogin()) {
  89. // DataFactory.genSetting032DModesList(resources)
  90. // } else {
  91. // DataFactory.genSettingModesList(resources)
  92. // }
  93. /**
  94. * 需要隐藏登录 032D 032E 011A 030A 010F 033
  95. * 需要隐藏涂鸦 010D 010F 032D 033 011A 036I 058A 058B
  96. * 需要隐藏亮度 010D
  97. *
  98. * ps:修改了的话,记得同步下面tuya代码
  99. * 也要修改GlobaExt 中的 getGoneTuYa
  100. *
  101. * 由于011 食谱调试需要把涂鸦不隐藏
  102. *
  103. * */
  104. dataList.clear()
  105. dataList = if (sn.startsWith("010D")) {
  106. DataFactory.genSetting010DModesList(resources)
  107. } else if (sn.startsWith("032D") || sn.startsWith("010F") || sn.startsWith("033")) {
  108. DataFactory.genSetting032DModesList(resources)
  109. } else if (sn.startsWith("011")) {
  110. DataFactory.genSetting011AModesList(resources)
  111. // DataFactory.genSetting030AModesList(resources)
  112. } else if (sn.startsWith("030A")||sn.startsWith("032E")) {
  113. DataFactory.genSetting030AModesList(resources)
  114. } else if (sn.startsWith("036I")|| sn.startsWith("058A") || sn.startsWith("058B")) {
  115. DataFactory.genSetting036IModesList(resources)
  116. } else {
  117. DataFactory.genSettingModesList(resources)
  118. }
  119. if (!getNetwork()) {
  120. dataList.forEach { settingModel ->
  121. if (settingModel.type == SettingType.TUYA) {
  122. settingModel.resId = com.develop.common.R.drawable.ic_setting_tuya_no
  123. }
  124. }
  125. }
  126. binding.tvTitle.updateText(getString(com.develop.common.R.string.settings))
  127. binding.ivClose.setVisible()
  128. binding.ivClose.setImageResource(com.develop.common.R.drawable.ic_close)
  129. binding.ivClose.setOnClickListener {
  130. finish()
  131. }
  132. binding.mainSettingRecycler.apply {
  133. addItemDecoration(object : RecyclerView.ItemDecoration() {
  134. override fun getItemOffsets(
  135. outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State
  136. ) {
  137. super.getItemOffsets(outRect, view, parent, state)
  138. outRect.top = dp77
  139. }
  140. })
  141. grid(4)
  142. setup {
  143. addType<SettingModel>(R.layout.item_setting_main_view)
  144. onBind {
  145. val model = getModel<SettingModel>()
  146. findView<AppCompatTextView>(R.id.tv_name).updateText(model.name)
  147. findView<ImageView>(R.id.iv_icon).src = model.resId
  148. }
  149. R.id.iv_icon.onClick {
  150. //由于涂鸦的更新,可能会导致 absoluteAdapterPosition是-1 估在这做-1判断
  151. var pos = absoluteAdapterPosition
  152. if (pos == -1) {
  153. return@onClick
  154. }
  155. when (dataList[absoluteAdapterPosition].type) {
  156. SettingType.BRIGHTNESS -> {
  157. navigateTo(Screens.Setting.BRIGHTNESS)
  158. }
  159. SettingType.SOUND -> {
  160. navigateTo(Screens.Setting.SOUND)
  161. }
  162. SettingType.WIFI -> {
  163. navigateTo(Screens.Setting.WIFI, 200) {
  164. val bundle = Bundle()
  165. bundle.putBoolean(WIFI_FROM_MAIN_SETTING, true)
  166. with(bundle)
  167. }
  168. }
  169. SettingType.USER_ACCOUNT -> {
  170. navigateTo(Screens.Auth.MEMBER) {
  171. withBoolean("enter_from_home", true)
  172. }
  173. }
  174. SettingType.LANGUAGE -> {
  175. navigateTo(Screens.Setting.LANGUAGE) {
  176. val bundle = Bundle()
  177. bundle.putBoolean(LANGUAGE_FROM_SETTING, true)
  178. with(bundle)
  179. }
  180. }
  181. SettingType.ABOUT -> {
  182. navigateTo(Screens.Setting.ABOUT)
  183. }
  184. SettingType.RESTORE_FACTORY_SETTINGS -> {
  185. // //isTuya&&TuyaUtils.qrcodeUrl
  186. // showTuyaRequestDialog()
  187. navigateTo(Screens.Setting.RESTORE)
  188. }
  189. SettingType.STORAGE -> {
  190. openFileManager()
  191. }
  192. SettingType.TUYA -> {
  193. Log.e(
  194. "TAG isTuya",
  195. " SettingType.TUYA SettingType.TUYA SettingType.TUYA"
  196. )
  197. if (CofarSDK.devInfo().status !== DevStatus.STOP.toInt()) {
  198. ToastUtils.showShort(getString(com.develop.common.R.string.change_lang_tips))
  199. } else {
  200. if (getNetwork()) {
  201. Log.e(
  202. "TAG isTuya",
  203. "isNetWordLoading :" + isNetWordLoading + " isTuya: " + isTuya + " TuyaUtils.qrcodeUrl:" + TuyaUtils.qrcodeUrl
  204. )
  205. if (isNetWordLoading) {
  206. Log.e("TAG isTuya", "isNetWordLoadingisNetWordLoading")
  207. showTuyaRequestDialog()
  208. } else if (isTuya && TuyaUtils.qrcodeUrl == "") {
  209. Log.e("TAG isTuya", "isTuyaisTuyaisTuyaisTuya")
  210. //由于涂鸦初始化后,有绑定的话重启设备qrcodeUrl是不返回的,估在这在判断TuyaUtils.init
  211. if (TuyaUtils.init) {
  212. startTuya()
  213. } else {
  214. showTuyaRequestDialog()
  215. }
  216. } else if (!isTuya && getCobotmix()) {
  217. showTuyaLoadingDialog()
  218. } else {
  219. Log.e("TAG TUYA", "TUYATUYATUYATUYATUYATUYATUYA")
  220. startTuya()
  221. }
  222. } else {
  223. navigateTo(Screens.Setting.WIFI, 200) {
  224. val bundle = Bundle()
  225. bundle.putBoolean(WIFI_FROM_MAIN_SETTING, true)
  226. with(bundle)
  227. }
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }.models = dataList
  235. }
  236. private fun startTuya() {
  237. navigateTo(Screens.Setting.TUYA)
  238. }
  239. private fun showTuyaLoadingDialog() {
  240. tuyaRequestDialog?.removeSelf()
  241. tuyaLoadingDialog.showDialog(supportFragmentManager, "TuyaLoadingDialog")
  242. tuyaLoadingDialog.onDialogClickListener = object : TuyaLoadingDialog.OnDialogClickListener {
  243. override fun onCancel() {
  244. tuyaLoadingDialog.removeSelf();
  245. }
  246. }
  247. }
  248. private fun showTuyaRequestDialog() {
  249. tuyaRequestDialog?.showDialog(supportFragmentManager, "TuyaRequestDialog")
  250. tuyaRequestDialog?.startImageLoading()
  251. countDownTimer()
  252. }
  253. //倒计时的方式一
  254. fun countDownTimer() {
  255. var num = 20
  256. timer = object : CountDownTimer((num + 1) * 1000L, 1000L) {
  257. override fun onTick(millisUntilFinished: Long) {
  258. // YYLogUtils.w("当时计数:" + num)
  259. Log.e("TAG 当时计数", "当时计数 :" + num)
  260. if (num == 0) {
  261. // YYLogUtils.w("重新开始")
  262. // num = 30
  263. } else {
  264. if (!isNetWordLoading) {
  265. downTimeVoid()
  266. }
  267. num--
  268. }
  269. }
  270. override fun onFinish() {
  271. timer?.let { timers ->
  272. timers.cancel()
  273. }
  274. //超时处理,另外弹tuya第二个框
  275. //处理 loading 没有关闭
  276. showTuyaLoadingDialog()
  277. }
  278. }
  279. timer?.start()
  280. }
  281. private fun downTimeVoid() {
  282. if (isTuya) {
  283. if (TuyaUtils.qrcodeUrl != ""||TuyaUtils.init){
  284. tuyaRequestDialog?.removeSelf()
  285. timer?.let { timer ->
  286. timer.cancel()
  287. }
  288. //跳涂鸦页面
  289. startTuya()
  290. }
  291. } else {
  292. timer?.let { timer ->
  293. timer.cancel()
  294. }
  295. tuyaRequestDialog?.removeSelf()
  296. if (getCobotmix()) {
  297. showTuyaLoadingDialog()
  298. } else {
  299. startTuya()
  300. }
  301. }
  302. }
  303. // 打开文件管理器选择文件
  304. private fun openFileManager() {
  305. // 打开文件管理器选择文件
  306. val intent = Intent(Intent.ACTION_GET_CONTENT)
  307. intent.type = "application/zip"
  308. intent.addCategory(Intent.CATEGORY_OPENABLE)
  309. startActivityForResult(intent, 100)
  310. }
  311. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  312. super.onActivityResult(requestCode, resultCode, data)
  313. if (requestCode == 100) {
  314. data?.data?.apply {
  315. val path = FileKit.getPath(this@SettingMainActivity, this)
  316. }
  317. } else if (requestCode == 200) {
  318. onIsResume = false
  319. //处理WiFi页面回来
  320. getDevNetwork(0)
  321. }
  322. }
  323. private fun getNetwork(): Boolean {
  324. return NetworkInfo.DetailedState.CONNECTED == WifiHelp.Build(this@SettingMainActivity)
  325. .build().getDetailedState()
  326. }
  327. private fun getDevTuya() {
  328. if (getNetwork() && !isTuya) {
  329. tuyaList(0)
  330. }
  331. }
  332. //从wifi功能回来方法
  333. private fun getDevNetwork(num: Int) {
  334. //无需获取涂鸦功能,估不网络请求涂鸦
  335. if (getGoneTuYa()) {
  336. return
  337. }
  338. //处理wifi点击回来
  339. if (getNetwork()) {
  340. /**
  341. * 因为有涂鸦功能不需要重新请求,但是会导致涂鸦图标是灰色
  342. * 估在这做多判断处理
  343. * */
  344. if (isTuya) {
  345. dataList.forEach { settingModel ->
  346. if (settingModel.type == SettingType.TUYA) {
  347. settingModel.resId = com.develop.common.R.drawable.ic_setting_tuya
  348. }
  349. }
  350. binding.mainSettingRecycler.bindingAdapter.notifyDataSetChanged()
  351. }
  352. //连接上wifi就调用涂鸦接口
  353. getDevTuya()
  354. } else {
  355. //没有连接wifi处理轮询
  356. if (num < 10) {
  357. //判断是否有网的时候
  358. var nums = num + 1
  359. Handler().postDelayed({ getDevNetwork(nums) }, 500)
  360. return
  361. }
  362. }
  363. }
  364. //网络不行重连3次涂鸦
  365. fun tuyaList(num: Int) {
  366. //代码重连,3次以后,就获取本地
  367. if (num > 3) {
  368. getAppTuya(true)
  369. return
  370. }
  371. this.apply {
  372. isNetWordLoading = true
  373. scopeNetLife {
  374. val result = Post<DevInfoResult>(Api.DEV_INFO) {
  375. body = DeviceInfoBody.genDeviceInfoBody()
  376. }.await()
  377. getInitTuya(result)
  378. }.catch {
  379. var nums = num + 1
  380. Handler().postDelayed({ tuyaList(nums) }, 1000)
  381. }
  382. }
  383. }
  384. //devinfo 数据回调
  385. fun getInitTuya(result: DevInfoResult) {
  386. // var gson = Gson()
  387. // var json = gson.toJson(result)
  388. if (result.tuyaLicense != null) {
  389. result.tuyaLicense?.let {
  390. TuyaUtils.mAk = it.ak.toString().trim()
  391. TuyaUtils.mPid = it.pid.toString().trim()
  392. TuyaUtils.mUid = it.uuid.toString().trim()
  393. TuyaUtils.initSDK(this@SettingMainActivity, "1.0.0")
  394. isTuya = true
  395. isNetWordLoading = false
  396. //涂鸦存值判断有涂鸦功能
  397. MMkvUtils.save(ISTUYA, true)
  398. tuyaEvent()
  399. }
  400. } else {
  401. getAppTuya(true)
  402. }
  403. }
  404. //获取本地
  405. fun getAppTuya(isCatch: Boolean) {
  406. var tuyaConfig = ConfigUtils.loadTuyaConfig()
  407. if (tuyaConfig != null) {
  408. TuyaUtils.mAk = tuyaConfig.get("ak")
  409. TuyaUtils.mPid = tuyaConfig.get("pid")
  410. TuyaUtils.mUid = tuyaConfig.get("uid")
  411. TuyaUtils.initSDK(this, "1.0.0")
  412. isTuya = true
  413. //涂鸦存值判断有涂鸦功能
  414. MMkvUtils.save(ISTUYA, true)
  415. } else {
  416. isTuya = false
  417. //涂鸦存值判断没有涂鸦功能
  418. MMkvUtils.save(ISTUYA, false)
  419. }
  420. isNetWordLoading = false
  421. tuyaEvent()
  422. }
  423. @SuppressLint("NotifyDataSetChanged")
  424. fun tuyaEvent() {
  425. /**
  426. * 需要隐藏登录 032D 032E 011A 030A 010F 033
  427. * 需要隐藏涂鸦 010D 010F 032D 033 011A 036I 058A 058B
  428. * 需要隐藏亮度 010D
  429. *
  430. * ps:修改了的话,记得同步下面tuya代码
  431. * 也要修改GlobaExt 中的 getGoneTuYa
  432. *
  433. * 由于011 食谱调试需要把涂鸦不隐藏
  434. * */
  435. dataList = if (sn.startsWith("010D")) {
  436. DataFactory.genSetting010DModesList(resources)
  437. } else if (sn.startsWith("032D") || sn.startsWith("010F") || sn.startsWith("033")) {
  438. DataFactory.genSetting032DModesList(resources)
  439. } else if (sn.startsWith("011")) {
  440. // DataFactory.genSetting030AModesList(resources)
  441. DataFactory.genSetting011AModesList(resources)
  442. } else if (sn.startsWith("030A")||sn.startsWith("032E")) {
  443. DataFactory.genSetting030AModesList(resources)
  444. } else if (sn.startsWith("036I")|| sn.startsWith("058A") || sn.startsWith("058B")) {
  445. DataFactory.genSetting036IModesList(resources)
  446. } else {
  447. DataFactory.genSettingModesList(resources)
  448. }
  449. if (!getNetwork()) {
  450. dataList.forEach { settingModel ->
  451. if (settingModel.type == SettingType.TUYA) {
  452. settingModel.resId = com.develop.common.R.drawable.ic_setting_tuya_no
  453. }
  454. }
  455. }
  456. binding.mainSettingRecycler.bindingAdapter._data = dataList
  457. binding.mainSettingRecycler.bindingAdapter.notifyDataSetChanged()
  458. }
  459. override fun onResume() {
  460. super.onResume()
  461. //避免涂鸦功能不出现估做这个判断
  462. /**
  463. * onIsResume 预防 wifi回来重复刷新
  464. * isTuya 没有tuya初始化的时候
  465. * getGoneTuYa 是否需要涂鸦功能
  466. * **/
  467. if (onIsResume && !isTuya && !getGoneTuYa()) {
  468. getDevTuya()
  469. }
  470. }
  471. override fun onPause() {
  472. super.onPause()
  473. //预防wifi点击回来处理
  474. onIsResume = true
  475. }
  476. companion object {
  477. var dp156 = (com.develop.common.R.dimen.convert_156px).resId2Dimension().toInt()
  478. var dp40 = (com.develop.common.R.dimen.convert_40px).resId2Dimension().toInt()
  479. var dp77 = (com.develop.common.R.dimen.convert_77px).resId2Dimension().toInt()
  480. }
  481. }