From 6c4537608e61811ad6263d5f7c752f968bb7b73e Mon Sep 17 00:00:00 2001 From: wulei05 Date: Tue, 6 Aug 2024 09:54:40 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7callkit=202.5.0?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC```=20chore:=20=E5=8D=87=E7=BA=A7=20Gradle?= =?UTF-8?q?=20=E5=92=8C=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=9F=B3=E9=A2=91=E9=80=9A=E8=AF=9D=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 升级 Gradle 版本至 7.6.3,Android Gradle Plugin 版本至 7.4.2 2. 更新 call 依赖版本至 2.5.1 3. 优化音频通话时扬声器的默认配置和切换逻辑 4. 新增多语言支持和框架信息配置选项 5. 移除部分废弃代码和无用依赖 --- NLiteAVDemo-Android-Java/build.gradle | 13 ++--- .../com/netease/yunxin/nertc/ui/CallKitUI.kt | 8 ++- .../yunxin/nertc/ui/CallKitUIOptions.kt | 46 +++++++++++---- .../yunxin/nertc/ui/base/UserInfoHelper.kt | 7 --- .../DefaultFloatingTouchEventStrategy.kt | 10 ++-- .../nertc/ui/group/GroupVideoViewPool.kt | 2 +- .../nertc/ui/p2p/CallUIOperationsMgr.kt | 56 ++++++++++++------- .../fragment/callee/AudioCalleeFragment.kt | 2 +- .../onthecall/AudioOnTheCallFragment.kt | 2 +- .../call-ui/src/main/res/values/styles.xml | 2 + .../gradle/wrapper/gradle-wrapper.properties | 2 +- 11 files changed, 92 insertions(+), 58 deletions(-) diff --git a/NLiteAVDemo-Android-Java/build.gradle b/NLiteAVDemo-Android-Java/build.gradle index a38baf7..179a664 100644 --- a/NLiteAVDemo-Android-Java/build.gradle +++ b/NLiteAVDemo-Android-Java/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { - maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } google() - jcenter() + mavenCentral() + maven { url 'https://maven.faceunity.com/repository/maven-public/' } } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:7.4.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21" // NOTE: Do not place your application dependencies here; they belong @@ -16,12 +16,9 @@ buildscript { allprojects { repositories { - maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } google() mavenCentral() - maven { url 'http://developer.huawei.com/repo/' } - maven { url "https://jitpack.io" } - jcenter() + maven { url 'https://maven.faceunity.com/repository/maven-public/' } } } @@ -61,7 +58,7 @@ class Libs{ static def alog = "com.netease.yunxin.kit:alog:1.1.0" static def kotlinxCoroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" static def kotlinxCoroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4" - static def call = "com.netease.yunxin.kit.call:call:2.2.2" + static def call = "com.netease.yunxin.kit.call:call:2.5.1" static def okhttp = "com.squareup.okhttp3:okhttp:4.9.3" static def okhttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor:4.9.3" static def retrofitCore = "com.squareup.retrofit2:retrofit:2.9.0" diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUI.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUI.kt index 4fd71d2..9eb807f 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUI.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUI.kt @@ -29,10 +29,10 @@ import com.netease.yunxin.kit.call.p2p.model.NECallType import com.netease.yunxin.kit.call.p2p.model.NEInviteInfo import com.netease.yunxin.kit.call.p2p.model.NESetupConfig import com.netease.yunxin.nertc.nertcvideocall.utils.CallOrderHelper -import com.netease.yunxin.nertc.nertcvideocall.utils.EventReporter import com.netease.yunxin.nertc.ui.base.AVChatSoundPlayer import com.netease.yunxin.nertc.ui.base.CallParam import com.netease.yunxin.nertc.ui.base.Constants +import com.netease.yunxin.nertc.ui.base.MultiLanguageHelper import com.netease.yunxin.nertc.ui.base.UserInfoExtensionHelper import com.netease.yunxin.nertc.ui.p2p.CallUIOperationsMgr import com.netease.yunxin.nertc.ui.service.CallKitUIBridgeService @@ -123,7 +123,6 @@ object CallKitUI { wrapperUncaughtExceptionHandler() this@CallKitUI.currentUserAccId = currentUserAccId this@CallKitUI.currentUserRtcUid = currentUserRtcUId - EventReporter.canReport = enableReport UserInfoExtensionHelper.userInfoHelper = userInfoHelper val uiService = object : UIService { override fun getOneToOneAudioChat(): Class? = @@ -191,13 +190,15 @@ object CallKitUI { // rtc 扩展 val extension = callExtension ?: NECallExtensionMgr.getInstance().callExtension // 组件初始化配置 - val setupConfig = NESetupConfig.Builder(rtcConfig.appKey, currentUserAccId) + val setupConfig = NESetupConfig.Builder(rtcConfig.appKey) .currentUserRtcUid(currentUserRtcUId) .initRtcMode(initRtcMode) .rtcCallExtension(extension) .enableAutoJoinSignalChannel(enableAutoJoinWhenCalled) .enableJoinRtcWhenCall(joinRtcWhenCall) .rtcOption(rtcConfig.rtcSdkOption) + .framework(framework) + .channel(channel) .build() // 初始化 NECallEngine.sharedInstance().setup(context.applicationContext, setupConfig) @@ -217,6 +218,7 @@ object CallKitUI { ) } CallUIOperationsMgr.load(context) + MultiLanguageHelper.changeLanguage(context, language.language) init = true ALog.d(TAG, "CallKitUI init completed. Init with options $this.") } diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUIOptions.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUIOptions.kt index 5412e74..6786584 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUIOptions.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/CallKitUIOptions.kt @@ -18,6 +18,7 @@ import com.netease.yunxin.kit.call.p2p.model.NECallInitRtcMode import com.netease.yunxin.kit.call.p2p.model.NEInviteInfo import com.netease.yunxin.nertc.nertcvideocall.model.CallExtension import com.netease.yunxin.nertc.nertcvideocall.utils.InfoFilterUtils.subInfo +import com.netease.yunxin.nertc.ui.base.LanguageType import com.netease.yunxin.nertc.ui.base.SoundHelper import com.netease.yunxin.nertc.ui.base.UserInfoHelper import com.netease.yunxin.nertc.ui.group.GroupCallActivity @@ -38,7 +39,6 @@ class CallKitUIOptions constructor( val userInfoHelper: UserInfoHelper? = null, val incomingCallEx: IncomingCallEx? = null, val callKitUIBridgeService: CallKitUIBridgeService? = null, - val enableReport: Boolean = true, val pushConfigProviderForGroup: PushConfigProviderForGroup? = null, val callExtension: CallExtension? = null, val soundHelper: SoundHelper? = SoundHelper(), @@ -48,7 +48,10 @@ class CallKitUIOptions constructor( val joinRtcWhenCall: Boolean = false, val audio2Video: Boolean = false, val video2Audio: Boolean = false, - val enableGroup: Boolean = false + val enableGroup: Boolean = false, + val language: NECallUILanguage = NECallUILanguage.AUTO, + var framework: String? = null, + var channel: String? = null ) { class Builder { @@ -70,8 +73,6 @@ class CallKitUIOptions constructor( private var callKitUIBridgeService: CallKitUIBridgeService? = null - private var enableReport: Boolean = true - private var pushConfigProviderForGroup: PushConfigProviderForGroup? = null private var contactSelector: ( @@ -101,10 +102,17 @@ class CallKitUIOptions constructor( private var enableGroup: Boolean = false private var audio2Video: Boolean = false + private var video2Audio: Boolean = false private var joinRtcWhenCall: Boolean = false + private var language: NECallUILanguage = NECallUILanguage.AUTO + + private var framework: String? = null + + private var channel: String? = null + fun rtcSdkOption(option: NERtcOption) = apply { this.rtcSdkOption = option } @@ -161,10 +169,6 @@ class CallKitUIOptions constructor( this.callKitUIBridgeService = callKitUIBridgeService } - fun enableReport(enable: Boolean) = apply { - this.enableReport = enable - } - fun pushConfigProviderForGroup(providerForGroup: PushConfigProviderForGroup) = apply { this.pushConfigProviderForGroup = providerForGroup } @@ -224,6 +228,18 @@ class CallKitUIOptions constructor( this.joinRtcWhenCall = joinRtcWhenCall } + fun language(language: NECallUILanguage) = apply { + this.language = language + } + + fun framework(framework: String) = apply { + this.framework = framework + } + + fun channel(channel: String) = apply { + this.channel = channel + } + fun build(): CallKitUIOptions { val rtcConfig = CallKitUIRtcConfig(rtcAppKey, rtcSdkOption) @@ -244,7 +260,6 @@ class CallKitUIOptions constructor( userInfoHelper = userInfoHelper, incomingCallEx = incomingCallEx, callKitUIBridgeService = callKitUIBridgeService, - enableReport = enableReport, pushConfigProviderForGroup = pushConfigProviderForGroup, callExtension = callExtension, soundHelper = soundHelper, @@ -254,13 +269,16 @@ class CallKitUIOptions constructor( joinRtcWhenCall = joinRtcWhenCall, audio2Video = audio2Video, video2Audio = video2Audio, - enableGroup = enableGroup + enableGroup = enableGroup, + language = language, + framework = framework, + channel = channel ) } } override fun toString(): String { - return "CallKitUIOptions(currentUserAccId='$currentUserAccId', currentUserRtcUId=$currentUserRtcUId, timeOutMillisecond=$timeOutMillisecond, resumeBGInvitation=$resumeBGInvitation, rtcConfig=$rtcConfig, activityConfig=$activityConfig, uiHelper=$uiHelper, notificationConfigFetcher=$notificationConfigFetcher, notificationConfigFetcherForGroup=$notificationConfigFetcherForGroup, userInfoHelper=$userInfoHelper, incomingCallEx=$incomingCallEx, callKitUIBridgeService=$callKitUIBridgeService, enableReport=$enableReport, pushConfigProviderForGroup=$pushConfigProviderForGroup, callExtension=$callExtension, soundHelper=$soundHelper, enableOrder=$enableOrder, enableAutoJoinWhenCalled=$enableAutoJoinWhenCalled, initRtcMode=$initRtcMode, joinRtcWhenCall=$joinRtcWhenCall, audio2Video=$audio2Video, video2Audio=$video2Audio, enableGroup=$enableGroup)" + return "CallKitUIOptions(currentUserAccId='$currentUserAccId', currentUserRtcUId=$currentUserRtcUId, timeOutMillisecond=$timeOutMillisecond, resumeBGInvitation=$resumeBGInvitation, rtcConfig=$rtcConfig, activityConfig=$activityConfig, uiHelper=$uiHelper, notificationConfigFetcher=$notificationConfigFetcher, notificationConfigFetcherForGroup=$notificationConfigFetcherForGroup, userInfoHelper=$userInfoHelper, incomingCallEx=$incomingCallEx, callKitUIBridgeService=$callKitUIBridgeService, pushConfigProviderForGroup=$pushConfigProviderForGroup, callExtension=$callExtension, soundHelper=$soundHelper, enableOrder=$enableOrder, enableAutoJoinWhenCalled=$enableAutoJoinWhenCalled, initRtcMode=$initRtcMode, joinRtcWhenCall=$joinRtcWhenCall, audio2Video=$audio2Video, video2Audio=$video2Audio, enableGroup=$enableGroup, language=$language, framework=$framework, channel=$channel)" } } @@ -310,3 +328,9 @@ class CallKitNotificationConfig @JvmOverloads constructor( return "CallKitNotificationConfig(notificationIconRes=$notificationIconRes, channelId=$channelId, title=$title, content=$content)" } } + +enum class NECallUILanguage(val language: String) { + AUTO(LanguageType.LANGUAGE_SYSTEM), + ZH_HANS(LanguageType.LANGUAGE_ZH_CN), + EN(LanguageType.LANGUAGE_EN) +} diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/base/UserInfoHelper.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/base/UserInfoHelper.kt index c615398..233bfc6 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/base/UserInfoHelper.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/base/UserInfoHelper.kt @@ -10,14 +10,7 @@ import android.content.Context interface UserInfoHelper { - /** - * 用户根据 accId 内容,利用 notify 接口将用户昵称通知组件 - */ fun fetchNickname(accId: String, notify: ((String) -> Unit)): Boolean - /** - * 用户根据 accId 内容,利用 notify 接口个将用户的头像链接通知组件, - * notify 中的两个字段其中一个为头像的url,另一个为加载头像失败后展示占位的本地资源 id - */ fun fetchAvatar(context: Context, accId: String, notify: (String?, Int?) -> Unit): Boolean } diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/floating/DefaultFloatingTouchEventStrategy.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/floating/DefaultFloatingTouchEventStrategy.kt index 00cd3fc..80e1f7d 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/floating/DefaultFloatingTouchEventStrategy.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/floating/DefaultFloatingTouchEventStrategy.kt @@ -179,7 +179,7 @@ class DefaultFloatingTouchEventStrategy( * 属性动画更新监听 */ private val updateListener = object : ValueAnimator.AnimatorUpdateListener { - override fun onAnimationUpdate(animation: ValueAnimator?) { + override fun onAnimationUpdate(animation: ValueAnimator) { animation ?: return (animation.animatedValue as? Int)?.run { windowWrapper?.updateWindowParamsPos(xPos = this) @@ -191,20 +191,20 @@ class DefaultFloatingTouchEventStrategy( * 动画状态监听 */ private val animatorListener = object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { ALog.d(logTag, "onAnimationEnd") finish() } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { ALog.d(logTag, "onAnimationCancel") finish() } - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } } diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/group/GroupVideoViewPool.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/group/GroupVideoViewPool.kt index ddda3af..07db4e8 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/group/GroupVideoViewPool.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/group/GroupVideoViewPool.kt @@ -76,7 +76,7 @@ class GroupVideoViewPool { videoView1 = queue.poll() } if (videoView1 == null) { - videoView1 = NERtcVideoView(context).apply { + videoView1 = NERtcVideoView(context!!).apply { setZOrderMediaOverlay(true) layoutParams = ViewGroup.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/CallUIOperationsMgr.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/CallUIOperationsMgr.kt index 4247280..35ebcd8 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/CallUIOperationsMgr.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/CallUIOperationsMgr.kt @@ -407,7 +407,10 @@ object CallUIOperationsMgr { action.invoke() return } - ALog.dApi(TAG, ParameterMap("doConfigSpeaker").append("enableSpeaker", enableSpeaker)) + ALog.d( + TAG, + ParameterMap("doConfigSpeaker").append("enableSpeaker", enableSpeaker).toString() + ) (context.getSystemService(Context.AUDIO_SERVICE) as AudioManager).run { @Suppress("DEPRECATION") if (isBluetoothA2dpOn) { @@ -415,24 +418,34 @@ object CallUIOperationsMgr { return } } - if (!callInfoWithUIState.callParam.isCalled && CallKitUI.options?.joinRtcWhenCall != true && currentCallState() != CallState.STATE_DIALOG) { - (context.getSystemService(Context.AUDIO_SERVICE) as AudioManager).run { - if (enableSpeaker) { - mode = AudioManager.MODE_NORMAL - isSpeakerphoneOn = true + + if (CallKitUI.options?.joinRtcWhenCall != true) { + enableSystemSpeaker(enableSpeaker) + } + action.invoke() + } + + private fun enableSystemSpeaker(enableSpeaker: Boolean) { + ALog.d( + TAG, + ParameterMap("enableSystemSpeaker").append("enableSpeaker", enableSpeaker).toString() + ) + (context.getSystemService(Context.AUDIO_SERVICE) as AudioManager).run { + if (enableSpeaker) { + mode = AudioManager.MODE_NORMAL + isSpeakerphoneOn = true + } else { + // 兼容高版本 sdk + @SuppressLint("ObsoleteSdkInt") + mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + AudioManager.MODE_IN_COMMUNICATION } else { - // 兼容高版本 sdk - @SuppressLint("ObsoleteSdkInt") - mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - AudioManager.MODE_IN_COMMUNICATION - } else { - AudioManager.MODE_IN_CALL - } - isSpeakerphoneOn = false + AudioManager.MODE_IN_CALL } + isSpeakerphoneOn = false } + callInfoWithUIState.isLocalMuteSpeaker = !enableSpeaker } - action.invoke() } /** @@ -608,15 +621,18 @@ object CallUIOperationsMgr { var isRemoteMuteVideo: Boolean = false, var isLocalMuteVideo: Boolean = false, var isLocalMuteAudio: Boolean = false, - var isLocalMuteSpeaker: Boolean = ( - CallKitUI.baseContext() - ?.getSystemService(Context.AUDIO_SERVICE) as? AudioManager - )?.isSpeakerphoneOn - ?: !NERtcEx.getInstance().isSpeakerphoneOn, + var isLocalMuteSpeaker: Boolean = initializeSpeakerphoneStatus(), var cameraDeviceStatus: Int = NERtcConstants.VideoDeviceState.OPENED, var isLocalSmallVideo: Boolean = true, var isVirtualBlur: Boolean = false ) { + companion object { + private fun initializeSpeakerphoneStatus(): Boolean { + val audioManager = CallKitUI.baseContext()?.getSystemService(Context.AUDIO_SERVICE) as? AudioManager + return audioManager?.isSpeakerphoneOn?.not() ?: !NERtcEx.getInstance().isSpeakerphoneOn + } + } + val callState: Int get() = callEngine.callInfo.callStatus diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/callee/AudioCalleeFragment.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/callee/AudioCalleeFragment.kt index 6ff0c6e..28f4359 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/callee/AudioCalleeFragment.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/callee/AudioCalleeFragment.kt @@ -153,6 +153,6 @@ open class AudioCalleeFragment : BaseP2pCallFragment() { } override fun toUpdateUIState(type: Int) { - bridge.doConfigSpeaker(false) + bridge.doConfigSpeaker(true) } } diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/onthecall/AudioOnTheCallFragment.kt b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/onthecall/AudioOnTheCallFragment.kt index 6c6e299..985c2ca 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/onthecall/AudioOnTheCallFragment.kt +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/java/com/netease/yunxin/nertc/ui/p2p/fragment/onthecall/AudioOnTheCallFragment.kt @@ -180,7 +180,7 @@ open class AudioOnTheCallFragment : BaseP2pCallFragment() { override fun toUpdateUIState(type: Int) { when (type) { INIT -> { - bridge.doConfigSpeaker(!bridge.isLocalMuteSpeaker) + bridge.doConfigSpeaker(false) getView(viewKeyImageSpeaker)?.run { setImageResource( if (bridge.isSpeakerOn()) R.drawable.speaker_on else R.drawable.speaker_off diff --git a/NLiteAVDemo-Android-Java/call-ui/src/main/res/values/styles.xml b/NLiteAVDemo-Android-Java/call-ui/src/main/res/values/styles.xml index 187e6fc..4ba6e19 100644 --- a/NLiteAVDemo-Android-Java/call-ui/src/main/res/values/styles.xml +++ b/NLiteAVDemo-Android-Java/call-ui/src/main/res/values/styles.xml @@ -24,4 +24,6 @@ true false + +