187 lines
7.3 KiB
Kotlin
187 lines
7.3 KiB
Kotlin
package com.gh.base
|
|
|
|
import android.app.Notification
|
|
import android.app.NotificationChannel
|
|
import android.app.NotificationManager
|
|
import android.app.PendingIntent
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.os.Build
|
|
import android.os.Bundle
|
|
import android.preference.PreferenceManager
|
|
import android.support.v4.app.NotificationCompat
|
|
import android.text.TextUtils
|
|
import android.view.View
|
|
import com.gh.common.notifier.Notifier
|
|
import com.gh.common.util.EntranceUtils
|
|
import com.gh.common.util.PackageUtils
|
|
import com.gh.common.util.StringUtils
|
|
import com.gh.gamecenter.BuildConfig
|
|
import com.gh.gamecenter.R
|
|
import com.gh.gamecenter.entity.PushEntity
|
|
import com.gh.gamecenter.entity.PushMessageEntity
|
|
import com.gh.gamecenter.entity.PushMessageUnreadEntity
|
|
import com.gh.gamecenter.entity.PushNotificationEntity
|
|
import com.gh.gamecenter.message.MessageUnreadRepository
|
|
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
|
|
import com.google.gson.Gson
|
|
import com.halo.assistant.HaloApp
|
|
import com.umeng.message.UmengMessageService
|
|
import org.android.agoo.common.AgooConstants
|
|
import java.util.*
|
|
|
|
class GHUmengNotificationService : UmengMessageService() {
|
|
|
|
companion object {
|
|
const val ACTION_UMENG = "com.gh.gamecenter.UMENG"
|
|
|
|
const val HALO_MESSAGE_DIALOG = "HALO_MESSAGE_DIALOG"
|
|
|
|
const val HALO_MESSAGE_CENTER = "HALO_MESSAGE_CENTER"
|
|
|
|
const val ANSWER = "answer"
|
|
|
|
const val FOLLOW_QUESTION = "follow_question"
|
|
|
|
const val NOTIFICATION_ID = 2015
|
|
|
|
const val DISPLAY_TYPE_NOTIFICATION = "notification"
|
|
|
|
const val DISPLAY_TYPE_CUSTOM = "custom"
|
|
}
|
|
|
|
val notificationTags = arrayOf("GH_UMENG_TAG_1", "GH_UMENG_TAG_2", "GH_UMENG_TAG_3")
|
|
val gson = Gson()
|
|
|
|
override fun onMessage(context: Context, intent: Intent) {
|
|
val message = intent.getStringExtra(AgooConstants.MESSAGE_BODY)
|
|
|
|
try {
|
|
val pushData = gson.fromJson(message, PushEntity::class.java)
|
|
pushData?.let { handlePushData(context, it, message) }
|
|
} catch (e: Exception) {
|
|
e.printStackTrace()
|
|
}
|
|
}
|
|
|
|
private fun handlePushData(context: Context, pushData: PushEntity, message: String) {
|
|
val notificationManager = context.applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
|
|
if (pushData.displayType == DISPLAY_TYPE_NOTIFICATION) {
|
|
// 其它类型的透传信息
|
|
// 显示到通知栏
|
|
val msg = gson.fromJson(message, PushNotificationEntity::class.java)
|
|
val data = msg?.extra?.data
|
|
|
|
// 判断是否过滤该消息
|
|
if (validatePush(data?.condition)) {
|
|
val targetIntent = Intent(ACTION_UMENG)
|
|
|
|
targetIntent.putExtra(EntranceUtils.KEY_DATA, data?.link)
|
|
val pendingIntent = PendingIntent.getBroadcast(context, 111, // todo requestCode
|
|
targetIntent, PendingIntent.FLAG_UPDATE_CURRENT)
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
val channel = NotificationChannel("Halo_Push", "Halo_Push", NotificationManager.IMPORTANCE_DEFAULT)
|
|
notificationManager.createNotificationChannel(channel)
|
|
}
|
|
|
|
val notification = NotificationCompat.Builder(context, "Halo_Push")
|
|
.setSmallIcon(R.drawable.ic_notification)
|
|
.setTicker(pushData.body?.ticker)
|
|
.setContentTitle(pushData.body?.title)
|
|
.setContentText(pushData.body?.text)
|
|
.setContentIntent(pendingIntent)
|
|
.build()
|
|
notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL
|
|
|
|
notificationManager.notify(getNotificationTag(context), NOTIFICATION_ID, notification)
|
|
}
|
|
} else {
|
|
if (HALO_MESSAGE_DIALOG == pushData.body?.custom) {
|
|
// 回答了问题或者关注了问题的消息
|
|
val msg = gson.fromJson(message, PushMessageEntity::class.java)
|
|
val data = msg?.extra?.data
|
|
|
|
val type = if (ANSWER == data?.type) {
|
|
"回答了你的问题"
|
|
} else {
|
|
"回答了你关注的问题"
|
|
}
|
|
|
|
val userName = StringUtils.shrinkStringWithDot(data?.userEntity?.name, 8)
|
|
val displayText = userName + type
|
|
|
|
if (Notifier.isActivityValid(CurrentActivityHolder.getCurrentActivity())) {
|
|
Notifier.create(CurrentActivityHolder.getCurrentActivity())
|
|
.setText(displayText)
|
|
.setDuration(5000)
|
|
.setIcon(data?.userEntity?.icon)
|
|
.setOnClickListener(View.OnClickListener { v ->
|
|
val bundle = Bundle()
|
|
bundle.putString(EntranceUtils.KEY_ANSWER_ID, data?.answer?.id)
|
|
bundle.putString(EntranceUtils.KEY_ENTRANCE, EntranceUtils.ENTRANCE_UMENG)
|
|
bundle.putString(EntranceUtils.KEY_TO, AnswerDetailActivity::class.java.name)
|
|
EntranceUtils.jumpActivity(context, bundle)
|
|
|
|
Notifier.hide()
|
|
})
|
|
.show(true)
|
|
}
|
|
} else if (HALO_MESSAGE_CENTER == pushData.body?.custom) {
|
|
// 消息中心逻辑
|
|
val msg = gson.fromJson(message, PushMessageUnreadEntity::class.java)
|
|
val data = msg?.extra?.data
|
|
data?.let { MessageUnreadRepository.loadMessageUnreadData() }
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun validatePush(condition: PushNotificationEntity.Data.Condition?): Boolean {
|
|
if (condition == null) return true
|
|
|
|
if (condition.packageName.isNotEmpty() && condition.packageName != BuildConfig.APPLICATION_ID) {
|
|
return false
|
|
}
|
|
|
|
condition.ghzs?.channel?.let {
|
|
if (it.isNotEmpty() && condition.ghzs?.channel != HaloApp.getInstance().channel) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
condition.ghzs?.version?.let {
|
|
if (it.isNotEmpty() && condition.ghzs?.version != PackageUtils.getVersionName(HaloApp.getInstance().application)) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
/**
|
|
* 规则:最多三条消息,以旧换新
|
|
*
|
|
* @return NotificationTag
|
|
*/
|
|
private fun getNotificationTag(context: Context): String {
|
|
val sp = PreferenceManager.getDefaultSharedPreferences(context)
|
|
val edit = sp.edit()
|
|
|
|
val timeTagMap = HashMap<Long, String>()
|
|
for (tag in notificationTags) {
|
|
val time = sp.getLong(tag, 0)
|
|
if (time == 0L) {
|
|
edit.putLong(tag, System.currentTimeMillis()).apply()
|
|
return tag
|
|
} else {
|
|
timeTagMap[time] = tag
|
|
}
|
|
}
|
|
|
|
val minTime = Collections.min(timeTagMap.keys)
|
|
val tag = timeTagMap[minTime]
|
|
edit.putLong(tag, System.currentTimeMillis()).apply()
|
|
return if (TextUtils.isEmpty(tag)) notificationTags[0] else tag!!
|
|
}
|
|
} |