|
@@ -1,11 +1,17 @@
|
|
package com.wdkl.ncs.android.component.home.activity
|
|
package com.wdkl.ncs.android.component.home.activity
|
|
|
|
|
|
|
|
+import android.annotation.TargetApi
|
|
import android.app.Activity
|
|
import android.app.Activity
|
|
import android.databinding.DataBindingUtil
|
|
import android.databinding.DataBindingUtil
|
|
|
|
+import android.graphics.Color
|
|
|
|
+import android.os.Build
|
|
import android.os.Bundle
|
|
import android.os.Bundle
|
|
import android.os.Handler
|
|
import android.os.Handler
|
|
import android.os.SystemClock
|
|
import android.os.SystemClock
|
|
|
|
+import android.util.Log
|
|
import android.view.View
|
|
import android.view.View
|
|
|
|
+import android.view.ViewGroup
|
|
|
|
+import android.view.WindowManager
|
|
import com.google.gson.Gson
|
|
import com.google.gson.Gson
|
|
import com.wdkl.core.voip.VoipEvent
|
|
import com.wdkl.core.voip.VoipEvent
|
|
import com.wdkl.ncs.android.component.home.R
|
|
import com.wdkl.ncs.android.component.home.R
|
|
@@ -15,6 +21,7 @@ import com.wdkl.ncs.android.lib.utils.AppTool
|
|
import com.wdkl.ncs.android.lib.utils.showMessage
|
|
import com.wdkl.ncs.android.lib.utils.showMessage
|
|
import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
|
|
import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
|
|
import com.wdkl.ncs.android.middleware.tcp.TcpClient
|
|
import com.wdkl.ncs.android.middleware.tcp.TcpClient
|
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
|
|
import com.wdkl.ncs.android.middleware.tcp.channel.VideoUtil
|
|
import com.wdkl.ncs.android.middleware.tcp.channel.VideoUtil
|
|
import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
|
|
import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
|
|
import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
|
|
import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
|
|
@@ -22,19 +29,24 @@ import com.wdkl.ncs.android.middleware.utils.MessageEvent
|
|
import com.wdkl.skywebrtc.SkyEngineKit
|
|
import com.wdkl.skywebrtc.SkyEngineKit
|
|
import com.wdkl.skywebrtc.except.NotInitializedException
|
|
import com.wdkl.skywebrtc.except.NotInitializedException
|
|
import kotlinx.android.synthetic.main.activity_video.*
|
|
import kotlinx.android.synthetic.main.activity_video.*
|
|
-import kotlinx.android.synthetic.main.activity_video.call_duration_tv
|
|
|
|
import org.greenrobot.eventbus.EventBus
|
|
import org.greenrobot.eventbus.EventBus
|
|
import org.greenrobot.eventbus.Subscribe
|
|
import org.greenrobot.eventbus.Subscribe
|
|
import org.greenrobot.eventbus.ThreadMode
|
|
import org.greenrobot.eventbus.ThreadMode
|
|
|
|
+import org.webrtc.SurfaceViewRenderer
|
|
|
|
|
|
class VideoActivity:Activity(){
|
|
class VideoActivity:Activity(){
|
|
|
|
+ val TAG = "VideoActivity"
|
|
|
|
|
|
lateinit var mViewBinding: ActivityVideoBinding
|
|
lateinit var mViewBinding: ActivityVideoBinding
|
|
lateinit var gEngineKit: SkyEngineKit
|
|
lateinit var gEngineKit: SkyEngineKit
|
|
|
|
+ lateinit var localSurfaceView: SurfaceViewRenderer
|
|
|
|
+ lateinit var remoteSurfaceView: SurfaceViewRenderer
|
|
|
|
+
|
|
var interactionVOId: Int = -1
|
|
var interactionVOId: Int = -1
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
super.onCreate(savedInstanceState)
|
|
|
|
+ setStatusBarOrScreenStatus(this)
|
|
//eventbus
|
|
//eventbus
|
|
if(!EventBus.getDefault().isRegistered(this)){
|
|
if(!EventBus.getDefault().isRegistered(this)){
|
|
EventBus.getDefault().register(this)
|
|
EventBus.getDefault().register(this)
|
|
@@ -43,6 +55,7 @@ class VideoActivity:Activity(){
|
|
val rootView = layoutInflater.inflate(R.layout.activity_video, null, false)
|
|
val rootView = layoutInflater.inflate(R.layout.activity_video, null, false)
|
|
/**初始化Databinding对象*/
|
|
/**初始化Databinding对象*/
|
|
mViewBinding = DataBindingUtil.bind(rootView)
|
|
mViewBinding = DataBindingUtil.bind(rootView)
|
|
|
|
+
|
|
//初始化RTC引擎
|
|
//初始化RTC引擎
|
|
try {
|
|
try {
|
|
gEngineKit = SkyEngineKit.Instance()
|
|
gEngineKit = SkyEngineKit.Instance()
|
|
@@ -59,14 +72,125 @@ class VideoActivity:Activity(){
|
|
//当前对话id
|
|
//当前对话id
|
|
interactionVOId = intent.getIntExtra("iaId",-1)
|
|
interactionVOId = intent.getIntExtra("iaId",-1)
|
|
|
|
|
|
|
|
+ didCreateLocalVideoTrack()
|
|
|
|
+
|
|
//挂断按钮
|
|
//挂断按钮
|
|
iv_handoff.setOnClickListener {
|
|
iv_handoff.setOnClickListener {
|
|
val tcpModel = VideoUtil.handOff(interactionVOId)
|
|
val tcpModel = VideoUtil.handOff(interactionVOId)
|
|
TcpClient.getInstance().sendMsg(tcpModel.toJson())
|
|
TcpClient.getInstance().sendMsg(tcpModel.toJson())
|
|
Handler().postDelayed({
|
|
Handler().postDelayed({
|
|
|
|
+ DeviceChannel.calling = false
|
|
finish()
|
|
finish()
|
|
},1000)
|
|
},1000)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ //小窗切换
|
|
|
|
+ pip_video_view.setOnClickListener {
|
|
|
|
+ val isFullScreenRemote = fullscreen_video_view.getChildAt(0) === remoteSurfaceView
|
|
|
|
+ fullscreen_video_view.removeAllViews()
|
|
|
|
+ pip_video_view.removeAllViews()
|
|
|
|
+ if (isFullScreenRemote) {
|
|
|
|
+ remoteSurfaceView.setZOrderMediaOverlay(true)
|
|
|
|
+ pip_video_view.addView(remoteSurfaceView)
|
|
|
|
+ localSurfaceView.setZOrderMediaOverlay(false)
|
|
|
|
+ fullscreen_video_view.addView(localSurfaceView)
|
|
|
|
+ } else {
|
|
|
|
+ localSurfaceView.setZOrderMediaOverlay(true)
|
|
|
|
+ pip_video_view.addView(localSurfaceView)
|
|
|
|
+ remoteSurfaceView.setZOrderMediaOverlay(false)
|
|
|
|
+ fullscreen_video_view.addView(remoteSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //创建本地视频
|
|
|
|
+ fun didCreateLocalVideoTrack() {
|
|
|
|
+ if (localSurfaceView == null) {
|
|
|
|
+ val surfaceView = gEngineKit.currentSession.setupLocalVideo(true)
|
|
|
|
+ localSurfaceView = if (surfaceView != null) {
|
|
|
|
+ surfaceView as SurfaceViewRenderer
|
|
|
|
+ } else {
|
|
|
|
+ finish()
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ localSurfaceView.setZOrderMediaOverlay(true)
|
|
|
|
+ }
|
|
|
|
+ Log.d(TAG,
|
|
|
|
+ "didCreateLocalVideoTrack localSurfaceView != null is " + (localSurfaceView != null) + "; remoteSurfaceView == null = " + (remoteSurfaceView == null)
|
|
|
|
+ )
|
|
|
|
+ if (localSurfaceView.parent != null) {
|
|
|
|
+ (localSurfaceView.parent as ViewGroup).removeView(localSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ if (remoteSurfaceView == null) {
|
|
|
|
+ if (fullscreen_video_view != null && fullscreen_video_view.getChildCount() != 0) fullscreen_video_view.removeAllViews()
|
|
|
|
+ fullscreen_video_view.addView(localSurfaceView)
|
|
|
|
+ } else {
|
|
|
|
+ if (pip_video_view.getChildCount() != 0) pip_video_view.removeAllViews()
|
|
|
|
+ pip_video_view.addView(localSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //创建远端视频
|
|
|
|
+ fun didReceiveRemoteVideoTrack(userId: String?) {
|
|
|
|
+ pip_video_view.setVisibility(View.VISIBLE)
|
|
|
|
+ if (localSurfaceView != null) {
|
|
|
|
+ localSurfaceView.setZOrderMediaOverlay(true)
|
|
|
|
+ if (localSurfaceView.parent != null) {
|
|
|
|
+ (localSurfaceView.parent as ViewGroup).removeView(localSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ pip_video_view.addView(localSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ val surfaceView = gEngineKit.currentSession.setupRemoteVideo(userId, false)
|
|
|
|
+ Log.d(TAG, "didReceiveRemoteVideoTrack,surfaceView = $surfaceView")
|
|
|
|
+ if (surfaceView != null) {
|
|
|
|
+ fullscreen_video_view.setVisibility(View.VISIBLE)
|
|
|
|
+ remoteSurfaceView = surfaceView as SurfaceViewRenderer
|
|
|
|
+ fullscreen_video_view.removeAllViews()
|
|
|
|
+ if (remoteSurfaceView.parent != null) {
|
|
|
|
+ (remoteSurfaceView.parent as ViewGroup).removeView(remoteSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ fullscreen_video_view.addView(remoteSurfaceView)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @TargetApi(19)
|
|
|
|
+ private fun getSystemUiVisibility(): Int {
|
|
|
|
+ var flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or
|
|
|
|
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
|
|
|
+ flags = flags or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
|
|
|
+ }
|
|
|
|
+ return flags
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 设置状态栏透明
|
|
|
|
+ */
|
|
|
|
+ @TargetApi(19)
|
|
|
|
+ fun setStatusBarOrScreenStatus(activity: Activity) {
|
|
|
|
+ val window = activity.window
|
|
|
|
+ //全屏+锁屏+常亮显示
|
|
|
|
+ window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN or
|
|
|
|
+ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
|
|
|
|
+ WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
|
|
|
|
+ WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
|
|
|
|
+ window.decorView.systemUiVisibility = getSystemUiVisibility()
|
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
|
|
+ val layoutParams = getWindow().attributes
|
|
|
|
+ layoutParams.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
|
|
|
|
+ window.attributes = layoutParams
|
|
|
|
+ }
|
|
|
|
+ // 5.0以上系统状态栏透明
|
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
|
|
+ //清除透明状态栏
|
|
|
|
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
|
|
|
+ //设置状态栏颜色必须添加
|
|
|
|
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
|
|
|
+ window.statusBarColor = Color.TRANSPARENT //设置透明
|
|
|
|
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //19
|
|
|
|
+ window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
override fun onDestroy() {
|
|
override fun onDestroy() {
|
|
@@ -87,6 +211,7 @@ class VideoActivity:Activity(){
|
|
when (tcpModel.action){
|
|
when (tcpModel.action){
|
|
TcpAction.VideoAction.REJECT->{
|
|
TcpAction.VideoAction.REJECT->{
|
|
showMessage("对方拒绝")
|
|
showMessage("对方拒绝")
|
|
|
|
+ DeviceChannel.calling = false
|
|
AppTool.Time.delay(1500){
|
|
AppTool.Time.delay(1500){
|
|
finish()
|
|
finish()
|
|
}
|
|
}
|
|
@@ -109,13 +234,14 @@ class VideoActivity:Activity(){
|
|
}
|
|
}
|
|
TcpAction.VideoAction.HANDOFF->{
|
|
TcpAction.VideoAction.HANDOFF->{
|
|
showMessage("已挂断")
|
|
showMessage("已挂断")
|
|
|
|
+ DeviceChannel.calling = false
|
|
gEngineKit.leaveRoom()
|
|
gEngineKit.leaveRoom()
|
|
Handler().postDelayed({
|
|
Handler().postDelayed({
|
|
finish()
|
|
finish()
|
|
},1000)
|
|
},1000)
|
|
}
|
|
}
|
|
TcpAction.VideoAction.VIDEO_ON->{
|
|
TcpAction.VideoAction.VIDEO_ON->{
|
|
-
|
|
|
|
|
|
+ didReceiveRemoteVideoTrack(""+tcpModel.fromId)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|