AboutActivity.kt 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. package com.develop.setting.ui
  2. import android.app.Activity
  3. import android.app.PendingIntent
  4. import android.content.*
  5. import android.content.pm.PackageInstaller
  6. import android.content.pm.PackageManager
  7. import android.net.Uri
  8. import android.os.Build
  9. import android.os.Bundle
  10. import android.os.ResultReceiver
  11. import android.provider.Settings
  12. import android.util.Log
  13. import android.view.LayoutInflater
  14. import android.view.View
  15. import android.widget.LinearLayout
  16. import android.widget.Toast
  17. import android.widget.RelativeLayout
  18. import androidx.core.content.FileProvider
  19. import com.alibaba.android.arouter.facade.annotation.Route
  20. import com.azhon.appupdate.listener.OnDownloadListener
  21. import com.blankj.utilcode.util.AppUtils
  22. import com.develop.base.R
  23. import com.develop.base.ext.dimenRes
  24. import com.develop.base.ext.getSN
  25. import com.develop.base.ext.isBrand036I
  26. import com.develop.base.ext.isNightTheme
  27. import com.develop.base.ext.setVisible
  28. import com.develop.base.ext.updateText
  29. import com.develop.base.util.GlobalToast
  30. import com.develop.common.dialog.CancelConfirmDialog
  31. import com.develop.common.dialog.CommonDialog
  32. import com.develop.common.dialog.PwdDialog
  33. import com.develop.common.dialog.RecipeUpdateDialog
  34. import com.develop.common.food_sdk.GlobalDevEvent
  35. import com.develop.common.router.Screens
  36. import com.develop.common.ui.CommonBVMActivity
  37. import com.develop.common.utils.AppVersionUtil
  38. import com.develop.common.utils.UpdateUtil
  39. import com.develop.setting.databinding.ActivityAboutBinding
  40. import com.develop.setting.ui.viewmodel.AboutViewModel
  41. import com.kuyuntech.cofarcooking.device.sdk.constant.core.DevStatus
  42. import com.kuyuntech.cofarcooking.device.sdk.eventbus.event.DevStatusEvent
  43. import com.kuyuntech.cofarcooking.device.sdk.util.core.CofarSDK
  44. import org.greenrobot.eventbus.Subscribe
  45. import java.io.*
  46. import java.nio.charset.Charset
  47. @Route(path = Screens.Setting.ABOUT)
  48. class AboutActivity : CommonBVMActivity<ActivityAboutBinding, AboutViewModel>() {
  49. override fun createViewBinding(inflater: LayoutInflater): ActivityAboutBinding {
  50. return ActivityAboutBinding.inflate(layoutInflater)
  51. }
  52. override fun createViewModel(): AboutViewModel {
  53. return getViewModel(AboutViewModel::class.java)
  54. }
  55. private var updateApkUrl = ""
  56. private var weightAlignCount = 0
  57. private var adbCount = 0
  58. private var testCount = 0
  59. private var tpCount = 0
  60. private val cancelConfirmDialog by lazy {
  61. CancelConfirmDialog()
  62. }
  63. private val commonDialog by lazy {
  64. CommonDialog()
  65. }
  66. private val recipeUpdateDialog by lazy {
  67. RecipeUpdateDialog()
  68. }
  69. @Subscribe
  70. fun onDevStateEvent(event: DevStatusEvent) {
  71. GlobalDevEvent.globalWeightEvent(event)
  72. }
  73. override fun onCreate(savedInstanceState: Bundle?) {
  74. super.onCreate(savedInstanceState)
  75. val ivLogoParam = binding.ivLogo.layoutParams as RelativeLayout.LayoutParams
  76. val ivUpdateParam = binding.icUpdate.layoutParams as LinearLayout.LayoutParams
  77. binding.ivClose.setVisible()
  78. binding.ivClose.setImageResource( com.develop.common.R.drawable.ic_close)
  79. //muc 过长展示需要成mcu
  80. if (binding.tvAboutMcu.text.length>10){
  81. binding.tvAboutMcu.text = "MCU"
  82. }
  83. if (isNightTheme() || isBrand036I()) {
  84. ivLogoParam.apply {
  85. width = dimenRes(com.develop.common.R.dimen.convert_321px)
  86. height = dimenRes(com.develop.common.R.dimen.convert_95px)
  87. marginStart = dimenRes(com.develop.common.R.dimen.convert_135px)
  88. }
  89. if (isBrand036I()) {
  90. binding.ivLogo.setBackgroundResource(com.develop.common.R.drawable.ic_logo_036i)
  91. }
  92. ivUpdateParam.apply {
  93. width = dimenRes(com.develop.common.R.dimen.convert_66px)
  94. height = dimenRes(com.develop.common.R.dimen.convert_66px)
  95. }
  96. binding.tvAppName.visibility = View.INVISIBLE
  97. } else {
  98. binding.tvAppName.visibility = View.VISIBLE
  99. ivLogoParam.apply {
  100. width = dimenRes(com.develop.common.R.dimen.convert_180px)
  101. height = dimenRes(com.develop.common.R.dimen.convert_180px)
  102. marginStart = dimenRes(com.develop.common.R.dimen.convert_156px)
  103. }
  104. ivUpdateParam.apply {
  105. width = dimenRes(com.develop.common.R.dimen.convert_36px)
  106. height = dimenRes(com.develop.common.R.dimen.convert_47px)
  107. }
  108. }
  109. binding.ivLogo.layoutParams = ivLogoParam
  110. binding.icUpdate.layoutParams = ivUpdateParam
  111. binding.tvTitle.updateText(getString(com.develop.common.R.string.About))
  112. binding.ivClose.setOnClickListener {
  113. finish()
  114. }
  115. binding.devSn.text = getSN()
  116. CofarSDK.devInfo().let {
  117. binding.tvMcuVersion.text =
  118. (it.manufacturer.toString() + "P" + it.haradware.toString() + "S" + it.software.toString())
  119. }
  120. binding.tvFirmware.text = Build.DISPLAY
  121. binding.model.text = if (isBrand036I()){
  122. "2106"
  123. } else {
  124. getSN().substring(4, 8)
  125. }
  126. recipeUpdateDialog.onDialogClickListener =
  127. object : RecipeUpdateDialog.OnDialogClickListener {
  128. override fun onConfirm() {
  129. }
  130. override fun onCancel() {
  131. }
  132. }
  133. //点击食谱更新
  134. binding.updateRecipes.setOnClickListener {
  135. AppVersionUtil.checkRecipeUpdate(true)
  136. }
  137. binding.updateFirmware.setOnClickListener {
  138. val packageName = "com.abupdate.fota_demo_iot"
  139. val intent = packageManager.getLaunchIntentForPackage(packageName)
  140. if (intent != null) {
  141. // 存在可以处理的应用程序
  142. // 启动应用程序
  143. startActivity(intent)
  144. } else {
  145. // 未找到指定包名的应用程序
  146. }
  147. }
  148. binding.updateApk.setOnClickListener {
  149. }
  150. binding.ivLogo.setOnClickListener {
  151. weightAlignCount++
  152. if (weightAlignCount >= 7) {
  153. weightAlignCount = 0
  154. //2023年06月29日14:16:18 处理密码弹出
  155. val pwdDialog = PwdDialog()
  156. pwdDialog.title = getString(com.develop.common.R.string.password)
  157. pwdDialog.showDialog(supportFragmentManager, "pwdDialog")
  158. pwdDialog.onDialogClickListener = object : PwdDialog.OnDialogClickListener {
  159. override fun onConfirm(pwd: String) {
  160. if ("12345678".equals(pwd)) {
  161. pwdDialog.removeSelf()
  162. cancelConfirmDialog.title =
  163. getString(com.develop.common.R.string.change_lang_tips)
  164. cancelConfirmDialog.showCancel = false
  165. cancelConfirmDialog.onDialogClickListener =
  166. object : CancelConfirmDialog.OnDialogClickListener {
  167. override fun onConfirm() {
  168. }
  169. override fun onCancel() {
  170. }
  171. }
  172. if (CofarSDK.devInfo().runningStatus == DevStatus.RUNNING) {
  173. cancelConfirmDialog.showDialog(supportFragmentManager, "confirm")
  174. } else {
  175. //进入称重标定模式
  176. CofarSDK.startWeightAlign()
  177. GlobalDevEvent.weight = true
  178. }
  179. } else {
  180. GlobalToast.showToast(getString(com.develop.common.R.string.password_uncorrect))
  181. }
  182. }
  183. override fun onCancel() {
  184. }
  185. }
  186. }
  187. }
  188. commonDialog.msg = getString(com.develop.common.R.string.update_msg)
  189. commonDialog.title = getString(com.develop.common.R.string.update)
  190. commonDialog.hasOKBtn = false
  191. cancelConfirmDialog.title = getString(com.develop.common.R.string.update_title)
  192. val ctx = this;
  193. cancelConfirmDialog.onDialogClickListener =
  194. object : CancelConfirmDialog.OnDialogClickListener {
  195. override fun onConfirm() {
  196. commonDialog.showDialog(supportFragmentManager, "commonDialog")
  197. UpdateUtil.updateApp(
  198. this@AboutActivity,
  199. updateApkUrl,
  200. object : OnDownloadListener {
  201. override fun cancel() {
  202. runOnUiThread {
  203. commonDialog.removeSelf()
  204. }
  205. }
  206. override fun done(apk: File) {
  207. GlobalToast.showToast(getString(com.develop.common.R.string.finish_download))
  208. installPackage(ctx, apk)
  209. // runOnUiThread {
  210. // commonDialog.removeSelf()
  211. // }
  212. commonDialog.updateProgress(getString(com.develop.common.R.string.installing))
  213. }
  214. override fun downloading(max: Int, progress: Int) {
  215. runOnUiThread {
  216. commonDialog.updateProgress(
  217. "${
  218. String.format(
  219. "%.0f",
  220. ((progress.toFloat() / max.toFloat()) * 100f)
  221. )
  222. }%"
  223. )
  224. }
  225. }
  226. override fun error(e: Throwable) {
  227. GlobalToast.showToast(getString(com.develop.common.R.string.download_fail))
  228. runOnUiThread {
  229. commonDialog.removeSelf()
  230. }
  231. }
  232. override fun start() {
  233. // GlobalToast.showToast(getString(com.develop.common.R.string.start_download))
  234. }
  235. })
  236. }
  237. override fun onCancel() {
  238. }
  239. }
  240. binding.updateApk.setOnClickListener {
  241. UpdateUtil.checkApkVersion()
  242. }
  243. binding.tvAppVersion.setOnClickListener {
  244. adbCount++
  245. if (adbCount >= 7) {
  246. adbCount = 0
  247. val ctx = this
  248. //2023年06月29日14:16:18 处理密码弹出
  249. val pwdDialog = PwdDialog()
  250. pwdDialog.title = getString(com.develop.common.R.string.password)
  251. pwdDialog.showDialog(supportFragmentManager, "pwdDialog")
  252. pwdDialog.onDialogClickListener = object : PwdDialog.OnDialogClickListener {
  253. override fun onConfirm(pwd: String) {
  254. if ("12345678".equals(pwd)) {
  255. if (isAdbDebuggingEnabled(ctx)) {
  256. Toast.makeText(ctx, "adb disable", Toast.LENGTH_SHORT).show()
  257. toggleAdbDebugging(ctx, false)
  258. } else {
  259. Toast.makeText(ctx, "adb enable", Toast.LENGTH_SHORT).show()
  260. toggleAdbDebugging(ctx, true)
  261. }
  262. } else {
  263. GlobalToast.showToast(getString(com.develop.common.R.string.password_uncorrect))
  264. }
  265. }
  266. override fun onCancel() {
  267. }
  268. }
  269. }
  270. }
  271. binding.tvFirmware.setOnClickListener {
  272. tpCount++
  273. if (tpCount >= 7) {
  274. tpCount = 0
  275. val ctx = this
  276. //2023年06月29日14:16:18 处理密码弹出
  277. val pwdDialog = PwdDialog()
  278. pwdDialog.title = getString(com.develop.common.R.string.password)
  279. pwdDialog.showDialog(supportFragmentManager, "pwdDialog")
  280. pwdDialog.onDialogClickListener = object : PwdDialog.OnDialogClickListener {
  281. override fun onConfirm(pwd: String) {
  282. if ("12345678".equals(pwd)) {
  283. togglePointerLocation(ctx)
  284. } else {
  285. GlobalToast.showToast(getString(com.develop.common.R.string.password_uncorrect))
  286. }
  287. }
  288. override fun onCancel() {
  289. }
  290. }
  291. }
  292. }
  293. binding.devSn.setOnClickListener {
  294. testCount++
  295. if (testCount >= 7) {
  296. testCount = 0
  297. //2023年06月29日14:16:18 处理密码弹出
  298. val pwdDialog = PwdDialog()
  299. pwdDialog.title = getString(com.develop.common.R.string.password)
  300. pwdDialog.showDialog(supportFragmentManager, "pwdDialog")
  301. pwdDialog.onDialogClickListener = object : PwdDialog.OnDialogClickListener {
  302. override fun onConfirm(pwd: String) {
  303. if ("12345678".equals(pwd)) {
  304. // 创建启动目标活动的Intent
  305. val intent = Intent()
  306. intent.component = ComponentName(
  307. "com.zavier.androidrk3326functiontest",
  308. "com.zavier.androidrk3326functiontest.MainFunctionActivity"
  309. )
  310. // 启动目标活动
  311. startActivity(intent)
  312. } else {
  313. GlobalToast.showToast(getString(com.develop.common.R.string.password_uncorrect))
  314. }
  315. }
  316. override fun onCancel() {
  317. }
  318. }
  319. }
  320. }
  321. binding.tvAppName.text = "FoodCooking_Android"
  322. binding.tvAppVersion.text = "v${AppUtils.getAppVersionName()}"
  323. viewModel.devInfoLiveData.observe(this) {
  324. updateApkUrl = it?.apkUrl ?: ""
  325. if (it?.apkUpdate == true) {
  326. // binding.tvUpdate.visibility = View.VISIBLE
  327. binding.updateApk.performClick()
  328. } else {
  329. binding.tvUpdate.visibility = View.INVISIBLE
  330. }
  331. binding.updateApk.visibility = View.VISIBLE
  332. binding.updateFirmware.visibility = View.VISIBLE
  333. }
  334. viewModel.errorCallBack.observe(this) {
  335. GlobalToast.showToast(getString(com.develop.common.R.string.no_net_error))
  336. }
  337. }
  338. fun installPackage(context: Context, apk: File) {
  339. try {
  340. val packageInstaller = context.packageManager.packageInstaller
  341. val params =
  342. PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
  343. val sessionId = packageInstaller.createSession(params)
  344. val session = packageInstaller.openSession(sessionId)
  345. addApkToSession(apk, session)
  346. val intent = Intent(context, InstallResultReceiver::class.java)
  347. val pendingIntent =
  348. PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
  349. session.commit(pendingIntent.intentSender)
  350. session.close()
  351. } catch (e: Exception) {
  352. e.printStackTrace()
  353. }
  354. }
  355. private fun addApkToSession(file: File, session: PackageInstaller.Session) {
  356. file.inputStream().use { inputStream ->
  357. session.openWrite("COSU", 0, -1).use { outputStream ->
  358. val buffer = ByteArray(4096)
  359. var length: Int
  360. while (inputStream.read(buffer).also { length = it } != -1) {
  361. outputStream.write(buffer, 0, length)
  362. }
  363. }
  364. }
  365. }
  366. class InstallResultReceiver : BroadcastReceiver() {
  367. override fun onReceive(context: Context, intent: Intent) {
  368. val extras: Bundle? = intent.extras
  369. if (extras != null) {
  370. val status = extras.getInt(PackageInstaller.EXTRA_STATUS)
  371. // 处理安装结果
  372. // status 是安装结果代码
  373. // 可以使用PackageInstaller.Session的常量来解释结果
  374. val message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE)
  375. // 如果需要,可以获取附加的结果信息
  376. }
  377. }
  378. }
  379. fun togglePointerLocation(context: Context) {
  380. val currentSetting = Settings.System.getInt(context.contentResolver, "pointer_location", 0)
  381. val newSetting = if (currentSetting == 0) 1 else 0
  382. Settings.System.putInt(context.contentResolver, "pointer_location", newSetting)
  383. }
  384. fun toggleAdbDebugging(context: Context, enable: Boolean) {
  385. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
  386. Settings.Secure.putInt(
  387. context.contentResolver,
  388. Settings.Global.ADB_ENABLED,
  389. if (enable) 1 else 0
  390. )
  391. } else {
  392. Settings.Secure.putInt(
  393. context.contentResolver,
  394. Settings.Secure.ADB_ENABLED,
  395. if (enable) 1 else 0
  396. )
  397. }
  398. }
  399. fun isAdbDebuggingEnabled(context: Context): Boolean {
  400. return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
  401. Settings.Secure.getInt(
  402. context.contentResolver,
  403. Settings.Global.ADB_ENABLED,
  404. 0
  405. ) != 0
  406. } else {
  407. Settings.Secure.getInt(
  408. context.contentResolver,
  409. Settings.Secure.ADB_ENABLED,
  410. 0
  411. ) != 0
  412. }
  413. }
  414. override fun onResume() {
  415. super.onResume()
  416. viewModel.getDevInfo()
  417. }
  418. override fun onDestroy() {
  419. super.onDestroy()
  420. commonDialog.removeSelf()
  421. cancelConfirmDialog.removeSelf()
  422. }
  423. }