diff --git a/app/src/main/java/com/gh/base/GHUmengNotificationService.kt b/app/src/main/java/com/gh/base/GHUmengNotificationService.kt index da079301f1..c06e6d7f62 100644 --- a/app/src/main/java/com/gh/base/GHUmengNotificationService.kt +++ b/app/src/main/java/com/gh/base/GHUmengNotificationService.kt @@ -9,12 +9,12 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.preference.PreferenceManager -import androidx.core.app.NotificationCompat import android.text.TextUtils import android.view.View +import androidx.core.app.NotificationCompat import com.gh.common.notifier.Notifier -import com.gh.common.util.DataUtils import com.gh.common.util.EntranceUtils +import com.gh.common.util.MtaHelper import com.gh.common.util.StringUtils import com.gh.common.util.toObject import com.gh.gamecenter.R @@ -55,6 +55,7 @@ class GHUmengNotificationService : UmengMessageService() { const val DISPLAY_TYPE_NOTIFICATION = "notification" const val DISPLAY_TYPE_CUSTOM = "custom" const val MESSAGE_ID = "message_id" + const val NOTIFICATION_MESSAGE_ID = "notification_message_id" // 通知中心消息 ID const val PUSH_ID = "push_id" } @@ -89,6 +90,7 @@ class GHUmengNotificationService : UmengMessageService() { intent.putExtra(EntranceUtils.KEY_DATA, data?.link) intent.putExtra(EntranceUtils.KEY_TYPE, UmengMessageReceiver.DIRECT_ONLY) intent.putExtra(EntranceUtils.KEY_MESSAGE, message) + intent.putExtra(NOTIFICATION_MESSAGE_ID, data?.messageId) context.sendBroadcast(intent) return } @@ -108,6 +110,7 @@ class GHUmengNotificationService : UmengMessageService() { clickIntent.putExtra(EntranceUtils.KEY_MESSAGE, message) clickIntent.putExtra(MESSAGE_ID, msg?.msgId) clickIntent.putExtra(PUSH_ID, data?.pushId) + clickIntent.putExtra(NOTIFICATION_MESSAGE_ID, data?.messageId) clickIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_CLICK) removeIntent.setClass(context, UmengMessageReceiver::class.java) @@ -158,19 +161,20 @@ class GHUmengNotificationService : UmengMessageService() { .setText(displayText) .setDuration(5000) .setIcon(data?.userEntity?.icon) - .setOnClickListener(View.OnClickListener { _ -> + .setOnClickListener(View.OnClickListener { 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) - DataUtils.onMtaEvent(context, "消息弹窗", type, "Does not contains any parameter.") + MtaHelper.onEvent("消息弹窗", type, "Does not contains any parameter.") // 标记已读 val jsonObject = JSONObject() jsonObject.put("type", type) val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) + RetrofitManager.getInstance(application).api.postMessageRead(UserManager.getInstance().userId, data?.id, body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -184,7 +188,6 @@ class GHUmengNotificationService : UmengMessageService() { e?.printStackTrace() } }) - Notifier.hide() }) .show(false) diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index c181c952e7..1b1f38d9d9 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -40,6 +40,7 @@ public class EntranceUtils { public static final String HOST_QUESTION = "question"; public static final String KEY_DATA = "data"; public static final String KEY_MESSAGE = "message"; + public static final String KEY_MESSAGE_ID = "message_id"; public static final String KEY_TYPE = "type"; public static final String KEY_LINK = "link"; public static final String KEY_NAME = "name"; diff --git a/app/src/main/java/com/gh/common/util/PushHelper.kt b/app/src/main/java/com/gh/common/util/PushHelper.kt index 9593df8a25..5f45f082c7 100644 --- a/app/src/main/java/com/gh/common/util/PushHelper.kt +++ b/app/src/main/java/com/gh/common/util/PushHelper.kt @@ -1,19 +1,26 @@ package com.gh.common.util +import android.annotation.SuppressLint import android.content.Context +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.message.MessageUnreadRepository import com.gh.gamecenter.receiver.UmengMessageReceiver import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import io.reactivex.schedulers.Schedulers import okhttp3.MediaType import okhttp3.RequestBody import okhttp3.ResponseBody +import org.json.JSONObject +import retrofit2.HttpException object PushHelper { /** * 提交推送点击事件,会尝试从 SP 读取之前失败的一并提交 */ + @SuppressLint("CheckResult") @JvmStatic fun postPushClickAction(context: Context, clickEvent: UmengMessageReceiver.ClickEvent? = null) { val clickEventList = arrayListOf() @@ -44,4 +51,32 @@ object PushHelper { } }) } + + + /** + * 将消息中心的消息标记为已读 + * [type] 跳转类型 + * [notificationMessageId] 通知中心 ID + */ + fun setNotificationMessageRead(context: Context, type: String, notificationMessageId: String) { + + val jsonObject = JSONObject() + jsonObject.put("type", type) + val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) + + RetrofitManager.getInstance(context) + .api + .postMessageRead(UserManager.getInstance().userId, notificationMessageId, body) + .subscribeOn(Schedulers.io()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + MessageUnreadRepository.loadMessageUnreadData() + } + + override fun onFailure(e: HttpException?) { + e?.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/PushNotificationEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PushNotificationEntity.kt index d98852deec..9ff27596f5 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PushNotificationEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PushNotificationEntity.kt @@ -4,6 +4,7 @@ import android.os.Parcelable import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize +// 相关文档可见 https://gitlab.ghzs.com/halo/halo-api/wikis/push#%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81 data class PushNotificationEntity( @SerializedName("display_type") var displayType: String = "", @@ -34,6 +35,8 @@ data class PushNotificationEntity( @SerializedName("push_id") var pushId: String? = "", var condition: Condition? = null, + @SerializedName("message_id") + var messageId: String? = "", var link: Link? = null) { @Parcelize diff --git a/app/src/main/java/com/gh/gamecenter/receiver/UmengMessageReceiver.kt b/app/src/main/java/com/gh/gamecenter/receiver/UmengMessageReceiver.kt index e3505066cd..80be751f0b 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/UmengMessageReceiver.kt +++ b/app/src/main/java/com/gh/gamecenter/receiver/UmengMessageReceiver.kt @@ -29,13 +29,13 @@ class UmengMessageReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val type: String? = intent.getStringExtra(EntranceUtils.KEY_TYPE) val messageString = intent.getStringExtra(EntranceUtils.KEY_MESSAGE) + val notificationMessageId = intent.getStringExtra(GHUmengNotificationService.NOTIFICATION_MESSAGE_ID) val msgObject = UMessage(JSONObject(messageString)) when (type) { TYPE_CLICK -> { val link: PushNotificationEntity.Data.Link? = intent.getParcelableExtra(EntranceUtils.KEY_DATA) - if (link == null || link.target == "system") { jumpToHaloOfficialNotificationPage(context) } else { @@ -53,6 +53,11 @@ class UmengMessageReceiver : BroadcastReceiver() { msg_id = msgId, push_id = pushId)) } + + // 记录消息中心的那条消息已读(已被点击) + if (!notificationMessageId.isNullOrEmpty()) { + postMessageReadAction(context, link?.type ?: "", notificationMessageId) + } } TYPE_REMOVE -> { @@ -67,6 +72,11 @@ class UmengMessageReceiver : BroadcastReceiver() { } else { jumpToSpecificPage(context, link) } + + // 记录消息中心的那条消息已读(已被点击) + if (!notificationMessageId.isNullOrEmpty()) { + postMessageReadAction(context, link?.type ?: "", notificationMessageId) + } } } } @@ -75,6 +85,10 @@ class UmengMessageReceiver : BroadcastReceiver() { PushHelper.postPushClickAction(context, clickEvent) } + private fun postMessageReadAction(context: Context, type: String, notificationMessageId: String) { + PushHelper.setNotificationMessageRead(context, type, notificationMessageId) + } + private fun jumpToHaloOfficialNotificationPage(context: Context) { DirectUtils.directToOfficialNotification(context, EntranceUtils.ENTRANCE_UMENG) } @@ -100,7 +114,8 @@ class UmengMessageReceiver : BroadcastReceiver() { DirectUtils.directToWebView(context, link.target!!, EntranceUtils.ENTRANCE_UMENG) } EntranceUtils.HOST_COMMUNITY_ARTICLE -> { - DirectUtils.directToCommunityArticle(context, link.target!!, link.community?.id ?: "", EntranceUtils.ENTRANCE_UMENG) + DirectUtils.directToCommunityArticle(context, link.target!!, link.community?.id + ?: "", EntranceUtils.ENTRANCE_UMENG) } } } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 147bf03d4d..67c8901a1c 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -1263,6 +1263,9 @@ public interface ApiService { @POST("users/{user_id}/im:ending") Observable postImEnding(@Path("user_id") String userId); + /** + * 将消息标记为已读 + */ @POST("users/{user_id}/messages/{message_id}:read") Observable postMessageRead(@Path("user_id") String userId, @Path("message_id") String messageId, @Body RequestBody body); @@ -1801,9 +1804,15 @@ public interface ApiService { @GET("games/{game_id}/comments/{comment_id}/update_logs") Single> getGameCommentLogs(@Path("game_id") String gameId, @Path("comment_id") String commentId); + /** + * 获取具有相应标签的游戏列表 + */ @GET("games?view=digest") Single> getGamesWithSpecificTag(@Query("filter") String filter, @Query("sort") String sort, @Query("page") int page); + /** + * 获取相关游戏标签列表 + */ @GET("games/tags") Single> getRelatedTags(@Query("filter") String filter); } \ No newline at end of file