|
@@ -0,0 +1,294 @@
|
|
|
+package com.wdkl.ncs.android.component.home.activity
|
|
|
+
|
|
|
+import android.annotation.SuppressLint
|
|
|
+import android.content.Context
|
|
|
+import android.content.Intent
|
|
|
+import android.os.Build
|
|
|
+import android.os.Bundle
|
|
|
+import android.os.VibrationEffect
|
|
|
+import android.os.Vibrator
|
|
|
+import android.util.Log
|
|
|
+import android.view.View
|
|
|
+import android.widget.TextView
|
|
|
+import androidx.recyclerview.widget.RecyclerView
|
|
|
+import com.alibaba.android.vlayout.DelegateAdapter
|
|
|
+import com.alibaba.android.vlayout.VirtualLayoutManager
|
|
|
+import com.alibaba.fastjson.JSON
|
|
|
+import com.enation.javashop.utils.base.tool.BaseToolActivity
|
|
|
+import com.google.gson.Gson
|
|
|
+import com.scwang.smartrefresh.layout.SmartRefreshLayout
|
|
|
+import com.wdkl.ncs.android.component.home.R
|
|
|
+import com.wdkl.ncs.android.component.home.adapter.NewCallItemAdapter
|
|
|
+import com.wdkl.ncs.android.component.home.service.WdKeepAliveService
|
|
|
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
|
|
|
+import com.wdkl.ncs.android.component.home.ui.CallSingleActivity
|
|
|
+import com.wdkl.ncs.android.component.home.util.RingPlayHelper
|
|
|
+import com.wdkl.ncs.android.component.home.util.SpeechUtil
|
|
|
+import com.wdkl.ncs.android.lib.base.BaseApplication
|
|
|
+import com.wdkl.ncs.android.lib.utils.AppTool
|
|
|
+import com.wdkl.ncs.android.lib.utils.showMessage
|
|
|
+import com.wdkl.ncs.android.lib.vo.MessageEvent
|
|
|
+import com.wdkl.ncs.android.middleware.common.Constants
|
|
|
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
|
|
|
+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.VoiceUtil
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.enums.DeviceTypeEnum
|
|
|
+import org.greenrobot.eventbus.EventBus
|
|
|
+import org.greenrobot.eventbus.Subscribe
|
|
|
+import org.greenrobot.eventbus.ThreadMode
|
|
|
+
|
|
|
+class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickListener {
|
|
|
+ var TAG = NewCallListActivity::class.java.getSimpleName()
|
|
|
+
|
|
|
+ private val adapter = NewCallItemAdapter(ArrayList(),this)
|
|
|
+ private lateinit var virtualLayoutManager: VirtualLayoutManager
|
|
|
+ private lateinit var delegateAdapter: DelegateAdapter
|
|
|
+
|
|
|
+ private lateinit var recyclerView: RecyclerView
|
|
|
+ private lateinit var refreshView: SmartRefreshLayout
|
|
|
+ private lateinit var emptyView: TextView
|
|
|
+
|
|
|
+ lateinit var mVibrator: Vibrator
|
|
|
+
|
|
|
+ private var transSeconds = 15
|
|
|
+
|
|
|
+ private val screen_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
|
|
|
+ or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
|
|
|
+
|
|
|
+ override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
+ super.onCreate(savedInstanceState)
|
|
|
+
|
|
|
+ setContentView(R.layout.activity_call_list)
|
|
|
+
|
|
|
+ if(!EventBus.getDefault().isRegistered(this)){
|
|
|
+ EventBus.getDefault().register(this)
|
|
|
+ }
|
|
|
+
|
|
|
+ mVibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
|
|
+
|
|
|
+ transSeconds = SettingConfig.getCountdownTime(activity)
|
|
|
+
|
|
|
+ recyclerView = findViewById(R.id.rv_call_list)
|
|
|
+ refreshView = findViewById(R.id.srl_call_list)
|
|
|
+ emptyView = findViewById(R.id.tv_empty_call)
|
|
|
+
|
|
|
+ /**初始化LayoutMannager*/
|
|
|
+ virtualLayoutManager = VirtualLayoutManager(this.activity)
|
|
|
+
|
|
|
+ /**初始化适配器*/
|
|
|
+ delegateAdapter = DelegateAdapter(virtualLayoutManager)
|
|
|
+ delegateAdapter.addAdapter(adapter)
|
|
|
+ recyclerView.layoutManager = virtualLayoutManager
|
|
|
+ recyclerView.adapter = delegateAdapter
|
|
|
+
|
|
|
+ //ring up
|
|
|
+ RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.ring_tone, true)
|
|
|
+
|
|
|
+ adapter.setCallClick(this)
|
|
|
+
|
|
|
+ if (Constants.supportCall) {
|
|
|
+ adapter.setOnItemClickListener { data, position ->
|
|
|
+ SpeechUtil.getInstance().stopSpeak()
|
|
|
+ RingPlayHelper.stopRingTone()
|
|
|
+ cancelVibrator()
|
|
|
+
|
|
|
+ val interactionVO = Gson().fromJson(data.data.toString(), InteractionVO::class.java)
|
|
|
+ var roomId: String
|
|
|
+ if (interactionVO.fromDeviceType == DeviceTypeEnum.SIMULATE_BED_DEVICE.value()) {
|
|
|
+ //模拟分机呼叫,通话由手机端创建
|
|
|
+ DeviceChannel.callId = interactionVO.fromDeviceId
|
|
|
+ roomId = Constants.sipId!!
|
|
|
+ } else {
|
|
|
+ if (interactionVO.fromDeviceId.equals(Constants.deviceId)) {
|
|
|
+ DeviceChannel.callId = interactionVO.toDeviceId
|
|
|
+ roomId = interactionVO.toSipId
|
|
|
+ } else {
|
|
|
+ DeviceChannel.callId = interactionVO.fromDeviceId
|
|
|
+ roomId = interactionVO.fromSipId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Log.i(TAG, "来电:" + JSON.toJSONString(data))
|
|
|
+
|
|
|
+ //启动 activity
|
|
|
+ var intent = Intent(activity, CallSingleActivity::class.java)
|
|
|
+ intent.putExtra(CallSingleActivity.EXTRA_ROOM_ID, roomId)
|
|
|
+ intent.putExtra(CallSingleActivity.EXTRA_MO, false)
|
|
|
+ intent.putExtra(CallSingleActivity.EXTRA_AUDIO_ONLY, true)
|
|
|
+ intent.putExtra(CallSingleActivity.EXTRA_TCPMODEL, data)
|
|
|
+ intent.putExtra(CallSingleActivity.EXTRA_RING, false)
|
|
|
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
|
+ startActivity(intent)
|
|
|
+
|
|
|
+ //移除该条呼叫
|
|
|
+ removeCall(interactionVO)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ adapter.setOnItemClickListener { data, position ->
|
|
|
+ SpeechUtil.getInstance().stopSpeak()
|
|
|
+ RingPlayHelper.stopRingTone()
|
|
|
+ val interactionVO = Gson().fromJson(data.data.toString(), InteractionVO::class.java)
|
|
|
+ val callTcp = VoiceUtil.voiceReject(data.tid, Constants.deviceId, interactionVO.fromDeviceId, interactionVO.id)
|
|
|
+ TcpClient.getInstance().sendMsg(callTcp.toJson())
|
|
|
+
|
|
|
+ //移除该条呼叫
|
|
|
+ removeCall(interactionVO)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ refreshView.setOnRefreshListener {
|
|
|
+ AppTool.Time.delay(800) {
|
|
|
+ updateCallList()
|
|
|
+ refreshView.finishRefresh()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ WdKeepAliveService.mNewCallListActive = true
|
|
|
+
|
|
|
+ handleVibrator()
|
|
|
+
|
|
|
+ //启动线程处理呼叫转移
|
|
|
+ if (SettingConfig.getCallTransfer(BaseApplication.appContext)) {
|
|
|
+ startLoopTransfer()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun handleVibrator() {
|
|
|
+ if (mVibrator != null) {
|
|
|
+ mVibrator.cancel()
|
|
|
+ //开启振动后 等待0.1s振动 振动2s 等待1s 振动2s 等待1s
|
|
|
+ val pattern = longArrayOf(100, 2000, 1000, 2000)
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
+ mVibrator.vibrate(VibrationEffect.createWaveform(pattern, -1))
|
|
|
+ } else {
|
|
|
+ mVibrator.vibrate(pattern, -1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun cancelVibrator() {
|
|
|
+ if (mVibrator != null) {
|
|
|
+ mVibrator.cancel()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onWindowFocusChanged(hasFocus: Boolean) {
|
|
|
+ super.onWindowFocusChanged(hasFocus)
|
|
|
+ window.decorView.systemUiVisibility = screen_flags
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressLint("CheckResult")
|
|
|
+ private fun startLoopTransfer() {
|
|
|
+ Thread {
|
|
|
+ while (Constants.newCallList.size > 0) {
|
|
|
+ val curTime = System.currentTimeMillis()
|
|
|
+ var interactionVO: InteractionVO? = null
|
|
|
+ var removeCall = false
|
|
|
+ for (item in Constants.newCallList) {
|
|
|
+ interactionVO = Gson().fromJson(item.data.toString(), InteractionVO::class.java)
|
|
|
+ if (curTime - interactionVO.createDate*1000L >= transSeconds*1000L) {
|
|
|
+ val voiceTransferTcpModel = VoiceUtil.voiceTransfer(item.tid, Constants.deviceId, interactionVO.fromDeviceId, interactionVO.id)
|
|
|
+ TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson())
|
|
|
+
|
|
|
+ removeCall = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (removeCall) {
|
|
|
+ runOnUiThread {
|
|
|
+ removeCall(interactionVO!!)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ Thread.sleep(5000)
|
|
|
+ } catch (ex: Exception) {
|
|
|
+ //ex.printStackTrace()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }.start()
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onResume() {
|
|
|
+ super.onResume()
|
|
|
+ window.decorView.systemUiVisibility = screen_flags
|
|
|
+
|
|
|
+ updateCallList()
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onDestroy() {
|
|
|
+ super.onDestroy()
|
|
|
+ RingPlayHelper.stopRingTone()
|
|
|
+ SpeechUtil.getInstance().stopSpeak()
|
|
|
+ if (EventBus.getDefault().isRegistered(this)) {
|
|
|
+ EventBus.getDefault().unregister(this)
|
|
|
+ }
|
|
|
+ WdKeepAliveService.mNewCallListActive = false
|
|
|
+ Constants.newCallList.clear()
|
|
|
+ cancelVibrator()
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onBackPressed() {
|
|
|
+ showMessage("Please check incoming call")
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateCallList() {
|
|
|
+ synchronized(this) {
|
|
|
+ if (Constants.newCallList.size > 0) {
|
|
|
+ adapter.data.clear()
|
|
|
+ adapter.data.addAll(Constants.newCallList)
|
|
|
+ adapter.notifyDataSetChanged()
|
|
|
+ } else {
|
|
|
+ emptyView.visibility = View.VISIBLE
|
|
|
+ AppTool.Time.delay(500) {
|
|
|
+ finish()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun removeCall(item: InteractionVO) {
|
|
|
+ synchronized(this) {
|
|
|
+ val iterator = Constants.newCallList.iterator()
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ val it = iterator.next()
|
|
|
+ val interaction = Gson().fromJson(it.data.toString(), InteractionVO::class.java)
|
|
|
+ if (interaction.id.equals(item.id)) {
|
|
|
+ iterator.remove()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Constants.newCallList.size > 0) {
|
|
|
+ adapter.data.clear()
|
|
|
+ adapter.data.addAll(Constants.newCallList)
|
|
|
+ adapter.notifyDataSetChanged()
|
|
|
+ } else {
|
|
|
+ emptyView.visibility = View.VISIBLE
|
|
|
+ AppTool.Time.delay(500) {
|
|
|
+ finish()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun callAccept(model: TcpModel) {
|
|
|
+ //接听电话,进入通话界面,并刷新呼叫列表
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun callReject(model: TcpModel) {
|
|
|
+ //拒绝电话,刷新列表
|
|
|
+ }
|
|
|
+
|
|
|
+ @Subscribe(threadMode = ThreadMode.MAIN)
|
|
|
+ fun onMoonEvent(messageEvent: MessageEvent) {
|
|
|
+ if (messageEvent.tag == Constants.EVENT_UPDATE_CALL) { //新呼叫
|
|
|
+ updateCallList()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|