SettingMainActivity.kt 20 KB

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