Commit 1745a1f7 authored by yinjiacheng's avatar yinjiacheng

add App升级功能

parent 0bbc12e5
...@@ -25,6 +25,10 @@ class AppConfig { ...@@ -25,6 +25,10 @@ class AppConfig {
// 平台 // 平台
const val platform = "1" const val platform = "1"
// Tower Pro 动态下发管理
const val TowerProPlatformId = 29
const val TowerProPlatform = "Android"
// 分享相关的三方平台配置 // 分享相关的三方平台配置
const val WeChatAppKey = "wxef4c37f254e29e84" const val WeChatAppKey = "wxef4c37f254e29e84"
......
...@@ -13,6 +13,7 @@ import com.scwang.smart.refresh.layout.SmartRefreshLayout ...@@ -13,6 +13,7 @@ import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.scwang.smart.refresh.layout.constant.SpinnerStyle import com.scwang.smart.refresh.layout.constant.SpinnerStyle
import com.yidian.common.http.ApiSaveCookiesInterceptor import com.yidian.common.http.ApiSaveCookiesInterceptor
import com.yidian.common.http.ApiSetCookiesInterceptor import com.yidian.common.http.ApiSetCookiesInterceptor
import com.yidian.common.services.AppUpgradeService
import com.yidian.common.services.XEventService import com.yidian.common.services.XEventService
import com.yidian.common.services.XPageService import com.yidian.common.services.XPageService
import com.yidian.common.utils.UMConfigUtils import com.yidian.common.utils.UMConfigUtils
...@@ -20,11 +21,14 @@ import com.yidian.commonutil.CommonUtilLifecycleModule ...@@ -20,11 +21,14 @@ import com.yidian.commonutil.CommonUtilLifecycleModule
import com.yidian.framework.mobile.xdiamond.SecretUtil import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.http.ServiceFactory import com.yidian.http.ServiceFactory
import com.yidian.news.util.ProcessUtil import com.yidian.news.util.ProcessUtil
import com.yidian.xarc.xbase.utils.XLogger
import com.yidian.xarc.xbrid.* import com.yidian.xarc.xbrid.*
import com.yidian.xpage.XPageManager import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.Zap import com.yidian.yac.core.zap.Zap
import com.yidian.yac.core.zap.ZapTicket import com.yidian.yac.core.zap.ZapTicket
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import com.yidian.yac.pm.appupdate.PmUpdateApp
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import org.json.JSONObject import org.json.JSONObject
import timber.log.Timber import timber.log.Timber
...@@ -87,6 +91,8 @@ open class YdBaseApplication : Application() { ...@@ -87,6 +91,8 @@ open class YdBaseApplication : Application() {
registerActivityLifecycleCallbacks(activityLifecycle) registerActivityLifecycleCallbacks(activityLifecycle)
// 初始化磐石SDK // 初始化磐石SDK
SecretUtil.init(BuildConfig.IS_ENCRYPT_DEBUG_KEY) SecretUtil.init(BuildConfig.IS_ENCRYPT_DEBUG_KEY)
// 初始化App升级
initAppUpgrade()
} }
initSmartRefreshLayout() initSmartRefreshLayout()
} }
...@@ -200,6 +206,25 @@ open class YdBaseApplication : Application() { ...@@ -200,6 +206,25 @@ open class YdBaseApplication : Application() {
private fun loadService() { private fun loadService() {
Zap.addService(XPageService.name, XPageService()) Zap.addService(XPageService.name, XPageService())
Zap.addService(XEventService.name, XEventService()) Zap.addService(XEventService.name, XEventService())
Zap.addService(AppUpgradeService.SERVICE_NAME, AppUpgradeService())
}
/**
* App升级
*/
private fun initAppUpgrade() {
val logger = XLogger("appUpgrade")
logger.debugOn(true)
YDAppUpdateManager.init(PmUpdateApp(this) {
online = false // 线上true、线下false
platformId = AppConfig.TowerProPlatformId // 平台Id
platform = AppConfig.TowerProPlatform // ios/Android
appId = packageName // 应用包名
appVersion = AppConfig.cv // 客户端版本号
deviceFinger = FtDeviceFingerManager.getDeviceFinger() // 设备指纹
androidChannel = AppConfig.distribution // 渠道
this.logger = logger.subLogger("appUpgrade")
})
} }
companion object { companion object {
......
package com.yidian.common.services
import android.os.Handler
import android.os.Message
import com.yidian.common.widget.CommonHintDialog
import com.yidian.xarc.xbase.net.CheckUpdateCallback
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.xpage.observer.DStackActivityManager
import com.yidian.yac.core.zap.ZapService
import com.yidian.yac.pm.appupdate.AppUpdateEchoData
import com.yidian.yac.pm.appupdate.AppUpdateInfo
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import com.yidian.yac.pm.appupdate.callback.AppUpdateCallback
import com.yidian.yac.pm.base.UpdateInfo
import java.io.File
/**
* author: yinjiacheng
* date: 6/30/21 3:29 PM
* description: App升级服务
*/
class AppUpgradeService : ZapService(), CommonHintDialog.OnHintOptionCallback, Handler.Callback {
companion object {
private const val TAG = "AppUpgradeService"
const val SERVICE_NAME = "AppUpgradeService"
// 外部调用服务action 检查app升级
const val ACTION_CHECK_APP_UPGRADE = "checkAppUpgrade"
// 外部调用服务action 下载apk
const val ACTION_DOWNLOAD_APK = "downloadApk"
// app需要升级
private const val MSG_APP_NEED_UPGRADE = 101
// app无需升级
private const val MSG_APP_UP_TO_DATE = 102
// app检测更新失败
private const val MSG_APP_CHECK_UPGRADE_ERROR = 103
}
/**
* app升级信息
*/
private lateinit var appUpdateInfo: AppUpdateInfo<AppUpdateEchoData>
private lateinit var resolver: ResultResolver
private lateinit var handler: Handler
override fun onAction(path: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver
when (action) {
ACTION_CHECK_APP_UPGRADE -> {
checkAppUpgrade()
}
ACTION_DOWNLOAD_APK -> {
downloadApk()
}
}
}
override fun onExit() {
}
override fun onInit() {
handler = Handler(this)
}
/**
* 检查App升级
*/
private fun checkAppUpgrade() {
YDAppUpdateManager.checkAppUpdate(object : CheckUpdateCallback() {
override fun onSucess(updateInfo: UpdateInfo<Any>?) {
appUpdateInfo = updateInfo as AppUpdateInfo<AppUpdateEchoData>
if (!appUpdateInfo.hasUpdate) {
// 无需升级
handler.sendEmptyMessage(MSG_APP_UP_TO_DATE) // 切换到主线程
} else {
handler.sendEmptyMessage(MSG_APP_NEED_UPGRADE)
}
}
override fun onFail(msg: String) {
handler.sendEmptyMessage(MSG_APP_CHECK_UPGRADE_ERROR)
}
})
}
/**
* 下载安装包
*/
private fun downloadApk() {
YDAppUpdateManager.download(appUpdateInfo, object : AppUpdateCallback() {
override fun onProgress(total: Long, current: Long, percentage: Int) {
// Log.d(TAG, "progress, total: $total, current: $current, percentage: $percentage")
}
override fun onDownloadSuccess(apkFile: File, isCache: Boolean) {
//参数1.安装包的地址 2. 是否是已缓存的安装包
// Log.d(TAG, "apkFile: $apkFile, isCache: $isCache")
}
override fun onDownloadFailed() {
}
override fun onDownloadPaused() {
}
override fun onInstallFailed() {
}
override fun onSignatureVerifiyFailed() {
}
}, true)
}
/**
* 展示升级弹窗
*/
private fun showAppUpgradeDialog(data: AppUpdateInfo<AppUpdateEchoData>) {
if (data.echo_data?.force_update == true) {
// 强制升级
CommonHintDialog(DStackActivityManager.getInstance().topActivity, "检测到版本更新", arrayListOf("立即升级"), this).show()
} else {
// 非强制升级
CommonHintDialog(DStackActivityManager.getInstance().topActivity, "检测到版本更新", arrayListOf("取消", "立即升级"), this).show()
}
}
override fun onLeftOption() {
// 取消
}
override fun onRightOption() {
// 立即升级
downloadApk()
}
override fun handleMessage(msg: Message): Boolean {
when (msg.what) {
MSG_APP_NEED_UPGRADE -> {
// 展示升级弹窗
showAppUpgradeDialog(appUpdateInfo)
}
MSG_APP_UP_TO_DATE -> {
resolver.fail(-1, null, "已是最新版本")
}
MSG_APP_CHECK_UPGRADE_ERROR -> {
resolver.fail(-2, null, "检测更新失败,请稍后重试")
}
}
return true
}
}
package com.yidian.common.widget
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import com.yidian.common.R
import com.yidian.common.base.BaseDialog
import com.yidian.common.databinding.DialogCommonHintBinding
import com.yidian.utils.DensityUtil
/**
* author: yinjiacheng
* date: 7/1/21 04:07 PM
* description: 通用提示dialog
*/
class CommonHintDialog @JvmOverloads constructor(
context: Context,
val content: String,
val options: ArrayList<String>,
val callback: OnHintOptionCallback?,
private val leftBtnColor: Int = R.color.color_8F000000,
private val rightBtnColor: Int = R.color.color_1852F1,
) : BaseDialog<DialogCommonHintBinding>(context), View.OnClickListener {
override fun createViewBinding(): DialogCommonHintBinding {
return DialogCommonHintBinding.inflate(layoutInflater)
}
override fun initView() {
viewBinding.tvContent.text = content
when (options.size) {
1 -> {
viewBinding.btnRight.text = options[0]
viewBinding.btnLeft.isVisible = false
viewBinding.viewVerticalDivider.isVisible = false
viewBinding.btnRight.setTextColor(ContextCompat.getColor(context, rightBtnColor))
}
2 -> {
viewBinding.btnLeft.text = options[0]
viewBinding.btnRight.text = options[1]
viewBinding.btnLeft.setTextColor(ContextCompat.getColor(context, leftBtnColor))
viewBinding.btnRight.setTextColor(ContextCompat.getColor(context, rightBtnColor))
}
}
}
override fun initListener() {
viewBinding.btnLeft.setOnClickListener(this)
viewBinding.btnRight.setOnClickListener(this)
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
setCanceledOnTouchOutside(false)
}
override fun show() {
super.show()
val attrs = window?.attributes
attrs?.width = DensityUtil.dp2px(280f)
attrs?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = attrs
}
override fun onClick(v: View?) {
if (v?.id == R.id.btn_left) {
callback?.onLeftOption()
} else if (v?.id == R.id.btn_right) {
callback?.onRightOption()
}
// 点击左右均要关闭弹框
dismiss()
}
interface OnHintOptionCallback {
/**
* 左操作项
*/
fun onLeftOption()
/**
* 右操作项
*/
fun onRightOption()
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:radius="@dimen/dp12" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_common_hint_dialog">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="@dimen/dp20"
android:textColor="@color/color_DE000000"
android:textSize="@dimen/sp14"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/view_horizontal_divider"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/color_1A000000"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_content" />
<Button
android:id="@+id/btn_left"
android:layout_width="0dp"
android:layout_height="@dimen/dp48"
android:background="@null"
android:textColor="@color/color_8F000000"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/btn_right"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_divider" />
<View
android:id="@+id/view_vertical_divider"
android:layout_width="0.5dp"
android:layout_height="0dp"
android:background="@color/color_1A000000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btn_right"
app:layout_constraintStart_toEndOf="@id/btn_left"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_divider" />
<Button
android:id="@+id/btn_right"
android:layout_width="0dp"
android:layout_height="@dimen/dp48"
android:background="@null"
android:textColor="@color/color_1852F1"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/btn_left"
app:layout_constraintTop_toBottomOf="@id/view_horizontal_divider" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -41,5 +41,7 @@ ...@@ -41,5 +41,7 @@
<color name="color_F5F6F7">#F5F6F7</color> <color name="color_F5F6F7">#F5F6F7</color>
<color name="color_1852F1">#1852F1</color> <color name="color_1852F1">#1852F1</color>
<color name="color_F6F6F6">#f6f6f6</color> <color name="color_F6F6F6">#f6f6f6</color>
<color name="color_1A000000">#1A000000</color>
<color name="color_DE000000">#DE000000</color>
<color name="color_8F000000">#8F000000</color>
</resources> </resources>
...@@ -11,6 +11,7 @@ import com.yidian.common.XRouterPathConstants.Companion.FLASH ...@@ -11,6 +11,7 @@ import com.yidian.common.XRouterPathConstants.Companion.FLASH
import com.yidian.common.base.BaseActivity import com.yidian.common.base.BaseActivity
import com.yidian.common.utils.SystemSettingUtils import com.yidian.common.utils.SystemSettingUtils
import com.yidian.common.widget.DialogBuilder import com.yidian.common.widget.DialogBuilder
import com.yidian.common.services.AppUpgradeService
import com.yidian.shenghuoquan.newscontent.databinding.ActivityFlashBinding import com.yidian.shenghuoquan.newscontent.databinding.ActivityFlashBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback
...@@ -19,6 +20,7 @@ import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountIdentityActivity ...@@ -19,6 +20,7 @@ import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountIdentityActivity
import com.yidian.shenghuoquan.newscontent.ui.center.MerchantCenterActivity import com.yidian.shenghuoquan.newscontent.ui.center.MerchantCenterActivity
import com.yidian.shenghuoquan.newscontent.utils.StorageUtil import com.yidian.shenghuoquan.newscontent.utils.StorageUtil
import com.yidian.xpage.XPageManager import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.ZapTicket
class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListCallback { class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListCallback {
...@@ -47,6 +49,8 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC ...@@ -47,6 +49,8 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
// 此处没有使用XPage打开页面 原因:不能设置flag // 此处没有使用XPage打开页面 原因:不能设置flag
startActivity(Intent(this, LoginLifeCircleActivity::class.java)) startActivity(Intent(this, LoginLifeCircleActivity::class.java))
finish() finish()
// 检查app更新
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).ship()
} }
} }
} }
...@@ -92,6 +96,8 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC ...@@ -92,6 +96,8 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
} }
} }
XPageManager.pop(null) XPageManager.pop(null)
// 检查app更新
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).ship()
} }
override fun getLifeAccountListFailure(message: String?) { override fun getLifeAccountListFailure(message: String?) {
......
...@@ -8,6 +8,7 @@ import com.yidian.common.XRouterPathConstants ...@@ -8,6 +8,7 @@ import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING import com.yidian.common.XRouterPathConstants.Companion.SYSTEM_SETTING
import com.yidian.common.base.BaseActivity import com.yidian.common.base.BaseActivity
import com.yidian.common.extensions.initTitleBar import com.yidian.common.extensions.initTitleBar
import com.yidian.common.services.AppUpgradeService
import com.yidian.common.utils.SystemSettingUtils import com.yidian.common.utils.SystemSettingUtils
import com.yidian.shenghuoquan.newscontent.R import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean
...@@ -19,6 +20,7 @@ import com.yidian.shenghuoquan.newscontent.utils.SensitiveInfoUtil ...@@ -19,6 +20,7 @@ import com.yidian.shenghuoquan.newscontent.utils.SensitiveInfoUtil
import com.yidian.utils.ToastUtil import com.yidian.utils.ToastUtil
import com.yidian.xarc.xbase.utils.AppUtils import com.yidian.xarc.xbase.utils.AppUtils
import com.yidian.xpage.XPageManager import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.ZapTicket
/** /**
...@@ -58,6 +60,12 @@ class SystemSettingActivity : BaseActivity<ActivitySystemSettingBinding>() { ...@@ -58,6 +60,12 @@ class SystemSettingActivity : BaseActivity<ActivitySystemSettingBinding>() {
viewBind.tvLogout.setOnClickListener { viewBind.tvLogout.setOnClickListener {
showConfirmDialog() showConfirmDialog()
} }
// 检查app更新
viewBind.clCheckUpgrade.setOnClickListener {
ZapTicket(AppUpgradeService.SERVICE_NAME).withAction(AppUpgradeService.ACTION_CHECK_APP_UPGRADE).onResult {
if (it.code != 0) ToastUtil.showToast(this, it.tips)
}.ship()
}
} }
private fun showConfirmDialog() { private fun showConfirmDialog() {
......
...@@ -79,6 +79,34 @@ ...@@ -79,6 +79,34 @@
<View style="@style/cut_off_line_style" /> <View style="@style/cut_off_line_style" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_check_upgrade"
android:layout_width="match_parent"
android:layout_height="@dimen/dp60">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="检查更新"
android:textColor="@color/color_333333"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="@dimen/dp24"
android:layout_height="@dimen/dp24"
android:src="@mipmap/icon_next"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View style="@style/cut_off_line_style" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_about" android:id="@+id/cl_about"
android:layout_width="match_parent" android:layout_width="match_parent"
......
...@@ -54,7 +54,7 @@ ext.dependencies = [ ...@@ -54,7 +54,7 @@ ext.dependencies = [
// 风控SDK // 风控SDK
'com.yidian.ftcomponents:ftdevicefinger:0.0.14', 'com.yidian.ftcomponents:ftdevicefinger:0.0.14',
// 应用升级SDK // 应用升级SDK
'com.yidian.pmcomponents:appupdate:0.0.7', 'com.yidian.pmcomponents:appupdate:0.0.8',
'com.yidian.xpage:xpagenative:0.0.1', 'com.yidian.xpage:xpagenative:0.0.1',
// 友盟基础组件(必选) // 友盟基础组件(必选)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment