DoggyZhang 1 год назад
Родитель
Сommit
31d66e9bc2

+ 4 - 1
app/src/main/java/com/adealink/weparty/image/ImageConfig.kt

@@ -38,6 +38,7 @@ class ImageConfig : IImageConfig, IGlobalConfigListener {
     //TODO 全量CDN之后以下部分需要被移除,减少判断性能消耗
     //TODO 全量CDN之后以下部分需要被移除,减少判断性能消耗
     private val aliOssHosts = hashSetOf(
     private val aliOssHosts = hashSetOf(
         "yoki-resource-cf.wenext.media",
         "yoki-resource-cf.wenext.media",
+        "yoki-user-cf.wenext.media",
         "wenext-yoki-user.oss-ap-southeast-1.aliyuncs.com",
         "wenext-yoki-user.oss-ap-southeast-1.aliyuncs.com",
 
 
         "wenext-lama.oss-ap-southeast-1.aliyuncs.com",
         "wenext-lama.oss-ap-southeast-1.aliyuncs.com",
@@ -61,7 +62,9 @@ class ImageConfig : IImageConfig, IGlobalConfigListener {
     )
     )
 
 
     //阿里云cdn回源到阿里oss
     //阿里云cdn回源到阿里oss
-    private val aliCdn2AliOssHosts = hashSetOf("cdn.wenext.love")
+    private val aliCdn2AliOssHosts = hashSetOf(
+        "cdn.wenext.love",
+    )
 
 
     //腾讯云cdn回源到阿里oss
     //腾讯云cdn回源到阿里oss
     private val qCloudCdn2AliOssHosts = hashSetOf(
     private val qCloudCdn2AliOssHosts = hashSetOf(

BIN
module/call/src/main/assets/call_mic_effect.svga


+ 35 - 7
module/call/src/main/java/com/adealink/weparty/call/chat/comp/ChatRoomBottomComp.kt

@@ -5,8 +5,9 @@ import androidx.lifecycle.LifecycleOwner
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.router.Router
 import com.adealink.frame.router.Router
 import com.adealink.weparty.call.databinding.LayoutCallChatRoomBottomBarBinding
 import com.adealink.weparty.call.databinding.LayoutCallChatRoomBottomBarBinding
-import com.adealink.weparty.call.gift.CallGiftPanelFragment
 import com.adealink.weparty.call.widget.BaseCallViewComponent
 import com.adealink.weparty.call.widget.BaseCallViewComponent
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.module.account.util.isUidValid
 import com.adealink.weparty.module.account.util.isUidValid
@@ -22,8 +23,21 @@ class ChatRoomBottomComp(
     private val binding: LayoutCallChatRoomBottomBarBinding
     private val binding: LayoutCallChatRoomBottomBarBinding
 ) : BaseCallViewComponent(lifecycleOwner) {
 ) : BaseCallViewComponent(lifecycleOwner) {
 
 
-    private var isMicMuteObserver = Observer<Boolean> {
-        binding.micBtn.isActivated = !it
+    private var isMicMuteObserver = Observer<Boolean> { mute ->
+        binding.micBtn.isActivated = !mute
+        if (mute) {
+            binding.ivMicBtn.show()
+            binding.svgaMicBtn.gone()
+        } else {
+            val playoutVolume = TUICallState.instance.selfUser.get().playoutVolume.get()
+            if (playoutVolume > 0) {
+                binding.ivMicBtn.gone()
+                binding.svgaMicBtn.show()
+            } else {
+                binding.ivMicBtn.show()
+                binding.svgaMicBtn.gone()
+            }
+        }
     }
     }
 
 
     private var isAudioPlayerMuteObserver = Observer<Boolean> {
     private var isAudioPlayerMuteObserver = Observer<Boolean> {
@@ -36,6 +50,22 @@ class ChatRoomBottomComp(
         }
         }
     }
     }
 
 
+    private var playoutVolumeObserver = Observer<Int> {
+        if (TUICallState.instance.isMicrophoneMute.get()) {
+            //麦位静音
+            return@Observer
+        }
+        binding.micBtn.post {
+            if (it > 0) {
+                binding.ivMicBtn.gone()
+                binding.svgaMicBtn.show()
+            } else {
+                binding.ivMicBtn.show()
+                binding.svgaMicBtn.gone()
+            }
+        }
+    }
+
     private val hangupCallback = object : TUICommonDefine.Callback {
     private val hangupCallback = object : TUICommonDefine.Callback {
         override fun onSuccess() {
         override fun onSuccess() {
             //Ntd.
             //Ntd.
@@ -117,16 +147,14 @@ class ChatRoomBottomComp(
         TUICallState.instance.isMicrophoneMute.observe(isMicMuteObserver)
         TUICallState.instance.isMicrophoneMute.observe(isMicMuteObserver)
         TUICallState.instance.isAudioPlayerMute.observe(isAudioPlayerMuteObserver)
         TUICallState.instance.isAudioPlayerMute.observe(isAudioPlayerMuteObserver)
         TUICallState.instance.timeCount.observe(timeCountObserver)
         TUICallState.instance.timeCount.observe(timeCountObserver)
+        TUICallState.instance.selfUser.get().playoutVolume.observe(playoutVolumeObserver)
     }
     }
 
 
     override fun removeObserver() {
     override fun removeObserver() {
         TUICallState.instance.isMicrophoneMute.removeObserver(isMicMuteObserver)
         TUICallState.instance.isMicrophoneMute.removeObserver(isMicMuteObserver)
         TUICallState.instance.isAudioPlayerMute.removeObserver(isAudioPlayerMuteObserver)
         TUICallState.instance.isAudioPlayerMute.removeObserver(isAudioPlayerMuteObserver)
         TUICallState.instance.timeCount.removeObserver(timeCountObserver)
         TUICallState.instance.timeCount.removeObserver(timeCountObserver)
-    }
-
-    override fun clear() {
-        removeObserver()
+        TUICallState.instance.selfUser.get().playoutVolume.removeObserver(playoutVolumeObserver)
     }
     }
 
 
 }
 }

+ 1 - 1
module/call/src/main/java/com/adealink/weparty/call/constant/Error.kt

@@ -8,4 +8,4 @@ package com.adealink.weparty.call.constant
 const val CALL_ERROR_CALL_FAIL_FOR_CALLING = 100001
 const val CALL_ERROR_CALL_FAIL_FOR_CALLING = 100001
 const val CALL_ERROR_CALL_YOURSELF = 100002
 const val CALL_ERROR_CALL_YOURSELF = 100002
 const val CALL_ERROR_MEDIA_CONFLICT_CANCEL = 100003
 const val CALL_ERROR_MEDIA_CONFLICT_CANCEL = 100003
-const val CALL_ERROR_CALL_STATUS_UNKNOWN = 100004
+const val CALL_ERROR_GET_USERINFO_FAIL = 100004

+ 1 - 1
module/call/src/main/java/com/adealink/weparty/call/util/CallUtil.kt

@@ -164,7 +164,7 @@ private fun getVideoWaitingTips(iconSize: Int): SpannableStringBuilder {
 }
 }
 
 
 
 
-fun getOfflinePushCallWaitingTips(): String {
+fun getNotificationCallWaitingTips(): String {
     return when (TUICallState.instance.mediaType.get()) {
     return when (TUICallState.instance.mediaType.get()) {
         TUICallDefine.MediaType.Audio -> {
         TUICallDefine.MediaType.Audio -> {
             if (TUICallState.instance.selfUser.get().isPayer.get()) {
             if (TUICallState.instance.selfUser.get().isPayer.get()) {

+ 35 - 2
module/call/src/main/java/com/adealink/weparty/call/video/comp/VideoRoomBottomComp.kt

@@ -7,6 +7,8 @@ import com.adealink.frame.router.Router
 import com.adealink.weparty.call.databinding.LayoutCallVideoRoomBottomBarBinding
 import com.adealink.weparty.call.databinding.LayoutCallVideoRoomBottomBarBinding
 import com.adealink.weparty.call.gift.CallGiftPanelFragment
 import com.adealink.weparty.call.gift.CallGiftPanelFragment
 import com.adealink.weparty.call.widget.BaseCallViewComponent
 import com.adealink.weparty.call.widget.BaseCallViewComponent
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.module.account.util.isUidValid
 import com.adealink.weparty.module.account.util.isUidValid
@@ -23,8 +25,21 @@ class VideoRoomBottomComp(
     private val binding: LayoutCallVideoRoomBottomBarBinding
     private val binding: LayoutCallVideoRoomBottomBarBinding
 ) : BaseCallViewComponent(lifecycleOwner) {
 ) : BaseCallViewComponent(lifecycleOwner) {
 
 
-    private var isMicMuteObserver = Observer<Boolean> {
-        binding.micBtn.isActivated = !it
+    private var isMicMuteObserver = Observer<Boolean> {mute->
+        binding.micBtn.isActivated = !mute
+        if (mute) {
+            binding.ivMicBtn.show()
+            binding.svgaMicBtn.gone()
+        } else {
+            val playoutVolume = TUICallState.instance.selfUser.get().playoutVolume.get()
+            if (playoutVolume > 0) {
+                binding.ivMicBtn.gone()
+                binding.svgaMicBtn.show()
+            } else {
+                binding.ivMicBtn.show()
+                binding.svgaMicBtn.gone()
+            }
+        }
     }
     }
 
 
     private var isAudioPlayerMuteObserver = Observer<Boolean> {
     private var isAudioPlayerMuteObserver = Observer<Boolean> {
@@ -41,6 +56,22 @@ class VideoRoomBottomComp(
         }
         }
     }
     }
 
 
+    private var playoutVolumeObserver = Observer<Int> {
+        if (TUICallState.instance.isMicrophoneMute.get()) {
+            //麦位静音
+            return@Observer
+        }
+        binding.micBtn.post {
+            if (it > 0) {
+                binding.ivMicBtn.gone()
+                binding.svgaMicBtn.show()
+            } else {
+                binding.ivMicBtn.show()
+                binding.svgaMicBtn.gone()
+            }
+        }
+    }
+
     private val hangupCallback = object : TUICommonDefine.Callback {
     private val hangupCallback = object : TUICommonDefine.Callback {
         override fun onSuccess() {
         override fun onSuccess() {
             //Ntd.
             //Ntd.
@@ -138,6 +169,7 @@ class VideoRoomBottomComp(
         TUICallState.instance.isAudioPlayerMute.observe(isAudioPlayerMuteObserver)
         TUICallState.instance.isAudioPlayerMute.observe(isAudioPlayerMuteObserver)
         TUICallState.instance.isCameraOpen.observe(isCameraOpenObserver)
         TUICallState.instance.isCameraOpen.observe(isCameraOpenObserver)
         TUICallState.instance.timeCount.observe(timeCountObserver)
         TUICallState.instance.timeCount.observe(timeCountObserver)
+        TUICallState.instance.selfUser.get().playoutVolume.observe(playoutVolumeObserver)
     }
     }
 
 
     override fun removeObserver() {
     override fun removeObserver() {
@@ -145,6 +177,7 @@ class VideoRoomBottomComp(
         TUICallState.instance.isAudioPlayerMute.removeObserver(isAudioPlayerMuteObserver)
         TUICallState.instance.isAudioPlayerMute.removeObserver(isAudioPlayerMuteObserver)
         TUICallState.instance.isCameraOpen.removeObserver(isCameraOpenObserver)
         TUICallState.instance.isCameraOpen.removeObserver(isCameraOpenObserver)
         TUICallState.instance.timeCount.removeObserver(timeCountObserver)
         TUICallState.instance.timeCount.removeObserver(timeCountObserver)
+        TUICallState.instance.selfUser.get().playoutVolume.removeObserver(playoutVolumeObserver)
     }
     }
 
 
 }
 }

+ 30 - 6
module/call/src/main/java/com/adealink/weparty/call/view/floatview/IncomingNotificationView.kt

@@ -7,25 +7,25 @@ import android.content.Context
 import android.content.Intent
 import android.content.Intent
 import android.graphics.Bitmap
 import android.graphics.Bitmap
 import android.os.Build
 import android.os.Build
+import android.view.View
 import android.widget.RemoteViews
 import android.widget.RemoteViews
 import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationCompat
 import com.adealink.frame.image.imageService
 import com.adealink.frame.image.imageService
 import com.adealink.frame.image.listener.IImageLoadResultListener
 import com.adealink.frame.image.listener.IImageLoadResultListener
 import com.adealink.frame.log.Log
 import com.adealink.frame.log.Log
-import com.adealink.frame.router.Router
 import com.adealink.frame.util.ImageUtil
 import com.adealink.frame.util.ImageUtil
 import com.adealink.weparty.call.CallActivity
 import com.adealink.weparty.call.CallActivity
 import com.adealink.weparty.call.R
 import com.adealink.weparty.call.R
 import com.adealink.weparty.call.constant.TAG_CALL_INCOMING_VIEW
 import com.adealink.weparty.call.constant.TAG_CALL_INCOMING_VIEW
-import com.adealink.weparty.call.util.getCallWaitingTips
+import com.adealink.weparty.call.util.getNotificationCallWaitingTips
 import com.adealink.weparty.call.view.IInComing
 import com.adealink.weparty.call.view.IInComing
+import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.module.profile.data.UserInfo
 import com.adealink.weparty.module.profile.data.UserInfo
 import com.adealink.weparty.notifiation.CALL_NOTIFICATION_CHANNEL_ID
 import com.adealink.weparty.notifiation.CALL_NOTIFICATION_CHANNEL_ID
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine.MediaType
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine.MediaType
 import com.tencent.qcloud.tuikit.tuicallkit.data.Constants
 import com.tencent.qcloud.tuikit.tuicallkit.data.Constants
 import com.tencent.qcloud.tuikit.tuicallkit.data.User
 import com.tencent.qcloud.tuikit.tuicallkit.data.User
-import com.tencent.qcloud.tuikit.tuicallkit.extensions.NotificationFeature
 import com.tencent.qcloud.tuikit.tuicallkit.state.TUICallState
 import com.tencent.qcloud.tuikit.tuicallkit.state.TUICallState
 import com.trtc.tuikit.common.livedata.Observer
 import com.trtc.tuikit.common.livedata.Observer
 import com.adealink.weparty.R as APP_R
 import com.adealink.weparty.R as APP_R
@@ -33,7 +33,10 @@ import com.adealink.weparty.R as APP_R
 class IncomingNotificationView(context: Context): IInComing {
 class IncomingNotificationView(context: Context): IInComing {
 
 
     companion object {
     companion object {
-        private const val AVATAR_SIZE = 80
+        private val AVATAR_SIZE = 40.dp()
+
+        private val COUNTRY_WIDTH = 15.5f.dp()
+        private val COUNTRY_HEIGHT = 10.5f.dp()
     }
     }
 
 
     private val notificationId = 9909
     private val notificationId = 9909
@@ -79,7 +82,7 @@ class IncomingNotificationView(context: Context): IInComing {
         Log.d(TAG_CALL_INCOMING_VIEW, "showNotification, user: $user")
         Log.d(TAG_CALL_INCOMING_VIEW, "showNotification, user: $user")
         addObserver(user)
         addObserver(user)
         notification = createNotification()
         notification = createNotification()
-        remoteViews?.setTextViewText(R.id.tv_desc, getCallWaitingTips())
+        remoteViews?.setTextViewText(R.id.tv_desc, getNotificationCallWaitingTips())
 
 
         val mediaType = TUICallState.instance.mediaType.get()
         val mediaType = TUICallState.instance.mediaType.get()
         if (mediaType == MediaType.Video) {
         if (mediaType == MediaType.Video) {
@@ -112,7 +115,7 @@ class IncomingNotificationView(context: Context): IInComing {
             val avatarOptUrl = imageService.getResizeUrl(avatarUrl, AVATAR_SIZE, AVATAR_SIZE)
             val avatarOptUrl = imageService.getResizeUrl(avatarUrl, AVATAR_SIZE, AVATAR_SIZE)
             imageService.fetchImage(avatarOptUrl, object : IImageLoadResultListener {
             imageService.fetchImage(avatarOptUrl, object : IImageLoadResultListener {
                 override fun onSuccess(bitmap: Bitmap) {
                 override fun onSuccess(bitmap: Bitmap) {
-                    val roundBitmap = ImageUtil.getRoundedCornerBitmap(bitmap, AVATAR_SIZE / 2f)
+                    val roundBitmap = ImageUtil.getRoundedCornerBitmap(bitmap, bitmap.width / 2f)
                     if (roundBitmap != null && !roundBitmap.isRecycled) {
                     if (roundBitmap != null && !roundBitmap.isRecycled) {
                         remoteViews?.setImageViewBitmap(R.id.img_incoming_avatar, roundBitmap)
                         remoteViews?.setImageViewBitmap(R.id.img_incoming_avatar, roundBitmap)
                         bitmap.recycle()
                         bitmap.recycle()
@@ -128,6 +131,27 @@ class IncomingNotificationView(context: Context): IInComing {
                 }
                 }
             })
             })
         }
         }
+
+        val flagUrl = userInfo?.flag
+        if (flagUrl.isNullOrEmpty()) {
+            remoteViews.setViewVisibility(R.id.img_incoming_country, View.GONE)
+            sendNotification()
+        } else {
+            val flagOptUrl = imageService.getResizeUrl(flagUrl, COUNTRY_WIDTH, COUNTRY_HEIGHT)
+            imageService.fetchImage(flagOptUrl, object : IImageLoadResultListener {
+                override fun onSuccess(bitmap: Bitmap) {
+                    remoteViews?.setViewVisibility(R.id.img_incoming_country, View.VISIBLE)
+                    remoteViews?.setImageViewBitmap(R.id.img_incoming_country, bitmap)
+                    sendNotification()
+                }
+
+                override fun onFailed() {
+                    remoteViews?.setViewVisibility(R.id.img_incoming_country, View.GONE)
+                    sendNotification()
+                }
+            })
+        }
+
     }
     }
 
 
     fun sendNotification() {
     fun sendNotification() {

+ 6 - 0
module/call/src/main/java/com/adealink/weparty/call/view/floatview/IncomingView.kt

@@ -40,6 +40,12 @@ class IncomingView @JvmOverloads constructor(
         if (TUICallState.instance.selfUser.get().callStatus.get() == TUICallDefine.Status.Waiting) {
         if (TUICallState.instance.selfUser.get().callStatus.get() == TUICallDefine.Status.Waiting) {
             binding.ivAvatar.setImageUrl(it.url)
             binding.ivAvatar.setImageUrl(it.url)
             binding.tvName.text = it.name
             binding.tvName.text = it.name
+            if (it.flag.isNullOrEmpty()) {
+                binding.ivCountry.gone()
+            } else {
+                binding.ivCountry.show()
+                binding.ivCountry.setImageUrl(it.flag)
+            }
         }
         }
     }
     }
 
 

+ 2 - 2
module/call/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/data/OfflinePushInfoConfig.kt

@@ -1,6 +1,6 @@
 package com.tencent.qcloud.tuikit.tuicallkit.data
 package com.tencent.qcloud.tuikit.tuicallkit.data
 
 
-import com.adealink.weparty.call.util.getOfflinePushCallWaitingTips
+import com.adealink.weparty.call.util.getNotificationCallWaitingTips
 import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.module.account.AccountModule
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine.OfflinePushInfo
 import com.tencent.cloud.tuikit.engine.call.TUICallDefine.OfflinePushInfo
@@ -11,7 +11,7 @@ object OfflinePushInfoConfig {
     fun createOfflinePushInfo(): OfflinePushInfo {
     fun createOfflinePushInfo(): OfflinePushInfo {
         val pushInfo = OfflinePushInfo()
         val pushInfo = OfflinePushInfo()
         pushInfo.title = TUICallState.instance.selfUser.get().userInfo.get()?.name ?: AccountModule.uid.toString()
         pushInfo.title = TUICallState.instance.selfUser.get().userInfo.get()?.name ?: AccountModule.uid.toString()
-        pushInfo.desc = getOfflinePushCallWaitingTips()
+        pushInfo.desc = getNotificationCallWaitingTips()
         //OPPO must set a ChannelID to receive push messages. If you set it on the console, you don't need set here.
         //OPPO must set a ChannelID to receive push messages. If you set it on the console, you don't need set here.
         //pushInfo.androidOPPOChannelID = "tuikit"
         //pushInfo.androidOPPOChannelID = "tuikit"
         pushInfo.isIgnoreIOSBadge = false
         pushInfo.isIgnoreIOSBadge = false

+ 4 - 1
module/call/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/state/TUICallState.kt

@@ -304,7 +304,8 @@ class TUICallState {
         }
         }
 
 
         override fun onUserVoiceVolumeChanged(volumeMap: Map<String?, Int?>?) {
         override fun onUserVoiceVolumeChanged(volumeMap: Map<String?, Int?>?) {
-            if (TUICallDefine.Scene.SINGLE_CALL == scene.get() || volumeMap.isNullOrEmpty()) {
+            Log.d(TAG_CALL_FLOW, "onUserVoiceVolumeChanged, $volumeMap")
+            if (volumeMap.isNullOrEmpty()) {
                 return
                 return
             }
             }
             for (entry in volumeMap.entries) {
             for (entry in volumeMap.entries) {
@@ -352,11 +353,13 @@ class TUICallState {
         }
         }
 
 
         override fun onKickedOffline() {
         override fun onKickedOffline() {
+            Log.d(TAG_CALL_FLOW, "onKickedOffline")
             EngineManager.instance.hangup(null)
             EngineManager.instance.hangup(null)
             resetCall()
             resetCall()
         }
         }
 
 
         override fun onUserSigExpired() {
         override fun onUserSigExpired() {
+            Log.d(TAG_CALL_FLOW, "onUserSigExpired")
             EngineManager.instance.hangup(null)
             EngineManager.instance.hangup(null)
             resetCall()
             resetCall()
         }
         }

+ 4 - 1
module/call/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/UserInfoUtils.kt

@@ -4,6 +4,7 @@ import com.adealink.frame.base.Rlt
 import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.log.Log
 import com.adealink.frame.log.Log
 import com.adealink.frame.util.safeToLong
 import com.adealink.frame.util.safeToLong
+import com.adealink.weparty.call.constant.CALL_ERROR_GET_USERINFO_FAIL
 import com.adealink.weparty.call.constant.TAG_CALL_FLOW
 import com.adealink.weparty.call.constant.TAG_CALL_FLOW
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.module.profile.data.UserInfo
 import com.adealink.weparty.module.profile.data.UserInfo
@@ -19,17 +20,19 @@ object UserInfoUtils {
         val uid = user.id?.safeToLong()
         val uid = user.id?.safeToLong()
         if (uid == null || uid == 0L) {
         if (uid == null || uid == 0L) {
             Log.e(TAG_CALL_FLOW, "getUsersInfo, user.userId isEmpty")
             Log.e(TAG_CALL_FLOW, "getUsersInfo, user.userId isEmpty")
+            callback?.onError(CALL_ERROR_GET_USERINFO_FAIL, "")
             return
             return
         }
         }
         val userInfo = user.userInfo.get()
         val userInfo = user.userInfo.get()
         if (userInfo.uid == user.id?.safeToLong()) {
         if (userInfo.uid == user.id?.safeToLong()) {
             Log.d(TAG_CALL_FLOW, "getUsersInfo, user(${user.id}), userName: ${userInfo.name}, avatar:${userInfo.url}")
             Log.d(TAG_CALL_FLOW, "getUsersInfo, user(${user.id}), userName: ${userInfo.name}, avatar:${userInfo.url}")
+            callback?.onSuccess(userInfo)
             return
             return
         }
         }
 
 
         CoroutineScope(Dispatcher.UI).launch {
         CoroutineScope(Dispatcher.UI).launch {
             val rlt = withContext(Dispatcher.WENEXT_THREAD_POOL) {
             val rlt = withContext(Dispatcher.WENEXT_THREAD_POOL) {
-                ProfileModule.getUserInfoByUid(uid, true)
+                ProfileModule.getUserInfoByUid(uid, true, setOf())
             }
             }
             when (rlt) {
             when (rlt) {
                 is Rlt.Failed -> {
                 is Rlt.Failed -> {

+ 3 - 3
module/call/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/common/RoundShadowLayout.kt

@@ -20,12 +20,12 @@ class RoundShadowLayout(context: Context, attrs: AttributeSet?) : FrameLayout(co
     private var shadowPaint: Paint
     private var shadowPaint: Paint
     private var shadowRect: RectF
     private var shadowRect: RectF
     private var shadowPath: Path
     private var shadowPath: Path
-    private var shadowRadius = 15f
+    private var shadowRadius = 16f
     private var shadowColor = 0
     private var shadowColor = 0
     private var shadowX = 0f
     private var shadowX = 0f
     private var shadowY = 0f
     private var shadowY = 0f
 
 
-    private var roundRadius = 32f
+    private var roundRadius = 16f
     private var roundPaint: Paint
     private var roundPaint: Paint
     private var roundRect: RectF
     private var roundRect: RectF
     private var roundPath: Path
     private var roundPath: Path
@@ -33,7 +33,7 @@ class RoundShadowLayout(context: Context, attrs: AttributeSet?) : FrameLayout(co
     constructor(context: Context) : this(context, null) {}
     constructor(context: Context) : this(context, null) {}
 
 
     init {
     init {
-        shadowColor = context.resources.getColor(com.adealink.weparty.R.color.color_FF3B3B3B)
+        shadowColor = context.resources.getColor(com.adealink.weparty.R.color.color_0A000000)
 
 
         for (i in radiusArray.indices) {
         for (i in radiusArray.indices) {
             radiusArray[i] = roundRadius
             radiusArray[i] = roundRadius

+ 22 - 5
module/call/src/main/res/layout/call_incoming_float_view.xml

@@ -35,9 +35,9 @@
 
 
         <androidx.appcompat.widget.AppCompatTextView
         <androidx.appcompat.widget.AppCompatTextView
             android:id="@+id/tv_name"
             android:id="@+id/tv_name"
-            android:layout_width="0dp"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginHorizontal="12dp"
+            android:layout_marginStart="12dp"
             android:ellipsize="end"
             android:ellipsize="end"
             android:gravity="start"
             android:gravity="start"
             android:includeFontPadding="false"
             android:includeFontPadding="false"
@@ -45,21 +45,38 @@
             android:textColor="@color/color_222222"
             android:textColor="@color/color_222222"
             android:textSize="15sp"
             android:textSize="15sp"
             app:layout_constraintBottom_toTopOf="@id/tv_tips"
             app:layout_constraintBottom_toTopOf="@id/tv_tips"
-            app:layout_constraintEnd_toStartOf="@id/reject_btn"
+            app:layout_constraintEnd_toStartOf="@id/iv_country"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintHorizontal_chainStyle="packed"
             app:layout_constraintStart_toEndOf="@id/iv_avatar"
             app:layout_constraintStart_toEndOf="@id/iv_avatar"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_chainStyle="packed"
             app:layout_constraintVertical_chainStyle="packed"
+            app:layout_goneMarginEnd="12dp"
             tools:text="name" />
             tools:text="name" />
 
 
-        <androidx.appcompat.widget.AppCompatTextView
+        <com.adealink.frame.image.view.NetworkImageView
+            android:id="@+id/iv_country"
+            android:layout_width="15.5dp"
+            android:layout_height="10.5dp"
+            android:layout_marginStart="4dp"
+            android:layout_marginEnd="12dp"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="@id/tv_name"
+            app:layout_constraintEnd_toStartOf="@id/reject_btn"
+            app:layout_constraintStart_toEndOf="@id/tv_name"
+            app:layout_constraintTop_toTopOf="@id/tv_name"
+            tools:visibility="visible" />
+
+        <com.adealink.weparty.commonui.widget.AutoMarqueeTextView
             android:id="@+id/tv_tips"
             android:id="@+id/tv_tips"
             android:layout_width="0dp"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginHorizontal="12dp"
             android:layout_marginHorizontal="12dp"
             android:layout_marginTop="6dp"
             android:layout_marginTop="6dp"
-            android:ellipsize="end"
+            android:ellipsize="marquee"
             android:gravity="start"
             android:gravity="start"
             android:includeFontPadding="false"
             android:includeFontPadding="false"
+            android:marqueeRepeatLimit="marquee_forever"
             android:singleLine="true"
             android:singleLine="true"
             android:textColor="@color/color_777777"
             android:textColor="@color/color_777777"
             android:textSize="12sp"
             android:textSize="12sp"

+ 27 - 9
module/call/src/main/res/layout/call_incoming_notification_view.xml

@@ -26,15 +26,32 @@
         android:layout_weight="1"
         android:layout_weight="1"
         android:orientation="vertical">
         android:orientation="vertical">
 
 
-        <TextView
-            android:id="@+id/tv_incoming_title"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:ellipsize="end"
-            android:maxLines="1"
-            android:textAppearance="@style/TextAppearance.Compat.Notification.Title"
-            android:textSize="18sp"
-            tools:hint="inviter" />
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/tv_incoming_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:includeFontPadding="false"
+                android:maxLines="1"
+                android:textAppearance="@style/TextAppearance.Compat.Notification.Title"
+                android:textColor="@color/color_222222"
+                android:textSize="15sp"
+                tools:hint="inviter" />
+
+            <ImageView
+                android:id="@+id/img_incoming_country"
+                android:layout_width="15.5dp"
+                android:layout_height="10.5dp"
+                android:layout_marginStart="4dp"
+                android:visibility="gone"
+                tools:visibility="visible" />
+        </LinearLayout>
 
 
         <LinearLayout
         <LinearLayout
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"
@@ -49,8 +66,9 @@
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_vertical"
                 android:layout_gravity="center_vertical"
                 android:ellipsize="end"
                 android:ellipsize="end"
+                android:includeFontPadding="false"
                 android:maxLines="1"
                 android:maxLines="1"
-                android:textAppearance="@style/TextAppearance.Compat.Notification.Line2"
+                android:textColor="@color/color_777777"
                 android:textSize="12sp"
                 android:textSize="12sp"
                 tools:hint="description" />
                 tools:hint="description" />
         </LinearLayout>
         </LinearLayout>

+ 25 - 3
module/call/src/main/res/layout/layout_call_chat_room_bottom_bar.xml

@@ -37,7 +37,7 @@
         app:layout_constraintTop_toBottomOf="@id/barrier_bottom"
         app:layout_constraintTop_toBottomOf="@id/barrier_bottom"
         app:srcCompat="@drawable/call_send_gift_ic" />
         app:srcCompat="@drawable/call_send_gift_ic" />
 
 
-    <androidx.appcompat.widget.AppCompatImageView
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/mic_btn"
         android:id="@+id/mic_btn"
         android:layout_width="54dp"
         android:layout_width="54dp"
         android:layout_height="54dp"
         android:layout_height="54dp"
@@ -45,8 +45,30 @@
         android:layout_marginEnd="16dp"
         android:layout_marginEnd="16dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toStartOf="@id/speaker_btn"
         app:layout_constraintEnd_toStartOf="@id/speaker_btn"
-        app:layout_constraintTop_toBottomOf="@id/barrier_bottom"
-        app:srcCompat="@drawable/call_mic_sel" />
+        app:layout_constraintTop_toBottomOf="@id/barrier_bottom">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_mic_btn"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:duplicateParentState="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/call_mic_sel" />
+
+        <com.opensource.svgaplayer.WenextSvgaView
+            android:id="@+id/svga_mic_btn"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            app:source="call_mic_effect.svga"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
 
     <androidx.appcompat.widget.AppCompatImageView
     <androidx.appcompat.widget.AppCompatImageView
         android:id="@+id/speaker_btn"
         android:id="@+id/speaker_btn"

+ 26 - 3
module/call/src/main/res/layout/layout_call_video_room_bottom_bar.xml

@@ -38,7 +38,7 @@
         app:layout_constraintTop_toBottomOf="@id/barrier_bottom"
         app:layout_constraintTop_toBottomOf="@id/barrier_bottom"
         app:srcCompat="@drawable/call_send_gift_ic" />
         app:srcCompat="@drawable/call_send_gift_ic" />
 
 
-    <androidx.appcompat.widget.AppCompatImageView
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/mic_btn"
         android:id="@+id/mic_btn"
         android:layout_width="54dp"
         android:layout_width="54dp"
         android:layout_height="54dp"
         android:layout_height="54dp"
@@ -46,8 +46,31 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toStartOf="@id/speaker_btn"
         app:layout_constraintEnd_toStartOf="@id/speaker_btn"
         app:layout_constraintStart_toEndOf="@id/send_gift_btn"
         app:layout_constraintStart_toEndOf="@id/send_gift_btn"
-        app:layout_constraintTop_toBottomOf="@id/barrier_bottom"
-        app:srcCompat="@drawable/call_mic_sel" />
+        app:layout_constraintTop_toBottomOf="@id/barrier_bottom">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_mic_btn"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:duplicateParentState="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/call_mic_sel" />
+
+        <com.opensource.svgaplayer.WenextSvgaView
+            android:id="@+id/svga_mic_btn"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:source="call_mic_effect.svga" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
 
 
     <androidx.appcompat.widget.AppCompatImageView
     <androidx.appcompat.widget.AppCompatImageView
         android:id="@+id/speaker_btn"
         android:id="@+id/speaker_btn"