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() } }