123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- package com.develop.common.utils
- import android.app.Activity
- import android.app.PendingIntent
- import android.content.BroadcastReceiver
- import android.content.Context
- import android.content.Intent
- import android.content.pm.PackageInstaller
- import android.net.Uri
- import android.os.Bundle
- import android.provider.Settings
- import com.azhon.appupdate.base.BaseHttpDownloadManager
- import com.azhon.appupdate.base.bean.DownloadStatus
- import com.azhon.appupdate.config.Constant
- import com.azhon.appupdate.listener.OnDownloadListener
- import com.azhon.appupdate.manager.DownloadManager
- import com.azhon.appupdate.manager.HttpDownloadManager
- import com.azhon.appupdate.util.LogUtil
- import com.develop.base.R
- import com.develop.base.ext.toJson
- import com.develop.base.util.GlobalToast
- import com.develop.base.util.TopResumedAtyHolder
- import com.develop.common.data_repo.net.Api
- import com.develop.common.data_repo.net.model.request.DeviceInfoBody
- import com.develop.common.data_repo.net.model.response.DevInfoResult
- import com.develop.common.dialog.CancelConfirmDialog
- import com.develop.common.dialog.CommonDialog
- import com.develop.common.dialog.RecipeUpdateDialog
- import com.drake.net.Post
- import com.drake.net.utils.scopeNetLife
- import kotlinx.coroutines.Dispatchers
- import kotlinx.coroutines.flow.*
- import okhttp3.OkHttpClient
- import okhttp3.Request
- import java.io.File
- import java.io.FileOutputStream
- import java.net.HttpURLConnection
- import java.net.SocketTimeoutException
- import java.net.URL
- import java.security.SecureRandom
- import java.security.cert.X509Certificate
- import java.util.*
- import java.util.concurrent.TimeUnit
- import javax.net.ssl.HttpsURLConnection
- import javax.net.ssl.SSLContext
- import javax.net.ssl.TrustManager
- import javax.net.ssl.X509TrustManager
- object UpdateUtil {
- fun checkApkVersion(showTips:Boolean = true) {
- println("TAG 涂鸦 请求了")
- TopResumedAtyHolder.getCurrentActivity()?.apply {
- scopeNetLife {
- try {
- val result = Post<DevInfoResult>(Api.DEV_INFO) {
- body = DeviceInfoBody.genDeviceInfoBody()
- }.await()
- println("TAG 涂鸦1 :"+result.toJson())
- val ctx = this@apply
- if (result.apkUpdate) {
- val commonDialog = CommonDialog()
- commonDialog.msg = getString(com.develop.common.R.string.update_msg)
- commonDialog.title = getString(com.develop.common.R.string.update)
- commonDialog.hasOKBtn = false
- val cancelConfirmDialog = CancelConfirmDialog()
- cancelConfirmDialog.title = getString(com.develop.common.R.string.update_title)
- cancelConfirmDialog.showDialog(supportFragmentManager, "cancelConfirmDialog")
- cancelConfirmDialog.onDialogClickListener =
- object : CancelConfirmDialog.OnDialogClickListener {
- override fun onConfirm() {
- commonDialog.showDialog(supportFragmentManager, "commonDialog")
- updateApp(
- ctx,
- result.apkUrl,
- object : OnDownloadListener {
- override fun cancel() {
- runOnUiThread {
- commonDialog.removeSelf()
- }
- }
- override fun done(apk: File) {
- GlobalToast.showToast(getString(com.develop.common.R.string.finish_download))
- installPackage(ctx,apk)
- commonDialog.updateProgress(getString(com.develop.common.R.string.installing))
- }
- override fun downloading(max: Int, progress: Int) {
- runOnUiThread {
- commonDialog.updateProgress(
- "${
- String.format(
- "%.0f",
- ((progress.toFloat() / max.toFloat()) * 100f)
- )
- }%"
- )
- }
- }
- override fun error(e: Throwable) {
- GlobalToast.showToast(getString(com.develop.common.R.string.download_fail))
- runOnUiThread {
- commonDialog.removeSelf()
- }
- }
- override fun start() {
- // GlobalToast.showToast(getString(com.develop.common.R.string.start_download))
- }
- })
- }
- override fun onCancel() {
- }
- }
- }else{
- if(showTips) GlobalToast.showToast(getString(com.develop.common.R.string.apk_version_latest))
- }
- } catch (e: java.lang.Exception) {
- println("TAG 涂鸦 异常了")
- e.printStackTrace()
- }
- }
- }
- }
- fun updateApp(
- activity: Activity,
- apkUrl: String,
- downloadListener: OnDownloadListener
- ) {
- val manager = DownloadManager.Builder(activity).run {
- apkUrl(apkUrl)
- smallIcon(com.develop.common.R.drawable.ic_icon6)
- apkName("foodCooking.apk")
- jumpInstallPage(false)
- forcedUpgrade(false)
- onDownloadListener(downloadListener)
- showBgdToast(false)
- build()
- }
- manager.download()
- }
- fun installPackage(context: Context, apk: File) {
- try {
- val packageInstaller = context.packageManager.packageInstaller
- val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
- val sessionId = packageInstaller.createSession(params)
- val session = packageInstaller.openSession(sessionId)
- addApkToSession(apk, session)
- val intent = Intent(context, InstallResultReceiver::class.java)
- val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
- session.commit(pendingIntent.intentSender)
- session.close()
- } catch (e: Exception) {
- e.printStackTrace()
- }
- }
- private fun addApkToSession(file: File, session: PackageInstaller.Session) {
- file.inputStream().use { inputStream ->
- session.openWrite("COSU", 0, -1).use { outputStream ->
- val buffer = ByteArray(4096)
- var length: Int
- while (inputStream.read(buffer).also { length = it } != -1) {
- outputStream.write(buffer, 0, length)
- }
- }
- }
- }
- class InstallResultReceiver : BroadcastReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- val extras: Bundle? = intent.extras
- if (extras != null) {
- val status = extras.getInt(PackageInstaller.EXTRA_STATUS)
- // 处理安装结果
- // status 是安装结果代码
- // 可以使用PackageInstaller.Session的常量来解释结果
- val message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE)
- // 如果需要,可以获取附加的结果信息
- }
- }
- }
- private fun getApkName(url: String): String {
- return url.subSequence(url.lastIndexOf("/"), url.length).toString()
- }
- }
|