UpdateUtil.kt 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package com.develop.common.utils
  2. import android.app.Activity
  3. import android.app.PendingIntent
  4. import android.content.BroadcastReceiver
  5. import android.content.Context
  6. import android.content.Intent
  7. import android.content.pm.PackageInstaller
  8. import android.net.Uri
  9. import android.os.Bundle
  10. import android.provider.Settings
  11. import com.azhon.appupdate.base.BaseHttpDownloadManager
  12. import com.azhon.appupdate.base.bean.DownloadStatus
  13. import com.azhon.appupdate.config.Constant
  14. import com.azhon.appupdate.listener.OnDownloadListener
  15. import com.azhon.appupdate.manager.DownloadManager
  16. import com.azhon.appupdate.manager.HttpDownloadManager
  17. import com.azhon.appupdate.util.LogUtil
  18. import com.develop.base.R
  19. import com.develop.base.ext.toJson
  20. import com.develop.base.util.GlobalToast
  21. import com.develop.base.util.TopResumedAtyHolder
  22. import com.develop.common.data_repo.net.Api
  23. import com.develop.common.data_repo.net.model.request.DeviceInfoBody
  24. import com.develop.common.data_repo.net.model.response.DevInfoResult
  25. import com.develop.common.dialog.CancelConfirmDialog
  26. import com.develop.common.dialog.CommonDialog
  27. import com.develop.common.dialog.RecipeUpdateDialog
  28. import com.drake.net.Post
  29. import com.drake.net.utils.scopeNetLife
  30. import kotlinx.coroutines.Dispatchers
  31. import kotlinx.coroutines.flow.*
  32. import okhttp3.OkHttpClient
  33. import okhttp3.Request
  34. import java.io.File
  35. import java.io.FileOutputStream
  36. import java.net.HttpURLConnection
  37. import java.net.SocketTimeoutException
  38. import java.net.URL
  39. import java.security.SecureRandom
  40. import java.security.cert.X509Certificate
  41. import java.util.*
  42. import java.util.concurrent.TimeUnit
  43. import javax.net.ssl.HttpsURLConnection
  44. import javax.net.ssl.SSLContext
  45. import javax.net.ssl.TrustManager
  46. import javax.net.ssl.X509TrustManager
  47. object UpdateUtil {
  48. fun checkApkVersion(showTips:Boolean = true) {
  49. println("TAG 涂鸦 请求了")
  50. TopResumedAtyHolder.getCurrentActivity()?.apply {
  51. scopeNetLife {
  52. try {
  53. val result = Post<DevInfoResult>(Api.DEV_INFO) {
  54. body = DeviceInfoBody.genDeviceInfoBody()
  55. }.await()
  56. println("TAG 涂鸦1 :"+result.toJson())
  57. val ctx = this@apply
  58. if (result.apkUpdate) {
  59. val commonDialog = CommonDialog()
  60. commonDialog.msg = getString(com.develop.common.R.string.update_msg)
  61. commonDialog.title = getString(com.develop.common.R.string.update)
  62. commonDialog.hasOKBtn = false
  63. val cancelConfirmDialog = CancelConfirmDialog()
  64. cancelConfirmDialog.title = getString(com.develop.common.R.string.update_title)
  65. cancelConfirmDialog.showDialog(supportFragmentManager, "cancelConfirmDialog")
  66. cancelConfirmDialog.onDialogClickListener =
  67. object : CancelConfirmDialog.OnDialogClickListener {
  68. override fun onConfirm() {
  69. commonDialog.showDialog(supportFragmentManager, "commonDialog")
  70. updateApp(
  71. ctx,
  72. result.apkUrl,
  73. object : OnDownloadListener {
  74. override fun cancel() {
  75. runOnUiThread {
  76. commonDialog.removeSelf()
  77. }
  78. }
  79. override fun done(apk: File) {
  80. GlobalToast.showToast(getString(com.develop.common.R.string.finish_download))
  81. installPackage(ctx,apk)
  82. commonDialog.updateProgress(getString(com.develop.common.R.string.installing))
  83. }
  84. override fun downloading(max: Int, progress: Int) {
  85. runOnUiThread {
  86. commonDialog.updateProgress(
  87. "${
  88. String.format(
  89. "%.0f",
  90. ((progress.toFloat() / max.toFloat()) * 100f)
  91. )
  92. }%"
  93. )
  94. }
  95. }
  96. override fun error(e: Throwable) {
  97. GlobalToast.showToast(getString(com.develop.common.R.string.download_fail))
  98. runOnUiThread {
  99. commonDialog.removeSelf()
  100. }
  101. }
  102. override fun start() {
  103. // GlobalToast.showToast(getString(com.develop.common.R.string.start_download))
  104. }
  105. })
  106. }
  107. override fun onCancel() {
  108. }
  109. }
  110. }else{
  111. if(showTips) GlobalToast.showToast(getString(com.develop.common.R.string.apk_version_latest))
  112. }
  113. } catch (e: java.lang.Exception) {
  114. println("TAG 涂鸦 异常了")
  115. e.printStackTrace()
  116. }
  117. }
  118. }
  119. }
  120. fun updateApp(
  121. activity: Activity,
  122. apkUrl: String,
  123. downloadListener: OnDownloadListener
  124. ) {
  125. val manager = DownloadManager.Builder(activity).run {
  126. apkUrl(apkUrl)
  127. smallIcon(com.develop.common.R.drawable.ic_icon6)
  128. apkName("foodCooking.apk")
  129. jumpInstallPage(false)
  130. forcedUpgrade(false)
  131. onDownloadListener(downloadListener)
  132. showBgdToast(false)
  133. build()
  134. }
  135. manager.download()
  136. }
  137. fun installPackage(context: Context, apk: File) {
  138. try {
  139. val packageInstaller = context.packageManager.packageInstaller
  140. val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
  141. val sessionId = packageInstaller.createSession(params)
  142. val session = packageInstaller.openSession(sessionId)
  143. addApkToSession(apk, session)
  144. val intent = Intent(context, InstallResultReceiver::class.java)
  145. val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
  146. session.commit(pendingIntent.intentSender)
  147. session.close()
  148. } catch (e: Exception) {
  149. e.printStackTrace()
  150. }
  151. }
  152. private fun addApkToSession(file: File, session: PackageInstaller.Session) {
  153. file.inputStream().use { inputStream ->
  154. session.openWrite("COSU", 0, -1).use { outputStream ->
  155. val buffer = ByteArray(4096)
  156. var length: Int
  157. while (inputStream.read(buffer).also { length = it } != -1) {
  158. outputStream.write(buffer, 0, length)
  159. }
  160. }
  161. }
  162. }
  163. class InstallResultReceiver : BroadcastReceiver() {
  164. override fun onReceive(context: Context, intent: Intent) {
  165. val extras: Bundle? = intent.extras
  166. if (extras != null) {
  167. val status = extras.getInt(PackageInstaller.EXTRA_STATUS)
  168. // 处理安装结果
  169. // status 是安装结果代码
  170. // 可以使用PackageInstaller.Session的常量来解释结果
  171. val message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE)
  172. // 如果需要,可以获取附加的结果信息
  173. }
  174. }
  175. }
  176. private fun getApkName(url: String): String {
  177. return url.subSequence(url.lastIndexOf("/"), url.length).toString()
  178. }
  179. }