Bläddra i källkod

护士绑定界面添加 软件的相关信息 方便开发人员和使用人员查看
添加紧急呼叫 sos功能
解决呼入时 宝妈信息显示不正确的问题
护士绑定界面添加 呼叫转接可调功能
绑定方式由Mac改为imei因为有些设备Mac每次开机会变
修改呼叫记录显示 sos呼叫
添加呼叫转接功能
修改呼叫逻辑 实现在息屏和锁屏下 亮屏解锁屏幕
呼叫地址 和语音通话地址改为 演示服务器的地址

wangjk 4 år sedan
förälder
incheckning
7aaccb72ec
30 ändrade filer med 749 tillägg och 120 borttagningar
  1. 4 0
      app/src/main/AndroidManifest.xml
  2. 10 2
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  3. 9 1
      home/build.gradle
  4. 9 5
      home/src/main/AndroidManifest.xml
  5. 2 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/EventActivity.kt
  6. 7 3
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/RTCVoipAudioActivity.java
  7. 97 22
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/RTCVoipAudioRingingActivity.java
  8. 1 1
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt
  9. 19 5
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt
  10. 33 16
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt
  11. 57 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchUserSettingActivity.java
  12. 19 2
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt
  13. 39 0
      home/src/main/code/com/wdkl/ncs/android/component/home/settingconfig/SettingConfig.java
  14. 30 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/Util.kt
  15. 103 0
      home/src/main/java/com/wdkl/ncs/android/component/home/SOSEmergencyCallActivity.kt
  16. 74 0
      home/src/main/res/layout/activity_sos_emergency_call.xml
  17. 1 1
      home/src/main/res/layout/adapter_watch_call_records_item.xml
  18. 107 53
      home/src/main/res/layout/user_setting_layout.xml
  19. 21 3
      home/src/main/res/layout/watch_activity_voice_calls.xml
  20. BIN
      home/src/main/res/raw/sos.wav
  21. BIN
      home/src/main/res/raw/sos2.wav
  22. 3 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt
  23. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java
  24. 10 2
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java
  25. 26 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/OtherUtil.java
  26. 28 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VoiceUtil.java
  27. 3 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java
  28. 32 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java
  29. 1 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpType.java
  30. 3 1
      starRTC/src/main/java/com/starrtc/demo/demo/MLOC.java

+ 4 - 0
app/src/main/AndroidManifest.xml

@@ -20,6 +20,10 @@
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+    <!--  亮屏和解锁权限   -->
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
 
     <application
         android:allowBackup="true"

+ 10 - 2
common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt

@@ -112,15 +112,20 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         lifeCycleDo(LIFE_CYCLE_PAUSE)
     }
 
+
+
     override fun onStart() {
         super.onStart()
-        EventBus.getDefault().register(this)
+        if(!EventBus.getDefault().isRegistered(this)){
+            EventBus.getDefault().register(this)
+        }
+
     }
 
 
     override fun onStop() {
         super.onStop()
-        EventBus.getDefault().unregister(this)
+//        EventBus.getDefault().unregister(this)
     }
     /**
      * @author  LDD
@@ -130,6 +135,9 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
      */
     override fun onDestroy() {
         super.onDestroy()
+        if (EventBus.getDefault().isRegistered(this)) {//加上判断
+            EventBus.getDefault().unregister(this)
+        }
         /**Presenter解除绑定*/
         detachView()
         /**DataBinding解除绑定*/

+ 9 - 1
home/build.gradle

@@ -33,7 +33,7 @@ android {
             enabled = true
         }
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
+        buildConfigField "String", "BUILD_TIME", getDate()
     }
 
 
@@ -59,6 +59,14 @@ android {
     }
 }
 
+//获取编译日期
+String getDate() {
+    Date date = new Date();
+    String dates = "\""+date.format("yyyy年MM月dd日", TimeZone.getTimeZone("UTC"))+"\"";
+    return dates;
+}
+
+
 dependencies {
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
     compile fileTree(dir: 'libs', include: ['*.jar'])

+ 9 - 5
home/src/main/AndroidManifest.xml

@@ -2,27 +2,31 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.wdkl.ncs.android.component.home">
 
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+
     <application
         android:allowBackup="true"
         android:label="@string/app_name"
         android:supportsRtl="true">
+        <activity android:name=".SOSEmergencyCallActivity"></activity>
         <activity
             android:name=".activity.HomeActivity"
             android:launchMode="singleTask" />
         <activity android:name=".activity.WatchHomeActivity" />
         <activity android:name=".activity.WatchContactsActivity" />
         <activity android:name=".activity.WatchCallRecordsActivity" />
-        <activity android:name="com.wdkl.ncs.android.component.home.activity.RTCVoipAudioRingingActivity" />
-        <activity android:name="com.wdkl.ncs.android.component.home.activity.RTCVoipAudioActivity" />
+        <activity android:name=".activity.RTCVoipAudioRingingActivity" />
+        <activity android:name=".activity.RTCVoipAudioActivity" />
         <activity android:name=".activity.EventActivity" />
-        <activity android:name=".activity.WatchEventDetailActivity"/>
-        <activity android:name=".activity.WatchUserSettingActivity"/>
+        <activity android:name=".activity.WatchEventDetailActivity" />
+        <activity android:name=".activity.WatchUserSettingActivity" />
+
         <service android:name="com.starrtc.demo.demo.service.KeepLiveService">
             <intent-filter>
                 <action android:name="com.starrtc.demo.service.KeepLiveService" />
             </intent-filter>
         </service>
-
         <service android:name=".service.TcpHandleService">
             <intent-filter>
                 <action android:name="com.wdkl.ncs.android.component.home.service.TcpHandleService" />

+ 2 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/EventActivity.kt

@@ -35,6 +35,8 @@ class EventActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEven
 
     override fun getLayId(): Int {
         return R.layout.watch_activity_event
+
+
     }
 
     override fun bindDagger() {

+ 7 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/activity/RTCVoipAudioActivity.java

@@ -119,11 +119,15 @@ public class RTCVoipAudioActivity extends Activity implements View.OnClickListen
 //        voice_time_tv.setVisibility(View.GONE);
 
         if (tcpModel.getType() == TcpType.VOICE) {
-            InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
-            bao_mother_name_tv.setText(interactionVO.getToMemberName());
+            if (tcpModel.getAction() == TcpAction.VoiceAction.CALL) {
+                InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+                bao_mother_name_tv.setText(interactionVO.getFromMemberName());
+            } else if (tcpModel.getAction() == TcpAction.VoiceAction.SUCCESS) {
+                InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+                bao_mother_name_tv.setText(interactionVO.getToMemberName());
+            }
         }
 
-
         if (action.equals(CALLING)) {
             showCallingView();
             MLOC.d("newVoip", "call");

+ 97 - 22
home/src/main/code/com/wdkl/ncs/android/component/home/activity/RTCVoipAudioRingingActivity.java

@@ -3,6 +3,7 @@ package com.wdkl.ncs.android.component.home.activity;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.CountDownTimer;
 import android.util.Log;
 import android.view.View;
 import android.view.WindowManager;
@@ -19,6 +20,7 @@ import com.starrtc.demo.utils.IEventListener;
 import com.starrtc.starrtcsdk.api.XHClient;
 import com.starrtc.starrtcsdk.apiInterface.IXHResultCallback;
 import com.wdkl.ncs.android.component.home.R;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper;
 import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.lib.utils.ExtendMethodsKt;
@@ -37,16 +39,22 @@ import org.greenrobot.eventbus.ThreadMode;
 import java.text.SimpleDateFormat;
 
 public class RTCVoipAudioRingingActivity extends Activity implements View.OnClickListener, IEventListener {
+    private String TAG = RTCVoipAudioRingingActivity.class.getSimpleName();
+
 
     private String targetId;
     private InteractionVO interactionVO = new InteractionVO();
     private TcpModel tcpModel = new TcpModel();
     private TextView bao_mother_name_tv;
+
+    private CountDownTimer countDownTimer;
+    private int countdownTime = 15;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
-                WindowManager.LayoutParams. FLAG_FULLSCREEN);
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                WindowManager.LayoutParams.FLAG_FULLSCREEN);
         setContentView(R.layout.watch_activity_voice_calls);
 
         //todo 设置为通话状态 有其他用户输入时 DeviceChannel设置返回通话中
@@ -56,17 +64,18 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
         targetId = getIntent().getStringExtra("targetId");
         tcpModel = (TcpModel) getIntent().getSerializableExtra("TcpModel");
         bao_mother_name_tv = findViewById(R.id.bao_mother_name_tv);
-        interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+        interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
 
         TextView eventText = (TextView) findViewById(R.id.event_text);
         eventText.setText(interactionVO.getFromFrameFullName());
-        if (Strings.isNullOrEmpty(targetId)){
+        if (Strings.isNullOrEmpty(targetId)) {
             findViewById(R.id.hang_up_imagev).setVisibility(View.GONE);
             findViewById(R.id.call_the_voice_imagev).setVisibility(View.GONE);
         } else {
             bao_mother_name_tv.setText(interactionVO.getFromMemberName());
             findViewById(R.id.hang_up_imagev).setOnClickListener(this);
             findViewById(R.id.call_the_voice_imagev).setOnClickListener(this);
+            findViewById(R.id.change_over_image).setOnClickListener(this);
         }
 //        ((TextView)findViewById(R.id.targetid_text)).setText(targetId);
 //        ((ImageView)findViewById(R.id.head_img)).setImageResource(MLOC.getHeadImage(RTCVoipAudioRingingActivity.this,targetId));
@@ -80,30 +89,32 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
         historyBean.setLastTime(new SimpleDateFormat("MM-dd HH:mm").format(new java.util.Date()));
         historyBean.setConversationId(targetId);
         historyBean.setNewMsgCount(1);
-        MLOC.addHistory(historyBean,true);
+        MLOC.addHistory(historyBean, true);
 
+        initCountDownTimer();
+        countDownTimer.start();
         MediaPlayHelper.getInstance().playResMusic(R.raw.incoming_call, 1.0f, true);
 
         EventBus.getDefault().register(this);
     }
 
-    public void addListener(){
-        AEvent.addListener(AEvent.AEVENT_VOIP_REV_HANGUP,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_REV_ERROR,this);
+    public void addListener() {
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_HANGUP, this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_ERROR, this);
     }
 
-    public void removeListener(){
-        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_HANGUP,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_ERROR,this);
+    public void removeListener() {
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_HANGUP, this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_ERROR, this);
     }
 
     @Override
     public void dispatchEvent(final String aEventID, boolean success, final Object eventObj) {
         //super.dispatchEvent(aEventID,success,eventObj);
-        switch (aEventID){
+        switch (aEventID) {
             case AEvent.AEVENT_VOIP_REV_HANGUP:
-                MLOC.d("","对方已挂断");
-                MLOC.showMsg(RTCVoipAudioRingingActivity.this,"对方已挂断");
+                MLOC.d("", "对方已挂断");
+                MLOC.showMsg(RTCVoipAudioRingingActivity.this, "对方已挂断");
                 finish();
                 break;
             case AEvent.AEVENT_VOIP_REV_ERROR:
@@ -114,13 +125,13 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
     }
 
     @Override
-    public void onRestart(){
+    public void onRestart() {
         super.onRestart();
         addListener();
     }
 
     @Override
-    public void onStop(){
+    public void onStop() {
         super.onStop();
         //todo 状态设置为未在通话中
         DeviceChannel.calling = false;
@@ -130,6 +141,9 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
     @Override
     protected void onDestroy() {
         super.onDestroy();
+        if (countDownTimer != null){
+            countDownTimer.cancel();
+        }
         EventBus.getDefault().unregister(this);
     }
 
@@ -138,11 +152,12 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
         int id = v.getId();
         if (id == R.id.hang_up_imagev) {
             MediaPlayHelper.getInstance().stopMusic();
+            countDownTimer.cancel();
             //todo 给服务器发送拒接 tcp
 //            InteractionVO interactionVO = (InteractionVO) tcpModel.getData();
-            InteractionVO interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+            InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
             TcpModel voiceUtilTcpModel = VoiceUtil.voiceReject(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
-            ,interactionVO.getId());
+                    , interactionVO.getId());
             TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
 
             XHClient.getInstance().getVoipManager().refuse(new IXHResultCallback() {
@@ -156,13 +171,36 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
                     finish();
                 }
             });
+        } else if (id == R.id.change_over_image) { //转接给护士主机
+            MediaPlayHelper.getInstance().stopMusic();
+            countDownTimer.cancel();
+            //todo 给服务器发送转接 tcp
+
+            InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+            TcpModel voiceTransferTcpModel = VoiceUtil.voiceTransfer(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
+                    , interactionVO);
+            TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson());
+
+            XHClient.getInstance().getVoipManager().refuse(new IXHResultCallback() {
+                @Override
+                public void success(Object data) {
+                    finish();
+                }
+
+                @Override
+                public void failed(String errMsg) {
+                    finish();
+                }
+            });
+
         } else if (id == R.id.call_the_voice_imagev) {
             MediaPlayHelper.getInstance().stopMusic();
+            countDownTimer.cancel();
             //todo 给服务器发送接听 tcp
 //            InteractionVO interactionVO = (InteractionVO) tcpModel.getData();
-            InteractionVO interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+            InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
             TcpModel voiceUtilTcpModel = VoiceUtil.voiceAccept(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
-            ,interactionVO.getId());
+                    , interactionVO.getId());
             TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
 
             Intent intent = new Intent(RTCVoipAudioRingingActivity.this, RTCVoipAudioActivity.class);
@@ -175,13 +213,50 @@ public class RTCVoipAudioRingingActivity extends Activity implements View.OnClic
         }
     }
 
+    private void initCountDownTimer() {
+
+        Log.e(TAG,"时间到 转发了");
+
+        countdownTime = SettingConfig.getCountdownTime(this);
+        countDownTimer = new CountDownTimer(countdownTime*1000, 1000) {
+            @Override
+            public void onTick(long l) {
+
+            }
+
+            @Override
+            public void onFinish() {
+                MediaPlayHelper.getInstance().stopMusic();
+                //todo 给服务器发送转接 tcp
+                InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+                TcpModel voiceTransferTcpModel = VoiceUtil.voiceTransfer(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
+                        , interactionVO);
+                TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson());
+
+                XHClient.getInstance().getVoipManager().refuse(new IXHResultCallback() {
+                    @Override
+                    public void success(Object data) {
+                        finish();
+                    }
+
+                    @Override
+                    public void failed(String errMsg) {
+                        finish();
+                    }
+                });
+
+            }
+        };
+
+    }
+
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onMoonEvent(MessageEvent messageEvent) {
-        if (messageEvent.getTag() == 2){
+        if (messageEvent.getTag() == 2) {
             TcpModel tcpModel = (TcpModel) messageEvent.getMessage();
 
-            if (tcpModel.getAction() == TcpAction.VoiceAction.CANCEL || tcpModel.getAction() == TcpAction.VoiceAction.HANDOFF){
+            if (tcpModel.getAction() == TcpAction.VoiceAction.CANCEL || tcpModel.getAction() == TcpAction.VoiceAction.HANDOFF) {
                 //voiceStatus.setText("对方拒绝");
                 ExtendMethodsKt.showMessage("通话取消");
                 MediaPlayHelper.getInstance().stopMusic();

+ 1 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt

@@ -96,7 +96,7 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
                     if(interactionVO!!.actionEnd  ==null){
                         var imUtilTcpModel = ImUtil.imRead(Constants.ids.toInt(), interactionVO!!.fromDeviceId, interactionVO!!.id)
                         TcpClient.getInstance().sendMsg(imUtilTcpModel.toJson())
-                        var mediaPlayer = MediaPlayer()
+//                        var mediaPlayer = MediaPlayer()
 //                    mediaPlayer.startMediaPlayer( Constants.eth_ip +interactionVO!!.data)
 //                    mediaPlayer.setVolume(0.3f)
                         MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url +interactionVO!!.data,1f,false)

+ 19 - 5
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt

@@ -15,10 +15,12 @@ import com.enation.javashop.android.jrouter.external.annotation.Router
 import com.enation.javashop.net.engine.model.NetState
 import com.google.gson.Gson
 import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.SOSEmergencyCallActivity
 import com.wdkl.ncs.android.component.home.databinding.WatchActivityHomeBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
 import com.wdkl.ncs.android.component.home.util.NetHelper
 import com.wdkl.ncs.android.component.home.util.SpeechUtil
+import com.wdkl.ncs.android.component.home.util.Util
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.base.BaseApplication
@@ -177,11 +179,14 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
+        //唤醒屏幕
+        Util().wakeUpAndUnlock(this)
+
         if (messageEvent.tag == 0) {
 
             var tcpModel = messageEvent.getMessage() as TcpModel
             var responseTcpModel: TcpModel
-
+            Log.e(TAG,""+tcpModel.getType()+" "+tcpModel.getAction())
             when (tcpModel.getType()) {
                 TcpType.CALLBACK -> if (tcpModel.getAction() === TcpAction.CallbackAction.SUCCESS) {
                     //todo: 刷新呼叫记录列表
@@ -226,6 +231,15 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
                     //todo: 服务端通过data给出具体的事件名称放置data。使用通话中界面,显示事件名称,停留3秒,结束至正常界面
                     Log.e(TAG, "收到事件tcp")
                 }
+                TcpType.SOS -> if (tcpModel.getAction() === TcpAction.SOSAction.CALL) {
+                    Log.e(TAG,""+tcpModel.getType()+" "+tcpModel.getAction())
+
+                    var intent = Intent()
+                    intent.setClass(this, SOSEmergencyCallActivity::class.java)
+                    intent.putExtra("TcpModel", tcpModel)
+                    startActivity(intent)
+                }
+
             }
         }
     }
@@ -239,13 +253,13 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
                     val wifiInfo = wifiManager.getConnectionInfo()
                     val wifi = wifiInfo.getRssi ();//获取wifi信号强度
                     if (wifi > -50 && wifi < 0) {//最强
-                        Log.e(TAG, "wzlll 最强")
+//                        Log.e(TAG, "wzlll 最强")
                     } else if (wifi > -70 && wifi < -50) {//较强
-                        Log.e(TAG, "wzlll 较强")
+//                        Log.e(TAG, "wzlll 较强")
                     } else if (wifi > -80 && wifi < -70) {//较弱
-                        Log.e(TAG, "wzlll 较弱")
+//                        Log.e(TAG, "wzlll 较弱")
                     } else if (wifi > -100 && wifi < -80) {//微弱
-                        Log.e(TAG, "wzlll 微弱")
+//                        Log.e(TAG, "wzlll 微弱")
                     }
                 }
             }

+ 33 - 16
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt

@@ -2,7 +2,10 @@ package com.wdkl.ncs.android.component.home.activity
 
 import android.Manifest
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.os.Handler
+import android.support.v4.app.ActivityCompat
+import android.support.v4.content.ContextCompat
 import android.util.Log
 import com.enation.javashop.android.jrouter.external.annotation.Router
 import com.enation.javashop.net.engine.model.NetState
@@ -38,9 +41,11 @@ import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 
 @Router(path = "/home/watchRegister")
-class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityRegisterBinding>(), WatchDeviceContract.View  {
+class WatchRegisterActivity : BaseActivity<WatchDevicePresenter, WatchActivityRegisterBinding>(), WatchDeviceContract.View {
     var TAG = WatchRegisterActivity::class.java.getSimpleName()
 
+    private val WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 127//这个值是自定义的一个int值,在申请多个权限时要
+
     override fun getLayId(): Int {
         return R.layout.watch_activity_register
     }
@@ -50,16 +55,16 @@ class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityReg
     }
 
     override fun init() {
-        Constants.imei = Util().getIMEI(this)
-        Log.e(TAG,"IMEI "+ Util().getIMEI(this))
-
-        Constants.mac = NetHelper.getInstance().macAddress
-        //Constants.mac = "4C:C0:0A:8E:D6:BB"
-        Log.e(TAG,"mac "+Constants.mac)
-        tv_mac_addr.text = "MAC地址: " + Constants.mac+"\n" +"IMEI号:"+Constants.imei
 
         presenter.loadTcpServerHost()
 
+//        val permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
+//
+//        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
+//            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), WRITE_EXTERNAL_STORAGE_REQUEST_CODE)
+//        } else {
+//            //TODO
+//        }
         requestPermissions()
     }
 
@@ -79,7 +84,7 @@ class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityReg
     }
 
     private fun startConnectTcpServer() {
-        Thread ( Runnable {
+        Thread(Runnable {
             run {
                 //TcpClient.getInstance().init("192.168.1.138", 5080, 9)
                 //TcpClient.getInstance().init("47.106.200.55", 5080, 9)
@@ -89,9 +94,9 @@ class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityReg
     }
 
     override fun showData(data: DeviceDO) {
-        Log.e(TAG,"收到返回的设备信息 ")
-        Constants.ids = ""+data.id
-        Constants.sip_id =data.sipId
+        Log.e(TAG, "收到返回的设备信息 ")
+        Constants.ids = "" + data.id
+        Constants.sip_id = data.sipId
         Constants.eth_ip = "192.168.1.138:8006/"
         Constants.user_name = data.memberName
         //这里的是视频通话有关的
@@ -116,21 +121,33 @@ class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityReg
 //        startService(intent2)
     }
 
-    private fun requestPermissions(){
+    private fun requestPermissions() {
         Observable.just("").compose(RxPermissions(this).ensure(Manifest.permission.CAMERA,
                 Manifest.permission.READ_EXTERNAL_STORAGE,
                 Manifest.permission.WRITE_EXTERNAL_STORAGE,
                 Manifest.permission.ACCESS_WIFI_STATE,
                 Manifest.permission.BLUETOOTH,
-                Manifest.permission.RECORD_AUDIO)).subscribe {
-            if (it){
+                Manifest.permission.RECORD_AUDIO,
+                Manifest.permission.READ_PHONE_STATE)).subscribe {
+            if (it) {
+                Constants.imei = Util().getIMEI(this)
+                Log.e(TAG, "IMEI " + Util().getIMEI(this))
+
+                Constants.mac = NetHelper.getInstance().macAddress
+                //Constants.mac = "4C:C0:0A:8E:D6:BB"
+                Log.e(TAG, "mac " + Constants.mac)
+                tv_mac_addr.text = "MAC地址: " + Constants.mac + "\n" + "IMEI号:" + Constants.imei
+
 //                presenter.loadData(Constants.mac)//传Mac
                 presenter.loadData(Constants.imei)// 传imei
-            }else{
+            } else {
                 showMessage("请重新授权,进入App")
                 requestPermissions()
             }
         }.joinManager(disposableManager)
+
+
+
     }
 
     fun toHome() {

+ 57 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchUserSettingActivity.java

@@ -1,13 +1,21 @@
 package com.wdkl.ncs.android.component.home.activity;
 
+import android.Manifest;
 import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
 import android.view.View;
 import android.widget.Button;
+import android.widget.SeekBar;
 import android.widget.TextView;
 
+import com.wdkl.ncs.android.component.home.BuildConfig;
 import com.wdkl.ncs.android.component.home.R;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.component.home.util.NetHelper;
 import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.lib.utils.ExtendMethodsKt;
@@ -19,9 +27,14 @@ public class WatchUserSettingActivity extends Activity {
 
     private TextView tvDeviceId;
     private TextView tvDeviceMac;
+    private TextView tv_device_imei;
     private TextView tvDeviceIp;
     private TextView tvDeviceUser;
     private Button btnChange;
+    private TextView countdown_time_tv;
+    private SeekBar countdown_time_seekb;
+    private TextView version_information_tv;
+    private static final int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 127;//这个值是自定义的一个int值,在申请多个权限时要
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -30,15 +43,24 @@ public class WatchUserSettingActivity extends Activity {
 
         tvDeviceId = findViewById(R.id.tv_device_id);
         tvDeviceMac = findViewById(R.id.tv_device_mac);
+        tv_device_imei = findViewById(R.id.tv_device_imei);
         tvDeviceIp = findViewById(R.id.tv_device_ip);
         tvDeviceUser = findViewById(R.id.tv_device_user_name);
         btnChange = findViewById(R.id.btn_user_change);
+        countdown_time_tv = findViewById(R.id.countdown_time_tv);
+        countdown_time_seekb = findViewById(R.id.countdown_time_seekb);
+        version_information_tv = findViewById(R.id.version_information_tv);
 
         tvDeviceId.setText("设备ID: " + Constants.Companion.getIds());
         tvDeviceMac.setText("设备MAC: " + Constants.Companion.getMac());
+        tv_device_imei.setText("设备IMEI: " + Constants.Companion.getImei());
         tvDeviceIp.setText("设备IP: " + NetHelper.getInstance().getLocalIP());
         tvDeviceUser.setText("当前用户: " + Constants.Companion.getUser_name());
 
+        //设置呼叫转接时间
+        countdown_time_tv.setText("转接时间: " + SettingConfig.getCountdownTime(this) + "秒");
+        countdown_time_seekb.setProgress(SettingConfig.getCountdownTime(this));
+
         btnChange.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -48,8 +70,43 @@ public class WatchUserSettingActivity extends Activity {
                 WatchUserSettingActivity.this.finish();
             }
         });
+
+        countdown_time_seekb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
+                countdown_time_tv.setText("转接时间: " + i + "秒");
+            }
+
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+
+            }
+
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+                SettingConfig.setCountdownTime(getApplication(), seekBar.getProgress());
+            }
+        });
+        version_information_tv.setText("App名称: " + getString(R.string.javashop_app_name) +
+                "\r\nAPP版本号: V" + BuildConfig.VERSION_NAME
+                + "\r\n发布日期:" + BuildConfig.BUILD_TIME
+                + "\r\nSDK版本: " + Build.VERSION.SDK_INT
+                + "\r\n平台: " + Build.PRODUCT);
+
+
+        int permissionCheck = ContextCompat.checkSelfPermission(this,
+                Manifest.permission.READ_PHONE_STATE);
+
+        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
+            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
+        } else {
+            //TODO
+        }
+
+
     }
 
+
     @Override
     protected void onDestroy() {
         super.onDestroy();

+ 19 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt

@@ -97,7 +97,17 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                     binding.callStatusImagev.setImageResource(R.drawable.hu_chu_yi_jie)
                 }
 
-                if(itemData.actionType == TcpType.EVENT.name){//事件已经响应 相应的数据
+
+                if(itemData.actionType == TcpType.SOS.name){ //sos紧急呼叫 已处理
+                    binding.playTv.visibility = View.GONE
+                    binding.projectTv.visibility = View.VISIBLE
+                    binding.conductorNameTv.visibility = View.VISIBLE
+                    binding.projectTv.text = "SOS"
+                    binding.conductorNameTv.text = itemData.toMemberName
+                    binding.processingTimeTv.text = TimeTransition().stampToDate(itemData.actionEnd*1000)
+                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_handled)
+
+                }else if(itemData.actionType == TcpType.EVENT.name){//事件已经响应 相应的数据
                     binding.playTv.visibility = View.GONE
                     binding.projectTv.visibility = View.VISIBLE
                     binding.conductorNameTv.visibility = View.VISIBLE
@@ -153,7 +163,14 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                 }
 
 
-                if(itemData.actionType == TcpType.EVENT.name){//事件未处理
+                if(itemData.actionType == TcpType.SOS.name){ //sos紧急呼叫 未处理
+                    binding.playTv.visibility = View.GONE
+                    binding.projectTv.visibility = View.VISIBLE
+                    binding.projectTv.text = "SOS"
+                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_unhandled_bg)
+                    binding.processingTimeTv.text = "未处理"
+
+                }else if(itemData.actionType == TcpType.EVENT.name){//事件未处理
                     binding.playTv.visibility = View.GONE
                     binding.projectTv.visibility = View.VISIBLE
                     binding.projectTv.text = itemData.data

+ 39 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/settingconfig/SettingConfig.java

@@ -0,0 +1,39 @@
+package com.wdkl.ncs.android.component.home.settingconfig;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class SettingConfig {
+
+    private static final String SP_NAME = "SP_FUNCTION";
+
+    //呼叫转接时间设置
+    private static final String KEY_SP_COUNTDOWN_TIME = "KEY_SP_COUNTDOWN_TIME";
+    private static final int CountdownTime = 15;
+
+    /**
+     * 获取播报次数
+     *
+     * @return
+     */
+    public static int getCountdownTime(Context context) {
+        return getSP(context).getInt(KEY_SP_COUNTDOWN_TIME, CountdownTime);
+    }
+
+    /**
+     * 设置播报次数
+     *
+     * @param value
+     */
+    public static void setCountdownTime(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_COUNTDOWN_TIME, value).apply();
+    }
+
+    private static SharedPreferences getSP(Context context) {
+        return context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
+    }
+
+    private static SharedPreferences.Editor getEditor(Context context) {
+        return getSP(context).edit();
+    }
+}

+ 30 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/Util.kt

@@ -1,8 +1,13 @@
 package com.wdkl.ncs.android.component.home.util
 
 import android.annotation.SuppressLint
+import android.app.KeyguardManager
 import android.content.Context
+import android.os.PowerManager
 import android.telephony.TelephonyManager
+import android.content.Context.KEYGUARD_SERVICE
+
+
 
 class Util {
 
@@ -18,4 +23,29 @@ class Util {
     }
 
 
+    fun wakeUpAndUnlock(context: Context){
+        val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+        val screenOn = pm.isScreenOn
+
+        if (!screenOn) {//如果是熄灭状态
+            @SuppressLint("InvalidWakeLockTag")
+            val wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG")
+            wakeLock.acquire()//亮屏
+            //            Handler handler = new Handler();
+            //            handler.postDelayed(new Runnable() {
+            //                @Override
+            //                public void run() {
+            //                    wakeLock.release();//熄灭
+            //                }
+            //            },5*1000);//5秒
+        }
+
+        // 屏幕解锁
+        val keyguardManager = context.getSystemService(KEYGUARD_SERVICE) as KeyguardManager
+        val keyguardLock = keyguardManager.newKeyguardLock("unLock")
+        // 屏幕锁定
+        keyguardLock.reenableKeyguard()
+        keyguardLock.disableKeyguard() // 解锁
+    }
+
 }

+ 103 - 0
home/src/main/java/com/wdkl/ncs/android/component/home/SOSEmergencyCallActivity.kt

@@ -0,0 +1,103 @@
+package com.wdkl.ncs.android.component.home
+
+import android.app.Activity
+import android.os.Bundle
+import android.util.Log
+import android.view.KeyEvent
+import android.view.View
+import com.google.gson.Gson
+import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
+import com.wdkl.ncs.android.component.nursehome.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.OtherUtil
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import kotlinx.android.synthetic.main.activity_sos_emergency_call.*
+import android.view.KeyEvent.KEYCODE_BACK
+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.MessageEvent
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+
+class SOSEmergencyCallActivity : Activity(), View.OnClickListener {
+    var TAG = SOSEmergencyCallActivity::class.java.simpleName
+
+    var tcpModel: TcpModel? = null
+    var interactionVO: InteractionVO? = null
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_sos_emergency_call)
+        tcpModel = intent.getSerializableExtra("TcpModel") as TcpModel
+        interactionVO = Gson().fromJson(tcpModel!!.getData().toString(), InteractionVO::class.java)
+        init()
+        MediaPlayHelper.getInstance().playResMusic(R.raw.sos2, 1.0f, true)
+    }
+
+
+    override fun onStart() {
+        super.onStart()
+        EventBus.getDefault().register(this)
+    }
+
+    fun init() {
+        bao_mother_name_tv.text = interactionVO?.getFromMemberName()
+        event_text.text = interactionVO?.getFromFrameFullName() + "紧急呼叫"
+        hang_up_imagev.setOnClickListener(this)
+    }
+
+    override fun onClick(p0: View) {
+        when (p0.id) {
+            R.id.hang_up_imagev -> {
+                MediaPlayHelper.getInstance().stopMusic()
+                //给服务器发送处理SOStcp
+                var otherUtilTcpModel = OtherUtil.SOSCancel(Constants.ids.toInt(), tcpModel?.fromId, interactionVO?.id)
+                TcpClient.getInstance().sendMsg(otherUtilTcpModel.toJson())
+                finish()
+
+            }
+        }
+
+
+    }
+
+
+    override fun onStop() {
+        super.onStop()
+        MediaPlayHelper.getInstance().stopMusic()
+        EventBus.getDefault().unregister(this)
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        if (messageEvent.tag == 0) {
+
+            var tcpModel = messageEvent.getMessage() as TcpModel
+            var responseTcpModel: TcpModel
+            Log.e(TAG, "" + tcpModel.getType() + " " + tcpModel.getAction())
+            when (tcpModel.getType()) {
+                TcpType.SOS -> if (tcpModel.getAction() === TcpAction.SOSAction.CANCEL) {
+                    finish()
+                }
+
+            }
+        }
+
+
+    }
+
+
+    override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
+        return if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() === KeyEvent.ACTION_UP) {
+
+            //不执行父类点击事件
+            true
+        } else super.onKeyUp(keyCode, event)
+        //继续执行父类其他点击事件
+    }
+
+
+}

+ 74 - 0
home/src/main/res/layout/activity_sos_emergency_call.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#FFE6E8">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="11px"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/bao_mother_image_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/bao_ma_tou_xiang" />
+
+        <TextView
+            android:id="@+id/bao_mother_name_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8px"
+            android:text="宝妈名字"
+            android:textSize="20sp" />
+
+        <TextView
+            android:id="@+id/event_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8px"
+            android:textColor="#FF0000"
+            android:text=""
+            android:textSize="25sp" />
+
+    </LinearLayout>
+
+
+    <TextView
+        android:id="@+id/call_duration_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_above="@+id/call_out_linlyout"
+        android:layout_centerHorizontal="true"
+        android:text=""
+        android:textSize="24sp"
+        android:visibility="gone" />
+
+    <LinearLayout
+        android:id="@+id/call_out_linlyout"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="13px"
+        android:layout_marginBottom="11px"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/hang_up_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/yu_yin_gua_duan" />
+
+    </LinearLayout>
+
+
+</RelativeLayout>
+</layout>

+ 1 - 1
home/src/main/res/layout/adapter_watch_call_records_item.xml

@@ -97,7 +97,7 @@
                         android:layout_width="59px"
                         android:layout_height="20px"
                         android:gravity="center"
-                        android:text="啊哈哈"
+                        android:text="---"
                         android:background="@drawable/sp_event_handled"
                         android:textSize="12px"
                          />

+ 107 - 53
home/src/main/res/layout/user_setting_layout.xml

@@ -1,54 +1,108 @@
 <?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="match_parent"
-    android:background="#FFBDC3"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="20dp"
-        android:layout_marginTop="10dp"
-        android:orientation="vertical">
-
-        <TextView
-            android:id="@+id/tv_device_id"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="设备ID: --"
-            android:textSize="16dp" />
-
-        <TextView
-            android:id="@+id/tv_device_mac"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="设备MAC: --"
-            android:textSize="16dp" />
-
-        <TextView
-            android:id="@+id/tv_device_ip"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="设备IP: --"
-            android:textSize="16dp" />
-
-        <TextView
-            android:id="@+id/tv_device_user_name"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="当前用户: 王护士"
-            android:textSize="16dp" />
-    </LinearLayout>
-
-    <Button
-        android:id="@+id/btn_user_change"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginTop="10dp"
-        android:background="#00B5DC"
-        android:text="换班"
-        android:textColor="@drawable/selector_button_text_color"
-        android:textSize="16dp" />
-</LinearLayout>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#FFBDC3">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="20dp"
+                android:layout_marginTop="10dp"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/tv_device_id"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="设备ID: --"
+                    android:textSize="16dp" />
+
+                <TextView
+                    android:id="@+id/tv_device_mac"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="设备MAC: --"
+                    android:textSize="16dp" />
+                <TextView
+                    android:id="@+id/tv_device_imei"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="设备IMEI: --"
+                    android:textSize="16dp" />
+                <TextView
+                    android:id="@+id/tv_device_ip"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="设备IP: --"
+                    android:textSize="16dp" />
+
+                <TextView
+                    android:id="@+id/tv_device_user_name"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="当前用户: 王护士"
+                    android:textSize="16dp" />
+            </LinearLayout>
+
+            <Button
+                android:id="@+id/btn_user_change"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="10dp"
+                android:background="#00B5DC"
+                android:text="换班"
+                android:textColor="@drawable/selector_button_text_color"
+                android:textSize="16dp" />
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10px"
+                android:layout_marginTop="20px"
+                android:layout_marginRight="10px"
+                android:layout_marginBottom="30px"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/countdown_time_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="20px"
+                    android:text="转接时间:"
+                    android:textSize="16dp" />
+
+                <SeekBar
+                    android:id="@+id/countdown_time_seekb"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="20px"
+                    android:max="25"
+                    android:maxHeight="2px"
+                    android:progress="15" />
+            </LinearLayout>
+            <TextView
+                android:id="@+id/version_information_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="20dp"
+                android:layout_marginRight="20dp"
+                android:textSize="16dp"
+                android:text="软件版本"
+                />
+
+
+        </LinearLayout>
+    </ScrollView>
+</layout>

+ 21 - 3
home/src/main/res/layout/watch_activity_voice_calls.xml

@@ -9,8 +9,8 @@
         android:layout_height="wrap_content"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="11px"
-        android:orientation="vertical"
-        android:gravity="center_horizontal">
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
 
         <ImageView
             android:id="@+id/bao_mother_image_imagev"
@@ -47,7 +47,7 @@
         android:layout_centerHorizontal="true"
         android:text=""
         android:textSize="24sp"
-        android:visibility="gone"/>
+        android:visibility="gone" />
 
     <LinearLayout
         android:id="@+id/call_out_linlyout"
@@ -58,11 +58,29 @@
         android:layout_marginTop="13px"
         android:layout_marginBottom="11px"
         android:orientation="horizontal">
+      <RelativeLayout
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_gravity="center_vertical">
+        <ImageView
+            android:id="@+id/change_over_image"
+            android:layout_width="45px"
+            android:layout_height="45px"
+            android:src="@drawable/yu_yin_wei_chu_li" />
+      <TextView
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_centerInParent="true"
+          android:textSize="14px"
+          android:textColor="#ffffff"
+          android:text="转接"/>
 
+      </RelativeLayout>
         <ImageView
             android:id="@+id/hang_up_imagev"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginLeft="28px"
             android:src="@drawable/yu_yin_gua_duan" />
 
         <ImageView

BIN
home/src/main/res/raw/sos.wav


BIN
home/src/main/res/raw/sos2.wav


+ 3 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt

@@ -54,7 +54,9 @@ interface UrlManager {
 private class DevUrlManager : UrlManager{
 
     override val base: String
-        get() = "http://192.168.1.138"
+        get() = "http://192.168.1.162"
+//        get() = "http://192.168.1.139"
+//get() = "http://47.106.200.55"
 //        get() = "http://dev.base.wdklian.com"
 
     override val device_url: String

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -38,7 +38,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         this.ctx = ctx;
         connected = true;
         retryTimes = 0;
-        TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getMac());
+        TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getImei());
         TcpClient.getInstance().sendMsg(tcpModel.toJson());
     }
 

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

@@ -1,5 +1,9 @@
 package com.wdkl.ncs.android.middleware.tcp.channel;
 
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.PowerManager;
 import android.util.Log;
 
 import com.google.gson.Gson;
@@ -24,7 +28,7 @@ public class DeviceChannel {
     public static TcpModel handleTcpReceived(TcpModel tcpModel){
         TcpModel responseTcpModel = null;
 
-        Log.e(TAG,"DeviceChannel "+tcpModel.getType());
+        Log.e(TAG,"收到tcp消息 DeviceChannel "+tcpModel.getType());
 
         if (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction()==TcpAction.VoiceAction.SUCCESS){
             EventBus.getDefault().post(new MessageEvent(tcpModel, 1));
@@ -44,7 +48,11 @@ public class DeviceChannel {
             EventBus.getDefault().post(new MessageEvent(tcpModel, 3));
         } else if (tcpModel.getType() == TcpType.DATA && tcpModel.getAction() == TcpAction.DataAction.REFRESH) {
             EventBus.getDefault().post(new MessageEvent(tcpModel, 4));
-        } else {
+        } else if(tcpModel.getType() == TcpType.SOS && tcpModel.getAction() == TcpAction.SOSAction.CALL||
+                tcpModel.getType() == TcpType.SOS && tcpModel.getAction() == TcpAction.SOSAction.CANCEL){
+               //todo 紧急呼叫
+            EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
+        }else {
             EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
         }
 

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

@@ -0,0 +1,26 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+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;
+
+public class OtherUtil {
+    public static TcpModel SOSCall(Integer fromId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.SOS);
+        tcpModel.setAction(TcpAction.SOSAction.CALL);
+        tcpModel.setFromId(fromId);
+        return tcpModel;
+    }
+
+    public static TcpModel SOSCancel(Integer fromId, Integer toId,Integer InteractionId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.SOS);
+        tcpModel.setAction(TcpAction.SOSAction.CANCEL);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
+        return tcpModel;
+    }
+
+}

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

@@ -1,10 +1,15 @@
 package com.wdkl.ncs.android.middleware.tcp.channel;
 
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
 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 VoiceUtil {
+    //护士呼叫 不要toId
     public static TcpModel voiceCall(Integer fromId, Integer toId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
@@ -14,6 +19,16 @@ public class VoiceUtil {
         return tcpModel;
     }
 
+    //营养师 管家呼叫 要toId
+//    public static TcpModel voiceCall(Integer fromId, Integer toId){
+//        TcpModel tcpModel = new TcpModel();
+//        tcpModel.setType(TcpType.VOICE);
+//        tcpModel.setAction(TcpAction.VoiceAction.CALL);
+//        tcpModel.setFromId(fromId);
+//        tcpModel.setToId(toId);
+//        return tcpModel;
+//    }
+
     public static TcpModel voiceAccept(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
@@ -82,4 +97,17 @@ public class VoiceUtil {
         tcpModel.setData(InteractionId);
         return tcpModel;
     }
+
+    public static TcpModel voiceTransfer(Integer fromId, Integer toId, Object interactionVO){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.TRANSFER);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        Map map = new HashMap<String,String>();
+        map.put("deviceId",toId);
+        map.put("interactionVo",interactionVO);
+        tcpModel.setData(map);
+        return tcpModel;
+    }
 }

+ 3 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java

@@ -129,6 +129,9 @@ public class TcpModel implements Serializable {
             case EVENT:
                 tcpAction = TcpAction.EventAction.fromString(action);
                 break;
+            case SOS:
+                tcpAction = TcpAction.SOSAction.fromString(action);
+                break;
         }
 
         tcpModel.setType(tcpType);

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

@@ -43,14 +43,15 @@ public interface TcpAction {
     enum VoiceAction implements TcpAction {
         CALL("呼叫"),
         ACCEPT("接受呼叫"),
-        CANCEL("取消"),
         REJECT("拒绝"),
         CALLING("通话中"),
         TRANSFER("转接"),
         HANDOFF("挂断"),
+        CANCEL("取消"),
         SUCCESS("呼叫成功"),
         FAILED("呼叫失败");
 
+
         private String description;
         VoiceAction(String description){
             this.description = description;
@@ -106,6 +107,36 @@ public interface TcpAction {
     }
 
 
+    enum SOSAction implements TcpAction {
+        CALL("紧急呼叫"),
+        CANCEL("取消");
+
+        private String description;
+        SOSAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , SOSAction> ENUM_MAP = new HashMap<String, SOSAction>();
+        static {
+            for(SOSAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static SOSAction fromString(String v) {
+            SOSAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? CALL :userOptionEnum;
+        }
+    }
+
+
     enum IMAction implements TcpAction {
         MSG("语音留言"),
         MSG_READ("语音留言已读");

+ 1 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpType.java

@@ -10,6 +10,7 @@ public enum TcpType {
     CALLBACK("TCP反馈"),
     VOICE("语音"),
     VIDEO("视频"),
+    SOS("紧急呼叫"),
     IM("留言"),
     DEVICE("设备"),
     DATA("数据"),

+ 3 - 1
starRTC/src/main/java/com/starrtc/demo/demo/MLOC.java

@@ -33,7 +33,7 @@ public class MLOC {
     public static Context appContext;
     public static String userId = "";
     //原有demo外网地址
-    public static String SERVER_HOST                = "47.106.200.55";
+//    public static String SERVER_HOST                = "demo.starrtc.com";
 
 
     //自己局域网服务地址
@@ -42,6 +42,8 @@ public class MLOC {
     //自己外网服务地址
 //    public static String SERVER_HOST                = "39.101.66.0";
 
+    public static String SERVER_HOST                = "192.168.1.162";
+
     public static String VOIP_SERVER_URL            = SERVER_HOST+":10086";
     public static String IM_SERVER_URL              = SERVER_HOST+":19903";
     public static String CHATROOM_SERVER_URL        = SERVER_HOST+":19906";