Browse Source

新增护士主机锁屏控制,由后台配置开启,支持密码解锁和nfc刷卡解锁

weizhengliang 8 months ago
parent
commit
be9096b634
49 changed files with 1683 additions and 1076 deletions
  1. 7 3
      android_host/src/main/h10_z3128_1h/AndroidManifest.xml
  2. 0 16
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/SipUtil/SipCallBack.java
  3. 0 661
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/SipUtil/SipHelperUtil.java.bak
  4. 188 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/LockScreenActivity.kt
  5. 88 25
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt
  6. 12 5
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt
  7. 5 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/TestActivity.kt
  8. 5 11
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/CallingItemAdapter.kt
  9. 131 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/IncomingCallAdapter.kt
  10. 2 4
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/di/NurseHomeComponent.kt
  11. 12 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/BaseCallFragment.kt
  12. 5 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/BaseEntranceGuardFragment.kt
  13. 9 6
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/CallRecordsFragment.kt
  14. 2 2
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SipCallFragment.kt
  15. 21 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt
  16. 0 99
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/service/AppService.kt
  17. 279 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/service/LockService.kt
  18. 0 215
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/service/RTCKeepLiveService.java.bak
  19. 9 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/settingconfig/SettingConfig.java
  20. 2 0
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java
  21. 2 2
      android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/window/IncidentWindow.kt
  22. 7 0
      android_host/src/main/h10_z3128_1h/res/drawable/av_float_bg.xml
  23. 56 20
      android_host/src/main/h10_z3128_1h/res/layout/activity_register.xml
  24. 2 0
      android_host/src/main/h10_z3128_1h/res/layout/adapter_call_records_item.xml
  25. 4 4
      android_host/src/main/h10_z3128_1h/res/layout/adapter_calling_item.xml
  26. 18 0
      android_host/src/main/h10_z3128_1h/res/layout/float_lock_layout.xml
  27. 39 0
      android_host/src/main/h10_z3128_1h/res/layout/fragment_system_settings.xml
  28. 75 0
      android_host/src/main/h10_z3128_1h/res/layout/lock_screen_activity.xml
  29. 1 1
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  30. 2 0
      common/build.gradle
  31. 9 1
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  32. 1 0
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseApplication.kt
  33. 310 0
      common/src/main/code/com/wdkl/ncs/android/lib/widget/NumLockView.java
  34. 4 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/DeviceApi.kt
  35. 21 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  36. 6 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/DeviceContract.kt
  37. 15 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/DevicePresenter.kt
  38. 28 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/ClerkDO.java
  39. 80 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/ClerkVO.java
  40. 1 0
      nurseMainLib/src/main/java/android_serialport_api/SerialPort.java
  41. 176 0
      nurseMainLib/src/main/java/serialporttest/utils/SerialPortNfcUtil.java
  42. 12 0
      nurseMainLib/src/main/java/serialporttest/utils/StringUtils.java
  43. 5 0
      resource/src/main/res/drawable/ic_backspace.xml
  44. 8 0
      resource/src/main/res/drawable/lock_call_list_bg.xml
  45. BIN
      resource/src/main/res/mipmap-mdpi/lock_bg.png
  46. 6 0
      resource/src/main/res/values-es/strings.xml
  47. 6 0
      resource/src/main/res/values-ru/strings.xml
  48. 6 0
      resource/src/main/res/values-zh/strings.xml
  49. 6 0
      resource/src/main/res/values/strings.xml

+ 7 - 3
android_host/src/main/h10_z3128_1h/AndroidManifest.xml

@@ -105,9 +105,13 @@
         <activity android:name="com.wdkl.ncs.host.activity.SipTestActivity" />
         <activity android:name="com.wdkl.ncs.host.activity.SipTestActivity" />
         <activity android:name="com.wdkl.ncs.host.activity.CallActivity" />
         <activity android:name="com.wdkl.ncs.host.activity.CallActivity" />
 
 
-        <!--<service
-            android:name="com.wdkl.ncs.host.service.WdklSipService"
-            android:label="@string/app_name" />-->
+        <activity android:name=".activity.LockScreenActivity"
+            android:screenOrientation="landscape"
+            android:launchMode="singleInstance"/>
+
+        <service
+            android:name=".service.LockService"
+            android:label="@string/app_name" />
 
 
         <service
         <service
             android:name="com.wdkl.ncs.host.sip.core.LinCoreService"
             android:name="com.wdkl.ncs.host.sip.core.LinCoreService"

+ 0 - 16
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/SipUtil/SipCallBack.java

@@ -1,16 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.SipUtil;
-
-/**
- * ======================Sip回调接口=====================
- * Created by dengzhe on 2018/2/7.
- */
-
-public interface SipCallBack {
-    void startCall(String sipAddress);//开始拨打
-
-    void autoTalking();//自动接听
-
-    void endCall();//结束通话
-
-
-}

+ 0 - 661
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/SipUtil/SipHelperUtil.java.bak

@@ -1,661 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.SipUtil;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Build;
-import android.os.CountDownTimer;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.util.Log;
-import android.view.WindowManager;
-
-import com.vvsip.ansip.IVvsipService;
-import com.vvsip.ansip.IVvsipServiceListener;
-import com.vvsip.ansip.VvsipCall;
-import com.vvsip.ansip.VvsipService;
-import com.vvsip.ansip.VvsipServiceBinder;
-import com.vvsip.ansip.VvsipTask;
-import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity;
-import com.wdkl.ncs.android.component.nursehome.util.EthernetWifiCallBack;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by dengzhe on 2017/12/18.
- */
-public class SipHelperUtil implements EthernetWifiCallBack {
-
-    private String TAG = SipHelperUtil.class.getSimpleName();
-
-    //挂断状态  21
-    public static int CALLING_ENDING = 21;
-
-    /**
-     * 注册中
-     */
-    public static final String REGISTERING = "register_ing";
-    /**
-     * 注册失败.
-     */
-    public static final String REGISTERFAIL = "register_fail";
-    /**
-     * 注册完成
-     */
-    public static final String REGISTERCOM = "register_com";
-
-
-    private static String SIP_IP = "192.168.101.1";
-    private static String SIP_IP_PORT = ":5060";
-    private static String SIP_PASS_WORD = "4000361820";
-    private static String SIP_ID = "4000361820";
-
-    /**
-     * Sip启动注册.
-     */
-    protected int mSipRegisterTime = 3000;
-    private Handler sipRegisterHandler = null;
-    private Runnable sipRegisterRunnable = null;
-
-    /**
-     * SIP信息
-     */
-    public static final String SipInfoTag = "SipInfo";
-    /**
-     * 电话呼叫对象
-     */
-    private List<VvsipCall> mVvsipCalls = null;
-
-
-    private static SipHelperUtil mSipRegisterUtil;
-
-    public Handler getSipRegisterHandler() {
-        return sipRegisterHandler;
-    }
-
-    public Runnable getSipRegisterRunnable() {
-        return sipRegisterRunnable;
-    }
-
-    public List<VvsipCall> getmVvsipCalls() {
-        return mVvsipCalls;
-    }
-
-    /**
-     * Gets instance.
-     *
-     * @param context the context
-     * @return the instance
-     */
-    private static Context contexts;
-
-    public static SipHelperUtil getInstance(Context context) {
-
-        if (mSipRegisterUtil == null) {
-            synchronized (SipHelperUtil.class) {
-                if (mSipRegisterUtil == null) {
-                    mSipRegisterUtil = new SipHelperUtil();
-                    contexts = context;
-                }
-            }
-        }
-        return mSipRegisterUtil;
-    }
-
-    /**
-     * Instantiates a new Sip register util.
-     */
-    private SipHelperUtil() {
-        setEthernetWifiCallBack(this);
-        if (mVvsipCalls == null) {
-            mVvsipCalls = new ArrayList<VvsipCall>();
-        }
-
-        // Runnable exiting the splash screen and launching the menu
-        sipRegisterRunnable = new Runnable() {
-            public void run() {
-                isSuccessRegisterSip();
-            }
-        };
-
-        // Run the exitRunnable in in mSipRegisterTime ms
-        sipRegisterHandler = new Handler();
-
-        IVvsipService sipservice = VvsipService.getService();
-        if (sipservice != null) {
-            sipRegisterHandler.postDelayed(sipRegisterRunnable, 0);
-            return;
-        }
-        sipRegisterHandler.postDelayed(sipRegisterRunnable, mSipRegisterTime);
-
-
-    }
-
-    /**
-     * 检测Sip服务是否注册成功
-     */
-    public void isSuccessRegisterSip() {
-        VvsipTask vvsipTask = VvsipTask.getVvsipTask();
-        if (vvsipTask != null && VvsipTask.global_failure != 0) {
-            /**
-             * ==================================sip服务启动失败 ================================
-             */
-            Intent intent = new Intent(Intent.ACTION_MAIN);
-            intent.setClass(contexts.getApplicationContext(), VvsipService.class);
-            contexts.stopService(intent);
-//            LogUtil.i(SipInfoTag, "注册失败:lifecycle // isSuccessStartSipService");
-        } else {
-//            finish();
-            /**
-             * ==================================sip服务启动成功 ================================
-             */
-//            LogUtil.i(SipInfoTag, "sip服务启动:lifecycle // isSuccessStartSipService");
-
-        }
-    }
-
-    /**
-     * 注销Sip服务
-     */
-    public void unRegisterSip() {
-//        LogUtil.i(SipInfoTag, "lifecycle // onDestroy");
-
-        IVvsipService sipservice = VvsipService.getService();
-        if (contexts instanceof IVvsipServiceListener && sipservice != null) {
-            sipservice.removeListener((IVvsipServiceListener) contexts);
-        }
-        getSipServiceStartHandler().removeCallbacks(getSipServiceStartRunnable());
-        sipRegisterHandler.removeCallbacks(sipRegisterRunnable);
-        if (getSipServiceConnection() != null && isRegister) {
-            try {
-                contexts.unbindService(getSipServiceConnection());
-                setSipServiceConnection(null);
-            } catch (IllegalArgumentException e) {
-                e.printStackTrace();
-            }
-        }
-        if (mVvsipCalls != null) {
-            mVvsipCalls.clear();
-            mVvsipCalls = null;
-        }
-
-//        Log.i(SipInfoTag, "lifecycle // onDestroy");
-    }
-
-    private boolean isFirstRegister = true;
-    public static String sipMessageCounts = "";
-
-    /**
-     * Sip信息获取
-     */
-    public void obtainSipInfo() {
-        if (sipMessageCounts.equals(REGISTERCOM) && ethernetS) {//sip注册成功并且以太网连上
-            return;
-        }
-        IVvsipService sipService = VvsipService.getService();
-        if (sipService != null) {
-            sipService.addListener((IVvsipServiceListener) contexts);
-            sipService.setMessageHandler(messageHandler);
-        } else {
-//            LogUtil.i(SipInfoTag, "lifecycle // _service==null");
-        }
-        sipRegister();
-        failUiRefreshSip();
-    }
-
-    /**
-     * Sip信息
-     */
-    private String sipinfo = "";
-    private static int handleCount = 0;
-    //Sip註冊次數
-    private CountDownTimer mCountDownAutoTimer;
-    @SuppressLint("HandlerLeak")
-    private Handler messageHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-//            LogUtil.i(SipInfoTag, "VvsipEvent received (?" + msg.what + " " + msg.arg1
-//                    + " " + msg.arg2 + ")\n");
-//            LogUtil.i(SipInfoTag, "#" + msg.obj);
-            sipinfo = "" + msg.obj + sipinfo;
-//            LogUtil.i(SipInfoTag, "Sip信息" + sipinfo);
-
-            if (msg.what == 22) {//释放资源
-//                EventBus.getDefault().post(new MessageEvent(msg.what, EVENT_SIP_REGISTER_STATUS));
-            }
-
-            if (sipinfo.contains("200 OK")) {//注册成功
-                Log.e(TAG,"SIP注册成功");
-//                sipMessageCounts = CallingDoorActivity.REGISTERCOM;
-//                EventBus.getDefault().post(new MessageEvent(CallingDoorActivity.REGISTERCOM, EVENT_SIP_REGISTER_STATUS));
-                if (mSipThread != null) {
-                    mSipThread.interrupt();
-                    mSipThread = null;
-                }
-                if (msg.obj.toString().contains("408")) {//超时
-                    Log.e(TAG,"SIP注册超时");
-//                    sipMessageCounts = CallingDoorActivity.REGISTERFAIL;
-//                    EventBus.getDefault().post(new MessageEvent(CallingDoorActivity.REGISTERFAIL, EVENT_SIP_REGISTER_STATUS));
-                    sipRegister();
-                }
-            } else {//注册失败
-
-                Log.e(TAG,"SIP注册失败");
-//                sipMessageCounts = CallingDoorActivity.REGISTERFAIL;
-//                EventBus.getDefault().post(new MessageEvent(CallingDoorActivity.REGISTERFAIL, EVENT_SIP_REGISTER_STATUS));
-                if (mSipThread != null) {
-                    mSipThread.interrupt();
-                    mSipThread = null;
-                }
-                sipRegister();
-            }
-            failUiRefreshSip();
-
-            if (msg.obj.toString().contains("autocall")) {
-                VvsipCall pCall = null;
-//                LogUtil.e(SipInfoTag, "onClick1");
-                for (VvsipCall _pCall : mVvsipCalls) {
-                    if (_pCall.cid > 0)
-//                        LogUtil.e(SipInfoTag, "state#" + _pCall.mState);
-                        if (_pCall.cid > 0 && _pCall.mState <= 2) {
-                            pCall = _pCall;
-                            break;
-                        }
-                }
-//                LogUtil.e(SipInfoTag, "onClick2");
-                if (pCall == null)
-                    return;
-//                LogUtil.e(SipInfoTag, "onClick3#" + pCall.mState);
-                IVvsipService _service = VvsipService.getService();
-                if (_service == null)
-                    return;
-                VvsipTask _vvsipTask = _service.getVvsipTask();
-                if (_vvsipTask == null)
-                    return;
-                pCall.stop();
-                _service.setSpeakerModeOff();
-            }
-        }
-    };
-
-    /**
-     * UI刷新:SIP失败
-     */
-    private void failUiRefreshSip() {
-        if (!ethernetS) {
-//            sipMessageCounts = CallingDoorActivity.REGISTERFAIL;
-//            EventBus.getDefault().post(new MessageEvent(CallingDoorActivity.REGISTERFAIL, EVENT_SIP_REGISTER_STATUS));
-            if (mSipThread != null) {
-                mSipThread.interrupt();
-                mSipThread = null;
-            }
-//            LogUtil.e(SipInfoTag, "以太网断开,SIP UI状态刷新为失败");
-        }
-    }
-
-    /**
-     * ====================Sip注册======================
-     */
-    private Thread mSipThread;
-
-    private static class SipThread extends Thread {
-        WeakReference<NurseHomeActivity> mThreadCallingDoorActivity;
-
-        public SipThread(NurseHomeActivity activity) {
-            mThreadCallingDoorActivity = new WeakReference<NurseHomeActivity>(
-                    activity);
-        }
-
-        @Override
-        public void run() {
-            super.run();
-            if (mThreadCallingDoorActivity == null)
-                return;
-            if (mThreadCallingDoorActivity.get() != null) {
-                VvsipService sipService = VvsipService.getService();
-                try {
-                    if (sipService != null && !SipHelperUtil.getInstance(contexts).sipinfo.contains("200 OK") && ethernetS) {//注册正在进行中
-//                        sipMessageCounts = CallingDoorActivity.REGISTERING;
-//                        EventBus.getDefault().post(new MessageEvent(CallingDoorActivity.REGISTERING, EVENT_SIP_REGISTER_STATUS));
-                        sipService.register(SIP_IP +SIP_IP_PORT ,
-                                SIP_ID, SIP_PASS_WORD);
-                    //                        LogUtil.i(SipInfoTag, "Sip地址" + Constants.SIP_IP + SIP_IP_END + "\nSip账号" + Constants.SIP_ID + "\nSip密码" + Constants.SIP_PASS_WORD);
-                        handleCount++;
-                    //                        LogUtil.d(SipInfoTag, "Sip第-----" + (handleCount + 1) + "-------次註冊");
-//                        LogUtil.e(SipInfoTag, "以太网连接,SIP UI状态刷新为注册中");
-                    } else if (sipService != null && SipHelperUtil.getInstance(contexts).sipinfo.contains("200 OK")) {
-//                        sipMessageCounts = CallingDoorActivity.REGISTERCOM;
-//                        EventBus.getDefault().post(new MessageEvent(CallingDoorActivity.REGISTERCOM, EVENT_SIP_REGISTER_STATUS));
-                    }
-                } catch (NullPointerException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-
-    private void sipRegister() {
-        synchronized (this) {
-            mSipThread = new SipThread((NurseHomeActivity) contexts);
-            if (handleCount < 3) {
-                if (mCountDownAutoTimer == null) {
-                    mCountDownAutoTimer = new CountDownTimer(10000, 1000) {
-                        @Override
-                        public void onTick(long l) {
-//                            LogUtil.d(SipInfoTag, "已經註冊第" + (handleCount + 1) + "次:" + l / 1000 + "秒后重啟註冊");
-                        }
-
-                        @Override
-                        public void onFinish() {
-                            handleCount = 0;
-                            if (mSipThread != null) {
-                                mSipThread.start();
-                            }
-                            if (mCountDownAutoTimer != null) {
-                                mCountDownAutoTimer.cancel();
-                                mCountDownAutoTimer = null;
-                            }
-                        }
-
-                    };
-                    mCountDownAutoTimer.start();
-                }
-                return;
-            } else {
-                if (mCountDownAutoTimer != null) {
-                    mCountDownAutoTimer.cancel();
-                    mCountDownAutoTimer = null;
-                }
-            }
-            if (handleCount == 0) {
-                mSipThread.start();
-            }
-        }
-    }
-
-    public void setmSipThread(Thread mSipThread) {
-        this.mSipThread = mSipThread;
-    }
-
-    public Thread getmSipThread() {
-        return mSipThread;
-    }
-
-    /**
-     * 开始通话
-     */
-    public void startCall(String sipUseName) {
-        IVvsipService sipService = VvsipService.getService();
-        if (sipService == null) return;
-        //----------------------------------------------携带Mac地址(暂时无用)--------------------------------------------------//
-        sipService.initiateOutgoingCall(sipUseName, "");
-    }
-
-    /**
-     * 结束通话
-     */
-    public void endCall() {
-        VvsipCall call = null;
-        for (VvsipCall pCall : mVvsipCalls) {
-            if (pCall.cid > 0 && pCall.mState <= 2) {
-                call = pCall;
-                break;
-            }
-        }
-        if (call == null) return;
-        IVvsipService sipService = VvsipService.getService();
-        if (sipService == null) return;
-        VvsipTask sipTask = sipService.getVvsipTask();
-        if (sipTask == null) return;
-        VvsipService.getService().mainEndCall(CALLING_ENDING);
-        call.stop();
-        sipService.setSpeakerModeOff();
-        sipService.stopPlayer();
-        sipService.setAudioNormalMode();
-
-    }
-
-    /**
-     * 添加一个电话呼叫对象
-     *
-     * @param call
-     */
-    public void addCallObject(final VvsipCall call) {
-        ((Activity) contexts).runOnUiThread(new Runnable() {
-            public void run() {
-                try {
-                    if (call == null) {
-                        return;
-                    }
-
-                    if (mVvsipCalls == null)
-                        return;
-                    mVvsipCalls.add(call);
-
-                    if (Build.VERSION.SDK_INT >= 5) {
-                        ((Activity) contexts).getWindow().addFlags( // WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
-                                // |
-                                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-                                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
-                                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                    }
-
-                } catch (Exception e) {
-//                    LogUtil.e(SipInfoTag, "onNewVvsipCallEvent: " + e);
-                }
-            }
-        });
-    }
-
-    /**
-     * 移除一个电话呼叫对象
-     *
-     * @param call
-     */
-    public void removeCallObject(final VvsipCall call) {
-        ((Activity) contexts).runOnUiThread(new Runnable() {
-            public void run() {
-                try {
-                    if (call == null) {
-                        return;
-                    }
-
-                    // 4 crash detected here for 4.0.9 with mVvsipCalls=NULL
-                    if (mVvsipCalls == null)
-                        return;
-                    mVvsipCalls.remove(call);
-
-                    if (mVvsipCalls.size() == 0) {
-                        if (Build.VERSION.SDK_INT >= 5) {
-                            ((Activity) contexts).getWindow()
-                                    .clearFlags( // WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
-                                            // |
-                                            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-                                                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
-                                                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-                        }
-                    }
-                } catch (Exception e) {
-//                    Log.e(SipInfoTag, "onRemoveVvsipCallEvent: " + e);
-                }
-            }
-        });
-    }
-
-    /**
-     * 自动接电话
-     */
-    public void autoTalking() {
-        if (mVvsipCalls == null) {
-            mVvsipCalls = new ArrayList<VvsipCall>();
-        }
-        for (VvsipCall _pCall : mVvsipCalls) {
-            if (_pCall.cid > 0 && _pCall.mState < 2 && _pCall.mIncomingCall) {
-                // ANSWER EXISTING CALL
-                int i = _pCall.answer(200, 1);
-//                LogUtil.d(SipInfoTag, "ANSWER EXISTING CALL");
-                IVvsipService _service = VvsipService.getService();
-                if (_service != null) {
-                    if (i >= 0) {
-                        _service.stopPlayer();
-                        _service.setSpeakerModeOff();
-                        _service.setAudioInCallMode();
-                    }
-                }
-                break;
-            }
-        }
-    }
-
-    public static boolean isServiceRunning(Context mContext, String className) {
-
-        boolean isRunning = false;
-        ActivityManager activityManager = (ActivityManager) mContext
-                .getSystemService(Context.ACTIVITY_SERVICE);
-        List<ActivityManager.RunningServiceInfo> serviceList = activityManager
-                .getRunningServices(30);
-
-        if (!(serviceList.size() > 0)) {
-            return false;
-        }
-
-        for (int i = 0; i < serviceList.size(); i++) {
-            if (serviceList.get(i).service.getClassName().equals(className) == true) {
-                isRunning = true;
-                break;
-            }
-        }
-        return isRunning;
-    }
-
-    /**
-     * #############################
-     * <p>
-     * Sip启动服务.
-     * <p>
-     * #############################
-     */
-    private static Handler sipServiceStartHandler = null;
-    private static Runnable sipServiceStartRunnable = null;
-    private static ServiceConnection sipServiceConnection;
-
-    public static Runnable getSipServiceStartRunnable() {
-        return sipServiceStartRunnable;
-    }
-
-    public static Handler getSipServiceStartHandler() {
-        return sipServiceStartHandler;
-    }
-
-    public static ServiceConnection getSipServiceConnection() {
-        return sipServiceConnection;
-    }
-
-    public static void setSipServiceConnection(ServiceConnection sipServiceConnections) {
-        sipServiceConnection = sipServiceConnections;
-    }
-
-    /**
-     * 启动服务
-     */
-    public static Boolean isRegister = false;//是否注册
-
-    public void sipStartService() {
-        sipServiceStartHandler = new Handler();
-
-        sipServiceStartRunnable = new Runnable() {
-            public void run() {
-
-                Intent intent = new Intent(contexts.getApplicationContext(), VvsipService.class);
-                contexts.startService(intent);
-
-                sipServiceConnection = new ServiceConnection() {
-                    public void onServiceConnected(ComponentName name, IBinder service) {
-                        IVvsipService sipservice = ((VvsipServiceBinder) service).getService();
-                        if (contexts instanceof IVvsipServiceListener) {
-                            sipservice.addListener((IVvsipServiceListener) contexts);
-//                            LogUtil.i(SipInfoTag, "Connected!");
-                            SipHelperUtil.getInstance(contexts).obtainSipInfo();//Sip信息获取
-                        }
-                    }
-
-                    public void onServiceDisconnected(ComponentName name) {
-//                        LogUtil.i(SipInfoTag, "Disconnected!");
-                    }
-                };
-                if (!SipHelperUtil.isServiceRunning(contexts, "com.vvsip.ansip.VvsipService")) {
-                    isRegister = contexts.bindService(intent, sipServiceConnection, Context.BIND_AUTO_CREATE);
-                }
-            }
-        };
-
-        sipServiceStartHandler.postDelayed(sipServiceStartRunnable, 0);
-    }
-
-    /**
-     * 用来解析错误代码
-     */
-    public static String analyseErrorCode(String errorCode) {
-        switch (errorCode) {
-            case "200":
-                return "成功";
-            case "408":
-                return "请求超时";
-            case "400":
-                return "服务器不支持请求的语法";
-            case "401":
-                return "未授权";
-            case "403":
-                return "服务器禁止请求";
-            case "404":
-                return "服务器找不到";
-            default:
-                return "未知错误";
-        }
-    }
-
-    //======================Sip回调接口=====================
-    private SipCallBack mSipCallBack;
-
-    public void setSipCallBack(SipCallBack mSipCallBack) {
-        this.mSipCallBack = mSipCallBack;
-    }
-
-    public SipCallBack getmSipCallBack() {
-        return mSipCallBack;
-    }
-
-    //======================以太网和wifi状态接口=====================
-    private EthernetWifiCallBack mEthernetWifiCallBack;
-
-    public void setEthernetWifiCallBack(EthernetWifiCallBack mEthernetWifiCallBack) {
-        this.mEthernetWifiCallBack = mEthernetWifiCallBack;
-    }
-
-    public EthernetWifiCallBack getmEthernetWifiCallBack() {
-        return mEthernetWifiCallBack;
-    }
-
-    private static boolean ethernetS = true;//获取以太网状态
-    private static boolean wifiS = false;//获取wifi状态
-
-    @Override
-    public boolean ethernetStatus(boolean status) {
-        ethernetS = status;
-        return status;
-    }
-
-    @Override
-    public boolean wifiStatus(boolean status) {
-        wifiS = status;
-        return status;
-    }
-}

+ 188 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/LockScreenActivity.kt

@@ -0,0 +1,188 @@
+package com.wdkl.ncs.android.component.nursehome.activity
+
+import android.support.v7.widget.RecyclerView
+import android.support.v7.widget.helper.ItemTouchHelper
+import android.util.Log
+import android.view.View
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.adapter.IncomingCallAdapter
+import com.wdkl.ncs.android.component.nursehome.databinding.LockScreenActivityBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.component.nursehome.util.*
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.DeviceContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
+import com.wdkl.ncs.android.middleware.model.PhoneBookItem
+import com.wdkl.ncs.android.middleware.model.vo.ClerkVO
+import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import kotlinx.android.synthetic.main.lock_screen_activity.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import serialporttest.utils.StringUtils
+
+class LockScreenActivity : BaseActivity<DevicePresenter, LockScreenActivityBinding>(), DeviceContract.View, IncomingCallAdapter.UpdateCallback {
+    val TAG = LockScreenActivity::class.java.simpleName
+
+    private var incomingCallAdapter: IncomingCallAdapter? = null
+
+    override fun getLayId(): Int {
+        return R.layout.lock_screen_activity
+    }
+
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        incomingCallAdapter = IncomingCallAdapter(activity, ArrayList())
+        lock_incoming_call_list.layoutManager = VirtualLayoutManager(activity)
+        lock_incoming_call_list.adapter = incomingCallAdapter
+
+        val touchCallback: ItemTouchHelper.Callback =
+            object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
+                override fun onMove(
+                    recyclerView: RecyclerView,
+                    viewHolder: RecyclerView.ViewHolder,
+                    target: RecyclerView.ViewHolder
+                ): Boolean {
+                    return false
+                }
+
+                override fun onSwiped(
+                    viewHolder: RecyclerView.ViewHolder,
+                    direction: Int
+                ) {
+                    val pos = viewHolder.adapterPosition
+                    if (pos < Constants.callingList.size) {
+                        RingPlayHelper.stopRingTone()
+                        SpeechUtil.getInstance().stopSpeak(true)
+
+                        EventBus.getDefault().post(MessageEvent(Constants.callingList[pos], Constants.EVENT_REMOVE_CALL))
+                    }
+                }
+            }
+        val itemTouchHelper = ItemTouchHelper(touchCallback)
+        itemTouchHelper.attachToRecyclerView(lock_incoming_call_list)
+
+        incomingCallAdapter?.setUpdateCallback(this)
+        incomingCallAdapter?.updateCallList()
+    }
+
+    override fun bindEvent() {
+        screen_lock_view.setInputListener {
+            //密码匹配
+            val psw = TimeTransition.getDateTime("ddHH")
+            //Log.d(TAG, "psw: $psw, input: $it")
+            if (psw == it) {
+                //用户解锁
+                Constants.showCallOnLock = false
+                EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK))
+                //finish()
+            } else {
+                screen_lock_view.showErrorStatus()
+                showMessage(R.string.invalid_password)
+            }
+        }
+    }
+
+    override fun onWindowFocusChanged(hasFocus: Boolean) {
+        super.onWindowFocusChanged(hasFocus)
+        Log.e(TAG, "onWindowFocusChanged: $hasFocus")
+        if (hasFocus) {
+            Constants.showLock = true
+            EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK_FLOAT_VIEW))
+        }
+    }
+
+    override fun onStop() {
+        super.onStop()
+
+        Constants.showLock = false
+    }
+
+    override fun destory() {
+        Constants.showLock = false
+    }
+
+    override fun onBackPressed() {
+        //禁用返回
+    }
+
+
+    override fun showData(data: NurseDeviceInfoVO) {
+        //
+    }
+
+    override fun showPhoneBook(data: ArrayList<PhoneBookItem>) {
+
+    }
+
+    override fun showClerk(clerk: ClerkVO) {
+        BaseApplication.userTouchTime = System.currentTimeMillis()
+        Constants.showCallOnLock = false
+        showMessage(getString(R.string.str_unlock_success, clerk.clerkName))
+        //finish()
+        EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK))
+    }
+
+    override fun onNoneNet() {
+        showMessage("onNoneNet")
+    }
+
+    override fun onError(message: String, type: Int) {
+        //showMessage(message)
+        showMessage(R.string.str_unlock_deny)
+    }
+
+    override fun complete(message: String, type: Int) {
+        //
+    }
+
+    override fun start() {
+        //
+    }
+
+    override fun networkMonitor(state: NetState) {
+        //
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        when (messageEvent.getType()) {
+            Constants.EVENT_DISMISS_LOCK -> {
+                //退出锁屏
+                finish()
+            }
+
+            Constants.EVENT_UPDATE_LOCK_INCOMING_CALLS -> {
+                incomingCallAdapter?.updateCallList()
+            }
+
+            Constants.EVENT_NFC_UPDATE -> {
+                //比对刷卡数据
+                val hexNo = messageEvent.getMessage() as String
+                val decNo = StringUtils.bytesToTenNum(hexNo)
+
+                Log.d(TAG, "nfc hexNo: $hexNo, decNo: $decNo, lock screen focused: " + hasWindowFocus())
+                if (hasWindowFocus()) {
+                    presenter.checkClerk(Constants.part_id, hexNo)
+                }
+            }
+        }
+    }
+
+    override fun onUpdateCalls() {
+        if (Constants.callingList.size == 0) {
+            ll_incoming_call.visibility = View.GONE
+        } else {
+            ll_incoming_call.visibility = View.VISIBLE
+        }
+    }
+}

+ 88 - 25
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -31,6 +31,7 @@ import com.wdkl.ncs.android.component.nursehome.fragment.*
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
 import com.wdkl.ncs.android.component.nursehome.led.LedItem
 import com.wdkl.ncs.android.component.nursehome.led.LedItem
 import com.wdkl.ncs.android.component.nursehome.led.LedManagerUtils
 import com.wdkl.ncs.android.component.nursehome.led.LedManagerUtils
+import com.wdkl.ncs.android.component.nursehome.service.LockService
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.nursehome.util.*
 import com.wdkl.ncs.android.component.nursehome.util.*
 import com.wdkl.ncs.android.component.nursehome.window.IncidentWindow
 import com.wdkl.ncs.android.component.nursehome.window.IncidentWindow
@@ -75,7 +76,9 @@ import org.greenrobot.eventbus.ThreadMode
 import org.linphone.core.Call
 import org.linphone.core.Call
 import org.linphone.core.RegistrationState
 import org.linphone.core.RegistrationState
 import org.linphone.core.TransportType
 import org.linphone.core.TransportType
+import serialporttest.utils.SerialPortNfcUtil
 import serialporttest.utils.SerialPortUtil
 import serialporttest.utils.SerialPortUtil
+import serialporttest.utils.StringUtils
 import java.io.File
 import java.io.File
 import java.io.FileOutputStream
 import java.io.FileOutputStream
 import java.io.PrintWriter
 import java.io.PrintWriter
@@ -103,19 +106,15 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
     private var skyCallFragment: Fragment? = null
     private var skyCallFragment: Fragment? = null
 
 
     private var receiver :TimeReceiver? = null
     private var receiver :TimeReceiver? = null
-
+    private var lockStart: Boolean = false
 
 
     companion object {
     companion object {
-        var sosItemList = ArrayList<CallingItem>()
-        var callingList = ArrayList<CallingItem>()
-        //var roomCheckMap: MutableMap<String, String> = HashMap()
-        //var positionMap: MutableMap<String, String> = HashMap()
         var roomCheckList = ArrayList<String>()
         var roomCheckList = ArrayList<String>()
         var framePartData: FramePartVO? = null
         var framePartData: FramePartVO? = null
 
 
         fun checkIncomingCall(bedDeviceId: Int?): Boolean {
         fun checkIncomingCall(bedDeviceId: Int?): Boolean {
-            if (callingList.size > 0) {
-                for (item in callingList) {
+            if (Constants.callingList.size > 0) {
+                for (item in Constants.callingList) {
                     if (item.interactionVO.fromDeviceId == bedDeviceId) {
                     if (item.interactionVO.fromDeviceId == bedDeviceId) {
                         return true
                         return true
                     }
                     }
@@ -178,7 +177,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                 //通话状态回调监听
                 //通话状态回调监听
                 override fun incomingCall(call: Call) {
                 override fun incomingCall(call: Call) {
                     //如果当前在通话界面则说明接听了通话,此时将自动接听,否则挂断
                     //如果当前在通话界面则说明接听了通话,此时将自动接听,否则挂断
-                    if (Constants.showCall || Constants.bcVoiceOn || Constants.entranceCall) {
+                    if (Constants.IN_CALL || Constants.bcVoiceOn || Constants.entranceCall) {
                         linphoneManager?.answerCall(call, Constants.supportCamera)
                         linphoneManager?.answerCall(call, Constants.supportCamera)
                     } else {
                     } else {
                         call.terminate()
                         call.terminate()
@@ -301,6 +300,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         Thread {
         Thread {
             AppUtil.changePingMode()
             AppUtil.changePingMode()
 
 
+            //NFC serial port
+            SerialPortNfcUtil.getInstance().openSerialPort()
+
             // 初始化 GStreamer
             // 初始化 GStreamer
             try {
             try {
                 GStreamer.init(BaseApplication.appContext)
                 GStreamer.init(BaseApplication.appContext)
@@ -557,6 +559,29 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         system_settings_radio_bt.setOnClickListener(this)
         system_settings_radio_bt.setOnClickListener(this)
         led_settings_radio_bt.setOnClickListener(this)
         led_settings_radio_bt.setOnClickListener(this)
         nb_device_radio_bt.setOnClickListener(this)
         nb_device_radio_bt.setOnClickListener(this)
+
+        SerialPortNfcUtil.getInstance().setOnDataReceiveStringListener { buffer, size ->
+            try {
+                //NFC串口数据
+                //fe080304002fa5111286
+                val bytes = Arrays.copyOfRange(buffer, 0, size)
+                val receiveData: String = StringUtils.bytesToHex(bytes).toUpperCase(Locale.ROOT)
+                Log.e(TAG, "received nfc data: $receiveData")
+
+                if (bytes.size >= 10 && bytes[0] == 0xFE.toByte() && bytes[2] == 0x03.toByte()) {
+                    if (bytes[3] == 0x04.toByte() && bytes[4] == 0x00.toByte()) {
+                        //卡类型: MF1 S50
+                        val cardNo = Arrays.copyOfRange(bytes, 5, bytes.size - 1)
+                        val hexCardNo = StringUtils.bytesToHex(cardNo)  //.toUpperCase(Locale.ROOT)
+
+                        Log.d(TAG, "nfc hexCardNo: $hexCardNo")
+                        EventBus.getDefault().post(MessageEvent(hexCardNo, Constants.EVENT_NFC_UPDATE))
+                    }
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
     }
     }
     /**
     /**
      *页面销毁回调
      *页面销毁回调
@@ -569,6 +594,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         SerialPortUtil.getInstance().closeHeart()
         SerialPortUtil.getInstance().closeHeart()
         SerialPortUtil.getInstance().closeSerialPort()
         SerialPortUtil.getInstance().closeSerialPort()
         SoundPoolManager.getInstance().release()
         SoundPoolManager.getInstance().release()
+
+        SerialPortNfcUtil.getInstance().closeSerialPort()
     }
     }
 
 
     override fun onNoneNet() {
     override fun onNoneNet() {
@@ -763,6 +790,14 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                 SettingConfiguration.getInstance().transferDurationLeader = 30
                 SettingConfiguration.getInstance().transferDurationLeader = 30
             }
             }
 
 
+            if (data.hostDeviceLock != null && data.hostDeviceLock == 1) {
+                Constants.enableLock = true
+            } else {
+                Constants.enableLock = false
+                //解除锁屏
+                EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK))
+            }
+
             SettingConfiguration.getInstance().doctorTitle = data.doctorTitle
             SettingConfiguration.getInstance().doctorTitle = data.doctorTitle
             SettingConfiguration.getInstance().nurseTitle = data.nurseTitle
             SettingConfiguration.getInstance().nurseTitle = data.nurseTitle
             if (data.doctorValid != null) {
             if (data.doctorValid != null) {
@@ -816,8 +851,22 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             if (!TextUtils.isEmpty(Constants.sip_id) && !TextUtils.isEmpty(Constants.sip_ip)) {
             if (!TextUtils.isEmpty(Constants.sip_id) && !TextUtils.isEmpty(Constants.sip_ip)) {
                 linphoneManager?.createProxyConfig(Constants.sip_id!!, Constants.sip_id!!, "${Constants.sip_ip}:5060", TransportType.Udp)
                 linphoneManager?.createProxyConfig(Constants.sip_id!!, Constants.sip_id!!, "${Constants.sip_ip}:5060", TransportType.Udp)
                 sipReg = true
                 sipReg = true
+            } else {
+                showMessage("SIP empty!")
             }
             }
         }
         }
+
+        if (Constants.enableLock && !lockStart) {
+            //锁屏检测服务
+            val lockService = Intent(BaseApplication.appContext, LockService::class.java)
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                startForegroundService(lockService)
+            } else {
+                startService(lockService)
+            }
+
+            lockStart = true
+        }
     }
     }
 
 
     fun loadLedDevice() {
     fun loadLedDevice() {
@@ -1152,8 +1201,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             SettingConfiguration.getInstance().hostTransferDuration = 30
             SettingConfiguration.getInstance().hostTransferDuration = 30
         }
         }
         //紧急呼叫转移
         //紧急呼叫转移
-        if (sosItemList.size > 0) {
-            val iterator = sosItemList.iterator()
+        if (Constants.sosItemList.size > 0) {
+            val iterator = Constants.sosItemList.iterator()
             while (iterator.hasNext()) {
             while (iterator.hasNext()) {
                 val it = iterator.next()
                 val it = iterator.next()
                 if (System.currentTimeMillis() - it.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
                 if (System.currentTimeMillis() - it.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
@@ -1172,8 +1221,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         }
         }
 
 
         //语音呼叫转移
         //语音呼叫转移
-        if (callingList.size > 0) {
-            val iterator2 = callingList.iterator()
+        if (Constants.callingList.size > 0) {
+            val iterator2 = Constants.callingList.iterator()
             while (iterator2.hasNext()) {
             while (iterator2.hasNext()) {
                 val item = iterator2.next()
                 val item = iterator2.next()
                 if (System.currentTimeMillis() - item.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
                 if (System.currentTimeMillis() - item.startTime >= SettingConfiguration.getInstance().hostTransferDuration*1000L) {
@@ -1188,7 +1237,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                             SpeechUtil.getInstance().removeSpeak(text)
                             SpeechUtil.getInstance().removeSpeak(text)
                         } else {
                         } else {
                             //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
                             //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
-                            if (callingList.size == 1) {
+                            if (Constants.callingList.size == 1) {
                                 RingPlayHelper.stopRingTone()
                                 RingPlayHelper.stopRingTone()
                             }
                             }
                         }
                         }
@@ -1232,8 +1281,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         }
         }
 
 
         //语音呼叫超时清除
         //语音呼叫超时清除
-        if (callingList.size > 0) {
-            val iterator = callingList.iterator()
+        if (Constants.callingList.size > 0) {
+            val iterator = Constants.callingList.iterator()
             while (iterator.hasNext()) {
             while (iterator.hasNext()) {
                 val item = iterator.next()
                 val item = iterator.next()
                 if (System.currentTimeMillis() - item.startTime >= time) {
                 if (System.currentTimeMillis() - item.startTime >= time) {
@@ -1244,7 +1293,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                             SpeechUtil.getInstance().removeSpeak(text)
                             SpeechUtil.getInstance().removeSpeak(text)
                         } else {
                         } else {
                             //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
                             //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
-                            if (callingList.size == 1) {
+                            if (Constants.callingList.size == 1) {
                                 RingPlayHelper.stopRingTone()
                                 RingPlayHelper.stopRingTone()
                             }
                             }
                         }
                         }
@@ -1477,6 +1526,15 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         MediaPlayHelper.getInstance().resumeMusic()
                         MediaPlayHelper.getInstance().resumeMusic()
                     }
                     }
                 }
                 }
+
+                if (Constants.enableLock) {
+                    //如果通话之前是锁屏状态则通话完毕直接进入锁屏状态,否则重置锁屏计时
+                    if (Constants.showCallOnLock) {
+                        EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_SHOW_LOCK))
+                    } else {
+                        BaseApplication.userTouchTime = System.currentTimeMillis()
+                    }
+                }
             }
             }
 
 
             //Sip注册状态
             //Sip注册状态
@@ -1629,7 +1687,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         //是否开启呼叫转移
                         //是否开启呼叫转移
                         //if (SettingConfiguration.getInstance().transferCall) {
                         //if (SettingConfiguration.getInstance().transferCall) {
                             val sosItem = CallingItem(tcpModel.tid, System.currentTimeMillis(), interactionVO, tcpModel.action)
                             val sosItem = CallingItem(tcpModel.tid, System.currentTimeMillis(), interactionVO, tcpModel.action)
-                            sosItemList.add(sosItem)
+                            Constants.sosItemList.add(sosItem)
                         //}
                         //}
 
 
                         EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_REFRESH_CALL_LIST))
                         EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_REFRESH_CALL_LIST))
@@ -1672,8 +1730,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         }
                         }
 
 
                         LedHelper.updateLedInfo(interactionVO, false, true)
                         LedHelper.updateLedInfo(interactionVO, false, true)
-                        if (sosItemList.size > 0) {
-                            val iterator = sosItemList.iterator()
+                        if (Constants.sosItemList.size > 0) {
+                            val iterator = Constants.sosItemList.iterator()
                             while (iterator.hasNext()) {
                             while (iterator.hasNext()) {
                                 val it = iterator.next()
                                 val it = iterator.next()
                                 if (it.interactionVO.id == interactionVO.id) {
                                 if (it.interactionVO.id == interactionVO.id) {
@@ -1685,9 +1743,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         declineSosItem(interactionVO)
                         declineSosItem(interactionVO)
                     } else if (tcpModel.action == TcpAction.SOSAction.CANCELED) {
                     } else if (tcpModel.action == TcpAction.SOSAction.CANCELED) {
                         //紧急呼叫被其他设备处理,本机同时移除
                         //紧急呼叫被其他设备处理,本机同时移除
-                        if (sosItemList.size > 0 && tcpModel.data is String) {
+                        if (Constants.sosItemList.size > 0 && tcpModel.data is String) {
                             val itId = tcpModel.data.toString().toInt()
                             val itId = tcpModel.data.toString().toInt()
-                            val iterator = sosItemList.iterator()
+                            val iterator = Constants.sosItemList.iterator()
                             while (iterator.hasNext()) {
                             while (iterator.hasNext()) {
                                 val it = iterator.next()
                                 val it = iterator.next()
                                 if (it.interactionVO.id == itId) {
                                 if (it.interactionVO.id == itId) {
@@ -2174,16 +2232,12 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                 Constants.interactionId = item.id
                 Constants.interactionId = item.id
                 Constants.targetSipId = item.fromSipId
                 Constants.targetSipId = item.fromSipId
                 Constants.fromDeviceType = item.fromDeviceType
                 Constants.fromDeviceType = item.fromDeviceType
-                //callInteractionVO = interactionVO
 
 
                 SpeechUtil.getInstance().stopSpeak(true)
                 SpeechUtil.getInstance().stopSpeak(true)
                 RingPlayHelper.stopRingTone()
                 RingPlayHelper.stopRingTone()
 
 
                 //通话之前先判断webrtc socket是否连接上,否则不能建立通话
                 //通话之前先判断webrtc socket是否连接上,否则不能建立通话
                 if (Constants.tcp_connected) {
                 if (Constants.tcp_connected) {
-                    //Constants.CALL_STATE = Constants.CALL_CALLING
-                    //DeviceChannel.calling = true
-
                     var name: String? = ""
                     var name: String? = ""
                     if (DeviceTypeEnum.DOCTOR_HOST.value() == item.fromDeviceType
                     if (DeviceTypeEnum.DOCTOR_HOST.value() == item.fromDeviceType
                         || DeviceTypeEnum.NURSE_HOST.value() == item.fromDeviceType
                         || DeviceTypeEnum.NURSE_HOST.value() == item.fromDeviceType
@@ -2237,6 +2291,15 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                     tv_broadcast_state.visibility = View.INVISIBLE
                     tv_broadcast_state.visibility = View.INVISIBLE
                 }
                 }
             }
             }
+
+            Constants.EVENT_SHOW_LOCK -> {
+                //if (!Constants.showLock) {
+                    val intent = Intent()
+                    intent.setClass(activity.applicationContext, LockScreenActivity::class.java)
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                    startActivity(intent)
+                //}
+            }
         }
         }
 
 
     }
     }

+ 12 - 5
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt

@@ -28,6 +28,7 @@ import com.wdkl.ncs.android.middleware.logic.contract.nursehome.DeviceContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
 import com.wdkl.ncs.android.middleware.model.PhoneBookItem
 import com.wdkl.ncs.android.middleware.model.PhoneBookItem
 import com.wdkl.ncs.android.middleware.model.ThirdServerInfo
 import com.wdkl.ncs.android.middleware.model.ThirdServerInfo
+import com.wdkl.ncs.android.middleware.model.vo.ClerkVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 import com.wdkl.ncs.android.middleware.udp.ServerInfoUtil
 import com.wdkl.ncs.android.middleware.udp.ServerInfoUtil
 import com.wdkl.ncs.android.middleware.utils.CommonUtils
 import com.wdkl.ncs.android.middleware.utils.CommonUtils
@@ -69,9 +70,9 @@ class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(
      * 提供layoutID
      * 提供layoutID
      */
      */
     override fun getLayId(): Int {
     override fun getLayId(): Int {
-        if (BuildConfig.OEM_NAME == "legrand") {
+        /*if (BuildConfig.OEM_NAME == "legrand") {
             setTheme(R.style.LegrandAppTheme)
             setTheme(R.style.LegrandAppTheme)
-        }
+        }*/
 
 
         return R.layout.activity_register
         return R.layout.activity_register
     }
     }
@@ -85,11 +86,13 @@ class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(
      *初始化操作
      *初始化操作
      */
      */
     override fun init() {
     override fun init() {
-        AppTool.SystemUI.showNavigationBar(this,false)
+        AppTool.SystemUI.showNavigationBar(this, false)
         AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
         AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
 
 
-        //open serial port
-        SerialPortUtil.getInstance().openSerialPort()
+        Thread {
+            //open serial port
+            SerialPortUtil.getInstance().openSerialPort()
+        }.start()
 
 
         requestPermissions()
         requestPermissions()
 
 
@@ -419,6 +422,10 @@ class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(
 
 
     }
     }
 
 
+    override fun showClerk(clerk: ClerkVO) {
+
+    }
+
     /**
     /**
      *绑定事件
      *绑定事件
      */
      */

+ 5 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/TestActivity.kt

@@ -13,6 +13,7 @@ import com.wdkl.ncs.android.middleware.helper.RecordHelper
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.DeviceContract
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.DeviceContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
 import com.wdkl.ncs.android.middleware.model.PhoneBookItem
 import com.wdkl.ncs.android.middleware.model.PhoneBookItem
+import com.wdkl.ncs.android.middleware.model.vo.ClerkVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.EventBus
@@ -83,6 +84,10 @@ class TestActivity : BaseActivity<DevicePresenter, TestActivityBinding>(), Devic
 
 
     }
     }
 
 
+    override fun showClerk(clerk: ClerkVO) {
+
+    }
+
     override fun onNoneNet() {
     override fun onNoneNet() {
         //
         //
     }
     }

+ 5 - 11
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/CallingItemAdapter.kt

@@ -72,10 +72,6 @@ class CallingItemAdapter : RecyclerView.Adapter<CallingItemAdapter.ParentViewHol
                     removeCall(itemData, true)
                     removeCall(itemData, true)
                 }
                 }
             }
             }
-
-            /*holder?.callingReject?.setOnClickListener {
-                removeCall(itemData)
-            }*/
         } catch (ex : Exception) {
         } catch (ex : Exception) {
             ex.printStackTrace()
             ex.printStackTrace()
         }
         }
@@ -87,21 +83,21 @@ class CallingItemAdapter : RecyclerView.Adapter<CallingItemAdapter.ParentViewHol
 
 
     fun addCall(callingItem: CallingItem) {
     fun addCall(callingItem: CallingItem) {
         synchronized(this) {
         synchronized(this) {
-            val iterator = NurseHomeActivity.callingList.iterator()
+            val iterator = Constants.callingList.iterator()
             while (iterator.hasNext()) {
             while (iterator.hasNext()) {
                 val it = iterator.next()
                 val it = iterator.next()
                 if (callingItem.interactionVO.fromDeviceId == it.interactionVO.fromDeviceId) {
                 if (callingItem.interactionVO.fromDeviceId == it.interactionVO.fromDeviceId) {
                     iterator.remove()
                     iterator.remove()
                 }
                 }
             }
             }
-            NurseHomeActivity.callingList.add(callingItem)
+            Constants.callingList.add(callingItem)
             updateCallList()
             updateCallList()
         }
         }
     }
     }
 
 
     private fun updateCallList() {
     private fun updateCallList() {
         callingData.clear()
         callingData.clear()
-        callingData.addAll(NurseHomeActivity.callingList)
+        callingData.addAll(Constants.callingList)
         notifyDataSetChanged()
         notifyDataSetChanged()
 
 
         if (updateCallback != null) {
         if (updateCallback != null) {
@@ -116,7 +112,7 @@ class CallingItemAdapter : RecyclerView.Adapter<CallingItemAdapter.ParentViewHol
         }
         }
 
 
         synchronized(this) {
         synchronized(this) {
-            val iterator = NurseHomeActivity.callingList.iterator()
+            val iterator = Constants.callingList.iterator()
             while (iterator.hasNext()) {
             while (iterator.hasNext()) {
                 val it = iterator.next()
                 val it = iterator.next()
                 if (interactionVO.id.equals(it.interactionVO.id)) {
                 if (interactionVO.id.equals(it.interactionVO.id)) {
@@ -137,7 +133,7 @@ class CallingItemAdapter : RecyclerView.Adapter<CallingItemAdapter.ParentViewHol
         synchronized(this) {
         synchronized(this) {
             val removeItem = callingData.get(position)
             val removeItem = callingData.get(position)
             EventBus.getDefault().post(MessageEvent(removeItem, Constants.EVENT_REJECT_CALL))
             EventBus.getDefault().post(MessageEvent(removeItem, Constants.EVENT_REJECT_CALL))
-            val iterator = NurseHomeActivity.callingList.iterator()
+            val iterator = Constants.callingList.iterator()
             while (iterator.hasNext()) {
             while (iterator.hasNext()) {
                 val it = iterator.next()
                 val it = iterator.next()
                 if (removeItem.interactionVO.id.equals(it.interactionVO.id)) {
                 if (removeItem.interactionVO.id.equals(it.interactionVO.id)) {
@@ -160,14 +156,12 @@ class CallingItemAdapter : RecyclerView.Adapter<CallingItemAdapter.ParentViewHol
         var callingName : TextView
         var callingName : TextView
         var callingTime : TextView
         var callingTime : TextView
         var callingAccept : ImageView
         var callingAccept : ImageView
-        var callingReject : ImageView
 
 
         constructor(itemView: View): super(itemView) {
         constructor(itemView: View): super(itemView) {
             callingBedName = itemView.findViewById(R.id.tv_calling_bed_name)
             callingBedName = itemView.findViewById(R.id.tv_calling_bed_name)
             callingName = itemView.findViewById(R.id.tv_calling_custom_name)
             callingName = itemView.findViewById(R.id.tv_calling_custom_name)
             callingTime = itemView.findViewById(R.id.tv_calling_time)
             callingTime = itemView.findViewById(R.id.tv_calling_time)
             callingAccept = itemView.findViewById(R.id.btn_call_accept)
             callingAccept = itemView.findViewById(R.id.btn_call_accept)
-            callingReject = itemView.findViewById(R.id.btn_call_reject)
         }
         }
     }
     }
 
 

+ 131 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/IncomingCallAdapter.kt

@@ -0,0 +1,131 @@
+package com.wdkl.ncs.android.component.nursehome.adapter
+
+import android.content.Context
+import android.support.v7.widget.RecyclerView
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.component.nursehome.util.RingPlayHelper
+import com.wdkl.ncs.android.component.nursehome.util.SpeechUtil
+import com.wdkl.ncs.android.component.nursehome.util.TimeTransition
+import com.wdkl.ncs.android.middleware.entity.CallingItem
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.tcp.enums.DeviceTypeEnum
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import org.greenrobot.eventbus.EventBus
+
+class IncomingCallAdapter : RecyclerView.Adapter<IncomingCallAdapter.ParentViewHolder> {
+    private var context: Context
+    private var incomingCalls: ArrayList<CallingItem>
+    private var updateCallback: UpdateCallback? = null
+
+    constructor(context: Context, data: ArrayList<CallingItem>) {
+        this.context = context
+        this.incomingCalls = data
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ParentViewHolder {
+        val view = LayoutInflater.from(parent?.context).inflate(R.layout.adapter_calling_item, parent, false)
+        val viewHolder = ParentViewHolder(view)
+
+        return viewHolder
+    }
+
+    override fun onBindViewHolder(holder: ParentViewHolder?, position: Int) {
+        try {
+            val callingItem = incomingCalls.get(position)
+            val itemData = callingItem.interactionVO
+            var frameName: String? = ""
+            var memberName: String? = ""
+            if (DeviceTypeEnum.DOCTOR_HOST.value() == itemData.fromDeviceType
+                || DeviceTypeEnum.NURSE_HOST.value() == itemData.fromDeviceType
+                || DeviceTypeEnum.OTHER_HOST.value() == itemData.fromDeviceType) {
+                //医生机,护士主机,其他主机,总控主机等
+                frameName = itemData.fromDeviceName
+            } else if (DeviceTypeEnum.NURSE_WATCH.value() == itemData.fromDeviceType) {
+                //移动设备
+                frameName = itemData.fromMemberName
+            } else {
+                //其他
+                frameName = itemData.fromFrameFullName
+                memberName = itemData.fromMemberName
+            }
+
+            holder?.callingBedName?.text = frameName
+            holder?.callingName?.text = memberName
+            if (itemData.createDate != null) {
+                holder?.callingTime?.text = TimeTransition.stampToDateTime(itemData.createDate * 1000)
+            }
+
+            holder?.callingAccept?.setOnClickListener {
+                EventBus.getDefault().post(MessageEvent(callingItem, Constants.EVENT_ACCEPT_CALL))
+                removeCall(itemData, callingItem.tid, true)
+
+                EventBus.getDefault().post(MessageEvent(callingItem, Constants.EVENT_INCOMING_CALL_UPDATE))
+            }
+
+        } catch (ex : Exception) {
+            ex.printStackTrace()
+        }
+    }
+
+    override fun getItemCount(): Int {
+        return incomingCalls.size
+    }
+
+    fun updateCallList() {
+        incomingCalls.clear()
+        incomingCalls.addAll(Constants.callingList)
+        notifyDataSetChanged()
+
+        updateCallback?.onUpdateCalls()
+    }
+
+    fun removeCall(interactionVO: InteractionVO, tid: String, stop: Boolean) {
+        if (stop) {
+            RingPlayHelper.stopRingTone()
+            SpeechUtil.getInstance().stopSpeak(true)
+        }
+
+        synchronized(this) {
+            val iterator = Constants.callingList.iterator()
+            while (iterator.hasNext()) {
+                val it = iterator.next()
+                if (interactionVO.id.equals(it.interactionVO.id) || tid == it.tid) {
+                    iterator.remove()
+                }
+            }
+
+            updateCallList()
+        }
+    }
+
+    fun setUpdateCallback(callBack: UpdateCallback) {
+        updateCallback = callBack
+    }
+
+
+    class ParentViewHolder : RecyclerView.ViewHolder {
+        var callingBedName : TextView
+        var callingName : TextView
+        var callingTime : TextView
+        var callingAccept : ImageView
+
+        constructor(itemView: View): super(itemView) {
+            callingBedName = itemView.findViewById(R.id.tv_calling_bed_name)
+            callingName = itemView.findViewById(R.id.tv_calling_custom_name)
+            callingTime = itemView.findViewById(R.id.tv_calling_time)
+            callingAccept = itemView.findViewById(R.id.btn_call_accept)
+        }
+    }
+
+
+    interface UpdateCallback {
+        fun onUpdateCalls()
+    }
+}

+ 2 - 4
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/di/NurseHomeComponent.kt

@@ -1,9 +1,6 @@
 package com.wdkl.ncs.android.component.nursehome.di
 package com.wdkl.ncs.android.component.nursehome.di
 
 
-import com.wdkl.ncs.android.component.nursehome.activity.AppUpdateActivity
-import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity
-import com.wdkl.ncs.android.component.nursehome.activity.RegisterActivity
-import com.wdkl.ncs.android.component.nursehome.activity.TestActivity
+import com.wdkl.ncs.android.component.nursehome.activity.*
 import com.wdkl.ncs.android.component.nursehome.fragment.*
 import com.wdkl.ncs.android.component.nursehome.fragment.*
 import com.wdkl.ncs.android.middleware.di.ApplicationComponent
 import com.wdkl.ncs.android.middleware.di.ApplicationComponent
 import dagger.Component
 import dagger.Component
@@ -17,6 +14,7 @@ interface NurseHomeComponent{
     fun inject(activity: NurseHomeActivity)
     fun inject(activity: NurseHomeActivity)
     fun inject(activity: AppUpdateActivity)
     fun inject(activity: AppUpdateActivity)
     fun inject(activity: TestActivity)
     fun inject(activity: TestActivity)
+    fun inject(activity: LockScreenActivity)
 
 
     fun inject(fragment: FramePartFragment)
     fun inject(fragment: FramePartFragment)
     fun inject(fragment: BroadcastFragment)
     fun inject(fragment: BroadcastFragment)

+ 12 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/BaseCallFragment.kt

@@ -51,6 +51,18 @@ abstract class BaseCallFragment: Fragment(), View.OnTouchListener {
                 MediaPlayHelper.getInstance().pauseMusic()
                 MediaPlayHelper.getInstance().pauseMusic()
             }
             }
         }
         }
+
+        //进入通话界面时是否锁屏状态
+        //等价于:
+        /*if (Constants.showLock) {
+            Constants.showCallOnLock = true
+        } else {
+            Constants.showCallOnLock = false
+        }*/
+        Constants.showCallOnLock = Constants.showLock
+
+        //退出锁屏界面
+        EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK))
     }
     }
 
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

+ 5 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/BaseEntranceGuardFragment.kt

@@ -42,6 +42,11 @@ abstract class BaseEntranceGuardFragment : Fragment(), View.OnTouchListener {
                 MediaPlayHelper.getInstance().pauseMusic()
                 MediaPlayHelper.getInstance().pauseMusic()
             }
             }
         }
         }
+
+        Constants.showCallOnLock = Constants.showLock
+
+        //退出锁屏界面
+        EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK))
     }
     }
 
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

+ 9 - 6
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/CallRecordsFragment.kt

@@ -156,7 +156,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
             //未接历史记录
             //未接历史记录
             R.id.no_answer_calls_linlyout -> {
             R.id.no_answer_calls_linlyout -> {
                 //如果还要来电未接则不切换,且提示用户
                 //如果还要来电未接则不切换,且提示用户
-                if (NurseHomeActivity.callingList.size > 0) {
+                if (Constants.callingList.size > 0) {
                     showMessage(R.string.event_todo_tips)
                     showMessage(R.string.event_todo_tips)
                     return
                     return
                 }
                 }
@@ -182,7 +182,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
             //所有历史记录
             //所有历史记录
             R.id.call_records_linlyout -> {
             R.id.call_records_linlyout -> {
                 //如果还要来电未接则不切换,且提示用户
                 //如果还要来电未接则不切换,且提示用户
-                if (NurseHomeActivity.callingList.size > 0) {
+                if (Constants.callingList.size > 0) {
                     showMessage(R.string.event_todo_tips)
                     showMessage(R.string.event_todo_tips)
                     return
                     return
                 }
                 }
@@ -234,7 +234,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
     }
     }
 
 
     override fun onUpdate() {
     override fun onUpdate() {
-        val num = NurseHomeActivity.callingList.size
+        val num = Constants.callingList.size
         if (num > 9) {
         if (num > 9) {
             calling_num_tv.visibility = View.VISIBLE
             calling_num_tv.visibility = View.VISIBLE
             calling_num_tv.text = "9+"
             calling_num_tv.text = "9+"
@@ -249,6 +249,9 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
                 missed_call_tips_tv.visibility = View.VISIBLE
                 missed_call_tips_tv.visibility = View.VISIBLE
             }
             }
         }
         }
+
+        //更新锁屏界面来电列表
+        EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_UPDATE_LOCK_INCOMING_CALLS))
     }
     }
 
 
     override fun bindEvent() {
     override fun bindEvent() {
@@ -437,7 +440,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
                             SpeechUtil.getInstance().removeSpeak(text)
                             SpeechUtil.getInstance().removeSpeak(text)
                         } else {
                         } else {
                             //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
                             //如果呼叫列表只有一个呼叫了,说明删除这个之后就清空了,此时关闭铃声或音乐
-                            if (NurseHomeActivity.callingList.size == 1) {
+                            if (Constants.callingList.size == 1) {
                                 RingPlayHelper.stopRingTone()
                                 RingPlayHelper.stopRingTone()
                             }
                             }
                         }
                         }
@@ -451,11 +454,11 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
 
 
             Constants.EVENT_HOOK_OFF -> {
             Constants.EVENT_HOOK_OFF -> {
                 //接听呼叫列表中第一个电话
                 //接听呼叫列表中第一个电话
-                if (NurseHomeActivity.callingList.size > 0) {
+                if (Constants.callingList.size > 0) {
                     if (Constants.bcVoiceOn) {
                     if (Constants.bcVoiceOn) {
                         showMessage(R.string.broadcast_playing)
                         showMessage(R.string.broadcast_playing)
                     } else {
                     } else {
-                        val callingItem = NurseHomeActivity.callingList.get(0)
+                        val callingItem = Constants.callingList.get(0)
                         val itemData = callingItem.interactionVO
                         val itemData = callingItem.interactionVO
                         //LedHelper.updateLedInfo(itemData, false, false)
                         //LedHelper.updateLedInfo(itemData, false, false)
                         EventBus.getDefault().post(MessageEvent(callingItem, Constants.EVENT_ACCEPT_CALL))
                         EventBus.getDefault().post(MessageEvent(callingItem, Constants.EVENT_ACCEPT_CALL))

+ 2 - 2
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SipCallFragment.kt

@@ -72,6 +72,8 @@ class SipCallFragment: BaseCallFragment() {
         VoiceManagerUtil.setCallVoice(activity, volume)
         VoiceManagerUtil.setCallVoice(activity, volume)
         linphoneManager?.enableMic(true)
         linphoneManager?.enableMic(true)
 
 
+        Constants.IN_CALL = true
+
         //Log.d(TAG, "callState: $callState, local sip: ${Constants.sip_id}, target sip: ${Constants.targetSipId}")
         //Log.d(TAG, "callState: $callState, local sip: ${Constants.sip_id}, target sip: ${Constants.targetSipId}")
         when (callState) {
         when (callState) {
             0 -> {
             0 -> {
@@ -176,7 +178,6 @@ class SipCallFragment: BaseCallFragment() {
     }
     }
 
 
     override fun destroy() {
     override fun destroy() {
-        Constants.showCall = false
         Constants.IN_CALL = false
         Constants.IN_CALL = false
         RingPlayHelper.stopRingTone()
         RingPlayHelper.stopRingTone()
         Constants.CALL_STATE = Constants.CALL_STANDBY
         Constants.CALL_STATE = Constants.CALL_STANDBY
@@ -198,7 +199,6 @@ class SipCallFragment: BaseCallFragment() {
         }
         }
         sky_voice_call_outgoing.visibility = View.VISIBLE
         sky_voice_call_outgoing.visibility = View.VISIBLE
         sky_voice_call_timer.visibility = View.GONE
         sky_voice_call_timer.visibility = View.GONE
-        Constants.showCall = true
     }
     }
 
 
     private fun showCalling(audioOnly: Boolean) {
     private fun showCalling(audioOnly: Boolean) {

+ 21 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt

@@ -30,6 +30,7 @@ import com.wdkl.ncs.android.middleware.tcp.enums.DeviceTypeEnum
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.ncs.host.activity.SipTestActivity
 import com.wdkl.ncs.host.activity.SipTestActivity
 import kotlinx.android.synthetic.main.fragment_system_settings.*
 import kotlinx.android.synthetic.main.fragment_system_settings.*
+import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.greenrobot.eventbus.ThreadMode
 import java.util.*
 import java.util.*
@@ -146,6 +147,16 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             ll_tts_rate_slow.visibility = View.VISIBLE
             ll_tts_rate_slow.visibility = View.VISIBLE
         }
         }
 
 
+        if (Constants.enableLock) {
+            if (SettingConfig.getShowLockButton(activity)) {
+                lock_button_enable.isChecked = true
+            } else {
+                lock_button_disable.isChecked = true
+            }
+        } else {
+            ll_show_lock_button.visibility = View.GONE
+        }
+
         //语音播报次数
         //语音播报次数
         call_number_tv.text = SettingConfig.getCallNumber(this.activity).toString()
         call_number_tv.text = SettingConfig.getCallNumber(this.activity).toString()
         call_number_seekb.setProgress((SettingConfig.getCallNumber(this.activity)))
         call_number_seekb.setProgress((SettingConfig.getCallNumber(this.activity)))
@@ -453,6 +464,16 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             }
             }
         }
         }
 
 
+        group_lock_button.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.lock_button_enable) {
+                SettingConfig.setShowLockButton(activity, true)
+                EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_SHOW_LOCK_FLOAT_VIEW))
+            } else {
+                SettingConfig.setShowLockButton(activity, false)
+                EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_DISMISS_LOCK_FLOAT_VIEW))
+            }
+        }
+
         //播报次数加减
         //播报次数加减
         call_number_decrease_tv.setOnClickListener(this)
         call_number_decrease_tv.setOnClickListener(this)
         call_number_add_tv.setOnClickListener(this)
         call_number_add_tv.setOnClickListener(this)

+ 0 - 99
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/service/AppService.kt

@@ -1,99 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.service
-
-import android.app.Notification
-import android.app.NotificationChannel
-import android.app.NotificationManager
-import android.app.Service
-import android.content.Context
-import android.content.Intent
-import android.os.Binder
-import android.os.Build
-import android.os.IBinder
-import com.wdkl.ncs.android.component.nursehome.R
-import com.wdkl.ncs.android.middleware.common.Constants
-import com.wdkl.ncs.android.middleware.utils.MessageEvent
-import org.greenrobot.eventbus.EventBus
-import serialporttest.utils.SerialPortUtil
-import com.wdkl.ncs.android.middleware.common.SerialType
-
-class AppService : Service(), SerialPortUtil.ISerialPortOnclickEvent, SerialPortUtil.IForkSpringSwiData {
-    private val TAG = AppService::class.java.simpleName
-    internal var myBinder = ServiceBinder()
-
-    private var notificationManager: NotificationManager? = null
-    private var notificationId: String = "channelId-0"
-    private var notificationName: String = "wdkl-host"
-
-    override fun onCreate() {
-        super.onCreate()
-
-        notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            var channel = NotificationChannel(
-                    notificationId,
-                    notificationName,
-                    NotificationManager.IMPORTANCE_HIGH
-            );
-            notificationManager!!.createNotificationChannel(channel)
-        }
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            startForeground(110, getNotification())//开前台服务
-        }
-
-        setSerialListner()
-        SerialPortUtil.getInstance().powerIndicator(1)
-    }
-
-    private fun getNotification(): Notification {
-        var builder: Notification.Builder = Notification.Builder(this)
-                .setSmallIcon(R.mipmap.ic_launcher)
-                .setContentTitle("service")
-                .setContentText("service is running")
-                .setOnlyAlertOnce(true)
-        //设置Notification的ChannelID,否则不能正常显示
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            builder.setChannelId(notificationId);
-        }
-        var notification: Notification = builder.build();
-        return notification;
-    }
-
-    //设置串口监听
-    private fun setSerialListner() {
-        SerialPortUtil.getInstance().setOnDataReceiveListener(this, this)
-    }
-
-    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
-        return super.onStartCommand(intent, flags, startId)
-    }
-
-
-    override fun onBind(intent: Intent): IBinder {
-        return myBinder
-    }
-
-    //呼叫键串口消息
-    override fun serialPortBedOnclick(buffer: ByteArray) {
-        EventBus.getDefault().post(MessageEvent(SerialType(0, buffer[0].toInt()), Constants.EVENT_SERIAL_PORT))
-
-    }
-
-    //手柄串口消息
-    override fun forkSpringData(data: Int) {
-        EventBus.getDefault().post(MessageEvent(SerialType(1, data), Constants.EVENT_SERIAL_PORT))
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        stopForeground(true)// 停止前台服务--参数:表示是否移除之前的通知
-        SerialPortUtil.getInstance().closeHeart()
-        SerialPortUtil.getInstance().closeSerialPort()
-    }
-
-    inner class ServiceBinder : Binder() {
-        fun doThings() {}
-    }
-
-}

+ 279 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/service/LockService.kt

@@ -0,0 +1,279 @@
+package com.wdkl.ncs.android.component.nursehome.service
+
+import android.annotation.SuppressLint
+import android.app.*
+import android.content.Context
+import android.content.Intent
+import android.graphics.PixelFormat
+import android.os.Binder
+import android.os.Build
+import android.os.IBinder
+import android.util.Log
+import android.view.*
+import android.widget.TextView
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import java.util.*
+import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
+
+class LockService : Service() {
+    private val TAG = LockService::class.java.simpleName
+    internal var myBinder = ServiceBinder()
+
+    private var notificationManager: NotificationManager? = null
+    private var notificationId: String = "myId"
+    private var notificationName: String = "myChannel"
+
+    var mWindowManager: WindowManager? = null
+    var wmParams: WindowManager.LayoutParams? = null
+
+    //浮动布局view
+    var floatingLayout: View? = null
+    var floatView: TextView? = null
+    var clickTime: Long = 0
+
+    //开始触控的坐标,移动时的坐标(相对于屏幕左上角的坐标)
+    private var mTouchStartX = 0
+    private var mTouchStartY = 0
+    private var mTouchCurrentX = 0
+    private var mTouchCurrentY = 0
+    private var mStartX = 0
+    private var mStartY = 0
+    private var mStopX = 0
+    private var mStopY = 0
+
+    //判断悬浮窗口是否移动,这里做个标记,防止移动后松手触发了点击事件
+    private var isMove = false
+    private var floatViewShow = false
+
+    override fun onCreate() {
+        super.onCreate()
+
+        if (!EventBus.getDefault().isRegistered(this)) {
+            EventBus.getDefault().register(this)
+        }
+
+        notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val channel = NotificationChannel(notificationId, notificationName, NotificationManager.IMPORTANCE_LOW)
+            notificationManager!!.createNotificationChannel(channel)
+        }
+
+        //定时任务
+        val timerTask: TimerTask = object : TimerTask() {
+            override fun run() {
+                try {
+                    //Log.e(TAG, "check lock screen state: " + System.currentTimeMillis() + ", " + BaseApplication.userTouchTime)
+                    if (System.currentTimeMillis() - BaseApplication.userTouchTime > 20000) {
+                        /*Log.e(TAG, "check lock state: enableLock=" + Constants.enableLock
+                                + ", inCall=" + Constants.IN_CALL
+                                + ", bcVoiceOn=" + Constants.bcVoiceOn)*/
+                        if (Constants.enableLock && !Constants.IN_CALL && !Constants.bcVoiceOn) {
+                            //锁屏
+                            EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_SHOW_LOCK))
+                        }
+                    }
+                } catch (e: Exception) {
+                    //
+                }
+            }
+        }
+        val executor = Executors.newSingleThreadScheduledExecutor()
+        executor.scheduleAtFixedRate(timerTask, 5, 30, TimeUnit.SECONDS)
+
+        initFloatingWindow()
+    }
+
+    private fun getNotification(): Notification {
+        val builder: Notification.Builder = Notification.Builder(this)
+            .setSmallIcon(R.mipmap.ic_launcher)
+            .setContentTitle("MyService")
+            .setContentText("running...")
+            .setOnlyAlertOnce(true)
+        //设置Notification的ChannelID,否则不能正常显示
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            builder.setChannelId(notificationId)
+        }
+        return builder.build()
+    }
+
+    /**
+     * 设置悬浮框基本参数(位置、宽高等)
+     */
+    @SuppressLint("ClickableViewAccessibility")
+    private fun initFloatingWindow() {
+        mWindowManager = applicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+        //设置好悬浮窗的参数
+        wmParams = getParams()
+        //得到容器,通过这个inflater来获得悬浮窗控件
+        val inflater = LayoutInflater.from(applicationContext)
+        //获取浮动窗口视图所在布局
+        floatingLayout = inflater.inflate(R.layout.float_lock_layout, null)
+        //悬浮框触摸事件,设置悬浮框可拖动
+        floatView = floatingLayout?.findViewById(R.id.float_call_view)
+
+        floatView?.setOnTouchListener { v, event ->
+            when (event.action) {
+                MotionEvent.ACTION_DOWN -> {
+                    isMove = false
+                    mTouchStartX = event.rawX.toInt()
+                    mTouchStartY = event.rawY.toInt()
+                    mStartX = mTouchStartX
+                    mStartY = mTouchStartY
+                }
+
+                MotionEvent.ACTION_MOVE -> {
+                    mTouchCurrentX = event.rawX.toInt()
+                    mTouchCurrentY = event.rawY.toInt()
+                    wmParams!!.x += mTouchCurrentX - mTouchStartX
+                    wmParams!!.y += mTouchCurrentY - mTouchStartY
+                    mWindowManager!!.updateViewLayout(floatingLayout, wmParams)
+                    mTouchStartX = mTouchCurrentX
+                    mTouchStartY = mTouchCurrentY
+                }
+
+                MotionEvent.ACTION_UP -> {
+                    mStopX = event.rawX.toInt()
+                    mStopY = event.rawY.toInt()
+                    //Log.e(TAG, "startX: $mStartX, startY: $mStartY, stopX: $mStopX, stopY: $mStopY")
+                    if (Math.abs(mStartX - mStopX) >= 1 || Math.abs(mStartY - mStopY) >= 1) {
+                        isMove = true
+                    }
+                }
+            }
+
+            //记录用户点击时间
+            BaseApplication.userTouchTime = System.currentTimeMillis()
+
+            //如果是移动事件不触发OnClick事件,防止移动的时候一放手形成点击事件
+            return@setOnTouchListener isMove
+        }
+
+        //悬浮框点击事件
+        floatView?.setOnClickListener {
+            if (System.currentTimeMillis() - clickTime > 3000) {
+                if (Constants.enableLock && !Constants.IN_CALL && !Constants.bcVoiceOn) {
+                    //锁屏
+                    EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_SHOW_LOCK))
+                }
+            } else {
+                showMessage(R.string.call_wait)
+            }
+            clickTime = System.currentTimeMillis()
+        }
+
+        //服务启动时默认显示悬浮窗
+        showFloatView()
+    }
+
+    private fun getParams(): WindowManager.LayoutParams? {
+        wmParams = WindowManager.LayoutParams()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            wmParams?.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
+        } else {
+            wmParams?.type = WindowManager.LayoutParams.TYPE_PHONE
+        }
+        wmParams?.format = PixelFormat.RGBA_8888
+        wmParams?.gravity = Gravity.LEFT or Gravity.TOP
+        //wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+        wmParams?.flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+        //设置悬浮窗口长宽数据
+        wmParams?.width = WindowManager.LayoutParams.WRAP_CONTENT
+        wmParams?.height = WindowManager.LayoutParams.WRAP_CONTENT
+        wmParams?.x = 200
+        wmParams?.y = 4
+        return wmParams
+    }
+
+    private fun showFloatView() {
+        if (!SettingConfig.getShowLockButton(applicationContext)) {
+            return
+        }
+
+        if (floatViewShow) {
+            return
+        }
+
+        if (floatingLayout != null) {
+            mWindowManager?.addView(floatingLayout, wmParams)
+            floatViewShow = true
+        }
+    }
+
+    private fun dismissFloatView() {
+        if (floatingLayout != null && floatViewShow) {
+            // 移除悬浮窗口
+            mWindowManager!!.removeView(floatingLayout)
+        }
+        floatViewShow = false
+    }
+
+    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            startForeground(110, getNotification())//开前台服务
+        }
+
+        return START_STICKY//当服务被异常终止时,重启服务
+        //return super.onStartCommand(intent, flags, startId)
+    }
+
+    override fun onBind(intent: Intent): IBinder {
+        return myBinder
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            stopForeground(true)// 停止前台服务--参数:表示是否移除之前的通知
+        }
+
+        if (EventBus.getDefault().isRegistered(this)) {
+            EventBus.getDefault().unregister(this)
+        }
+    }
+
+    inner class ServiceBinder : Binder() {
+        fun doThings() {}
+    }
+
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        when (messageEvent.getType()) {
+            Constants.EVENT_TCP_MSG -> {
+                //
+            }
+
+            Constants.EVENT_DISMISS_LOCK -> {
+                Log.d(TAG, "show float lock view: " + Constants.enableLock)
+                //解锁时判断是开启锁屏功能和不是通话状态才显示悬浮窗
+                if (Constants.enableLock && !Constants.IN_CALL && !Constants.bcVoiceOn) {
+                    showFloatView()
+                } else {
+                    dismissFloatView()
+                }
+            }
+
+            Constants.EVENT_SHOW_LOCK_FLOAT_VIEW -> {
+                Log.d(TAG, "show float lock view")
+                showFloatView()
+            }
+
+            Constants.EVENT_DISMISS_LOCK_FLOAT_VIEW -> {
+                Log.d(TAG, "dismiss float lock view")
+                //显示锁屏界面则取消悬浮窗
+                dismissFloatView()
+            }
+        }
+    }
+
+}

+ 0 - 215
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/service/RTCKeepLiveService.java.bak

@@ -1,215 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.service;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-import android.support.annotation.Nullable;
-
-import com.starrtc.demo.utils.AEvent;
-import com.starrtc.demo.utils.IEventListener;
-
-
-/**
- * Created by zhangjt on 2017/8/6.
- */
-
-public class RTCKeepLiveService extends Service implements IEventListener {
-    private String TAG = RTCKeepLiveService.class.getSimpleName();
-
-    private String DeviceSipId = "";
-    @Nullable
-    @Override
-    public IBinder onBind(Intent intent) {
-        return null;
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-    }
-
-    @Override
-    public void onDestroy()
-    {
-        super.onDestroy();
-        removeListener();
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-//        try {
-//            if(intent != null){
-//                DeviceSipId = intent.getStringExtra("DeviceSipId");
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-        initSDK();
-        return super.onStartCommand(intent, flags, startId);
-    }
-
-    private void initSDK(){
-//        MLOC.init(this);
-        initFree();
-    }
-
-    private boolean isLogin = false;
-    //开放版SDK初始化
-    private void initFree(){
-//        MLOC.d("RTCKeepLiveService","initFree");
-//        isLogin = XHClient.getInstance().getIsOnline();
-//        Log.e("RTCKeepLiveService","isLogin "+isLogin);
-//        Log.e("RTCKeepLiveService","MLOC.userId  "+MLOC.userId);
-//        if(!isLogin){
-//            if(!MLOC.userId.equals(DeviceSipId)){
-////                MLOC.userId = ""+(new Random().nextInt(900000)+100000);
-////                MLOC.userId = "0000";
-////                MLOC.saveUserId(MLOC.userId);
-//
-//                MLOC.userId = DeviceSipId;
-//                Log.e(TAG,"userId "+DeviceSipId);
-//                MLOC.saveUserId(MLOC.userId);
-//
-//            }
-            addListener();
-
-//            XHCustomConfig customConfig =  XHCustomConfig.getInstance(this);
-//            customConfig.setChatroomServerUrl(MLOC.CHATROOM_SERVER_URL);
-//            customConfig.setLiveSrcServerUrl(MLOC.LIVE_SRC_SERVER_URL);
-//            customConfig.setLiveVdnServerUrl(MLOC.LIVE_VDN_SERVER_URL);
-//            customConfig.setImServerUrl(MLOC.IM_SERVER_URL);
-//            customConfig.setVoipServerUrl(MLOC.VOIP_SERVER_URL);
-//            customConfig.setLogEnable(false); //关闭SDK调试日志
-////            customConfig.setDefConfigOpenGLESEnable(false);
-////            customConfig.setDefConfigCameraId(1);//设置默认摄像头方向  0后置  1前置
-////            customConfig.setDefConfigVideoSize(XHConstants.XHCropTypeEnum.STAR_VIDEO_CONFIG_360BW_640BH_180SW_320SH);
-//            customConfig.setLogDirPath(Environment.getExternalStorageDirectory().getPath()+"/starrtcLog");
-////            customConfig.setDefConfigCamera2Enable(false);
-////            StarCamera.setFrameBufferEnable(false);
-//            customConfig.initSDKForFree(MLOC.userId, new IXHErrorCallback() {
-//                @Override
-//                public void error(final String errMsg, Object data) {
-//                    MLOC.e("RTCKeepLiveService","error:"+errMsg);
-//                    MLOC.showMsg(RTCKeepLiveService.this,errMsg);
-//                }
-//            },new Handler());
-//
-//            XHClient.getInstance().getChatManager().addListener(new XHChatManagerListener());
-//            XHClient.getInstance().getGroupManager().addListener(new XHGroupManagerListener());
-//            XHClient.getInstance().getVoipManager().addListener(new XHVoipManagerListener());
-//            XHClient.getInstance().getVoipP2PManager().addListener(new XHVoipP2PManagerListener());
-//            XHClient.getInstance().getLoginManager().addListener(new XHLoginManagerListener());
-//            XHVideoSourceManager.getInstance().setVideoSourceCallback(new DemoVideoSourceCallback());
-//
-//            XHClient.getInstance().getLoginManager().loginFree(new IXHResultCallback() {
-//                @Override
-//                public void success(Object data) {
-//                    MLOC.d("RTCKeepLiveService","loginSuccess");
-//                    isLogin = true;
-//                }
-//                @Override
-//                public void failed(final String errMsg) {
-//                    MLOC.d("RTCKeepLiveService","loginFailed "+errMsg);
-//                    MLOC.showMsg(RTCKeepLiveService.this,errMsg);
-//                }
-//            });
-//        }
-    }
-
-    @Override
-    public void dispatchEvent(String aEventID, boolean success, Object eventObj) {
-        switch (aEventID){
-            case AEvent.AEVENT_VOIP_REV_CALLING:{
-//                Intent intent = new Intent(this, VoipRingingActivity.class);
-//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                intent.putExtra("targetId",eventObj.toString());
-//                startActivity(intent);
-            }
-            break;
-            case AEvent.AEVENT_VOIP_REV_CALLING_AUDIO:{
-                //todo 原生startRTC 语音呼入 启动原生的activity
-//                Intent intent = new Intent(this, VoipAudioRingingActivity.class);
-//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                intent.putExtra("targetId",eventObj.toString());
-//                startActivity(intent);
-                //todo 原生startRTC 语音呼入 启动自己修改的activity
-//                Intent intent = new Intent(this, RTCVoipAudioRingingActivity.class);
-//                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                intent.putExtra("targetId",eventObj.toString());
-//                startActivity(intent);
-//
-//                Log.e("TAG","本地启动。。。");
-
-            }
-            break;
-            case AEvent.AEVENT_VOIP_P2P_REV_CALLING:
-//                if(MLOC.canPickupVoip){
-//                    Intent intent = new Intent(this, VoipP2PRingingActivity.class);
-//                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                    intent.putExtra("targetId",eventObj.toString());
-//                    startActivity(intent);
-//                }
-                break;
-            case AEvent.AEVENT_VOIP_P2P_REV_CALLING_AUDIO:
-//                if(MLOC.canPickupVoip){
-//                    Intent intent = new Intent(this, VoipP2PRingingActivity.class);
-//                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
-//                    intent.putExtra("targetId",eventObj.toString());
-//                    startActivity(intent);
-//                }
-                break;
-            case AEvent.AEVENT_C2C_REV_MSG:
-            case AEvent.AEVENT_REV_SYSTEM_MSG:
-//                MLOC.hasNewC2CMsg = true;
-                break;
-            case AEvent.AEVENT_GROUP_REV_MSG:
-//                MLOC.hasNewGroupMsg = true;
-                break;
-            case AEvent.AEVENT_LOGOUT:
-//                removeListener();
-//                this.stopSelf();
-                break;
-            case AEvent.AEVENT_USER_KICKED:
-            case AEvent.AEVENT_CONN_DEATH:
-//                MLOC.d("RTCKeepLiveService","AEVENT_USER_KICKED OR AEVENT_CONN_DEATH");
-//                XHClient.getInstance().getLoginManager().loginFree(new IXHResultCallback() {
-//                    @Override
-//                    public void success(Object data) {
-//                        MLOC.d("RTCKeepLiveService","loginSuccess");
-//                        isLogin = true;
-//                    }
-//                    @Override
-//                    public void failed(final String errMsg) {
-//                        MLOC.d("RTCKeepLiveService","loginFailed "+errMsg);
-//                        MLOC.showMsg(RTCKeepLiveService.this,errMsg);
-//                    }
-//                });
-                break;
-        }
-    }
-
-    private void addListener(){
-        AEvent.addListener(AEvent.AEVENT_LOGOUT,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_REV_CALLING,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_REV_CALLING_AUDIO,this);
-        AEvent.addListener(AEvent.AEVENT_VOIP_P2P_REV_CALLING,this);
-        AEvent.addListener(AEvent.AEVENT_C2C_REV_MSG,this);
-        AEvent.addListener(AEvent.AEVENT_REV_SYSTEM_MSG,this);
-        AEvent.addListener(AEvent.AEVENT_GROUP_REV_MSG,this);
-        AEvent.addListener(AEvent.AEVENT_USER_KICKED,this);
-        AEvent.addListener(AEvent.AEVENT_CONN_DEATH,this);
-    }
-
-    private void removeListener(){
-        AEvent.removeListener(AEvent.AEVENT_LOGOUT,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_CALLING,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_CALLING_AUDIO,this);
-        AEvent.removeListener(AEvent.AEVENT_VOIP_P2P_REV_CALLING,this);
-        AEvent.removeListener(AEvent.AEVENT_C2C_REV_MSG,this);
-        AEvent.removeListener(AEvent.AEVENT_REV_SYSTEM_MSG,this);
-        AEvent.removeListener(AEvent.AEVENT_GROUP_REV_MSG,this);
-        AEvent.removeListener(AEvent.AEVENT_USER_KICKED,this);
-        AEvent.removeListener(AEvent.AEVENT_CONN_DEATH,this);
-    }
-
-}

+ 9 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/settingconfig/SettingConfig.java

@@ -159,6 +159,7 @@ public class SettingConfig {
     private static final String KEY_SP_LED_AUTO_SYNC_TIME = "KEY_SP_LED_AUTO_SYNC_TIME";
     private static final String KEY_SP_LED_AUTO_SYNC_TIME = "KEY_SP_LED_AUTO_SYNC_TIME";
 
 
     private static final String KEY_SP_SHOW_ROOM = "KEY_SP_SHOW_ROOM";
     private static final String KEY_SP_SHOW_ROOM = "KEY_SP_SHOW_ROOM";
+    private static final String KEY_SP_ENABLE_LOCK_BUTTON = "KEY_SP_ENABLE_LOCK_BUTTON";
 
 
     //广播模式:本地广播和网络广播
     //广播模式:本地广播和网络广播
     private static final String KEY_SP_BROADCAST_TYPE = "KEY_SP_BROADCAST_TYPE";
     private static final String KEY_SP_BROADCAST_TYPE = "KEY_SP_BROADCAST_TYPE";
@@ -328,6 +329,14 @@ public class SettingConfig {
         getEditor(context).putInt(KEY_SP_BROADCAST_VOLUME, vol).apply();
         getEditor(context).putInt(KEY_SP_BROADCAST_VOLUME, vol).apply();
     }
     }
 
 
+    public static boolean getShowLockButton(Context context) {
+        return getSP(context).getBoolean(KEY_SP_ENABLE_LOCK_BUTTON, false);
+    }
+
+    public static void setShowLockButton(Context context, boolean enable) {
+        getEditor(context).putBoolean(KEY_SP_ENABLE_LOCK_BUTTON, enable).apply();
+    }
+
     /**
     /**
      * 获取网络异常重启次数
      * 获取网络异常重启次数
      *
      *

+ 2 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java

@@ -114,6 +114,8 @@ public class AppUtil {
             printWriter = new PrintWriter(process.getOutputStream());
             printWriter = new PrintWriter(process.getOutputStream());
             printWriter.println("mount -o rw,remount -t auto /system");
             printWriter.println("mount -o rw,remount -t auto /system");
             printWriter.println("chmod 777 /system/bin/ping");
             printWriter.println("chmod 777 /system/bin/ping");
+            //修改串口权限
+            printWriter.println("chmod 777 /dev/ttyS0");
             printWriter.println("exit");
             printWriter.println("exit");
             printWriter.flush();
             printWriter.flush();
             printWriter.close();
             printWriter.close();

+ 2 - 2
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/window/IncidentWindow.kt

@@ -151,8 +151,8 @@ class IncidentWindow(var contexts: Context) {
                     if (data.action == TcpAction.SOSAction.CALL || tcpModel.action == TcpAction.SOSAction.ROOM_CALL) {
                     if (data.action == TcpAction.SOSAction.CALL || tcpModel.action == TcpAction.SOSAction.ROOM_CALL) {
                         LedHelper.updateLedInfo(interactionData, false, true)
                         LedHelper.updateLedInfo(interactionData, false, true)
                     }
                     }
-                    if (NurseHomeActivity.sosItemList.size > 0) {
-                        val iterator = NurseHomeActivity.sosItemList.iterator()
+                    if (Constants.sosItemList.size > 0) {
+                        val iterator = Constants.sosItemList.iterator()
                         while (iterator.hasNext()) {
                         while (iterator.hasNext()) {
                             val it = iterator.next()
                             val it = iterator.next()
                             if (it.interactionVO.id == interactionData.id) {
                             if (it.interactionVO.id == interactionData.id) {

+ 7 - 0
android_host/src/main/h10_z3128_1h/res/drawable/av_float_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+
+    <solid android:color="#008577" />
+
+</shape>

+ 56 - 20
android_host/src/main/h10_z3128_1h/res/layout/activity_register.xml

@@ -69,66 +69,102 @@
             <Button
             <Button
                 android:id="@+id/btn_get_server"
                 android:id="@+id/btn_get_server"
                 android:layout_width="140dp"
                 android:layout_width="140dp"
-                android:layout_height="wrap_content"
-                android:background="?attr/myBackgroundColor"
+                android:layout_height="64dp"
+                android:layout_marginLeft="10dp"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="@string/register_auto_config"
                 android:text="@string/register_auto_config"
                 android:textSize="20sp"
                 android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle"
                 android:visibility="gone"/>
                 android:visibility="gone"/>
 
 
             <Button
             <Button
                 android:id="@+id/btn_enable_debug"
                 android:id="@+id/btn_enable_debug"
                 android:layout_width="140dp"
                 android:layout_width="140dp"
-                android:layout_height="wrap_content"
+                android:layout_height="64dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginLeft="10dp"
-                android:background="?attr/myBackgroundColor"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="DEBUG"
                 android:text="DEBUG"
-                android:textSize="20sp" />
+                android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle" />
 
 
             <Button
             <Button
                 android:id="@+id/btn_set_language"
                 android:id="@+id/btn_set_language"
                 android:layout_width="140dp"
                 android:layout_width="140dp"
-                android:layout_height="wrap_content"
+                android:layout_height="64dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginLeft="10dp"
-                android:background="?attr/myBackgroundColor"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="@string/language_settings"
                 android:text="@string/language_settings"
-                android:textSize="20sp" />
+                android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle" />
 
 
             <Button
             <Button
                 android:id="@+id/btn_set_server"
                 android:id="@+id/btn_set_server"
                 android:layout_width="140dp"
                 android:layout_width="140dp"
-                android:layout_height="wrap_content"
+                android:layout_height="64dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginLeft="10dp"
-                android:background="?attr/myBackgroundColor"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="@string/server_config"
                 android:text="@string/server_config"
-                android:textSize="20sp" />
+                android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle" />
 
 
             <Button
             <Button
                 android:id="@+id/btn_reboot"
                 android:id="@+id/btn_reboot"
                 android:layout_width="140dp"
                 android:layout_width="140dp"
-                android:layout_height="wrap_content"
+                android:layout_height="64dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginLeft="10dp"
-                android:background="?attr/myBackgroundColor"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="@string/register_reboot"
                 android:text="@string/register_reboot"
-                android:textSize="20sp" />
+                android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle" />
 
 
             <Button
             <Button
                 android:id="@+id/btn_reload"
                 android:id="@+id/btn_reload"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
+                android:layout_width="140dp"
+                android:layout_height="64dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginLeft="10dp"
-                android:background="?attr/myBackgroundColor"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="@string/register_reload"
                 android:text="@string/register_reload"
                 android:textSize="20sp"
                 android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle"
                 android:visibility="gone"/>
                 android:visibility="gone"/>
 
 
             <Button
             <Button
                 android:id="@+id/btn_test"
                 android:id="@+id/btn_test"
                 android:layout_width="140dp"
                 android:layout_width="140dp"
-                android:layout_height="wrap_content"
+                android:layout_height="64dp"
                 android:layout_marginLeft="10dp"
                 android:layout_marginLeft="10dp"
-                android:background="?attr/myBackgroundColor"
+                android:padding="4dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
                 android:text="@string/register_test"
                 android:text="@string/register_test"
-                android:textSize="20sp" />
+                android:textSize="20sp"
+                android:textColor="@drawable/selector_bottom_btn_text_color"
+                android:maxLines="2"
+                android:ellipsize="end"
+                style="?android:attr/buttonBarButtonStyle" />
         </LinearLayout>
         </LinearLayout>
 
 
     </LinearLayout>
     </LinearLayout>

+ 2 - 0
android_host/src/main/h10_z3128_1h/res/layout/adapter_call_records_item.xml

@@ -155,6 +155,7 @@
                     android:layout_width="wrap_content"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_marginRight="10dp"
                     android:layout_marginRight="10dp"
+                    android:textColor="#3490de"
                     android:text=""
                     android:text=""
                     android:textSize="18sp"
                     android:textSize="18sp"
                     android:visibility="gone"/>
                     android:visibility="gone"/>
@@ -163,6 +164,7 @@
                     android:id="@+id/processing_time_tv"
                     android:id="@+id/processing_time_tv"
                     android:layout_width="wrap_content"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_height="wrap_content"
+                    android:textColor="#F78B8F"
                     android:text=""
                     android:text=""
                     android:textSize="18sp" />
                     android:textSize="18sp" />
             </LinearLayout>
             </LinearLayout>

+ 4 - 4
android_host/src/main/h10_z3128_1h/res/layout/adapter_calling_item.xml

@@ -45,7 +45,7 @@
             android:text="--:--"/>
             android:text="--:--"/>
     </LinearLayout>
     </LinearLayout>
 
 
-    <LinearLayout
+    <RelativeLayout
         android:layout_width="wrap_content"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_height="match_parent"
         android:layout_weight="1"
         android:layout_weight="1"
@@ -59,12 +59,12 @@
             android:padding="4dp"
             android:padding="4dp"
             android:src="@drawable/ic_answer_normal" />
             android:src="@drawable/ic_answer_normal" />
 
 
-        <ImageView
+        <!--<ImageView
             android:id="@+id/btn_call_reject"
             android:id="@+id/btn_call_reject"
             android:layout_width="68dp"
             android:layout_width="68dp"
             android:layout_height="68dp"
             android:layout_height="68dp"
             android:src="@drawable/ic_hangup_normal"
             android:src="@drawable/ic_hangup_normal"
-            android:visibility="gone"/>
-    </LinearLayout>
+            android:visibility="gone"/>-->
+    </RelativeLayout>
 
 
 </LinearLayout>
 </LinearLayout>

+ 18 - 0
android_host/src/main/h10_z3128_1h/res/layout/float_lock_layout.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="#00000000"
+    android:gravity="center">
+
+    <TextView
+        android:id="@+id/float_call_view"
+        android:layout_width="80dp"
+        android:layout_height="80dp"
+        android:background="@drawable/av_float_bg"
+        android:gravity="center"
+        android:textColor="@color/white"
+        android:text="@string/str_lock_title"
+        android:textSize="20sp"/>
+
+</LinearLayout>

+ 39 - 0
android_host/src/main/h10_z3128_1h/res/layout/fragment_system_settings.xml

@@ -411,6 +411,45 @@
                 </LinearLayout>
                 </LinearLayout>
 
 
                 <LinearLayout
                 <LinearLayout
+                    android:id="@+id/ll_show_lock_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="2dp"
+                    android:layout_marginBottom="10dp"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
+                        android:text="@string/setting_lock_button"
+                        android:textColor="#000000"
+                        android:textSize="16sp" />
+
+                    <RadioGroup
+                        android:id="@+id/group_lock_button"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                        <RadioButton
+                            android:id="@+id/lock_button_enable"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/str_yes"
+                            android:textSize="16sp" />
+
+                        <RadioButton
+                            android:id="@+id/lock_button_disable"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/str_no"
+                            android:textSize="16sp" />
+                    </RadioGroup>
+
+                </LinearLayout>
+
+                <LinearLayout
                     android:id="@+id/ll_tts_rate_slow"
                     android:id="@+id/ll_tts_rate_slow"
                     android:layout_width="match_parent"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_height="wrap_content"

+ 75 - 0
android_host/src/main/h10_z3128_1h/res/layout/lock_screen_activity.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:tools="http://schemas.android.com/tools">
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@mipmap/lock_bg">
+
+    <LinearLayout
+        android:id="@+id/ll_incoming_call"
+        android:layout_width="280dp"
+        android:layout_height="match_parent"
+        android:layout_marginTop="80dp"
+        android:layout_marginBottom="80dp"
+        android:layout_marginStart="40dp"
+        android:background="@drawable/lock_call_list_bg"
+        android:visibility="gone">
+
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/lock_incoming_call_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:padding="10dp"
+            android:fadeScrollbars="true"
+            android:scrollbarSize="4dp"
+            android:scrollbarThumbVertical="@color/colorPrimaryDark"
+            android:scrollbars="vertical"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="480dp"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:layout_centerHorizontal="true"
+        android:gravity="center_horizontal"
+        tools:ignore="UselessParent">
+
+        <TextClock
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="40dp"
+            android:format12Hour="HH:mm"
+            android:format24Hour="HH:mm"
+            android:textColor="@color/white"
+            android:textStyle="bold"
+            android:textSize="60sp"/>
+
+        <TextClock
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:format12Hour="yyyy-MM-dd EEEE"
+            android:format24Hour="yyyy-MM-dd EEEE"
+            android:textColor="@color/white"
+            android:textSize="28sp"/>
+
+        <com.wdkl.ncs.android.lib.widget.NumLockView
+            android:id="@+id/screen_lock_view"
+            android:layout_width="360dp"
+            android:layout_height="400dp"
+            android:layout_marginTop="30dp"/>
+
+        <TextView
+            android:layout_width="360dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:gravity="center_horizontal"
+            android:textSize="28sp"
+            android:text="@string/str_lock_screen_tips"
+            android:textColor="@color/white"/>
+
+    </LinearLayout>
+
+</RelativeLayout>
+</layout>

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

@@ -74,7 +74,7 @@ class Application : BaseApplication() {
     private fun initFrame() {
     private fun initFrame() {
         //禁止滑动退出
         //禁止滑动退出
         BaseConfig.getInstance().addActivity("RegisterActivity", "AppUpdateActivity", "NurseHomeActivity", "TestActivity",
         BaseConfig.getInstance().addActivity("RegisterActivity", "AppUpdateActivity", "NurseHomeActivity", "TestActivity",
-        "ContactUpdateActivity", "SipAudioCallActivity", "WebRCTVoipAudioActivity", "WebRTCVoipAudioRingingActivity")
+        "ContactUpdateActivity", "SipAudioCallActivity", "WebRCTVoipAudioActivity", "WebRTCVoipAudioRingingActivity", "LockScreenActivity")
 
 
         NetEngineConfig.init(baseContext)
         NetEngineConfig.init(baseContext)
                 .openLogger()
                 .openLogger()

+ 2 - 0
common/build.gradle

@@ -258,6 +258,8 @@ dependencies {
 
 
     //eventbus
     //eventbus
     compile 'org.greenrobot:eventbus:3.0.0'
     compile 'org.greenrobot:eventbus:3.0.0'
+
+    compile project(':resource')
 }
 }
 
 
 //tasks.withType(JavaCompile) {
 //tasks.withType(JavaCompile) {

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

@@ -7,6 +7,7 @@ import android.databinding.ViewDataBinding
 import android.os.Build
 import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
 import android.util.Log
 import android.util.Log
+import android.view.MotionEvent
 import android.view.View
 import android.view.View
 import android.view.WindowManager
 import android.view.WindowManager
 import android.view.inputmethod.InputMethodManager
 import android.view.inputmethod.InputMethodManager
@@ -132,6 +133,13 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         }
         }
     }
     }
 
 
+    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
+        //记录用户点击时间
+        BaseApplication.userTouchTime = System.currentTimeMillis()
+
+        return super.dispatchTouchEvent(ev)
+    }
+
     /**
     /**
      * @author LDD
      * @author LDD
      * @From   BaseActivity
      * @From   BaseActivity
@@ -185,7 +193,7 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         removeAllCallBack()
         removeAllCallBack()
         /**处理android4.4.2 底层内存泄漏*/
         /**处理android4.4.2 底层内存泄漏*/
         //fixInputMethodManagerLeak(activity)
         //fixInputMethodManagerLeak(activity)
-        errorLog("PageDestory","页面销毁======>$localClassName")
+        //errorLog("PageDestory","页面销毁======>$localClassName")
 
 
         if (EventBus.getDefault().isRegistered(this)) {
         if (EventBus.getDefault().isRegistered(this)) {
             EventBus.getDefault().unregister(this)
             EventBus.getDefault().unregister(this)

+ 1 - 0
common/src/main/code/com/wdkl/ncs/android/lib/base/BaseApplication.kt

@@ -34,6 +34,7 @@ open class BaseApplication : MultiDexApplication() {
         @SuppressLint("StaticFieldLeak")
         @SuppressLint("StaticFieldLeak")
         lateinit var appContext: Application
         lateinit var appContext: Application
 
 
+        var userTouchTime: Long = 0
     }
     }
 
 
     /**
     /**

+ 310 - 0
common/src/main/code/com/wdkl/ncs/android/lib/widget/NumLockView.java

@@ -0,0 +1,310 @@
+package com.wdkl.ncs.android.lib.widget;
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.support.v7.widget.AppCompatImageView;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.GridLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.wdkl.ncs.android.lib.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static android.widget.RelativeLayout.CENTER_HORIZONTAL;
+import static android.widget.RelativeLayout.CENTER_IN_PARENT;
+
+public class NumLockView extends LinearLayout {
+    private String[] numArr = new String[]{"1","2","3","4","5","6","7","8","9", "", "0"};
+    private int mPaddingLeftRight;
+    private int mPaddingTopBottom;
+    //4个密码位ImageView
+    private ArrayList<CircleImageView> mResultIvList;
+    private LinearLayout inputResultView;
+    //存储当前输入内容
+    private StringBuilder mPassWord;
+    //振动效果
+    //private Vibrator mVibrator;
+    //整个键盘的颜色
+    private int mPanelColor;
+    //4个密码位的宽度
+    private int mResultIvRadius;
+    //数字键盘的每个圆的宽度
+    private int mNumRadius;
+    //每个圆的边界宽度
+    private int mStrokeWidth;
+
+    public NumLockView(Context context) {
+        this(context, null);
+    }
+
+    public NumLockView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public NumLockView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        mPaddingLeftRight = dip2px(context, 16);
+        mPaddingTopBottom = dip2px(context, 10);
+        mPanelColor = Color.parseColor("#f5f5f5");
+        mResultIvRadius = dip2px(context, 24);
+        mNumRadius = dip2px(context, 70);
+        mStrokeWidth = dip2px(context, 2);
+        //mVibrator = (Vibrator)context.getSystemService(Service.VIBRATOR_SERVICE);
+        mResultIvList = new ArrayList<>();
+        mPassWord = new StringBuilder();
+        setOrientation(VERTICAL);
+        setGravity(CENTER_HORIZONTAL);
+        initView(context);
+    }
+
+    public void initView(Context context){
+        //4个结果号码
+        inputResultView = new LinearLayout(context);
+        for(int i=0; i<4; i++){
+            CircleImageView mResultItem = new CircleImageView(context);
+            mResultIvList.add(mResultItem);
+            LayoutParams params = new LayoutParams(mResultIvRadius, mResultIvRadius);
+            params.leftMargin = dip2px(context, 4);
+            params.rightMargin = dip2px(context, 4);
+            mResultItem.setPadding(dip2px(context, 2),dip2px(context, 2),dip2px(context, 2),dip2px(context, 2));
+            mResultItem.setLayoutParams(params);
+            inputResultView.addView(mResultItem);
+        }
+        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+        params.gravity = Gravity.CENTER_HORIZONTAL;
+        params.bottomMargin = dip2px(context, 28);
+        inputResultView.setLayoutParams(params);
+        addView(inputResultView);
+
+        //数字键盘
+        GridLayout numContainer = new GridLayout(context);
+        numContainer.setColumnCount(3);
+        for(int i=0; i<numArr.length; i++){
+            RelativeLayout numItem = new RelativeLayout(context);
+            numItem.setPadding(mPaddingLeftRight,mPaddingTopBottom,mPaddingLeftRight,mPaddingTopBottom);
+            RelativeLayout.LayoutParams gridItemParams = new RelativeLayout.LayoutParams(mNumRadius, mNumRadius);
+            gridItemParams.addRule(CENTER_IN_PARENT);
+            final TextView numTv = new TextView(context);
+            numTv.setText(numArr[i]);
+            numTv.setTextColor(mPanelColor);
+            numTv.setTextSize(30);
+            numTv.setGravity(Gravity.CENTER);
+            numTv.setLayoutParams(gridItemParams);
+            final CircleImageView numBgIv = new CircleImageView(context);
+            numBgIv.setLayoutParams(gridItemParams);
+            numTv.setOnTouchListener(new OnTouchListener() {
+                @Override
+                public boolean onTouch(View v, MotionEvent event) {
+                    switch (event.getAction()){
+                        case MotionEvent.ACTION_DOWN:
+                            numBgIv.setFillCircle();
+                            numTv.setTextColor(Color.WHITE);
+                            if(mPassWord.length() < 4){
+                                mPassWord.append(numTv.getText());
+                                mResultIvList.get(mPassWord.length()-1).setFillCircle();
+                                if(mInputListener!=null && mPassWord.length() == 4){
+                                    mInputListener.inputFinish(mPassWord.toString());
+                                }
+                            }
+                            break;
+                        case MotionEvent.ACTION_UP:
+                            numBgIv.setStrokeCircle();
+                            numTv.setTextColor(mPanelColor);
+                            break;
+                    }
+                    return true;
+                }
+            });
+
+            numItem.addView(numBgIv);
+            numItem.addView(numTv);
+            numContainer.addView(numItem);
+            if(i == 9){
+                numItem.setVisibility(INVISIBLE);
+            }
+        }
+
+        //删除按钮
+        RelativeLayout deleteItem = new RelativeLayout(context);
+        deleteItem.setPadding(mPaddingLeftRight,mPaddingTopBottom,mPaddingLeftRight,mPaddingTopBottom);
+        RelativeLayout.LayoutParams gridItemParams = new RelativeLayout.LayoutParams(mNumRadius, mNumRadius);
+        gridItemParams.addRule(CENTER_IN_PARENT);
+
+        //图片
+        ImageView deleteIv = new ImageView(context);
+        deleteIv.setImageResource(R.drawable.ic_backspace);
+        deleteIv.setLayoutParams(gridItemParams);
+        deleteIv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+        deleteItem.addView(deleteIv);
+
+        //文字
+        //TextView deleteTv = new TextView(context);
+        //deleteTv.setText(R.string.str_delete);
+        //deleteTv.setTextColor(mPanelColor);
+        //deleteTv.setTextSize(24);
+        //deleteTv.setLayoutParams(gridItemParams);
+        //deleteTv.setGravity(Gravity.CENTER);
+        //deleteItem.addView(deleteTv);
+
+        numContainer.addView(deleteItem);
+        deleteIv.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                delete();
+            }
+        });
+
+        LayoutParams gridParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+        gridParams.gravity = Gravity.CENTER_HORIZONTAL;
+        numContainer.setLayoutParams(gridParams);
+        addView(numContainer);
+    }
+
+    /**
+     * 输入错误的状态显示(包括震动,密码位左右摇摆效果,重置密码位)
+     */
+    public void showErrorStatus() {
+        //mVibrator.vibrate(new long[]{100,100,100,100},-1);
+        List<Animator>  animators = new ArrayList<>();
+        ObjectAnimator translationXAnim = ObjectAnimator.ofFloat(inputResultView, "translationX", -10.0f, 10.0f, -10.0f, 0.0f);
+        translationXAnim.setDuration(200);
+        animators.add(translationXAnim);
+        AnimatorSet btnSexAnimatorSet = new AnimatorSet();
+        btnSexAnimatorSet.playTogether(animators);
+        btnSexAnimatorSet.start();
+        btnSexAnimatorSet.addListener(new Animator.AnimatorListener() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+            }
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                resetResult();
+            }
+            @Override
+            public void onAnimationCancel(Animator animation) {
+            }
+            @Override
+            public void onAnimationRepeat(Animator animation) {
+            }
+        });
+    }
+
+    /**
+     * 删除
+     */
+    public void delete(){
+        if(mPassWord.length() == 0){
+            return;
+        }
+        mResultIvList.get(mPassWord.length()-1).setStrokeCircle();
+        mPassWord.deleteCharAt(mPassWord.length()-1);
+    }
+
+    /**
+     * 重置密码输入
+     */
+    public void resetResult(){
+        for(int i=0; i<mResultIvList.size(); i++){
+            mResultIvList.get(i).setStrokeCircle();
+        }
+        mPassWord.delete(0, 4);
+    }
+
+    /**
+     * 监听输入完毕的接口
+     */
+    private InputListener mInputListener;
+    public void setInputListener(InputListener mInputListener) {
+        this.mInputListener = mInputListener;
+    }
+
+    public interface InputListener{
+        void inputFinish(String result);
+    }
+
+    /**
+     * dip/dp转像素
+     *
+     * @param dipValue
+     *      dip或 dp大小
+     * @return 像素值
+     */
+    public static int dip2px(Context context, float dipValue) {
+        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+        return (int) (dipValue * (metrics.density) + 0.5f);
+    }
+
+    /**
+     * 圆形背景ImageView(设置实心或空心)
+     */
+    public class CircleImageView extends AppCompatImageView {
+        private Paint mPaint;
+        private int mWidth;
+        private int mHeight;
+
+        public CircleImageView(Context context) {
+            this(context, null);
+        }
+
+        public CircleImageView(Context context, AttributeSet attrs) {
+            this(context, attrs, 0);
+        }
+
+        public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+            super(context, attrs, defStyleAttr);
+            initView(context);
+        }
+
+        public void initView(Context context){
+            mPaint = new Paint();
+            mPaint.setStyle(Paint.Style.STROKE);
+            mPaint.setColor(mPanelColor);
+            mPaint.setStrokeWidth(mStrokeWidth);
+            mPaint.setAntiAlias(true);
+        }
+
+        @Override
+        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+            super.onSizeChanged(w, h, oldw, oldh);
+            mWidth = w;
+            mHeight = h;
+        }
+
+        @Override
+        public void draw(Canvas canvas) {
+            canvas.drawCircle(mWidth/2f, mHeight/2f, mWidth/2f - 2, mPaint);
+            super.draw(canvas);
+        }
+
+        /**
+         * 设置圆为实心状态
+         */
+        public void setFillCircle(){
+            mPaint.setStyle(Paint.Style.FILL);
+            invalidate();
+        }
+
+        /**
+         * 设置圆为空心状态
+         */
+        public void setStrokeCircle(){
+            mPaint.setStyle(Paint.Style.STROKE);
+            invalidate();
+        }
+    }
+}

+ 4 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/DeviceApi.kt

@@ -68,4 +68,8 @@ interface DeviceApi {
 
 
     @GET("/deviceNurse/get_address_book/{part_id}")
     @GET("/deviceNurse/get_address_book/{part_id}")
     fun getPhoneBooks(@Path("part_id") partId: Int): Observable<ResponseBody>
     fun getPhoneBooks(@Path("part_id") partId: Int): Observable<ResponseBody>
+
+    //通过卡号获取员工信息
+    @GET("/deviceRoom/get_clerk_by_part_id_and_pass_no/{part_id}/{pass_no}")
+    fun getClerkByNo(@Path("part_id") partId: Int, @Path("pass_no") passNo: String): Observable<ResponseBody>
 }
 }

+ 21 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -78,6 +78,8 @@ class Constants {
         var bcInteractionId: Int = -1
         var bcInteractionId: Int = -1
         var bcVoiceId: Int = 0
         var bcVoiceId: Int = 0
 
 
+        var enableLock = false
+
         //空床呼叫
         //空床呼叫
         var emptyBedCall = false
         var emptyBedCall = false
 
 
@@ -141,6 +143,8 @@ class Constants {
 
 
         var callInteractionVO: InteractionVO? = null
         var callInteractionVO: InteractionVO? = null
 
 
+        //来电列表
+        var callingList = ArrayList<CallingItem>()
         //紧急呼叫列表
         //紧急呼叫列表
         var sosItemList = ArrayList<CallingItem>()
         var sosItemList = ArrayList<CallingItem>()
 
 
@@ -222,6 +226,20 @@ class Constants {
 
 
         const val EVENT_HOOK_ON = 0x31
         const val EVENT_HOOK_ON = 0x31
 
 
+        const val EVENT_SHOW_LOCK = 0x32
+
+        const val EVENT_DISMISS_LOCK = 0x33
+
+        const val EVENT_UPDATE_LOCK_INCOMING_CALLS = 0x34
+
+        const val EVENT_INCOMING_CALL_UPDATE = 0x35
+
+        const val EVENT_NFC_UPDATE = 0x36
+
+        const val EVENT_DISMISS_LOCK_FLOAT_VIEW = 0x37
+
+        const val EVENT_SHOW_LOCK_FLOAT_VIEW = 0x38
+
         //电话状态
         //电话状态
         const val PHONE_IDLE = 0
         const val PHONE_IDLE = 0
         const val PHONE_INCOMING = 1
         const val PHONE_INCOMING = 1
@@ -272,8 +290,10 @@ class Constants {
         var CALL_STATE = CALL_STANDBY
         var CALL_STATE = CALL_STANDBY
 
 
         var IN_CALL = false
         var IN_CALL = false
-        var showCall = false
         var entranceCall = false
         var entranceCall = false
+        var showLock = false
+        //是否锁屏界面接听的通话
+        var showCallOnLock = false
     }
     }
 
 
 
 

+ 6 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/DeviceContract.kt

@@ -6,6 +6,7 @@ import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.ClerkVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 
 
 /**
 /**
@@ -23,6 +24,8 @@ interface DeviceContract {
 
 
         fun showPhoneBook(data: ArrayList<PhoneBookItem>)
         fun showPhoneBook(data: ArrayList<PhoneBookItem>)
 
 
+        fun showClerk(clerk: ClerkVO)
+
         fun onNoneNet()
         fun onNoneNet()
     }
     }
 
 
@@ -38,6 +41,9 @@ interface DeviceContract {
         fun cancelTransfer(deviceId: Int)
         fun cancelTransfer(deviceId: Int)
 
 
         fun loadPhoneBook(partId: Int)
         fun loadPhoneBook(partId: Int)
+
+        //查询员工
+        fun checkClerk(partId: Int, passNo: String)
     }
     }
 
 
 
 

+ 15 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/DevicePresenter.kt

@@ -21,6 +21,7 @@ import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.dos.EventDO
 import com.wdkl.ncs.android.middleware.model.dos.EventDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.ClerkVO
 import com.wdkl.ncs.android.middleware.model.vo.EventVO
 import com.wdkl.ncs.android.middleware.model.vo.EventVO
 import com.wdkl.ncs.android.middleware.model.vo.FramePartVO
 import com.wdkl.ncs.android.middleware.model.vo.FramePartVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
 import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
@@ -62,6 +63,10 @@ class DevicePresenter @Inject constructor() : RxPresenter<DeviceContract.View>()
                     providerView().showData(result)
                     providerView().showData(result)
                 }
                 }
 
 
+                is ClerkVO -> {
+                    providerView().showClerk(result)
+                }
+
                 is ArrayList<*> -> {
                 is ArrayList<*> -> {
                     providerView().showPhoneBook(result as ArrayList<PhoneBookItem>)
                     providerView().showPhoneBook(result as ArrayList<PhoneBookItem>)
                 }
                 }
@@ -143,5 +148,15 @@ class DevicePresenter @Inject constructor() : RxPresenter<DeviceContract.View>()
             .subscribe(observable)
             .subscribe(observable)
     }
     }
 
 
+    override fun checkClerk(partId: Int, passNo: String) {
+        deviceApi.getClerkByNo(partId, passNo)
+            .map {
+                val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                val clerkVO = gson.fromJson(it.getJsonString(), ClerkVO::class.java)
+                return@map clerkVO
+            }
+            .compose(ThreadFromUtils.defaultSchedulers())
+            .subscribe(observable)
+    }
 
 
 }
 }

+ 28 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/ClerkDO.java

@@ -3,6 +3,7 @@ package com.wdkl.ncs.android.middleware.model.dos;
 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
 import com.fasterxml.jackson.databind.annotation.JsonNaming;
 import com.fasterxml.jackson.databind.annotation.JsonNaming;
 import com.wdkl.ncs.android.middleware.model.annotation.Column;
 import com.wdkl.ncs.android.middleware.model.annotation.Column;
+import com.wdkl.ncs.android.middleware.model.annotation.Id;
 import com.wdkl.ncs.android.middleware.model.annotation.PrimaryKeyField;
 import com.wdkl.ncs.android.middleware.model.annotation.PrimaryKeyField;
 import com.wdkl.ncs.android.middleware.model.annotation.Table;
 import com.wdkl.ncs.android.middleware.model.annotation.Table;
 
 
@@ -21,6 +22,7 @@ public class ClerkDO implements Serializable {
      */
      */
     @Column(name = "clerk_id")
     @Column(name = "clerk_id")
     @ApiModelProperty(value = "人员id", required = false)
     @ApiModelProperty(value = "人员id", required = false)
+    @Id(name = "clerk_id")
     private Integer clerkId;
     private Integer clerkId;
     /**
     /**
      * 会员id
      * 会员id
@@ -46,6 +48,10 @@ public class ClerkDO implements Serializable {
     @Column(name = "role_id")
     @Column(name = "role_id")
     @ApiModelProperty(value = "权限id,可以确定为医生、护士、护工,主任医生、护士长", required = false)
     @ApiModelProperty(value = "权限id,可以确定为医生、护士、护工,主任医生、护士长", required = false)
     private Integer roleId;
     private Integer roleId;
+
+    @Column(name = "role_name")
+    @ApiModelProperty(value = "角色名称,医生、护士、护工,主任医生、护士长", required = false)
+    private String roleName;
     /**
     /**
      * 店员状态,0为禁用,1为正常
      * 店员状态,0为禁用,1为正常
      */
      */
@@ -95,6 +101,13 @@ public class ClerkDO implements Serializable {
     @ApiModelProperty(value = "null", required = false)
     @ApiModelProperty(value = "null", required = false)
     private String hisPartKeyval;
     private String hisPartKeyval;
 
 
+    /**
+     * 上属id
+     */
+    @Column(name = "parent_id")
+    @ApiModelProperty(value = "上属id", required = false)
+    private Integer parentId;
+
 
 
     @PrimaryKeyField
     @PrimaryKeyField
     public Integer getClerkId() {
     public Integer getClerkId() {
@@ -213,4 +226,19 @@ public class ClerkDO implements Serializable {
         this.hisPartKeyval = hisPartKeyval;
         this.hisPartKeyval = hisPartKeyval;
     }
     }
 
 
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
 }
 }

+ 80 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/ClerkVO.java

@@ -0,0 +1,80 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+import com.wdkl.ncs.android.middleware.model.dos.ClerkDO;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wuyunfeng
+ * 2022-11-10 15:37
+ */
+public class ClerkVO extends ClerkDO {
+
+    @ApiModelProperty(value = "工号", required = false)
+    private String passNo;
+
+    @ApiModelProperty(value = "角色类型枚举值", required = false)
+    private String roleType;
+
+    @ApiModelProperty(value = "上级角色Id", required = false)
+    private Integer leaderRoleId;
+
+
+    @ApiModelProperty(value = "上级领导clerkId", required = false)
+    private Integer leaderId;
+
+
+    @ApiModelProperty(value = "上级领导姓名", required = false)
+    private String leaderName;
+
+    @ApiModelProperty(value = "作为下属职员数据时指示是否为当前上级的下级", required = false)
+    private Boolean checked;
+
+    public String getPassNo() {
+        return passNo;
+    }
+
+    public void setPassNo(String passNo) {
+        this.passNo = passNo;
+    }
+
+    public Integer getLeaderRoleId() {
+        return leaderRoleId;
+    }
+
+    public void setLeaderRoleId(Integer leaderRoleId) {
+        this.leaderRoleId = leaderRoleId;
+    }
+
+    public Integer getLeaderId() {
+        return leaderId;
+    }
+
+    public void setLeaderId(Integer leaderId) {
+        this.leaderId = leaderId;
+    }
+
+    public String getLeaderName() {
+        return leaderName;
+    }
+
+    public void setLeaderName(String leaderName) {
+        this.leaderName = leaderName;
+    }
+
+    public Boolean getChecked() {
+        return checked;
+    }
+
+    public void setChecked(Boolean checked) {
+        this.checked = checked;
+    }
+
+    public String getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(String roleType) {
+        this.roleType = roleType;
+    }
+}

+ 1 - 0
nurseMainLib/src/main/java/android_serialport_api/SerialPort.java

@@ -27,6 +27,7 @@ public class SerialPort {
                 String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";
                 String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";
                 su.getOutputStream().write(cmd.getBytes());
                 su.getOutputStream().write(cmd.getBytes());
 
 
+                Log.e(TAG, "canRead: " + device.canRead() + ", canWrite: " + device.canWrite());
                 if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {
                 if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {
                     throw new SecurityException();
                     throw new SecurityException();
                 }
                 }

+ 176 - 0
nurseMainLib/src/main/java/serialporttest/utils/SerialPortNfcUtil.java

@@ -0,0 +1,176 @@
+package serialporttest.utils;
+
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import android_serialport_api.SerialPort;
+
+public class SerialPortNfcUtil {
+    private String TAG = "SerialPortNfcUtil";
+
+    public SerialPort serialPort = null;
+    public InputStream inputStream = null;
+    public OutputStream outputStream = null;
+
+    private ISerialPortNfcListener serialPortNfcListener = null;
+    public boolean isOpenSerialPortUtil = false;
+
+    public Thread receiveThread = null;
+
+    public static SerialPortNfcUtil instance = null;
+
+    public SerialPortNfcUtil() {
+    }
+
+    public static SerialPortNfcUtil getInstance() {
+        if (instance == null) {
+            synchronized (SerialPortNfcUtil.class) {
+                if (instance == null) {
+                    instance = new SerialPortNfcUtil();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * 打开串口的方法
+     */
+    public void openSerialPort() {
+        Log.i(TAG, "打开串口");
+        try {
+            serialPort = new SerialPort(new File("/dev/ttyS0"), 115200, 0);
+            //获取打开的串口中的输入输出流,以便于串口数据的收发
+            inputStream = serialPort.getInputStream();
+            outputStream = serialPort.getOutputStream();
+            isOpenSerialPortUtil = true;
+            receiveSerialPort();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 接收串口数据的方法
+     */
+    public void receiveSerialPort() {
+        if (receiveThread != null)
+            return;
+
+        Log.e(TAG, "NFC接收数据线程...");
+
+        receiveThread = new Thread() {
+            @Override
+            public void run() {
+                while (isOpenSerialPortUtil) {
+                    try {
+                        Thread.sleep(100);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+
+                    int size;
+                    try {
+                        byte[] buffer = new byte[64];
+                        if (inputStream == null) {
+                            return;
+                        }
+
+                        if(inputStream.available()>0) {
+                            size = inputStream.read(buffer);
+                            //Log.e(TAG, "nfc data byte: " + Arrays.toString(buffer) + ", size: " + size);
+                            if (size > 0) {
+                                if (serialPortNfcListener != null) {
+                                    serialPortNfcListener.onNfcData(buffer, size);
+                                }
+                            }
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        return;
+                    }
+                }
+            }
+        };
+        //启动接收线程
+        receiveThread.start();
+    }
+
+
+    /**
+     * 关闭串口的方法
+     * 关闭串口中的输入输出流
+     * 然后将flag的值设为flag,终止接收数据线程
+     */
+    public void closeSerialPort() {
+        Log.i(TAG, "关闭串口");
+        try {
+            if (inputStream != null) {
+                inputStream.close();
+            }
+            if (outputStream != null) {
+                outputStream.close();
+            }
+            if (receiveThread != null && receiveThread.isAlive()) {
+                receiveThread.interrupt();
+                receiveThread = null;
+            }
+            isOpenSerialPortUtil = false;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //MF1卡读块(待验证)
+    public void readTag() {
+        byte[] cmd = {(byte)0x00, (byte)0x00, (byte)0x0A, (byte)0x04, (byte)0x02, (byte)0x01,
+                (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x0D};
+
+        sendBytes(cmd);
+    }
+
+    /**
+     * 发送串口数据的方法
+     *
+     * @param command 要发送的数据
+     */
+    private void send(String command) {
+        try {
+            if (isOpenSerialPortUtil) {
+                byte[] sendData = command.getBytes();
+                outputStream.write(sendData);
+                Log.i(TAG, "NFC串口数据发送成功: " + command);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.i(TAG, "NFC串口数据发送失败");
+        }
+    }
+
+    private void sendBytes(byte[] cmd) {
+        try {
+            if (isOpenSerialPortUtil) {
+                outputStream.write(cmd);
+                Log.i(TAG, "NFC串口数据发送成功");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.i(TAG, "NFC串口数据发送失败");
+        }
+    }
+
+    public void setOnDataReceiveStringListener(ISerialPortNfcListener listener) {
+        serialPortNfcListener = listener;
+    }
+
+    public interface ISerialPortNfcListener {
+        void onNfcData(final byte[] buffer, final int size);
+    }
+
+}

+ 12 - 0
nurseMainLib/src/main/java/serialporttest/utils/StringUtils.java

@@ -1078,4 +1078,16 @@ public class StringUtils {
         }
         }
         return sb.toString();
         return sb.toString();
     }
     }
+
+    public static String bytesToHex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+    }
+
+    public static Long bytesToTenNum(String src) {
+        return Long.valueOf(src, 16);
+    }
 }
 }

+ 5 - 0
resource/src/main/res/drawable/ic_backspace.xml

@@ -0,0 +1,5 @@
+<vector android:height="48dp" android:tint="#f5f5f5"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#ffffff" android:pathData="M22,3L7,3c-0.69,0 -1.23,0.35 -1.59,0.88L0,12l5.41,8.11c0.36,0.53 0.9,0.89 1.59,0.89h15c1.1,0 2,-0.9 2,-2L24,5c0,-1.1 -0.9,-2 -2,-2zM19,15.59L17.59,17 14,13.41 10.41,17 9,15.59 12.59,12 9,8.41 10.41,7 14,10.59 17.59,7 19,8.41 15.41,12 19,15.59z"/>
+</vector>

+ 8 - 0
resource/src/main/res/drawable/lock_call_list_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <!-- 填充 -->
+    <solid android:color="#15b7b9" />
+    <!-- 圆角 -->
+    <corners android:radius="16dp" />
+</shape>

BIN
resource/src/main/res/mipmap-mdpi/lock_bg.png


+ 6 - 0
resource/src/main/res/values-es/strings.xml

@@ -340,4 +340,10 @@
     <string name="str_broadcast_network_type">Network</string>
     <string name="str_broadcast_network_type">Network</string>
     <string name="str_none_bc_file">No file to play</string>
     <string name="str_none_bc_file">No file to play</string>
     <string name="str_voice_broadcast_record">Release to send</string>
     <string name="str_voice_broadcast_record">Release to send</string>
+
+    <string name="str_lock_screen_tips">Please enter password or swipe the card to unlock</string>
+    <string name="str_unlock_deny">Sorry, you don\'t have permissions</string>
+    <string name="str_unlock_success">Hello, %s</string>
+    <string name="str_lock_title">Lock</string>
+    <string name="setting_lock_button">Show lock button:</string>
 </resources>
 </resources>

+ 6 - 0
resource/src/main/res/values-ru/strings.xml

@@ -340,4 +340,10 @@
     <string name="str_broadcast_network_type">Network</string>
     <string name="str_broadcast_network_type">Network</string>
     <string name="str_none_bc_file">No file to play</string>
     <string name="str_none_bc_file">No file to play</string>
     <string name="str_voice_broadcast_record">Release to send</string>
     <string name="str_voice_broadcast_record">Release to send</string>
+
+    <string name="str_lock_screen_tips">Please enter password or swipe the card to unlock</string>
+    <string name="str_unlock_deny">Sorry, you don\'t have permissions</string>
+    <string name="str_unlock_success">Hello, %s</string>
+    <string name="str_lock_title">Lock</string>
+    <string name="setting_lock_button">Show lock button:</string>
 </resources>
 </resources>

+ 6 - 0
resource/src/main/res/values-zh/strings.xml

@@ -343,4 +343,10 @@
     <string name="str_broadcast_network_type">网络广播</string>
     <string name="str_broadcast_network_type">网络广播</string>
     <string name="str_none_bc_file">没有文件播放</string>
     <string name="str_none_bc_file">没有文件播放</string>
     <string name="str_voice_broadcast_record">松开发送</string>
     <string name="str_voice_broadcast_record">松开发送</string>
+
+    <string name="str_lock_screen_tips">请输入密码或刷卡解锁</string>
+    <string name="str_unlock_deny">对不起, 您没有权限!</string>
+    <string name="str_unlock_success">您好, %s</string>
+    <string name="str_lock_title">锁屏</string>
+    <string name="setting_lock_button">显示锁屏按钮:</string>
 </resources>
 </resources>

+ 6 - 0
resource/src/main/res/values/strings.xml

@@ -343,4 +343,10 @@
     <string name="str_broadcast_network_type">Network</string>
     <string name="str_broadcast_network_type">Network</string>
     <string name="str_none_bc_file">No file to play</string>
     <string name="str_none_bc_file">No file to play</string>
     <string name="str_voice_broadcast_record">Release to send</string>
     <string name="str_voice_broadcast_record">Release to send</string>
+
+    <string name="str_lock_screen_tips">Please enter password or swipe the card to unlock</string>
+    <string name="str_unlock_deny">Sorry, you don\'t have permissions</string>
+    <string name="str_unlock_success">Hello, %s</string>
+    <string name="str_lock_title">Lock</string>
+    <string name="setting_lock_button">Show lock button:</string>
 </resources>
 </resources>