Kaynağa Gözat

feat: 应用签名

DoggyZhang 3 ay önce
ebeveyn
işleme
5d9357f568

+ 12 - 0
app/src/main/java/com/adealink/weparty/module/profile/IProfileService.kt

@@ -36,6 +36,18 @@ interface IProfileService : IService<IProfileService> {
         attrSet: Set<UserConfigType>? = NECESSARY_USER_ATTR_SET,
     ): Rlt<Map<String, UserInfo>>
 
+    fun isUserOnline(uid: String): Boolean
+
+    suspend fun isUserOnline(
+        uid: String,
+        cache: Boolean = true,
+    ): Rlt<Boolean>
+
+    suspend fun isUserOnline(
+        uidSet: Set<String>,
+        cache: Boolean = true,
+    ): Rlt<Map<String, Boolean>>
+
 
     fun getProfileViewModel(owner: ViewModelStoreOwner): IProfileViewModel?
 

+ 39 - 2
app/src/main/java/com/adealink/weparty/module/profile/ProfileModule.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.module.profile
 
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.BaseDynamicModule
+import com.adealink.frame.aab.constant.AABModuleNotInitError
 import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.weparty.R
@@ -53,7 +54,7 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
                 cache: Boolean,
                 attrSet: Set<UserConfigType>?,
             ): Rlt<UserInfo> {
-                return Rlt.Failed(IError())
+                return Rlt.Failed(AABModuleNotInitError())
             }
 
             override suspend fun getUsersInfoByUid(
@@ -61,7 +62,25 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
                 cache: Boolean,
                 attrSet: Set<UserConfigType>?,
             ): Rlt<Map<String, UserInfo>> {
-                return Rlt.Failed(IError())
+                return Rlt.Failed(AABModuleNotInitError())
+            }
+
+            override fun isUserOnline(uid: String): Boolean {
+                return false
+            }
+
+            override suspend fun isUserOnline(
+                uid: String,
+                cache: Boolean
+            ): Rlt<Boolean> {
+                return Rlt.Failed(AABModuleNotInitError())
+            }
+
+            override suspend fun isUserOnline(
+                uidSet: Set<String>,
+                cache: Boolean
+            ): Rlt<Map<String, Boolean>> {
+                return Rlt.Failed(AABModuleNotInitError())
             }
 
             override fun getProfileViewModel(owner: ViewModelStoreOwner): IProfileViewModel? {
@@ -122,6 +141,24 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
         return getService().getUsersInfoByUid(uidSet, cache, attrSet)
     }
 
+    override fun isUserOnline(uid: String): Boolean {
+        return getService().isUserOnline(uid)
+    }
+
+    override suspend fun isUserOnline(
+        uid: String,
+        cache: Boolean
+    ): Rlt<Boolean> {
+        return getService().isUserOnline(uid, cache)
+    }
+
+    override suspend fun isUserOnline(
+        uidSet: Set<String>,
+        cache: Boolean
+    ): Rlt<Map<String, Boolean>> {
+        return getService().isUserOnline(uidSet, cache)
+    }
+
     override fun getProfileViewModel(owner: ViewModelStoreOwner): IProfileViewModel? {
         return getService().getProfileViewModel(owner)
     }

+ 2 - 2
gradle.properties

@@ -29,8 +29,8 @@ OFFICIAL=false
 
 IS_RELEASE=true
 
-VERSION_CODE=9
-VERSION_NAME=1.0.0(ahpha 9)
+VERSION_CODE=10
+VERSION_NAME=1.0.0(ahpha 10)
 
 OFFICIAL_UID=10000
 OFFICIAL_CONVERSATION_ID=c2c_10000

BIN
keystore/release/output.zip


BIN
keystore/release/upload.jks


+ 1 - 1
module/im/src/main/java/com/adealink/weparty/im/list/SessionListFragment.kt

@@ -73,7 +73,7 @@ class SessionListFragment : BaseFragment(R.layout.fragment_session_list),
         binding.conversationLayout.adapter = sessionAdapter
         binding.conversationLayout.setPresenter(presenter)
         sessionListViewModel.setPresenter(presenter)
-        sessionListViewModel.setPresenter(presenter)
+        sessionListViewModel.setAdapter(sessionAdapter)
     }
 
     override fun onResume() {

+ 1 - 0
module/im/src/main/java/com/adealink/weparty/im/list/adapter/SessionListAdapter.kt

@@ -5,6 +5,7 @@ import com.adealink.weparty.im.constant.OFFICIAL_CONVERSATION_ID
 import com.adealink.weparty.im.list.adapter.data.CommonSessionListItemData
 import com.adealink.weparty.im.list.adapter.data.OfficialSessionListItem
 import com.adealink.weparty.im.list.adapter.data.SessionListItemData
+import com.adealink.weparty.module.profile.data.UserInfo
 import com.tencent.qcloud.tuikit.tuiconversation.bean.ConversationInfo
 import com.tencent.qcloud.tuikit.tuiconversation.interfaces.IConversationListAdapter
 import com.tencent.qcloud.tuikit.tuiconversation.minimalistui.interfaces.OnConversationAdapterListener

+ 1 - 4
module/im/src/main/java/com/adealink/weparty/im/list/adapter/data/SessionListData.kt

@@ -11,15 +11,12 @@ data class OfficialSessionListItem(
 ) : SessionListItemData()
 
 data class CommonSessionListItemData(
-    val data: ConversationInfo,
-    var userInfo: UserInfo? = null,
-    var isOnline: Boolean = false
+    val data: ConversationInfo
 ) : SessionListItemData() {
 
     override fun areItemsTheSame(newItem: Any): Boolean {
         val other = (newItem as? CommonSessionListItemData) ?: return false
         return data.conversationId == other.data.conversationId
-                && isOnline == other.isOnline
     }
 
     override fun areContentsTheSame(newItem: Any): Boolean {

+ 9 - 4
module/im/src/main/java/com/adealink/weparty/im/list/adapter/viewbinder/SessionListItemViewBinder.kt

@@ -12,6 +12,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.im.databinding.LayoutSessionListItemBinding
 import com.adealink.weparty.im.list.adapter.data.CommonSessionListItemData
+import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.util.formatTimeStr
 import com.tencent.qcloud.tuikit.tuiconversation.bean.DraftInfo
 import com.tencent.qcloud.tuikit.tuiconversation.minimalistui.interfaces.OnConversationAdapterListener
@@ -31,12 +32,16 @@ class SessionListItemViewBinder(
         holder.binding.root.onClick {
             listener.onItemClick(it, item.data.type, item.data)
         }
-        holder.binding.ivAvatar.setImageUrl(item.userInfo?.avatar)
+
+        val uid = item.data.id
+        val userInfo = ProfileModule.getCacheUserInfo(uid)
+        holder.binding.ivAvatar.setImageUrl(userInfo?.avatar)
         holder.binding.ivAvatar.onClick {
-            onAvatarClick.invoke(item.data.id)
+            onAvatarClick.invoke(uid)
         }
 
-        if (item.isOnline) {
+        val online = ProfileModule.isUserOnline(uid)
+        if (online) {
             holder.binding.vOnline.show()
             holder.binding.vOnline.onStart()
         } else {
@@ -44,7 +49,7 @@ class SessionListItemViewBinder(
             holder.binding.vOnline.onStop()
         }
 
-        holder.binding.tvTitle.text = item.userInfo?.uid ?: item.data.title
+        holder.binding.tvTitle.text = userInfo?.uid ?: item.data.title
         setLastMessageAndStatus(holder, item)
 
         // TODO: 长按测试用

+ 8 - 18
module/im/src/main/java/com/adealink/weparty/im/list/viewmodel/SessionListViewModel.kt

@@ -1,14 +1,12 @@
 package com.adealink.weparty.im.list.viewmodel
 
-import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.weparty.im.list.adapter.SessionListAdapter
 import com.adealink.weparty.module.profile.ProfileModule
-import com.adealink.weparty.module.profile.data.UserInfo
 import com.tencent.qcloud.tuikit.tuiconversation.bean.ConversationInfo
 import com.tencent.qcloud.tuikit.tuiconversation.presenter.ConversationPresenter
+import kotlinx.coroutines.async
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 class SessionListViewModel : BaseViewModel() {
 
@@ -31,26 +29,18 @@ class SessionListViewModel : BaseViewModel() {
     }
 
     fun loadConversationUserInfo(dataSource: List<ConversationInfo?>?) {
-        dataSource?:return
+        dataSource ?: return
         viewModelScope.launch {
             for (info in dataSource) {
                 info ?: continue
             }
-            val dataSourceReqList = dataSource.mapNotNull { it }
-            queryUserInfo(dataSourceReqList)
-
+            val userIds = dataSource.mapNotNull { it?.id }.distinct().toSet()
+            val userInfoDef = async { ProfileModule.getUsersInfoByUid(userIds) }
+            val userOnlineDef = async { ProfileModule.isUserOnline(userIds) }
+            val userInfoMap = userInfoDef.await()
+            val userOnlineMap = userOnlineDef.await()
+            adapter?.onViewNeedRefresh()
         }
     }
 
-    private suspend fun queryUserInfo(dataSource: List<ConversationInfo>): Map<String, UserInfo>{
-        val userIds = dataSource.map { it.id }.distinct().toSet()
-        val rlt = ProfileModule.getUsersInfoByUid(userIds)
-        return emptyMap()
-    }
-
-    private suspend fun queryUserOnline(dataSource: List<ConversationInfo>): Map<String, UserInfo>{
-        // TODO: zhangfei
-        return emptyMap()
-    }
-
 }

+ 18 - 0
module/profile/src/main/java/com/adealink/weparty/profile/ProfileServiceImpl.kt

@@ -65,6 +65,24 @@ class ProfileServiceImpl : IProfileService {
         return profileManager.getUsersInfoByUid(uidSet, cache, attrSet)
     }
 
+    override fun isUserOnline(uid: String): Boolean {
+        return profileManager.isUserOnline(uid)
+    }
+
+    override suspend fun isUserOnline(
+        uid: String,
+        cache: Boolean
+    ): Rlt<Boolean> {
+        return profileManager.isUserOnline(uid, cache)
+    }
+
+    override suspend fun isUserOnline(
+        uidSet: Set<String>,
+        cache: Boolean
+    ): Rlt<Map<String, Boolean>> {
+        return profileManager.isUserOnline(uidSet, cache)
+    }
+
     override fun getProfileViewModel(owner: ViewModelStoreOwner): IProfileViewModel {
         return ViewModelProvider(owner, ProfileViewModelFactory())[ProfileViewModel::class.java]
     }

+ 13 - 0
module/profile/src/main/java/com/adealink/weparty/profile/data/ProfileData.kt

@@ -26,4 +26,17 @@ data class UpdateMyUserInfoReq(
 data class PlaymateCharmStarReq(
     @SerializedName("userNo") val uid: String,
     @SerializedName("star") val star: Float
+)
+
+data class UserOnlineReq(
+    @SerializedName("userNos") val uids: List<String>
+)
+
+data class UserOnlineRes(
+    @SerializedName("list") val list: List<UserOnlineData>
+)
+
+data class UserOnlineData(
+    @SerializedName("userNo") val userNo: String,
+    @SerializedName("online") val online: Boolean,
 )

+ 6 - 0
module/profile/src/main/java/com/adealink/weparty/profile/datasource/remote/ProfileHttpService.kt

@@ -4,6 +4,8 @@ import com.adealink.frame.base.Rlt
 import com.adealink.frame.network.data.Res
 import com.adealink.weparty.profile.data.GetUserInfosRes
 import com.adealink.weparty.profile.data.GetUserinfoReq
+import com.adealink.weparty.profile.data.UserOnlineReq
+import com.adealink.weparty.profile.data.UserOnlineRes
 import com.adealink.weparty.profile.data.MyUserInfoRes
 import com.adealink.weparty.profile.data.PlaymateCharmStarReq
 import com.adealink.weparty.profile.data.UpdateMyUserInfoReq
@@ -35,4 +37,8 @@ interface ProfileHttpService {
     ): Rlt<Res<Any>>
 
 
+    @POST("user/getUsersOnlineState")
+    suspend fun isUserOnline(
+        @Body req: UserOnlineReq
+    ): Rlt<Res<UserOnlineRes>>
 }

+ 13 - 0
module/profile/src/main/java/com/adealink/weparty/profile/manager/IProfileManager.kt

@@ -33,4 +33,17 @@ interface IProfileManager : IBaseFrame<IProfileListener> {
         attrSet: Set<UserConfigType>? = setOf(UserConfigType.USER_ATTR_BASIC),
     ): Rlt<Map<String, UserInfo>>
 
+
+    fun isUserOnline(uid: String): Boolean
+
+    suspend fun isUserOnline(
+        uid: String,
+        cache: Boolean = true,
+    ): Rlt<Boolean>
+
+    suspend fun isUserOnline(
+        uidSet: Set<String>,
+        cache: Boolean = true,
+    ): Rlt<Map<String, Boolean>>
+
 }

+ 56 - 0
module/profile/src/main/java/com/adealink/weparty/profile/manager/ProfileManager.kt

@@ -15,6 +15,7 @@ import com.adealink.weparty.module.profile.data.UserConfigType.Companion.NECESSA
 import com.adealink.weparty.module.profile.data.UserInfo
 import com.adealink.weparty.module.profile.listener.IProfileListener
 import com.adealink.weparty.profile.data.GetUserinfoReq
+import com.adealink.weparty.profile.data.UserOnlineReq
 import com.adealink.weparty.profile.datasource.remote.ProfileHttpService
 import com.adealink.weparty.storage.AppPref
 
@@ -33,6 +34,13 @@ class ProfileManager : BaseFrame<IProfileListener>(), IProfileManager {
         ) //最多缓存1000个,缓存时长10分钟
     }
 
+    private val userOnlineCache by lazy {
+        TimeoutLruCache<String, Boolean>(
+            1000,
+            10 * 60 * 1000
+        ) //最多缓存1000个,缓存时长10分钟
+    }
+
     override fun getMyUid(): String {
         return AccountModule.uid
     }
@@ -190,6 +198,54 @@ class ProfileManager : BaseFrame<IProfileListener>(), IProfileManager {
         return Rlt.Success(userInfoMap)
     }
 
+    override fun isUserOnline(uid: String): Boolean {
+        return userOnlineCache[uid] ?: false
+    }
+
+    override suspend fun isUserOnline(
+        uid: String,
+        cache: Boolean
+    ): Rlt<Boolean> {
+        val rlt = isUserOnline(setOf(uid), cache)
+        return when (rlt) {
+            is Rlt.Failed -> {
+                rlt
+            }
+
+            is Rlt.Success -> {
+                Rlt.Success(rlt.data[uid] ?: false)
+            }
+        }
+    }
+
+    override suspend fun isUserOnline(
+        uidSet: Set<String>,
+        cache: Boolean
+    ): Rlt<Map<String, Boolean>> {
+        val onlineMap = hashMapOf<String, Boolean>()
+        val reqUidList = uidSet.toMutableList()
+        if (cache) {
+            uidSet.forEach { uid ->
+                userOnlineCache[uid]?.let {
+                    onlineMap[uid] = it
+                    reqUidList.remove(uid)
+                }
+            }
+        }
+        if (reqUidList.isEmpty()) {
+            return Rlt.Success(onlineMap)
+        }
+
+        val rlt = profileHttpService.isUserOnline(UserOnlineReq(reqUidList))
+        if (rlt is Rlt.Success) {
+            val onlineResList = rlt.data.data?.list
+            onlineResList?.forEach { onlineInfo ->
+                userOnlineCache.put(onlineInfo.userNo, onlineInfo.online)
+            }
+        }
+        return Rlt.Success(onlineMap)
+    }
+
     private fun updateUserInfoCache(
         uid: String,
         userInfo: UserInfo,

+ 1 - 0
module/profile/src/main/res/layout/layout_playmate_charm_star.xml

@@ -20,6 +20,7 @@
         android:minWidth="54dp"
         android:paddingHorizontal="3dp"
         app:common_button_type="confirm"
+        android:maxWidth="90dp"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"