瀏覽代碼

#ADD
- 门口机增加呼叫分机功能

weizhengliang 3 年之前
父節點
當前提交
6d9f904a6f

+ 1 - 5
app/src/main/code/com/wdkl/app/ncs/application/Application.kt

@@ -80,11 +80,7 @@ class Application : BaseApplication() {
      * @return rx观察者
      */
     private fun initFrame() {
-        if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP) {
-            BaseConfig.getInstance().addActivity("WelcomeActivity", "HomeActivity")
-        } else {
-            BaseConfig.getInstance().closeScrollBack()
-        }
+
         NetEngineConfig.init(baseContext)
                 .openLogger()
                 .addNetInterceptor(RestfulExceptionInterceptor())

+ 55 - 15
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/activity/CallingdoorActivity.kt

@@ -36,6 +36,7 @@ import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.DeviceRoomInfoVO
+import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO
 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.VoiceUtil
@@ -193,23 +194,20 @@ class CallingdoorActivity :BaseActivity<CallingdoorActivityPresenter, Callingdoo
             val time = System.currentTimeMillis()
             if (time - clickTime > 2000) {
                 //防止重复点击
-                if (Constant.CALL_STATE == Constant.CALL_STANDBY) {
-                    //待机状态
-                    if (!TextUtils.isEmpty(Constant.SIP_ID)) {
-                        //没有摄像头则只能拨打语音
-                        if (Constant.supportCamera) {
-                            MenuDialog.build(this)
-                                    .config(voiceCall = {
-                                        startCall(Constant.VOICE_CALL)
-                                    }, videoCall = {
-                                        startCall(Constant.VIDEO_CALL)
-                                    }).show()
-                        } else {
-                            startCall(Constant.VOICE_CALL)
-                        }
+                if (!TextUtils.isEmpty(Constant.SIP_ID)) {
+                    //没有摄像头则只能拨打语音
+                    if (Constant.supportCamera) {
+                        MenuDialog.build(this)
+                            .config(voiceCall = {
+                                startCall(Constant.VOICE_CALL)
+                            }, videoCall = {
+                                startCall(Constant.VIDEO_CALL)
+                            }).show()
                     } else {
-                        showMessage("当前设备可能未注册或网络异常,不能呼叫")
+                        startCall(Constant.VOICE_CALL)
                     }
+                } else {
+                    showMessage("当前设备可能未注册或网络异常,不能呼叫")
                 }
 
                 clickTime = time
@@ -218,6 +216,30 @@ class CallingdoorActivity :BaseActivity<CallingdoorActivityPresenter, Callingdoo
             }
         }
 
+        room_action_call_bed.setOnClickListener {
+            if (Utils.getInBedVOS().size > 0) {
+                CallbedDialogHelper.showDialog(activity, object : CallbedDialogHelper.ClickListener {
+                    override fun onVideoClick(bedVO: FrameBedVO?) {
+                        if (bedVO != null && bedVO.bedDeviceId != null && !TextUtils.isEmpty(bedVO.customerName)) {
+                            startCallBed(Constant.VIDEO_CALL, bedVO.bedDeviceId)
+                        } else {
+                            showMessage("床位未入住或未绑定设备,不能呼叫!")
+                        }
+                    }
+
+                    override fun onVoiceClick(bedVO: FrameBedVO?) {
+                        if (bedVO != null && bedVO.bedDeviceId != null && !TextUtils.isEmpty(bedVO.customerName)) {
+                            startCallBed(Constant.VOICE_CALL, bedVO.bedDeviceId)
+                        } else {
+                            showMessage("床位未入住或未绑定设备,不能呼叫!")
+                        }
+                    }
+                })
+            } else {
+                showMessage("房间没有床位,不能呼叫!")
+            }
+        }
+
         app_version.setOnLongClickListener {
             AppInfoDialogHelper.showAppDialog(this@CallingdoorActivity,
                 { dialog, which -> AppUpdateHelper.reboot(activity) },
@@ -470,6 +492,24 @@ class CallingdoorActivity :BaseActivity<CallingdoorActivityPresenter, Callingdoo
         }
     }
 
+    //开始呼叫分机
+    fun startCallBed(type: Int, bedId: Int) {
+        //通话之前先判断webrtc socket和tcp是否连接正常,否则不能建立通话
+        if (SocketManager.getInstance().socketOpen() && Constant.TCP_CONNECTED) {
+            //去电界面
+            Constant.CALL_TYPE = type
+            Constant.CALL_STATE = Constant.CALL_OUTGOING
+            var fragment = SkyCallFragment()
+            var bundle = Bundle()
+            bundle.putInt("call_state", 2)
+            bundle.putInt("bed_id", bedId)
+            fragment.arguments = bundle
+            addCallFragment(fragment)
+        } else {
+            showMessage("通话服务或网络未连接,请检查网络稍后再试")
+        }
+    }
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
         when (messageEvent.getType()) {

+ 81 - 0
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/adapter/BedItemAdapter.java

@@ -0,0 +1,81 @@
+package com.wdkl.app.ncs.callingdoor.adapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.wdkl.app.ncs.callingdoor.R;
+import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO;
+
+import java.util.ArrayList;
+
+public class BedItemAdapter extends RecyclerView.Adapter<BedItemAdapter.BedViewHolder> {
+
+    private Context context;
+    private ArrayList<FrameBedVO> data;
+    private BedClickListener clickListener;
+
+    public BedItemAdapter(Context context, ArrayList<FrameBedVO> data) {
+        this.context = context;
+        this.data = data;
+    }
+
+    @Override
+    public BedViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_call_bed, viewGroup, false);
+        BedViewHolder viewHolder = new BedViewHolder(view);
+
+        return viewHolder;
+    }
+
+    @Override
+    public void onBindViewHolder(BedViewHolder bedViewHolder, int i) {
+        bedViewHolder.bedName.setText(data.get(i).getFrameBed().getFullName());
+        bedViewHolder.name.setText(data.get(i).getCustomerName());
+        bedViewHolder.voiceCall.setOnClickListener(v -> {
+            if (clickListener != null) {
+                clickListener.onVoiceClick(data.get(bedViewHolder.getAdapterPosition()));
+            }
+        });
+
+        bedViewHolder.videoCall.setOnClickListener(v -> {
+            if (clickListener != null) {
+                clickListener.onVideoClick(data.get(bedViewHolder.getAdapterPosition()));
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        return data.size();
+    }
+
+    public void setCallClickListener(BedClickListener listener) {
+        clickListener = listener;
+    }
+
+
+    class BedViewHolder extends RecyclerView.ViewHolder {
+        TextView bedName;
+        TextView name;
+        Button voiceCall;
+        Button videoCall;
+
+        BedViewHolder(View itemView) {
+            super(itemView);
+            bedName = itemView.findViewById(R.id.tv_call_bed_name);
+            name = itemView.findViewById(R.id.tv_call_name);
+            voiceCall = itemView.findViewById(R.id.btn_voice_call);
+            videoCall = itemView.findViewById(R.id.btn_video_call);
+        }
+    }
+
+    public interface BedClickListener{
+        void onVoiceClick(FrameBedVO bedVO);
+        void onVideoClick(FrameBedVO bedVO);
+    }
+}

+ 10 - 2
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/fragment/BaseCallFragment.kt

@@ -28,9 +28,10 @@ abstract class BaseCallFragment: Fragment() {
 
     protected lateinit var baseActivity: BaseToolActivity
 
-    //通话状态:0-去电, 1-来电, 2-探视
+    //通话状态:0-呼叫主机, 1-来电, 2-呼叫分机
     protected var callState : Int = 0
     protected var tcpModel: TcpModel? = null
+    protected var bedId: Int = -1
 
     //计时器
     lateinit var countDownTimer: CountDownTimer
@@ -42,6 +43,7 @@ abstract class BaseCallFragment: Fragment() {
         super.onCreate(savedInstanceState)
         retainInstance = true
         callState = arguments.getInt("call_state")
+        bedId = arguments.getInt("bed_id")
         if (arguments.getSerializable("tcp_model") != null) {
             tcpModel = arguments.getSerializable("tcp_model") as TcpModel
         }
@@ -117,7 +119,13 @@ abstract class BaseCallFragment: Fragment() {
                 RingPlayHelper.stopRingTone()
                 showMessage("无人应答...")
                 Constant.CALL_STATE = Constant.CALL_STANDBY
-                VoiceUtil.cancelAudioCall(Constant.DEVICE_ID)
+                if (callState == 0) {
+                    VoiceUtil.cancelAudioCall(Constant.DEVICE_ID)
+                } else if (callState == 2) {
+                    if (bedId != -1) {
+                        VoiceUtil.cancelAudioCallBed(Constant.DEVICE_ID, bedId)
+                    }
+                }
                 backToMain()
             }
         }

+ 2 - 0
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/fragment/MainFragment.kt

@@ -11,6 +11,7 @@ import com.wdkl.app.ncs.callingdoor.R
 import com.wdkl.app.ncs.callingdoor.activity.CallingdoorActivity
 import com.wdkl.app.ncs.callingdoor.adapter.FrameRoomAdapter
 import com.wdkl.app.ncs.callingdoor.databinding.MainViewLayoutBinding
+import com.wdkl.app.ncs.callingdoor.helper.Utils
 import com.wdkl.app.ncs.callingdoor.launch.CallingdoorLaunch
 import com.wdkl.ncs.android.lib.base.BaseFragment
 import com.wdkl.ncs.android.lib.utils.TimeHandle
@@ -67,6 +68,7 @@ class MainFragment: BaseFragment<MainFragmentPresenter, MainViewLayoutBinding>()
             bedList.clear()
             bedList.addAll(roomInfo.frameBedList)
             roomAdpter.setData(bedList)
+            Utils.setInBedVos(bedList)
             rv_bed_view.itemAnimator = DefaultItemAnimator()
             if (bedList.size > 3) {
                 //自动滚动显示

+ 25 - 5
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/fragment/SkyCallFragment.kt

@@ -55,7 +55,7 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
 
         when (callState) {
             0 -> {
-                //去电
+                //呼叫主机
                 startOutgoing()
                 RingPlayHelper.playRingTone(baseActivity, R.raw.ring_back2, true)
             }
@@ -65,6 +65,12 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
                 showIncomingCall()
                 RingPlayHelper.playRingTone(baseActivity, R.raw.incoming_call, true)
             }
+
+            2 -> {
+                //呼叫分机
+                startOutgoing()
+                RingPlayHelper.playRingTone(baseActivity, R.raw.ring_back2, true)
+            }
         }
     }
 
@@ -84,7 +90,13 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
                 backToMain()
             } else {
                 Constant.CALL_STATE = Constant.CALL_STANDBY
-                VoiceUtil.cancelAudioCall(Constant.DEVICE_ID)
+                if (callState == 0) {
+                    VoiceUtil.cancelAudioCall(Constant.DEVICE_ID)
+                } else if (callState == 2) {
+                    if (bedId != -1) {
+                        VoiceUtil.cancelAudioCallBed(Constant.DEVICE_ID, bedId)
+                    }
+                }
                 cancelCall()
             }
         }
@@ -116,7 +128,13 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
     }
 
     private fun startOutgoing() {
-        VoiceUtil.startAudioCall(Constant.DEVICE_ID)
+        if (callState == 0) {
+            VoiceUtil.startAudioCall(Constant.DEVICE_ID)
+        } else if (callState == 2) {
+            if (bedId != -1) {
+                VoiceUtil.startAudioCallBed(Constant.DEVICE_ID, bedId)
+            }
+        }
         Constant.CALL_STATE = Constant.CALL_OUTGOING
         sky_voice_call_timeout.visibility = View.VISIBLE
         sky_voice_call_timer.visibility = View.GONE
@@ -430,8 +448,10 @@ class SkyCallFragment: BaseCallFragment(), CallSession.CallSessionCallback {
                         } else if (curTcpModel.getAction() == TcpAction.VoiceAction.FAILED) {
                             //我方呼出,对方不在线,设备离线或其它错误
                             showMessage("呼叫失败,找不到设备或对方不在线!")
-                            RingPlayHelper.stopRingTone()
-                            cancelCall()
+                            AppTool.Time.delay(2000) {
+                                RingPlayHelper.stopRingTone()
+                                cancelCall()
+                            }
                         } else if (curTcpModel.getAction() == TcpAction.VoiceAction.HANDOFF) {
                             //对方挂断,不论我方呼出或呼入
                             if (Constant.interactionId == curInteractionVO.id) {

+ 85 - 0
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/helper/CallbedDialogHelper.java

@@ -0,0 +1,85 @@
+package com.wdkl.app.ncs.callingdoor.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.support.v7.widget.RecyclerView;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+
+import com.alibaba.android.vlayout.VirtualLayoutManager;
+import com.wdkl.app.ncs.callingdoor.R;
+import com.wdkl.app.ncs.callingdoor.adapter.BedItemAdapter;
+import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO;
+
+public class CallbedDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(Activity activity, ClickListener clickListener) {
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.call_bed_dialog_lay, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button btn_cancel = contentView.findViewById(R.id.button_cancel);
+        btn_cancel.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+            }
+        });
+
+        RecyclerView recyclerView = contentView.findViewById(R.id.recycler_bed_list);
+        BedItemAdapter adapter = new BedItemAdapter(activity, Utils.getInBedVOS());
+        recyclerView.setAdapter(adapter);
+        recyclerView.setLayoutManager(new VirtualLayoutManager(activity));
+        adapter.setCallClickListener(new BedItemAdapter.BedClickListener() {
+            @Override
+            public void onVideoClick(FrameBedVO bedVO) {
+                if (clickListener != null) {
+                    clickListener.onVideoClick(bedVO);
+                }
+                if (alertDialog != null) {
+                    alertDialog.dismiss();
+                }
+            }
+
+            @Override
+            public void onVoiceClick(FrameBedVO bedVO) {
+                if (clickListener != null) {
+                    clickListener.onVoiceClick(bedVO);
+                }
+                if (alertDialog != null) {
+                    alertDialog.dismiss();
+                }
+            }
+        });
+
+
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(false);
+        alertDialog.setCancelable(false);
+        alertDialog.show();
+
+        //设置dialog宽高及位置
+        try {
+            Window window = alertDialog.getWindow();
+            WindowManager.LayoutParams lp = window.getAttributes();
+            lp.width = 680;
+            lp.height = 440;
+            lp.gravity = Gravity.CENTER;
+            window.setAttributes(lp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public interface ClickListener{
+        void onVoiceClick(FrameBedVO bedVO);
+        void onVideoClick(FrameBedVO bedVO);
+    }
+}

+ 15 - 0
callingdoor/src/main/java/com/wdkl/app/ncs/callingdoor/helper/Utils.java

@@ -1,10 +1,15 @@
 package com.wdkl.app.ncs.callingdoor.helper;
 
 import android.hardware.Camera;
+import android.text.TextUtils;
 
 import com.wdkl.ncs.android.middleware.common.Constant;
+import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO;
+
+import java.util.ArrayList;
 
 public class Utils {
+    private static ArrayList<FrameBedVO> bedVOS = new ArrayList<>();
 
     public static void checkCameraSupport() {
         int num = Camera.getNumberOfCameras();
@@ -14,4 +19,14 @@ public class Utils {
             Constant.supportCamera = false;
         }
     }
+
+
+    public static void setInBedVos(ArrayList<FrameBedVO> data) {
+        bedVOS.clear();
+        bedVOS.addAll(data);
+    }
+
+    public static ArrayList<FrameBedVO> getInBedVOS() {
+        return bedVOS;
+    }
 }

+ 50 - 0
callingdoor/src/main/res/layout/adapter_call_bed.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="80dp"
+    android:gravity="center_vertical"
+    android:background="#EAF2F9"
+    android:layout_margin="8dp">
+    <TextView
+        android:id="@+id/tv_call_bed_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="8dp"
+        android:layout_weight="2"
+        android:text="床位"
+        android:textColor="#2F9DF1"
+        android:textSize="24sp"/>
+    <TextView
+        android:id="@+id/tv_call_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="8dp"
+        android:layout_weight="2"
+        android:text="名字"
+        android:textColor="#2F9DF1"
+        android:textSize="24sp"/>
+
+    <Button
+        android:id="@+id/btn_voice_call"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:background="@mipmap/bg_bottom_btn"
+        android:gravity="center"
+        android:text="语音"
+        android:textColor="@drawable/selector_bottom_btn_text_color"
+        android:textSize="20sp"/>
+
+    <Button
+        android:id="@+id/btn_video_call"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:background="@mipmap/bg_bottom_btn"
+        android:layout_marginLeft="16dp"
+        android:layout_marginStart="16dp"
+        android:gravity="center"
+        android:text="视频"
+        android:textColor="@drawable/selector_bottom_btn_text_color"
+        android:textSize="20sp"/>
+</LinearLayout>

+ 22 - 0
callingdoor/src/main/res/layout/call_bed_dialog_lay.xml

@@ -0,0 +1,22 @@
+<?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="match_parent"
+    android:background="@drawable/radis">
+
+    <Button
+        android:id="@+id/button_cancel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:text="取消"
+        android:textColor="#2F9DF1"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recycler_bed_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@id/button_cancel"
+        android:padding="10dp"/>
+</RelativeLayout>

+ 25 - 18
callingdoor/src/main/res/layout/callingdoor_main_lay.xml

@@ -23,7 +23,7 @@
         <!--右侧按钮区域-->
         <RelativeLayout
             android:id="@+id/rl_room_actions"
-            android:layout_width="100dp"
+            android:layout_width="128dp"
             android:layout_height="match_parent"
             android:layout_alignParentRight="true"
             android:layout_marginTop="10dp"
@@ -40,30 +40,21 @@
                 android:paddingBottom="10dp"
                 android:gravity="center"
                 android:text="版本"
+                android:textSize="20sp"
                 android:textColor="@color/main_color"/>
             <TextView
-                android:id="@+id/room_action_reset"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_above="@id/app_version"
-                android:layout_marginBottom="10dp"
-                android:background="@mipmap/bg_bottom_btn"
-                android:gravity="center"
-                android:text="重置"
-                android:textColor="@drawable/selector_bottom_btn_text_color"
-                android:visibility="gone"/>
-            <TextView
                 android:id="@+id/room_action_call"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_above="@id/room_action_reset"
+                android:layout_above="@id/app_version"
                 android:layout_marginBottom="10dp"
                 android:background="@mipmap/bg_bottom_btn"
                 android:drawableLeft="@mipmap/ic_call"
                 android:drawablePadding="6dp"
-                android:paddingLeft="24dp"
+                android:padding="10dp"
                 android:gravity="center_vertical"
-                android:text="呼叫"
+                android:text="呼叫护士"
+                android:textSize="20sp"
                 android:textColor="@drawable/selector_bottom_btn_text_color"/>
             <TextView
                 android:id="@+id/room_action_support"
@@ -74,9 +65,10 @@
                 android:background="@mipmap/bg_bottom_btn"
                 android:drawableLeft="@mipmap/ic_support"
                 android:drawablePadding="6dp"
-                android:paddingLeft="24dp"
+                android:padding="10dp"
                 android:gravity="center_vertical"
-                android:text="增援"
+                android:text="请求增援"
+                android:textSize="20sp"
                 android:textColor="@drawable/selector_bottom_btn_text_color"/>
             <TextView
                 android:id="@+id/room_action_nurse"
@@ -87,10 +79,25 @@
                 android:background="@mipmap/bg_bottom_btn"
                 android:drawableLeft="@drawable/ic_nursing"
                 android:drawablePadding="6dp"
-                android:paddingLeft="10dp"
+                android:padding="10dp"
                 android:gravity="center_vertical"
                 android:text="进入护理"
+                android:textSize="20sp"
                 android:textColor="@drawable/selector_bottom_btn_text_color"/>
+            <TextView
+                android:id="@+id/room_action_call_bed"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_above="@id/room_action_nurse"
+                android:layout_marginBottom="30dp"
+                android:background="@mipmap/bg_bottom_btn"
+                android:drawableLeft="@mipmap/ic_call"
+                android:drawablePadding="6dp"
+                android:padding="10dp"
+                android:gravity="center_vertical"
+                android:text="呼叫床位"
+                android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color" />
         </RelativeLayout>
 
         <!--床位fragment区域-->

+ 1 - 1
callingdoor/src/main/res/layout/item_bed.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="300dp"
+    android:layout_width="290dp"
     android:layout_height="match_parent"
     android:paddingLeft="4dp"
     android:orientation="vertical">

+ 2 - 2
callingdoor/src/main/res/layout/sky_voice_call_layout.xml

@@ -84,8 +84,8 @@
 
                 <ImageView
                     android:id="@+id/sky_voice_call_hangup"
-                    android:layout_width="100dp"
-                    android:layout_height="100dp"
+                    android:layout_width="80dp"
+                    android:layout_height="80dp"
                     android:layout_marginTop="20dp"
                     android:src="@drawable/selector_call_hangup" />
             </LinearLayout>

+ 21 - 6
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/FrameDO.java

@@ -7,11 +7,11 @@ import com.wdkl.ncs.android.middleware.model.annotation.Id;
 import com.wdkl.ncs.android.middleware.model.annotation.PrimaryKeyField;
 import com.wdkl.ncs.android.middleware.model.annotation.Table;
 
+import java.io.Serializable;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
-import java.io.Serializable;
-
 @Table(name = "ncs_frame")
 @ApiModel
 @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@@ -49,9 +49,10 @@ public class FrameDO implements Serializable {
     @ApiModelProperty(value = "null", required = false)
     private Integer partId;
     /**
-     *	医院shop_id
-     */	@Column(name = "hospital_id" )
-    @ApiModelProperty(value="医院shop_id",required=false)
+     * 医院shop_id
+     */
+    @Column(name = "hospital_id")
+    @ApiModelProperty(value = "医院shop_id", required = false)
     private Integer hospitalId;
     /**
      * 数据同步时间
@@ -90,6 +91,13 @@ public class FrameDO implements Serializable {
     @ApiModelProperty(value = "null", required = false)
     private Integer groupId;
 
+    /**
+     * 别名
+     */
+    @Column(name = "full_name")
+    @ApiModelProperty(value = "全名", required = false)
+    private String fullName;
+
 
     @PrimaryKeyField
     public Integer getId() {
@@ -199,4 +207,11 @@ public class FrameDO implements Serializable {
         this.groupId = groupId;
     }
 
-}
+    public String getFullName() {
+        return fullName;
+    }
+
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
+}

+ 20 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VoiceUtil.java

@@ -54,7 +54,6 @@ public class VoiceUtil {
         return tcpModel;
     }
 
-    //分机自己取消呼叫,没有toId
     public static TcpModel voiceCancel(Integer fromId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
@@ -89,6 +88,26 @@ public class VoiceUtil {
     /**************************************************************************
      ************************* 发送呼叫相关TCP *********************************
     ***************************************************************************/
+    //呼叫分机
+    public static void startAudioCallBed(Integer fromId, Integer toId) {
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.CALL);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+
+    //取消呼叫分机
+    public static void cancelAudioCallBed(Integer fromId, Integer toId) {
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.CANCEL);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+
     //语音呼叫
     public static void startAudioCall(Integer fromId) {
         TcpModel tcpModel = VoiceUtil.voiceCall(fromId);

+ 51 - 18
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/WebRTCEngine.java

@@ -64,6 +64,11 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     private SurfaceViewRenderer localRenderer;
 
 
+    // 服务器实例列表
+    private String serverIP = "8.129.220.143";
+    private String turnUser = "wdklrtc";
+    private String turnUserPwd = "Wdkl2021Rtc";
+
     private static final String VIDEO_TRACK_ID = "ARDAMSv0";
     private static final String AUDIO_TRACK_ID = "ARDAMSa0";
     public static final String VIDEO_CODEC_H264 = "H264";
@@ -459,22 +464,48 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     }
 
     // -----------------------------其他方法--------------------------------
-
     private void initIceServer() {
         // 初始化一些stun和turn的地址
-        PeerConnection.IceServer var1 = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302")
-                .createIceServer();
-        iceServers.add(var1);
-
-        PeerConnection.IceServer var11 = PeerConnection.IceServer.builder("stun:172.28.100.100:3478?transport=udp")
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.xten.com:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.voipbuster.com:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.sipgate.net:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.ideasip.com:3478").createIceServer());
+        iceServers.add(PeerConnection.IceServer.builder("stun:stun.internetcalls.com:3478").createIceServer());
+
+/*        stun.xten.com
+        stun.voipbuster.com
+        stun.sipgate.net
+        stun.ekiga.net
+        stun.ideasip.com
+        stun.schlund.de
+        stun.voiparound.com
+        stun.voipstunt.com
+        stun.counterpath.com
+        stun .1 und1.de
+        stun.gmx.net
+        stun.callwithus.com
+        stun.counterpath.net
+        stun.internetcalls.com
+        numb.viagenie.ca*/
+
+
+        PeerConnection.IceServer var11 = PeerConnection.IceServer
+                .builder("stun:"+serverIP+":3478?transport=udp")
+                .setUsername(turnUser)
+                .setPassword(turnUserPwd)
+                .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
                 .createIceServer();
-        PeerConnection.IceServer var12 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=udp")
-                .setUsername("ddssingsong")
-                .setPassword("123456")
+        PeerConnection.IceServer var12 = PeerConnection.IceServer
+                .builder("turn:"+serverIP+":3478?transport=udp")
+                .setUsername(turnUser)
+                .setPassword(turnUserPwd)
+                .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
                 .createIceServer();
-        PeerConnection.IceServer var13 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=tcp")
-                .setUsername("ddssingsong")
-                .setPassword("123456")
+        PeerConnection.IceServer var13 = PeerConnection.IceServer
+                .builder("turn:"+serverIP+":3478?transport=tcp")
+                .setUsername(turnUser)
+                .setPassword(turnUserPwd)
+                .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
                 .createIceServer();
         iceServers.add(var11);
         iceServers.add(var12);
@@ -558,14 +589,16 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
             return createScreenCapturer();
         }
 
-        return createCameraCapture(new Camera1Enumerator(true));
-
-        /*if (Camera2Enumerator.isSupported(mContext)) {
-            videoCapturer = createCameraCapture(new Camera2Enumerator(mContext));
+        if (Build.MODEL.equals("rk3128")) {
+            return createCameraCapture(new Camera1Enumerator(true));
         } else {
-            videoCapturer = createCameraCapture(new Camera1Enumerator(true));
+            if (Camera2Enumerator.isSupported(mContext)) {
+                videoCapturer = createCameraCapture(new Camera2Enumerator(mContext));
+            } else {
+                videoCapturer = createCameraCapture(new Camera1Enumerator(true));
+            }
+            return videoCapturer;
         }
-        return videoCapturer;*/
     }
 
     /**