添加推送
This commit is contained in:
parent
30eabe1f42
commit
a2ad52a560
|
|
@ -0,0 +1 @@
|
||||||
|
{"agcgw":{"url":"connect-drcn.dbankcloud.cn","backurl":"connect-drcn.hispace.hicloud.com","websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn","websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com"},"agcgw_all":{"SG":"connect-dra.dbankcloud.cn","SG_back":"connect-dra.hispace.hicloud.com","CN":"connect-drcn.dbankcloud.cn","CN_back":"connect-drcn.hispace.hicloud.com","RU":"connect-drru.hispace.dbankcloud.ru","RU_back":"connect-drru.hispace.dbankcloud.cn","DE":"connect-dre.dbankcloud.cn","DE_back":"connect-dre.hispace.hicloud.com"},"websocketgw_all":{"SG":"connect-ws-dra.hispace.dbankcloud.cn","SG_back":"connect-ws-dra.hispace.dbankcloud.com","CN":"connect-ws-drcn.hispace.dbankcloud.cn","CN_back":"connect-ws-drcn.hispace.dbankcloud.com","RU":"connect-ws-drru.hispace.dbankcloud.ru","RU_back":"connect-ws-drru.hispace.dbankcloud.cn","DE":"connect-ws-dre.hispace.dbankcloud.cn","DE_back":"connect-ws-dre.hispace.dbankcloud.com"},"client":{"cp_id":"10086000857368069","product_id":"461323198430317227","client_id":"1767315365546720896","client_secret":"E850E689CE235C825BECC77648A7183C12B83DED658DB9299DE327BDBA8371C2","project_id":"461323198430317227","app_id":"116691541","api_key":"DgEDAFb9kA1N7as7xG6yopyuQl8jtjXgqaU8CTZ8royzaRgSWCFIvzAyo7PrRwF3DGbHZ3+Mf5KH7m6Un16Rs+MB5xkbUwj+B4qn/Q==","package_name":"com.cheng.BoLe"},"oauth_client":{"client_id":"116691541","client_type":1},"app_info":{"app_id":"116691541","package_name":"com.cheng.BoLe"},"service":{"analytics":{"collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn","collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn","collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn","collector_url_ru":"datacollector-drru.dt.dbankcloud.ru,datacollector-drru.dt.hicloud.com","collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn","resource_id":"p1","channel_id":""},"ml":{"mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn"},"cloudstorage":{"storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn","storage_url_ru":"https://agc-storage-drru.cloud.huawei.ru","storage_url_sg":"https://ops-dra.agcstorage.link","storage_url_de":"https://ops-dre.agcstorage.link","storage_url_cn":"https://agc-storage-drcn.platform.dbankcloud.cn","storage_url_ru_back":"https://agc-storage-drru.cloud.huawei.ru","storage_url_sg_back":"https://agc-storage-dra.cloud.huawei.asia","storage_url_de_back":"https://agc-storage-dre.cloud.huawei.eu","storage_url_cn_back":"https://agc-storage-drcn.cloud.huawei.com.cn"},"search":{"url":"https://search-drcn.cloud.huawei.com"},"edukit":{"edu_url":"edukit.cloud.huawei.com.cn","dh_url":"edukit.cloud.huawei.com.cn"}},"region":"CN","configuration_version":"3.0","appInfos":[{"package_name":"com.cheng.BoLe","client":{"app_id":"116691541"},"app_info":{"package_name":"com.cheng.BoLe","app_id":"116691541"},"oauth_client":{"client_type":1,"client_id":"116691541"}},{"package_name":"cn.zuom8.jisuloca","client":{"app_id":"116209939"},"app_info":{"package_name":"cn.zuom8.jisuloca","app_id":"116209939"},"oauth_client":{"client_type":1,"client_id":"116209939"}},{"package_name":"cn.zuom8.smartdrive","client":{"app_id":"115184955"},"app_info":{"package_name":"cn.zuom8.smartdrive","app_id":"115184955"},"oauth_client":{"client_type":1,"client_id":"115184955"}}]}
|
||||||
|
|
@ -3,6 +3,7 @@ plugins {
|
||||||
alias(libs.plugins.jetbrainsKotlinAndroid)
|
alias(libs.plugins.jetbrainsKotlinAndroid)
|
||||||
id 'kotlin-kapt'
|
id 'kotlin-kapt'
|
||||||
id 'kotlin-parcelize'
|
id 'kotlin-parcelize'
|
||||||
|
id 'com.huawei.agconnect'
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
|
@ -59,6 +60,23 @@ android {
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
GETUI_APPID : "ej3hUPd0LR8G1CzkNtyZS3",
|
GETUI_APPID : "ej3hUPd0LR8G1CzkNtyZS3",
|
||||||
GT_INSTALL_CHANNEL: "test",
|
GT_INSTALL_CHANNEL: "test",
|
||||||
|
// 华为 相关应用参数
|
||||||
|
HUAWEI_APP_ID : "116691541",
|
||||||
|
|
||||||
|
// 小米相关应用参数
|
||||||
|
XIAOMI_APP_ID : "2882303761520492130",
|
||||||
|
XIAOMI_APP_KEY : "5942049244130",
|
||||||
|
|
||||||
|
// OPPO 相关应用参数
|
||||||
|
OPPO_APP_KEY : "14c5c2d077404b5f987e34f3d4fd2e97",
|
||||||
|
OPPO_APP_SECRET : "cfe7bd2037cf4f16aa1579ff6113d6c1",
|
||||||
|
|
||||||
|
// VIVO 相关应用参数
|
||||||
|
VIVO_APP_ID : "106026636",
|
||||||
|
VIVO_APP_KEY : "be86ca063884357ff7eeb87a2de537d6",
|
||||||
|
|
||||||
|
// 荣耀相关应用参数
|
||||||
|
HONOR_APP_ID : "104542383"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -163,8 +181,23 @@ dependencies {
|
||||||
implementation files('libs/humesdk-1.0.0.aar') //巨量分包
|
implementation files('libs/humesdk-1.0.0.aar') //巨量分包
|
||||||
|
|
||||||
implementation 'com.getui:gysdk:3.1.7.0' //一键认证sdk
|
implementation 'com.getui:gysdk:3.1.7.0' //一键认证sdk
|
||||||
|
implementation 'com.getui:gtsdk:3.3.8.0' // 推送sdk
|
||||||
implementation 'com.getui:gtc:3.2.16.0' //个推公共库,如已接其他个推sdk则保留一个最高版本即可
|
implementation 'com.getui:gtc:3.2.16.0' //个推公共库,如已接其他个推sdk则保留一个最高版本即可
|
||||||
|
|
||||||
|
// 根据所需厂商选择集成
|
||||||
|
implementation 'com.getui.opt:hwp:3.1.2' // 华为
|
||||||
|
implementation 'com.getui.opt:xmp:3.3.3' // 小米
|
||||||
|
implementation 'com.assist-v3:oppo:3.5.0' // oppo
|
||||||
|
implementation 'com.assist-v3:vivo:3.2.0' // vivo
|
||||||
|
implementation 'com.getui.opt:honor:3.6.0' // 荣耀
|
||||||
|
//华为厂商推送配置
|
||||||
|
implementation 'com.huawei.hms:push:6.11.0.300'
|
||||||
|
implementation 'com.huawei.agconnect:agconnect-core:1.9.1.300'
|
||||||
|
//荣耀厂商推送配置
|
||||||
|
implementation 'com.hihonor.mcs:push:7.0.61.303'
|
||||||
|
//oppo厂商推送配置
|
||||||
|
implementation 'commons-codec:commons-codec:1.6'
|
||||||
|
|
||||||
//微信
|
//微信
|
||||||
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:+'
|
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:+'
|
||||||
//友盟
|
//友盟
|
||||||
|
|
|
||||||
|
|
@ -191,6 +191,15 @@
|
||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<!--推送-->
|
||||||
|
<service
|
||||||
|
android:name=".service.PushMessageService"
|
||||||
|
android:exported="false"
|
||||||
|
android:label="PushService"
|
||||||
|
android:process=":pushservice" />
|
||||||
|
|
||||||
|
<service android:name=".service.PushIntentService" />
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.fileprovider"
|
android:authorities="${applicationId}.fileprovider"
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import com.g.gysdk.GYManager
|
||||||
import com.g.gysdk.GYResponse
|
import com.g.gysdk.GYResponse
|
||||||
import com.g.gysdk.GyCallBack
|
import com.g.gysdk.GyCallBack
|
||||||
import com.g.gysdk.GyConfig
|
import com.g.gysdk.GyConfig
|
||||||
|
import com.igexin.sdk.PushManager
|
||||||
import com.scwang.smart.refresh.header.MaterialHeader
|
import com.scwang.smart.refresh.header.MaterialHeader
|
||||||
import com.scwang.smart.refresh.layout.SmartRefreshLayout
|
import com.scwang.smart.refresh.layout.SmartRefreshLayout
|
||||||
import com.tencent.mmkv.MMKV
|
import com.tencent.mmkv.MMKV
|
||||||
|
|
@ -78,6 +79,9 @@ class BaseApplication : MvvmApplication() {
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PushManager.getInstance().preInit(this)
|
||||||
|
PushManager.getInstance().initialize(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,13 +22,7 @@ object NotificationHelper {
|
||||||
private val notificationManager by lazy { Utils.getApp().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager }
|
private val notificationManager by lazy { Utils.getApp().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager }
|
||||||
|
|
||||||
private const val DEFAULT_CHANNEL_ID = "default"
|
private const val DEFAULT_CHANNEL_ID = "default"
|
||||||
private const val DOWNLOAD_CHANNEL_ID = "download"
|
private const val MESSAGE_CHANNEL_ID = "message"
|
||||||
private const val FOREGROUND_CHANNEL_ID = "foreground"
|
|
||||||
|
|
||||||
private const val DOWNLOAD_GROUP = "download_group"
|
|
||||||
|
|
||||||
private const val DOWNLOAD_CANCEL_CODE = 2000
|
|
||||||
private const val DOWNLOAD_RETRY_CODE = 3000
|
|
||||||
|
|
||||||
private var _notificationId = 1000
|
private var _notificationId = 1000
|
||||||
|
|
||||||
|
|
@ -40,17 +34,17 @@ object NotificationHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 前台通知
|
* 消息通知
|
||||||
*/
|
*/
|
||||||
fun startForeground(service: Service) {
|
fun createMessageNotification(context: Context): Notification {
|
||||||
val channelId = createNotificationChannel(FOREGROUND_CHANNEL_ID, "Foreground", NotificationManager.IMPORTANCE_LOW)
|
val channelId = createNotificationChannel(MESSAGE_CHANNEL_ID, "Message", NotificationManager.IMPORTANCE_HIGH)
|
||||||
val builder = NotificationCompat.Builder(service, channelId)
|
val builder = NotificationCompat.Builder(context, channelId)
|
||||||
val notification = builder
|
return builder
|
||||||
.setContentText("文件下载服务运行中")
|
.setContentTitle("")
|
||||||
|
.setContentText("")
|
||||||
.setSmallIcon(R.mipmap.ic_launcher_icon)
|
.setSmallIcon(R.mipmap.ic_launcher_icon)
|
||||||
.setCategory(Notification.CATEGORY_SERVICE)
|
.setCategory(Notification.CATEGORY_MESSAGE)
|
||||||
.build()
|
.build()
|
||||||
service.startForeground(1, notification)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -69,7 +63,6 @@ object NotificationHelper {
|
||||||
*/
|
*/
|
||||||
private fun createNotificationChannel(channelId: String, channelName: String, importance: Int): String {
|
private fun createNotificationChannel(channelId: String, channelName: String, importance: Int): String {
|
||||||
val channel = NotificationChannel(channelId, channelName, importance)
|
val channel = NotificationChannel(channelId, channelName, importance)
|
||||||
channel.setSound(null, null)
|
|
||||||
notificationManager.createNotificationChannel(channel)
|
notificationManager.createNotificationChannel(channel)
|
||||||
return channelId
|
return channelId
|
||||||
}
|
}
|
||||||
|
|
@ -88,30 +81,26 @@ object NotificationHelper {
|
||||||
/**
|
/**
|
||||||
* 通知被禁用时显示提示
|
* 通知被禁用时显示提示
|
||||||
*/
|
*/
|
||||||
fun showDisabledTip(activity: Activity, fm: FragmentManager, isHomePage: Boolean = false) {
|
fun showDisabledTip(activity: Activity, fm: FragmentManager) {
|
||||||
if (isHomePage) {
|
val f = TipDialog.newInstance("请开启通知权限", "未避免错过重要消息,请在设置中打开【允许通知】", "去设置", "取消", cancelable = false)
|
||||||
toast("平台推送消息需要通知权限,检测到您已关闭相关权限,请前往设置手动打开")
|
f.setOnSelectListener {
|
||||||
} else {
|
if (it == DialogEnum.CLICK_CANCEL) {
|
||||||
val f = TipDialog.newInstance("请开启通知权限", "为方便查看下载进度,请在设置中打开【允许通知】")
|
try {
|
||||||
f.setOnSelectListener {
|
//8.0及以上
|
||||||
if (it == DialogEnum.CLICK_OK) {
|
val intent = Intent()
|
||||||
try {
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
//8.0及以上
|
intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
|
||||||
val intent = Intent()
|
intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.packageName)
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
activity.startActivity(intent)
|
||||||
intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
|
} catch (e: Exception) {
|
||||||
intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.packageName)
|
val intent = Intent()
|
||||||
activity.startActivity(intent)
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
} catch (e: Exception) {
|
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
|
||||||
val intent = Intent()
|
intent.setData(Uri.fromParts("package", activity.packageName, null))
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
activity.startActivity(intent)
|
||||||
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
|
|
||||||
intent.setData(Uri.fromParts("package", activity.packageName, null))
|
|
||||||
activity.startActivity(intent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.show(fm, TipDialog::class.java.simpleName)
|
|
||||||
}
|
}
|
||||||
|
f.show(fm, TipDialog::class.java.simpleName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
package com.cheng.blzb.service
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import com.cheng.blzb.event.PushMessageEvent
|
||||||
|
import com.cheng.blzb.manager.UserConfigManager
|
||||||
|
import com.example.base.common.RxBus
|
||||||
|
import com.example.base.utils.L
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.igexin.sdk.GTIntentService
|
||||||
|
import com.igexin.sdk.message.GTCmdMessage
|
||||||
|
import com.igexin.sdk.message.GTNotificationMessage
|
||||||
|
import com.igexin.sdk.message.GTTransmitMessage
|
||||||
|
import java.net.URISyntaxException
|
||||||
|
|
||||||
|
|
||||||
|
class PushIntentService : GTIntentService() {
|
||||||
|
|
||||||
|
override fun onReceiveServicePid(context: Context?, pid: Int) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 此方法用于接收和处理透传消息。透传消息个推只传递数据,不做任何处理,客户端接收到透传消息后需要自己去做后续动作处理,如通知栏展示、弹框等。
|
||||||
|
* 如果开发者在客户端将透传消息创建了通知栏展示,建议将展示和点击回执上报给个推。
|
||||||
|
*/
|
||||||
|
override fun onReceiveMessageData(context: Context?, msg: GTTransmitMessage) {
|
||||||
|
val payload = msg.payload
|
||||||
|
val data = String(payload)
|
||||||
|
L.d("receiver payload = $data") //透传消息文本内容
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收 cid
|
||||||
|
override fun onReceiveClientId(context: Context?, clientid: String) {
|
||||||
|
L.d("PushIntentService---onReceiveClientId -> clientid = $clientid")
|
||||||
|
UserConfigManager.saveGTCid(clientid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// cid 离线上线通知
|
||||||
|
override fun onReceiveOnlineState(context: Context?, online: Boolean) {}
|
||||||
|
|
||||||
|
// 各种事件处理回执
|
||||||
|
override fun onReceiveCommandResult(context: Context?, cmdMessage: GTCmdMessage?) {}
|
||||||
|
|
||||||
|
// 通知到达,只有个推通道下发的通知会回调此方法
|
||||||
|
override fun onNotificationMessageArrived(context: Context?, msg: GTNotificationMessage?) {
|
||||||
|
L.d("PushIntentService---onNotificationMessageArrived: ${Gson().toJson(msg)}")
|
||||||
|
if (msg!!.intentUri != null) {
|
||||||
|
try {
|
||||||
|
val intent = Intent.parseUri(msg.intentUri, Intent.URI_INTENT_SCHEME)
|
||||||
|
RxBus.defaultInstance.post(PushMessageEvent(intent.getStringExtra("payload") ?: "", 2))
|
||||||
|
} catch (e: URISyntaxException) {
|
||||||
|
L.d(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通知点击,只有个推通道下发的通知会回调此方法
|
||||||
|
override fun onNotificationMessageClicked(context: Context?, msg: GTNotificationMessage?) {
|
||||||
|
L.d("PushIntentService---onNotificationMessageClicked: ${Gson().toJson(msg)}")
|
||||||
|
if (msg!!.intentUri != null) {
|
||||||
|
try {
|
||||||
|
val intent = Intent.parseUri(msg.intentUri, Intent.URI_INTENT_SCHEME)
|
||||||
|
startActivity(intent)
|
||||||
|
} catch (e: URISyntaxException) {
|
||||||
|
L.d(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.cheng.blzb.service
|
||||||
|
|
||||||
|
import com.igexin.sdk.PushService
|
||||||
|
|
||||||
|
class PushMessageService: PushService() {
|
||||||
|
}
|
||||||
|
|
@ -28,6 +28,7 @@ import com.g.gysdk.GyCallBack
|
||||||
import com.g.gysdk.GyConfig
|
import com.g.gysdk.GyConfig
|
||||||
import com.gyf.immersionbar.BarHide
|
import com.gyf.immersionbar.BarHide
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
|
import com.igexin.sdk.PushManager
|
||||||
import com.umeng.analytics.MobclickAgent
|
import com.umeng.analytics.MobclickAgent
|
||||||
import com.umeng.commonsdk.UMConfigure
|
import com.umeng.commonsdk.UMConfigure
|
||||||
import org.jetbrains.anko.startActivity
|
import org.jetbrains.anko.startActivity
|
||||||
|
|
@ -170,6 +171,9 @@ class LauncherActivity : BaseActivity() {
|
||||||
L.d("TAG-->>GYManager ePreLogin onFailed =${gyResponse.code}")
|
L.d("TAG-->>GYManager ePreLogin onFailed =${gyResponse.code}")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
PushManager.getInstance().preInit(this)
|
||||||
|
PushManager.getInstance().initialize(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("UnsafeOptInUsageError")
|
@SuppressLint("UnsafeOptInUsageError")
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ class MyGoodsFragment: BaseFragment<FragmentMyGoodsBinding, MyGoodsViewModel>()
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.btn_view -> {
|
R.id.btn_view -> {
|
||||||
PublicActivity.start(requireActivity(), MerchantGoodsDetailFragment::class.java, Pair("item", item))
|
PublicActivity.start(requireActivity(), MerchantGoodsDetailFragment::class.java, Pair("id", item.id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import com.cheng.blzb.common.EventConstants
|
||||||
import com.cheng.blzb.databinding.FragmentHomeBinding
|
import com.cheng.blzb.databinding.FragmentHomeBinding
|
||||||
import com.cheng.blzb.event.HomeRefreshEvent
|
import com.cheng.blzb.event.HomeRefreshEvent
|
||||||
import com.cheng.blzb.manager.EventReportManager
|
import com.cheng.blzb.manager.EventReportManager
|
||||||
|
import com.cheng.blzb.manager.NotificationHelper
|
||||||
import com.cheng.blzb.manager.SearchHistoryManager
|
import com.cheng.blzb.manager.SearchHistoryManager
|
||||||
import com.cheng.blzb.manager.UserConfigManager
|
import com.cheng.blzb.manager.UserConfigManager
|
||||||
import com.cheng.blzb.ui.activity.PublicActivity
|
import com.cheng.blzb.ui.activity.PublicActivity
|
||||||
|
|
@ -22,6 +23,7 @@ import com.cheng.blzb.ui.fragment.home.zzdb.ZZDBFragment
|
||||||
import com.cheng.blzb.ui.fragment.mine.vip.VipFragment
|
import com.cheng.blzb.ui.fragment.mine.vip.VipFragment
|
||||||
import com.cheng.blzb.ui.fragment.search.SearchFragment
|
import com.cheng.blzb.ui.fragment.search.SearchFragment
|
||||||
import com.cheng.blzb.ui.fragment.search.list.SearchListFragment
|
import com.cheng.blzb.ui.fragment.search.list.SearchListFragment
|
||||||
|
import com.cheng.blzb.utils.PermissionUtils
|
||||||
import com.example.base.common.RxBus
|
import com.example.base.common.RxBus
|
||||||
import com.example.base.decoration.GridSpaceItemDecoration
|
import com.example.base.decoration.GridSpaceItemDecoration
|
||||||
import com.example.base.decoration.SpacesItemDecoration
|
import com.example.base.decoration.SpacesItemDecoration
|
||||||
|
|
@ -29,6 +31,7 @@ import com.example.base.extensions.getColor
|
||||||
import com.example.base.extensions.onClick
|
import com.example.base.extensions.onClick
|
||||||
import com.example.base.ui.list.ListFragment
|
import com.example.base.ui.list.ListFragment
|
||||||
import com.example.base.utils.DensityUtils
|
import com.example.base.utils.DensityUtils
|
||||||
|
import com.example.base.utils.MMKVUtils
|
||||||
import com.example.base.utils.SpanUtils
|
import com.example.base.utils.SpanUtils
|
||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
@ -60,6 +63,14 @@ class HomeFragment : ListFragment<FragmentHomeBinding, HomeViewModel, BidItemEnt
|
||||||
|
|
||||||
binding.rvHotKeyword.adapter = keywordAdapter
|
binding.rvHotKeyword.adapter = keywordAdapter
|
||||||
binding.rvHotKeyword.addItemDecoration(SpacesItemDecoration(DensityUtils.dp2px(8f), HORIZONTAL))
|
binding.rvHotKeyword.addItemDecoration(SpacesItemDecoration(DensityUtils.dp2px(8f), HORIZONTAL))
|
||||||
|
|
||||||
|
NotificationHelper.createDefaultChannel()
|
||||||
|
if (MMKVUtils.getBoolean("request_notification_permission", true)) {
|
||||||
|
PermissionUtils.checkNotificationPermission(requireActivity()) { isGranted ->
|
||||||
|
if (!isGranted) NotificationHelper.showDisabledTip(requireActivity(), childFragmentManager)
|
||||||
|
MMKVUtils.put("request_notification_permission", false)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initData() {
|
override fun initData() {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import android.text.TextUtils
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
|
import androidx.fragment.app.FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
|
||||||
import com.cheng.blzb.R
|
import com.cheng.blzb.R
|
||||||
|
import com.cheng.blzb.bean.PushPayloadEntity
|
||||||
|
import com.cheng.blzb.common.AppUpdate
|
||||||
import com.cheng.blzb.common.EventConstants
|
import com.cheng.blzb.common.EventConstants
|
||||||
import com.cheng.blzb.databinding.FragmentMainBinding
|
import com.cheng.blzb.databinding.FragmentMainBinding
|
||||||
import com.cheng.blzb.event.HomeRefreshEvent
|
import com.cheng.blzb.event.HomeRefreshEvent
|
||||||
|
|
@ -18,8 +20,10 @@ import com.cheng.blzb.ui.activity.PublicActivity
|
||||||
import com.cheng.blzb.ui.base.BasePageAdapter
|
import com.cheng.blzb.ui.base.BasePageAdapter
|
||||||
import com.cheng.blzb.ui.dialog.PublishBidDialog
|
import com.cheng.blzb.ui.dialog.PublishBidDialog
|
||||||
import com.cheng.blzb.ui.dialog.VipLoginTipDialog
|
import com.cheng.blzb.ui.dialog.VipLoginTipDialog
|
||||||
|
import com.cheng.blzb.ui.fragment.bid.detail.BidDetailFragment
|
||||||
import com.cheng.blzb.ui.fragment.home.HomeFragment
|
import com.cheng.blzb.ui.fragment.home.HomeFragment
|
||||||
import com.cheng.blzb.ui.fragment.merchant.MerchantFragment
|
import com.cheng.blzb.ui.fragment.merchant.MerchantFragment
|
||||||
|
import com.cheng.blzb.ui.fragment.merchant.detail.MerchantGoodsDetailFragment
|
||||||
import com.cheng.blzb.ui.fragment.mine.MineFragment
|
import com.cheng.blzb.ui.fragment.mine.MineFragment
|
||||||
import com.cheng.blzb.ui.fragment.mine.coupon.CouponFragment
|
import com.cheng.blzb.ui.fragment.mine.coupon.CouponFragment
|
||||||
import com.cheng.blzb.ui.fragment.mine.vip.VipFragment
|
import com.cheng.blzb.ui.fragment.mine.vip.VipFragment
|
||||||
|
|
@ -153,7 +157,7 @@ class MainFragment : BaseFragment<FragmentMainBinding, MainViewModel>() {
|
||||||
|
|
||||||
val pushMessageEvent = RxBus.defaultInstance.toObservable(PushMessageEvent::class.java).subscribe {
|
val pushMessageEvent = RxBus.defaultInstance.toObservable(PushMessageEvent::class.java).subscribe {
|
||||||
if (!TextUtils.isEmpty(it.payload)) {
|
if (!TextUtils.isEmpty(it.payload)) {
|
||||||
val payload = Gson().fromJson(it.payload, com.cheng.blzb.bean.PushPayloadEntity::class.java)
|
val payload = Gson().fromJson(it.payload, PushPayloadEntity::class.java)
|
||||||
if (it.type == 3) handlePushMessage(payload)
|
if (it.type == 3) handlePushMessage(payload)
|
||||||
mViewModel.reportPushReceipt(payload.msgId, "${it.type}")
|
mViewModel.reportPushReceipt(payload.msgId, "${it.type}")
|
||||||
}
|
}
|
||||||
|
|
@ -161,7 +165,7 @@ class MainFragment : BaseFragment<FragmentMainBinding, MainViewModel>() {
|
||||||
addDisposable(pushMessageEvent)
|
addDisposable(pushMessageEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handlePushMessage(payloadEntity: com.cheng.blzb.bean.PushPayloadEntity) {
|
private fun handlePushMessage(payloadEntity: PushPayloadEntity) {
|
||||||
if (TextUtils.isEmpty(payloadEntity.page)) return
|
if (TextUtils.isEmpty(payloadEntity.page)) return
|
||||||
when (payloadEntity.page) {
|
when (payloadEntity.page) {
|
||||||
"member_recharge" -> {
|
"member_recharge" -> {
|
||||||
|
|
@ -169,7 +173,30 @@ class MainFragment : BaseFragment<FragmentMainBinding, MainViewModel>() {
|
||||||
requireContext(),
|
requireContext(),
|
||||||
VipFragment::class.java,
|
VipFragment::class.java,
|
||||||
Pair("origin", parseData("source", payloadEntity.params)),
|
Pair("origin", parseData("source", payloadEntity.params)),
|
||||||
// Pair("goodsType", parseData("type", payloadEntity.params))
|
Pair("goodsType", parseData("type", payloadEntity.params))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
"bid_info" -> {
|
||||||
|
val bidId = parseData("bid_info_id", payloadEntity.params)
|
||||||
|
if (TextUtils.isEmpty(bidId)) {
|
||||||
|
toast("标讯id为空")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
PublicActivity.start(requireActivity(),
|
||||||
|
BidDetailFragment::class.java,
|
||||||
|
Pair("source", parseData("source", payloadEntity.params)),
|
||||||
|
Pair("goodsType", parseData("type", payloadEntity.params)),
|
||||||
|
Pair("info_source", parseData("info_source", payloadEntity.params)),
|
||||||
|
Pair("id", bidId),
|
||||||
|
Pair("origin", "push")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
"goods_details" -> {
|
||||||
|
PublicActivity.start(requireActivity(),
|
||||||
|
MerchantGoodsDetailFragment::class.java,
|
||||||
|
Pair("id", parseData("goods_id", payloadEntity.params))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -191,6 +218,6 @@ class MainFragment : BaseFragment<FragmentMainBinding, MainViewModel>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkVersion() {
|
private fun checkVersion() {
|
||||||
com.cheng.blzb.common.AppUpdate.checkUpdate(this, false) {}
|
AppUpdate.checkUpdate(this, false) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -28,6 +28,7 @@ import com.example.base.utils.SpanUtils
|
||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
|
|
||||||
class MerchantGoodsDetailFragment : BaseFragment<FragmentMerchantGoodsDetailBinding, MerchantGoodsDetailViewModel>() {
|
class MerchantGoodsDetailFragment : BaseFragment<FragmentMerchantGoodsDetailBinding, MerchantGoodsDetailViewModel>() {
|
||||||
|
private val id by lazy { arguments?.getString("id") ?: "" }
|
||||||
private var goodsInfo: MerchantGoodsEntity? = null
|
private var goodsInfo: MerchantGoodsEntity? = null
|
||||||
|
|
||||||
private val contactsAdapter by lazy { MerchantContactsAdapter() }
|
private val contactsAdapter by lazy { MerchantContactsAdapter() }
|
||||||
|
|
@ -60,9 +61,13 @@ class MerchantGoodsDetailFragment : BaseFragment<FragmentMerchantGoodsDetailBind
|
||||||
} else {
|
} else {
|
||||||
arguments?.getSerializable("item") as? MerchantGoodsEntity
|
arguments?.getSerializable("item") as? MerchantGoodsEntity
|
||||||
}
|
}
|
||||||
setData()
|
if (goodsInfo != null) {
|
||||||
mViewModel.sendAuth()
|
setData()
|
||||||
EventReportManager.eventReport(EventConstants.JUMP_TO_GOODS_DETAIL, "", "{\"id\": ${goodsInfo?.id}}")
|
EventReportManager.eventReport(EventConstants.JUMP_TO_GOODS_DETAIL, "", "{\"id\": ${goodsInfo!!.id}}")
|
||||||
|
} else {
|
||||||
|
mViewModel.getGoodsInfo(id)
|
||||||
|
EventReportManager.eventReport(EventConstants.JUMP_TO_GOODS_DETAIL, "", "{\"id\": ${id}}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initListener() {
|
override fun initListener() {
|
||||||
|
|
@ -72,6 +77,7 @@ class MerchantGoodsDetailFragment : BaseFragment<FragmentMerchantGoodsDetailBind
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
override fun onPageSelected(position: Int) {
|
override fun onPageSelected(position: Int) {
|
||||||
super.onPageSelected(position)
|
super.onPageSelected(position)
|
||||||
binding.tvIndicator.text = "${position + 1}/${imageAdapter.data.size}"
|
binding.tvIndicator.text = "${position + 1}/${imageAdapter.data.size}"
|
||||||
|
|
@ -96,6 +102,10 @@ class MerchantGoodsDetailFragment : BaseFragment<FragmentMerchantGoodsDetailBind
|
||||||
|
|
||||||
override fun initObserve() {
|
override fun initObserve() {
|
||||||
super.initObserve()
|
super.initObserve()
|
||||||
|
mViewModel.infoLiveData.observe(this) {
|
||||||
|
goodsInfo = it
|
||||||
|
setData()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
|
|
@ -146,6 +156,8 @@ class MerchantGoodsDetailFragment : BaseFragment<FragmentMerchantGoodsDetailBind
|
||||||
|
|
||||||
binding.tvLocation.text = if (TextUtils.isEmpty(goodsInfo!!.city_name)) "全国" else goodsInfo!!.city_name
|
binding.tvLocation.text = if (TextUtils.isEmpty(goodsInfo!!.city_name)) "全国" else goodsInfo!!.city_name
|
||||||
binding.tvViewCount.text = "已浏览 ${if (!TextUtils.isEmpty(goodsInfo!!.view_count)) goodsInfo!!.view_count else 0}"
|
binding.tvViewCount.text = "已浏览 ${if (!TextUtils.isEmpty(goodsInfo!!.view_count)) goodsInfo!!.view_count else 0}"
|
||||||
|
|
||||||
|
mViewModel.sendAuth()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,12 +1,31 @@
|
||||||
package com.cheng.blzb.ui.fragment.merchant.detail
|
package com.cheng.blzb.ui.fragment.merchant.detail
|
||||||
|
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import com.cheng.blzb.bean.MerchantGoodsEntity
|
||||||
import com.cheng.blzb.net.ApiFactory
|
import com.cheng.blzb.net.ApiFactory
|
||||||
|
import com.example.base.extensions.toast
|
||||||
import com.example.base.utils.L
|
import com.example.base.utils.L
|
||||||
import com.example.base.viewmodel.BaseViewModel
|
import com.example.base.viewmodel.BaseViewModel
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
|
|
||||||
class MerchantGoodsDetailViewModel: BaseViewModel() {
|
class MerchantGoodsDetailViewModel: BaseViewModel() {
|
||||||
|
val infoLiveData = MutableLiveData<MerchantGoodsEntity>()
|
||||||
|
|
||||||
|
fun getGoodsInfo(id: String) {
|
||||||
|
showDialog()
|
||||||
|
launchOnUiTryCatch({
|
||||||
|
val response = ApiFactory.apiService.getGoodsInfo(id)
|
||||||
|
if (response.status) {
|
||||||
|
infoLiveData.postValue(response.data)
|
||||||
|
} else toast(response.message, true)
|
||||||
|
dismissDialog()
|
||||||
|
}, {
|
||||||
|
dismissDialog()
|
||||||
|
setError(it)
|
||||||
|
L.d(it)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fun sendAuth() {
|
fun sendAuth() {
|
||||||
launchOnUiTryCatch({
|
launchOnUiTryCatch({
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ class MerchantGoodsListFragment : ListFragment<FragmentMerchantGoodsListBinding,
|
||||||
super.initObserve()
|
super.initObserve()
|
||||||
mViewModel.authLiveData.observe(this) {
|
mViewModel.authLiveData.observe(this) {
|
||||||
if (it.auth) {
|
if (it.auth) {
|
||||||
PublicActivity.start(requireActivity(), MerchantGoodsDetailFragment::class.java, Pair("item", item))
|
PublicActivity.start(requireActivity(), MerchantGoodsDetailFragment::class.java, Pair("id", item!!.id))
|
||||||
} else {
|
} else {
|
||||||
PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_goods"))
|
PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_goods"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,11 @@ class CompanyAuthFragment : BaseFragment<FragmentCompanyAuthBinding, CompanyAuth
|
||||||
mViewModel.getCompanyInfo()
|
mViewModel.getCompanyInfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
mViewModel.userInfo()
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("NotifyDataSetChanged")
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
override fun initListener() {
|
override fun initListener() {
|
||||||
super.initListener()
|
super.initListener()
|
||||||
|
|
@ -162,6 +167,10 @@ class CompanyAuthFragment : BaseFragment<FragmentCompanyAuthBinding, CompanyAuth
|
||||||
|
|
||||||
override fun initObserve() {
|
override fun initObserve() {
|
||||||
super.initObserve()
|
super.initObserve()
|
||||||
|
mViewModel.userInfoLiveData.observe(this) {
|
||||||
|
UserConfigManager.userInfoLiveData.postValue(it)
|
||||||
|
}
|
||||||
|
|
||||||
mViewModel.addLiveData.observe(this) {
|
mViewModel.addLiveData.observe(this) {
|
||||||
toast("提交成功")
|
toast("提交成功")
|
||||||
requireActivity().finish()
|
requireActivity().finish()
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import android.content.Context
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import com.cheng.blzb.bean.CompanyEntity
|
import com.cheng.blzb.bean.CompanyEntity
|
||||||
import com.cheng.blzb.bean.UploadFileEntity
|
import com.cheng.blzb.bean.UploadFileEntity
|
||||||
|
import com.cheng.blzb.bean.UserEntity
|
||||||
import com.cheng.blzb.net.ApiFactory
|
import com.cheng.blzb.net.ApiFactory
|
||||||
import com.cheng.blzb.utils.BitmapUtils
|
import com.cheng.blzb.utils.BitmapUtils
|
||||||
import com.example.base.extensions.toast
|
import com.example.base.extensions.toast
|
||||||
|
|
@ -14,10 +15,26 @@ import okhttp3.MultipartBody
|
||||||
import okhttp3.RequestBody
|
import okhttp3.RequestBody
|
||||||
|
|
||||||
class CompanyAuthViewModel: BaseViewModel() {
|
class CompanyAuthViewModel: BaseViewModel() {
|
||||||
|
val userInfoLiveData = MutableLiveData<UserEntity>()
|
||||||
val companyLiveData = MutableLiveData<CompanyEntity>()
|
val companyLiveData = MutableLiveData<CompanyEntity>()
|
||||||
val addLiveData = MutableLiveData<Any>()
|
val addLiveData = MutableLiveData<Any>()
|
||||||
val imageLiveData = MutableLiveData<UploadFileEntity>()
|
val imageLiveData = MutableLiveData<UploadFileEntity>()
|
||||||
|
|
||||||
|
fun userInfo() {
|
||||||
|
showDialog()
|
||||||
|
launchOnUiTryCatch({
|
||||||
|
val response = ApiFactory.apiService.userInfo()
|
||||||
|
if (response.status) {
|
||||||
|
userInfoLiveData.postValue(response.data)
|
||||||
|
} else toast(response.message, true)
|
||||||
|
dismissDialog()
|
||||||
|
}, {
|
||||||
|
dismissDialog()
|
||||||
|
setError(it)
|
||||||
|
L.d(it)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fun getCompanyInfo() {
|
fun getCompanyInfo() {
|
||||||
showDialog()
|
showDialog()
|
||||||
launchOnUiTryCatch({
|
launchOnUiTryCatch({
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
buildscript {
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.android.tools.build:gradle:8.0'
|
||||||
|
// 增加AGC插件配置,请您参见AGC插件依赖关系选择合适的AGC插件版本。
|
||||||
|
classpath 'com.huawei.agconnect:agcp:1.9.1.300'
|
||||||
|
}
|
||||||
|
}
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.androidApplication) apply false
|
alias(libs.plugins.androidApplication) apply false
|
||||||
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
|
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue