Browse Source

feat: 打通1v1通话

DoggyZhang 1 month ago
parent
commit
c558b19671
100 changed files with 117 additions and 4531 deletions
  1. 0 3
      app/src/main/java/com/adealink/weparty/module/account/util/AccountUtil.kt
  2. 1 35
      app/src/main/java/com/adealink/weparty/module/call/CallModule.kt
  3. 5 13
      app/src/main/java/com/adealink/weparty/module/call/ICallService.kt
  4. 6 14
      app/src/main/java/com/adealink/weparty/module/call/SettingsConfig.java
  5. 0 17
      app/src/main/java/com/adealink/weparty/module/call/data/CallData.kt
  6. 2 0
      app/src/main/java/com/adealink/weparty/module/call/data/Constant.kt
  7. 1 0
      app/src/main/resources/META-INF/services/com.adealink.frame.router.IRouterInit
  8. 14 14
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/CallView.kt
  9. 24 0
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/core/common/utils/CallExt.kt
  10. 35 0
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/core/common/utils/CallUtils.kt
  11. 1 1
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/aisubtitle/AISubtitle.kt
  12. 1 1
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/AudioAndVideoCalleeWaitingView.kt
  13. 1 1
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/AudioCallerWaitingAndAcceptedView.kt
  14. 2 2
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/MultiCallControlsView.kt
  15. 2 2
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/SingleCallControlsView.kt
  16. 6 6
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/VideoCallerAndCalleeAcceptedView.kt
  17. 1 1
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/VideoCallerWaitingView.kt
  18. 6 3
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/hint/HintView.kt
  19. 6 3
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/hint/TimerView.kt
  20. 2 2
      frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/multi/MultiCallWaitingView.kt
  21. 1 2
      frame/atomic_x/src/main/res-callview/layout/callview_root_view.xml
  22. 0 19
      frame/tuicallkit-kt/.gitignore
  23. 0 49
      frame/tuicallkit-kt/build.gradle
  24. 0 5
      frame/tuicallkit-kt/proguard-rules.pro
  25. 0 53
      frame/tuicallkit-kt/src/main/AndroidManifest.xml
  26. 0 177
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/common/utils/PermissionRequest.kt
  27. 0 526
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/manager/bridge/CallKitService.kt
  28. 0 271
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/CallMainActivity.kt
  29. 0 179
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/incomingbanner/IncomingFloatBanner.kt
  30. 0 165
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/incomingbanner/IncomingNotificationBanner.kt
  31. 0 8
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/GroupMemberInfo.kt
  32. 0 57
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/InviteUserButton.kt
  33. 0 114
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/SelectGroupMemberActivity.kt
  34. 0 68
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/SelectGroupMemberAdapter.kt
  35. 0 118
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/joiningroupcall/JoinCallView.kt
  36. 0 177
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/joiningroupcall/JoinCallViewManager.kt
  37. 0 310
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsFragment.kt
  38. 0 116
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsItemHolder.kt
  39. 0 179
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsListAdapter.kt
  40. 0 57
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsManager.kt
  41. 0 44
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecordsIconView.kt
  42. 0 223
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/SlideRecyclerView.kt
  43. 0 400
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/gridimage/GridImageSynthesizer.kt
  44. 0 10
      frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/interfaces/ICallRecordItemListener.kt
  45. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_chat_title_bar_minimalist_audio_call_icon.png
  46. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_chat_title_bar_minimalist_video_call_icon.png
  47. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_check_box_group_selected.png
  48. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_check_box_group_unselected.png
  49. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_checkbox_selected.png
  50. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_group_select_disable.png
  51. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_add_user_black.png
  52. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_audio_call.png
  53. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_audio_input.png
  54. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_avatar.png
  55. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_back.png
  56. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_delete.png
  57. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_dialing.png
  58. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_dialing_pressed.png
  59. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_dialing_video.png
  60. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_edit.png
  61. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_float.png
  62. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_float_button.png
  63. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_hangup.png
  64. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_hangup_pressed.png
  65. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_join_call.png
  66. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_join_compress.png
  67. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_join_expand.png
  68. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_more_info.png
  69. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_start_call.png
  70. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_video_call.png
  71. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_video_incoming.png
  72. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_profile_minimalist_audio_icon.png
  73. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_profile_minimalist_video_icon.png
  74. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_record_ic_audio_call.png
  75. BIN
      frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_record_ic_video_call.png
  76. 0 5
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_bg_dialing.xml
  77. 0 5
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_bg_hangup.xml
  78. 0 5
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_dialog_cancel.xml
  79. 0 5
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_dialog_sure.xml
  80. 0 9
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_group_checkbox_selector.xml
  81. 0 5
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_join_group_expand_view.xml
  82. 0 16
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_tab_item_selector.xml
  83. 0 5
      frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_tab_selector.xml
  84. 0 48
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_activity_call_kit.xml
  85. 0 59
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_activity_group_user.xml
  86. 0 68
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_incoming_float_view.xml
  87. 0 17
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_item_head_view.xml
  88. 0 108
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_join_call_view.xml
  89. 0 93
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_layout_call_list_item.xml
  90. 0 98
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_layout_call_list_item_sub.xml
  91. 0 66
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_list_item_group_user.xml
  92. 0 35
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_record_dialog.xml
  93. 0 110
      frame/tuicallkit-kt/src/main/res/layout/tuicallkit_record_fragment_main.xml
  94. 0 53
      frame/tuicallkit-kt/src/main/res/values-ar/strings.xml
  95. 0 55
      frame/tuicallkit-kt/src/main/res/values-en/strings.xml
  96. 0 51
      frame/tuicallkit-kt/src/main/res/values-ja/strings.xml
  97. 0 55
      frame/tuicallkit-kt/src/main/res/values-zh-rHK/strings.xml
  98. 0 54
      frame/tuicallkit-kt/src/main/res/values-zh-rTW/strings.xml
  99. 0 53
      frame/tuicallkit-kt/src/main/res/values-zh/strings.xml
  100. 0 8
      frame/tuicallkit-kt/src/main/res/values/dimens.xml

+ 0 - 3
app/src/main/java/com/adealink/weparty/module/account/util/AccountUtil.kt

@@ -1,3 +0,0 @@
-package com.adealink.weparty.module.account.util
-
-fun Long?.isUidValid(): Boolean = this != null && this > 0

+ 1 - 35
app/src/main/java/com/adealink/weparty/module/call/CallModule.kt

@@ -1,7 +1,6 @@
 package com.adealink.weparty.module.call
 
 import android.app.Application
-import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.BaseDynamicModule
 import com.adealink.frame.aab.constant.AABModuleNotInitError
 import com.adealink.frame.base.Rlt
@@ -9,11 +8,6 @@ import com.adealink.frame.media.IMediaOperator
 import com.adealink.frame.media.MediaConflictConfig
 import com.adealink.frame.media.MediaInfo
 import com.adealink.weparty.R
-import com.adealink.weparty.commonui.widget.floatview.data.IFloatData
-import com.adealink.weparty.commonui.widget.floatview.view.BaseFloatView
-import com.adealink.weparty.module.call.data.CallerSource
-import com.adealink.weparty.module.call.data.MediaType
-import com.adealink.weparty.module.call.viewmodel.ICallViewModel
 
 object CallModule : BaseDynamicModule<ICallService>(ICallService::class), ICallService {
 
@@ -28,25 +22,11 @@ object CallModule : BaseDynamicModule<ICallService>(ICallService::class), ICallS
 
             override fun call(
                 uid: String,
-                mediaType: MediaType,
-                callerSource: CallerSource,
                 onSuccess: (() -> Unit)?,
                 onFail: ((errCode: Int, errMsg: String?) -> Unit)?
             ) {
             }
 
-            override fun getIncomingFloatView(data: IFloatData): BaseFloatView<out IFloatData>? {
-                return null
-            }
-
-            override fun getCallingFloatView(data: IFloatData): BaseFloatView<out IFloatData>? {
-                return null
-            }
-
-            override fun getCallViewModel(owner: ViewModelStoreOwner): ICallViewModel? {
-                return null
-            }
-
             override fun getService(): ICallService? {
                 return null
             }
@@ -105,24 +85,10 @@ object CallModule : BaseDynamicModule<ICallService>(ICallService::class), ICallS
 
     override fun call(
         uid: String,
-        mediaType: MediaType,
-        callerSource: CallerSource,
         onSuccess: (() -> Unit)?,
         onFail: ((Int, String?) -> Unit)?
     ) {
-        getService().call(uid, mediaType, callerSource, onSuccess, onFail)
-    }
-
-    override fun getIncomingFloatView(data: IFloatData): BaseFloatView<out IFloatData>? {
-        return getService().getIncomingFloatView(data)
-    }
-
-    override fun getCallingFloatView(data: IFloatData): BaseFloatView<out IFloatData>? {
-        return getService().getCallingFloatView(data)
-    }
-
-    override fun getCallViewModel(owner: ViewModelStoreOwner): ICallViewModel? {
-        return getService().getCallViewModel(owner)
+        getService().call(uid, onSuccess, onFail)
     }
 
     override fun getMediaOperator(): IMediaOperator {

+ 5 - 13
app/src/main/java/com/adealink/weparty/module/call/ICallService.kt

@@ -1,29 +1,21 @@
 package com.adealink.weparty.module.call
 
-import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.IService
 import com.adealink.frame.media.IMediaOperatorGet
 import com.adealink.frame.startup.IAppStartUpTask
-import com.adealink.weparty.commonui.widget.floatview.data.IFloatData
-import com.adealink.weparty.commonui.widget.floatview.view.BaseFloatView
-import com.adealink.weparty.module.call.data.CallerSource
-import com.adealink.weparty.module.call.data.MediaType
-import com.adealink.weparty.module.call.viewmodel.ICallViewModel
 
 interface ICallService : IService<ICallService>, IMediaOperatorGet, IAppStartUpTask {
 
     fun call(
         uid: String,
-        mediaType: MediaType,
-        callerSource: CallerSource = CallerSource.CALLER,
         onSuccess: (() -> Unit)? = null,
         onFail: ((errCode: Int, errMsg: String?) -> Unit)? = null
     )
 
-    fun getIncomingFloatView(data: IFloatData): BaseFloatView<out IFloatData>?
-
-    fun getCallingFloatView(data: IFloatData): BaseFloatView<out IFloatData>?
-
-    fun getCallViewModel(owner: ViewModelStoreOwner): ICallViewModel?
+//    fun getIncomingFloatView(data: IFloatData): BaseFloatView<out IFloatData>?
+//
+//    fun getCallingFloatView(data: IFloatData): BaseFloatView<out IFloatData>?
+//
+//    fun getCallViewModel(owner: ViewModelStoreOwner): ICallViewModel?
 
 }

+ 6 - 14
app/src/main/java/com/adealink/weparty/module/call/SettingsConfig.java

@@ -1,25 +1,17 @@
 package com.adealink.weparty.module.call;
 
-import static com.tencent.cloud.tuikit.engine.common.TUICommonDefine.VideoEncoderParams.Resolution.Resolution_640_360;
-import static com.tencent.cloud.tuikit.engine.common.TUICommonDefine.VideoEncoderParams.ResolutionMode.Portrait;
-import static com.tencent.cloud.tuikit.engine.common.TUICommonDefine.VideoRenderParams.FillMode.Fill;
-import static com.tencent.cloud.tuikit.engine.common.TUICommonDefine.VideoRenderParams.Rotation.Rotation_0;
-
-import com.tencent.qcloud.tuicore.util.SPUtils;
-import com.tencent.qcloud.tuikit.tuicallkit.extensions.CallingBellFeature;
-
 public class SettingsConfig {
-    public static String  ringPath             =
-            SPUtils.getInstance(CallingBellFeature.PROFILE_TUICALLKIT).getString(CallingBellFeature.PROFILE_CALL_BELL);
+//    public static String  ringPath             =
+//            SPUtils.getInstance(CallingBellFeature.PROFILE_TUICALLKIT).getString(CallingBellFeature.PROFILE_CALL_BELL);
     public static boolean isMute               = false;
     public static boolean isShowFloatingWindow = true;
     public static boolean isShowBlurBackground = true;
     public static boolean isIncomingBanner     = true;
     public static int     callTimeOut          = 60;
     public static String  offlineParams        = "";
-    public static int     resolution           = Resolution_640_360.ordinal();
-    public static int     resolutionMode       = Portrait.ordinal();
-    public static int     fillMode             = Fill.ordinal();
-    public static int     rotation             = Rotation_0.ordinal();
+//    public static int     resolution           = Resolution_640_360.ordinal();
+//    public static int     resolutionMode       = Portrait.ordinal();
+//    public static int     fillMode             = Fill.ordinal();
+//    public static int     rotation             = Rotation_0.ordinal();
     public static int     beautyLevel          = 6;
 }

+ 0 - 17
app/src/main/java/com/adealink/weparty/module/call/data/CallData.kt

@@ -1,8 +1,5 @@
 package com.adealink.weparty.module.call.data
 
-import com.google.gson.annotations.GsonNullable
-import com.google.gson.annotations.SerializedName
-
 enum class MediaType(val type: Int) {
     Unknown(0),
     Audio(1),
@@ -16,20 +13,6 @@ enum class MediaType(val type: Int) {
     }
 }
 
-/**
- * 主叫拨号来源
- */
-enum class CallerSource(val source: Int) {
-    CALLER(0); //主动呼叫
-
-    companion object {
-        @JvmStatic
-        fun map(source: Int?): CallerSource? {
-            return entries.find { it.source == source }
-        }
-    }
-}
-
 enum class CallStatus(val status: Int) {
     None(0),
     Waiting(1),

+ 2 - 0
app/src/main/java/com/adealink/weparty/module/call/data/Constant.kt

@@ -1,3 +1,5 @@
 package com.adealink.weparty.module.call.data
 
 
+const val CALL_ERROR_UNKNOWN_MEDIA_TYPE = 0x001
+const val CALL_ERROR_START_CALL_SERVER_ERROR = 0x002

+ 1 - 0
app/src/main/resources/META-INF/services/com.adealink.frame.router.IRouterInit

@@ -10,3 +10,4 @@ com.adealink.frame.router.RouterInit_module_wallet
 com.adealink.frame.router.RouterInit_module_share
 com.adealink.frame.router.RouterInit_module_image
 com.adealink.frame.router.RouterInit_module_joinus
+com.adealink.frame.router.RouterInit_module_call

+ 14 - 14
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/CallView.kt

@@ -3,30 +3,30 @@ package io.trtc.tuikit.atomicx.callview
 import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
+import android.widget.FrameLayout
+import android.widget.LinearLayout
 import androidx.constraintlayout.widget.ConstraintLayout
+import com.trtc.tuikit.common.util.ScreenUtil.dip2px
+import io.trtc.tuikit.atomicx.R
 import io.trtc.tuikit.atomicx.callview.core.CallViewFunction
+import io.trtc.tuikit.atomicx.callview.core.common.utils.CallUtils
+import io.trtc.tuikit.atomicx.callview.core.common.utils.ImageResourceCache
+import io.trtc.tuikit.atomicx.callview.widget.controls.MultiCallControlsView
+import io.trtc.tuikit.atomicx.callview.widget.controls.SingleCallControlsView
+import io.trtc.tuikit.atomicx.callview.widget.hint.HintView
+import io.trtc.tuikit.atomicx.callview.widget.hint.TimerView
+import io.trtc.tuikit.atomicx.callview.widget.multi.MultiCallWaitingView
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantInfo
+import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
 import io.trtc.tuikit.atomicxcore.api.call.CallStore
+import io.trtc.tuikit.atomicxcore.api.device.NetworkQuality
 import io.trtc.tuikit.atomicxcore.api.view.CallCoreView
 import io.trtc.tuikit.atomicxcore.api.view.CallLayoutTemplate
+import io.trtc.tuikit.atomicxcore.api.view.VolumeLevel
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
-import android.widget.FrameLayout
-import android.widget.LinearLayout
-import com.trtc.tuikit.common.util.ScreenUtil.dip2px
-import io.trtc.tuikit.atomicx.R
-import io.trtc.tuikit.atomicx.callview.core.common.utils.CallUtils
-import io.trtc.tuikit.atomicx.callview.core.common.utils.ImageResourceCache
-import io.trtc.tuikit.atomicx.callview.public.multi.MultiCallWaitingView
-import io.trtc.tuikit.atomicx.callview.public.controls.MultiCallControlsView
-import io.trtc.tuikit.atomicx.callview.public.controls.SingleCallControlsView
-import io.trtc.tuikit.atomicx.callview.public.hint.HintView
-import io.trtc.tuikit.atomicx.callview.public.hint.TimerView
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
-import io.trtc.tuikit.atomicxcore.api.device.NetworkQuality
-import io.trtc.tuikit.atomicxcore.api.view.VolumeLevel
 import kotlinx.coroutines.supervisorScope
 import java.io.File
 import java.util.concurrent.atomic.AtomicInteger

+ 24 - 0
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/core/common/utils/CallExt.kt

@@ -0,0 +1,24 @@
+package io.trtc.tuikit.atomicx.callview.core.common.utils
+
+import io.trtc.tuikit.atomicxcore.api.call.CallInfo
+
+fun CallInfo.callerUid(): String? {
+    return inviterId
+}
+
+fun CallInfo.calleeUid(): String? {
+    return inviteeIds.firstOrNull()
+}
+
+/**
+ * 获取对方用户ID
+ */
+fun CallInfo.peerUid(selfUid: String): String? {
+    val caller = callerUid()
+    val callee = calleeUid()
+    return if (caller == selfUid) {
+        callee
+    } else {
+        caller
+    }
+}

+ 35 - 0
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/core/common/utils/CallUtils.kt

@@ -1,10 +1,45 @@
 package io.trtc.tuikit.atomicx.callview.core.common.utils
 
+import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
 import io.trtc.tuikit.atomicxcore.api.call.CallStore
 
 object CallUtils {
+
+    fun isSelfCaller(): Boolean {
+        val selfInfo = CallStore.shared.observerState.selfInfo.value
+        return isCaller(selfInfo.id)
+    }
+
     fun isCaller(userId: String): Boolean {
         val callerId = CallStore.shared.observerState.activeCall.value.inviterId
         return callerId == userId
     }
+
+    fun getCaller(): String? {
+        return CallStore.shared.observerState.activeCall.value.inviterId
+    }
+
+    fun isCallee(userId: String): Boolean {
+        val calleeList = CallStore.shared.observerState.activeCall.value.inviteeIds
+        return calleeList.contains(userId)
+    }
+
+    fun getCallee(): String? {
+        val calleeList = CallStore.shared.observerState.activeCall.value.inviteeIds
+        return calleeList.firstOrNull()
+    }
+
+
+    fun getSelfCallStatus(): CallParticipantStatus {
+        return CallStore.shared.observerState.selfInfo.value.status
+    }
+
+    /**
+     * 处于呼叫状态
+     */
+    fun isSelfInCalling(): Boolean {
+        val selfInfo = CallStore.shared.observerState.selfInfo.value
+        return (isCaller(selfInfo.id) && selfInfo.status == CallParticipantStatus.Waiting)
+                || selfInfo.status == CallParticipantStatus.Accept
+    }
 }

+ 1 - 1
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/aisubtitle/AISubtitle.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/aisubtitle/AISubtitle.kt

@@ -1,4 +1,4 @@
-package io.trtc.tuikit.atomicx.callview.public.aisubtitle
+package io.trtc.tuikit.atomicx.callview.widget.aisubtitle
 
 import android.content.Context
 import android.graphics.Typeface

+ 1 - 1
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/controls/AudioAndVideoCalleeWaitingView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/AudioAndVideoCalleeWaitingView.kt

@@ -1,4 +1,4 @@
-package io.trtc.tuikit.atomicx.callview.public.controls
+package io.trtc.tuikit.atomicx.callview.widget.controls
 
 import android.content.Context
 import android.view.LayoutInflater

+ 1 - 1
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/controls/AudioCallerWaitingAndAcceptedView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/AudioCallerWaitingAndAcceptedView.kt

@@ -1,4 +1,4 @@
-package io.trtc.tuikit.atomicx.callview.public.controls
+package io.trtc.tuikit.atomicx.callview.widget.controls
 
 import android.content.Context
 import android.view.LayoutInflater

+ 2 - 2
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/controls/MultiCallControlsView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/MultiCallControlsView.kt

@@ -1,11 +1,11 @@
-package io.trtc.tuikit.atomicx.callview.public.controls
+package io.trtc.tuikit.atomicx.callview.widget.controls
 
 import android.content.Context
 import android.widget.RelativeLayout
 import androidx.constraintlayout.widget.ConstraintLayout
 import io.trtc.tuikit.atomicx.callview.core.common.utils.CallUtils
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
+import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job

+ 2 - 2
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/controls/SingleCallControlsView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/SingleCallControlsView.kt

@@ -1,12 +1,12 @@
-package io.trtc.tuikit.atomicx.callview.public.controls
+package io.trtc.tuikit.atomicx.callview.widget.controls
 
 import android.content.Context
 import android.widget.RelativeLayout
 import androidx.constraintlayout.widget.ConstraintLayout
 import io.trtc.tuikit.atomicx.callview.core.common.utils.Logger
 import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
+import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job

+ 6 - 6
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/controls/VideoCallerAndCalleeAcceptedView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/VideoCallerAndCalleeAcceptedView.kt

@@ -1,7 +1,9 @@
-package io.trtc.tuikit.atomicx.callview.public.controls
+package io.trtc.tuikit.atomicx.callview.widget.controls
 
 import android.content.Context
+import android.graphics.drawable.Drawable
 import android.view.LayoutInflater
+import android.view.MotionEvent
 import android.view.View
 import android.widget.ImageView
 import android.widget.RelativeLayout
@@ -11,22 +13,20 @@ import androidx.constraintlayout.widget.ConstraintSet
 import androidx.core.content.ContextCompat
 import androidx.transition.ChangeBounds
 import androidx.transition.TransitionManager
-import com.trtc.tuikit.common.imageloader.ImageLoader
-import android.graphics.drawable.Drawable
-import android.view.MotionEvent
 import com.tencent.cloud.tuikit.engine.call.TUICallEngine
 import com.tencent.cloud.tuikit.engine.common.TUICommonDefine
 import com.tencent.qcloud.tuicore.permission.PermissionCallback
-import io.trtc.tuikit.atomicx.callview.core.common.Constants
+import com.trtc.tuikit.common.imageloader.ImageLoader
 import com.trtc.tuikit.common.util.ScreenUtil
 import io.trtc.tuikit.atomicx.R
+import io.trtc.tuikit.atomicx.callview.core.common.Constants
 import io.trtc.tuikit.atomicx.callview.core.common.Constants.BLUR_LEVEL_CLOSE
 import io.trtc.tuikit.atomicx.callview.core.common.Constants.BLUR_LEVEL_HIGH
 import io.trtc.tuikit.atomicx.callview.core.common.utils.Logger
 import io.trtc.tuikit.atomicx.callview.core.common.utils.PermissionRequest
 import io.trtc.tuikit.atomicx.callview.core.common.widget.ControlButton
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
+import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.device.AudioRoute
 import io.trtc.tuikit.atomicxcore.api.device.DeviceStatus
 import io.trtc.tuikit.atomicxcore.api.device.DeviceStore

+ 1 - 1
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/controls/VideoCallerWaitingView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/controls/VideoCallerWaitingView.kt

@@ -1,4 +1,4 @@
-package io.trtc.tuikit.atomicx.callview.public.controls
+package io.trtc.tuikit.atomicx.callview.widget.controls
 
 import android.content.Context
 import android.view.LayoutInflater

+ 6 - 3
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/hint/HintView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/hint/HintView.kt

@@ -1,21 +1,24 @@
-package io.trtc.tuikit.atomicx.callview.public.hint
+package io.trtc.tuikit.atomicx.callview.widget.hint
 
 import android.content.Context
+import android.util.AttributeSet
 import android.view.Gravity
 import android.view.View
 import androidx.appcompat.widget.AppCompatTextView
 import androidx.core.content.ContextCompat
 import io.trtc.tuikit.atomicx.R
 import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
+import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.device.NetworkQuality
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 
-class HintView(context: Context) : AppCompatTextView(context) {
+class HintView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyle: Int = 0,
+) : AppCompatTextView(context, attrs, defStyle) {
     private var subscribeStateJob: Job? = null
     private var isFirstShowAccept = true
     private var callStatus = CallParticipantStatus.None

+ 6 - 3
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/hint/TimerView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/hint/TimerView.kt

@@ -1,18 +1,21 @@
-package io.trtc.tuikit.atomicx.callview.public.hint
+package io.trtc.tuikit.atomicx.callview.widget.hint
 
 import android.content.Context
+import android.util.AttributeSet
 import androidx.appcompat.widget.AppCompatTextView
 import androidx.core.content.ContextCompat
 import com.tencent.qcloud.tuicore.util.DateTimeUtil
 import io.trtc.tuikit.atomicx.R
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
+import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 
-class TimerView(context: Context) : AppCompatTextView(context) {
+class TimerView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyle: Int = 0,
+) : AppCompatTextView(context, attrs, defStyle) {
     private var subscribeStateJob: Job? = null
 
     override fun onAttachedToWindow() {

+ 2 - 2
frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/public/multi/MultiCallWaitingView.kt → frame/atomic_x/src/main/java/io/trtc/tuikit/atomicx/callview/widget/multi/MultiCallWaitingView.kt

@@ -1,4 +1,4 @@
-package io.trtc.tuikit.atomicx.callview.public.multi
+package io.trtc.tuikit.atomicx.callview.widget.multi
 
 import android.content.Context
 import android.view.Gravity
@@ -12,8 +12,8 @@ import com.trtc.tuikit.common.imageloader.ImageLoader
 import com.trtc.tuikit.common.util.ScreenUtil
 import io.trtc.tuikit.atomicx.R
 import io.trtc.tuikit.atomicx.callview.core.common.utils.CallUtils
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import io.trtc.tuikit.atomicxcore.api.call.CallParticipantInfo
+import io.trtc.tuikit.atomicxcore.api.call.CallStore
 import kotlinx.coroutines.MainScope
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch

+ 1 - 2
frame/atomic_x/src/main/res-callview/layout/callview_root_view.xml

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/callview_color_transparent">
@@ -56,7 +55,7 @@
         android:orientation="horizontal"
         app:layout_constraintGuide_percent="0.5" />
 
-    <io.trtc.tuikit.atomicx.callview.public.aisubtitle.AISubtitle
+    <io.trtc.tuikit.atomicx.callview.widget.aisubtitle.AISubtitle
         android:id="@+id/ai_subtitle"
         android:layout_width="match_parent"
         android:layout_height="0dp"

+ 0 - 19
frame/tuicallkit-kt/.gitignore

@@ -1,19 +0,0 @@
-*.iml
-.gradle
-*/.gradle/
-*.gradle/
-/local.properties
-/.idea/caches
-/.idea/libraries
-/.idea/modules.xml
-/.idea/workspace.xml
-/.idea/navEditor.xml
-/.idea/assetWizardSettings.xml
-*.idea/
-.DS_Store
-/build
-/captures
-.externalNativeBuild
-.cxx
-local.properties
-

+ 0 - 49
frame/tuicallkit-kt/build.gradle

@@ -1,49 +0,0 @@
-plugins {
-    id 'com.android.library'
-    id 'org.jetbrains.kotlin.android'
-}
-
-android {
-    compileSdk 34
-    namespace "com.tencent.qcloud.tuikit.tuicallkit"
-    defaultConfig {
-        minSdkVersion 21
-        versionName "1.0"
-        versionCode 1
-    }
-    lintOptions {
-        disable 'StringFormatInvalid'
-    }
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-    def javaVersion = JavaVersion.VERSION_1_8
-    def gradleMajorVersion = gradle.gradleVersion.tokenize('.')[0].toInteger()
-    if (gradleMajorVersion >= 8) {
-        javaVersion = JavaVersion.VERSION_17
-    }
-
-    compileOptions {
-        sourceCompatibility javaVersion
-        targetCompatibility javaVersion
-    }
-}
-
-dependencies {
-   // api fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
-    api project(':atomic_x')
-
-    api libs.androidx.appcompat
-    api libs.android.material
-    api libs.androidx.recyclerview
-    api libs.androidx.constraint.layout
-    api libs.gson
-
-    api libs.tencent.imsdk
-    api libs.tencent.tui.core
-    api libs.tencent.uikit.common
-    api libs.tencent.atomic.x
-}

+ 0 - 5
frame/tuicallkit-kt/proguard-rules.pro

@@ -1,5 +0,0 @@
-# Keep all classes in com.tencent package
--keep class com.tencent.** { *; }
-
-# Keep all classes in io.trtc.tuikit package
--keep class io.trtc.tuikit.** { *; }

+ 0 - 53
frame/tuicallkit-kt/src/main/AndroidManifest.xml

@@ -1,53 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-    <uses-permission android:name="android.permission.VIBRATE" />
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-    <uses-permission android:name="android.permission.CAMERA" />
-
-    <uses-feature android:name="android.hardware.camera" />
-    <uses-feature android:name="android.hardware.camera.autofocus" />
-
-    <uses-permission
-        android:name="android.permission.BLUETOOTH"
-        android:maxSdkVersion="30" />
-    <uses-permission
-        android:name="android.permission.BLUETOOTH_ADMIN"
-        android:maxSdkVersion="30" />
-    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
-
-    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
-    <application>
-        <activity
-            android:name=".view.CallMainActivity"
-            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
-            android:launchMode="singleTask"
-            android:supportsPictureInPicture="true"
-            android:taskAffinity="${applicationId}.callkit"
-            android:theme="@style/Theme.AppCompat.NoActionBar" />
-        <activity
-            android:name=".view.component.inviteuser.SelectGroupMemberActivity"
-            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
-            android:launchMode="singleTask"
-            android:theme="@style/Theme.AppCompat.NoActionBar" />
-
-        <provider
-            android:name="com.tencent.qcloud.tuikit.tuicallkit.manager.bridge.Initializer"
-            android:authorities="${applicationId}.Initializer"
-            android:enabled="true"
-            android:exported="false" />
-
-        <receiver
-            android:name=".view.component.incomingbanner.IncomingCallReceiver"
-            android:enabled="true"
-            android:exported="false">
-            <intent-filter>
-                <action android:name="reject_call_action" />
-            </intent-filter>
-        </receiver>
-    </application>
-</manifest>

+ 0 - 177
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/common/utils/PermissionRequest.kt

@@ -1,177 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.common.utils
-
-import android.Manifest
-import android.app.AppOpsManager
-import android.app.NotificationManager
-import android.content.Context
-import android.os.Build
-import com.tencent.qcloud.tuicore.TUIConfig
-import com.tencent.qcloud.tuicore.TUIConstants
-import com.tencent.qcloud.tuicore.TUICore
-import com.tencent.qcloud.tuicore.permission.PermissionCallback
-import com.tencent.qcloud.tuicore.permission.PermissionRequester
-import com.tencent.qcloud.tuicore.util.TUIBuild
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-
-object PermissionRequest {
-    fun requestPermissions(context: Context, type: CallMediaType?, callback: PermissionCallback?) {
-        val title = StringBuilder().append(context.getString(R.string.callkit_permission_microphone))
-        val reason = StringBuilder()
-        reason.append(getMicrophonePermissionHint(context))
-
-        val permissionList: MutableList<String> = ArrayList()
-        permissionList.add(Manifest.permission.RECORD_AUDIO)
-        if (CallMediaType.Video == type) {
-            title.append(context.getString(R.string.callkit_permission_separator))
-            title.append(context.getString(R.string.callkit_permission_camera))
-            reason.append(getCameraPermissionHint(context))
-            permissionList.add(Manifest.permission.CAMERA)
-        }
-
-        if (PermissionRequester.newInstance(*permissionList.toTypedArray()).has()) {
-            callback?.onGranted()
-            return
-        }
-
-        val permissionCallback: PermissionCallback = object : PermissionCallback() {
-            override fun onGranted() {
-                requestBluetoothPermission(context, object : PermissionCallback() {
-                    override fun onGranted() {
-                        callback?.onGranted()
-                    }
-                })
-            }
-
-            override fun onDenied() {
-                super.onDenied()
-                callback?.onDenied()
-            }
-        }
-        val applicationInfo = context.applicationInfo
-        val appName = context.packageManager.getApplicationLabel(applicationInfo).toString()
-        PermissionRequester.newInstance(*permissionList.toTypedArray())
-            .title(context.getString(R.string.callkit_permission_title, appName, title))
-            .description(reason.toString())
-            .settingsTip("${context.getString(R.string.callkit_permission_tips, title)} $reason".trimIndent())
-            .callback(permissionCallback)
-            .request()
-    }
-
-    fun requestCameraPermission(context: Context, callback: PermissionCallback?) {
-        if (PermissionRequester.newInstance(Manifest.permission.CAMERA).has()) {
-            callback?.onGranted()
-            return
-        }
-
-        val permissionCallback: PermissionCallback = object : PermissionCallback() {
-            override fun onGranted() {
-                callback?.onGranted()
-            }
-
-            override fun onDenied() {
-                super.onDenied()
-                callback?.onDenied()
-            }
-        }
-
-        val title = context.getString(R.string.callkit_permission_camera)
-        val reason = getCameraPermissionHint(context)
-        val appName = context.packageManager.getApplicationLabel(context.applicationInfo).toString()
-
-        PermissionRequester.newInstance(Manifest.permission.CAMERA)
-            .title(context.getString(R.string.callkit_permission_title, appName, title))
-            .description(reason)
-            .settingsTip("${context.getString(R.string.callkit_permission_tips, title)} $reason".trimIndent())
-            .callback(permissionCallback)
-            .request()
-    }
-
-    /**
-     * Android S(31) need apply for Nearby devices(Bluetooth) permission to support bluetooth headsets.
-     * Please refer to: https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
-     */
-    private fun requestBluetoothPermission(context: Context, callback: PermissionCallback) {
-        if (TUIBuild.getVersionInt() < Build.VERSION_CODES.S) {
-            callback.onGranted()
-            return
-        }
-        if (PermissionRequester.newInstance(Manifest.permission.BLUETOOTH_CONNECT).has()) {
-            callback.onGranted()
-            return
-        }
-
-        val title = context.getString(R.string.callkit_permission_bluetooth)
-        val reason = context.getString(R.string.callkit_permission_bluetooth_reason)
-        val applicationInfo = context.applicationInfo
-        val appName = context.packageManager.getApplicationLabel(applicationInfo).toString()
-        PermissionRequester.newInstance(Manifest.permission.BLUETOOTH_CONNECT)
-            .title(context.getString(R.string.callkit_permission_title, appName, title))
-            .description(reason)
-            .settingsTip(reason)
-            .callback(object : PermissionCallback() {
-                override fun onGranted() {
-                    callback.onGranted()
-                }
-
-                override fun onDenied() {
-                    super.onDenied()
-                    //bluetooth is unnecessary permission, return permission granted
-                    callback.onGranted()
-                }
-            })
-            .request()
-    }
-
-    private fun getMicrophonePermissionHint(context: Context): String {
-        val microphonePermissionsDescription = TUICore.createObject(
-            TUIConstants.Privacy.PermissionsFactory.FACTORY_NAME,
-            TUIConstants.Privacy.PermissionsFactory.PermissionsName.MICROPHONE_PERMISSIONS, null
-        ) as String?
-        return if (!microphonePermissionsDescription.isNullOrEmpty()) {
-            microphonePermissionsDescription
-        } else {
-            context.getString(R.string.callkit_permission_mic_reason)
-        }
-    }
-
-    private fun getCameraPermissionHint(context: Context): String {
-        val cameraPermissionsDescription = TUICore.createObject(
-            TUIConstants.Privacy.PermissionsFactory.FACTORY_NAME,
-            TUIConstants.Privacy.PermissionsFactory.PermissionsName.CAMERA_PERMISSIONS, null
-        ) as String?
-        return if (!cameraPermissionsDescription.isNullOrEmpty()) {
-            cameraPermissionsDescription
-        } else {
-            context.getString(R.string.callkit_permission_camera_reason)
-        }
-    }
-
-    fun isNotificationEnabled(): Boolean {
-        val context = TUIConfig.getAppContext()
-        if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.O) {
-            // For Android Oreo and above
-            val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
-            return manager.areNotificationsEnabled()
-        }
-        if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.KITKAT) {
-            // For versions prior to Android Oreo
-            var appOps: AppOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
-            val appInfo = context.applicationInfo
-            val packageName = context.applicationContext.packageName
-            val uid = appInfo.uid
-            try {
-                var appOpsClass: Class<*> = Class.forName(AppOpsManager::class.java.name)
-                val checkOpNoThrowMethod = appOpsClass.getMethod(
-                    "checkOpNoThrow", Integer.TYPE, Integer.TYPE, String::class.java
-                )
-                val opPostNotificationValue = appOpsClass.getDeclaredField("OP_POST_NOTIFICATION")
-                val value = opPostNotificationValue[Int::class.java] as Int
-                return checkOpNoThrowMethod.invoke(appOps, value, uid, packageName) as Int == AppOpsManager.MODE_ALLOWED
-            } catch (e: Exception) {
-                e.printStackTrace()
-            }
-        }
-        return false
-    }
-}

+ 0 - 526
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/manager/bridge/CallKitService.kt

@@ -1,526 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.manager.bridge
-
-import android.content.Context
-import android.os.Bundle
-import android.text.TextUtils
-import android.util.Log
-import android.view.View
-import android.view.ViewGroup
-import androidx.activity.result.ActivityResult
-import androidx.activity.result.ActivityResultCaller
-import com.tencent.cloud.tuikit.engine.call.TUICallEngine
-import com.tencent.cloud.tuikit.engine.common.TUICommonDefine
-import com.tencent.qcloud.tuicore.TUIConstants
-import com.tencent.qcloud.tuicore.TUIConstants.TUICalling.ObjectFactory.RecentCalls
-import com.tencent.qcloud.tuicore.TUICore
-import com.tencent.qcloud.tuicore.TUILogin
-import com.tencent.qcloud.tuicore.interfaces.ITUIExtension
-import com.tencent.qcloud.tuicore.interfaces.ITUINotification
-import com.tencent.qcloud.tuicore.interfaces.ITUIObjectFactory
-import com.tencent.qcloud.tuicore.interfaces.ITUIService
-import com.tencent.qcloud.tuicore.interfaces.TUIExtensionEventListener
-import com.tencent.qcloud.tuicore.interfaces.TUIExtensionInfo
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.TUICallKit
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
-import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
-import com.tencent.qcloud.tuikit.tuicallkit.manager.feature.CallingBellFeature
-import com.tencent.qcloud.tuikit.tuicallkit.manager.feature.CallingVibratorFeature
-import com.tencent.qcloud.tuikit.tuicallkit.manager.feature.NotificationFeature
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.joiningroupcall.JoinCallView
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.joiningroupcall.JoinCallViewManager
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.RecentCallsFragment
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallParams
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import io.trtc.tuikit.atomicxcore.api.login.LoginStore
-import org.json.JSONException
-import org.json.JSONObject
-
-class CallKitService private constructor(context: Context) : ITUINotification, ITUIService, ITUIExtension,
-    ITUIObjectFactory {
-    private var appContext: Context = context.applicationContext
-    private var joinCallViewManager: JoinCallViewManager? = null
-
-    init {
-        TUICore.registerEvent(
-            TUIConstants.TUILogin.EVENT_IMSDK_INIT_STATE_CHANGED,
-            TUIConstants.TUILogin.EVENT_SUB_KEY_START_INIT, this
-        )
-        TUICore.registerEvent(
-            TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_KEY,
-            TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_SUB_KEY, this
-        )
-        TUICore.registerEvent(
-            TUIConstants.TUILogin.EVENT_LOGIN_STATE_CHANGED,
-            TUIConstants.TUILogin.EVENT_SUB_KEY_USER_LOGIN_SUCCESS, this
-        )
-        TUICore.registerEvent(
-            TUIConstants.TUILogin.EVENT_LOGIN_STATE_CHANGED,
-            TUIConstants.TUILogin.EVENT_SUB_KEY_USER_LOGOUT_SUCCESS, this
-        )
-
-        TUICore.registerService(TUIConstants.TUICalling.SERVICE_NAME, this)
-
-        TUICore.registerExtension(TUIConstants.TUIChat.Extension.InputMore.CLASSIC_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIChat.Extension.InputMore.MINIMALIST_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIContact.Extension.GroupProfileItem.MINIMALIST_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIContact.Extension.GroupProfileItem.CLASSIC_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIContact.Extension.FriendProfileItem.CLASSIC_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIContact.Extension.FriendProfileItem.MINIMALIST_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.CLASSIC_EXTENSION_ID, this)
-        TUICore.registerExtension(TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.MINIMALIST_EXTENSION_ID, this)
-
-        TUICore.registerObjectFactory(TUIConstants.TUICalling.ObjectFactory.FACTORY_NAME, this)
-        TUICore.registerExtension(TUIConstants.TUIChat.Extension.ChatViewTopAreaExtension.EXTENSION_ID, this)
-    }
-
-    override fun onNotifyEvent(key: String?, subKey: String?, param: Map<String, Any>?) {
-        if (TextUtils.isEmpty(key) || TextUtils.isEmpty(subKey)) {
-            return
-        }
-        if (TUIConstants.TUILogin.EVENT_IMSDK_INIT_STATE_CHANGED == key
-            && TUIConstants.TUILogin.EVENT_SUB_KEY_START_INIT == subKey
-        ) {
-            Logger.i(TAG, "onNotifyEvent, start, framework: " + Constants.framework)
-            if (Constants.framework == Constants.CALL_FRAMEWORK_NATIVE) {
-                TUICallKit.createInstance(appContext)
-                adaptiveComponentReport()
-            }
-            setExcludeFromHistoryMessage()
-        }
-        if (TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_KEY == key
-            && TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_SUB_KEY == subKey
-        ) {
-            val data =
-                param?.get(TUIConstants.TIMPush.EVENT_IM_LOGIN_AFTER_APP_WAKEUP_PUSH_MESSAGE_KEY) as Map<String, String>
-            Log.i(TAG, "onNotifyEvent: callOfflineData : $data")
-
-            val map = HashMap<String, Any?>()
-            map[TUIConstants.TIMPush.NOTIFICATION.PUSH_ID] = data[TUIConstants.TIMPush.NOTIFICATION.PUSH_ID]
-            map[TUIConstants.TIMPush.NOTIFICATION.PUSH_EVENT_TIME_KEY] = System.currentTimeMillis() / 1000
-            map[TUIConstants.TIMPush.NOTIFICATION.PUSH_EVENT_TYPE_KEY] = 0
-
-            TUICore.callService(
-                TUIConstants.TIMPush.SERVICE_NAME, TUIConstants.TIMPush.METHOD_REPORT_NOTIFICATION_CLICKED, map
-            )
-        }
-        if (TUIConstants.TUILogin.EVENT_LOGIN_STATE_CHANGED == key) {
-            if (TUIConstants.TUILogin.EVENT_SUB_KEY_USER_LOGOUT_SUCCESS == subKey) {
-                CallStore.shared.hangup(null)
-                CallManager.instance.reset()
-                // TUICallEngine.destroyInstance() todo 待修复反复登录后收不到离线来电的问题后打开
-            } else if (TUIConstants.TUILogin.EVENT_SUB_KEY_USER_LOGIN_SUCCESS == subKey) {
-                initCallEngine()
-            }
-        }
-    }
-
-    private fun adaptiveComponentReport() {
-        try {
-            val params = JSONObject()
-            params.put("framework", 1)
-            when {
-                TUICore.getService(TUIConstants.TUIChat.SERVICE_NAME) != null ->
-                    params.put("component", Constants.CALL_COMPONENT_CHAT)
-
-                else -> params.put("component", Constants.CALL_COMPONENT)
-            }
-            params.put("language", Constants.CALL_LANGUAGE_KOTLIN)
-
-            val jsonObject = JSONObject()
-            jsonObject.put("api", "setFramework")
-            jsonObject.put("params", params)
-            CallManager.instance.callExperimentalAPI(jsonObject.toString())
-        } catch (e: JSONException) {
-            e.printStackTrace()
-        }
-    }
-
-    private fun setExcludeFromHistoryMessage() {
-        if (TUICore.getService(TUIConstants.TUIChat.SERVICE_NAME) == null) {
-            return
-        }
-        try {
-            val params = JSONObject()
-            params.put("excludeFromHistoryMessage", false)
-            val jsonObject = JSONObject()
-            jsonObject.put("api", "setExcludeFromHistoryMessage")
-            jsonObject.put("params", params)
-            TUICallEngine.createInstance(appContext).callExperimentalAPI(jsonObject.toString())
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-    }
-
-    private fun initCallEngine() {
-        val sdkAppId = TUILogin.getSdkAppId()
-        val userId = TUILogin.getLoginUser()
-        val userSig = TUILogin.getUserSig()
-        Logger.i(TAG, "sdkAppId=$sdkAppId userId=$userId")
-        LoginStore.shared.login(appContext, sdkAppId, userId, userSig, null)
-        TUICallEngine.createInstance(appContext).init(sdkAppId, userId, userSig,
-            object : TUICommonDefine.Callback {
-                override fun onSuccess() {
-                    Logger.i(TAG, "callEngine init success")
-                    val notificationFeature = NotificationFeature(appContext)
-                    notificationFeature.registerNotificationBannerChannel()
-                    CallingBellFeature(appContext)
-                    CallingVibratorFeature(appContext)
-                }
-
-                override fun onError(errCode: Int, errMsg: String) {
-                    Logger.e(TAG, "callEngine init failed, errCode: $errCode, errMsg: $errMsg")
-                }
-            })
-    }
-
-    companion object {
-        private const val TAG = "CallKitService"
-        private const val CALL_MEMBER_LIMIT = 9
-
-        fun sharedInstance(context: Context): CallKitService {
-            return CallKitService(context)
-        }
-    }
-
-    override fun onRaiseExtension(extensionID: String?, parentView: View?, param: MutableMap<String, Any>?): Boolean {
-        if (extensionID != TUIConstants.TUIChat.Extension.ChatViewTopAreaExtension.EXTENSION_ID || param == null) {
-            return false
-        }
-
-        val isGroupChat = param[TUIConstants.TUIChat.Extension.ChatViewTopAreaExtension.IS_GROUP] as? Boolean
-        if (isGroupChat == null || !isGroupChat) {
-            return false
-        }
-
-        val groupId = param[TUIConstants.TUIChat.Extension.ChatViewTopAreaExtension.CHAT_ID] as? String
-        if (groupId.isNullOrEmpty()) {
-            return false
-        }
-
-        if (parentView !is ViewGroup) {
-            return false
-        }
-        parentView.removeAllViews()
-
-        Log.i(TAG, "JoinInGroupCall, groupId: $groupId")
-
-        val manager = getJoinCallViewManager()
-        val callView = JoinCallView(appContext)
-        manager.setJoinCallView(callView)
-        manager.getGroupAttributes(groupId)
-        parentView.addView(callView)
-        parentView.visibility = View.VISIBLE
-        return true
-    }
-
-    private fun getJoinCallViewManager(): JoinCallViewManager {
-        if (joinCallViewManager == null) {
-            joinCallViewManager = JoinCallViewManager(appContext)
-        }
-        return joinCallViewManager as JoinCallViewManager
-    }
-
-    override fun onGetExtension(extensionID: String?, param: Map<String?, Any?>?): List<TUIExtensionInfo?>? {
-        if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.InputMore.CLASSIC_EXTENSION_ID)) {
-            return getClassicChatInputMoreExtension(param)
-        } else if (TextUtils.equals(
-                extensionID, TUIConstants.TUIContact.Extension.GroupProfileItem.MINIMALIST_EXTENSION_ID
-            )
-        ) {
-            return getMinimalistGroupProfileExtension(param)
-        } else if (TextUtils.equals(
-                extensionID, TUIConstants.TUIContact.Extension.FriendProfileItem.CLASSIC_EXTENSION_ID
-            )
-        ) {
-            return getClassicFriendProfileExtension(param)
-        } else if (TextUtils.equals(
-                extensionID, TUIConstants.TUIContact.Extension.FriendProfileItem.MINIMALIST_EXTENSION_ID
-            )
-        ) {
-            return getMinimalistFriendProfileExtension(param)
-        } else if (TextUtils.equals(
-                extensionID, TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.MINIMALIST_EXTENSION_ID
-            )
-        ) {
-            return getMinimalistChatNavigationMoreExtension(param)
-        }
-        return null
-    }
-
-    private fun getClassicChatInputMoreExtension(param: Map<String?, Any?>?): List<TUIExtensionInfo>? {
-        val voiceCallExtension = TUIExtensionInfo()
-        voiceCallExtension.weight = 600
-        val videoCallExtension = TUIExtensionInfo()
-        videoCallExtension.weight = 500
-        val userID: String? = getOrDefault<String>(param, TUIConstants.TUIChat.Extension.InputMore.USER_ID, null)
-        val groupID: String? = getOrDefault<String>(param, TUIConstants.TUIChat.Extension.InputMore.GROUP_ID, null)
-        val voiceListener: ResultTUIExtensionEventListener = ResultTUIExtensionEventListener()
-        voiceListener.mediaType = CallMediaType.Audio
-        voiceListener.userID = userID
-        voiceListener.groupID = groupID
-        val videoListener: ResultTUIExtensionEventListener = ResultTUIExtensionEventListener()
-        videoListener.mediaType = CallMediaType.Video
-        videoListener.userID = userID
-        videoListener.groupID = groupID
-        voiceCallExtension.text = appContext.getString(R.string.callkit_audio_call)
-        voiceCallExtension.icon = R.drawable.tuicallkit_ic_audio_call
-        voiceCallExtension.extensionListener = voiceListener
-        voiceListener.activityResultCaller = getOrDefault<ActivityResultCaller>(
-            param, TUIConstants.TUIChat.Extension.InputMore.CONTEXT, null
-        )
-        videoCallExtension.text = appContext.getString(R.string.callkit_video_call)
-        videoCallExtension.icon = R.drawable.tuicallkit_ic_video_call
-        videoCallExtension.extensionListener = videoListener
-        videoListener.activityResultCaller = getOrDefault<ActivityResultCaller>(
-            param, TUIConstants.TUIChat.Extension.InputMore.CONTEXT, null
-        )
-        val filterVoice: Boolean =
-            getOrDefault(param, TUIConstants.TUIChat.Extension.InputMore.FILTER_VOICE_CALL, false) == true
-        val filterVideo: Boolean =
-            getOrDefault(param, TUIConstants.TUIChat.Extension.InputMore.FILTER_VIDEO_CALL, false) == true
-        val extensionInfoList: MutableList<TUIExtensionInfo> = ArrayList()
-        if (!filterVoice) {
-            extensionInfoList.add(voiceCallExtension)
-        }
-        if (!filterVideo) {
-            extensionInfoList.add(videoCallExtension)
-        }
-        return extensionInfoList
-    }
-
-    inner class ResultTUIExtensionEventListener : TUIExtensionEventListener() {
-        var activityResultCaller: ActivityResultCaller? = null
-        var mediaType: CallMediaType = CallMediaType.Audio
-        var isClassicUI = true
-        var userID: String? = null
-        var groupID: String? = null
-        override fun onClicked(param: Map<String, Any>?) {
-            if (!groupID.isNullOrEmpty()) {
-                var groupMemberSelectActivityName =
-                    TUIConstants.TUIContact.StartActivity.GroupMemberSelect.CLASSIC_ACTIVITY_NAME
-                if (!isClassicUI) {
-                    groupMemberSelectActivityName =
-                        TUIConstants.TUIContact.StartActivity.GroupMemberSelect.MINIMALIST_ACTIVITY_NAME
-                }
-                val bundle = Bundle()
-                bundle.putString(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID, groupID)
-                bundle.putBoolean(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FOR_CALL, true)
-                bundle.putInt(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.MEMBER_LIMIT, CALL_MEMBER_LIMIT)
-                TUICore.startActivityForResult(
-                    activityResultCaller, groupMemberSelectActivityName, bundle
-                ) { result: ActivityResult ->
-                    val stringList: ArrayList<String>? = result.data?.getStringArrayListExtra(
-                        TUIConstants.TUIContact.StartActivity.GroupMemberSelect.DATA_LIST
-                    )
-                    if (stringList != null) {
-                        startCall(groupID, stringList, mediaType)
-                    }
-                }
-            } else if (!userID.isNullOrEmpty()) {
-                val userList = mutableListOf<String>()
-                userList.add(userID!!)
-                startCall(groupID, userList, mediaType)
-            }
-        }
-    }
-
-    private fun getMinimalistGroupProfileExtension(param: Map<String?, Any?>?): List<TUIExtensionInfo>? {
-        val voiceCallExtension = TUIExtensionInfo()
-        voiceCallExtension.weight = 200
-        val videoCallExtension = TUIExtensionInfo()
-        videoCallExtension.weight = 100
-        val groupID = getOrDefault<String?>(param, TUIConstants.TUIContact.Extension.GroupProfileItem.GROUP_ID, null)
-        val voiceListener = ResultTUIExtensionEventListener()
-        voiceListener.mediaType = CallMediaType.Audio
-        voiceListener.groupID = groupID
-        voiceListener.isClassicUI = false
-        val videoListener = ResultTUIExtensionEventListener()
-        videoListener.mediaType = CallMediaType.Video
-        videoListener.groupID = groupID
-        videoListener.isClassicUI = false
-        voiceCallExtension.text = appContext.getString(R.string.callkit_audio_call)
-        voiceCallExtension.icon = R.drawable.tuicallkit_profile_minimalist_audio_icon
-        voiceCallExtension.extensionListener = voiceListener
-        voiceListener.activityResultCaller = getOrDefault<ActivityResultCaller?>(
-            param, TUIConstants.TUIContact.Extension.GroupProfileItem.CONTEXT, null
-        )
-        voiceListener.isClassicUI = false
-        videoCallExtension.text = appContext.getString(R.string.callkit_video_call)
-        videoCallExtension.icon = R.drawable.tuicallkit_profile_minimalist_video_icon
-        videoCallExtension.extensionListener = videoListener
-        videoListener.isClassicUI = false
-        videoListener.activityResultCaller = getOrDefault<ActivityResultCaller?>(
-            param, TUIConstants.TUIContact.Extension.GroupProfileItem.CONTEXT, null
-        )
-        val extensionInfoList: MutableList<TUIExtensionInfo> = java.util.ArrayList()
-        extensionInfoList.add(videoCallExtension)
-        extensionInfoList.add(voiceCallExtension)
-        return extensionInfoList
-    }
-
-    private fun getClassicFriendProfileExtension(param: Map<String?, Any?>?): List<TUIExtensionInfo>? {
-        val voiceCallExtension = TUIExtensionInfo()
-        voiceCallExtension.weight = 300
-        val videoCallExtension = TUIExtensionInfo()
-        videoCallExtension.weight = 200
-        val userID = getOrDefault<String?>(param, TUIConstants.TUIContact.Extension.FriendProfileItem.USER_ID, null)
-        val voiceListener = ResultTUIExtensionEventListener()
-        voiceListener.mediaType = CallMediaType.Audio
-        voiceListener.userID = userID
-        val videoListener = ResultTUIExtensionEventListener()
-        videoListener.mediaType = CallMediaType.Video
-        videoListener.userID = userID
-        voiceCallExtension.text = appContext.getString(R.string.callkit_audio_call)
-        voiceCallExtension.extensionListener = voiceListener
-        videoCallExtension.text = appContext.getString(R.string.callkit_video_call)
-        videoCallExtension.extensionListener = videoListener
-        val extensionInfoList: MutableList<TUIExtensionInfo> = java.util.ArrayList()
-        extensionInfoList.add(videoCallExtension)
-        extensionInfoList.add(voiceCallExtension)
-        return extensionInfoList
-    }
-
-    private fun getMinimalistFriendProfileExtension(param: Map<String?, Any?>?): List<TUIExtensionInfo>? {
-        val voiceCallExtension = TUIExtensionInfo()
-        voiceCallExtension.weight = 300
-        val videoCallExtension = TUIExtensionInfo()
-        videoCallExtension.weight = 200
-        val userID = getOrDefault<String?>(param, TUIConstants.TUIContact.Extension.FriendProfileItem.USER_ID, null)
-        val voiceListener = ResultTUIExtensionEventListener()
-        voiceListener.mediaType = CallMediaType.Audio
-        voiceListener.userID = userID
-        voiceListener.isClassicUI = false
-        val videoListener = ResultTUIExtensionEventListener()
-        videoListener.mediaType = CallMediaType.Video
-        videoListener.userID = userID
-        videoListener.isClassicUI = false
-        voiceCallExtension.icon = R.drawable.tuicallkit_profile_minimalist_audio_icon
-        voiceCallExtension.text = appContext.getString(R.string.callkit_audio_call)
-        voiceCallExtension.extensionListener = voiceListener
-        videoCallExtension.icon = R.drawable.tuicallkit_profile_minimalist_video_icon
-        videoCallExtension.text = appContext.getString(R.string.callkit_video_call)
-        videoCallExtension.extensionListener = videoListener
-        val extensionInfoList: MutableList<TUIExtensionInfo> = java.util.ArrayList()
-        extensionInfoList.add(videoCallExtension)
-        extensionInfoList.add(voiceCallExtension)
-        return extensionInfoList
-    }
-
-    private fun getMinimalistChatNavigationMoreExtension(param: Map<String?, Any?>?): List<TUIExtensionInfo>? {
-        val userID = getOrDefault<String?>(param, TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.USER_ID, null)
-        val groupID = getOrDefault<String?>(param, TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.GROUP_ID, null)
-        val voiceListener = ResultTUIExtensionEventListener()
-        voiceListener.mediaType = CallMediaType.Audio
-        voiceListener.groupID = groupID
-        voiceListener.userID = userID
-        voiceListener.isClassicUI = false
-        voiceListener.activityResultCaller = getOrDefault<ActivityResultCaller?>(
-            param, TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.CONTEXT, null
-        )
-        val videoListener = ResultTUIExtensionEventListener()
-        videoListener.mediaType = CallMediaType.Video
-        videoListener.groupID = groupID
-        videoListener.userID = userID
-        videoListener.isClassicUI = false
-        videoListener.activityResultCaller = getOrDefault<ActivityResultCaller?>(
-            param, TUIConstants.TUIChat.Extension.ChatNavigationMoreItem.CONTEXT, null
-        )
-        val voiceCallExtension = TUIExtensionInfo()
-        val videoCallExtension = TUIExtensionInfo()
-        voiceCallExtension.icon = R.drawable.tuicallkit_chat_title_bar_minimalist_audio_call_icon
-        voiceCallExtension.extensionListener = voiceListener
-        videoCallExtension.icon = R.drawable.tuicallkit_chat_title_bar_minimalist_video_call_icon
-        videoCallExtension.extensionListener = videoListener
-        val extensionInfoList: MutableList<TUIExtensionInfo> = java.util.ArrayList()
-        extensionInfoList.add(voiceCallExtension)
-        extensionInfoList.add(videoCallExtension)
-        return extensionInfoList
-    }
-
-    private fun <T> getOrDefault(map: Map<*, *>?, key: Any, defaultValue: T?): T? {
-        if (map == null || map.isEmpty()) {
-            return defaultValue
-        }
-        val value = map[key]
-        try {
-            if (value != null) {
-                return value as T
-            }
-        } catch (e: ClassCastException) {
-            return defaultValue
-        }
-        return defaultValue
-    }
-
-    override fun onCall(method: String?, param: Map<String?, Any?>?): Any? {
-        Log.i(TAG, "onCall, method: $method ,param: $param")
-        if (TextUtils.isEmpty(method)) {
-            return null
-        }
-        if (null != param && TextUtils.equals(TUIConstants.TUICalling.METHOD_NAME_ENABLE_FLOAT_WINDOW, method)) {
-            val enableFloatWindow = param[TUIConstants.TUICalling.PARAM_NAME_ENABLE_FLOAT_WINDOW] as Boolean
-            Log.i(TAG, "onCall, enableFloatWindow: $enableFloatWindow")
-            TUICallKit.createInstance(appContext).enableFloatWindow(enableFloatWindow)
-            return null
-        }
-        if (null != param && TextUtils.equals(TUIConstants.TUICalling.METHOD_NAME_ENABLE_MULTI_DEVICE, method)) {
-            val enable = param[TUIConstants.TUICalling.PARAM_NAME_ENABLE_MULTI_DEVICE] as Boolean
-            Log.i(TAG, "onCall, enableMultiDevice: $enable")
-            CallManager.instance.enableMultiDeviceAbility(enable, null)
-            return null
-        }
-        if (param != null && TextUtils.equals(TUIConstants.TUICalling.METHOD_NAME_ENABLE_INCOMING_BANNER, method)) {
-            val enable = param[TUIConstants.TUICalling.PARAM_NAME_ENABLE_INCOMING_BANNER] as Boolean
-            TUICallKit.createInstance(appContext).enableIncomingBanner(enable)
-            return null
-        }
-        if (param != null && TextUtils.equals(TUIConstants.TUICalling.METHOD_NAME_ENABLE_VIRTUAL_BACKGROUND, method)) {
-            val enable = param[TUIConstants.TUICalling.PARAM_NAME_ENABLE_VIRTUAL_BACKGROUND] as Boolean
-            TUICallKit.createInstance(appContext).enableVirtualBackground(enable)
-            return null
-        }
-        if (null != param && TextUtils.equals(TUIConstants.TUICalling.METHOD_NAME_CALL, method)) {
-            val userIDs = getOrDefault<Array<String>>(param, TUIConstants.TUICalling.PARAM_NAME_USERIDS, null)
-            val typeString = getOrDefault<String>(param, TUIConstants.TUICalling.PARAM_NAME_TYPE, "")
-            val groupID = getOrDefault<String>(param, TUIConstants.TUICalling.PARAM_NAME_GROUPID, "")
-
-            var userIdList: List<String?>? = userIDs?.toList() ?: ArrayList()
-            Logger.i(TAG, "onCall, groupID: $groupID, userIdList: $userIdList")
-            userIdList = userIdList?.filterNotNull()
-
-            var mediaType = CallMediaType.Audio
-            if (TUIConstants.TUICalling.TYPE_VIDEO == typeString) {
-                mediaType = CallMediaType.Video
-            }
-            if (userIdList != null) {
-                startCall(groupID, userIdList, mediaType)
-            }
-        }
-        return null
-    }
-
-    private fun startCall(groupID: String?, userIdList: List<String>, mediaType: CallMediaType) {
-        val params = CallParams()
-        params.timeout = Constants.CALL_WAITING_MAX_TIME
-        if (!groupID.isNullOrEmpty()) {
-            params.chatGroupId = groupID
-        }
-        TUICallKit.createInstance(appContext).calls(userIdList, mediaType, params, null)
-    }
-
-    override fun onCreateObject(objectName: String?, param: MutableMap<String?, Any?>?): Any? {
-        if (TextUtils.equals(objectName, RecentCalls.OBJECT_NAME)) {
-            var style = RecentCalls.UI_STYLE_MINIMALIST
-            if (param != null && param[RecentCalls.UI_STYLE] != null
-                && RecentCalls.UI_STYLE_CLASSIC == param[RecentCalls.UI_STYLE]!!
-            ) {
-                style = RecentCalls.UI_STYLE_CLASSIC
-            }
-            return RecentCallsFragment(style)
-        }
-        return null
-    }
-}

+ 0 - 271
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/CallMainActivity.kt

@@ -1,271 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view
-
-import android.app.AppOpsManager
-import android.app.PictureInPictureParams
-import android.content.pm.ActivityInfo
-import android.os.Build
-import android.os.Bundle
-import android.util.Rational
-import android.view.View
-import android.widget.ImageView
-import androidx.lifecycle.Lifecycle
-import android.Manifest
-import android.widget.FrameLayout
-import androidx.core.content.ContextCompat
-import com.tencent.cloud.tuikit.engine.common.TUICommonDefine
-import com.tencent.qcloud.tuicore.permission.PermissionCallback
-import com.tencent.qcloud.tuicore.permission.PermissionRequester
-import com.tencent.qcloud.tuicore.util.TUIBuild
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
-import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
-import com.tencent.qcloud.tuikit.tuicallkit.common.utils.DeviceUtils
-import com.tencent.qcloud.tuikit.tuicallkit.common.utils.PermissionRequest
-import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
-import com.tencent.qcloud.tuikit.tuicallkit.state.GlobalState
-import com.tencent.qcloud.tuikit.tuicallkit.state.ViewState
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.inviteuser.InviteUserButton
-import com.trtc.tuikit.common.FullScreenActivity
-import com.trtc.tuikit.common.imageloader.ImageLoader
-import com.trtc.tuikit.common.imageloader.ImageOptions
-import com.trtc.tuikit.common.ui.floatwindow.FloatWindowManager
-import io.trtc.tuikit.atomicx.callview.CallView
-import kotlinx.coroutines.launch
-import com.trtc.tuikit.common.util.ToastUtil
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
-import io.trtc.tuikit.atomicxcore.api.device.DeviceStore
-import io.trtc.tuikit.atomicxcore.api.view.CallLayoutTemplate
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-
-class CallMainActivity : FullScreenActivity() {
-    private var callView: CallView? = null
-    private var imageFloatIcon: ImageView? = null
-    private var inviteUserButton: FrameLayout? = null
-    private var subscribeStateJob: Job? = null
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        DeviceUtils.setScreenLockParams(window)
-        if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.O_MR1) {
-            setShowWhenLocked(true)
-            setTurnScreenOn(true)
-        }
-        setContentView(R.layout.tuicallkit_activity_call_kit)
-        requestedOrientation = when (GlobalState.instance.orientation) {
-            Constants.Orientation.Portrait -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-            Constants.Orientation.LandScape -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
-            else -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
-        }
-        subscribeStateJob = CoroutineScope(Dispatchers.Main).launch {
-            observeSelfInfo()
-        }
-        val mediaType = CallStore.shared.observerState.activeCall.value.mediaType
-        if (mediaType != null) {
-            setAudioDeviceRoute(mediaType)
-            openDeviceMediaForMediaType(mediaType)
-        }
-    }
-
-    private fun initView() {
-        val callStatus = CallStore.shared.observerState.selfInfo.value.status
-        if (CallParticipantStatus.None == callStatus) {
-            finishCallMainActivity()
-            return
-        }
-        val callId = CallStore.shared.observerState.activeCall.value.callId
-        KeyMetrics.countUV(KeyMetrics.EventId.WAKEUP, callId)
-        setBackground()
-        addCallView()
-        addFloatButton()
-        addInviteButton()
-        FloatWindowManager.sharedInstance().dismiss()
-        CallManager.instance.viewState.router.set(ViewState.ViewRouter.FullView)
-    }
-
-    private suspend fun observeSelfInfo() {
-        CallStore.shared.observerState.selfInfo.collect { selfInfo ->
-            if (selfInfo.status == CallParticipantStatus.None) {
-                finishCallMainActivity()
-                return@collect
-            }
-        }
-    }
-
-    private fun finishCallMainActivity() {
-        callView?.removeAllViews()
-        if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.LOLLIPOP) {
-            finishAndRemoveTask()
-        } else {
-            finish()
-        }
-    }
-
-    private fun addCallView() {
-        val callViewContainer = findViewById<FrameLayout>(R.id.call_view_container)
-        callViewContainer?.removeAllViews()
-        callView?.removeAllViews()
-        callView = CallView(this)
-        val chatGroupId = CallStore.shared.observerState.activeCall.value.chatGroupId
-        val inviteeIdListSize = CallStore.shared.observerState.activeCall.value.inviteeIds.size
-        if (inviteeIdListSize == 1 && chatGroupId.isEmpty()) {
-            callView?.setLayoutTemplate(CallLayoutTemplate.Float)
-        } else {
-            callView?.setLayoutTemplate(CallLayoutTemplate.Grid)
-        }
-        val view = GlobalState.instance.callAdapter?.onCreateMainView(callView!!) ?: callView
-        callViewContainer?.addView(view)
-    }
-
-    private fun addFloatButton() {
-        imageFloatIcon = findViewById(R.id.image_float_icon)
-        imageFloatIcon?.setOnClickListener {
-            if (FloatWindowManager.sharedInstance().isPictureInPictureSupported) {
-                enterPictureInPictureModeWithBuild()
-            }
-        }
-    }
-
-    private fun addInviteButton() {
-        inviteUserButton = findViewById(R.id.rl_layout_invite_user)
-        if (shouldShowInviteButton()) {
-            inviteUserButton?.visibility = View.VISIBLE
-            inviteUserButton?.addView(InviteUserButton(this))
-            return
-        }
-        inviteUserButton?.visibility = View.GONE
-    }
-
-    private fun shouldShowInviteButton(): Boolean {
-        val chatGroupId = CallStore.shared.observerState.activeCall.value.chatGroupId
-        return !chatGroupId.isNullOrEmpty()
-    }
-
-    private fun setBackground() {
-        val imageBackground = findViewById<ImageView>(R.id.img_view_background)
-        val selfUser = CallStore.shared.observerState.selfInfo.value
-        val option = ImageOptions.Builder().setPlaceImage(R.drawable.tuicallkit_ic_avatar).setBlurEffect(80f).build()
-        ImageLoader.load(this, imageBackground, selfUser.avatarUrl, option)
-        imageBackground?.setColorFilter(ContextCompat.getColor(this, R.color.callkit_color_blur_mask))
-    }
-
-    override fun onResume() {
-        super.onResume()
-        val mediaType = CallStore.shared.observerState.activeCall.value.mediaType
-        PermissionRequest.requestPermissions(application, mediaType,
-            object : PermissionCallback() {
-                override fun onGranted() {
-                    initView()
-                }
-
-                override fun onDenied() {
-                    val self = CallStore.shared.observerState.selfInfo.value
-                    if (!isCaller(self.id)) {
-                        CallManager.instance.reject(null)
-                    }
-                    finishCallMainActivity()
-                }
-            })
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        subscribeStateJob?.cancel()
-        Logger.i(TAG, "onDestroy")
-    }
-
-    override fun onUserLeaveHint() {
-        val hasAudioPermission = PermissionRequester.newInstance(Manifest.permission.RECORD_AUDIO).has()
-        if (!hasAudioPermission) {
-            return
-        }
-        val hasVideoPermission = PermissionRequester.newInstance(Manifest.permission.CAMERA).has()
-        val mediaType = CallStore.shared.observerState.activeCall.value.mediaType
-        if (mediaType == CallMediaType.Video && !hasVideoPermission) {
-            return
-        }
-        enterPictureInPictureModeWithBuild()
-    }
-
-    override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
-        super.onPictureInPictureModeChanged(isInPictureInPictureMode)
-        imageFloatIcon?.visibility = if (isInPictureInPictureMode) View.GONE else View.VISIBLE
-        if (shouldShowInviteButton()) {
-            inviteUserButton?.visibility = if (isInPictureInPictureMode) View.GONE else View.VISIBLE
-        }
-        if (isInPictureInPictureMode) {
-            callView?.setLayoutTemplate(CallLayoutTemplate.Pip)
-        } else {
-            hangupOnPipWindowClose()
-        }
-    }
-
-    private fun hangupOnPipWindowClose() {
-        if (lifecycle.currentState == Lifecycle.State.CREATED) {
-            Logger.i(TAG, "user close pip window")
-            CallManager.instance.hangup(null)
-        }
-    }
-
-    private fun enterPictureInPictureModeWithBuild() {
-        if (!lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
-            return
-        }
-        if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.O && hasPipModePermission()) {
-            val pictureInPictureParams: PictureInPictureParams.Builder = PictureInPictureParams.Builder()
-            val floatViewWidth = resources.getDimensionPixelSize(R.dimen.callkit_video_small_view_width)
-            val floatViewHeight = resources.getDimensionPixelSize(R.dimen.callkit_video_small_view_height)
-            val aspectRatio = Rational(floatViewWidth, floatViewHeight)
-            pictureInPictureParams.setAspectRatio(aspectRatio).build()
-            val requestPipSuccess = this.enterPictureInPictureMode(pictureInPictureParams.build())
-            if (!requestPipSuccess) {
-                CallManager.instance.viewState.enterPipMode.set(false)
-                return
-            }
-        } else {
-            Logger.w(TAG, "current version (" + Build.VERSION.SDK_INT + ") does not support picture-in-picture")
-        }
-    }
-
-    private fun hasPipModePermission(): Boolean {
-        val appOpsManager = this.getSystemService(APP_OPS_SERVICE) as AppOpsManager
-        val hasPipModePermission =
-            (AppOpsManager.MODE_ALLOWED == appOpsManager.checkOpNoThrow(
-                AppOpsManager.OPSTR_PICTURE_IN_PICTURE,
-                this.applicationInfo.uid,
-                this.packageName
-            ))
-        if (!hasPipModePermission) {
-            ToastUtil.toastShortMessage(getString(R.string.callkit_enter_pip_mode_fail_hint))
-        }
-        return hasPipModePermission
-    }
-
-    private fun openDeviceMediaForMediaType(mediaType: CallMediaType) {
-        DeviceStore.shared().openLocalMicrophone(null)
-        if (mediaType == CallMediaType.Video) {
-            DeviceStore.shared().openLocalCamera(true, null)
-        }
-    }
-
-    private fun setAudioDeviceRoute(mediaType: CallMediaType) {
-        if (CallMediaType.Video == mediaType) {
-            CallManager.instance.selectAudioPlaybackDevice(TUICommonDefine.AudioPlaybackDevice.Speakerphone)
-        } else {
-            CallManager.instance.selectAudioPlaybackDevice(TUICommonDefine.AudioPlaybackDevice.Earpiece)
-        }
-    }
-
-    private fun isCaller(userId: String): Boolean {
-        val callerId = CallStore.shared.observerState.activeCall.value.inviterId
-        return callerId == userId
-    }
-
-    companion object {
-        private const val TAG = "CallMainActivity"
-    }
-}

+ 0 - 179
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/incomingbanner/IncomingFloatBanner.kt

@@ -1,179 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.incomingbanner
-
-import android.content.Context
-import android.content.Context.WINDOW_SERVICE
-import android.content.Intent
-import android.content.res.Configuration
-import android.graphics.PixelFormat
-import android.os.Build
-import android.view.Gravity
-import android.view.LayoutInflater
-import android.view.View
-import android.view.WindowManager
-import android.widget.ImageView
-import android.widget.RelativeLayout
-import android.widget.TextView
-import com.tencent.qcloud.tuicore.util.ScreenUtil
-import com.tencent.qcloud.tuicore.util.TUIBuild
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
-import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
-import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
-import com.tencent.qcloud.tuikit.tuicallkit.state.ViewState
-import com.tencent.qcloud.tuikit.tuicallkit.view.CallMainActivity
-import com.trtc.tuikit.common.imageloader.ImageLoader
-import com.trtc.tuikit.common.livedata.Observer
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantInfo
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
-import kotlinx.coroutines.MainScope
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-
-class IncomingFloatBanner(context: Context) : RelativeLayout(context) {
-    private var appContext: Context = context.applicationContext
-    private val scope = MainScope()
-    private val windowManager: WindowManager = appContext.getSystemService(WINDOW_SERVICE) as WindowManager
-
-    private lateinit var layoutView: View
-    private lateinit var imageFloatAvatar: ImageView
-    private lateinit var textFloatTitle: TextView
-    private lateinit var textFloatDescription: TextView
-    private lateinit var imageReject: ImageView
-    private lateinit var imageAccept: ImageView
-    private val padding = 40
-    private var callStatus = CallParticipantStatus.None
-
-    private lateinit var caller: CallParticipantInfo
-
-    private val viewRouterObserver = Observer<ViewState.ViewRouter> {
-        if (it == ViewState.ViewRouter.FullView || it == ViewState.ViewRouter.FloatView) {
-            Logger.i(TAG, "viewRouterObserver, viewRouter: $it")
-            cancelIncomingView()
-        }
-    }
-
-    fun showIncomingView(user: CallParticipantInfo) {
-        Logger.i(TAG, "showIncomingView")
-        caller = user
-        initView()
-        registerObserver()
-    }
-
-    private fun cancelIncomingView() {
-        Logger.i(TAG, "cancelIncomingView")
-        if (layoutView.isAttachedToWindow) {
-            windowManager.removeView(layoutView)
-        }
-        unregisterObserver()
-    }
-
-    private fun registerObserver() {
-        scope.launch {
-            CallStore.shared.observerState.selfInfo.collect { selfInfo ->
-                if (callStatus == selfInfo.status) {
-                    return@collect
-                }
-                callStatus = selfInfo.status
-                if (selfInfo.status == CallParticipantStatus.None || selfInfo.status == CallParticipantStatus.Accept) {
-                    cancelIncomingView()
-                }
-            }
-        }
-        CallManager.instance.viewState.router.observe(viewRouterObserver)
-    }
-
-    private fun unregisterObserver() {
-        scope.cancel()
-        CallManager.instance.viewState.router.removeObserver(viewRouterObserver)
-    }
-
-    private fun initView() {
-        layoutView = LayoutInflater.from(context).inflate(R.layout.tuicallkit_incoming_float_view, this)
-        imageFloatAvatar = layoutView.findViewById(R.id.img_float_avatar)
-        textFloatTitle = layoutView.findViewById(R.id.tv_float_title)
-        textFloatDescription = layoutView.findViewById(R.id.tv_float_desc)
-        imageReject = layoutView.findViewById(R.id.btn_float_decline)
-        imageAccept = layoutView.findViewById(R.id.btn_float_accept)
-
-        ImageLoader.load(appContext, imageFloatAvatar, caller.avatarUrl, R.drawable.tuicallkit_ic_avatar)
-        textFloatTitle.text = caller.name
-
-        val mediaType = CallStore.shared.observerState.activeCall.value.mediaType
-        textFloatDescription.text =
-            if (mediaType == CallMediaType.Video) {
-                appContext.resources.getString(R.string.callkit_invite_video_call)
-            } else {
-                appContext.resources.getString(R.string.callkit_invite_audio_call)
-            }
-
-        imageReject.setOnClickListener {
-            CallManager.instance.reject(null)
-            cancelIncomingView()
-        }
-
-        layoutView.setOnClickListener {
-            cancelIncomingView()
-            val intent = Intent(context, CallMainActivity::class.java)
-            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-            context.startActivity(intent)
-        }
-
-        when (mediaType) {
-            CallMediaType.Video -> imageAccept.setBackgroundResource(R.drawable.tuicallkit_ic_dialing_video)
-            else -> imageAccept.setBackgroundResource(R.drawable.tuicallkit_bg_dialing)
-        }
-        val callStatus = CallStore.shared.observerState.selfInfo.value.status
-        imageAccept.setOnClickListener {
-            if (callStatus == CallParticipantStatus.None) {
-                Logger.w(TAG, "current status is None, ignore")
-                cancelIncomingView()
-                return@setOnClickListener
-            }
-
-            Logger.i(TAG, "accept the call")
-            CallStore.shared.accept(null)
-            val intent = Intent(context, CallMainActivity::class.java)
-            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-            intent.action = Constants.ACCEPT_CALL_ACTION
-            context.startActivity(intent)
-            cancelIncomingView()
-        }
-
-        CallManager.instance.viewState.router.set(ViewState.ViewRouter.Banner)
-        windowManager.addView(layoutView, viewParams)
-        val callId = CallStore.shared.observerState.activeCall.value.callId
-        KeyMetrics.countUV(KeyMetrics.EventId.WAKEUP, callId)
-    }
-
-    private val viewParams: WindowManager.LayoutParams
-        get() {
-            val windowLayoutParams = WindowManager.LayoutParams()
-            if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.O) {
-                windowLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
-            } else {
-                windowLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE
-            }
-            windowLayoutParams.flags = (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                    or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                    or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
-            windowLayoutParams.gravity = Gravity.START or Gravity.TOP
-            windowLayoutParams.x = padding
-            windowLayoutParams.y = 0
-            windowLayoutParams.width = ScreenUtil.getScreenWidth(appContext) - padding * 2
-            windowLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT
-            windowLayoutParams.format = PixelFormat.TRANSPARENT
-            return windowLayoutParams
-        }
-
-    override fun onConfigurationChanged(newConfig: Configuration?) {
-        super.onConfigurationChanged(newConfig)
-        layoutView.let { windowManager?.updateViewLayout(layoutView, viewParams) }
-    }
-
-    companion object {
-        private const val TAG = "IncomingViewFloat"
-    }
-}

+ 0 - 165
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/incomingbanner/IncomingNotificationBanner.kt

@@ -1,165 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.incomingbanner
-
-import android.app.Notification
-import android.app.NotificationManager
-import android.app.PendingIntent
-import android.content.Context
-import android.content.Intent
-import android.graphics.Bitmap
-import android.graphics.drawable.Drawable
-import android.net.Uri
-import android.os.Build
-import android.widget.RemoteViews
-import androidx.core.app.NotificationCompat
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.engine.DiskCacheStrategy
-import com.bumptech.glide.load.resource.bitmap.RoundedCorners
-import com.bumptech.glide.request.RequestOptions
-import com.bumptech.glide.request.target.SimpleTarget
-import com.bumptech.glide.request.transition.Transition
-import com.tencent.qcloud.tuicore.util.TUIBuild
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
-import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
-import com.tencent.qcloud.tuikit.tuicallkit.manager.feature.NotificationFeature
-import com.tencent.qcloud.tuikit.tuicallkit.view.CallMainActivity
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantInfo
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
-import kotlinx.coroutines.MainScope
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-
-class IncomingNotificationBanner(context: Context) {
-    private val context: Context = context.applicationContext
-    private val scope = MainScope()
-    private var notificationManager: NotificationManager =
-        context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
-
-    private val notificationId = 9909
-    private var remoteViews: RemoteViews? = null
-    private var notification: Notification? = null
-    private var callStatus = CallParticipantStatus.None
-
-    private fun registerObserver() {
-        scope.launch {
-            CallStore.shared.observerState.selfInfo.collect { selfInfo ->
-                if (callStatus == selfInfo.status) {
-                    return@collect
-                }
-                callStatus = selfInfo.status
-                if (callStatus == CallParticipantStatus.None || callStatus == CallParticipantStatus.Accept) {
-                    cancelNotification()
-                }
-            }
-        }
-    }
-
-    fun showNotification(participant: CallParticipantInfo) {
-        Logger.i(TAG, "showNotification, user: $participant")
-        val callId = CallStore.shared.observerState.activeCall.value.callId
-        KeyMetrics.countUV(KeyMetrics.EventId.WAKEUP, callId)
-        registerObserver()
-        notification = createNotification()
-
-        if (participant.name.isNullOrEmpty()) {
-            remoteViews?.setTextViewText(R.id.tv_incoming_title, participant.id)
-        } else {
-            remoteViews?.setTextViewText(R.id.tv_incoming_title, participant.name)
-        }
-
-        val mediaType = CallStore.shared.observerState.activeCall.value.mediaType
-        if (mediaType == CallMediaType.Video) {
-            remoteViews?.setTextViewText(R.id.tv_desc, context.getString(R.string.callkit_invite_video_call))
-            remoteViews?.setImageViewResource(R.id.img_media_type, R.drawable.tuicallkit_ic_video_incoming)
-            remoteViews?.setImageViewResource(R.id.btn_accept, R.drawable.tuicallkit_ic_dialing_video)
-        } else {
-            remoteViews?.setTextViewText(R.id.tv_desc, context.getString(R.string.callkit_invite_audio_call))
-            remoteViews?.setImageViewResource(R.id.img_media_type, R.drawable.tuicallkit_ic_float)
-            remoteViews?.setImageViewResource(R.id.btn_accept, R.drawable.tuicallkit_bg_dialing)
-        }
-
-        if (participant.avatarUrl.isNullOrEmpty()) {
-            remoteViews?.setImageViewResource(R.id.img_incoming_avatar, R.drawable.tuicallkit_ic_avatar)
-            notificationManager.notify(notificationId, notification)
-        } else {
-            val uri = Uri.parse(participant.avatarUrl)
-
-            Glide.with(context).asBitmap().load(uri)
-                .diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.tuicallkit_ic_avatar)
-                .apply(RequestOptions.bitmapTransform(RoundedCorners(15)))
-                .into(object : SimpleTarget<Bitmap>() {
-                    override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
-                        remoteViews?.setImageViewBitmap(R.id.img_incoming_avatar, resource)
-                        notificationManager.notify(notificationId, notification)
-                    }
-
-                    override fun onLoadFailed(errorDrawable: Drawable?) {
-                        remoteViews?.setImageViewResource(R.id.img_incoming_avatar, R.drawable.tuicallkit_ic_avatar)
-                        notificationManager.notify(notificationId, notification)
-                    }
-                })
-        }
-    }
-
-    private fun cancelNotification() {
-        Logger.i(TAG, "cancelNotification")
-        notificationManager.cancel(notificationId)
-        scope.cancel()
-    }
-
-    private fun createNotification(): Notification {
-        val channelId = NotificationFeature.CHANNEL_ID
-        val builder = NotificationCompat.Builder(context)
-            .setOngoing(true)
-            .setAutoCancel(true)
-            .setWhen(System.currentTimeMillis())
-            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
-            .setTimeoutAfter(Constants.CALL_WAITING_MAX_TIME * 1000L)
-
-        if (TUIBuild.getVersionInt() >= Build.VERSION_CODES.LOLLIPOP) {
-            builder.setCategory(NotificationCompat.CATEGORY_CALL)
-            builder.priority = NotificationCompat.PRIORITY_MAX
-        }
-
-        builder.setChannelId(channelId)
-        builder.setSmallIcon(R.drawable.tuicallkit_ic_avatar)
-        builder.setSound(null)
-
-        builder.setContentIntent(getPendingIntent())
-        builder.setFullScreenIntent(getPendingIntent(), true)
-
-        remoteViews = RemoteViews(context.packageName, R.layout.tuicallkit_incoming_notification_view)
-        remoteViews?.setOnClickPendingIntent(R.id.btn_decline, getDeclineIntent())
-        remoteViews?.setOnClickPendingIntent(R.id.btn_accept, getAcceptIntent())
-
-        builder.setCustomContentView(remoteViews)
-        builder.setCustomBigContentView(remoteViews)
-        return builder.build()
-    }
-
-    private fun getPendingIntent(): PendingIntent {
-        val intent = Intent(context, CallMainActivity::class.java)
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-        return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
-    }
-
-    private fun getDeclineIntent(): PendingIntent {
-        val intent = Intent(context, IncomingCallReceiver::class.java)
-        intent.action = Constants.REJECT_CALL_ACTION
-        return PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_IMMUTABLE)
-    }
-
-    private fun getAcceptIntent(): PendingIntent {
-        val intent = Intent(context, CallMainActivity::class.java)
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-        intent.action = Constants.ACCEPT_CALL_ACTION
-        return PendingIntent.getActivity(context, 2, intent, PendingIntent.FLAG_IMMUTABLE)
-    }
-
-    companion object {
-        private const val TAG = "IncomingViewNotification"
-    }
-}

+ 0 - 8
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/GroupMemberInfo.kt

@@ -1,8 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.inviteuser
-
-class GroupMemberInfo {
-    var userId: String? = ""
-    var userName: String? = ""
-    var avatar: String? = ""
-    var isSelected: Boolean = false
-}

+ 0 - 57
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/InviteUserButton.kt

@@ -1,57 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.inviteuser
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.os.Bundle
-import android.view.ViewGroup
-import android.widget.ImageView
-import com.tencent.qcloud.tuicore.TUICore
-import com.tencent.qcloud.tuicore.util.ToastUtil
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-
-@SuppressLint("AppCompatCustomView")
-class InviteUserButton(context: Context) : ImageView(context) {
-    private val context: Context = context.applicationContext
-
-    override fun onAttachedToWindow() {
-        super.onAttachedToWindow()
-        initView()
-    }
-
-    private fun initView() {
-        this.setBackgroundResource(R.drawable.tuicallkit_ic_add_user_black)
-        this.setOnClickListener {
-            inviteUser()
-        }
-        layoutParams = layoutParams.apply {
-            width = ViewGroup.LayoutParams.MATCH_PARENT
-            height = ViewGroup.LayoutParams.MATCH_PARENT
-        }
-        visibility = VISIBLE
-    }
-
-    private fun inviteUser() {
-        // TODO: 3.0 上这里不止是groupId
-        val groupId = CallStore.shared.observerState.activeCall.value.chatGroupId
-        if (groupId.isNullOrEmpty()) {
-            ToastUtil.toastShortMessage(context.getString(R.string.callkit_group_id_is_empty))
-            return
-        }
-        val list = ArrayList<String>()
-        val allParticipants = CallStore.shared.observerState.allParticipants.value
-        for (participant in allParticipants) {
-            list.add(participant.id)
-        }
-        Logger.i(TAG, "InviteUserButton clicked, groupId: $groupId ,list: $list")
-        val bundle = Bundle()
-        bundle.putString("groupId", groupId)
-        bundle.putStringArrayList("selectMemberList", list)
-        TUICore.startActivity("SelectGroupMemberActivity", bundle)
-    }
-
-    companion object {
-        private const val TAG = "InviteUserButton"
-    }
-}

+ 0 - 114
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/SelectGroupMemberActivity.kt

@@ -1,114 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.inviteuser
-
-import android.content.Intent
-import android.os.Bundle
-import android.widget.Button
-import androidx.appcompat.widget.Toolbar
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo
-import com.tencent.imsdk.v2.V2TIMGroupMemberInfoResult
-import com.tencent.imsdk.v2.V2TIMManager
-import com.tencent.imsdk.v2.V2TIMValueCallback
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
-import com.trtc.tuikit.common.FullScreenActivity
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
-import kotlinx.coroutines.MainScope
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-
-class SelectGroupMemberActivity : FullScreenActivity() {
-    private lateinit var recyclerUserList: RecyclerView
-    private lateinit var adapter: SelectGroupMemberAdapter
-    private var groupId: String? = null
-    private val scope = MainScope()
-    private val groupMemberList: MutableList<GroupMemberInfo> = ArrayList()
-    private var alreadySelectList: List<String?> = ArrayList()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.tuicallkit_activity_group_user)
-        initView()
-        initData()
-        registerObserver()
-    }
-
-    override fun onNewIntent(intent: Intent?) {
-        super.onNewIntent(intent)
-        setIntent(intent)
-        initData()
-    }
-
-    private fun initView() {
-        val toolbar = findViewById<Toolbar>(R.id.toolbar_group)
-        toolbar.navigationIcon?.isAutoMirrored = true
-        toolbar.setNavigationOnClickListener {
-            finish()
-        }
-        val btnOK: Button = findViewById(R.id.btn_group_ok)
-        btnOK.setOnClickListener {
-            val selectUsers: MutableList<String?> = ArrayList()
-            for (info in groupMemberList) {
-                if (!info.userId.isNullOrEmpty() && info.isSelected && !alreadySelectList.contains(info.userId)) {
-                    selectUsers.add(info.userId)
-                }
-            }
-            if (selectUsers.isNotEmpty()) {
-                CallManager.instance.inviteUser(selectUsers, null)
-            }
-            finish()
-        }
-        recyclerUserList = findViewById(R.id.rv_user_list)
-    }
-
-    private fun initData() {
-        groupId = intent.getStringExtra("groupId")
-        alreadySelectList = ArrayList(intent.getStringArrayListExtra("selectMemberList"))
-        adapter = SelectGroupMemberAdapter()
-        recyclerUserList.layoutManager = LinearLayoutManager(applicationContext)
-        recyclerUserList.adapter = adapter
-        updateGroupUserList()
-    }
-
-    private fun updateGroupUserList() {
-        val filter = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL
-        V2TIMManager.getGroupManager().getGroupMemberList(groupId, filter, 0,
-            object : V2TIMValueCallback<V2TIMGroupMemberInfoResult?> {
-                override fun onError(errorCode: Int, errorMsg: String) {}
-                override fun onSuccess(v2TIMGroupMemberInfoResult: V2TIMGroupMemberInfoResult?) {
-                    val results = v2TIMGroupMemberInfoResult?.memberInfoList
-                    groupMemberList.clear()
-                    if (results == null) {
-                        return
-                    }
-                    for (info in results) {
-                        val userInfo = GroupMemberInfo()
-                        userInfo.userId = info.userID
-                        userInfo.avatar = info.faceUrl
-                        userInfo.userName = info.nickName
-                        userInfo.isSelected = alreadySelectList.contains(userInfo.userId)
-                        groupMemberList.add(userInfo)
-                    }
-                    adapter.setDataSource(groupMemberList)
-                    adapter.notifyDataSetChanged()
-                }
-            })
-    }
-
-    private fun registerObserver() {
-        scope.launch {
-            CallStore.shared.observerState.selfInfo.collect { selfInfo ->
-                if (selfInfo.status == CallParticipantStatus.None) {
-                    finish()
-                }
-            }
-        }
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        scope.cancel()
-    }
-}

+ 0 - 68
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/inviteuser/SelectGroupMemberAdapter.kt

@@ -1,68 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.inviteuser
-
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.CheckBox
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.recyclerview.widget.RecyclerView
-import com.tencent.qcloud.tuicore.TUILogin
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.trtc.tuikit.common.imageloader.ImageLoader
-
-class SelectGroupMemberAdapter : RecyclerView.Adapter<SelectGroupMemberAdapter.GroupMemberViewHolder>() {
-    private lateinit var context: Context
-    private var groupMemberList: List<GroupMemberInfo> = ArrayList()
-
-    fun setDataSource(userList: List<GroupMemberInfo>) {
-        groupMemberList = userList
-    }
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GroupMemberViewHolder {
-        context = parent.context
-        val view = LayoutInflater.from(context).inflate(R.layout.tuicallkit_list_item_group_user, parent, false)
-        return GroupMemberViewHolder(view)
-    }
-
-    override fun onBindViewHolder(holder: GroupMemberViewHolder, position: Int) {
-        val userInfo = groupMemberList[position]
-        holder.itemView.setOnClickListener {
-            holder.checkBox.isChecked = !holder.checkBox.isChecked
-            userInfo.isSelected = holder.checkBox.isChecked
-        }
-        holder.layoutView(userInfo)
-    }
-
-    override fun getItemCount(): Int {
-        return groupMemberList.size
-    }
-
-    inner class GroupMemberViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        private val imageAvatar: ImageView
-        private val textName: TextView
-        private val textHint: TextView
-        val checkBox: CheckBox
-
-        init {
-            checkBox = itemView.findViewById(R.id.group_user_check_box)
-            imageAvatar = itemView.findViewById(R.id.group_user_avatar)
-            textName = itemView.findViewById(R.id.group_user_name)
-            textHint = itemView.findViewById(R.id.group_user_hint)
-        }
-
-        fun layoutView(userInfo: GroupMemberInfo?) {
-            if (userInfo == null || userInfo.userId.isNullOrEmpty()) {
-                return
-            }
-            itemView.isEnabled = !userInfo.isSelected
-            checkBox.isEnabled = !userInfo.isSelected
-            checkBox.isChecked = userInfo.isSelected
-            checkBox.isSelected = userInfo.isSelected
-            textName.text = if (userInfo.userName.isNullOrEmpty()) userInfo.userId else userInfo.userName
-            textHint.visibility = if (userInfo.userId == TUILogin.getLoginUser()) View.VISIBLE else View.GONE
-            ImageLoader.load(context, imageAvatar, userInfo.avatar, R.drawable.tuicallkit_ic_avatar)
-        }
-    }
-}

+ 0 - 118
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/joiningroupcall/JoinCallView.kt

@@ -1,118 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.joiningroupcall
-
-import android.content.Context
-import android.view.LayoutInflater
-import android.widget.Button
-import android.widget.FrameLayout
-import android.widget.ImageView
-import android.widget.LinearLayout
-import android.widget.TextView
-import androidx.constraintlayout.utils.widget.ImageFilterView
-import androidx.constraintlayout.widget.ConstraintLayout
-import com.tencent.cloud.tuikit.engine.call.TUICallDefine
-import com.tencent.cloud.tuikit.engine.common.TUICommonDefine
-import com.tencent.cloud.tuikit.engine.common.TUICommonDefine.ValueCallback
-import com.tencent.qcloud.tuicore.util.ScreenUtil
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.TUICallKit
-import com.tencent.qcloud.tuikit.tuicallkit.manager.UserManager
-import com.trtc.tuikit.common.imageloader.ImageLoader
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantInfo
-
-class JoinCallView(context: Context) : FrameLayout(context) {
-    private lateinit var layoutExpand: ConstraintLayout
-    private lateinit var layoutUserListView: LinearLayout
-    private lateinit var imageIconExpand: ImageView
-    private lateinit var textUserHint: TextView
-    private lateinit var btnJoinCall: Button
-
-    private var context = context.applicationContext
-    private var isViewExpand: Boolean = false
-
-    init {
-        initView()
-    }
-
-    private fun initView() {
-        val view = LayoutInflater.from(context).inflate(R.layout.tuicallkit_join_call_view, this)
-        textUserHint = view.findViewById(R.id.tv_user_hint)
-        imageIconExpand = view.findViewById(R.id.img_ic_expand)
-        btnJoinCall = view.findViewById(R.id.btn_join_call)
-        layoutUserListView = view.findViewById(R.id.ll_layout_avatar)
-        layoutExpand = view.findViewById(R.id.cl_expand_view)
-
-        imageIconExpand.setBackgroundResource(R.drawable.tuicallkit_ic_join_expand)
-        layoutExpand.visibility = LinearLayout.GONE
-    }
-
-    fun updateView(
-        mediaType: TUICallDefine.MediaType, userList: List<String>?,
-        callId: String = "", groupId: String? = "", roomId: TUICommonDefine.RoomId? = null,
-    ) {
-        btnJoinCall.text = context.resources.getString(R.string.callkit_join_group_call)
-
-        if (userList.isNullOrEmpty()) {
-            return
-        }
-        updateUserAvatarView(userList)
-
-        textUserHint.text = context.resources.getString(R.string.callkit_join_group_call_users, userList.size)
-
-        btnJoinCall.setOnClickListener {
-            if (!callId.isNullOrEmpty()) {
-                TUICallKit.createInstance(context).join(callId, null)
-            } else {
-                TUICallKit.createInstance(context).joinInGroupCall(roomId, groupId, mediaType)
-            }
-        }
-
-        imageIconExpand.setOnClickListener {
-            displayExpandView()
-        }
-    }
-
-    private fun updateUserAvatarView(list: List<String>) {
-        UserManager.instance.updateUserListInfo(list, object : ValueCallback<List<CallParticipantInfo>?> {
-            override fun onSuccess(data: List<CallParticipantInfo>?) {
-                data?.let { setAvatar(it) }
-            }
-
-            override fun onError(errCode: Int, errMsg: String?) {
-                setAvatar(list)
-            }
-        })
-    }
-
-    private fun setAvatar(userList: List<Any>) {
-        layoutUserListView.removeAllViews()
-        val width = ScreenUtil.dip2px(50f)
-        val startMargin = ScreenUtil.dip2px(12f)
-
-        for ((index, user) in userList.withIndex()) {
-            val imageView = ImageFilterView(context)
-            val layoutParams = LinearLayout.LayoutParams(width, width)
-            if (index != 0) {
-                layoutParams.marginStart = startMargin
-            }
-            imageView.round = 12f
-            imageView.scaleType = ImageView.ScaleType.CENTER_CROP
-            imageView.layoutParams = layoutParams
-            if (user is CallParticipantInfo) {
-                ImageLoader.load(context, imageView, user.avatarUrl, R.drawable.tuicallkit_ic_avatar)
-            } else {
-                ImageLoader.load(context, imageView, R.drawable.tuicallkit_ic_avatar, R.drawable.tuicallkit_ic_avatar)
-            }
-            layoutUserListView.addView(imageView)
-        }
-    }
-
-    private fun displayExpandView() {
-        val resId = when {
-            isViewExpand -> R.drawable.tuicallkit_ic_join_expand
-            else -> R.drawable.tuicallkit_ic_join_compress
-        }
-        imageIconExpand.setBackgroundResource(resId)
-        layoutExpand.visibility = if (isViewExpand) LinearLayout.GONE else LinearLayout.VISIBLE
-        isViewExpand = !isViewExpand
-    }
-}

+ 0 - 177
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/joiningroupcall/JoinCallViewManager.kt

@@ -1,177 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.joiningroupcall
-
-import android.content.Context
-import android.view.View
-import com.google.gson.Gson
-import com.tencent.cloud.tuikit.engine.call.TUICallDefine
-import com.tencent.cloud.tuikit.engine.common.TUICommonDefine
-import com.tencent.imsdk.v2.V2TIMGroupListener
-import com.tencent.imsdk.v2.V2TIMManager
-import com.tencent.imsdk.v2.V2TIMValueCallback
-import com.tencent.qcloud.tuicore.TUILogin
-import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantStatus
-import kotlinx.coroutines.MainScope
-import kotlinx.coroutines.launch
-
-class JoinCallViewManager(private val context: Context) {
-    private val scope = MainScope()
-    private var callView: JoinCallView? = null
-    private var currentGroupId: String? = null
-
-    private val groupListener: V2TIMGroupListener = object : V2TIMGroupListener() {
-        override fun onGroupAttributeChanged(groupID: String?, groupAttributeMap: MutableMap<String?, String>?) {
-            if (groupID.isNullOrEmpty() || currentGroupId != groupID) {
-                Logger.w(TAG, "onGroupAttributes, not same group(current:$currentGroupId, $groupID)}, ignore")
-                return
-            }
-
-            parseGroupAttributes(groupID, groupAttributeMap)
-        }
-    }
-
-    init {
-        V2TIMManager.getInstance().addGroupListener(groupListener)
-        scope.launch {
-            CallStore.shared.observerState.selfInfo.collect { selfInfo ->
-                if (selfInfo.status == CallParticipantStatus.None) {
-                    currentGroupId?.let { it1 -> getGroupAttributes(it1) }
-                }
-            }
-        }
-    }
-
-    fun setJoinCallView(joinCallView: JoinCallView) {
-        callView = joinCallView
-        callView?.visibility = View.GONE
-    }
-
-    fun getGroupAttributes(groupId: String) {
-        Logger.i(TAG, "getGroupAttributes, groupId: $groupId")
-        currentGroupId = groupId
-
-        V2TIMManager.getGroupManager().getGroupAttributes(groupId, listOf(KEY_GROUP_ATTRIBUTE),
-            object : V2TIMValueCallback<Map<String?, String?>?> {
-                override fun onSuccess(map: Map<String?, String?>?) {
-
-                    parseGroupAttributes(groupId, map)
-                }
-
-                override fun onError(code: Int, desc: String) {
-                    Logger.e(TAG, "getGroupAttributes failed, errorCode: $code , errorMsg: $desc")
-                }
-            })
-    }
-
-    private fun parseGroupAttributes(groupId: String, map: Map<String?, String?>?) {
-        val callStatus = CallStore.shared.observerState.selfInfo.value.status
-        if (callStatus != CallParticipantStatus.None) {
-            removeCallView()
-            Logger.w(TAG, "parseGroupAttributes, user is in the call, ignore")
-            return
-        }
-
-        if (map == null || map[KEY_GROUP_ATTRIBUTE].isNullOrEmpty()) {
-            Logger.w(TAG, "parseGroupAttributes is empty, map: $map")
-            removeCallView()
-            return
-        }
-
-        Logger.i(TAG, "parseGroupAttributes, groupId: $groupId, map: $map")
-
-        val data: String? = map[KEY_GROUP_ATTRIBUTE]
-        val extraMap: Map<String, Any> = Gson().fromJson<Map<String, Any>>(data, Map::class.java)
-
-        val businessType = extraMap[KEY_BUSINESS_TYPE] as? String
-        if (businessType.isNullOrEmpty() || businessType != VALUE_BUSINESS_TYPE) {
-            Logger.w(TAG, "this is not callkit, ignore")
-            removeCallView()
-            return
-        }
-        val userList = parseUserList(extraMap)
-        if (userList.isEmpty() || userList.contains(TUILogin.getLoginUser()) || userList.size <= 1) {
-            Logger.w(TAG, "userList is empty or current user is in the call, ignore")
-            removeCallView()
-            return
-        }
-
-        val callId = extraMap[KEY_CALL_ID] as? String
-        if (!callId.isNullOrEmpty()) {
-            callView?.updateView(TUICallDefine.MediaType.Audio, userList, callId = callId)
-            callView?.visibility = View.VISIBLE
-            return
-        }
-
-        var mediaType = TUICallDefine.MediaType.Audio
-        if (extraMap[KEY_CALL_MEDIA_TYPE] == VALUE_MEDIA_TYPE_VIDEO) {
-            mediaType = TUICallDefine.MediaType.Video
-        }
-
-        val roomId = parseRoomId(extraMap)
-        callView?.updateView(mediaType, userList, groupId = groupId, roomId = roomId)
-        callView?.visibility = View.VISIBLE
-    }
-
-    private fun parseRoomId(extraMap: Map<String, Any>): TUICommonDefine.RoomId {
-        val roomIdType = (extraMap[KEY_ROOM_ID_TYPE] as? Double)?.toInt()
-        val strRoomId = extraMap[KEY_ROOM_ID] as? String
-
-        val roomId = TUICommonDefine.RoomId()
-        if (roomIdType == VALUE_ROOM_ID_TYPE_STRING) {
-            roomId.strRoomId = strRoomId
-            return roomId
-        }
-
-        val intRoomId = strRoomId?.toIntOrNull()
-        if (intRoomId != null && intRoomId != 0) {
-            roomId.intRoomId = intRoomId
-        } else {
-            roomId.strRoomId = strRoomId
-        }
-        return roomId
-    }
-
-    private fun parseUserList(extraMap: Map<String, Any>): List<String> {
-        val userIds = extraMap[KEY_USER_LIST] as? List<Map<String, String>>
-        if (userIds == null) {
-            Logger.w(TAG, "parseUserList, userList is empty, ignore")
-            return ArrayList()
-        }
-        val list = ArrayList<String>()
-
-        for (temp in userIds) {
-            val userId = temp[KEY_USER_ID]
-            if (userId != null) {
-                list.add(userId)
-            }
-        }
-        return list
-    }
-
-    private fun removeCallView() {
-        callView?.visibility = View.GONE
-    }
-
-    companion object {
-        private const val TAG = "JoinCallViewManager"
-
-        //Do not change these items
-        private const val KEY_GROUP_ATTRIBUTE = "inner_attr_kit_info"
-        private const val KEY_BUSINESS_TYPE = "business_type"
-        private const val KEY_ROOM_ID_TYPE = "room_id_type"
-        private const val KEY_CALL_ID = "call_id"
-        private const val KEY_ROOM_ID = "room_id"
-        private const val KEY_GROUP_ID = "group_id"
-        private const val KEY_CALL_MEDIA_TYPE = "call_media_type"
-        private const val KEY_USER_LIST = "user_list"
-        private const val KEY_USER_ID = "userid"
-
-        private const val VALUE_BUSINESS_TYPE = "callkit"
-        private const val VALUE_MEDIA_TYPE_AUDIO = "audio"
-        private const val VALUE_MEDIA_TYPE_VIDEO = "video"
-        private const val VALUE_ROOM_ID_TYPE_HISTORY = 0
-        private const val VALUE_ROOM_ID_TYPE_INT = 1
-        private const val VALUE_ROOM_ID_TYPE_STRING = 2
-    }
-}

+ 0 - 310
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsFragment.kt

@@ -1,310 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents
-
-import android.os.Bundle
-import android.text.TextUtils
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import android.widget.TextView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.content.ContextCompat
-import androidx.fragment.app.Fragment
-import androidx.recyclerview.widget.LinearLayoutManager
-import com.google.android.material.tabs.TabLayout
-import com.tencent.qcloud.tuicore.TUIConstants
-import com.tencent.qcloud.tuicore.TUIConstants.TUICalling.ObjectFactory.RecentCalls
-import com.tencent.qcloud.tuicore.TUICore
-import com.tencent.qcloud.tuicore.TUILogin
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.TUICallKit
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.interfaces.ICallRecordItemListener
-import com.trtc.tuikit.common.livedata.LiveListObserver
-import com.trtc.tuikit.common.ui.PopupDialog
-import com.trtc.tuikit.common.util.ToastUtil
-import io.trtc.tuikit.atomicxcore.api.call.CallDirection
-import io.trtc.tuikit.atomicxcore.api.call.CallInfo
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-
-class RecentCallsFragment(style: String) : Fragment() {
-    private lateinit var buttonEdit: Button
-    private lateinit var buttonStartCall: Button
-    private lateinit var buttonEditDone: Button
-    private lateinit var buttonClear: Button
-    private lateinit var recyclerRecent: SlideRecyclerView
-    private lateinit var listAdapter: RecentCallsListAdapter
-    private lateinit var recentCallsManager: RecentCallsManager
-    private var bottomDialog: PopupDialog? = null
-
-    private var chatViewStyle = style
-    private var type = TYPE_ALL
-    private var needCloseMultiMode = false
-
-    constructor() : this(style = RecentCalls.UI_STYLE_CLASSIC)
-
-    private val callHistoryObserver = object : LiveListObserver<CallInfo>() {
-        override fun onDataChanged(list: List<CallInfo>) {
-            if (listAdapter != null && TYPE_ALL == type) {
-                listAdapter.onDataSourceChanged(list)
-            }
-        }
-    }
-    private val callMissObserver = object : LiveListObserver<CallInfo>() {
-        override fun onDataChanged(list: List<CallInfo>) {
-            if (listAdapter != null && TYPE_MISS == type) {
-                listAdapter.onDataSourceChanged(list)
-            }
-        }
-    }
-
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
-        val rootView = inflater.inflate(R.layout.tuicallkit_record_fragment_main, container, false)
-        initView(rootView)
-        initData()
-        registerObserver()
-        return rootView
-    }
-
-    override fun onResume() {
-        super.onResume()
-        refreshData()
-    }
-
-    override fun onDestroyView() {
-        super.onDestroyView()
-        unregisterObserver()
-    }
-
-    private fun registerObserver() {
-        recentCallsManager.callMissedList.observe(callMissObserver)
-        recentCallsManager.callHistoryList.observe(callHistoryObserver)
-    }
-
-    private fun unregisterObserver() {
-        recentCallsManager.callMissedList.removeObserver(callMissObserver)
-        recentCallsManager.callHistoryList.removeObserver(callHistoryObserver)
-    }
-
-    private fun initView(rootView: View) {
-        buttonEdit = rootView.findViewById(R.id.btn_call_edit)
-        buttonStartCall = rootView.findViewById(R.id.btn_start_call)
-        buttonEditDone = rootView.findViewById(R.id.btn_edit_done)
-        buttonClear = rootView.findViewById(R.id.btn_clear)
-        recyclerRecent = rootView.findViewById(R.id.recycle_view_list)
-        val layoutTab: TabLayout = rootView.findViewById(R.id.tab_layout)
-        val layoutTitle: ConstraintLayout = rootView.findViewById(R.id.cl_record_title)
-        if (RecentCalls.UI_STYLE_MINIMALIST == chatViewStyle) {
-            layoutTitle.setBackgroundColor(ContextCompat.getColor(context!!, R.color.callkit_color_white))
-        }
-
-        buttonEdit.setOnClickListener {
-            startMultiSelect()
-            updateTabViews(true)
-        }
-        buttonStartCall.setOnClickListener {
-            TUICore.startActivity("StartC2CChatMinimalistActivity", null)
-        }
-        buttonEditDone.setOnClickListener {
-            needCloseMultiMode = true
-            stopMultiSelect()
-            updateTabViews(false)
-        }
-        buttonClear.setOnClickListener { v: View? -> showDeleteHistoryDialog() }
-        layoutTab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
-            override fun onTabSelected(tab: TabLayout.Tab) {
-                type = if (tab.position == 1) TYPE_MISS else TYPE_ALL
-                updateTabViews(false)
-                needCloseMultiMode = true
-                stopMultiSelect()
-                refreshData()
-            }
-
-            override fun onTabUnselected(tab: TabLayout.Tab) {}
-            override fun onTabReselected(tab: TabLayout.Tab) {}
-        })
-    }
-
-    private fun initData() {
-        listAdapter = RecentCallsListAdapter()
-        listAdapter.setHasStableIds(true)
-        recyclerRecent.layoutManager = LinearLayoutManager(context)
-        recyclerRecent.adapter = listAdapter
-        setAdapterListener()
-        recentCallsManager = RecentCallsManager()
-        recentCallsManager.queryRecentCalls(filter)
-    }
-
-    private val filter: CallInfo
-        private get() {
-            val filter = CallInfo()
-            if (TYPE_MISS == type) {
-                filter.result = CallDirection.Missed
-            }
-            return filter
-        }
-
-    private fun refreshData() {
-        recentCallsManager.queryRecentCalls(filter)
-    }
-
-    private fun updateTabViews(isEditable: Boolean) {
-        if (isEditable) {
-            buttonEdit.visibility = View.GONE
-            buttonStartCall.visibility = View.GONE
-            buttonEditDone.visibility = View.VISIBLE
-            buttonClear.visibility = View.VISIBLE
-        } else {
-            buttonEdit.visibility = View.VISIBLE
-            buttonStartCall.visibility = View.GONE
-            buttonEditDone.visibility = View.GONE
-            buttonClear.visibility = View.GONE
-        }
-    }
-
-    private fun setAdapterListener() {
-        listAdapter.setOnCallRecordItemListener(object : ICallRecordItemListener {
-            override fun onItemClick(view: View?, viewType: Int, callInfo: CallInfo?) {
-                if (callInfo == null) {
-                    return
-                }
-                if (listAdapter.isMultiSelectMode) {
-                    return
-                }
-                if (callInfo.chatGroupId.isNotEmpty()) {
-                    startGroupInfoActivity(callInfo)
-                    ToastUtil.toastLongMessage(getString(R.string.callkit_group_recall_unsupport))
-                    return
-                }
-                var mediaType = CallMediaType.Audio
-                if (callInfo.mediaType == CallMediaType.Video) {
-                    mediaType = CallMediaType.Video
-                }
-
-                val userList = ArrayList<String>()
-                userList.add(callInfo.inviterId)
-                userList.addAll(callInfo.inviteeIds)
-                userList.remove(TUILogin.getLoginUser())
-                TUICallKit.createInstance(context!!).calls(userList, mediaType, null, null)
-
-            }
-
-            override fun onItemDeleteClick(view: View?, viewType: Int, callInfo: CallInfo?) {
-                if (callInfo == null) {
-                    return
-                }
-                val list: MutableList<CallInfo> = ArrayList()
-                list.add(callInfo)
-                deleteRecordCalls(list)
-            }
-
-            override fun onDetailViewClick(view: View?, callInfo: CallInfo?) {
-                if (callInfo == null) {
-                    return
-                }
-                if (!callInfo.chatGroupId.isNullOrEmpty()) {
-                    startGroupInfoActivity(callInfo)
-                    return
-                }
-
-                if (callInfo.inviteeIds.size <= 1) {
-                    startFriendProfileActivity(callInfo)
-                }
-            }
-        })
-    }
-
-    private fun startFriendProfileActivity(callInfo: CallInfo) {
-        val bundle = Bundle()
-        val selfId = CallStore.shared.observerState.selfInfo.value.id
-        if (callInfo.inviterId == selfId) {
-            bundle.putString(TUIConstants.TUIChat.CHAT_ID, callInfo.inviteeIds.first())
-        } else {
-            bundle.putString(TUIConstants.TUIChat.CHAT_ID, callInfo.inviterId)
-        }
-        var activityName = "FriendProfileActivity"
-        if (RecentCalls.UI_STYLE_MINIMALIST == chatViewStyle) {
-            activityName = "FriendProfileMinimalistActivity"
-        }
-        TUICore.startActivity(activityName, bundle)
-    }
-
-    private fun startGroupInfoActivity(callInfo: CallInfo) {
-        val bundle = Bundle()
-        bundle.putString("group_id", callInfo.chatGroupId)
-        var activityName = "GroupInfoActivity"
-        if (RecentCalls.UI_STYLE_MINIMALIST == chatViewStyle) {
-            activityName = "GroupInfoMinimalistActivity"
-        }
-        TUICore.startActivity(context, activityName, bundle)
-    }
-
-    private fun startMultiSelect() {
-        val adapter = recyclerRecent.adapter as RecentCallsListAdapter?
-        if (adapter != null) {
-            adapter.setShowMultiSelectCheckBox(true)
-            adapter.notifyDataSetChanged()
-        }
-        recyclerRecent.disableRecyclerViewSlide(true)
-        recyclerRecent.closeMenu()
-    }
-
-    private fun stopMultiSelect() {
-        val adapter = recyclerRecent.adapter as RecentCallsListAdapter?
-        if (adapter != null) {
-            if (needCloseMultiMode) {
-                adapter.setShowMultiSelectCheckBox(false)
-            }
-            adapter.notifyDataSetChanged()
-        }
-        if (needCloseMultiMode) {
-            recyclerRecent.disableRecyclerViewSlide(false)
-        }
-        recyclerRecent.closeMenu()
-    }
-
-    private fun deleteRecordCalls(selectItem: List<CallInfo>) {
-        recentCallsManager.deleteRecordCalls(selectItem)
-        needCloseMultiMode = !listAdapter.isMultiSelectMode
-        stopMultiSelect()
-    }
-
-    private fun clearRecentCalls() {
-        val selectedItems: List<CallInfo?>?
-        selectedItems = listAdapter.selectedItem
-        if (selectedItems == null) {
-            return
-        }
-        val recordList: MutableList<CallInfo> = ArrayList()
-        for (records in selectedItems) {
-            if (records != null && !TextUtils.isEmpty(records.callId)) {
-                recordList.add(records)
-            }
-        }
-        recentCallsManager.deleteRecordCalls(recordList)
-    }
-
-    private fun showDeleteHistoryDialog() {
-        if (bottomDialog == null) {
-            bottomDialog = PopupDialog(requireContext())
-        }
-        val view = LayoutInflater.from(activity).inflate(R.layout.tuicallkit_record_dialog, null)
-        bottomDialog!!.setView(view)
-        val textPositive = view.findViewById<TextView>(R.id.tv_clear_call_history)
-        val textCancel = view.findViewById<TextView>(R.id.tv_clear_cancel)
-        textPositive?.setOnClickListener {
-            clearRecentCalls()
-            bottomDialog?.dismiss()
-            needCloseMultiMode = true
-            stopMultiSelect()
-        }
-        textCancel?.setOnClickListener { v: View? -> bottomDialog?.dismiss() }
-        bottomDialog?.show()
-    }
-
-    companion object {
-        private const val TAG = "RecentCallsFragment"
-        private const val TYPE_ALL = "AllCall"
-        private const val TYPE_MISS = "MissedCall"
-    }
-}

+ 0 - 116
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsItemHolder.kt

@@ -1,116 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents
-
-import android.content.Context
-import android.view.View
-import android.widget.CheckBox
-import android.widget.ImageView
-import android.widget.RelativeLayout
-import android.widget.TextView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.content.ContextCompat
-import androidx.recyclerview.widget.RecyclerView
-import com.tencent.cloud.tuikit.engine.common.TUICommonDefine.ValueCallback
-import com.tencent.qcloud.tuicore.TUILogin
-import com.tencent.qcloud.tuicore.util.DateTimeUtil
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.manager.UserManager
-import io.trtc.tuikit.atomicxcore.api.call.CallDirection
-import io.trtc.tuikit.atomicxcore.api.call.CallInfo
-import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
-import io.trtc.tuikit.atomicxcore.api.call.CallParticipantInfo
-import java.util.Date
-
-class RecentCallsItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-    private lateinit var textUserTitle: TextView
-    private lateinit var imageMediaType: ImageView
-    private lateinit var textCallStatus: TextView
-    private lateinit var textCallTime: TextView
-    lateinit var imageDetails: ImageView
-    lateinit var layoutDelete: RelativeLayout
-    lateinit var checkBoxSelectCall: CheckBox
-    lateinit var layoutView: ConstraintLayout
-    lateinit var callIconView: RecordsIconView
-
-    init {
-        initView()
-    }
-
-    private fun initView() {
-        layoutDelete = itemView.findViewById(R.id.ll_call_delete)
-        checkBoxSelectCall = itemView.findViewById(R.id.cb_call_select)
-        callIconView = itemView.findViewById(R.id.call_icon)
-        textUserTitle = itemView.findViewById(R.id.tv_call_user_id)
-        imageMediaType = itemView.findViewById(R.id.call_media_type)
-        textCallStatus = itemView.findViewById(R.id.tv_call_status)
-        textCallTime = itemView.findViewById(R.id.tv_call_time)
-        imageDetails = itemView.findViewById(R.id.img_call_details)
-        layoutView = itemView.findViewById(R.id.cl_info_layout)
-    }
-
-    fun layoutViews(context: Context, callInfo: CallInfo?) {
-        if (callInfo == null) {
-            return
-        }
-        val colorId = when (CallDirection.Missed) {
-            callInfo.result -> R.color.callkit_record_text_red
-            else -> R.color.callkit_color_black
-        }
-        textUserTitle.setTextColor(ContextCompat.getColor(context, colorId))
-        val imageId = when (CallMediaType.Video) {
-            callInfo.mediaType -> R.drawable.tuicallkit_record_ic_video_call
-            else -> R.drawable.tuicallkit_record_ic_audio_call
-        }
-        imageMediaType.setImageDrawable(ContextCompat.getDrawable(context, imageId))
-        var resultMsg = context.getString(R.string.callkit_record_result_unknown)
-        if (CallDirection.Missed == callInfo.result) {
-            resultMsg = context.getString(R.string.callkit_record_result_missed)
-        } else if (CallDirection.Incoming == callInfo.result) {
-            resultMsg = context.getString(R.string.callkit_record_result_incoming)
-        } else if (CallDirection.Outgoing == callInfo.result) {
-            resultMsg = context.getString(R.string.callkit_record_result_outgoing)
-        }
-        textCallStatus.text = resultMsg
-        textCallTime.text = DateTimeUtil.getTimeFormatText(Date(callInfo.startTime))
-        val list: MutableList<String?> = ArrayList()
-        if (callInfo.inviteeIds != null) {
-            list.addAll(callInfo.inviteeIds)
-        }
-        list.add(callInfo.inviterId.trim { it <= ' ' })
-        list.remove(TUILogin.getLoginUser())
-        callIconView.tag = list
-        UserManager.instance.updateUserListInfo(list, object : ValueCallback<List<CallParticipantInfo>?> {
-            override fun onSuccess(userFullInfoList: List<CallParticipantInfo>?) {
-                if (userFullInfoList.isNullOrEmpty()) {
-                    return
-                }
-                val avatarList: MutableList<Any?> = ArrayList()
-                val newUserList: MutableList<String> = ArrayList()
-                val nameList: MutableList<String> = ArrayList()
-                for (i in userFullInfoList.indices) {
-                    avatarList.add(userFullInfoList[i].avatarUrl)
-                    newUserList.add(userFullInfoList[i].id)
-                    nameList.add(userFullInfoList[i].name)
-                }
-
-                if (!callInfo.chatGroupId.isNullOrEmpty() || (callInfo.inviteeIds.size > 1)) {
-                    avatarList.add(TUILogin.getFaceUrl())
-                }
-                val oldUserList: List<String> = ArrayList(
-                    callIconView.tag as List<String>
-                )
-                if (oldUserList.size == newUserList.size && oldUserList.containsAll(newUserList)) {
-                    callIconView.setImageId(callInfo.callId)
-                    callIconView.displayImage(avatarList).load(callInfo.callId)
-                    textUserTitle.text = nameList.toString().replace("[\\[\\]]".toRegex(), "")
-                }
-            }
-
-            override fun onError(code: Int, desc: String?) {
-                val list: MutableList<Any?> = ArrayList()
-                list.add(TUILogin.getFaceUrl())
-                callIconView.displayImage(list).load(callInfo.callId)
-                textUserTitle.text = TUILogin.getNickName()
-            }
-        })
-    }
-}

+ 0 - 179
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsListAdapter.kt

@@ -1,179 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents
-
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.interfaces.ICallRecordItemListener
-import io.trtc.tuikit.atomicxcore.api.call.CallInfo
-
-class RecentCallsListAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
-    private lateinit var context: Context
-    private val dataSource: MutableList<CallInfo> = ArrayList()
-    private var itemListener: ICallRecordItemListener? = null
-    private val selectedPositions = HashMap<String, Boolean>()
-    var isMultiSelectMode = false
-        private set
-
-    fun setOnCallRecordItemListener(listener: ICallRecordItemListener?) {
-        itemListener = listener
-    }
-
-    fun onDataSourceChanged(dataSource: List<CallInfo>?) {
-        dataSource?.let {
-            this.dataSource.clear()
-            this.dataSource.addAll(it)
-            notifyDataSetChanged()
-        }
-    }
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
-        context = parent.context.applicationContext
-        val inflater = LayoutInflater.from(parent.context)
-        return if (viewType == ITEM_TYPE_HEADER) {
-            val view = inflater.inflate(R.layout.tuicallkit_item_head_view, parent, false)
-            HeaderViewHolder(view)
-        } else {
-            val view = inflater.inflate(R.layout.tuicallkit_layout_call_list_item, parent, false)
-            RecentCallsItemHolder(view)
-        }
-    }
-
-    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
-        if (holder is RecentCallsItemHolder) {
-            holder.layoutView.setOnClickListener {
-                val curPos = holder.bindingAdapterPosition
-                itemListener?.onItemClick(holder.itemView, getItemViewType(curPos), getItem(curPos))
-            }
-            holder.imageDetails.setOnClickListener { view: View? ->
-                itemListener?.onDetailViewClick(view, getItem(holder.bindingAdapterPosition))
-            }
-
-            if (!holder.layoutDelete.hasOnClickListeners()) {
-                holder.layoutDelete.setOnClickListener { view: View? ->
-                    val curPos = holder.bindingAdapterPosition
-                    val record = getItem(curPos)
-                    if (record != null && !record.callId.isNullOrEmpty()) {
-                        setItemChecked(record.callId, true)
-                        itemListener?.onItemDeleteClick(view, getItemViewType(curPos), record)
-                    }
-                }
-            }
-            holder.checkBoxSelectCall.setOnClickListener {
-                holder.itemView.scrollX = if (isRTL) -holder.layoutDelete.width else holder.layoutDelete.width
-            }
-            holder.layoutViews(context, getItem(position))
-            setCheckBoxStatus(holder)
-        }
-    }
-
-    override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
-        if (holder is RecentCallsItemHolder) {
-            holder.callIconView.clear()
-        }
-    }
-
-    private fun getItem(position: Int): CallInfo? {
-        if (dataSource.isEmpty()) {
-            return null
-        }
-        val dataPosition = position - HEADER_COUNT
-        return if (dataPosition < dataSource.size && dataPosition >= 0) {
-            dataSource[dataPosition]
-        } else null
-    }
-
-    override fun getItemId(position: Int): Long {
-        return position.toLong()
-    }
-
-    override fun getItemCount(): Int {
-        return dataSource.size + HEADER_COUNT
-    }
-
-    override fun getItemViewType(position: Int): Int {
-        return if (position == 0) {
-            ITEM_TYPE_HEADER
-        } else ITEM_TYPE_NORMAL
-    }
-
-    private fun setCheckBoxStatus(holder: RecentCallsItemHolder?) {
-        if (holder?.checkBoxSelectCall == null) {
-            return
-        }
-        if (!isMultiSelectMode) {
-            holder.checkBoxSelectCall.visibility = View.GONE
-            holder.itemView.setOnClickListener(null)
-        } else {
-            holder.checkBoxSelectCall.visibility = View.VISIBLE
-        }
-    }
-
-    private fun getIndexInAdapter(records: CallInfo): Int {
-        var position = -1
-        if (dataSource.size > 0) {
-            val indexInData = dataSource.indexOf(records)
-            if (indexInData != -1) {
-                position = indexInData + HEADER_COUNT
-            }
-        }
-        return position
-    }
-
-    fun setShowMultiSelectCheckBox(show: Boolean) {
-        isMultiSelectMode = show
-        for (records in dataSource) {
-            if (!records.callId.isNullOrEmpty()) {
-                setItemChecked(records.callId, show)
-                val currentPosition = getIndexInAdapter(records)
-                if (currentPosition != -1) {
-                    notifyItemChanged(currentPosition)
-                }
-            }
-        }
-    }
-
-    private fun setItemChecked(callId: String, isChecked: Boolean) {
-        selectedPositions[callId] = isChecked
-    }
-
-    val selectedItem: List<CallInfo>?
-        get() {
-            if (selectedPositions.size == 0) {
-                return null
-            }
-            val selectList: MutableList<CallInfo> = ArrayList()
-            for (i in 0 until itemCount) {
-                val records = getItem(i)
-                if (records != null && isItemChecked(records.callId)) {
-                    selectList.add(records)
-                }
-            }
-            return selectList
-        }
-
-    private fun isItemChecked(id: String): Boolean {
-        if (selectedPositions.size <= 0) {
-            return false
-        }
-        return if (selectedPositions.containsKey(id)) {
-            selectedPositions[id] ?: false
-        } else {
-            false
-        }
-    }
-
-    private val isRTL: Boolean
-        private get() {
-            return context.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
-        }
-
-    internal class HeaderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
-    companion object {
-        private const val ITEM_TYPE_HEADER = 101
-        private const val ITEM_TYPE_NORMAL = -98
-        private const val HEADER_COUNT = 1
-    }
-}

+ 0 - 57
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecentCallsManager.kt

@@ -1,57 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents
-
-import android.text.TextUtils
-import com.trtc.tuikit.common.livedata.LiveListData
-import io.trtc.tuikit.atomicxcore.api.CompletionHandler
-import io.trtc.tuikit.atomicxcore.api.call.CallDirection
-import io.trtc.tuikit.atomicxcore.api.call.CallInfo
-import io.trtc.tuikit.atomicxcore.api.call.CallStore
-import java.util.concurrent.CopyOnWriteArrayList
-
-class RecentCallsManager {
-    var callHistoryList: LiveListData<CallInfo> = LiveListData<CallInfo>(CopyOnWriteArrayList())
-    var callMissedList: LiveListData<CallInfo> = LiveListData<CallInfo>(CopyOnWriteArrayList())
-
-    fun queryRecentCalls(filter: CallInfo?) {
-        CallStore.shared.queryRecentCalls("", 0, object : CompletionHandler {
-            override fun onSuccess() {
-                val recentCalls = CallStore.shared.observerState.recentCalls.value
-                if (filter != null && CallDirection.Missed == filter.result) {
-                    val missList: ArrayList<CallInfo> = ArrayList(callMissedList.list)
-                    missList.removeAll(recentCalls)
-                    missList.addAll(recentCalls)
-                    callMissedList.replaceAll(missList)
-                } else {
-                    val historyList: ArrayList<CallInfo> = ArrayList(callHistoryList.list)
-                    historyList.removeAll(recentCalls)
-                    historyList.addAll(recentCalls)
-                    callHistoryList.replaceAll(historyList.toList())
-                }
-            }
-
-            override fun onFailure(code: Int, desc: String) {
-
-            }
-
-        })
-    }
-
-    fun deleteRecordCalls(list: List<CallInfo>?) {
-        if (list.isNullOrEmpty()) {
-            return
-        }
-        val missList = ArrayList(callMissedList.list)
-        missList.removeAll(list)
-        callMissedList.replaceAll(missList)
-        val allList: MutableList<CallInfo> = ArrayList(callHistoryList.list)
-        allList.removeAll(list)
-        callHistoryList.replaceAll(allList)
-        val callIdList: MutableList<String> = ArrayList()
-        for (record in list) {
-            if (!TextUtils.isEmpty(record.callId)) {
-                callIdList.add(record.callId)
-            }
-        }
-        CallStore.shared.deleteRecentCalls(callIdList, null)
-    }
-}

+ 0 - 44
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/RecordsIconView.kt

@@ -1,44 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents
-
-import android.content.Context
-import android.graphics.Color
-import android.util.AttributeSet
-import androidx.constraintlayout.utils.widget.ImageFilterView
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.gridimage.GridImageSynthesizer
-
-class RecordsIconView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
-    ImageFilterView(context, attrs, defStyle) {
-    private var imageSize = 100
-    private var imageGap = 6
-    private val gridImageSynthesizer: GridImageSynthesizer = GridImageSynthesizer(context, this)
-
-    override fun onAttachedToWindow() {
-        super.onAttachedToWindow()
-        initView()
-    }
-
-    private fun initView() {
-        gridImageSynthesizer.setMaxSize(imageSize, imageSize)
-        gridImageSynthesizer.setDefaultImage(R.drawable.tuicallkit_ic_avatar)
-        gridImageSynthesizer.setBackgroundColor(Color.parseColor("#cfd3d8"))
-        gridImageSynthesizer.setGap(imageGap)
-    }
-
-    fun displayImage(imageUrls: List<Any?>?): RecordsIconView {
-        gridImageSynthesizer.setImageUrls(imageUrls)
-        return this
-    }
-
-    fun setImageId(id: String?) {
-        gridImageSynthesizer.setImageId(id)
-    }
-
-    fun load(imageId: String?) {
-        gridImageSynthesizer.load(imageId)
-    }
-
-    fun clear() {
-        gridImageSynthesizer.clearImage()
-    }
-}

+ 0 - 223
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/SlideRecyclerView.kt

@@ -1,223 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents
-
-import android.content.Context
-import android.graphics.Rect
-import android.util.AttributeSet
-import android.view.MotionEvent
-import android.view.VelocityTracker
-import android.view.View
-import android.view.ViewConfiguration
-import android.view.ViewGroup
-import android.widget.Scroller
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kotlin.math.abs
-
-class SlideRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
-    RecyclerView(context, attrs, defStyle) {
-    private val touchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop
-    private val scroller: Scroller = Scroller(context)
-
-    private var flingView: ViewGroup? = null
-    private var velocityTracker: VelocityTracker? = null
-    private var touchFrame: Rect? = null
-    private var lastX: Float = 0f
-    private var firstX: Float = 0f
-    private var firstY: Float = 0f
-    private var isSlide = false
-    private var position: Int = 0
-    private var menuViewWidth: Int = 0
-    private var disableRecyclerViewSlide: Boolean = false
-
-    fun disableRecyclerViewSlide(disable: Boolean) {
-        disableRecyclerViewSlide = disable
-    }
-
-    override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
-        val x = e.x.toInt()
-        val y = e.y.toInt()
-        obtainVelocity(e)
-        when (e.action) {
-            MotionEvent.ACTION_DOWN -> {
-                if (!scroller.isFinished) {
-                    scroller.abortAnimation()
-                }
-                run {
-                    lastX = x.toFloat()
-                    firstX = lastX
-                }
-                firstY = y.toFloat()
-                position = pointToPosition(x, y)
-                if (position != INVALID_POSITION) {
-                    val view: View? = flingView
-                    flingView = getChildAt(
-                        position - (layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
-                    ) as ViewGroup
-                    if (view != null && flingView !== view && view.scrollX != 0) {
-                        view.scrollTo(0, 0)
-                    }
-                    menuViewWidth = if (flingView?.childCount == 2) {
-                        flingView?.getChildAt(1)?.width ?: INVALID_CHILD_WIDTH
-                    } else {
-                        INVALID_CHILD_WIDTH
-                    }
-                }
-            }
-
-            MotionEvent.ACTION_MOVE -> {
-                velocityTracker?.computeCurrentVelocity(1000)
-                val xVelocity = (if (velocityTracker?.xVelocity != null) velocityTracker?.xVelocity else 0f) as Float
-                val yVelocity = (if (velocityTracker?.yVelocity != null) velocityTracker?.yVelocity else 0f) as Float
-
-                val topView = (layoutManager as LinearLayoutManager?)?.findViewByPosition(0)
-                if (topView === flingView) {
-                    isSlide = false
-                } else if (abs(xVelocity) > SNAP_VELOCITY && abs(xVelocity) > abs(yVelocity)
-                    || abs(x - firstX) >= touchSlop && abs(x - firstX) > abs(y - firstY)
-                ) {
-                    isSlide = true
-                    return true
-                }
-            }
-
-            MotionEvent.ACTION_UP -> releaseVelocity()
-            else -> {}
-        }
-        return super.onInterceptTouchEvent(e)
-    }
-
-    override fun onTouchEvent(e: MotionEvent): Boolean {
-        if (isSlide && position != INVALID_POSITION) {
-            val x = e.x
-            obtainVelocity(e)
-            when (e.action) {
-                MotionEvent.ACTION_DOWN -> {}
-                MotionEvent.ACTION_MOVE ->
-                    flingView?.let {
-                        if (menuViewWidth != INVALID_CHILD_WIDTH) {
-                            val dx = Math.abs(it.scrollX + (lastX - x))
-                            if (dx <= menuViewWidth && dx > 0) {
-                                if (menuViewWidth != INVALID_CHILD_WIDTH) {
-                                    val scrollX = it.scrollX
-                                    velocityTracker?.computeCurrentVelocity(1000)
-                                    if (isRTL) {
-                                        openRightExtendView(scrollX)
-                                    } else {
-                                        openLeftExtendView(scrollX)
-                                    }
-                                    invalidate()
-                                }
-                                menuViewWidth = INVALID_CHILD_WIDTH
-                                isSlide = false
-                                position = INVALID_POSITION
-                            }
-                            lastX = x
-                        }
-                    }
-                MotionEvent.ACTION_UP -> releaseVelocity()
-                else -> {}
-            }
-            return true
-        } else {
-            closeMenu()
-            releaseVelocity()
-        }
-        return super.onTouchEvent(e)
-    }
-
-    private fun openRightExtendView(scrollX: Int) {
-        velocityTracker?.let {
-            if (it.xVelocity >= SNAP_VELOCITY) {
-                startScroll(scrollX, scrollX - menuViewWidth)
-            } else if (it.xVelocity < -SNAP_VELOCITY) {
-                startScroll(scrollX, -scrollX)
-            } else if (scrollX >= menuViewWidth / 2) {
-                startScroll(scrollX, scrollX - menuViewWidth)
-            } else {
-                startScroll(scrollX, -scrollX)
-            }
-        }
-    }
-
-    private fun openLeftExtendView(scrollX: Int) {
-        velocityTracker?.let {
-            if (it.xVelocity < -SNAP_VELOCITY) {
-                startScroll(scrollX, menuViewWidth - scrollX)
-            } else if (it.xVelocity >= SNAP_VELOCITY) {
-                startScroll(scrollX, -scrollX)
-            } else if (scrollX >= menuViewWidth / 2) {
-                startScroll(scrollX, menuViewWidth - scrollX)
-            } else {
-                startScroll(scrollX, -scrollX)
-            }
-        }
-    }
-
-    private fun startScroll(startX: Int, dx: Int) {
-        scroller.startScroll(startX, 0, dx, 0)
-    }
-
-    private fun releaseVelocity() {
-        if (velocityTracker != null) {
-            velocityTracker?.clear()
-            velocityTracker?.recycle()
-            velocityTracker = null
-        }
-    }
-
-    private fun obtainVelocity(event: MotionEvent) {
-        if (velocityTracker == null) {
-            velocityTracker = VelocityTracker.obtain()
-        }
-        velocityTracker?.addMovement(event)
-    }
-
-    private fun pointToPosition(x: Int, y: Int): Int {
-        val firstPosition = (layoutManager as LinearLayoutManager?)?.findFirstVisibleItemPosition()
-        firstPosition?.let {
-            var frame = touchFrame
-            if (frame == null) {
-                touchFrame = Rect()
-                frame = touchFrame
-            }
-            val count = childCount
-            for (i in count - 1 downTo 0) {
-                val child = getChildAt(i)
-                if (child.visibility == View.VISIBLE) {
-                    child.getHitRect(frame)
-                    frame?.let {
-                        if (it.contains(x, y)) {
-                            return firstPosition + i
-                        }
-                    }
-                }
-            }
-        }
-        return INVALID_POSITION
-    }
-
-    override fun computeScroll() {
-        if (scroller.computeScrollOffset()) {
-            if (disableRecyclerViewSlide) {
-                flingView?.scrollTo(0, 0)
-            } else {
-                flingView?.scrollTo(scroller.currX, scroller.currY)
-            }
-            invalidate()
-        }
-    }
-
-    fun closeMenu() {
-        if (flingView != null && flingView?.scrollX != 0) {
-            flingView?.scrollTo(0, 0)
-        }
-    }
-
-    private val isRTL: Boolean = context.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
-
-    companion object {
-        private const val INVALID_POSITION = -1
-        private const val INVALID_CHILD_WIDTH = -1
-        private const val SNAP_VELOCITY = 600
-    }
-}

+ 0 - 400
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/gridimage/GridImageSynthesizer.kt

@@ -1,400 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.gridimage
-
-import android.content.Context
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
-import android.graphics.Canvas
-import android.graphics.Color
-import android.graphics.Rect
-import android.os.Handler
-import android.os.Looper
-import android.text.TextUtils
-import android.widget.ImageView
-import com.tencent.qcloud.tuicore.TUIConfig
-import com.tencent.qcloud.tuikit.tuicallkit.R
-import com.trtc.tuikit.common.imageloader.ImageLoader
-import com.trtc.tuikit.common.imageloader.ImageOptions
-import java.io.File
-import java.io.FileOutputStream
-import java.io.IOException
-import java.util.concurrent.ExecutionException
-import java.util.concurrent.ExecutorService
-import java.util.concurrent.SynchronousQueue
-import java.util.concurrent.ThreadPoolExecutor
-import java.util.concurrent.TimeUnit
-
-class GridImageSynthesizer(context: Context, view: ImageView) {
-    private val context: Context = context.applicationContext
-    private val mainHandler = Handler(Looper.getMainLooper())
-    private var executors: ExecutorService? = null
-
-    private val imageView: ImageView = view
-    private var gridImageData: GridImageData = GridImageData()
-    private var imageId = ""
-
-    fun setImageId(id: String?) {
-        imageId = id ?: ""
-    }
-
-    fun setImageUrls(list: List<Any?>?) {
-        gridImageData.imageUrlList = list
-    }
-
-    fun setMaxSize(maxWidth: Int, maxHeight: Int) {
-        gridImageData.maxWidth = maxWidth
-        gridImageData.maxHeight = maxHeight
-    }
-
-    fun setBackgroundColor(bgColor: Int) {
-        gridImageData.bgColor = bgColor
-    }
-
-    fun setGap(gap: Int) {
-        gridImageData.gap = gap
-    }
-
-    fun setDefaultImage(resId: Int) {
-        gridImageData.defaultImageResId = resId
-    }
-
-    private fun getDefaultImage(): Int {
-        return gridImageData.defaultImageResId
-    }
-
-    private fun calculateGridParam(imagesSize: Int): IntArray {
-        val gridParam = IntArray(2)
-        if (imagesSize < 3) {
-            gridParam[0] = 1
-            gridParam[1] = imagesSize
-        } else if (imagesSize <= 4) {
-            gridParam[0] = 2
-            gridParam[1] = 2
-        } else {
-            gridParam[0] = imagesSize / 3 + if (imagesSize % 3 == 0) 0 else 1
-            gridParam[1] = 3
-        }
-        return gridParam
-    }
-
-    private fun asyncLoadImageList(imageData: GridImageData): Boolean {
-        val loadSuccess = true
-        val imageUrlList = imageData.imageUrlList
-        imageUrlList?.let {
-            for (i in it.indices) {
-                val defaultIcon = BitmapFactory.decodeResource(context.resources, R.drawable.tuicallkit_ic_avatar)
-                try {
-                    val bitmap = asyncLoadImage(it[i] ?: "", imageData.targetImageSize)
-                    if (bitmap != null) {
-                        imageData.putBitmap(bitmap, i)
-                    } else {
-                        imageData.putBitmap(defaultIcon, i)
-                    }
-                } catch (e: InterruptedException) {
-                    e.printStackTrace()
-                    imageData.putBitmap(defaultIcon, i)
-                } catch (e: ExecutionException) {
-                    e.printStackTrace()
-                    imageData.putBitmap(defaultIcon, i)
-                }
-            }
-        }
-        return loadSuccess
-    }
-
-    private fun synthesizeImageList(imageData: GridImageData): Bitmap {
-        val mergeBitmap = Bitmap.createBitmap(imageData.maxWidth, imageData.maxHeight, Bitmap.Config.ARGB_8888)
-        val canvas = Canvas(mergeBitmap)
-        drawDrawable(canvas, imageData)
-        canvas.save()
-        canvas.restore()
-        return mergeBitmap
-    }
-
-    private fun drawDrawable(canvas: Canvas, imageData: GridImageData) {
-        canvas.drawColor(imageData.bgColor)
-        val size = imageData.size()
-        val tCenter = (imageData.maxHeight + imageData.gap) / 2
-        val bCenter = (imageData.maxHeight - imageData.gap) / 2
-        val lCenter = (imageData.maxWidth + imageData.gap) / 2
-        val rCenter = (imageData.maxWidth - imageData.gap) / 2
-        val center = (imageData.maxHeight - imageData.targetImageSize) / 2
-        for (i in 0 until size) {
-            val rowNum = i / imageData.columnCount
-            val columnNum = i % imageData.columnCount
-            val left: Int =
-                (imageData.targetImageSize * (if (imageData.columnCount == 1) columnNum + 0.5 else columnNum).toFloat()
-                        + imageData.gap * (columnNum + 1)).toInt()
-            val top = (imageData.targetImageSize * (if (imageData.columnCount == 1) rowNum + 0.5 else rowNum).toFloat()
-                    + imageData.gap * (rowNum + 1)).toInt()
-            val right = left + imageData.targetImageSize
-            val bottom = top + imageData.targetImageSize
-            val bitmap = imageData.getBitmap(i)
-
-            if (size == 1 || size == 4 || size == 9) {
-                drawBitmapAtPosition(canvas, left, top, right, bottom, bitmap)
-                continue
-            }
-            if (size == 2) {
-                drawBitmapAtPosition(canvas, left, center, right, center + imageData.targetImageSize, bitmap)
-                continue
-            }
-            if (size == 3) {
-                when (i) {
-                    0 -> drawBitmapAtPosition(canvas, center, top, center + imageData.targetImageSize, bottom, bitmap)
-                    else -> drawBitmapAtPosition(
-                        canvas, imageData.gap * i + imageData.targetImageSize * (i - 1), tCenter,
-                        imageData.gap * i + imageData.targetImageSize * i, tCenter + imageData.targetImageSize,
-                        bitmap
-                    )
-                }
-                continue
-            }
-
-            if (size == 5) {
-                when (i) {
-                    0 -> drawBitmapAtPosition(
-                        canvas, rCenter - imageData.targetImageSize,
-                        rCenter - imageData.targetImageSize, rCenter, rCenter, bitmap
-                    )
-                    1 -> drawBitmapAtPosition(
-                        canvas, lCenter, rCenter - imageData.targetImageSize,
-                        lCenter + imageData.targetImageSize, rCenter, bitmap
-                    )
-                    else -> drawBitmapAtPosition(
-                        canvas, imageData.gap * (i - 1) + imageData.targetImageSize * (i - 2),
-                        tCenter, imageData.gap * (i - 1) + imageData.targetImageSize * (i - 1),
-                        tCenter + imageData.targetImageSize, bitmap
-                    )
-                }
-                continue
-            }
-            if (size == 6) {
-                when {
-                    i < 3 -> drawBitmapAtPosition(
-                        canvas, imageData.gap * (i + 1) + imageData.targetImageSize * i,
-                        bCenter - imageData.targetImageSize,
-                        imageData.gap * (i + 1) + imageData.targetImageSize * (i + 1), bCenter, bitmap
-                    )
-                    else -> drawBitmapAtPosition(
-                        canvas, imageData.gap * (i - 2) + imageData.targetImageSize * (i - 3),
-                        tCenter, imageData.gap * (i - 2) + imageData.targetImageSize * (i - 2),
-                        tCenter + imageData.targetImageSize, bitmap
-                    )
-                }
-                continue
-            }
-
-            if (size == 7) {
-                when (i) {
-                    0 -> drawBitmapAtPosition(
-                        canvas, center, imageData.gap, center + imageData.targetImageSize,
-                        imageData.gap + imageData.targetImageSize, bitmap
-                    )
-                    in 1..3 -> drawBitmapAtPosition(
-                        canvas, imageData.gap * i + imageData.targetImageSize * (i - 1), center,
-                        imageData.gap * i + imageData.targetImageSize * i, center + imageData.targetImageSize,
-                        bitmap
-                    )
-                    else -> drawBitmapAtPosition(
-                        canvas, imageData.gap * (i - 3) + imageData.targetImageSize * (i - 4),
-                        tCenter + imageData.targetImageSize / 2,
-                        imageData.gap * (i - 3) + imageData.targetImageSize * (i - 3),
-                        tCenter + imageData.targetImageSize / 2 + imageData.targetImageSize, bitmap
-                    )
-                }
-                continue
-            }
-
-            if (size == 8) {
-                when (i) {
-                    0 -> drawBitmapAtPosition(
-                        canvas, rCenter - imageData.targetImageSize, imageData.gap, rCenter,
-                        imageData.gap + imageData.targetImageSize, bitmap
-                    )
-                    1 -> drawBitmapAtPosition(
-                        canvas, lCenter, imageData.gap, lCenter + imageData.targetImageSize,
-                        imageData.gap + imageData.targetImageSize, bitmap
-                    )
-                    in 2..4 -> drawBitmapAtPosition(
-                        canvas, imageData.gap * (i - 1) + imageData.targetImageSize * (i - 2),
-                        center, imageData.gap * (i - 1) + imageData.targetImageSize * (i - 1),
-                        center + imageData.targetImageSize, bitmap
-                    )
-                    else -> drawBitmapAtPosition(
-                        canvas, imageData.gap * (i - 4) + imageData.targetImageSize * (i - 5),
-                        tCenter + imageData.targetImageSize / 2,
-                        imageData.gap * (i - 4) + imageData.targetImageSize * (i - 4),
-                        tCenter + imageData.targetImageSize / 2 + imageData.targetImageSize, bitmap
-                    )
-                }
-                continue
-            }
-        }
-    }
-
-    private fun drawBitmapAtPosition(canvas: Canvas, left: Int, top: Int, right: Int, bottom: Int, bitmap: Bitmap?) {
-        if (null != bitmap) {
-            val rect = Rect(left, top, right, bottom)
-            canvas.drawBitmap(bitmap, null, rect, null)
-        }
-    }
-
-    @Throws(ExecutionException::class, InterruptedException::class)
-    private fun asyncLoadImage(imgUrl: Any, targetImageSize: Int): Bitmap? {
-        val option = ImageOptions.Builder().setPlaceImage(R.drawable.tuicallkit_ic_avatar).build()
-        return ImageLoader.transformBitmap(context, imgUrl, targetImageSize, targetImageSize, option)
-    }
-
-    fun load(imageId: String?) {
-        if (gridImageData.size() == 0) {
-            if (imageId != null && !TextUtils.equals(imageId, this.imageId)) {
-                return
-            }
-            ImageLoader.load(context, imageView, getDefaultImage(), R.drawable.tuicallkit_ic_avatar)
-            return
-        }
-        if (gridImageData.size() == 1) {
-            if (imageId != null && !TextUtils.equals(imageId, this.imageId)) {
-                return
-            }
-            if (gridImageData.imageUrlList != null) {
-                ImageLoader.load(context, imageView, gridImageData.imageUrlList!![0], R.drawable.tuicallkit_ic_avatar)
-            }
-            return
-        }
-        clearImage()
-        val copyGridImageData = try {
-            gridImageData.clone()
-        } catch (e: CloneNotSupportedException) {
-            e.printStackTrace()
-            val urlList: ArrayList<Any?> = ArrayList()
-            if (gridImageData.imageUrlList != null) {
-                urlList.addAll(gridImageData.imageUrlList!!)
-            }
-            GridImageData(urlList, gridImageData.defaultImageResId)
-        }
-        val gridParam = calculateGridParam(gridImageData.size())
-        copyGridImageData.rowCount = gridParam[0]
-        copyGridImageData.columnCount = gridParam[1]
-        copyGridImageData.targetImageSize = (copyGridImageData.maxWidth - (copyGridImageData.columnCount + 1)
-                * copyGridImageData.gap) / if (copyGridImageData.columnCount == 1) 2 else copyGridImageData.columnCount
-        val finalImageId = imageId
-        execute {
-            val file = File(TUIConfig.getImageBaseDir() + finalImageId)
-            var cacheBitmapExists = false
-            var existsBitmap: Bitmap? = null
-            if (file.exists() && file.isFile) {
-                val options = BitmapFactory.Options()
-                existsBitmap = BitmapFactory.decodeFile(file.path, options)
-                if (options.outWidth > 0 && options.outHeight > 0) {
-                    cacheBitmapExists = true
-                }
-            }
-            if (!cacheBitmapExists) {
-                asyncLoadImageList(copyGridImageData)
-                existsBitmap = synthesizeImageList(copyGridImageData)
-                storeBitmap(file, existsBitmap)
-            }
-            loadImage(existsBitmap, finalImageId)
-        }
-    }
-
-    private fun loadImage(bitmap: Bitmap?, targetId: String?) {
-        mainHandler.post {
-            if (TextUtils.equals(imageId, targetId)) {
-                ImageLoader.load(context, imageView, bitmap, R.drawable.tuicallkit_ic_avatar)
-            }
-        }
-    }
-
-    fun clearImage() {
-        ImageLoader.clear(context, imageView)
-    }
-
-    private fun storeBitmap(outFile: File, bitmap: Bitmap) {
-        if (!outFile.exists() || outFile.isDirectory) {
-            outFile.parentFile.mkdirs()
-        }
-        var fOut: FileOutputStream? = null
-        try {
-            outFile.deleteOnExit()
-            outFile.createNewFile()
-            fOut = FileOutputStream(outFile)
-            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut)
-            fOut.flush()
-        } catch (e: IOException) {
-            outFile.deleteOnExit()
-        } finally {
-            if (null != fOut) {
-                try {
-                    fOut.close()
-                } catch (e: IOException) {
-                    e.printStackTrace()
-                    outFile.deleteOnExit()
-                }
-            }
-        }
-    }
-
-    private fun execute(runnable: Runnable) {
-        if (executors == null) {
-            executors = ThreadPoolExecutor(
-                0, Int.MAX_VALUE, 60L, TimeUnit.SECONDS,
-                SynchronousQueue()
-            )
-        }
-        executors?.execute(runnable)
-    }
-
-    internal class GridImageData : Cloneable {
-        var imageUrlList: List<Any?>? = ArrayList()
-        var defaultImageResId: Int = 0
-        var bgColor: Int = Color.parseColor("#cfd3d8")
-        var targetImageSize: Int = 0
-        var maxWidth: Int = 100
-        var maxHeight: Int = 100
-        var rowCount: Int = 0
-        var columnCount: Int = 0
-        var gap: Int = 6
-
-        private var bitmapMap: MutableMap<Int, Bitmap?> = HashMap()
-
-        constructor()
-
-        constructor(imageUrlList: List<Any?>?, defaultImageResId: Int) {
-            this.imageUrlList = imageUrlList
-            this.defaultImageResId = defaultImageResId
-        }
-
-        fun putBitmap(bitmap: Bitmap, position: Int) {
-            synchronized(bitmapMap) { bitmapMap.put(position, bitmap) }
-        }
-
-        fun getBitmap(position: Int): Bitmap? {
-            synchronized(bitmapMap) { return bitmapMap[position] }
-            return null
-        }
-
-        fun size(): Int {
-            imageUrlList?.let {
-                return Integer.min(it.size, MAX_SIZE)
-            }
-            return 0
-        }
-
-        @Throws(CloneNotSupportedException::class)
-        public override fun clone(): GridImageData {
-            val gridImageData = super.clone() as GridImageData
-            imageUrlList?.let {
-                gridImageData.imageUrlList = ArrayList(it.size)
-                (gridImageData.imageUrlList as ArrayList).addAll(it)
-            }
-            gridImageData.bitmapMap.putAll(bitmapMap)
-            return gridImageData
-        }
-
-        companion object {
-            private const val MAX_SIZE = 9
-        }
-    }
-}

+ 0 - 10
frame/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/recents/interfaces/ICallRecordItemListener.kt

@@ -1,10 +0,0 @@
-package com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.interfaces
-
-import android.view.View
-import io.trtc.tuikit.atomicxcore.api.call.CallInfo
-
-interface ICallRecordItemListener {
-    fun onItemClick(view: View?, viewType: Int, callInfo: CallInfo?)
-    fun onItemDeleteClick(view: View?, viewType: Int, callInfo: CallInfo?)
-    fun onDetailViewClick(view: View?, callInfo: CallInfo?)
-}

BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_chat_title_bar_minimalist_audio_call_icon.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_chat_title_bar_minimalist_video_call_icon.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_check_box_group_selected.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_check_box_group_unselected.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_checkbox_selected.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_group_select_disable.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_add_user_black.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_audio_call.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_audio_input.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_avatar.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_back.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_delete.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_dialing.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_dialing_pressed.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_dialing_video.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_edit.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_float.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_float_button.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_hangup.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_hangup_pressed.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_join_call.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_join_compress.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_join_expand.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_more_info.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_start_call.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_video_call.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_ic_video_incoming.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_profile_minimalist_audio_icon.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_profile_minimalist_video_icon.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_record_ic_audio_call.png


BIN
frame/tuicallkit-kt/src/main/res/drawable-xxhdpi/tuicallkit_record_ic_video_call.png


+ 0 - 5
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_bg_dialing.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/tuicallkit_ic_dialing_pressed" android:state_pressed="true" android:state_enabled="true" />
-    <item android:drawable="@drawable/tuicallkit_ic_dialing" android:state_pressed="false" android:state_enabled="true" />
-</selector>

+ 0 - 5
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_bg_hangup.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/tuicallkit_ic_hangup_pressed" android:state_enabled="true" android:state_pressed="true" />
-    <item android:drawable="@drawable/tuicallkit_ic_hangup" android:state_enabled="true" android:state_pressed="false" />
-</selector>

+ 0 - 5
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_dialog_cancel.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="#FFFFFF" />
-    <corners android:radius="12dp" />
-</shape>

+ 0 - 5
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_dialog_sure.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="#F2F2F2" />
-    <corners android:radius="12dp" />
-</shape>

+ 0 - 9
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_group_checkbox_selector.xml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:drawable="@drawable/tuicallkit_check_box_group_selected" android:state_checked="true" android:state_enabled="true" />
-    <item android:drawable="@drawable/tuicallkit_group_select_disable" android:state_checked="true" android:state_enabled="false" />
-    <item android:drawable="@drawable/tuicallkit_check_box_group_unselected" android:state_checked="false" />
-    <item android:drawable="@drawable/tuicallkit_check_box_group_unselected" />
-
-</selector>

+ 0 - 5
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_join_group_expand_view.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="#EEF0F2" />
-    <corners android:radius="8dp" />
-</shape>

+ 0 - 16
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_tab_item_selector.xml

@@ -1,16 +0,0 @@
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_selected="true">
-        <shape android:shape="rectangle">
-            <stroke android:width="2dp" android:color="@color/callkit_color_transparent" />
-            <solid android:color="@color/callkit_color_white" />
-            <corners android:radius="8.91dp" />
-        </shape>
-    </item>
-    <item android:state_selected="false">
-        <shape android:shape="rectangle">
-            <stroke android:width="2dp" android:color="@color/callkit_color_transparent" />
-            <solid android:color="#EFEFF4" />
-            <corners android:radius="8.91dp" />
-        </shape>
-    </item>
-</selector>

+ 0 - 5
frame/tuicallkit-kt/src/main/res/drawable/tuicallkit_tab_selector.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="#EFEFF4" />
-    <corners android:radius="8.91dp" />
-</shape>

+ 0 - 48
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_activity_call_kit.xml

@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/root_container"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ImageView
-        android:id="@+id/img_view_background"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:scaleType="centerCrop"
-        android:visibility="visible" />
-
-    <FrameLayout
-        android:id="@+id/call_view_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent" />
-
-    <ImageView
-        android:id="@+id/image_float_icon"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:layout_marginStart="20dp"
-        android:layout_marginTop="32dp"
-        android:src="@drawable/tuicallkit_ic_float_button"
-        android:visibility="visible"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:visibility="visible" />
-
-    <FrameLayout
-        android:id="@+id/rl_layout_invite_user"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:layout_marginEnd="20dp"
-        android:visibility="gone"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="@+id/image_float_icon"
-        app:layout_constraintBottom_toBottomOf="@+id/image_float_icon"
-        tools:visibility="visible" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 59
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_activity_group_user.xml

@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/callkit_color_white">
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_group_user_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="?attr/core_header_start_color"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <androidx.appcompat.widget.Toolbar
-            android:id="@+id/toolbar_group"
-            android:layout_width="match_parent"
-            android:layout_height="?android:attr/actionBarSize"
-            android:layout_marginTop="28dp"
-            android:layoutDirection="locale"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:navigationIcon="@drawable/tuicallkit_ic_back">
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:singleLine="true"
-                android:text="@string/callkit_group_title_add_user"
-                android:textColor="?attr/core_header_text_color"
-                android:textSize="18sp"
-                android:textStyle="bold" />
-
-            <Button
-                android:id="@+id/btn_group_ok"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="end|center_vertical"
-                android:background="@android:color/transparent"
-                android:text="@string/callkit_group_btn_ok"
-                android:textAllCaps="false"
-                android:textColor="#0365F9"
-                android:textSize="16sp" />
-        </androidx.appcompat.widget.Toolbar>
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/rv_user_list"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="4dp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/cl_group_user_title" />
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 68
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_incoming_float_view.xml

@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@drawable/tuicallkit_bg_incoming_view"
-    android:orientation="horizontal">
-
-    <androidx.constraintlayout.utils.widget.ImageFilterView
-        android:id="@+id/img_float_avatar"
-        android:layout_width="60dp"
-        android:layout_height="60dp"
-        android:layout_gravity="center_vertical"
-        android:layout_marginStart="16dp"
-        android:layout_marginTop="16dp"
-        android:layout_marginEnd="12dp"
-        android:layout_marginBottom="16dp"
-        android:scaleType="centerCrop"
-        android:src="@drawable/tuicallkit_ic_avatar"
-        app:round="8dp" />
-
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
-        android:layout_weight="1"
-        android:orientation="vertical">
-
-        <TextView
-            android:id="@+id/tv_float_title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:ellipsize="end"
-            android:maxLines="1"
-            android:textColor="@color/callkit_color_white"
-            android:textSize="18sp"
-            tools:hint="inviter" />
-
-        <TextView
-            android:id="@+id/tv_float_desc"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="4dp"
-            android:ellipsize="end"
-            android:maxLines="1"
-            android:textColor="@color/callkit_color_white"
-            android:textSize="12sp"
-            tools:hint="description" />
-    </LinearLayout>
-
-    <ImageView
-        android:id="@+id/btn_float_decline"
-        android:layout_width="36dp"
-        android:layout_height="36dp"
-        android:layout_gravity="center_vertical"
-        android:layout_marginStart="24dp"
-        android:layout_marginEnd="24dp"
-        android:src="@drawable/tuicallkit_bg_hangup" />
-
-    <ImageView
-        android:id="@+id/btn_float_accept"
-        android:layout_width="36dp"
-        android:layout_height="36dp"
-        android:layout_gravity="center_vertical"
-        android:layout_marginEnd="16dp"
-        android:background="@drawable/tuicallkit_bg_dialing" />
-</LinearLayout>

+ 0 - 17
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_item_head_view.xml

@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="60dp"
-    android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/tv_call_title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="24dp"
-        android:layout_marginTop="13dp"
-        android:text="@string/callkit_record_call_title"
-        android:textColor="@color/callkit_color_black"
-        android:textSize="34sp" />
-</RelativeLayout>

+ 0 - 108
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_join_call_view.xml

@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="#FFEBF0F6">
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_margin="8dp"
-        android:background="@drawable/tuicallkit_dialog_cancel"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <ImageView
-            android:id="@+id/img_join_call_icon"
-            android:layout_width="20dp"
-            android:layout_height="20dp"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="8dp"
-            android:layout_marginBottom="8dp"
-            android:src="@drawable/tuicallkit_ic_join_call"
-            app:layout_constraintBottom_toTopOf="@+id/cl_expand_view"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <TextView
-            android:id="@+id/tv_user_hint"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="10dp"
-            android:textColor="@color/callkit_color_gray"
-            android:textSize="12sp"
-            app:layout_constraintBottom_toBottomOf="@+id/img_join_call_icon"
-            app:layout_constraintStart_toEndOf="@+id/img_join_call_icon"
-            app:layout_constraintTop_toTopOf="@+id/img_join_call_icon"
-            tools:hint="two people is in voice call" />
-
-        <ImageView
-            android:id="@+id/img_ic_expand"
-            android:layout_width="21dp"
-            android:layout_height="21dp"
-            android:layout_marginEnd="16dp"
-            android:padding="10dp"
-            app:layout_constraintBottom_toBottomOf="@+id/img_join_call_icon"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/img_join_call_icon" />
-
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:id="@+id/cl_expand_view"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginEnd="16dp"
-            android:layout_marginBottom="16dp"
-            android:background="@drawable/tuicallkit_join_group_expand_view"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/img_join_call_icon">
-
-            <HorizontalScrollView
-                android:id="@+id/scroll_view"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:layout_marginEnd="10dp"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent">
-
-                <LinearLayout
-                    android:id="@+id/ll_layout_avatar"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_gravity="center"
-                    android:layout_marginTop="30dp"
-                    android:layout_marginBottom="30dp"
-                    android:orientation="horizontal" />
-
-            </HorizontalScrollView>
-
-            <View
-                android:id="@+id/view_separate"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"
-                android:background="#22707070"
-                app:layout_constraintTop_toBottomOf="@+id/scroll_view" />
-
-            <Button
-                android:id="@+id/btn_join_call"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:background="@color/callkit_color_transparent"
-                android:textAllCaps="false"
-                android:textColor="@color/callkit_color_black"
-                android:textSize="14sp"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/view_separate" />
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 93
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_layout_call_list_item.xml

@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="64dp"
-    android:background="#FFFFFF"
-    android:layoutDirection="locale"
-    android:orientation="horizontal"
-    app:clickToClose="false">
-
-    <LinearLayout
-        android:id="@+id/ll_call_item_left"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="#FFFFFF"
-        android:gravity="center_vertical"
-        android:orientation="vertical">
-
-        <LinearLayout
-            android:id="@+id/ll_call_item"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:background="#FFFFFF"
-            android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:paddingStart="16dp"
-            android:paddingEnd="16dp">
-
-            <CheckBox
-                android:id="@+id/cb_call_select"
-                android:layout_width="18dp"
-                android:layout_height="18dp"
-                android:layout_gravity="center"
-                android:layout_marginEnd="8dp"
-                android:background="@drawable/tuicallkit_checkbox_selected"
-                android:button="@null"
-                android:gravity="center"
-                android:padding="20dp"
-                android:visibility="visible" />
-
-            <include
-                layout="@layout/tuicallkit_layout_call_list_item_sub"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_gravity="center_vertical"
-                android:tag="Hover" />
-        </LinearLayout>
-
-        <View
-            android:id="@+id/bottom_line"
-            android:layout_width="match_parent"
-            android:layout_height="2dp"
-            android:background="#DDDDDD" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/bottom_wrapper_2"
-        android:layout_width="70dp"
-        android:layout_height="match_parent"
-        android:tag="Bottom4">
-
-        <RelativeLayout
-            android:id="@+id/ll_call_delete"
-            android:layout_width="70dp"
-            android:layout_height="match_parent"
-            android:background="#ff0000"
-            android:clickable="true"
-            android:gravity="center">
-
-            <ImageView
-                android:id="@+id/img_call_delete"
-                android:layout_width="18dp"
-                android:layout_height="18dp"
-                android:layout_centerHorizontal="true"
-                android:layout_centerVertical="true"
-                android:src="@drawable/tuicallkit_ic_delete" />
-
-            <TextView
-                android:id="@+id/tv_call_delete"
-                android:layout_width="70dp"
-                android:layout_height="match_parent"
-                android:layout_below="@+id/img_call_delete"
-                android:layout_centerHorizontal="true"
-                android:layout_centerVertical="true"
-                android:gravity="center"
-                android:paddingStart="5dp"
-                android:paddingEnd="5dp"
-                android:text="@string/callkit_record_call_delete"
-                android:textColor="@color/callkit_color_white"
-                android:textSize="12sp" />
-        </RelativeLayout>
-    </LinearLayout>
-</LinearLayout>

+ 0 - 98
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_layout_call_list_item_sub.xml

@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/cl_info_layout"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_gravity="center"
-    android:gravity="center_vertical"
-    android:orientation="horizontal">
-
-    <com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.RecordsIconView
-        android:id="@+id/call_icon"
-        android:layout_width="40dp"
-        android:layout_height="40dp"
-        android:scaleType="fitCenter"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:round="45dp" />
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_info"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
-        android:layout_marginStart="8dp"
-        app:layout_constraintBottom_toBottomOf="@+id/call_icon"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_weight="1"
-        app:layout_constraintStart_toEndOf="@+id/call_icon"
-        app:layout_constraintTop_toTopOf="@+id/call_icon">
-
-        <TextView
-            android:id="@+id/tv_call_user_id"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:ellipsize="end"
-            android:gravity="center"
-            android:maxWidth="180dp"
-            android:singleLine="true"
-            android:text="userId"
-            android:textColor="@color/callkit_color_black"
-            android:textSize="14sp"
-            android:textStyle="bold"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <ImageView
-            android:id="@+id/call_media_type"
-            android:layout_width="14dp"
-            android:layout_height="14dp"
-            android:layout_gravity="center_vertical"
-            android:scaleType="fitCenter"
-            app:layout_constraintBottom_toBottomOf="@+id/tv_call_status"
-            app:layout_constraintStart_toStartOf="@+id/tv_call_user_id"
-            app:layout_constraintTop_toTopOf="@+id/tv_call_status" />
-
-        <TextView
-            android:id="@+id/tv_call_status"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="4dp"
-            android:layout_marginTop="4dp"
-            android:layout_marginBottom="4dp"
-            android:ellipsize="end"
-            android:singleLine="true"
-            android:text="Missed"
-            android:textColor="#7A7A7A"
-            android:textSize="12sp"
-            app:layout_constraintStart_toEndOf="@+id/call_media_type"
-            app:layout_constraintTop_toBottomOf="@+id/tv_call_user_id" />
-
-        <TextView
-            android:id="@+id/tv_call_time"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="12dp"
-            android:lineHeight="15.84sp"
-            android:text="2:14 PM"
-            android:textColor="#b0b0b0"
-            android:textSize="12sp"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toStartOf="@+id/img_call_details"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <ImageView
-            android:id="@+id/img_call_details"
-            android:layout_width="24dp"
-            android:layout_height="24dp"
-            android:gravity="center"
-            android:includeFontPadding="false"
-            android:padding="5dp"
-            android:src="@drawable/tuicallkit_ic_more_info"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 66
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_list_item_group_user.xml

@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="58dp"
-    android:background="@color/callkit_color_white"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:paddingBottom="5dp">
-
-        <CheckBox
-            android:id="@+id/group_user_check_box"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:layout_marginStart="10dp"
-            android:layout_marginEnd="10dp"
-            android:background="@drawable/tuicallkit_group_checkbox_selector"
-            android:button="@null"
-            android:clickable="false"
-            android:focusable="false"
-            android:gravity="center" />
-
-        <androidx.constraintlayout.utils.widget.ImageFilterView
-            android:id="@+id/group_user_avatar"
-            android:layout_width="38.4dp"
-            android:layout_height="38.4dp"
-            android:layout_gravity="center_vertical"
-            android:layout_marginStart="12dp"
-            android:layout_marginEnd="12dp"
-            android:scaleType="centerCrop"
-            android:src="@drawable/tuicallkit_ic_avatar"
-            app:round="12dp" />
-
-        <TextView
-            android:id="@+id/group_user_name"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:ellipsize="end"
-            android:gravity="center_vertical"
-            android:lines="1"
-            android:textColor="#ff111111"
-            android:textSize="18sp" />
-
-        <TextView
-            android:id="@+id/group_user_hint"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_marginStart="4dp"
-            android:gravity="center_vertical"
-            android:text="@string/callkit_group_hint_you"
-            android:textColor="@color/callkit_color_gray"
-            android:textSize="14sp"
-            android:visibility="gone" />
-    </LinearLayout>
-
-    <View
-        android:id="@+id/view_line"
-        android:layout_width="match_parent"
-        android:layout_height="0.55dp"
-        android:background="#D9D9D9" />
-</LinearLayout>

+ 0 - 35
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_record_dialog.xml

@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-
-    <TextView
-        android:id="@+id/tv_clear_call_history"
-        android:layout_width="match_parent"
-        android:layout_height="56dp"
-        android:layout_marginStart="16dp"
-        android:layout_marginEnd="16dp"
-        android:background="@drawable/tuicallkit_dialog_sure"
-        android:gravity="center"
-        android:text="@string/callkit_record_dialog_message"
-        android:textColor="@color/callkit_record_text_red"
-        android:textSize="17sp"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <TextView
-        android:id="@+id/tv_clear_cancel"
-        android:layout_width="match_parent"
-        android:layout_height="56dp"
-        android:layout_marginStart="16dp"
-        android:layout_marginTop="12dp"
-        android:layout_marginEnd="16dp"
-        android:layout_marginBottom="21dp"
-        android:background="@drawable/tuicallkit_dialog_cancel"
-        android:gravity="center"
-        android:text="@string/callkit_record_dialog_cancel"
-        android:textColor="#007AFF"
-        android:textSize="17sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/tv_clear_call_history" />
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 110
frame/tuicallkit-kt/src/main/res/layout/tuicallkit_record_fragment_main.xml

@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/callkit_color_white">
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_record_title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="?attr/core_header_start_color"
-        android:padding="10dp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <com.google.android.material.tabs.TabLayout
-            android:id="@+id/tab_layout"
-            android:layout_width="wrap_content"
-            android:layout_height="32dp"
-            android:background="@drawable/tuicallkit_tab_selector"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:tabBackground="@drawable/tuicallkit_tab_item_selector"
-            app:tabIndicatorHeight="0dp"
-            app:tabMinWidth="76dp"
-            app:tabRippleColor="@null"
-            app:tabTextAppearance="@style/TUICallTabLayoutStyle">
-
-            <com.google.android.material.tabs.TabItem
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/callkit_record_tab_title_all" />
-
-            <com.google.android.material.tabs.TabItem
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/callkit_record_tab_title_miss" />
-        </com.google.android.material.tabs.TabLayout>
-
-        <Button
-            android:id="@+id/btn_call_edit"
-            android:layout_width="18dp"
-            android:layout_height="18dp"
-            android:layout_marginEnd="18dp"
-            android:background="@drawable/tuicallkit_ic_edit"
-            android:padding="5dp"
-            app:layout_constraintBottom_toBottomOf="@+id/tab_layout"
-            app:layout_constraintEnd_toStartOf="@+id/btn_start_call"
-            app:layout_constraintTop_toTopOf="@+id/tab_layout" />
-
-        <Button
-            android:id="@+id/btn_start_call"
-            android:layout_width="18dp"
-            android:layout_height="18dp"
-            android:layout_marginEnd="24dp"
-            android:background="@drawable/tuicallkit_ic_start_call"
-            android:padding="5dp"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="@+id/tab_layout"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/tab_layout" />
-
-        <Button
-            android:id="@+id/btn_clear"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="15dp"
-            android:background="@color/callkit_color_transparent"
-            android:minWidth="0dp"
-            android:minHeight="0dp"
-            android:padding="5dp"
-            android:text="@string/callkit_record_clear"
-            android:textAllCaps="false"
-            android:textColor="?attr/core_header_text_color"
-            android:textStyle="bold"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="@+id/tab_layout"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/tab_layout" />
-
-        <Button
-            android:id="@+id/btn_edit_done"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="15dp"
-            android:background="@color/callkit_color_transparent"
-            android:minWidth="0dp"
-            android:minHeight="0dp"
-            android:padding="5dp"
-            android:text="@string/callkit_record_done"
-            android:textAllCaps="false"
-            android:textColor="?attr/core_header_text_color"
-            android:textStyle="bold"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="@+id/tab_layout"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/tab_layout" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <com.tencent.qcloud.tuikit.tuicallkit.view.component.recents.SlideRecyclerView
-        android:id="@+id/recycle_view_list"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/cl_record_title" />
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 53
frame/tuicallkit-kt/src/main/res/values-ar/strings.xml

@@ -1,53 +0,0 @@
-<resources>
-    <string name="callkit_enter_pip_mode_fail_hint">فشل في الدخول إلى وضع الصورة داخل الصورة. يرجى التحقق مما إذا كانت الأذونات مفعلة</string>
-    <string name="callkit_invite_audio_call">دعوتك لمكالمة صوتية...</string>
-    <string name="callkit_invite_video_call">دعوتك لمكالمة فيديو...</string>
-    <string name="callkit_group_id_is_empty">معرف المجموعة فارغ</string>
-    <string name="callkit_group_title_add_user">إضافة مستخدم</string>
-    <string name="callkit_record_call_title">المكالمات الأخيرة</string>
-    <string name="callkit_record_call_delete">حذف</string>
-    <string name="callkit_record_dialog_message">مسح كل سجل المكالمات</string>
-    <string name="callkit_record_dialog_cancel">إلغاء</string>
-    <string name="callkit_record_tab_title_all">الكل</string>
-    <string name="callkit_record_tab_title_miss">المفقودة</string>
-    <string name="callkit_record_done">تم</string>
-    <string name="callkit_record_clear">مسح</string>
-    <string name="callkit_group_recall_unsupport">لا يدعم سجل المكالمات المتعددة إعادة الاتصال</string>
-    <string name="callkit_record_result_unknown">غير معروف</string>
-    <string name="callkit_record_result_missed">فائت</string>
-    <string name="callkit_record_result_incoming">وارد</string>
-    <string name="callkit_record_result_outgoing">صادر</string>
-    <string name="callkit_permission_camera">الكاميرا</string>
-    <string name="callkit_permission_microphone">الميكروفون</string>
-    <string name="callkit_permission_bluetooth">البلوتوث</string>
-    <string name="callkit_permission_separator">،</string>
-    <string name="callkit_permission_tips">يرجى تشغيل إذن %s أولاً</string>
-    <string name="callkit_permission_title">%s يتقدم بطلب الوصول إلى %s</string>
-    <string name="callkit_permission_mic_reason">يحتاج إلى الوصول إلى ميكروفونك ، ويمكن استخدامه لوظائف مثل المكالمة الصوتية / الفيديو ، المكالمة الصوتية / الفيديو الجماعية وما إلى ذلك.</string>
-    <string name="callkit_permission_camera_reason">يحتاج إلى الوصول إلى كاميراك ، ويمكن استخدامه لوظائف مثل المكالمة الفيديو ، المكالمة الفيديو الجماعية وما إلى ذلك. لتعمل مرشحات الجمال ، سنجمع معلومات الوجه التي يتم التقاطها بكاميراك في الوقت الحقيقي لكشف ملامح وجهك.</string>
-    <string name="callkit_permission_bluetooth_reason">يحتاج إلى الوصول إلى بلوتوثك ، ويمكن استخدامه لسماعة البلوتوث.</string>
-
-    <string name="callkit_package_not_purchased">ليس لديك حزمة TUICallKit ، يرجى فتح التجربة المجانية في لوحة التحكم أو شراء الحزمة الرسمية</string>
-    <string name="callkit_package_not_support">الحزمة التي اشتريتها لا تدعم هذه القدرة</string>
-    <string name="callkit_have_a_new_call">لديك مكالمة جديدة</string>
-
-    <string name="callkit_error_in_peer_blacklist">فشلت المكالمة ، المستخدم في القائمة السوداء ، ممنوع الإطلاق.</string>
-    <string name="callkit_error_invalid_login">الرجاء تسجيل الدخول مرة أخرى، تسجيل الدخول غير صحيح</string>
-    <string name="callkit_error_parameter_invalid">خطأ المعلمة</string>
-    <string name="callkit_error_request_refused">الحالة الحالية لا تدعم نداء الدالة</string>
-    <string name="callkit_error_request_repeated">الطريقة الحالية تتم تنفيذها، يرجى عدم استدعاءها مرة أخرى</string>
-    <string name="callkit_error_scene_not_support">مشهد المكالمة الحالي لا يدعم هذه الوظيفة</string>
-    <string name="callkit_join_group_call">انضمام</string>
-    <string name="callkit_join_group_call_users">%d شخص في مكالمة</string>
-    <string name="callkit_notification_channel_group_id">إدارة المكالمات</string>
-    <string name="callkit_notification_channel_id">مكالمات الصوت والفيديو</string>
-
-    <string name="callkit_video_call">مكالمة فيديو</string>
-    <string name="callkit_audio_call">مكالمة صوتية</string>
-    <string name="callkit_user_exceed_limit">يدعم TUICallKit حاليًا المكالمة مع ما يصل إلى 9 أشخاص. لمؤتمرات الاتصال الأكبر ، جرب استخدام TUIRoomKit</string>
-    <string name="callkit_toast_other_party_hung_up">الطرف الآخر أنهى المكالمة</string>
-    <string name="callkit_toast_other_party_declined">الطرف الآخر رفض طلب المكالمة</string>
-    <string name="callkit_toast_other_party_no_response">الطرف الآخر لم يرد</string>
-    <string name="callkit_toast_other_party_busy">الطرف الآخر مشغول</string>
-    <string name="callkit_toast_other_party_cancelled">الطرف الآخر ألغى المكالمة</string>
-</resources>

+ 0 - 55
frame/tuicallkit-kt/src/main/res/values-en/strings.xml

@@ -1,55 +0,0 @@
-<resources>
-    <string name="callkit_enter_pip_mode_fail_hint">Failed to enter Picture-in-Picture mode, Please check if the permission is enabled.</string>
-    <string name="callkit_invite_audio_call">Invited you to a voice call</string>
-    <string name="callkit_invite_video_call">Invites you to a video call</string>
-    <string name="callkit_group_id_is_empty">groupId is empty</string>
-    <string name="callkit_group_title_add_user">Add User</string>
-    <string name="callkit_group_hint_you">(you)</string>
-    <string name="callkit_group_btn_ok">Confirm</string>
-    <string name="callkit_record_call_title">Recent Calls</string>
-    <string name="callkit_record_call_delete">delete</string>
-    <string name="callkit_record_dialog_message">Clear All Call History</string>
-    <string name="callkit_record_dialog_cancel">Cancel</string>
-    <string name="callkit_record_tab_title_all">All</string>
-    <string name="callkit_record_tab_title_miss">Missed</string>
-    <string name="callkit_record_done">Done</string>
-    <string name="callkit_record_clear">Clear</string>
-    <string name="callkit_group_recall_unsupport">Multiple call records do not support recalls</string>
-    <string name="callkit_record_result_unknown">Unknown</string>
-    <string name="callkit_record_result_missed">Missed</string>
-    <string name="callkit_record_result_incoming">Incoming</string>
-    <string name="callkit_record_result_outgoing">Outgoing</string>
-    <string name="callkit_permission_camera">Camera</string>
-    <string name="callkit_permission_microphone">Microphone</string>
-    <string name="callkit_permission_bluetooth">Bluetooth</string>
-    <string name="callkit_permission_separator">,</string>
-    <string name="callkit_permission_tips">Please turn on the %s permission first</string>
-    <string name="callkit_permission_title">%s applies for access to the %s</string>
-    <string name="callkit_permission_mic_reason">Needs access to your microphone, and it can be used for functions such as Audio/Video Call, Group Audio/Video Call etc.</string>
-    <string name="callkit_permission_camera_reason">Needs access to your camera, and it can be used for functions such as Video Call, Group Video Call etc. For beauty filters to work, we will collect the facial information captured by your camera in real time to detect your facial features.</string>
-    <string name="callkit_permission_bluetooth_reason">To ensure that you can connect to Bluetooth function for communication during Audio/Video Call, we need to request permission of nearby devices.</string>
-
-    <string name="callkit_package_not_purchased">You do not have TUICallKit package, please open the free experience in the console or purchase the official package</string>
-    <string name="callkit_package_not_support">The package you purchased does not support this ability</string>
-    <string name="callkit_have_a_new_call">You have a new call</string>
-
-    <string name="callkit_error_in_peer_blacklist">The identifier is in blacklist. Failed to send this message!</string>
-    <string name="callkit_error_invalid_login">Invalid login, please login again</string>
-    <string name="callkit_error_parameter_invalid">Parameter error</string>
-    <string name="callkit_error_request_refused">The current status can not use this function</string>
-    <string name="callkit_error_request_repeated">The current status is waiting/accept, please do not call it repeatedly</string>
-    <string name="callkit_error_scene_not_support">The current scene does not support this function</string>
-    <string name="callkit_join_group_call">Join</string>
-    <string name="callkit_join_group_call_users">%d people are on the call</string>
-    <string name="callkit_notification_channel_group_id">Call Manager</string>
-    <string name="callkit_notification_channel_id">TUICallKit</string>
-
-    <string name="callkit_video_call">Video Call</string>
-    <string name="callkit_audio_call">Voice Call</string>
-    <string name="callkit_user_exceed_limit">TUICallKit currently supports call with up to 9 people.For larger conference calls,try using TUIRoomKit</string>
-    <string name="callkit_toast_other_party_hung_up">The other party has hung up</string>
-    <string name="callkit_toast_other_party_declined">The other party has declined the call request</string>
-    <string name="callkit_toast_other_party_no_response">The other party did not respond</string>
-    <string name="callkit_toast_other_party_busy">The other party is busy</string>
-    <string name="callkit_toast_other_party_cancelled">The other party has cancelled the call</string>
-</resources>

+ 0 - 51
frame/tuicallkit-kt/src/main/res/values-ja/strings.xml

@@ -1,51 +0,0 @@
-<resources>
-    <string name="callkit_enter_pip_mode_fail_hint">ピクチャーインピクチャーモードへの移行に失敗しました。権限が有効になっているか確認してください。</string>
-    <string name="callkit_invite_audio_call">音声通話に招待されました</string>
-    <string name="callkit_invite_video_call">ビデオ通話に招待されました</string>
-    <string name="callkit_group_id_is_empty">グループIDが空です</string>
-    <string name="callkit_group_title_add_user">メンバーを招待</string>
-    <string name="callkit_record_call_title">通話履歴</string>
-    <string name="callkit_record_call_delete">削除</string>
-    <string name="callkit_record_dialog_message">すべての履歴を消去</string>
-    <string name="callkit_record_dialog_cancel">キャンセル</string>
-    <string name="callkit_record_tab_title_all">すべて</string>
-    <string name="callkit_record_tab_title_miss">不在着信</string>
-    <string name="callkit_record_done">完了</string>
-    <string name="callkit_record_clear">削除</string>
-    <string name="callkit_group_recall_unsupport">グループ通話記録はリコールをサポートしません</string>
-    <string name="callkit_record_result_unknown">不明</string>
-    <string name="callkit_record_result_missed">不在着信</string>
-    <string name="callkit_record_result_incoming">着信</string>
-    <string name="callkit_record_result_outgoing">発信</string>
-    <string name="callkit_permission_camera">カメラ</string>
-    <string name="callkit_permission_microphone">マイク</string>
-    <string name="callkit_permission_bluetooth">Bluetooth</string>
-    <string name="callkit_permission_separator">、</string>
-    <string name="callkit_permission_tips">最初に%sの権限を有効にする必要があります</string>
-    <string name="callkit_permission_title">%sは%s権限を取得するよう申請します</string>
-    <string name="callkit_permission_camera_reason">カメラへのアクセス許可が必要で、ビデオ通話、グループビデオ通話などの機能に使用できます。美顔機能を使用する場合は、カメラで撮影された映像から顔の特徴点情報をリアルタイムで収集し、より自然な美しさを提供します。</string>
-    <string name="callkit_permission_mic_reason">マイクへのアクセス許可が必要で、音声/ビデオ通話、グループ音声/ビデオ通話などの機能に使用できます。マイクをオンにした場合のみ、録画した動画に音声が保存されます。</string>
-    <string name="callkit_permission_bluetooth_reason">音声/ビデオ通話中にBluetooth接続が正常に行われるには、付近のBluetoothデバイスの検出や接続を許可する必要があります。</string>
-    <string name="callkit_package_not_purchased">TUICallKit パッケージを購入していません。コンソールで無料トライアル版をアクティブ化するか、正式版を購入してください。</string>
-    <string name="callkit_package_not_support">購入したTUICallKitパッケージはこの機能をサポートしていません。パッケージタイプをアップグレードすることをお勧めします。</string>
-    <string name="callkit_have_a_new_call">新しい通話があります</string>
-    <string name="callkit_error_in_peer_blacklist">ユーザーはブラックリストに登録され、通話が開始できませんでした。</string>
-    <string name="callkit_error_invalid_login">ログイン失敗しました。もう一度ログインしてください</string>
-    <string name="callkit_error_parameter_invalid">パラメータエラー</string>
-    <string name="callkit_error_request_refused">現在の状態では、この機能の呼び出しはサポートされていません</string>
-    <string name="callkit_error_request_repeated">現在実行中のメソッドを呼び出すことはできません</string>
-    <string name="callkit_error_scene_not_support">現在の通話シーンでは、この機能はサポートしていません</string>
-    <string name="callkit_join_group_call">参加</string>
-    <string name="callkit_join_group_call_users">%d人が通話中です</string>
-    <string name="callkit_notification_channel_group_id">つうわかんり</string>
-    <string name="callkit_notification_channel_id">おんせい・えいぞうつうわ</string>
-
-    <string name="callkit_video_call">ビデオ通話</string>
-    <string name="callkit_audio_call">音声通話</string>
-    <string name="callkit_user_exceed_limit">暫して、最大9人までの通话をサポートしています。複数人の会議を希望する場合、TUIRoomKitを使用してください。</string>
-    <string name="callkit_toast_other_party_hung_up">相手が電話を切りました</string>
-    <string name="callkit_toast_other_party_declined">相手が通話リクエストを拒否しました</string>
-    <string name="callkit_toast_other_party_no_response">相手が応答しませんでした</string>
-    <string name="callkit_toast_other_party_busy">相手は通話中です</string>
-    <string name="callkit_toast_other_party_cancelled">相手が通話をキャンセルしました</string>
-</resources>

+ 0 - 55
frame/tuicallkit-kt/src/main/res/values-zh-rHK/strings.xml

@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="callkit_enter_pip_mode_fail_hint">進入畫中畫失敗,請檢查是否開啟權限</string>
-    <string name="callkit_invite_audio_call">邀請你語音通話</string>
-    <string name="callkit_invite_video_call">邀請你視頻通話</string>
-    <string name="callkit_group_id_is_empty">群ID為空</string>
-    <string name="callkit_group_title_add_user">添加成員</string>
-    <string name="callkit_record_call_title">最近通話</string>
-    <string name="callkit_record_call_delete">刪除</string>
-    <string name="callkit_record_dialog_message">清除所有記錄</string>
-    <string name="callkit_record_dialog_cancel">取消</string>
-    <string name="callkit_record_tab_title_all">所有通話</string>
-    <string name="callkit_record_tab_title_miss">未接來電</string>
-    <string name="callkit_record_done">完成</string>
-    <string name="callkit_record_clear">清除</string>
-    <string name="callkit_group_recall_unsupport">多人通話記錄不支持重呼</string>
-    <string name="callkit_record_result_unknown">未知通話</string>
-    <string name="callkit_record_result_missed">未接</string>
-    <string name="callkit_record_result_incoming">來電</string>
-    <string name="callkit_record_result_outgoing">去電</string>
-    <string name="callkit_permission_camera">攝像頭</string>
-    <string name="callkit_permission_microphone">麥克風</string>
-    <string name="callkit_permission_bluetooth">藍牙</string>
-    <string name="callkit_permission_separator">、</string>
-    <string name="callkit_permission_tips">請先打開%s權限</string>
-    <string name="callkit_permission_title">%s申請獲取%s權限</string>
-    <string name="callkit_permission_camera_reason">需要訪問您的相機權限,開啟後用於視頻通話、多人視頻通話等功能,在您使用美顏功能時,我們會對您實時拍攝的面部的像素信息進行實時智能識別,在識別過程中會實時收集您面部的像素信息,以為您提供更好的美顏效果。</string>
-    <string name="callkit_permission_mic_reason">需要訪問您的麥克風權限,開啟後用於語音通話、多人語音通話、視頻通話、多人視頻通話等功能,並且開啟後錄製的視頻才會有聲音。</string>
-    <string name="callkit_permission_bluetooth_reason">為確保您在音視頻通話中可正常連接藍牙功能進行溝通,我們需要向您申請查找與連接附近設備的權限。</string>
-
-    <string name="callkit_package_not_purchased">您當前未購買音視頻通話能力套餐,請前往 IM 控制台開通免費體驗或加購正式版</string>
-    <string name="callkit_package_not_support">您當前購買的音視頻通話能力套餐不支持該功能,建議您升級套餐類型</string>
-    <string name="callkit_have_a_new_call">您有一個新的通話</string>
-
-    <string name="callkit_error_in_peer_blacklist">發起通話失敗,用戶在黑名單中,禁止發起!</string>
-    <string name="callkit_error_invalid_login">登錄失敗,請重新登錄</string>
-    <string name="callkit_error_parameter_invalid">參數錯誤</string>
-    <string name="callkit_error_request_refused">當前狀態不支持調用</string>
-    <string name="callkit_error_request_repeated">當前方法正在執行中,請勿重複調用</string>
-    <string name="callkit_error_scene_not_support">當前通話場景,不支持該功能</string>
-    <string name="callkit_join_group_call">加入</string>
-    <string name="callkit_join_group_call_users">%d人正在通话中</string>
-    <string name="callkit_notification_channel_group_id">通話管理</string>
-    <string name="callkit_notification_channel_id">音視頻通話</string>
-
-    <string name="callkit_video_call">視頻通話</string>
-    <string name="callkit_audio_call">語音通話</string>
-    <string name="callkit_user_exceed_limit">暫支持最多9人通話。如需多人會議,請使用TUIRoomKit</string>
-
-    <string name="callkit_toast_other_party_hung_up">對方已掛斷</string>
-    <string name="callkit_toast_other_party_declined">對方已拒絕通話請求</string>
-    <string name="callkit_toast_other_party_no_response">對方無應答</string>
-    <string name="callkit_toast_other_party_busy">對方忙線中</string>
-    <string name="callkit_toast_other_party_cancelled">對方已取消通話</string>
-</resources>

+ 0 - 54
frame/tuicallkit-kt/src/main/res/values-zh-rTW/strings.xml

@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="callkit_enter_pip_mode_fail_hint">進入畫中畫失敗,請檢查是否開啟權限</string>
-    <string name="callkit_invite_audio_call">邀請你語音通話</string>
-    <string name="callkit_invite_video_call">邀請你視頻通話</string>
-    <string name="callkit_group_id_is_empty">群ID為空</string>
-    <string name="callkit_group_title_add_user">添加成員</string>
-    <string name="callkit_record_call_title">最近通話</string>
-    <string name="callkit_record_call_delete">刪除</string>
-    <string name="callkit_record_dialog_message">清除所有記錄</string>
-    <string name="callkit_record_dialog_cancel">取消</string>
-    <string name="callkit_record_tab_title_all">所有通話</string>
-    <string name="callkit_record_tab_title_miss">未接來電</string>
-    <string name="callkit_record_done">完成</string>
-    <string name="callkit_record_clear">清除</string>
-    <string name="callkit_group_recall_unsupport">多人通話記錄不支持重呼</string>
-    <string name="callkit_record_result_unknown">未知通話</string>
-    <string name="callkit_record_result_missed">未接</string>
-    <string name="callkit_record_result_incoming">來電</string>
-    <string name="callkit_record_result_outgoing">去電</string>
-    <string name="callkit_permission_camera">攝像頭</string>
-    <string name="callkit_permission_microphone">麥克風</string>
-    <string name="callkit_permission_bluetooth">藍牙</string>
-    <string name="callkit_permission_separator">、</string>
-    <string name="callkit_permission_tips">請先打開%s權限</string>
-    <string name="callkit_permission_title">%s申請獲取%s權限</string>
-    <string name="callkit_permission_camera_reason">需要訪問您的相機權限,開啟後用於視頻通話、多人視頻通話等功能,在您使用美顏功能時,我們會對您實時拍攝的面部的像素信息進行實時智能識別,在識別過程中會實時收集您面部的像素信息,以為您提供更好的美顏效果。</string>
-    <string name="callkit_permission_mic_reason">需要訪問您的麥克風權限,開啟後用於語音通話、多人語音通話、視頻通話、多人視頻通話等功能,並且開啟後錄製的視頻才會有聲音。</string>
-    <string name="callkit_permission_bluetooth_reason">為確保您在音視頻通話中可正常連接藍牙功能進行溝通,我們需要向您申請查找與連接附近設備的權限。</string>
-
-    <string name="callkit_package_not_purchased">您當前未購買音視頻通話能力套餐,請前往 IM 控制台開通免費體驗或加購正式版</string>
-    <string name="callkit_package_not_support">您當前購買的音視頻通話能力套餐不支持該功能,建議您升級套餐類型</string>
-    <string name="callkit_have_a_new_call">您有一個新的通話</string>
-
-    <string name="callkit_error_in_peer_blacklist">發起通話失敗,用戶在黑名單中,禁止發起!</string>
-    <string name="callkit_error_invalid_login">登錄失敗,請重新登錄</string>
-    <string name="callkit_error_parameter_invalid">參數錯誤</string>
-    <string name="callkit_error_request_refused">當前狀態不支持調用</string>
-    <string name="callkit_error_request_repeated">當前方法正在執行中,請勿重複調用</string>
-    <string name="callkit_error_scene_not_support">當前通話場景,不支持該功能</string>
-    <string name="callkit_join_group_call">加入</string>
-    <string name="callkit_join_group_call_users">%d人正在通话中</string>
-    <string name="callkit_notification_channel_group_id">通話管理</string>
-    <string name="callkit_notification_channel_id">音視頻通話</string>
-
-    <string name="callkit_video_call">視頻通話</string>
-    <string name="callkit_audio_call">語音通話</string>
-    <string name="callkit_user_exceed_limit">暫支持最多9人通話。如需多人會議,請使用TUIRoomKit</string>
-    <string name="callkit_toast_other_party_hung_up">對方已掛斷</string>
-    <string name="callkit_toast_other_party_declined">對方已拒絕通話請求</string>
-    <string name="callkit_toast_other_party_no_response">對方無應答</string>
-    <string name="callkit_toast_other_party_busy">對方忙線中</string>
-    <string name="callkit_toast_other_party_cancelled">對方已取消通話</string>
-</resources>

+ 0 - 53
frame/tuicallkit-kt/src/main/res/values-zh/strings.xml

@@ -1,53 +0,0 @@
-<resources>
-    <string name="callkit_enter_pip_mode_fail_hint">进入画中画失败,请检查是否开启权限</string>
-    <string name="callkit_invite_audio_call">邀请你语音通话</string>
-    <string name="callkit_invite_video_call">邀请你视频通话</string>
-    <string name="callkit_group_id_is_empty">群ID为空</string>
-    <string name="callkit_group_title_add_user">添加成员</string>
-    <string name="callkit_record_call_title">最近通话</string>
-    <string name="callkit_record_call_delete">删除</string>
-    <string name="callkit_record_dialog_message">清除所有记录</string>
-    <string name="callkit_record_dialog_cancel">取消</string>
-    <string name="callkit_record_tab_title_all">所有通话</string>
-    <string name="callkit_record_tab_title_miss">未接来电</string>
-    <string name="callkit_record_done">完成</string>
-    <string name="callkit_record_clear">清除</string>
-    <string name="callkit_group_recall_unsupport">多人通话记录不支持重呼</string>
-    <string name="callkit_record_result_unknown">未知通话</string>
-    <string name="callkit_record_result_missed">未接</string>
-    <string name="callkit_record_result_incoming">来电</string>
-    <string name="callkit_record_result_outgoing">去电</string>
-    <string name="callkit_permission_camera">摄像头</string>
-    <string name="callkit_permission_microphone">麦克风</string>
-    <string name="callkit_permission_bluetooth">蓝牙</string>
-    <string name="callkit_permission_separator">、</string>
-    <string name="callkit_permission_tips">请先打开%s权限</string>
-    <string name="callkit_permission_title">%s申请获取%s权限</string>
-    <string name="callkit_permission_camera_reason">需要访问您的相机权限,开启后用于视频通话、多人视频通话等功能,在您使用美颜功能时,我们会对您实时拍摄的面部的像素信息进行实时智能识别,在识别过程中会实时收集您面部的像素信息,以为您提供更好的美颜效果。</string>
-    <string name="callkit_permission_mic_reason">需要访问您的麦克风权限,开启后用于语音通话、多人语音通话、视频通话、多人视频通话等功能,并且开启后录制的视频才会有声音。</string>
-    <string name="callkit_permission_bluetooth_reason">为确保您在音视频通话中可正常连接蓝牙功能进行沟通,我们需要向您申请查找与连接附近设备的权限。</string>
-
-    <string name="callkit_package_not_purchased">您当前未购买音视频通话能力套餐,请前往 IM 控制台开通免费体验或加购正式版</string>
-    <string name="callkit_package_not_support">您当前购买的音视频通话能力套餐不支持该功能,建议您升级套餐类型</string>
-    <string name="callkit_have_a_new_call">您有一个新的通话</string>
-
-    <string name="callkit_error_in_peer_blacklist">发起通话失败,用户在黑名单中,禁止发起!</string>
-    <string name="callkit_error_invalid_login">登录失败,请重新登录</string>
-    <string name="callkit_error_parameter_invalid">参数错误</string>
-    <string name="callkit_error_request_refused">当前状态不支持调用</string>
-    <string name="callkit_error_request_repeated">当前方法正在执行中,请勿重复调用</string>
-    <string name="callkit_error_scene_not_support">当前通话场景,不支持该功能</string>
-    <string name="callkit_join_group_call">加入</string>
-    <string name="callkit_join_group_call_users">%d人正在通话中</string>
-    <string name="callkit_notification_channel_group_id">通话管理</string>
-    <string name="callkit_notification_channel_id">音视频通话</string>
-
-    <string name="callkit_video_call">视频通话</string>
-    <string name="callkit_audio_call">语音通话</string>
-    <string name="callkit_user_exceed_limit">暂支持最多9人通话。如需多人会议,请使用TUIRoomKit</string>
-    <string name="callkit_toast_other_party_hung_up">对方已挂断</string>
-    <string name="callkit_toast_other_party_declined">对方已拒绝通话请求</string>
-    <string name="callkit_toast_other_party_no_response">对方无应答</string>
-    <string name="callkit_toast_other_party_busy">对方忙线中</string>
-    <string name="callkit_toast_other_party_cancelled">对方已取消通话</string>
-</resources>

+ 0 - 8
frame/tuicallkit-kt/src/main/res/values/dimens.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <dimen name="callkit_small_image_size">30dp</dimen>
-    <dimen name="callkit_small_image_left_margin">8dp</dimen>
-    <dimen name="callkit_text_size_hint">12sp</dimen>
-    <dimen name="callkit_video_small_view_width">120dp</dimen>
-    <dimen name="callkit_video_small_view_height">180dp</dimen>
-</resources>

Some files were not shown because too many files changed in this diff