Prechádzať zdrojové kódy

#ADD 新增探视功能

weizhengliang 4 rokov pred
rodič
commit
6f50a35b7b
24 zmenil súbory, kde vykonal 553 pridanie a 102 odobranie
  1. 1 1
      app/build.gradle
  2. 1 1
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  3. 4 1
      gradle.properties
  4. 3 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  5. 51 15
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/FrameBedVO.java
  6. 5 6
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/FrameRoomVO.java
  7. 30 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java
  8. 106 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VideoUtil.java
  9. 19 3
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java
  10. 24 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/CommonUtils.java
  11. 45 14
      nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt
  12. 12 4
      nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/FrameBedVosConfinementAdapter.kt
  13. 1 1
      nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/FramePartItemAdapter.kt
  14. 5 18
      nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt
  15. 5 5
      nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/util/CallDialogHelper.java
  16. 1 0
      nursehome/src/main/res/layout/call_dialog_lay.xml
  17. 28 13
      rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/WebRTCEngine.java
  18. 1 1
      settings.gradle
  19. 77 0
      webrtc/src/main/java/com/wdkl/core/adapter/BedItemAdapter.java
  20. 78 6
      webrtc/src/main/java/com/wdkl/core/voip/CallMultiActivity.java
  21. 1 1
      webrtc/src/main/java/com/wdkl/core/voip/FragmentMeeting.java
  22. 18 10
      webrtc/src/main/res/layout/activity_multi_call.xml
  23. 34 0
      webrtc/src/main/res/layout/adapter_visit_bed.xml
  24. 3 2
      webrtc/src/main/res/layout/av_p2p_meeting_action.xml

+ 1 - 1
app/build.gradle

@@ -115,7 +115,7 @@ dependencies {
      */
     if (!componentTag) {
         compile project(':welcome') // ===> 开始模块  建议在模块内添加广告 欢迎页 等页面
-        compile project(':home')   // ===> 主页模块  里面一般是App的首页 分类楼层页面
+        //compile project(':home')   // ===> 主页模块  里面一般是App的首页 分类楼层页面
         //compile project(':shop')      // ===> 店铺模块 店铺列表 详细 等
         //compile project(':setting')   // ===> 设置模块 设置 缓存 App分享等
         compile project(':extra')    // ===> 额外的一些页面 比如二维码扫描等一些附加功能

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

@@ -46,7 +46,7 @@ class Application : BaseApplication() {
         JRouter.openDebug()
         JRouter.openLog()
         JRouter.prepare().create("/welcome/launch").seek()
-        JRouter.prepare().create("/home/launch").seek()
+        //JRouter.prepare().create("/home/launch").seek()
         //JRouter.prepare().create("/setting/launch").seek()
         //JRouter.prepare().create("/shop/launch").seek()
         JRouter.prepare().create("/extra/launch").seek()

+ 4 - 1
gradle.properties

@@ -11,11 +11,14 @@
 # When configured, Gradle will run in incubating parallel mode.
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+
 # org.gradle.parallel=true
 #Wed Sep 27 17:07:24 CST 2017
+
 systemProp.http.proxyHost=mirrors.neusoft.edu.cn
-org.gradle.jvmargs=-XX\:MaxHeapSize\=4096m -Xmx4096m
 systemProp.http.proxyPort=80
+
+org.gradle.jvmargs=-XX\:MaxHeapSize\=4096m -Xmx4096m
 org.gradle.daemon=true
 org.gradle.parallel=true
 org.gradle.configureondemand=true

+ 3 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -53,6 +53,9 @@ class Constants {
         //来电设备id
         var fromId: Int? = -1
 
+        //被探视床位分机id
+        var visitedId: Int? = -1
+
         //Interaction ID
         var interactionId: Int? = -1
 

+ 51 - 15
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/FrameBedVO.java

@@ -1,7 +1,9 @@
 package com.wdkl.ncs.android.middleware.model.vo;
 
-
 import com.wdkl.ncs.android.middleware.model.dos.FrameDO;
+import com.wdkl.ncs.android.middleware.model.dto.NurseConfigDto;
+
+import java.util.List;
 
 /**
  * @program nc
@@ -20,11 +22,20 @@ public class FrameBedVO{
     private Integer customerSex;
     private Integer customerAge;
     private String customerAgeUnit;
-    private String nurseConfigName;
-    private String nurseColorRgb;
     private String deviceSipId;
     private Integer bedDeviceId;
 
+    private List<NurseConfigDto> nurseConfigDtos;
+
+
+    private Integer relativeMemberId;
+
+    private String relativeMemberName;
+
+    private String relativeName;
+
+    private Integer relativeSex;
+
 
     public FrameDO getFrameBed() {
         return frameBed;
@@ -90,20 +101,12 @@ public class FrameBedVO{
         this.customerAgeUnit = customerAgeUnit;
     }
 
-    public String getNurseConfigName() {
-        return nurseConfigName;
+    public List<NurseConfigDto> getNurseConfigDtos() {
+        return nurseConfigDtos;
     }
 
-    public void setNurseConfigName(String nurseConfigName) {
-        this.nurseConfigName = nurseConfigName;
-    }
-
-    public String getNurseColorRgb() {
-        return nurseColorRgb;
-    }
-
-    public void setNurseColorRgb(String nurseColorRgb) {
-        this.nurseColorRgb = nurseColorRgb;
+    public void setNurseConfigDtos(List<NurseConfigDto> nurseConfigDtos) {
+        this.nurseConfigDtos = nurseConfigDtos;
     }
 
     public String getDeviceSipId() {
@@ -121,4 +124,37 @@ public class FrameBedVO{
     public void setBedDeviceId(Integer bedDeviceId) {
         this.bedDeviceId = bedDeviceId;
     }
+
+
+    public Integer getRelativeMemberId() {
+        return relativeMemberId;
+    }
+
+    public void setRelativeMemberId(Integer relativeMemberId) {
+        this.relativeMemberId = relativeMemberId;
+    }
+
+    public String getRelativeMemberName() {
+        return relativeMemberName;
+    }
+
+    public void setRelativeMemberName(String relativeMemberName) {
+        this.relativeMemberName = relativeMemberName;
+    }
+
+    public String getRelativeName() {
+        return relativeName;
+    }
+
+    public void setRelativeName(String relativeName) {
+        this.relativeName = relativeName;
+    }
+
+    public Integer getRelativeSex() {
+        return relativeSex;
+    }
+
+    public void setRelativeSex(Integer relativeSex) {
+        this.relativeSex = relativeSex;
+    }
 }

+ 5 - 6
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/FrameRoomVO.java

@@ -1,6 +1,5 @@
 package com.wdkl.ncs.android.middleware.model.vo;
 
-
 import com.wdkl.ncs.android.middleware.model.dos.FrameDO;
 
 import java.io.Serializable;
@@ -17,7 +16,7 @@ public class FrameRoomVO implements Serializable {
 
     private FrameDO frameRoom;
     private Integer deviceCount;
-    private List<FrameBedVO> frameBedVos;
+    private List<FrameBedVO> frameBedList;
 
 
     public FrameDO getFrameRoom() {
@@ -36,11 +35,11 @@ public class FrameRoomVO implements Serializable {
         this.deviceCount = deviceCount;
     }
 
-    public List<FrameBedVO> getFrameBedVos() {
-        return frameBedVos;
+    public List<FrameBedVO> getFrameBedList() {
+        return frameBedList;
     }
 
-    public void setFrameBedVos(List<FrameBedVO> frameBedVos) {
-        this.frameBedVos = frameBedVos;
+    public void setFrameBedList(List<FrameBedVO> frameBedList) {
+        this.frameBedList = frameBedList;
     }
 }

+ 30 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

@@ -85,6 +85,36 @@ public class DeviceChannel {
                 }
                 break;
             case VIDEO:
+                if (tcpModel.getAction() == TcpAction.VideoAction.CALL || tcpModel.getAction() == TcpAction.VideoAction.VIDEO_OUT_CALL) {
+                    InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+                    if (calling){
+                        responseTcpModel = VideoUtil.videoCalling(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId(), interactionVO.getId());
+                        return responseTcpModel;
+                    } else {
+                        EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.Companion.getEVENT_TCP_MSG()));
+                    }
+                } else if (tcpModel.getAction()== TcpAction.VideoAction.ACCEPT){ //我方呼出,对方接受
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = true;
+                } else if (tcpModel.getAction()== TcpAction.VideoAction.REJECT){ //我方呼出,对方拒绝
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = false;
+                } else if (tcpModel.getAction()== TcpAction.VideoAction.CALLING){ //我方呼出,对方通话中
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = false;
+                } else if (tcpModel.getAction()== TcpAction.VideoAction.FAILED){ //我方呼出,对方不在线,设备离线或其它错误
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = false;
+                } else if (tcpModel.getAction()== TcpAction.VideoAction.HANDOFF){ //对方挂断,不论我方呼出或呼入
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = false;
+                }else if(tcpModel.getAction()== TcpAction.VideoAction.CANCEL){
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = false;
+                }else if(tcpModel.getAction()== TcpAction.VideoAction.SUCCESS){
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
+                    calling = true;
+                }
                 break;
             case IM:
                 if (tcpModel.getAction()== TcpAction.IMAction.MSG){

+ 106 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VideoUtil.java

@@ -0,0 +1,106 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+import com.wdkl.ncs.android.middleware.tcp.TcpClient;
+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.TcpType;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class VideoUtil {
+
+    public static TcpModel videoCalling(Integer fromId, Integer toId, Integer interactionId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VIDEO);
+        tcpModel.setAction(TcpAction.VideoAction.CALLING);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(interactionId);
+        return tcpModel;
+    }
+
+    public static TcpModel videoInCall(Integer fromId, Integer toId, Integer interactionId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VIDEO);
+        tcpModel.setAction(TcpAction.VideoAction.VIDEO_IN_CALL);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(interactionId);
+        return tcpModel;
+    }
+
+    public static TcpModel videoReject(Integer fromId, Integer toId,Integer interactionId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VIDEO);
+        tcpModel.setAction(TcpAction.VideoAction.REJECT);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(interactionId);
+        return tcpModel;
+    }
+
+    public static TcpModel videoAccept(Integer fromId, Integer toId,Integer interactionId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VIDEO);
+        tcpModel.setAction(TcpAction.VideoAction.ACCEPT);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(interactionId);
+        return tcpModel;
+    }
+
+    public static TcpModel videoInvite(Integer fromId, Integer toId, Integer interactionId) {
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VIDEO);
+        tcpModel.setAction(TcpAction.VideoAction.VIDEO_INVITE_JOIN);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        Map map = new HashMap();
+        map.put("interactionId", interactionId);
+        map.put("roomId", interactionId.toString());
+        tcpModel.setData(map);
+        return tcpModel;
+    }
+
+    public static TcpModel videoHandoff(Integer fromId, Integer toId, Integer interactionId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VIDEO);
+        tcpModel.setAction(TcpAction.VideoAction.HANDOFF);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(interactionId);
+        return tcpModel;
+    }
+
+
+
+    public static void sendVideoInCall(Integer fromId, Integer toId, Integer interactionId) {
+        TcpModel tcpModel = videoInCall(fromId, toId, interactionId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+
+    //拒绝视频
+    public static void rejectVideoCall(Integer fromId, Integer toId, Integer interactionId) {
+        TcpModel tcpModel = videoReject(fromId, toId, interactionId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+
+    //接受视频
+    public static void acceptVideoCall(Integer fromId, Integer toId, Integer interactionId) {
+        TcpModel tcpModel = videoAccept(fromId, toId, interactionId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+
+    //发送视频探视邀请
+    public static void sendInviteVideoCall(Integer fromId, Integer toId, Integer interactionId) {
+        TcpModel tcpModel = videoInvite(fromId, toId, interactionId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+
+    //挂断视频
+    public static void handoffVideoCall(Integer fromId, Integer toId, Integer interactionId) {
+        TcpModel tcpModel = videoHandoff(fromId, toId, interactionId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
+}

+ 19 - 3
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

@@ -78,8 +78,18 @@ public interface TcpAction {
     }
 
     enum VideoAction implements TcpAction {
-        CALL("呼叫"),
-        CANCEL("取消");
+        CALL("视频通话"),   //正常视频对讲
+        VIDEO_OUT_CALL("我方视频输出"),   //我方视频输出(我方语音,对方可视)
+        VIDEO_IN_CALL("对方视频输出"),    //对方视频输出(我方可视,对方语音)
+        VIDEO_ON("打开视频"),   //打开视频
+        VIDEO_INVITE_JOIN("邀请加入视频"),    //邀请加入视频
+        ACCEPT("接受呼叫"),
+        REJECT("拒绝"),
+        CALLING("通话中"),
+        HANDOFF("挂断"),
+        CANCEL("取消"),
+        SUCCESS("呼叫成功"),
+        FAILED("呼叫失败");
 
         private String description;
         VideoAction(String description){
@@ -170,7 +180,12 @@ public interface TcpAction {
     enum DeviceAction implements TcpAction {
         RESTART("重启"),
         CONNECT("连接"),
+        APP_UPDATE("APP更新"),
+        DEVICE_REFRESH("设备刷新"),
+        SYSTEM_SETTING("系统设置"),
+        DEVICE_CHANGE("设备更换"),
         USER_CHANGE("用户绑定");
+
         private String description;
         DeviceAction(String description){
             this.description = description;
@@ -250,7 +265,8 @@ public interface TcpAction {
     }
 
     enum BroadcastAction implements TcpAction {
-        START("开始");
+        START("开始"),
+        STOP("停止");
         private String description;
         BroadcastAction(String description){
             this.description = description;

+ 24 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/CommonUtils.java

@@ -0,0 +1,24 @@
+package com.wdkl.ncs.android.middleware.utils;
+
+import android.text.TextUtils;
+
+import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO;
+
+import java.util.ArrayList;
+
+public class CommonUtils {
+    private static ArrayList<FrameBedVO> bedVOS = new ArrayList<>();
+
+    public static void setInBedVos(ArrayList<FrameBedVO> data) {
+        for (FrameBedVO bedVO : data) {
+            if (bedVO != null && !TextUtils.isEmpty(bedVO.getCustomerName())) {
+                //有入住才加入进来
+                bedVOS.add(bedVO);
+            }
+        }
+    }
+
+    public static ArrayList<FrameBedVO> getInBedVOS() {
+        return bedVOS;
+    }
+}

+ 45 - 14
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -1,6 +1,9 @@
 package com.wdkl.ncs.android.component.nursehome.activity
 
-import android.app.Dialog
+//import com.starrtc.demo.demo.MLOC
+//import com.starrtc.demo.demo.voip.VoipActivity
+//import com.starrtc.demo.demo.voip.VoipAudioActivity
+//import com.wdkl.ncs.android.component.nursehome.SipUtil.SipHelperUtil
 import android.app.NotificationManager
 import android.content.BroadcastReceiver
 import android.content.Context
@@ -8,7 +11,6 @@ import android.content.Intent
 import android.content.IntentFilter
 import android.graphics.Color
 import android.net.ConnectivityManager
-import android.net.NetworkInfo
 import android.net.Uri
 import android.os.Build
 import android.os.CountDownTimer
@@ -18,26 +20,19 @@ import android.support.v4.app.FragmentManager
 import android.support.v4.app.FragmentTransaction
 import android.text.TextUtils
 import android.util.Log
-import android.view.LayoutInflater
 import android.view.View
-import android.widget.ImageView
-import android.widget.LinearLayout
-import android.widget.RelativeLayout
 import com.enation.javashop.android.jrouter.external.annotation.Router
 import com.enation.javashop.net.engine.model.NetState
 import com.google.gson.Gson
-//import com.starrtc.demo.demo.MLOC
-//import com.starrtc.demo.demo.voip.VoipActivity
-//import com.starrtc.demo.demo.voip.VoipAudioActivity
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.IUserState
 import com.wdkl.core.socket.SocketManager
+import com.wdkl.core.voip.CallMultiActivity
 import com.wdkl.core.voip.CallSingleActivity
 import com.wdkl.core.voip.SpeechUtil
 import com.wdkl.ncs.android.component.nursehome.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.SipUtil.SipCallBack
-//import com.wdkl.ncs.android.component.nursehome.SipUtil.SipHelperUtil
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.component.nursehome.databinding.ActivityNurseHomeBinding
 import com.wdkl.ncs.android.component.nursehome.fragment.*
@@ -46,7 +41,6 @@ import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.nursehome.util.*
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.utils.AppTool
-import com.wdkl.ncs.android.lib.utils.debugLog
 import com.wdkl.ncs.android.lib.utils.push
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.widget.SOSDialog
@@ -61,6 +55,7 @@ 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.OtherUtil
+import com.wdkl.ncs.android.middleware.tcp.channel.VideoUtil
 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.TcpAction
@@ -71,7 +66,7 @@ import kotlinx.android.synthetic.main.right_list.*
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
-import org.webrtc.NetworkMonitorAutoDetect.getConnectionType
+import java.util.*
 
 /**
  * 首页Activity
@@ -725,8 +720,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         Constants.CALL_STATE = Constants.CALL_INCOMING
                         DeviceChannel.calling = true
 
+                        val text = "来自: " + interactionVO.fromFrameFullName + " 的通话请求"
                         CallDialogHelper.dismissCallDialog()
-                        CallDialogHelper.showCallDialog(this@NurseHomeActivity, 1, interactionVO.fromFrameFullName, View.OnClickListener {
+                        CallDialogHelper.showCallDialog(this@NurseHomeActivity, 1, text, View.OnClickListener {
                             //呼出取消
                         }, View.OnClickListener {
                             //来电接听
@@ -786,7 +782,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         Constants.CALL_STATE = Constants.CALL_OUTGOING
 
                         CallDialogHelper.dismissCallDialog()
-                        CallDialogHelper.showCallDialog(this@NurseHomeActivity, 0, "", View.OnClickListener {
+                        CallDialogHelper.showCallDialog(this@NurseHomeActivity, 0, "正在呼叫,等待接听中...", View.OnClickListener {
                             //呼出取消
                             Constants.CALL_STATE = Constants.CALL_STANDBY
                             DeviceChannel.calling = false
@@ -838,6 +834,41 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
                         EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_REFRESH_CALL_LIST))
                     }
+                } else if (tcpModel.type == TcpType.VIDEO) {
+                    if (tcpModel.action == TcpAction.VideoAction.VIDEO_OUT_CALL) {
+                        //收到探视请求,弹出提示
+                        Constants.fromId = tcpModel.fromId
+                        Constants.interactionId = interactionVO.id
+                        Constants.CALL_STATE = Constants.CALL_INCOMING
+                        DeviceChannel.calling = true
+
+                        CallDialogHelper.dismissCallDialog()
+                        CallDialogHelper.showCallDialog(this@NurseHomeActivity, 1, "您有新的探视请求", View.OnClickListener {
+                            //呼出取消
+                        }, View.OnClickListener {
+                            //接受探视,创建多人视频房间
+                            //VideoUtil.acceptVideoCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
+                            VideoUtil.sendVideoInCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
+                            CallDialogHelper.dismissCallDialog()
+
+                            // 创建一个房间并进入
+                            val roomId = "visit-room-" + Constants.interactionId
+                            CallMultiActivity.openActivity(activity, roomId, true)
+                        }, View.OnClickListener {
+                            //拒接探视
+                            DeviceChannel.calling = false
+                            VideoUtil.rejectVideoCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
+                            CallDialogHelper.dismissCallDialog()
+                        })
+
+                        if (SettingConfig.getTtsMode(this) == SettingConfig.TTS_ON) {
+                            SpeechUtil.getInstance().addSpeech("您有新的探视请求", false)
+                        }
+                    } else if (tcpModel.action == TcpAction.VideoAction.CANCEL) {
+                        Constants.CALL_STATE = Constants.CALL_STANDBY
+                        DeviceChannel.calling = false
+                        CallDialogHelper.dismissCallDialog()
+                    }
                 }
             }
 

+ 12 - 4
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/FrameBedVosConfinementAdapter.kt

@@ -86,13 +86,21 @@ class FrameBedVosConfinementAdapter(val data: ArrayList<FrameBedVO>) : BaseDeleg
             } else {
                 binding.patientAgeTv.text = "--"
             }
-            binding.tvNurseConfigName.text = itemData.nurseConfigName
-            if (!TextUtils.isEmpty(itemData.nurseColorRgb)) {
-                binding.tvNurseConfigColor.visibility = View.VISIBLE
-                binding.tvNurseConfigColor.setBackgroundColor(Color.parseColor("#" + itemData.nurseColorRgb))
+
+            if (itemData.nurseConfigDtos != null && itemData.nurseConfigDtos.size > 0) {
+                val nurseItem = itemData.nurseConfigDtos.get(0)
+                binding.tvNurseConfigName.text = nurseItem.nurseConfigName
+                if (!TextUtils.isEmpty(nurseItem.nurseColorRbg)) {
+                    binding.tvNurseConfigColor.visibility = View.VISIBLE
+                    binding.tvNurseConfigColor.setBackgroundColor(Color.parseColor("#" + nurseItem.nurseColorRbg))
+                } else {
+                    binding.tvNurseConfigColor.visibility = View.INVISIBLE
+                }
             } else {
+                binding.tvNurseConfigName.text = ""
                 binding.tvNurseConfigColor.visibility = View.INVISIBLE
             }
+
             if (itemData.customerSex != null) {
                 if (itemData.customerSex == 1) {
                     binding.sexImagev.setImageResource(R.drawable.man)

+ 1 - 1
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/FramePartItemAdapter.kt

@@ -72,7 +72,7 @@ var TAG = FramePartItemAdapter::class.java.getSimpleName()
             binding.wardTv.text = itemData.frameRoom.name
 
 
-            var frameBedVos =  itemData.frameBedVos
+            var frameBedVos =  itemData.frameBedList
 //            if(frameBedVos!= null){
 //                Log.e("frameBedVOs","frameBedVOs "+frameBedVos.size)
 //            }

+ 5 - 18
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt

@@ -9,18 +9,14 @@ import android.view.View
 import com.alibaba.android.vlayout.DelegateAdapter
 import com.alibaba.android.vlayout.VirtualLayoutManager
 import com.enation.javashop.net.engine.model.NetState
-import com.google.gson.Gson
 import com.scwang.smartrefresh.layout.footer.ClassicsFooter
-import com.wdkl.core.voip.CallSingleActivity
 import com.wdkl.ncs.android.component.nursehome.R
-import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity
 import com.wdkl.ncs.android.component.nursehome.adapter.*
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.component.nursehome.databinding.FragmentFramePartBinding
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
 import com.wdkl.ncs.android.component.nursehome.util.TimeTransition
 import com.wdkl.ncs.android.lib.base.BaseFragment
-import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.debugLog
 import com.wdkl.ncs.android.lib.utils.errorLog
 import com.wdkl.ncs.android.lib.utils.showMessage
@@ -31,9 +27,7 @@ import com.wdkl.ncs.android.middleware.model.dto.ExaminationConfigByGroupNameDto
 import com.wdkl.ncs.android.middleware.model.dto.FeeConfigByGroupNameDto
 import com.wdkl.ncs.android.middleware.model.vo.*
 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.TcpAction
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import kotlinx.android.synthetic.main.fragment_frame_part.*
 import kotlinx.android.synthetic.main.right_basic_information.*
@@ -314,16 +308,16 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
     override fun showData(data: FramePartVO) {
 
         if (data!=null){
-            var frameRoomVos = ArrayList<FrameRoomVO>()
-            frameRoomVos = data.frameRoomVos as ArrayList<FrameRoomVO>
+            var frameRoomVos = data.frameRoomVos as ArrayList<FrameRoomVO>
             var frameBedVO = ArrayList<FrameBedVO>()
 
             for (frameRoomVo in frameRoomVos) {
-                var frameBedVOs = frameRoomVo.frameBedVos
-                if (frameBedVOs.size > 0) {
+                var frameBedVOs = frameRoomVo.frameBedList
+                if (frameBedVOs != null && frameBedVOs.size > 0) {
                     frameBedVO.addAll(frameBedVOs)
                 }
             }
+            CommonUtils.setInBedVos(frameBedVO)
 
             adapter!!.data.clear()
             adapter!!.data.addAll(frameBedVO)
@@ -331,13 +325,6 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
             adapter!!.notifyDataSetChanged()
         }
         refresh.finishLoadMore()
-
-//        adapter!!.frameBedVosAdapter!!.setOnItemClickListener { data, position ->
-//                        showMessage("点击了病床分机")
-////
-////
-//        }
-
     }
 
     /**

+ 5 - 5
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/util/CallDialogHelper.java

@@ -23,7 +23,7 @@ public class CallDialogHelper {
 
     private static AlertDialog callDialog;
 
-    public static void showCallDialog(Activity activity, int callType, String name, View.OnClickListener hangupCall, View.OnClickListener acceptCall, View.OnClickListener rejectCall) {
+    public static void showCallDialog(Activity activity, int callType, String callText, View.OnClickListener hangupCall, View.OnClickListener acceptCall, View.OnClickListener rejectCall) {
         View contentView = LayoutInflater.from(activity).inflate(R.layout.call_dialog_lay, null);
         AlertDialog.Builder builder = new AlertDialog.Builder(activity);
         builder.setView(contentView);
@@ -34,21 +34,21 @@ public class CallDialogHelper {
         RelativeLayout inCall = contentView.findViewById(R.id.rl_call_incoming);
         ImageView accept = contentView.findViewById(R.id.iv_accept_call);
         ImageView reject = contentView.findViewById(R.id.iv_reject_call);
-        TextView textName = contentView.findViewById(R.id.tv_incoming_call_text);
+        TextView inText = contentView.findViewById(R.id.tv_incoming_call_text);
+        TextView outText = contentView.findViewById(R.id.tv_out_call_text);
 
         if (callType == 0) {
             //去电
             outCall.setVisibility(View.VISIBLE);
             inCall.setVisibility(View.GONE);
-            //ringPlayer.play(activity, R.raw.wr_ringback, true, AudioManager.STREAM_MUSIC);
+            outText.setText(callText);
             RingPlayHelper.playRingTone(activity, R.raw.wr_ringback, true);
         } else {
             //来电
             outCall.setVisibility(View.GONE);
             inCall.setVisibility(View.VISIBLE);
-            textName.setText("有新的通话请求: " + name);
+            inText.setText(callText);
             if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_OFF) {
-                //ringPlayer.play(activity, R.raw.incoming_call, true, AudioManager.STREAM_MUSIC);
                 RingPlayHelper.playRingTone(activity, R.raw.incoming_call, false);
             }
         }

+ 1 - 0
nursehome/src/main/res/layout/call_dialog_lay.xml

@@ -12,6 +12,7 @@
         android:orientation="vertical">
 
         <TextView
+            android:id="@+id/tv_out_call_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:gravity="center"

+ 28 - 13
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/WebRTCEngine.java

@@ -63,6 +63,10 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     private ProxyVideoSink localSink;
     private SurfaceViewRenderer localRenderer;
 
+    // 服务器实例列表
+    private String serverIP = "120.76.246.253";
+    private String turnUser = "wdklrtc";
+    private String turnUserPwd = "Wdkl2021Rtc";
 
     private static final String VIDEO_TRACK_ID = "ARDAMSv0";
     private static final String AUDIO_TRACK_ID = "ARDAMSa0";
@@ -463,23 +467,34 @@ 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")
+//        PeerConnection.IceServer var1 = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302")
+//                .createIceServer();
+//        iceServers.add(var1);
+
+        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")
-                .createIceServer();
-        PeerConnection.IceServer var13 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=tcp")
-                .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 var11 = PeerConnection.IceServer.builder("stun:172.28.100.100:3478?transport=udp")
+//                .createIceServer();
+//        PeerConnection.IceServer var12 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=udp")
+//                .setUsername("ddssingsong")
+//                .setPassword("123456")
+//                .createIceServer();
+//        PeerConnection.IceServer var13 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=tcp")
+//                .setUsername("ddssingsong")
+//                .setPassword("123456")
+//                .createIceServer();
         iceServers.add(var11);
         iceServers.add(var12);
-        iceServers.add(var13);
+//        iceServers.add(var13);
     }
 
     /**

+ 1 - 1
settings.gradle

@@ -1 +1 @@
-include ':app', ':common', ':welcome', ':home', ':resource', ':middleware', ':extra', ':nursehome', 'webrtc', 'rtc-chat', 'libwebrtc'
+include ':app', ':common', ':welcome', ':resource', ':middleware', ':extra', ':nursehome', 'webrtc', 'rtc-chat', 'libwebrtc'

+ 77 - 0
webrtc/src/main/java/com/wdkl/core/adapter/BedItemAdapter.java

@@ -0,0 +1,77 @@
+package com.wdkl.core.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.ncs.android.component.nursehome.common.Constants;
+import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO;
+import com.wdkl.ncs.android.middleware.tcp.channel.VideoUtil;
+import com.wdkl.webrtc.R;
+
+import java.util.ArrayList;
+
+public class BedItemAdapter extends RecyclerView.Adapter<BedItemAdapter.BedViewHolder> {
+
+    private Context context;
+    private ArrayList<FrameBedVO> data;
+    private InviteClickListener inviteClickListener;
+
+    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_visit_bed, viewGroup, false);
+        BedViewHolder viewHolder = new BedViewHolder(view);
+
+        return viewHolder;
+    }
+
+    @Override
+    public void onBindViewHolder(BedViewHolder bedViewHolder, int i) {
+        bedViewHolder.visitBed.setText(data.get(i).getFrameBed().getFullName());
+        bedViewHolder.visitName.setText(data.get(i).getCustomerName());
+        bedViewHolder.visit.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (inviteClickListener != null) {
+                    inviteClickListener.onClick(data.get(bedViewHolder.getAdapterPosition()));
+                }
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        return data.size();
+    }
+
+    public void setInvitClickListener(InviteClickListener listener) {
+        inviteClickListener = listener;
+    }
+
+
+    class BedViewHolder extends RecyclerView.ViewHolder {
+        TextView visitBed;
+        TextView visitName;
+        Button visit;
+
+        BedViewHolder(View itemView) {
+            super(itemView);
+            visitBed = itemView.findViewById(R.id.tv_visit_bed);
+            visitName = itemView.findViewById(R.id.tv_visit_name);
+            visit = itemView.findViewById(R.id.btn_visit);
+        }
+    }
+
+    public interface InviteClickListener{
+        void onClick(FrameBedVO bedVO);
+    }
+}

+ 78 - 6
webrtc/src/main/java/com/wdkl/core/voip/CallMultiActivity.java

@@ -10,11 +10,26 @@ import android.os.Handler;
 import android.os.Looper;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
 import android.view.View;
 import android.view.WindowManager;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
+import android.widget.Toast;
 
+import com.alibaba.android.vlayout.VirtualLayoutManager;
+import com.wdkl.core.adapter.BedItemAdapter;
 import com.wdkl.core.base.BaseActivity;
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
+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.channel.DeviceChannel;
+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.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
+import com.wdkl.ncs.android.middleware.utils.CommonUtils;
 import com.wdkl.ncs.android.middleware.utils.MessageEvent;
 import com.wdkl.permission.Permissions;
 import com.wdkl.skywebrtc.CallSession;
@@ -40,6 +55,12 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
     public static final String EXTRA_MO = "isOutGoing";
     private boolean isOutgoing;
 
+    private BedItemAdapter bedItemAdapter;
+    private RecyclerView recyclerView;
+    private FrameLayout mainView;
+    //是否已经邀请
+    private boolean invited = false;
+
 
     public static void openActivity(Activity activity, String room, boolean isOutgoing) {
         Intent intent = new Intent(activity, CallMultiActivity.class);
@@ -64,6 +85,24 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
 
 
     private void initView() {
+        bedItemAdapter = new BedItemAdapter(this, CommonUtils.getInBedVOS());
+        recyclerView = findViewById(R.id.room_list_view);
+        recyclerView.setAdapter(bedItemAdapter);
+        recyclerView.setLayoutManager(new VirtualLayoutManager(this));
+        mainView = findViewById(R.id.meeting_container);
+        mainView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (!invited) {
+                    if (recyclerView.getVisibility() == View.GONE) {
+                        recyclerView.setVisibility(View.VISIBLE);
+                    } else {
+                        recyclerView.setVisibility(View.GONE);
+                    }
+                }
+            }
+        });
+
         meetingHangupImageView = findViewById(R.id.meetingHangupImageView);
         Fragment fragment = new FragmentMeeting();
         FragmentManager fragmentManager = getSupportFragmentManager();
@@ -75,6 +114,19 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
 
     private void initListener() {
         meetingHangupImageView.setOnClickListener(this);
+        bedItemAdapter.setInvitClickListener(new BedItemAdapter.InviteClickListener() {
+            @Override
+            public void onClick(FrameBedVO bedVO) {
+                //发送探视邀请给分机,分机直接加入房间
+                VideoUtil.sendInviteVideoCall(Integer.parseInt(Constants.Companion.getIds()),
+                        bedVO.getBedDeviceId(),
+                        Constants.Companion.getInteractionId());
+                invited = true;
+                Constants.Companion.setVisitedId(bedVO.getBedDeviceId());
+                recyclerView.setVisibility(View.GONE);
+                Toast.makeText(CallMultiActivity.this, "已发送探视邀请,请稍后...", Toast.LENGTH_LONG).show();
+            }
+        });
     }
 
     private void initData() {
@@ -104,8 +156,7 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
         SkyEngineKit.init(new VoipEvent());
         if (isOutgoing) {
             // 创建一个房间并进入
-            gEngineKit.createAndJoinRoom(this,
-                    "room-" + UUID.randomUUID().toString().substring(0, 16));
+            gEngineKit.createAndJoinRoom(this, room);
         } else {
             // 加入房间
             gEngineKit.joinRoom(this, room);
@@ -117,7 +168,7 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
             this.finish();
         } else {
             session.setSessionCallback(this);
-
+            session.toggleSpeaker(true);
         }
 
 
@@ -167,7 +218,9 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
 
     @Override
     public void didUserLeave(String userId) {
-        handler.post(() -> currentFragment.didUserLeave(userId));
+        //handler.post(() -> currentFragment.didUserLeave(userId));
+
+        finish();
     }
 
     @Override
@@ -196,12 +249,31 @@ public class CallMultiActivity extends BaseActivity implements CallSession.CallS
 
     // 处理挂断事件
     private void handleHangup() {
+        handoffVideoCall();
         SkyEngineKit.Instance().leaveRoom();
-        this.finish();
+        Constants.Companion.setCALL_STATE(Constants.Companion.getCALL_STANDBY());
+        DeviceChannel.calling = false;
+    }
+
+    private void handoffVideoCall() {
+        //挂断时需要同时通知探视机和分机
+        VideoUtil.handoffVideoCall(Integer.parseInt(Constants.Companion.getIds()), Constants.Companion.getFromId(), Constants.Companion.getInteractionId());
+        if (invited) {
+            VideoUtil.handoffVideoCall(Integer.parseInt(Constants.Companion.getIds()), Constants.Companion.getVisitedId(), Constants.Companion.getInteractionId());
+        }
     }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onMoonEvent(MessageEvent messageEvent) {
-        //
+        if (messageEvent.getType() != null && messageEvent.getType() == Constants.Companion.getEVENT_TCP_MSG()){
+            if (messageEvent.getMessage() instanceof TcpModel) {
+                TcpModel tcpModel = (TcpModel) messageEvent.getMessage();
+                if (tcpModel.getType() == TcpType.VIDEO) {
+                    if (tcpModel.getAction() == TcpAction.VideoAction.HANDOFF) {
+                        handleHangup();
+                    }
+                }
+            }
+        }
     }
 }

+ 1 - 1
webrtc/src/main/java/com/wdkl/core/voip/FragmentMeeting.java

@@ -101,7 +101,7 @@ public class FragmentMeeting extends Fragment implements CallSession.CallSession
 
     @Override
     public void didUserLeave(String userId) {
-        grid_view.removeView(userId);
+        //grid_view.removeView(userId);
     }
 
     @Override

+ 18 - 10
webrtc/src/main/res/layout/activity_multi_call.xml

@@ -1,21 +1,29 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
     tools:context="com.wdkl.core.voip.CallMultiActivity">
 
     <FrameLayout
         android:id="@+id/meeting_container"
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="3"
-        android:background="@color/av_bg_call_black" />
+        android:layout_height="match_parent" />
 
-    <include
-        layout="@layout/av_p2p_meeting_action"
+    <FrameLayout
+        android:id="@+id/p2p_meeting_layout"
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="2" />
-</LinearLayout>
+        android:layout_height="160dp"
+        android:layout_alignParentBottom="true">
+        <include
+            layout="@layout/av_p2p_meeting_action"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+    </FrameLayout>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/room_list_view"
+        android:layout_width="200dp"
+        android:layout_height="match_parent"
+        android:background="@color/color_white" />
+</RelativeLayout>

+ 34 - 0
webrtc/src/main/res/layout/adapter_visit_bed.xml

@@ -0,0 +1,34 @@
+<?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="40dp"
+    android:gravity="center_vertical">
+    <TextView
+        android:id="@+id/tv_visit_bed"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="8dp"
+        android:layout_weight="1"
+        android:text="床位"
+        android:textColor="#2F9DF1"
+        android:textSize="12sp"/>
+    <TextView
+        android:id="@+id/tv_visit_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="8dp"
+        android:layout_weight="1"
+        android:text="名字"
+        android:textColor="#2F9DF1"
+        android:textSize="12sp"/>
+
+    <Button
+        android:id="@+id/btn_visit"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:text="邀请"
+        android:textColor="#2F9DF1"
+        android:textSize="12sp"/>
+</LinearLayout>

+ 3 - 2
webrtc/src/main/res/layout/av_p2p_meeting_action.xml

@@ -2,7 +2,7 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@android:color/background_dark"
+    android:background="#00ffffff"
     android:gravity="center"
     android:orientation="vertical">
 
@@ -10,7 +10,8 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="horizontal">
+        android:orientation="horizontal"
+        android:visibility="gone">
 
 
         <LinearLayout