Przeglądaj źródła

无服务器sip主机端修改完成,包括本机注册,分机设备添加,修改,删除等,还有音视频通话

weizhengliang 1 rok temu
rodzic
commit
8c1696bbec
54 zmienionych plików z 2950 dodań i 574 usunięć
  1. 12 4
      android_host/src/main/h10_wke_1h/AndroidManifest.xml
  2. 3 3
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt
  3. 173 0
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt
  4. 0 260
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt.bak
  5. 736 0
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/SipHomeActivity.kt
  6. 76 0
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/ExtensionDeviceAdapter.kt
  7. 19 16
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/di/NurseHomeComponent.kt
  8. 225 0
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/DeviceManageFragment.kt
  9. 3 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt
  10. 150 0
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/HomeFragment.kt
  11. 32 10
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SipComingCallFragment.kt
  12. 10 16
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt
  13. 2 24
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/receiver/WdBootReceiver.java
  14. 1 38
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/settingconfig/SettingConfig.java
  15. 2 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUpdateHelper.java
  16. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java
  17. 2 11
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/Util.kt
  18. 6 0
      android_host/src/main/h10_wke_1h/res/drawable/selector_button_bg_color2.xml
  19. 9 37
      android_host/src/main/h10_wke_1h/res/layout/activity_register.xml
  20. 173 0
      android_host/src/main/h10_wke_1h/res/layout/activity_sip_home.xml
  21. 26 0
      android_host/src/main/h10_wke_1h/res/layout/adapter_extension_device.xml
  22. 155 0
      android_host/src/main/h10_wke_1h/res/layout/fragment_device_manage.xml
  23. 250 0
      android_host/src/main/h10_wke_1h/res/layout/fragment_home.xml
  24. 22 14
      android_host/src/main/h10_wke_1h/res/layout/fragment_system_settings.xml
  25. 0 43
      android_host/src/main/h10_wke_1h/res/layout/sip_call_layout.xml
  26. 1 1
      android_host/src/main/h10_wke_1h/res/values/strings.xml
  27. 1 1
      android_host/src/main/h10_z3128_1h/res/values/strings.xml
  28. 1 1
      app/src/main/AndroidManifest.xml
  29. 1 2
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  30. 5 0
      app/src/main/res/drawable/ic_home_launch.xml
  31. 1 1
      app/src/main/sharedUserId/AndroidManifest.xml
  32. 6 3
      build.gradle
  33. 18 39
      common/build.gradle
  34. 18 0
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseApplication.kt
  35. 120 0
      common/src/main/code/com/wdkl/ncs/android/lib/db/DeviceBean.java
  36. 15 7
      common/src/main/code/com/wdkl/ncs/android/lib/utils/AppTool.kt
  37. BIN
      common/src/main/res/drawable/delete.png
  38. BIN
      common/src/main/res/drawable/hedimg.png
  39. 5 0
      common/src/main/res/drawable/selector_btn_text_color.xml
  40. 6 0
      common/src/main/res/drawable/shape_delete_bt_bg.xml
  41. 9 0
      common/src/main/res/drawable/shape_main_hos_txt_bg.xml
  42. 7 0
      common/src/main/res/drawable/shape_n_login_ed_bg2.xml
  43. 5 0
      middleware/build.gradle
  44. 4 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  45. 54 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/ConfirmDialogHelper.java
  46. 79 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/ExtensionSipDialogHelper.java
  47. 72 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/PassCheckDialogHelper.java
  48. 74 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/SipDialogHelper.java
  49. 5 40
      middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/CommonUtils.java
  50. 49 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/StringUtil.java
  51. 63 0
      middleware/src/main/res/layout/confirm_dialog.xml
  52. 89 0
      middleware/src/main/res/layout/extension_sip_dialog.xml
  53. 77 0
      middleware/src/main/res/layout/password_check_dialog.xml
  54. 77 0
      middleware/src/main/res/layout/sip_dialog.xml

+ 12 - 4
android_host/src/main/h10_wke_1h/AndroidManifest.xml

@@ -79,20 +79,28 @@
             android:name="design_height_in_dp"
             android:value="800"/>
 
-        <activity android:name=".activity.NurseHomeActivity"
+        <activity android:name=".activity.RegisterActivity"
             android:launchMode="singleInstance"
             android:screenOrientation="landscape">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
-
                 <category android:name="android.intent.category.LAUNCHER"/>
-
                 <!-- 设置成桌面模式 -->
-<!--                <category android:name="android.intent.category.HOME" />
+                <!--<category android:name="android.intent.category.HOME" />
                 <category android:name="android.intent.category.DEFAULT" />-->
             </intent-filter>
         </activity>
 
+        <!--<activity android:name=".activity.NurseHomeActivity"
+            android:launchMode="singleInstance"
+            android:screenOrientation="landscape">
+        </activity>-->
+
+        <activity android:name=".activity.SipHomeActivity"
+            android:launchMode="singleInstance"
+            android:screenOrientation="landscape">
+        </activity>
+
         <activity android:name=".activity.AppUpdateActivity"
             android:screenOrientation="landscape"
             android:launchMode="singleTask"

+ 3 - 3
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -1276,13 +1276,13 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                if (select_id != 11) {
                    select_id = 11
 
-                   val fragment = SipComingCallFragment()
+                   /*val fragment = SipComingCallFragment()
                    val bundle = Bundle()
                    bundle.putInt("call_state", 0)
                    bundle.putBoolean("visiting", false)
-                   bundle.putBoolean("audio_only", true)
+                   bundle.putBoolean("audio_only", false)
                    fragment.arguments = bundle
-                   addCallFragment(fragment)
+                   addCallFragment(fragment)*/
                }
            }
        }

+ 173 - 0
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt

@@ -0,0 +1,173 @@
+package com.wdkl.ncs.android.component.nursehome.activity
+
+import android.Manifest
+import android.graphics.Color
+import android.os.Build
+import android.text.TextUtils
+import android.util.Log
+import com.enation.javashop.net.engine.model.NetState
+import com.enation.javashop.net.engine.plugin.permission.RxPermissions
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.databinding.ActivityRegisterBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import io.reactivex.Observable
+import com.wdkl.ncs.android.component.nursehome.BuildConfig
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.component.nursehome.util.NetHelper
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.helper.SipDialogHelper
+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.vo.NurseDeviceInfoVO
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import kotlinx.android.synthetic.main.activity_register.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+/**
+ *注册页Activity
+ */
+
+class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(),  DeviceContract.View {
+    var TAG = RegisterActivity::class.java.getSimpleName()
+
+    private var permissionGrant: Boolean = false
+
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.activity_register
+    }
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+    /**
+     *初始化操作
+     */
+    override fun init() {
+        AppTool.SystemUI.showNavigationBar(this,false)
+        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
+        requestPermissions()
+
+        Constants.mac = NetHelper.getInstance().macAddress
+        Constants.imei = NetHelper.getInstance().imei
+        Log.e(TAG,"mac: "+Constants.mac + ", imei: " + Constants.imei)
+        tv_local_mac.text = "本机MAC:"+Constants.mac
+        tv_local_imei.text = "IMEI或序列号: " + Constants.imei
+
+        if ("YUNPAI_H6".equals(Build.MODEL) || "YUNPAI_H6B".equals(Build.MODEL)) {
+            Constants.device_serial_id = Constants.imei
+        } else {
+            Constants.device_serial_id = Constants.mac
+        }
+
+        val macAddr = NetHelper.getInstance().macAddress
+        val ipAddr = NetHelper.getInstance().localIP
+        Constants.sip_id = CommonUtils.getSipAccount(activity)
+
+        tv_sip_account.text = "本机SIP: " + Constants.sip_id
+        tv_local_ip.text = "本机IP: " + ipAddr
+        tv_local_mac.text = "本机MAC: " + macAddr
+        tv_app_version.text = "APP版本: V" + BuildConfig.VERSION_NAME
+    }
+
+    private fun requestPermissions(){
+        Observable.just("").compose(RxPermissions(this).ensure(Manifest.permission.CAMERA,
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.ACCESS_WIFI_STATE,
+                Manifest.permission.RECORD_AUDIO,
+                Manifest.permission.READ_PHONE_STATE)
+        ).subscribe {
+            if (it){
+                Log.e(TAG,"拿到APP所有权限")
+                permissionGrant = true
+                if (!TextUtils.isEmpty(CommonUtils.getSipAccount(activity))) {
+                    AppTool.Time.delay(1000) {
+                        push("/siphome/main")
+                        finish()
+                    }
+                } else {
+                    showMessage("没有sip账号!")
+                }
+            }else{
+                showMessage("请授权...")
+                requestPermissions()
+            }
+        }.joinManager(disposableManager)
+    }
+
+    /**
+     *显示数据
+     */
+    override fun showData(data : NurseDeviceInfoVO) {
+
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+        btn_config_sip.setOnClickListener {
+            val ip = CommonUtils.getSipAccount(activity)
+            SipDialogHelper.showDialog(activity, ip) {
+                showMessage("设置成功")
+                CommonUtils.setSipAccount(BaseApplication.appContext, it)
+
+                if (permissionGrant) {
+                    AppTool.Time.delay(1000) {
+                        push("/siphome/main")
+                        finish()
+                    }
+                } else {
+                    showMessage("请授权...")
+                }
+            }
+        }
+    }
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+
+    }
+
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+
+    }
+
+    override fun onNoneNet() {
+
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+    }
+    /**
+     *耗时加载开始
+     */
+    override fun start() {
+    }
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+    }
+
+}

+ 0 - 260
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt.bak

@@ -1,260 +0,0 @@
-package com.wdkl.ncs.android.component.nursehome.activity
-
-import android.Manifest
-import android.content.Intent
-import android.graphics.Color
-import android.os.Build
-import android.os.Handler
-import android.text.TextUtils
-import android.util.Log
-import com.enation.javashop.android.jrouter.external.annotation.Router
-import com.enation.javashop.net.engine.model.NetState
-import com.enation.javashop.net.engine.plugin.permission.RxPermissions
-import com.wdkl.ncs.android.component.nursehome.R
-import com.wdkl.ncs.android.component.nursehome.databinding.ActivityRegisterBinding
-import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
-import com.wdkl.ncs.android.lib.base.BaseActivity
-import io.reactivex.Observable
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
-import com.wdkl.ncs.android.middleware.common.Constants
-import com.wdkl.ncs.android.component.nursehome.service.APPService
-import com.wdkl.ncs.android.component.nursehome.util.NetHelper
-import com.wdkl.ncs.android.lib.utils.*
-import com.wdkl.ncs.android.middleware.api.UrlManager
-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.bean.SettingConfiguration
-import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
-import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
-import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
-import com.wdkl.ncs.android.middleware.utils.MessageEvent
-import kotlinx.android.synthetic.main.activity_register.*
-import org.greenrobot.eventbus.Subscribe
-import org.greenrobot.eventbus.ThreadMode
-import java.lang.StringBuilder
-
-/**
- *注册页Activity
- */
-//@Router(path = "/nursehome/register")
-class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(),  DeviceContract.View {
-    var TAG = RegisterActivity::class.java.getSimpleName()
-
-    val QR_CODE_PATH = "http://m.wdklian.com/care/apk/care.user?type=NCS_DEVICE"
-
-    private val handler by lazy { Handler() }
-
-    private var permissionGrant: Boolean = false
-
-    /**
-     * 提供layoutID
-     */
-    override fun getLayId(): Int {
-        return R.layout.activity_register
-    }
-    /**
-     *初始化依赖注入
-     */
-    override fun bindDagger() {
-        NurseHomeLaunch.component.inject(this)
-    }
-    /**
-     *初始化操作
-     */
-    override fun init() {
-        AppTool.SystemUI.showNavigationBar(this,false)
-        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
-        requestPermissions()
-
-        Constants.mac = NetHelper.getInstance().macAddress
-        Constants.imei = NetHelper.getInstance().imei
-        Log.e(TAG,"mac: "+Constants.mac + ", imei: " + Constants.imei)
-        tv_local_mac.text = "本机MAC:"+Constants.mac
-        tv_local_imei.text = "IMEI或序列号: " + Constants.imei
-        tv_device_model.text = "设备型号: " + Build.MODEL
-
-        if ("YUNPAI_H6".equals(Build.MODEL) || "YUNPAI_H6B".equals(Build.MODEL)) {
-            Constants.device_serial_id = Constants.imei
-        } else {
-            Constants.device_serial_id = Constants.mac
-        }
-
-        Thread{
-            //val logoBitmap = BitmapFactory.decodeResource(resources, R.mipmap.erlogo)
-            var builder = StringBuilder()
-            builder.append(QR_CODE_PATH)
-            builder.append("&code=")
-            builder.append(Constants.DEVICE_CODE)
-            builder.append("&mac=")
-            builder.append(Constants.device_serial_id)
-            builder.append("&model=")
-            builder.append(Constants.DEVICE_MODEL)
-            builder.append("&hard_ver=")
-            builder.append(Constants.DEVICE_HARD_VER)
-            builder.append("&soft_ver=")
-            builder.append(Constants.DEVICE_SOFT_VER)
-            builder.append("&device_type=")
-            builder.append(Constants.DEVICE_TYPE)
-            builder.append("&device_name=")
-            builder.append(Constants.DEVICE_NAME)
-            val code = EcodeHelper().createQRImage(builder.toString(),280, null)
-            activity.runOnUiThread {
-                view_qr_code?.setImageBitmap(code)
-            }
-        }.start()
-        val macAddr = NetHelper.getInstance().macAddress
-        val ipAddr = NetHelper.getInstance().localIP
-        val buildUrl = UrlManager.build()
-        val serverIp =  buildUrl.buyer.substringAfterLast("//").substringBefore(":")
-
-        tv_local_ip.text = "本机IP: " + ipAddr + ", server: " + serverIp
-        tv_local_mac.text = "本机MAC: " + macAddr
-        tv_app_version.text = "APP版本: V" + BuildConfig.VERSION_NAME
-        //tv_mcu_version.text = "MCU版本: " + Constants.MCU_VERSION_NUMBER
-
-
-
-        btn_reload.isEnabled = false
-        btn_reload.setOnClickListener {
-            btn_reload.isEnabled = false
-            presenter.loadData(Constants.device_serial_id!!)
-        }
-
-        if (permissionGrant) {
-            presenter.loadData(Constants.device_serial_id!!)
-        } else {
-            reload()
-        }
-    }
-
-    private fun reload() {
-        handler.postDelayed({
-            if (permissionGrant) {
-                btn_reload.isEnabled = false
-                presenter.loadData(Constants.device_serial_id!!)
-            } else {
-                reload()
-            }
-        }, 15000)
-    }
-
-    private fun requestPermissions(){
-        Observable.just("").compose(RxPermissions(this).ensure(Manifest.permission.CAMERA,
-                Manifest.permission.READ_EXTERNAL_STORAGE,
-                Manifest.permission.WRITE_EXTERNAL_STORAGE,
-                Manifest.permission.ACCESS_WIFI_STATE,
-                Manifest.permission.RECORD_AUDIO,
-                Manifest.permission.READ_PHONE_STATE)
-        ).subscribe {
-            if (it){
-                Log.e(TAG,"拿到APP所有权限")
-                permissionGrant = true
-            }else{
-                showMessage("请重新授权,进入App")
-                requestPermissions()
-            }
-        }.joinManager(disposableManager)
-    }
-
-    /**
-     *显示数据
-     */
-    override fun showData(data : NurseDeviceInfoVO) {
-        Log.e(TAG,"收到返回的设备信息 "+data.hospitalName)
-        Log.e(TAG,"收到返回的设备信息 "+data.partName)
-        Log.e(TAG,"收到返回的设备信息 "+data.partId)
-        Log.e(TAG,"收到返回的设备信息 "+data.id)
-        Log.e(TAG,"收到返回的设备信息 "+data.sipId)
-        Log.e(TAG,"收到返回的设备信息 "+data.toString())
-//        Constants.mac = "e8:11:ca:03:0d:fb"
-        Constants.hospital_name = data.hospitalName
-        Constants.part_name = data.partName
-        Constants.part_id = data.partId
-        Constants.ids = data.id
-        Constants.sip_id = data.sipId
-        Constants.eth_ip = data.ethIp
-
-        Constants.DEVICE_CODE = data.code
-        Constants.DEVICE_MODEL =  data.model
-        Constants.DEVICE_HARD_VER =  data.hardVer
-        Constants.DEVICE_SOFT_VER = data.softVer
-        if (data.deviceType != null) {
-            Constants.DEVICE_TYPE = data.deviceType
-        }
-        if (data.name != null) {
-            Constants.DEVICE_NAME = data.name
-        }
-        if (data.backupId != null) {
-            Constants.back_id = data.backupId
-        }
-
-        if(TextUtils.isEmpty(data.partId.toString())|| TextUtils.isEmpty(data.id.toString())
-                || TextUtils.isEmpty(data.sipId)){
-            feedback_device_info_tv.text = "服务器返回初始化数据不全,请联系管理员"
-            showMessage("服务器返回数据不全,请联系管理员")
-            reload()
-            return
-        } else if (data.status != null && data.status == 0) {
-            feedback_device_info_tv.text = "设备未启用"
-            showMessage("设备未启用")
-            reload()
-            return
-        }
-
-        handler.removeCallbacksAndMessages(null)
-
-        AppTool.Time.delay(1000) {
-            push("/nursehome/main")
-            finish()
-        }
-    }
-
-    /**
-     *绑定事件
-     */
-    override fun bindEvent() {
-    }
-    /**
-     *页面销毁回调
-     */
-    override fun destory() {
-        handler.removeCallbacksAndMessages(null)
-    }
-
-    /**
-     *处理错误信息
-     */
-    override fun onError(message: String, type: Int) {
-        btn_reload.isEnabled = true
-        showMessage("数据加载错误: " + message)
-        reload()
-    }
-
-    override fun onNoneNet() {
-        //Log.e(TAG,"none net ")
-        btn_reload.isEnabled = true
-        showMessage("没有网络")
-        reload()
-    }
-
-    /**
-     *耗时加载完成
-     */
-    override fun complete(message: String, type: Int) {
-    }
-    /**
-     *耗时加载开始
-     */
-    override fun start() {
-    }
-    /**
-     *处理网络状态
-     */
-    override fun networkMonitor(state: NetState) {
-    }
-
-    @Subscribe(threadMode = ThreadMode.MAIN)
-    fun onMoonEvent(messageEvent: MessageEvent) {
-    }
-
-}

+ 736 - 0
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/SipHomeActivity.kt

@@ -0,0 +1,736 @@
+package com.wdkl.ncs.android.component.nursehome.activity
+
+import android.annotation.SuppressLint
+import android.content.*
+import android.content.pm.PackageManager
+import android.graphics.Color
+import android.media.AudioManager
+import android.net.ConnectivityManager
+import android.net.Uri
+import android.os.*
+import android.provider.Settings
+import android.support.v4.app.Fragment
+import android.support.v4.app.FragmentManager
+import android.support.v4.app.FragmentTransaction
+import android.util.Log
+import android.view.KeyEvent
+import android.view.View
+import android.widget.ImageView
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.component.nursehome.databinding.ActivityNurseHomeBinding
+import com.wdkl.ncs.android.component.nursehome.fragment.*
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
+import com.wdkl.ncs.android.component.nursehome.util.*
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.db.DeviceBean
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.helper.PassCheckDialogHelper
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.NurseHomeActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.NurseHomeActivityPresenter
+import com.wdkl.ncs.android.middleware.model.ServerInfo
+import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.HostDevicePartSettingVO
+import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
+import com.wdkl.ncs.android.middleware.tcp.channel.*
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.ncs.android.middleware.utils.StringUtil
+import com.wdkl.ncs.host.service.WdklSipService
+import kotlinx.android.synthetic.main.activity_sip_home.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import org.linphone.core.AccountCreator
+import org.linphone.core.Factory
+import org.linphone.core.TransportType
+import java.io.File
+import java.io.FileOutputStream
+import java.io.InputStream
+import java.util.*
+import java.util.concurrent.Executors
+import java.util.concurrent.ScheduledExecutorService
+import java.util.concurrent.TimeUnit
+
+/**
+ * 首页Activity
+ */
+@Router(path = "/siphome/main")
+class SipHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurseHomeBinding>(), NurseHomeActivityContract.View,
+        View.OnClickListener {
+    var TAG = SipHomeActivity::class.java.getSimpleName()
+
+    private var initialized = false
+    private val handler by lazy { Handler(Looper.getMainLooper()) }
+    private var executor: ScheduledExecutorService? = null
+
+    var currentFragment:Fragment? = null
+    var currentFragmentTwo:Fragment? = null
+
+    //通话界面fragment
+    private var skyCallFragment: Fragment? = null
+
+    var receiver :TimeReceiver? = null
+    var batteryBroadcastReceiver: BatteryBroadcastReceiver? = null
+
+    //当前选中的button id
+    var select_id: Int = 0
+    var pressTime: Long = 0
+
+    private var hookoffTime: Long = 0
+    private var hookonTime: Long = 0
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        val languageId: Int = SettingConfig.getLanguageId(this)
+        LocaleMangerUtils.setApplicationLanguageByIndex(this, languageId)
+
+        super.onCreate(savedInstanceState)
+    }
+
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.activity_sip_home
+    }
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+    /**
+     *初始化操作
+     */
+    @SuppressLint("ClickableViewAccessibility")
+    override fun init() {
+        AppTool.SystemUI.showNavigationBar(this,false)
+        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
+
+        if (Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
+            StatusBarHelper.toggleStatusBar(activity, true)
+        }
+
+        Constants.sip_id = CommonUtils.getSipAccount(activity)
+        sip_name.text = "sip: " + Constants.sip_id
+
+        permissionGranted()
+    }
+
+    private fun permissionGranted() {
+        if (SettingConfig.getSipEnabled(activity)) {
+            //启动sip服务
+            val serviceIntent = Intent(BaseApplication.appContext, WdklSipService::class.java)
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                //android8.0以上通过startForegroundService启动service
+                startForegroundService(serviceIntent)
+            } else {
+                startService(serviceIntent)
+            }
+        }
+
+        if ("YUNPAI_H6".equals(Build.MODEL) || "YUNPAI_H6B".equals(Build.MODEL) || "m3520b_bnkj_zx".equals(Build.MODEL)) {
+            Constants.device_serial_id = Constants.imei
+            if ("YUNPAI_H6".equals(Build.MODEL)) {
+                startYunpaiPlugin()
+            }
+        } else {
+            Constants.device_serial_id = Constants.mac
+        }
+
+        SpeechUtil.getInstance().init(BaseApplication.appContext) {
+            //如果tts启用失败或者不支持中文则将语音播报切换到音乐模式
+            if (!it) {
+                if (SettingConfig.getTtsMode(BaseApplication.appContext) == SettingConfig.TTS_ON) {
+                    SettingConfig.setTtsMode(BaseApplication.appContext, SettingConfig.TTS_OFF)
+                    showMessage(R.string.tts_disabled)
+                }
+            }
+        }
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            if (!Settings.canDrawOverlays(this)) {
+                val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
+                    Uri.parse("package:$packageName"))
+                startActivityForResult(intent, 10)
+            }
+        }
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            if (!Settings.System.canWrite(this)) {
+                val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
+                intent.data = Uri.parse("package:" + this.packageName)
+                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                startActivityForResult(intent, 11)
+            }
+        }
+
+        //检查服务器地址接口是否可用,可用则进入下一步获取设备信息,不可用则稍后再次尝试
+        gotoMainHome()
+    }
+
+    private fun startYunpaiPlugin() {
+        try {
+            val packageInfos = packageManager.getInstalledPackages(
+                PackageManager.GET_ACTIVITIES or
+                        PackageManager.GET_SERVICES
+            )
+            var needInstall = false
+            for (info in packageInfos) {
+                val pkg = info.packageName
+                if (pkg.equals("com.wd.app")) {
+                    //启动云派app升级监听服务
+                    val intent = Intent()
+                    intent.setClassName("com.wd.app", "com.wd.app.MyService")
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                        //android8.0以上通过startForegroundService启动service
+                        startForegroundService(intent)
+                    } else {
+                        startService(intent)
+                    }
+                    Constants.yunpai_plugin = true
+                    needInstall = false
+                    break
+                } else {
+                    needInstall = true
+                }
+            }
+
+            if (needInstall) {
+                //拷贝并安装云派app升级服务apk
+                Log.d(TAG,"准备安装升级服务apk")
+                Thread{
+                    try {
+                        val fileName = "yunpai_launch_app.apk"
+                        val dstPath = Environment.getExternalStorageDirectory().path + "/Download"
+                        val file = File(dstPath)
+                        if (!file.exists()) {
+                            file.mkdirs()
+                        }
+                        val outFile = File(dstPath + "/" + fileName)
+                        if (outFile.exists()) {
+                            outFile.delete()
+                        }
+                        val inputStream: InputStream = getAssets().open(fileName)
+                        val fos = FileOutputStream(outFile)
+                        val buffer = ByteArray(1024)
+                        var byteCount = 0
+                        while (inputStream.read(buffer).also { byteCount = it } != -1) {
+                            fos.write(buffer, 0, byteCount)
+                        }
+                        fos.flush()
+                        inputStream.close()
+                        fos.close()
+
+                        //apk拷贝完成,即将安装
+                        val action = "com.miki.slient.INSTALL_CUSTOMER_PACKAGES"
+                        val intent = Intent(action)
+                        intent.putExtra("apkPath", dstPath + "/" + fileName)
+                        intent.putExtra("packageName", "com.miki.sensortest")
+                        sendBroadcast(intent)
+
+                        runOnUiThread {
+                            showMessage(R.string.plugin_update_tips)
+                        }
+                    } catch (e: java.lang.Exception) {
+                        e.printStackTrace()
+                    }
+                }.start()
+            }
+        } catch (t: Throwable) {
+            t.printStackTrace()
+            showMessage(StringUtil.getResString(R.string.plugin_start_failed) + t.message)
+        }
+    }
+
+    private fun gotoMainHome() {
+        //初始化完成
+        if (initialized) {
+            return
+        }
+        initialized = true
+
+        currentFragment = HomeFragment()
+        supportFragmentManager.beginTransaction().replace(R.id.middle_fralyout, currentFragment, "").commitAllowingStateLoss()
+
+        home_radio_bt.isChecked = true
+
+        regReceiver()//注册广播
+        updateNetState()
+
+        startScheduledExecutor()
+
+        //记录app启动时间
+        val lastTime = SettingConfig.getAppStartTime(activity)
+        val currentTime = TimeTransition.getDateTime(System.currentTimeMillis(), "MM-dd HH:mm:ss")
+        debugLog(TAG, "app last start time: $lastTime, current time: $currentTime")
+        SettingConfig.setAppStartTime(activity, currentTime)
+
+
+        if (Settings.canDrawOverlays(this) && Settings.System.canWrite(this)) {
+            if (Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
+                StatusBarHelper.toggleStatusBar(activity, false)
+            }
+        }
+
+        updatePower()
+
+        Thread {
+            try {
+                if (SettingConfig.getSipEnabled(activity)) {
+                    //5s后配置sip账号
+                    Thread.sleep(5000)
+
+                    //无服务器时端口必须,固定5060,否则拨打IP时,也需加上端口号。如:sip:192.168.1.100:6666
+                    val transports = Factory.instance().createTransports()
+                    transports.setUdpPort(5060)
+                    transports.setTcpPort(5060)
+                    WdklSipService.getCore().setTransports(transports)
+
+                    //设置显示名称
+                    val accountCreator = WdklSipService.getCore().createAccountCreator(null)
+                    accountCreator.setUsername(Constants.sip_id) //此处就当设置为房间床位号
+                    accountCreator.setDomain(NetHelper.getInstance().getLocalIP())
+                    accountCreator.setTransport(TransportType.Udp)
+                    val cfg = accountCreator.createProxyConfig()
+                    WdklSipService.getCore().setDefaultProxyConfig(cfg)
+
+                    Log.e(TAG, "sip service started...")
+                }
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+            }
+        }.start()
+    }
+
+    private fun getPower(): Int {
+        val mBatteryManager = getSystemService(BATTERY_SERVICE) as BatteryManager
+        val power = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
+        Log.d(TAG, "power energy: power percent: $power")
+
+        return power
+    }
+
+    private fun updatePower() {
+        battery_state_img.setImageResource(R.drawable.wdkl_stat_sys_battery)
+        battery_state_img.drawable.level = getPower()
+    }
+
+    override fun onResume() {
+        super.onResume()
+
+        if (initialized && Settings.canDrawOverlays(this) && Settings.System.canWrite(this))  {
+            if (Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
+                StatusBarHelper.toggleStatusBar(activity, false)
+            }
+        }
+    }
+
+    override fun onStop() {
+        super.onStop()
+
+        if (Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
+            StatusBarHelper.toggleStatusBar(activity, true)
+        }
+    }
+
+    /**
+     * 时间变化监听
+     */
+    private fun regReceiver() {
+        receiver = TimeReceiver()
+        val intentFilter = IntentFilter()
+        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
+        //手柄状态监听
+        intentFilter.addAction(Constants.HOOK_OFF)
+        intentFilter.addAction(Constants.HOOK_ON)
+        registerReceiver(receiver, intentFilter)
+
+        //注册电池变化广播监听
+        val batteryInterFilter = IntentFilter()
+        batteryInterFilter.addAction(Intent.ACTION_BATTERY_CHANGED)
+        //batteryInterFilter.addAction(Intent.ACTION_POWER_CONNECTED)
+        //batteryInterFilter.addAction(Intent.ACTION_POWER_DISCONNECTED)
+        batteryBroadcastReceiver = BatteryBroadcastReceiver(battery_state_img)
+        registerReceiver(batteryBroadcastReceiver, batteryInterFilter)
+    }
+
+    override fun showDeviceData(data: NurseDeviceInfoVO) {
+
+    }
+
+    override fun setLedDeviceInfo(data: ArrayList<DeviceDO>) {
+
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+        home_radio_bt.setOnClickListener(this)
+        system_settings_radio_bt.setOnClickListener(this)
+        sip_device_radio_bt.setOnClickListener(this)
+    }
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+        handler.removeCallbacksAndMessages(null)
+        Constants.CALL_STATE = Constants.CALL_STANDBY
+        if (receiver != null) {
+            unregisterReceiver(receiver)
+        }
+        if (batteryBroadcastReceiver != null) {
+            unregisterReceiver(batteryBroadcastReceiver)
+        }
+        if (Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
+            StatusBarHelper.toggleStatusBar(activity, true)
+        }
+        SpeechUtil.getInstance().release()
+    }
+
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+
+    }
+
+    override fun onNoneNet() {
+
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+
+    }
+
+    /**
+     *耗时加载开始
+     */
+
+    override fun start() {
+    }
+
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+    }
+
+    override fun showAppVersion(appInfo: AppVersionDO) {
+
+    }
+
+    /**
+     * 显示设备tcp相关的配置信息
+     */
+    override fun showTcpData(data: TcpSeverDTO) {
+
+    }
+
+    override fun setServerInfo(data: ServerInfo) {
+
+    }
+
+    /**
+     * 得到设置配置的信息
+     */
+    override fun showSettingData(data: HostDevicePartSettingVO) {
+
+    }
+
+
+    override fun onClick(p0: View) {
+       when(p0.id){
+           R.id.home_radio_bt ->{
+               if (select_id != 0) {
+                   showMiddleFragment(HomeFragment())
+                   removeRightFragment()
+                   select_id = 0
+               }
+           }
+
+           R.id.system_settings_radio_bt ->{
+               if (select_id != 1) {
+                   select_id = 1
+                   showRightFragment(SystemSettingsFragment())
+               }
+           }
+
+           R.id.sip_device_radio_bt -> {
+               if (select_id != 2) {
+                   PassCheckDialogHelper.showDialog(activity) {
+                       select_id = 2
+                       showMiddleFragment(DeviceManageFragment())
+                       removeRightFragment()
+                   }
+               }
+           }
+       }
+    }
+
+    //显示中间主界面
+    fun showMiddleFragment(fragment: Fragment) {
+        supportFragmentManager.inTransaction {
+            remove(currentFragment)
+            currentFragment = fragment
+            if(currentFragmentTwo != null){
+                remove(currentFragmentTwo)
+                currentFragmentTwo = null
+            }
+            add(R.id.middle_fralyout, fragment)
+        }
+    }
+
+    //显示右侧设置界面
+    fun showRightFragment(fragment: Fragment){
+        supportFragmentManager.inTransaction {
+            if(currentFragmentTwo != null){
+                remove(currentFragmentTwo)
+            }
+            currentFragmentTwo = fragment
+            add(R.id.right_fralyout, fragment)
+        }
+    }
+
+    fun removeRightFragment() {
+        if (currentFragmentTwo != null) {
+            supportFragmentManager.inTransaction {
+                remove(currentFragmentTwo)
+            }
+            currentFragmentTwo = null
+        }
+    }
+
+    fun addCallFragment(fragment: Fragment) {
+        if (skyCallFragment != null) {
+            supportFragmentManager.beginTransaction()
+                .remove(skyCallFragment)
+                .commitAllowingStateLoss()
+            skyCallFragment = null
+        }
+
+        skyCallFragment = fragment
+        supportFragmentManager.beginTransaction()
+            .setCustomAnimations(R.anim.slide_down_in, R.anim.slide_up_out)
+            .add(R.id.call_frame, fragment)
+            .commitAllowingStateLoss()
+    }
+
+    fun removeCallFragment() {
+        if (skyCallFragment != null) {
+            supportFragmentManager.beginTransaction()
+                //.setCustomAnimations(R.anim.slide_down_in, R.anim.slide_down_out)
+                .remove(skyCallFragment)
+                .commitAllowingStateLoss()
+            skyCallFragment = null
+        }
+    }
+
+    fun removeFragment(fragment: Fragment) {
+        supportFragmentManager.beginTransaction().remove(fragment).commitAllowingStateLoss()
+    }
+
+    inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
+        beginTransaction().func().commitAllowingStateLoss()
+    }
+
+    /*
+    * 启动一个定时任务执行检测
+     */
+    private fun startScheduledExecutor() {
+        val timerTask: TimerTask = object : TimerTask() {
+            override fun run() {
+                runOnUiThread {
+                    updateNetState()
+                }
+            }
+        }
+
+        executor = Executors.newSingleThreadScheduledExecutor()
+        executor?.scheduleAtFixedRate(timerTask, 100, 90, TimeUnit.SECONDS)
+    }
+
+    inner class TimeReceiver: BroadcastReceiver() {
+        override fun onReceive(context: Context, intent: Intent) {
+            if (intent.action == Constants.HOOK_ON) {
+                Log.e(TAG,"手柄放下 ")
+                if (System.currentTimeMillis() - hookonTime > 2000) {
+                    Constants.hookOn = true
+                    VoiceManagerUtil.switchAudioMode(activity, true)
+                    VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+
+                    EventBus.getDefault().post(MessageEvent("handoff", Constants.EVENT_END_CALL))
+                }
+
+                hookonTime = System.currentTimeMillis()
+            } else if (intent.action == Constants.HOOK_OFF) {
+                Log.e(TAG,"手柄拿起 ")
+                EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_TOGGLE_SPEAKER))
+                if (System.currentTimeMillis() - hookoffTime > 2000) {
+                    Constants.hookOn = false
+                    VoiceManagerUtil.switchAudioMode(activity, false)
+                    VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+
+                    EventBus.getDefault().post(MessageEvent("hookoff", Constants.EVENT_HOOK_OFF))
+                }
+
+                hookoffTime = System.currentTimeMillis()
+            } else if (intent.action == ConnectivityManager.CONNECTIVITY_ACTION) {
+                updateNetState()
+            }
+        }
+    }
+
+    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+        Log.d(TAG, "keyDown ====> keyCode: $keyCode, action: ${event?.action}")
+        if (keyCode == 135) {
+            //手柄拿起
+            EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_TOGGLE_SPEAKER))
+            if (System.currentTimeMillis() - hookoffTime > 2000) {
+                Constants.hookOn = false
+                VoiceManagerUtil.switchAudioMode(activity, false)
+                VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+
+                EventBus.getDefault().post(MessageEvent("hookoff", Constants.EVENT_HOOK_OFF))
+            }
+            hookoffTime = System.currentTimeMillis()
+        } else if (keyCode == 134) {
+            //手柄放下
+            if (System.currentTimeMillis() - hookonTime > 2000) {
+                Constants.hookOn = true
+                VoiceManagerUtil.switchAudioMode(activity, true)
+                VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+
+                EventBus.getDefault().post(MessageEvent("handoff", Constants.EVENT_END_CALL))
+            }
+            hookonTime = System.currentTimeMillis()
+        }
+        return super.onKeyDown(keyCode, event)
+    }
+
+
+    private fun updateNetState() {
+        if (NetHelper.getInstance().networkType == ConnectivityManager.TYPE_WIFI) {
+            wifi_state_imagev.visibility = View.VISIBLE
+            wifi_state_imagev.setImageResource(R.drawable.ic_wifi_success)
+            ethernet_state_imagev.visibility = View.GONE
+        } else if (NetHelper.getInstance().networkType == ConnectivityManager.TYPE_ETHERNET) {
+            ethernet_state_imagev.visibility = View.VISIBLE
+            ethernet_state_imagev.setImageResource(R.drawable.ic_ethernet_success)
+            wifi_state_imagev.visibility = View.GONE
+        }
+    }
+
+    override fun onBackPressed() {
+        //禁用返回
+    }
+
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        when (messageEvent.getType()) {
+
+            //退出通话界面
+            Constants.EVENT_REMOVE_CALL_FRAGMENT -> {
+                if (skyCallFragment != null) {
+                    removeCallFragment()
+                }
+
+                DeviceChannel.calling = false
+                Constants.CALL_STATE = Constants.CALL_STANDBY
+                VoiceManagerUtil.setAudioMode(BaseApplication.appContext, AudioManager.MODE_NORMAL)
+            }
+
+            Constants.SIP_INCOMING_VOICE_CALL -> {
+                val callName = messageEvent.getMessage() as String
+                val fragment = SipComingCallFragment()
+                val bundle = Bundle()
+                bundle.putInt("call_state", 1)
+                bundle.putBoolean("visiting", false)
+                bundle.putBoolean("audio_only", true)
+                bundle.putString("call_name", callName)
+                fragment.arguments = bundle
+                addCallFragment(fragment)
+            }
+
+            Constants.SIP_INCOMING_VIDEO_CALL -> {
+                val callName = messageEvent.getMessage() as String
+                val fragment = SipComingCallFragment()
+                val bundle = Bundle()
+                bundle.putInt("call_state", 1)
+                bundle.putBoolean("visiting", false)
+                bundle.putBoolean("audio_only", false)
+                bundle.putString("call_name", callName)
+                fragment.arguments = bundle
+                addCallFragment(fragment)
+            }
+
+            Constants.SIP_OUTGOING_VOICE_CALL -> {
+                val device = messageEvent.getMessage() as DeviceBean
+                val fragment = SipComingCallFragment()
+                val bundle = Bundle()
+                bundle.putInt("call_state", 0)
+                bundle.putBoolean("visiting", false)
+                bundle.putBoolean("audio_only", true)
+                bundle.putString("call_name", device.sipId)
+                bundle.putString("targetId", device.sipIp)
+                fragment.arguments = bundle
+                addCallFragment(fragment)
+            }
+
+            Constants.SIP_OUTGOING_VIDEO_CALL -> {
+                val device = messageEvent.getMessage() as DeviceBean
+                val fragment = SipComingCallFragment()
+                val bundle = Bundle()
+                bundle.putInt("call_state", 0)
+                bundle.putBoolean("visiting", false)
+                bundle.putBoolean("audio_only", false)
+                bundle.putString("call_name", device.sipId)
+                bundle.putString("targetId", device.sipIp)
+                fragment.arguments = bundle
+                addCallFragment(fragment)
+            }
+        }
+
+    }
+
+    inner class BatteryBroadcastReceiver(private val battery_view: ImageView) : BroadcastReceiver() {
+        @SuppressLint("LongLogTag")
+        override fun onReceive(context: Context, intent: Intent) {
+
+            val status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
+            val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
+            val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
+            //Log.e("battery", "status: $status, level: $level, scale: $scale")
+
+            when (status) {
+                BatteryManager.BATTERY_STATUS_UNKNOWN -> {
+
+                }
+
+                BatteryManager.BATTERY_STATUS_CHARGING -> { //充电中
+                    battery_view.setImageResource(R.drawable.wdkl_stat_sys_battery_charge)
+                    battery_view.drawable.level = level
+                }
+
+                else -> { //未充电
+                    battery_view.setImageResource(R.drawable.wdkl_stat_sys_battery)
+                    battery_view.drawable.level = level
+                }
+
+            }
+        }
+    }
+}
+
+

+ 76 - 0
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/ExtensionDeviceAdapter.kt

@@ -0,0 +1,76 @@
+package com.wdkl.ncs.android.component.nursehome.adapter
+
+import android.view.ViewGroup
+import com.alibaba.android.vlayout.LayoutHelper
+import com.alibaba.android.vlayout.layout.GridLayoutHelper
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.databinding.AdapterExtensionDeviceBinding
+import com.wdkl.ncs.android.component.nursehome.util.AppUtil
+import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
+import com.wdkl.ncs.android.lib.db.DeviceBean
+import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
+import com.wdkl.ncs.android.lib.utils.then
+
+class ExtensionDeviceAdapter (val data:ArrayList<DeviceBean>, val spanCount: Int = 3) : BaseDelegateAdapter<BaseRecyclerViewHolder<AdapterExtensionDeviceBinding>, DeviceBean>(){
+
+    /**
+     * 数据提供者
+     */
+    override fun dataProvider(): Any {
+        return data
+    }
+
+    /**
+     * Item坐标
+     */
+    override fun itemFilter(position: Int): Boolean {
+        return true
+    }
+
+    /**
+     * 获取Item总数
+     */
+    override fun getItemCount(): Int {
+        return data.size
+    }
+
+    /**
+     * 创建LayoutHelper
+     */
+    override fun onCreateLayoutHelper(): LayoutHelper {
+        return GridLayoutHelper(spanCount).then {
+            self ->
+            /**取消自动填充*/
+            self.setAutoExpand(false)
+
+            /**设置左右间距*/
+            self.hGap = 10
+
+            /**设置上下间距*/
+            self.vGap = 10
+
+            /**设置Margin*/
+            self.setMargin(0,0,0,0)
+        }
+
+    }
+
+    /**
+     * 创建ViewHolder
+     */
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterExtensionDeviceBinding> {
+        return BaseRecyclerViewHolder.build(parent, R.layout.adapter_extension_device)
+    }
+
+    /**
+     * 绑定数据
+     */
+    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<AdapterExtensionDeviceBinding>?, position: Int) {
+        holder?.bind { binding ->
+            val itemData = getItem(position)
+            val sipName = itemData.sipId
+            binding.tvName.text = AppUtil.parseCallNameByCode(sipName)
+        }
+    }
+
+}

+ 19 - 16
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/di/NurseHomeComponent.kt

@@ -2,7 +2,8 @@ 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.RegisterActivity
+import com.wdkl.ncs.android.component.nursehome.activity.SipHomeActivity
 import com.wdkl.ncs.android.component.nursehome.fragment.*
 import com.wdkl.ncs.android.middleware.di.ApplicationComponent
 import dagger.Component
@@ -12,21 +13,23 @@ import dagger.Component
  */
 @Component(dependencies = arrayOf(ApplicationComponent::class))
 interface NurseHomeComponent{
-    //fun inject(activity: RegisterActivity)
+    fun inject(activity: RegisterActivity)
     fun inject(activity: NurseHomeActivity)
-    fun inject(activity: FramePartFragment)
-    fun inject(activity: BroadcastFragment)
-    fun inject(activity: VisitManagementFragment)
-    fun inject(activity: DoctorHostFragment)
-    fun inject(activity: BedsInTheWardFragment)
-    fun inject(activity: SickbedFragment)
-    fun inject(activity: NurseMoveFragment)
-    fun inject(activity: OtherHostFragment)
+    fun inject(activity: SipHomeActivity)
 
-    fun inject(activity: TrustManagementFragment)
-    fun inject(activity: SystemSettingsFragment)
-
-    fun inject(activity: CallRecordsFragment)
-    fun inject(activity: InpatientWardFragment)
-    fun inject(activity: AppUpdateActivity)
+    fun inject(fragment: HomeFragment)
+    fun inject(fragment: FramePartFragment)
+    fun inject(fragment: BroadcastFragment)
+    fun inject(fragment: VisitManagementFragment)
+    fun inject(fragment: DoctorHostFragment)
+    fun inject(fragment: BedsInTheWardFragment)
+    fun inject(fragment: SickbedFragment)
+    fun inject(fragment: NurseMoveFragment)
+    fun inject(fragment: OtherHostFragment)
+    fun inject(fragment: DeviceManageFragment)
+    fun inject(fragment: TrustManagementFragment)
+    fun inject(fragment: SystemSettingsFragment)
+    fun inject(fragment: CallRecordsFragment)
+    fun inject(fragment: InpatientWardFragment)
+    fun inject(fragment: AppUpdateActivity)
 }

+ 225 - 0
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/DeviceManageFragment.kt

@@ -0,0 +1,225 @@
+package com.wdkl.ncs.android.component.nursehome.fragment
+
+import android.view.View
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.adapter.ExtensionDeviceAdapter
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentDeviceManageBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.component.nursehome.util.AppUpdateHelper
+import com.wdkl.ncs.android.component.nursehome.util.AppUtil
+import com.wdkl.ncs.android.component.nursehome.util.NetHelper
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.db.DeviceBean
+import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.middleware.helper.ConfirmDialogHelper
+import com.wdkl.ncs.android.middleware.helper.ExtensionSipDialogHelper
+import com.wdkl.ncs.android.middleware.helper.SipDialogHelper
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.OtherHostContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.OtherHostPresenter
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import kotlinx.android.synthetic.main.fragment_device_manage.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class DeviceManageFragment : BaseFragment<OtherHostPresenter, FragmentDeviceManageBinding>(), OtherHostContract.View, View.OnClickListener {
+    var TAG = DeviceManageFragment::class.java.getSimpleName()
+
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+
+    var deviceAdapter: ExtensionDeviceAdapter? = null
+
+    private var selectDevice: DeviceBean? = null
+
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.fragment_device_manage
+    }
+
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    /**
+     *初始化操作
+     */
+    override fun init() {
+        /**初始化LayoutMannager*/
+        virtualLayoutManager = VirtualLayoutManager(this.activity)
+        /**初始化适配器*/
+        delegateAdapter = DelegateAdapter(virtualLayoutManager)
+
+        deviceAdapter = ExtensionDeviceAdapter(ArrayList(), 2)
+        delegateAdapter.addAdapter(deviceAdapter)
+
+        /**配置到RecycleView*/
+        rv_extension_devices.layoutManager = virtualLayoutManager
+        rv_extension_devices.adapter = delegateAdapter
+
+        rb_host_device.isChecked = true
+        tv_host_sip.setText("本机sip账号: " + Constants.sip_id + "@" + NetHelper.getInstance().localIP)
+    }
+
+    private fun loadDevices() {
+        //加载数据
+        val devices = BaseApplication.daoSession?.deviceBeanDao?.loadAll()
+        if (devices != null && devices.size > 0) {
+            deviceAdapter?.data?.clear()
+            deviceAdapter?.data?.addAll(devices)
+            deviceAdapter?.notifyDataSetChanged()
+        }
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+        group_devices.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.rb_host_device) {
+                ll_host_device.visibility = View.VISIBLE
+                ll_extension_devices.visibility = View.GONE
+            } else if (checkedId == R.id.rb_extension_device) {
+                ll_host_device.visibility = View.GONE
+                ll_extension_devices.visibility = View.VISIBLE
+
+                loadDevices()
+
+                selectDevice = null
+                tv_select_device.text = ""
+            }
+        }
+
+        btn_config.setOnClickListener {
+            SipDialogHelper.showDialog(activity, CommonUtils.getSipAccount(activity)) {
+                CommonUtils.setSipAccount(BaseApplication.appContext, it)
+
+                showMessage("修改成功,即将重启")
+                AppTool.Time.delay(1500) {
+                    AppUpdateHelper.restartApp(activity)
+                }
+            }
+        }
+
+        deviceAdapter?.setOnItemClickListener { data, position ->
+            selectDevice = data
+
+            tv_select_device.text = "账号: " + data.sipId + "\nIP: " + data.sipIp
+        }
+
+
+        btn_add_device.setOnClickListener(this)
+        btn_config_device.setOnClickListener(this)
+        btn_delete_device.setOnClickListener(this)
+    }
+
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+    }
+
+    /**
+     *显示数据
+     */
+    override fun showDevice(devices: ArrayList<DeviceDO>) {
+
+    }
+
+    override fun showAllHostDevice(devices: ArrayList<DeviceDO>) {
+
+    }
+
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载开始
+     */
+    override fun start() {
+    }
+
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+
+    }
+
+    override fun onClick(p0: View?) {
+        when (p0?.id) {
+            R.id.btn_add_device -> {
+                ExtensionSipDialogHelper.showDialog(activity, "", ""
+                ) { strId, strIp ->
+                    val device = DeviceBean()
+                    device.createTime = System.currentTimeMillis()
+                    device.name = "Extension"
+                    device.sipId = strId
+                    device.sipIp = strIp
+                    BaseApplication.daoSession?.deviceBeanDao?.insert(device)
+
+                    showMessage("添加成功")
+                    //重新加载
+                    loadDevices()
+                }
+            }
+
+            R.id.btn_config_device -> {
+                if (selectDevice != null) {
+                    ExtensionSipDialogHelper.showDialog(activity, selectDevice?.sipId, selectDevice?.sipIp
+                    ) { strId, strIp ->
+                        selectDevice?.sipId = strId
+                        selectDevice?.sipIp = strIp
+                        BaseApplication.daoSession?.deviceBeanDao?.update(selectDevice)
+
+                        showMessage("修改成功")
+                        //重新加载
+                        loadDevices()
+                    }
+                } else {
+                    showMessage("请先选择设备")
+                }
+            }
+
+            R.id.btn_delete_device -> {
+                if (selectDevice != null) {
+                    val tips = "确认删除?\n" + AppUtil.parseCallNameByCode(selectDevice?.sipId)
+                    ConfirmDialogHelper.showDialog(activity, tips) {
+                        BaseApplication.daoSession?.deviceBeanDao?.delete(selectDevice)
+
+                        showMessage("删除成功")
+                        //重新加载
+                        loadDevices()
+                    }
+                } else {
+                    showMessage("请先选择设备")
+                }
+            }
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+    }
+}

+ 3 - 1
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt

@@ -131,7 +131,9 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
         rv_exam_config.layoutManager = layoutManager2
         rv_exam_config.adapter = examAdapter
 
-        presenter.loadData(Constants.part_id)
+        if (Constants.part_id != -1) {
+            presenter.loadData(Constants.part_id)
+        }
 
     }
     /**

+ 150 - 0
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/HomeFragment.kt

@@ -0,0 +1,150 @@
+package com.wdkl.ncs.android.component.nursehome.fragment
+
+import android.os.Environment
+import android.text.TextUtils
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.net.engine.model.NetState
+import com.scwang.smartrefresh.layout.footer.ClassicsFooter
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.adapter.*
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentHomeBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.component.nursehome.util.AppUtil
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.db.DeviceBean
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.lib.vo.filter
+import com.wdkl.ncs.android.middleware.common.Constants
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.FramePartContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.FramePartPresenter
+import com.wdkl.ncs.android.middleware.model.vo.*
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.ncs.host.service.WdklSipService
+import kotlinx.android.synthetic.main.fragment_home.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class HomeFragment: BaseFragment<FramePartPresenter, FragmentHomeBinding>(), FramePartContract.View {
+    var TAG = HomeFragment::class.java.getSimpleName()
+
+    private var adapter: ExtensionDeviceAdapter? = null
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+    private var targetDevice: DeviceBean? = null
+
+    private var clickTime: Long = 0
+
+    override fun getLayId(): Int {
+        return R.layout.fragment_home
+    }
+
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        /**初始化LayoutMannager*/
+        virtualLayoutManager = VirtualLayoutManager(this.activity)
+
+        /**初始化适配器*/
+        delegateAdapter = DelegateAdapter(virtualLayoutManager)
+
+        adapter = ExtensionDeviceAdapter(ArrayList())
+        delegateAdapter.addAdapter(adapter)
+        mViewDataBinding.bedRefresh.setRefreshFooter(ClassicsFooter(activity))
+
+        /**配置到RecycleView*/
+        bed_list_view.layoutManager = virtualLayoutManager
+        bed_list_view.adapter = delegateAdapter
+
+        loadData()
+    }
+
+    private fun loadData() {
+        //加载数据
+        val devices = BaseApplication.daoSession?.deviceBeanDao?.loadAll()
+        if (devices != null && devices.size > 0) {
+            adapter?.data?.clear()
+            adapter?.data?.addAll(devices)
+            adapter?.notifyDataSetChanged()
+        }
+    }
+
+    override fun bindEvent() {
+        adapter?.setOnItemClickListener { data, position ->
+            targetDevice = data
+
+            bed_name.text = AppUtil.parseCallNameByCode(data.sipId)
+            bed_sip_name.text = data.sipId + "@" + data.sipIp
+        }
+
+        call_the_voice_tv.setOnClickListener {
+            if (System.currentTimeMillis() - clickTime < 3000) {
+                showMessage(R.string.call_wait)
+            } else {
+                if (targetDevice != null && !TextUtils.isEmpty(targetDevice?.sipId) && !TextUtils.isEmpty(targetDevice?.sipIp)) {
+                    EventBus.getDefault().post(MessageEvent(targetDevice!!, Constants.SIP_OUTGOING_VOICE_CALL))
+                } else {
+                    showMessage("呼叫设备数据异常!")
+                }
+
+                clickTime = System.currentTimeMillis()
+            }
+        }
+
+        call_the_video_tv.setOnClickListener {
+            if (System.currentTimeMillis() - clickTime < 3000) {
+                showMessage(R.string.call_wait)
+            } else {
+                if (targetDevice != null && !TextUtils.isEmpty(targetDevice?.sipId) && !TextUtils.isEmpty(targetDevice?.sipIp)) {
+                    EventBus.getDefault().post(MessageEvent(targetDevice!!, Constants.SIP_OUTGOING_VIDEO_CALL))
+                } else {
+                    showMessage("呼叫设备数据异常!")
+                }
+
+                clickTime = System.currentTimeMillis()
+            }
+        }
+
+    }
+
+    override fun showCustomerInfo(data: CustomerInfoVO) {
+
+    }
+
+    override fun destory() {
+
+    }
+
+    override fun onError(message: String, type: Int) {
+
+    }
+
+    override fun start() {
+    }
+
+    override fun showData(data: FramePartVO) {
+
+    }
+
+    override fun complete(message: String, type: Int) {
+    }
+
+    override fun networkMonitor(state: NetState) {
+        state.filter(onWifi = {
+
+        },onMobile = {
+
+        },offline = {
+
+        })
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+
+    }
+}

+ 32 - 10
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SipComingCallFragment.kt

@@ -4,9 +4,11 @@ import android.os.*
 import android.util.Log
 import android.view.View
 import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.nursehome.util.AppUtil
 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.Util
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.common.Constants
@@ -46,7 +48,9 @@ class SipComingCallFragment: BaseCallFragment() {
                 //发起通话
                 outGoing = true
                 showCallView(true)
-                //RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.ring_back2, true)
+                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.ring_back2, true)
+
+                startSipCall()
             }
 
             1 -> {
@@ -91,7 +95,7 @@ class SipComingCallFragment: BaseCallFragment() {
             acceptSipCall()
         }
 
-        button_call.setOnClickListener {
+        /*button_call.setOnClickListener {
             sky_voice_call_calling_text.setText(R.string.call_in_calling)
             val addressToCall = sipCore?.interpretUrl(edit_call_number.text.toString())
             val params = sipCore?.createCallParams(null)
@@ -107,6 +111,20 @@ class SipComingCallFragment: BaseCallFragment() {
             }
 
             button_call.isEnabled = false
+        }*/
+    }
+
+    private fun startSipCall() {
+        val addressToCall = sipCore?.interpretUrl("$callName@$targetId")
+        val params = sipCore?.createCallParams(null)
+        //视频开关
+        params?.enableVideo(!onlyAudio)
+
+        //录音文件路径
+        params?.recordFile = Environment.getExternalStorageDirectory().path + "/" + Environment.DIRECTORY_DOWNLOADS + "/" + AppUtil.getTimeFilename() + ".wav"
+
+        if (addressToCall != null) {
+            sipCore?.inviteAddressWithParams(addressToCall, params!!)
         }
     }
 
@@ -151,31 +169,35 @@ class SipComingCallFragment: BaseCallFragment() {
     }
 
     private fun showCallView(outgoing: Boolean) {
+        val nameText = AppUtil.parseCallNameByCode(callName)
         if (outgoing) {
             //呼出
             countDownTimer.start()
-            ll_out_call.visibility = View.VISIBLE
-            sky_voice_call_calling_text.setText("")
+            sky_call_name.text = nameText
+            sky_voice_call_calling_text.setText(R.string.call_in_calling)
             sky_voice_call_incoming.visibility = View.GONE
             sky_voice_call_outgoing.visibility = View.VISIBLE
             sky_voice_call_timer.visibility = View.GONE
         } else {
             //来电
-            val nameText = AppUtil.parseCallNameByCode(callName)
-            SpeechUtil.getInstance().addSpeech(BaseApplication.appContext.getString(R.string.voice_call_speech, nameText), false)
+            if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_ON) {
+                val speechText = BaseApplication.appContext.getString(R.string.voice_call_speech, nameText)
+                SpeechUtil.getInstance().addSpeech(Util.appendSpace(speechText), false)
+            } else {
+                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.ring_tone, true)
+            }
             sky_call_name.text = nameText
             sky_voice_call_calling_text.setText(R.string.call_incoming)
             sky_voice_call_incoming.visibility = View.VISIBLE
             sky_voice_call_outgoing.visibility = View.GONE
             sky_voice_call_timer.visibility = View.GONE
         }
-
-        if (!onlyAudio) {
-            video_call_view.visibility = View.VISIBLE
-        }
     }
 
     private fun showCalling(audioOnly: Boolean) {
+        RingPlayHelper.stopRingTone()
+        countDownTimer.cancel()
+
         if (callEnded) {
             return
         }

+ 10 - 16
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt

@@ -12,7 +12,6 @@ import android.widget.SeekBar
 import com.enation.javashop.net.engine.model.NetState
 import com.wdkl.ncs.android.component.nursehome.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
-import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity
 import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.component.nursehome.databinding.FragmentSystemSettingsBinding
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
@@ -21,6 +20,7 @@ import com.wdkl.ncs.android.component.nursehome.util.*
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.base.BaseFragment
 import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.helper.PassCheckDialogHelper
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.SystemSettingsContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.SystemSettingsPresenter
 import com.wdkl.ncs.android.middleware.model.bean.SettingConfiguration
@@ -132,7 +132,6 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
         //主机晚上亮度
         host_night_brightness_tv.text = SettingConfig.getHostNightBrightness(this.activity).toString()
         host_night_brightness_tv_seekb.setProgress(SettingConfig.getHostNightBrightness(this.activity))
-        //todo 根据白天晚上设置亮度
 
         //主机白天系统音量
         host_daytime_volume_tv.text = SettingConfig.getHostDaytimeVolume(this.activity).toString()
@@ -140,7 +139,6 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
         //主机晚上系统音量
         host_night_volume_tv.text = SettingConfig.getHostNightVolume(this.activity).toString()
         host_night_volume_seekb.setProgress(SettingConfig.getHostNightVolume(this.activity))
-        //todo 根据白天晚上设置系统音量
 
         //主机免提录入音量
         hands_free_input_volume_of_host_machine_tv.text = SettingConfig.getHandsFreeInputVolumeOfHostMachine(this.activity).toString()
@@ -148,7 +146,6 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
         //主机手柄免提录入音量
         host_handle_input_volume_tv.text = SettingConfig.getHostHandleInputVolume(this.activity).toString()
         host_handle_input_volume_seekb.setProgress(SettingConfig.getHostHandleInputVolume(this.activity))
-        //todo 根据白天晚上设置录入音量
 
 
         //主机免提播放音量
@@ -158,6 +155,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
         host_gamepad_play_volume_tv.text = SettingConfig.getHostGamepadPlayVolume(this.activity).toString()
         host_gamepad_play_volume_seekb.setProgress(SettingConfig.getHostGamepadPlayVolume(this.activity))*/
 
+        //主机通话音量
         host_call_volume_tv.text = SettingConfig.getHostCallVolume(this.activity).toString()
         host_call_volume_seekb.setProgress(SettingConfig.getHostCallVolume(this.activity))
 
@@ -256,12 +254,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
 
 
         software_and_information_tv.setText("Version: V" + BuildConfig.VERSION_NAME + "_" + BuildConfig.VERSION_CODE)
-        software_and_information_tv.setOnLongClickListener {
-            Constants.autoUpdate = false
-            (activity as NurseHomeActivity).checkApp()
 
-            return@setOnLongClickListener true
-        }
         software_and_information_tv.setOnClickListener {
             val time = System.currentTimeMillis()
             if (time - clickTime < 1500) {
@@ -493,7 +486,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             }
 
             R.id.system_settings_tv -> {
-                PasswordDialogHelper.showPasswordDialog(activity) {
+                PassCheckDialogHelper.showDialog(activity) {
                     val intent = Intent(Settings.ACTION_SETTINGS)
                     startActivity(intent)
 
@@ -508,7 +501,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             }
 
             R.id.restart_tv -> {
-                PasswordDialogHelper.showPasswordDialog(activity) {
+                PassCheckDialogHelper.showDialog(activity) {
                     AppUpdateHelper.restartApp(BaseApplication.appContext)
                 }
             }
@@ -550,16 +543,12 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             }
             R.id.hands_free_input_volume_of_host_machine_seekb -> { //主机免提录入音量
                 hands_free_input_volume_of_host_machine_tv.text = p1.toString()
-                //todo 这里需要配合语音通话 视屏通话通讯使用
             }
             R.id.host_handle_input_volume_seekb -> { //主机手柄录入音量
                 host_handle_input_volume_tv.text = p1.toString()
-                //todo 这里需要配合语音通话 视屏通话通讯使用
             }
             R.id.host_call_volume_seekb -> { //主机通话音量
                 host_call_volume_tv.text = p1.toString()
-                //todo 这里需要配合语音通话 视屏通话通讯使用
-                VoiceManagerUtil.setCallVoice(this.activity, p1)
             }
             R.id.extension_daytime_brightness_seekb -> { //分机白天亮度设置
                 extension_daytime_brightness_tv.text = p1.toString()
@@ -644,6 +633,11 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             R.id.host_handle_input_volume_seekb -> { //主机手柄录入音量
                 SettingConfig.setHostHandleInputVolume(this.activity,p0.progress)
             }
+            R.id.host_call_volume_seekb -> {
+                SettingConfig.setHostCallVolume(this.activity, p0.progress)
+                VoiceManagerUtil.setCallVoice(this.activity, p0.progress)
+                setTheSystemVolume(p0.progress)
+            }
             /*R.id.host_hands_free_play_volume_seekb -> { //主机免提播放音量
                 SettingConfig.setHostHandsFreePlayVolume(this.activity,p0.progress)
             }
@@ -776,7 +770,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
 
     override fun showData(data: PartSettingDO) {
         showMessage(R.string.settings_success)
-        (activity as NurseHomeActivity).showHome()
+        //(activity as NurseHomeActivity).showHome()
     }
 
     /**

+ 2 - 24
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/receiver/WdBootReceiver.java

@@ -3,11 +3,9 @@ package com.wdkl.ncs.android.component.nursehome.receiver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build;
-import android.os.Handler;
 import android.util.Log;
 
-import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity;
+import com.wdkl.ncs.android.component.nursehome.activity.SipHomeActivity;
 
 public class WdBootReceiver extends BroadcastReceiver {
 
@@ -16,29 +14,9 @@ public class WdBootReceiver extends BroadcastReceiver {
         if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
             Log.d("wdBoot", "收到开机广播,启动app");
 
-            Intent startIntent= new Intent(context, NurseHomeActivity.class);
+            Intent startIntent= new Intent(context, SipHomeActivity.class);
             startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(startIntent);
-
-            /*if ("m3520b_bnkj_zx".equals(Build.MODEL)) {
-                //15.6主机开机后延迟5s启动
-                new Handler().postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        startHome(context);
-                    }
-                }, 5000L);
-            } else {
-                startHome(context);
-            }*/
-
         }
     }
-
-    private void startHome(Context context) {
-        Log.d("wdBoot", "start home activity");
-        Intent startIntent= new Intent(context, NurseHomeActivity.class);
-        startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        context.startActivity(startIntent);
-    }
 }

+ 1 - 38
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/settingconfig/SettingConfig.java

@@ -228,7 +228,7 @@ public class SettingConfig {
     }
 
     public static boolean getVoiceNumeric(Context context) {
-        return getSP(context).getBoolean(KEY_SP_VOICE_NUMERIC, true);
+        return getSP(context).getBoolean(KEY_SP_VOICE_NUMERIC, false);
     }
 
     public static void setVoiceNumeric(Context context, boolean enable) {
@@ -366,43 +366,6 @@ public class SettingConfig {
         getEditor(context).putInt(KEY_SP_HANDS_FREE_INPUT_VOLUME, value).apply();
     }
 
-
-    /**
-     * 获取主机免提播放音量
-     *
-     * @return
-     */
-    /*public static int getHostHandsFreePlayVolume(Context context) {
-        return getSP(context).getInt(KEY_SP_HOST_HANDS_FREE_PLAY_VOLUME, host_hands_free_play_volume);
-    }*/
-
-    /**
-     * 设置主机免提播放音量
-     *
-     * @param value
-     */
-    /*public static void setHostHandsFreePlayVolume(Context context, int value) {
-        getEditor(context).putInt(KEY_SP_HOST_HANDS_FREE_PLAY_VOLUME, value).apply();
-    }*/
-
-    /**
-     * 获取主机手柄播放音量
-     *
-     * @return
-     */
-    /*public static int getHostGamepadPlayVolume(Context context) {
-        return getSP(context).getInt(KEY_SP_HOST_GAMEPAD_PLAY_VOLUME, host_gamepad_play_volume);
-    }*/
-
-    /**
-     * 设置主机手柄播放音量
-     *
-     * @param value
-     */
-    /*public static void setHostGamepadPlayVolume(Context context, int value) {
-        getEditor(context).putInt(KEY_SP_HOST_GAMEPAD_PLAY_VOLUME, value).apply();
-    }*/
-
     public static int getHostCallVolume(Context context) {
         return getSP(context).getInt(KEY_SP_HOST_CALL_VOLUME, default_host_call_volume);
     }

+ 2 - 1
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUpdateHelper.java

@@ -14,6 +14,7 @@ import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity;
+import com.wdkl.ncs.android.component.nursehome.activity.SipHomeActivity;
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig;
 import com.wdkl.ncs.host.service.WdklSipService;
 
@@ -317,7 +318,7 @@ public class AppUpdateHelper {
         }
 
         //重新启动app
-        Intent mStartActivity = new Intent(context.getApplicationContext(), NurseHomeActivity.class);
+        Intent mStartActivity = new Intent(context.getApplicationContext(), SipHomeActivity.class);
         mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
         int mPendingIntentId = 123456;
         PendingIntent mPendingIntent = PendingIntent.getActivity(context.getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);

+ 1 - 1
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java

@@ -75,7 +75,7 @@ public class AppUtil {
 
     public static String parseCallNameByCode(String org) {
         //org: 1001 or sip:1001@192.168.3.26
-        //sip账号匹配房号规则: 7550000506003011802201 ==> 3栋1单元1802房1分机
+        //sip账号匹配房号规则: 755 00005 06 003 01 18 02 2 01 ==> 3栋1单元1802房1分机
         //城市编码3位+小区编码5位+片区号2位+楼栋号3位+单元号2位+楼层号2位+房号2位+设备类型1位+设备号2位
 
         if (org == null || org.length() == 0) {

+ 2 - 11
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/Util.kt

@@ -9,6 +9,7 @@ import android.util.DisplayMetrics
 import android.view.WindowManager
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.middleware.utils.StringUtil
 
 
 object Util {
@@ -46,17 +47,7 @@ object Util {
 
     fun appendSpace(para: String): String {
         if (SettingConfig.getVoiceNumeric(BaseApplication.appContext)) {
-            val length = para.length
-            val value = CharArray(length shl 1)
-            var i = 0
-            var j = 0
-            while (i < length) {
-                value[j] = para[i]
-                value[1 + j] = ' '
-                ++i
-                j = i shl 1
-            }
-            return String(value)
+            return StringUtil.transNumber(para)
         } else {
             return para
         }

+ 6 - 0
android_host/src/main/h10_wke_1h/res/drawable/selector_button_bg_color2.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/radiobutton_background_unchecked"
+        android:state_pressed="true" />
+    <item android:drawable="@drawable/radiobutton_background_checked" />
+</selector>

+ 9 - 37
android_host/src/main/h10_wke_1h/res/layout/activity_register.xml

@@ -3,25 +3,17 @@
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_marginTop="6dp"
-        android:layout_marginBottom="6dp"
+        android:padding="10dp"
         android:background="@color/white"
         android:orientation="vertical"
-        android:gravity="center_horizontal">
-
-        <ImageView
-            android:id="@+id/view_qr_code"
-            android:layout_marginTop="10dp"
-            android:layout_width="280dp"
-            android:layout_height="280dp"
-            android:layout_gravity="center_horizontal" />
+        android:gravity="center">
 
         <TextView
-            android:id="@+id/tv_device_model"
+            android:id="@+id/tv_sip_account"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
-            android:text="rom:"
+            android:text="SIP:"
             android:textColor="@color/black"
             android:textSize="20sp" />
 
@@ -61,34 +53,14 @@
             android:textColor="@color/black"
             android:textSize="20sp" />
 
-        <TextView
-            android:id="@+id/tv_mcu_version"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="10dp"
-            android:text="MCU:"
-            android:textColor="@color/black"
-            android:textSize="20sp"
-            android:visibility="gone"/>
-
-        <TextView
-            android:id="@+id/feedback_device_info_tv"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="10dp"
-            android:textColor="@color/black"
-            android:textSize="20sp" />
-
         <Button
-            android:id="@+id/btn_reload"
+            android:id="@+id/btn_config_sip"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginTop="40dp"
+            android:layout_marginTop="20dp"
             android:padding="10dp"
-            android:background="#2F9DF1"
-            android:text="@string/register_reload"
-            android:textSize="20sp"
-            android:visibility="gone"/>
-
+            android:background="@drawable/selector_button_bg_color2"
+            android:text="SIP配置"
+            android:textSize="24sp"/>
     </LinearLayout>
 </layout>

+ 173 - 0
android_host/src/main/h10_wke_1h/res/layout/activity_sip_home.xml

@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@color/javashop_color_white">
+
+            <RelativeLayout
+                android:id="@+id/title_relayout"
+                android:layout_width="match_parent"
+                android:layout_height="54dp">
+
+                <TextView
+                    android:id="@+id/sip_name"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_marginLeft="10dp"
+                    android:gravity="center"
+                    android:text="sip:"
+                    android:textColor="#2F9DF1"
+                    android:textSize="28sp" />
+
+                <TextClock
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_centerHorizontal="true"
+                    android:layout_centerVertical="true"
+                    android:format12Hour="yyyy-MM-dd HH:mm EEEE"
+                    android:format24Hour="yyyy-MM-dd HH:mm EEEE"
+                    android:textColor="#2F9DF1"
+                    android:textSize="26sp" />
+
+                <RelativeLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentRight="true"
+                    android:gravity="center">
+
+                    <LinearLayout
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal"
+                        android:gravity="center_vertical">
+
+                        <ImageView
+                            android:id="@+id/battery_state_img"
+                            android:layout_width="28dp"
+                            android:layout_height="28dp"
+                            android:layout_gravity="center_vertical"
+                            android:layout_marginRight="10dp"
+                            android:src="@drawable/wdkl_stat_sys_battery"/>
+
+                        <!--   蓝牙状态  -->
+                        <ImageView
+                            android:id="@+id/bluetooth_state_imagev"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginRight="16dp"
+                            android:visibility="gone"/>
+                        <!--   WiFi状态  -->
+                        <ImageView
+                            android:id="@+id/wifi_state_imagev"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginRight="16dp" />
+
+                        <!-- 以太网 -->
+                        <ImageView
+                            android:id="@+id/ethernet_state_imagev"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginRight="16dp" />
+
+                    </LinearLayout>
+                </RelativeLayout>
+            </RelativeLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_above="@+id/bottom_linlyout"
+                android:layout_below="@+id/title_relayout">
+
+                <FrameLayout
+                    android:id="@+id/middle_fralyout"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"/>
+
+            </LinearLayout>
+
+            <FrameLayout
+                android:id="@+id/right_fralyout"
+                android:layout_width="480dp"
+                android:layout_height="match_parent"
+                android:layout_above="@+id/bottom_linlyout"
+                android:layout_below="@+id/title_relayout"
+                android:layout_alignParentRight="true"/>
+
+            <LinearLayout
+                android:id="@+id/bottom_linlyout"
+                android:layout_width="match_parent"
+                android:layout_height="60dp"
+                android:layout_alignParentBottom="true"
+                android:background="#2F9DF1"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal">
+
+                    <RadioGroup
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="horizontal">
+
+                        <com.wdkl.ncs.android.lib.widget.CustomRadioButton
+                            android:id="@+id/home_radio_bt"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/shou_ye_no"
+                            android:drawablePadding="10px"
+                            android:gravity="center"
+                            android:textColor="@drawable/selector_bottom_btn_text_color"
+                            android:text="@string/str_home"
+                            android:textSize="24sp" />
+
+                        <com.wdkl.ncs.android.lib.widget.CustomRadioButton
+                            android:id="@+id/sip_device_radio_bt"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/selt_other_host_icon"
+                            android:drawablePadding="10px"
+                            android:gravity="center"
+                            android:textColor="@drawable/selector_bottom_btn_text_color"
+                            android:text="设备管理"
+                            android:textSize="24sp" />
+
+                        <com.wdkl.ncs.android.lib.widget.CustomRadioButton
+                            android:id="@+id/system_settings_radio_bt"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/selt_set_icon"
+                            android:drawablePadding="10px"
+                            android:gravity="center"
+                            android:textColor="@drawable/selector_bottom_btn_text_color"
+                            android:text="@string/str_settings"
+                            android:textSize="24sp" />
+
+                        <TextView
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="5"/>
+
+                    </RadioGroup>
+                </LinearLayout>
+            </LinearLayout>
+
+        <!--通话界面-->
+        <FrameLayout
+            android:id="@+id/call_frame"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+    </RelativeLayout>
+
+</layout>

+ 26 - 0
android_host/src/main/h10_wke_1h/res/layout/adapter_extension_device.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="160dp"
+        android:layout_height="120dp"
+        android:padding="10dp"
+        android:background="@drawable/item_selector">
+
+        <ImageView
+            android:layout_width="80dp"
+            android:layout_height="80dp"
+            android:layout_gravity="center_vertical"
+            android:background="@drawable/ic_other_host" />
+
+        <TextView
+            android:id="@+id/tv_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="10dp"
+            android:textColor="@color/black"
+            android:text="--"
+            android:textSize="24sp" />
+
+    </LinearLayout>
+</layout>

+ 155 - 0
android_host/src/main/h10_wke_1h/res/layout/fragment_device_manage.xml

@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:bind="http://schemas.android.com/apk/res-auto">
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#EAF2F9">
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1.5"
+            android:layout_marginTop="20dp"
+            android:padding="10dp">
+
+            <RadioGroup
+                android:id="@+id/group_devices"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
+
+                <RadioButton
+                    android:id="@+id/rb_host_device"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingTop="20dp"
+                    android:paddingBottom="20dp"
+                    android:background="@drawable/selector_button_bg_color"
+                    android:button="@null"
+                    android:gravity="center"
+                    android:text="本机"
+                    android:textSize="24sp"/>
+
+                <RadioButton
+                    android:id="@+id/rb_extension_device"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="20dp"
+                    android:paddingTop="20dp"
+                    android:paddingBottom="20dp"
+                    android:background="@drawable/selector_button_bg_color"
+                    android:button="@null"
+                    android:gravity="center"
+                    android:text="分机"
+                    android:textSize="24sp"/>
+            </RadioGroup>
+        </LinearLayout>
+
+        <FrameLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="5">
+
+            <LinearLayout
+                android:id="@+id/ll_host_device"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center_horizontal"
+                android:layout_marginTop="10dp"
+                android:padding="20dp"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/tv_host_sip"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="本机sip账号:"
+                    android:textSize="36sp" />
+
+                <Button
+                    android:id="@+id/btn_config"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="40dp"
+                    android:padding="10dp"
+                    android:background="@drawable/selector_button_bg_color2"
+                    android:text="修改账号"
+                    android:textSize="32sp"/>
+
+            </LinearLayout>
+
+            <RelativeLayout
+                android:id="@+id/ll_extension_devices"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:visibility="gone">
+
+                <RelativeLayout
+                    android:id="@+id/ll_extension_configs"
+                    android:layout_width="200dp"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentRight="true"
+                    android:layout_marginRight="20dp"
+                    android:padding="20dp"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/tv_select_device"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="20dp"
+                        android:textSize="24sp"
+                        android:text="--"/>
+
+                    <Button
+                        android:id="@+id/btn_add_device"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_above="@+id/btn_config_device"
+                        android:layout_marginTop="60dp"
+                        android:padding="10dp"
+                        android:layout_centerHorizontal="true"
+                        android:background="@drawable/selector_button_bg_color2"
+                        android:text="添加设备"
+                        android:textSize="28sp"/>
+
+                    <Button
+                        android:id="@+id/btn_config_device"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_above="@+id/btn_delete_device"
+                        android:layout_marginTop="40dp"
+                        android:padding="10dp"
+                        android:layout_centerHorizontal="true"
+                        android:background="@drawable/selector_button_bg_color2"
+                        android:text="修改设备"
+                        android:textSize="28sp"/>
+
+                    <Button
+                        android:id="@+id/btn_delete_device"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_alignParentBottom="true"
+                        android:layout_marginTop="40dp"
+                        android:layout_marginBottom="40dp"
+                        android:padding="10dp"
+                        android:layout_centerHorizontal="true"
+                        android:background="@drawable/selector_button_bg_color2"
+                        android:text="删除设备"
+                        android:textSize="28sp"/>
+
+                </RelativeLayout>
+
+                <android.support.v7.widget.RecyclerView
+                    android:id="@+id/rv_extension_devices"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_toLeftOf="@id/ll_extension_configs"
+                    android:background="#EAF2F9"
+                    android:padding="20dp"/>
+            </RelativeLayout>
+        </FrameLayout>
+
+    </LinearLayout>
+
+</layout>

+ 250 - 0
android_host/src/main/h10_wke_1h/res/layout/fragment_home.xml

@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:bind="http://schemas.android.com/apk/res-auto">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#EAF2F9">
+
+        <com.scwang.smartrefresh.layout.SmartRefreshLayout
+            android:id="@+id/bed_refresh"
+            android:layout_width="0px"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="8dp"
+            android:layout_marginRight="8dp"
+            android:layout_weight="0.74"
+            bind:srlEnableLoadMore="false"
+            bind:srlEnableRefresh="true">
+
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/bed_list_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp"
+                android:fadeScrollbars="true"
+                android:scrollbarStyle="insideOverlay"
+                android:scrollbars="vertical" />
+
+        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
+
+
+        <RelativeLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginRight="6dp"
+            android:layout_weight="0.26"
+            android:background="#EAF2F9">
+
+            <LinearLayout
+                android:id="@+id/voice_call_layout"
+                android:layout_width="match_parent"
+                android:layout_height="70dp"
+                android:layout_alignParentBottom="true"
+                android:layout_marginBottom="16dp"
+                android:background="#F3F9FE"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/call_the_voice_tv"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:drawableLeft="@drawable/ic_call_out"
+                    android:ellipsize="end"
+                    android:gravity="center"
+                    android:paddingLeft="10dp"
+                    android:singleLine="true"
+                    android:text="@string/voice_call"
+                    android:textColor="@drawable/selector_action_button_text_color"
+                    android:textSize="28sp" />
+
+                <View
+                    android:layout_width="2dp"
+                    android:layout_height="match_parent"
+                    android:background="@color/white" />
+
+                <TextView
+                    android:id="@+id/call_the_video_tv"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:drawableLeft="@drawable/ic_video_call"
+                    android:ellipsize="end"
+                    android:gravity="center"
+                    android:paddingLeft="10dp"
+                    android:singleLine="true"
+                    android:text="@string/video_call"
+                    android:textColor="@drawable/selector_action_button_text_color"
+                    android:textSize="28sp" />
+            </LinearLayout>
+
+            <TextView
+                android:id="@+id/tv_basic_title"
+                android:layout_width="match_parent"
+                android:layout_height="40dp"
+                android:layout_marginTop="10dp"
+                android:background="#ffffff"
+                android:gravity="center"
+                android:textColor="@color/main_color"
+                android:text="@string/basic_info"
+                android:textSize="24sp"/>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@id/tv_basic_title"
+                android:layout_above="@id/voice_call_layout"
+                android:layout_marginTop="6dp"
+                android:orientation="vertical">
+
+                <RelativeLayout
+                    android:id="@+id/rl_basic_info"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginTop="6dp"
+                    android:background="#ffffff">
+
+                    <ImageView
+                        android:id="@+id/bed_imagev"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="10dp"
+                        android:layout_marginTop="10dp"
+                        android:src="@drawable/kong_chuang" />
+
+                    <TextView
+                        android:id="@+id/bed_name"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="10dp"
+                        android:layout_marginTop="6dp"
+                        android:layout_toRightOf="@+id/bed_imagev"
+                        android:text="--"
+                        android:textColor="#2F9DF1"
+                        android:textSize="22sp" />
+
+                    <TextView
+                        android:id="@+id/bed_sip_name"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_below="@+id/bed_imagev"
+                        android:layout_marginTop="6dp"
+                        android:padding="10dp"
+                        android:textColor="#0D0D0D"
+                        android:textSize="20sp" />
+
+                    <LinearLayout
+                        android:id="@+id/custom_information_layout"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_below="@+id/bed_name"
+                        android:layout_alignLeft="@+id/bed_name"
+                        android:layout_marginTop="6dp"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:id="@+id/name_tv"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="5"
+                            android:singleLine="true"
+                            android:text="---"
+                            android:textColor="#0D0D0D"
+                            android:textSize="20sp" />
+
+                        <ImageView
+                            android:id="@+id/gender_imagev"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:layout_weight="1" />
+
+                        <TextView
+                            android:id="@+id/age_tv"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="2"
+                            android:gravity="center"
+                            android:text="--"
+                            android:textColor="#B4B4B4"
+                            android:textSize="18sp" />
+
+                    </LinearLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/time_relalyout"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_below="@+id/custom_information_layout"
+                        android:layout_marginTop="20dp"
+                        android:layout_marginRight="10dp"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="8dp"
+                            android:text="@string/indate"
+                            android:textColor="#0D0D0D"
+                            android:textSize="18sp" />
+
+                        <TextView
+                            android:id="@+id/time_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_alignParentRight="true"
+                            android:layout_marginLeft="8dp"
+                            android:text="----"
+                            android:textColor="#B4B4B4"
+                            android:textSize="16sp" />
+
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/phone_layout"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_below="@+id/time_relalyout"
+                        android:layout_marginTop="8dp"
+                        android:layout_marginRight="10dp"
+                        android:gravity="center_vertical"
+                        android:visibility="gone">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="8dp"
+                            android:text="@string/mobile"
+                            android:textColor="#0D0D0D"
+                            android:textSize="18sp" />
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_centerVertical="true"
+                            android:layout_marginRight="2dp"
+                            android:layout_toLeftOf="@+id/mobile_tv"
+                            android:src="@drawable/dian_hua" />
+
+                        <TextView
+                            android:id="@+id/mobile_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_alignParentRight="true"
+                            android:layout_marginLeft="8dp"
+                            android:text="@string/empty"
+                            android:textColor="#B4B4B4"
+                            android:textSize="16sp" />
+
+                    </RelativeLayout>
+
+                </RelativeLayout>
+
+            </LinearLayout>
+
+        </RelativeLayout>
+
+    </LinearLayout>
+</layout>

+ 22 - 14
android_host/src/main/h10_wke_1h/res/layout/fragment_system_settings.xml

@@ -70,10 +70,10 @@
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="4px"
+                    android:layout_marginTop="4dp"
                     android:background="#ffffff"
                     android:orientation="vertical"
-                    android:paddingLeft="6px">
+                    android:padding="6dp">
 
                     <LinearLayout
                         android:layout_width="match_parent"
@@ -355,6 +355,7 @@
                             android:textColor="#000000"
                             android:textSize="14px" />
                     </LinearLayout>
+
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
@@ -394,10 +395,10 @@
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="4px"
+                    android:layout_marginTop="4dp"
                     android:background="#ffffff"
                     android:orientation="vertical"
-                    android:paddingLeft="6px">
+                    android:padding="6dp">
 
                     <TextView
                         android:layout_width="match_parent"
@@ -412,7 +413,8 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="2dp"
-                        android:orientation="vertical">
+                        android:orientation="vertical"
+                        android:visibility="gone">
 
                         <LinearLayout
                             android:layout_width="wrap_content"
@@ -458,7 +460,8 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="2dp"
-                        android:orientation="vertical">
+                        android:orientation="vertical"
+                        android:visibility="gone">
 
                         <LinearLayout
                             android:layout_width="wrap_content"
@@ -500,19 +503,20 @@
 
                     </LinearLayout>
 
-                    <TextView
+                    <!--<TextView
                         android:layout_width="match_parent"
                         android:layout_height="1px"
                         android:layout_marginTop="12px"
                         android:layout_marginRight="6px"
                         android:layout_marginBottom="12px"
-                        android:background="#AAAAAA" />
+                        android:background="#AAAAAA" />-->
 
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="2dp"
-                        android:orientation="vertical">
+                        android:orientation="vertical"
+                        android:visibility="gone">
 
                         <LinearLayout
                             android:layout_width="wrap_content"
@@ -557,7 +561,8 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="2dp"
-                        android:orientation="vertical">
+                        android:orientation="vertical"
+                        android:visibility="gone">
 
                         <LinearLayout
                             android:layout_width="wrap_content"
@@ -696,7 +701,8 @@
                         android:layout_marginTop="12px"
                         android:layout_marginRight="6px"
                         android:layout_marginBottom="12px"
-                        android:background="#AAAAAA" />
+                        android:background="#AAAAAA"
+                        android:visibility="gone"/>
 
                     <LinearLayout
                         android:layout_width="match_parent"
@@ -713,7 +719,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:layout_gravity="center_vertical"
-                                android:text="@string/setting_host_device_call_volume"
+                                android:text="音量:"
                                 android:textColor="#000000"
                                 android:textSize="14px" />
 
@@ -1549,7 +1555,8 @@
                         android:background="@color/white"
                         android:text="@string/language_settings"
                         android:textColor="#000000"
-                        android:textSize="18sp" />
+                        android:textSize="18sp"
+                        android:visibility="gone"/>
 
                     <TextView
                         android:id="@+id/system_settings_tv"
@@ -1602,7 +1609,8 @@
                         android:background="@color/white"
                         android:text="SIP test"
                         android:textColor="#000000"
-                        android:textSize="18sp" />
+                        android:textSize="18sp"
+                        android:visibility="gone"/>
 
                     <TextView
                         android:id="@+id/software_and_information_tv"

+ 0 - 43
android_host/src/main/h10_wke_1h/res/layout/sip_call_layout.xml

@@ -56,49 +56,6 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent">
 
-            <android.support.v7.widget.RecyclerView
-                android:id="@+id/visit_list_view"
-                android:layout_width="320dp"
-                android:layout_height="match_parent"
-                android:background="@color/color_transparent"
-                android:visibility="gone"/>
-
-            <TextView
-                android:id="@+id/tv_visit_title"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_centerInParent="true"
-                android:text="@string/str_visiting"
-                android:textSize="36sp"
-                android:textColor="@color/white"
-                android:visibility="gone"/>
-
-            <LinearLayout
-                android:id="@+id/ll_out_call"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="40dp"
-                android:gravity="center"
-                android:visibility="gone">
-
-                <EditText
-                    android:id="@+id/edit_call_number"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="sip:7550000506003011802201@192.168.3.26"
-                    android:textColor="@color/white"
-                    android:textSize="28sp" />
-
-                <Button
-                    android:id="@+id/button_call"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="10dp"
-                    android:text="呼叫"
-                    android:textColor="@color/main_color"
-                    android:textSize="32sp" />
-            </LinearLayout>
-
             <LinearLayout
                 android:id="@+id/ll_voice_call"
                 android:layout_width="match_parent"

+ 1 - 1
android_host/src/main/h10_wke_1h/res/values/strings.xml

@@ -1,4 +1,4 @@
 <resources>
     <string name="app_name">NurseHome</string>
-    <string name="wdkl_app_name">Host_device_kaer</string>
+    <string name="wdkl_app_name">SIP主机端</string>
 </resources>

+ 1 - 1
android_host/src/main/h10_z3128_1h/res/values/strings.xml

@@ -1,4 +1,4 @@
 <resources>
     <string name="app_name">NurseHome</string>
-    <string name="wdkl_app_name">Host_device_3128</string>
+    <string name="wdkl_app_name">SIP主机端</string>
 </resources>

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -18,7 +18,7 @@
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
     <application
         android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
+        android:icon="@drawable/ic_home_launch"
         android:label="@string/wdkl_app_name"
         android:supportsRtl="true"
         tools:replace="android:label"

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

@@ -17,7 +17,6 @@ import com.wdkl.ncs.android.component.nursehome.util.NetHelper
 import com.wdkl.ncs.android.component.nursehome.util.XCrashUtils
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.middleware.common.Constants
-import serialporttest.utils.SerialPortUtil
 import java.io.PrintWriter
 
 /**
@@ -80,7 +79,7 @@ class Application : BaseApplication() {
      */
     private fun initFrame() {
         //禁止滑动退出
-        BaseConfig.getInstance().addActivity("RegisterActivity", "AppUpdateActivity","NurseHomeActivity")
+        BaseConfig.getInstance().addActivity("RegisterActivity", "AppUpdateActivity","NurseHomeActivity", "SipHomeActivity")
 
         NetEngineConfig.init(baseContext)
                 .openLogger()

+ 5 - 0
app/src/main/res/drawable/ic_home_launch.xml

@@ -0,0 +1,5 @@
+<vector android:height="48dp" android:tint="#2A77FA"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M20,18c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v10c0,1.1 0.9,2 2,2H0v2h24v-2H20zM4,6h16v10H4V6z"/>
+</vector>

+ 1 - 1
app/src/main/sharedUserId/AndroidManifest.xml

@@ -19,7 +19,7 @@
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
     <application
         android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
+        android:icon="@drawable/ic_home_launch"
         android:label="@string/wdkl_app_name"
         android:supportsRtl="true"
         tools:replace="android:label"

+ 6 - 3
build.gradle

@@ -51,7 +51,7 @@ buildscript {
      * ZJ-H10_W_KE-1H: 医院版卡尔10寸主机
      * ...
      */
-    ext.app_device_type = "zj_h10_z_3128_1"
+    ext.app_device_type = "zj_h10_w_ke_1"
 
     if (app_device_type == "zj_h10_z_3128_1") {
         //rk3128 10寸护士主机
@@ -59,8 +59,8 @@ buildscript {
         ext.app_version = "1.1.47"
     } else if (app_device_type == "zj_h10_w_ke_1") {
         //卡尔10寸护士主机
-        ext.app_version_code = 58
-        ext.app_version = "1.1.43"
+        ext.app_version_code = 1
+        ext.app_version = "1.1.1"
     }
     else {
         ext.app_version_code = 48
@@ -107,6 +107,9 @@ buildscript {
          * Aop埋点相关
          */
         classpath "org.aspectj:aspectjtools:$aspectj_version"
+
+        //greendao
+        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
     }
     repositories {
         maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }

+ 18 - 39
common/build.gradle

@@ -1,7 +1,9 @@
 apply plugin: 'com.android.library'
+apply plugin: 'org.greenrobot.greendao'
 apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 apply plugin: 'kotlin-kapt'
+
 android {
     compileSdkVersion target_sdk_version
     buildToolsVersion build_tools_version
@@ -29,14 +31,22 @@ android {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
-//        debug {
-//            jniDebuggable true
-//        }
+
+        greendao {
+            schemaVersion 1  //这里是数据库版本,需要比原来的大
+            //daoPackage 'com.wdkl.app.nursehost.database.greenDao.db'  //设置DaoMaster、DaoSession、Dao 包名
+            //targetGenDir 'src/main/java'  //设置DaoMaster、DaoSession、Dao目录,请注意,这里路径用/不要用.
+            //generateTests false   //设置为true以自动生成单元测试。
+            //targetGenDirTests 'src/main/java'  //应存储生成的单元测试的基本目录。默认为 src / androidTest / java。
+        }
     }
     sourceSets {
         main.java.srcDirs += 'src/main/code'
-//        main.jni.srcDirs = []
-//        main.jniLibs.srcDir 'src/main/libs'
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
@@ -240,40 +250,9 @@ dependencies {
     compile 'io.netty:netty-all:4.1.42.Final'
     //eventbus
     compile 'org.greenrobot:eventbus:3.0.0'
-}
 
-//tasks.withType(JavaCompile) {
-//    compileTask -> compileTask.dependsOn ndkBuild
-//}
-//
-//task ndkBuild(type: Exec) {
-//    workingDir file('src/main/jni')
-//    commandLine getNdkBuildCmd()
-//}
-//
-//task cleanNative(type: Exec){
-//    workingDir file('src/main/jni')
-//    commandLine getNdkBuildCmd(), 'clean'
-//}
-//
-//clean.dependsOn cleanNative
-//
-//def getNdkDir() {
-//    if (System.env.ANDROID_NDK_ROOT != null)
-//        return System.env.ANDROID_NDK_ROOT
-//    Properties properties = new Properties()
-//    properties.load(project.rootProject.file('local.properties').newDataInputStream())
-//    def ndkdir = properties.getProperty('ndk.dir', null)
-//    if (ndkdir == null)
-//        throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.")
-//    return ndkdir
-//}
-//
-//def getNdkBuildCmd() {
-//    def ndkbuild = getNdkDir() + "/ndk-build"
-//    //Window下需要加.cmd后缀,Mac下则不需要
-//    ndkbuild += ""
-//    return ndkbuild
-//}
+    //greendao
+    compile 'org.greenrobot:greendao:3.2.2'
+}
 
 

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

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
 import android.app.Application
 import android.content.Context
 import android.content.Intent
+import android.database.sqlite.SQLiteDatabase
 import android.support.multidex.MultiDexApplication
 import com.wdkl.ncs.android.lib.core.framework.Framework
 import com.wdkl.ncs.android.lib.core.hack.AndroidHack
@@ -11,6 +12,9 @@ import com.wdkl.ncs.android.lib.core.runtime.ClassNotFoundInterceptor
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.enation.javashop.utils.logger.LoggerFactory
 import com.uuzuche.lib_zxing.activity.ZXingLibrary
+import com.wdkl.ncs.android.lib.db.DaoMaster
+import com.wdkl.ncs.android.lib.db.DaoSession
+import org.greenrobot.greendao.identityscope.IdentityScopeType
 
 
 /**
@@ -34,6 +38,8 @@ open class BaseApplication : MultiDexApplication() {
         @SuppressLint("StaticFieldLeak")
         lateinit var appContext: Application
 
+        @SuppressLint("StaticFieldLeak")
+        var daoSession: DaoSession? = null
     }
 
     /**
@@ -69,8 +75,20 @@ open class BaseApplication : MultiDexApplication() {
         /** 初始化Zxing */
         ZXingLibrary.initDisplayOpinion(this)
 
+        //初始化数据库
+        initDatabase()
     }
 
+    private fun initDatabase() {
+        //创建数据库db
+        val helper = DaoMaster.DevOpenHelper(this, "wdkl_call_sys.db", null)
+        //获取可写数据库
+        val db: SQLiteDatabase = helper.getWritableDatabase()
+        //获取数据库对象
+        val daoMaster = DaoMaster(db)
+        //获取Dao对象管理者
+        daoSession = daoMaster.newSession(IdentityScopeType.None)
+    }
 
     private fun closeAndroidPDialog() {
         try {

+ 120 - 0
common/src/main/code/com/wdkl/ncs/android/lib/db/DeviceBean.java

@@ -0,0 +1,120 @@
+package com.wdkl.ncs.android.lib.db;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import org.greenrobot.greendao.annotation.Entity;
+import org.greenrobot.greendao.annotation.Generated;
+import org.greenrobot.greendao.annotation.Id;
+import org.greenrobot.greendao.annotation.Property;
+
+import java.io.Serializable;
+
+@Entity
+public class DeviceBean {
+
+    @Id(autoincrement = true)
+    @Property(nameInDb = "_id")
+    private Long id;
+
+    @JSONField(name = "type")
+    private Integer type;
+
+    @JSONField(name = "name")
+    private String name;
+
+    @JSONField(name = "sip_ip")
+    private String sipIp;
+
+    @JSONField(name = "sip_id")
+    private String sipId;
+
+    @JSONField(name = "sip_password")
+    private String sipPassword;
+
+    @JSONField(name = "sip_name")
+    private String sipName;
+
+    @JSONField(name = "create_time")
+    private Long createTime;
+
+    @Generated(hash = 617916161)
+    public DeviceBean(Long id, Integer type, String name, String sipIp,
+                      String sipId, String sipPassword, String sipName, Long createTime) {
+        this.id = id;
+        this.type = type;
+        this.name = name;
+        this.sipIp = sipIp;
+        this.sipId = sipId;
+        this.sipPassword = sipPassword;
+        this.sipName = sipName;
+        this.createTime = createTime;
+    }
+
+    @Generated(hash = 74682814)
+    public DeviceBean() {
+    }
+
+    public Long getId() {
+        return this.id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return this.type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSipIp() {
+        return this.sipIp;
+    }
+
+    public void setSipIp(String sipIp) {
+        this.sipIp = sipIp;
+    }
+
+    public String getSipId() {
+        return this.sipId;
+    }
+
+    public void setSipId(String sipId) {
+        this.sipId = sipId;
+    }
+
+    public String getSipPassword() {
+        return this.sipPassword;
+    }
+
+    public void setSipPassword(String sipPassword) {
+        this.sipPassword = sipPassword;
+    }
+
+    public String getSipName() {
+        return this.sipName;
+    }
+
+    public void setSipName(String sipName) {
+        this.sipName = sipName;
+    }
+
+    public Long getCreateTime() {
+        return this.createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

+ 15 - 7
common/src/main/code/com/wdkl/ncs/android/lib/utils/AppTool.kt

@@ -8,9 +8,11 @@ import android.graphics.BitmapFactory
 import android.graphics.Color
 import android.os.Build
 import android.os.Handler
+import android.os.IBinder
 import android.provider.Settings
 import android.support.v4.widget.DrawerLayout
 import android.support.v7.app.AppCompatActivity
+import android.util.Log
 import android.view.View
 import android.view.ViewGroup
 import android.view.WindowManager
@@ -20,21 +22,15 @@ import android.view.animation.AnimationSet
 import android.view.animation.TranslateAnimation
 import android.view.inputmethod.InputMethodManager
 import android.widget.LinearLayout
-import com.wdkl.ncs.android.lib.base.BaseApplication
-import com.enation.javashop.net.engine.utils.ThreadFromUtils
 import com.enation.javashop.utils.base.tool.ScreenTool
-import io.reactivex.BackpressureStrategy
-import io.reactivex.Flowable
+import com.wdkl.ncs.android.lib.base.BaseApplication
 import io.reactivex.Observable
-import io.reactivex.disposables.Disposable
 import java.io.IOException
-import java.io.InputStream
 import java.net.HttpURLConnection
 import java.net.MalformedURLException
 import java.net.URL
 import java.nio.charset.Charset
 import java.text.NumberFormat
-import java.util.concurrent.TimeUnit
 
 /**
  * @author  LDD
@@ -462,5 +458,17 @@ object AppTool {
                 }
             }
         }
+
+        //隐藏软键盘
+        @JvmStatic
+        fun hideInputKeyboard(token: IBinder?) {
+            try {
+                Log.d("keyboard", "hide input keyboard ===== ")
+                val mInputKeyBoard = BaseApplication.appContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+                mInputKeyBoard.hideSoftInputFromWindow(token, 0)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
     }
 }

BIN
common/src/main/res/drawable/delete.png


BIN
common/src/main/res/drawable/hedimg.png


+ 5 - 0
common/src/main/res/drawable/selector_btn_text_color.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#B4B4B4" android:state_pressed="true"/>
+    <item android:color="#FFFFFF"/>
+</selector>

+ 6 - 0
common/src/main/res/drawable/shape_delete_bt_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#97A2BE" />
+    <corners
+        android:radius="16dp" />
+</shape>

+ 9 - 0
common/src/main/res/drawable/shape_main_hos_txt_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#ff3a78ef" />
+    <corners
+        android:topLeftRadius="16dp"
+        android:topRightRadius="16dp"
+        android:bottomLeftRadius="16dp"
+        android:bottomRightRadius="16dp" />
+</shape>

+ 7 - 0
common/src/main/res/drawable/shape_n_login_ed_bg2.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid
+        android:color="#F7F8FC" />
+    <stroke android:width="2dp" android:color="#ff3f80f1" />
+    <corners android:radius="18dp" />
+</shape>

+ 5 - 0
middleware/build.gradle

@@ -48,6 +48,11 @@ android {
             dirs 'libs'
         }
     }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 }
 
 dependencies {

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

@@ -177,6 +177,10 @@ class Constants {
 
         const val SIP_INCOMING_VIDEO_CALL = 0x24
 
+        const val SIP_OUTGOING_VOICE_CALL = 0x25
+
+        const val SIP_OUTGOING_VIDEO_CALL = 0x26
+
         //手柄拿起
         const val HOOK_OFF = "com.android.PhoneWinowManager.HOOK_OFF"
         //手柄放下

+ 54 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/ConfirmDialogHelper.java

@@ -0,0 +1,54 @@
+package com.wdkl.ncs.android.middleware.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.wdkl.ncs.android.middleware.R;
+
+public class ConfirmDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(Activity activity, String tips, final ClickListener clickListener) {
+        if (alertDialog != null && alertDialog.isShowing()) {
+            return;
+        }
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.confirm_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button btn_cancel = contentView.findViewById(R.id.menu_cancel_button);
+        Button btn_confirm = contentView.findViewById(R.id.menu_confirm_button);
+        TextView tv_tips = contentView.findViewById(R.id.tv_tip_text);
+
+        tv_tips.setText(tips);
+        btn_cancel.setOnClickListener(v -> {
+            if (alertDialog != null) {
+                alertDialog.dismiss();
+            }
+        });
+        btn_confirm.setOnClickListener(v -> {
+            if (clickListener != null) {
+                clickListener.onClick();
+            }
+
+            if (alertDialog != null) {
+                alertDialog.dismiss();
+            }
+        });
+
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+    }
+
+    public interface ClickListener{
+        void onClick();
+    }
+}

+ 79 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/ExtensionSipDialogHelper.java

@@ -0,0 +1,79 @@
+package com.wdkl.ncs.android.middleware.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+
+import com.wdkl.ncs.android.lib.utils.AppTool;
+import com.wdkl.ncs.android.middleware.R;
+
+import static com.wdkl.ncs.android.lib.utils.ExtendMethodsKt.showMessage;
+
+public class ExtensionSipDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(final Activity activity, final String hintId, final String hintIp, ClickListener clickListener) {
+        if (alertDialog != null && alertDialog.isShowing()) {
+            return;
+        }
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.extension_sip_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button confirm = contentView.findViewById(R.id.confirm_button);
+        Button cancel = contentView.findViewById(R.id.cancel_button);
+        LinearLayout layout = contentView.findViewById(R.id.ll_sip_view);
+        EditText sipId = contentView.findViewById(R.id.sip_id_ed);
+        EditText sipIp = contentView.findViewById(R.id.sip_ip_ed);
+        sipId.setText(hintId);
+        sipIp.setText(hintIp);
+
+        confirm.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                if(TextUtils.isEmpty(sipId.getText().toString()) || TextUtils.isEmpty(sipIp.getText().toString())){
+                    showMessage("参数不能为空");
+                    return;
+                }
+
+                if (clickListener != null) {
+                    String id = sipId.getText().toString();
+                    String ip = sipIp.getText().toString();
+                    clickListener.onClick(id, ip);
+                }
+                alertDialog.dismiss();
+            }
+        });
+        cancel.setOnClickListener(v -> {
+            if (alertDialog != null) {
+                alertDialog.dismiss();
+            }
+        });
+
+        layout.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    AppTool.SystemUI.hideInputKeyboard(alertDialog.getWindow().getDecorView().getWindowToken());
+                } catch (Exception e) {
+                    //
+                }
+            }
+        });
+
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+    }
+
+    public interface ClickListener{
+        void onClick(String strId, String strIp);
+    }
+}

+ 72 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/PassCheckDialogHelper.java

@@ -0,0 +1,72 @@
+package com.wdkl.ncs.android.middleware.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+
+import com.wdkl.ncs.android.lib.utils.AppTool;
+import com.wdkl.ncs.android.middleware.R;
+
+import static com.wdkl.ncs.android.lib.utils.ExtendMethodsKt.showMessage;
+
+public class PassCheckDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(final Activity activity, ClickListener clickListener) {
+        if (alertDialog != null && alertDialog.isShowing()) {
+            return;
+        }
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.password_check_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        LinearLayout layout = contentView.findViewById(R.id.ll_password_view);
+        Button password_cancel_button = contentView.findViewById(R.id.password_cancel_button);
+        Button password_determine_button = contentView.findViewById(R.id.password_determine_button);
+        EditText password_ed = contentView.findViewById(R.id.password_ed);
+
+        layout.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    AppTool.SystemUI.hideInputKeyboard(alertDialog.getWindow().getDecorView().getWindowToken());
+                } catch (Exception e) {
+                    //
+                }
+            }
+        });
+
+        password_cancel_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+            }
+        });
+        password_determine_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                String passwprd =password_ed.getText().toString();
+                if (passwprd.equals("888")){
+                    if (clickListener != null) {
+                        clickListener.onClick();
+                    }
+                } else {
+                    showMessage(R.string.invalid_password);
+                }
+                alertDialog.dismiss();
+            }
+        });
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+    }
+
+    public interface ClickListener{
+        void onClick();
+    }
+}

+ 74 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/helper/SipDialogHelper.java

@@ -0,0 +1,74 @@
+package com.wdkl.ncs.android.middleware.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+
+import com.wdkl.ncs.android.lib.utils.AppTool;
+import com.wdkl.ncs.android.middleware.R;
+
+import static com.wdkl.ncs.android.lib.utils.ExtendMethodsKt.showMessage;
+
+public class SipDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(final Activity activity, final String hint, ClickListener clickListener) {
+        if (alertDialog != null && alertDialog.isShowing()) {
+            return;
+        }
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.sip_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button server_determine_button = contentView.findViewById(R.id.sip_determine_button);
+        Button server_cancel_button = contentView.findViewById(R.id.sip_cancel_button);
+        LinearLayout layout = contentView.findViewById(R.id.ll_sip_config_view);
+        EditText server_ed = contentView.findViewById(R.id.sip_ed);
+        server_ed.setText(hint);
+        server_determine_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                if(server_ed.getText().toString().equals("")){
+                    showMessage("SIP账号不能为空");
+                    return;
+                }
+
+                if (clickListener != null) {
+                    String IP = server_ed.getText().toString();
+                    clickListener.onClick(IP);
+                }
+                alertDialog.dismiss();
+            }
+        });
+        server_cancel_button.setOnClickListener(v -> {
+            if (alertDialog != null) {
+                alertDialog.dismiss();
+            }
+        });
+
+        layout.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    AppTool.SystemUI.hideInputKeyboard(alertDialog.getWindow().getDecorView().getWindowToken());
+                } catch (Exception e) {
+                    //
+                }
+            }
+        });
+
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+    }
+
+    public interface ClickListener{
+        void onClick(String bedVO);
+    }
+}

+ 5 - 40
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/CommonUtils.java

@@ -17,6 +17,7 @@ public class CommonUtils {
     private static final String KEY_SP_URL_PORT = "KEY_SP_URL_PORT";
     private static final String KEY_SP_SIP_URL = "KEY_SP_SIP_URL";
     private static final String KEY_SP_SIP_PORT = "KEY_SP_SIP_PORT";
+    private static final String KEY_SP_SIP_ACCOUNT = "KEY_SP_SIP_ACCOUNT";
 
     //默认ip端口
     //private static final String DEFAULT_URL = "8.129.220.143";
@@ -83,50 +84,14 @@ public class CommonUtils {
         getEditor(context).putString(KEY_SP_URL_PORT, port).apply();
     }
 
-    /*public static String getSipUrl(Context context) {
-        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_SIP_URL, DEFAULT_URL))) {
-            return DEFAULT_URL;
-        }
-        return getSP(context).getString(KEY_SP_SIP_URL, DEFAULT_URL);
-    }
-
-    public static void setSipUrl(Context context, String url) {
-        getEditor(context).putString(KEY_SP_SIP_URL, url).apply();
-    }
-
-    public static String getSipPort(Context context) {
-        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_SIP_PORT, DEFAULT_SIP_PORT))) {
-            return DEFAULT_SIP_PORT;
-        }
-        return getSP(context).getString(KEY_SP_SIP_PORT, DEFAULT_SIP_PORT);
-    }
-
-    public static void setSipPort(Context context, String port) {
-        getEditor(context).putString(KEY_SP_SIP_PORT, port).apply();
+    public static String getSipAccount(Context context) {
+        return getSP(context).getString(KEY_SP_SIP_ACCOUNT, "");
     }
 
-    public static String getThirdUrl(Context context) {
-        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_THIRD_URL, DEFAULT_URL))) {
-            return DEFAULT_URL;
-        }
-        return getSP(context).getString(KEY_SP_THIRD_URL, DEFAULT_URL);
+    public static void setSipAccount(Context context, String value) {
+        getEditor(context).putString(KEY_SP_SIP_ACCOUNT, value).apply();
     }
 
-    public static void setThirdUrl(Context context, String port) {
-        getEditor(context).putString(KEY_SP_THIRD_URL, port).apply();
-    }
-
-    public static String getThirdUrlPort(Context context) {
-        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_THIRD_URL_PORT, DEFAULT_URL_PORT))) {
-            return DEFAULT_URL_PORT;
-        }
-        return getSP(context).getString(KEY_SP_THIRD_URL_PORT, DEFAULT_URL_PORT);
-    }
-
-    public static void setThirdUrlPort(Context context, String port) {
-        getEditor(context).putString(KEY_SP_THIRD_URL_PORT, port).apply();
-    }*/
-
 
 
     private static SharedPreferences getSP(Context context) {

+ 49 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/StringUtil.java

@@ -1,5 +1,7 @@
 package com.wdkl.ncs.android.middleware.utils;
 
+import android.text.TextUtils;
+
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 
 public class StringUtil {
@@ -7,4 +9,51 @@ public class StringUtil {
     public static String getResString(int resId) {
         return BaseApplication.appContext.getString(resId);
     }
+
+    public static String transNumber(String str) {
+        if (TextUtils.isEmpty(str)) {
+            return "";
+        } else {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < str.length(); i++) {
+                char temp = str.charAt(i);
+                switch (temp) {
+                    case '0':
+                        sb.append('零');
+                        break;
+                    case '1':
+                        sb.append('一');
+                        break;
+                    case '2':
+                        sb.append('二');
+                        break;
+                    case '3':
+                        sb.append('三');
+                        break;
+                    case '4':
+                        sb.append('四');
+                        break;
+                    case '5':
+                        sb.append('五');
+                        break;
+                    case '6':
+                        sb.append('六');
+                        break;
+                    case '7':
+                        sb.append('七');
+                        break;
+                    case '8':
+                        sb.append('八');
+                        break;
+                    case '9':
+                        sb.append('九');
+                        break;
+                    default:
+                        sb.append(temp);
+                }
+            }
+
+            return sb.toString();
+        }
+    }
 }

+ 63 - 0
middleware/src/main/res/layout/confirm_dialog.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/transparent"
+    android:gravity="center">
+
+    <LinearLayout
+        android:layout_width="480dp"
+        android:layout_height="240dp"
+        android:background="@color/color_white"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_marginTop="32dp"
+            android:src="@drawable/delete" />
+
+        <TextView
+            android:id="@+id/tv_tip_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:gravity="center"
+            android:textColor="@color/black"
+            android:textSize="24sp"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:layout_width="400dp"
+            android:layout_height="52dp"
+            android:layout_marginTop="24dp"
+            android:layout_marginBottom="40dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/menu_confirm_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="确定"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+
+            <Button
+                android:id="@+id/menu_cancel_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:layout_marginLeft="40dp"
+                android:background="@drawable/shape_delete_bt_bg"
+                android:gravity="center"
+                android:text="取消"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 89 - 0
middleware/src/main/res/layout/extension_sip_dialog.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:id="@+id/ll_sip_view"
+        android:layout_width="481dp"
+        android:layout_height="441dp"
+        android:background="@color/color_white"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:layout_width="88dp"
+            android:layout_height="88dp"
+            android:layout_marginTop="42dp"
+            android:src="@drawable/hedimg" />
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:gravity="center"
+            android:text="请设置SIP账号"
+            android:textColor="@color/black"
+            android:textSize="22sp"
+            android:textStyle="bold" />
+
+        <EditText
+            android:id="@+id/sip_id_ed"
+            android:layout_width="380dp"
+            android:layout_height="48dp"
+            android:layout_marginTop="20dp"
+            android:background="@drawable/shape_n_login_ed_bg2"
+            android:digits="1234567890."
+            android:gravity="center_vertical"
+            android:hint="请输入SIP账号"
+            android:paddingLeft="24dp"
+            android:textSize="20sp"
+            android:textStyle="bold" />
+
+        <EditText
+            android:id="@+id/sip_ip_ed"
+            android:layout_width="380dp"
+            android:layout_height="48dp"
+            android:layout_marginTop="20dp"
+            android:background="@drawable/shape_n_login_ed_bg2"
+            android:digits="1234567890."
+            android:gravity="center_vertical"
+            android:hint="请输入SIP地址"
+            android:paddingLeft="24dp"
+            android:textSize="20sp"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:layout_width="400dp"
+            android:layout_height="52dp"
+            android:layout_marginTop="30dp"
+            android:layout_marginBottom="80dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/confirm_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="确定"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+
+            <Button
+                android:id="@+id/cancel_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:layout_marginLeft="30dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="取消"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 77 - 0
middleware/src/main/res/layout/password_check_dialog.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:id="@+id/ll_password_view"
+        android:layout_width="480dp"
+        android:layout_height="440dp"
+        android:background="@color/color_white"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:layout_width="88dp"
+            android:layout_height="88dp"
+            android:layout_marginTop="42dp"
+            android:src="@drawable/hedimg" />
+
+        <TextView
+            android:id="@+id/positioning_tip_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:gravity="center"
+            android:text="请输入管理员密码"
+            android:textColor="@color/black"
+            android:textSize="22sp"
+            android:textStyle="bold" />
+
+        <EditText
+            android:id="@+id/password_ed"
+            android:layout_width="380dp"
+            android:layout_height="48dp"
+            android:layout_marginTop="20dp"
+            android:background="@drawable/shape_n_login_ed_bg2"
+            android:gravity="center_vertical"
+            android:hint="请输入管理密码"
+            android:inputType="number"
+            android:paddingLeft="24dp"
+            android:textSize="20sp"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:layout_width="400dp"
+            android:layout_height="52dp"
+            android:layout_marginTop="30dp"
+            android:layout_marginBottom="80dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/password_cancel_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="取消"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+
+            <Button
+                android:id="@+id/password_determine_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:layout_marginLeft="30dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="确定"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 77 - 0
middleware/src/main/res/layout/sip_dialog.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:id="@+id/ll_sip_config_view"
+        android:layout_width="481dp"
+        android:layout_height="441dp"
+        android:background="@color/color_white"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:layout_width="88dp"
+            android:layout_height="88dp"
+            android:layout_marginTop="42dp"
+            android:src="@drawable/hedimg" />
+
+        <TextView
+            android:id="@+id/sip_tip_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:gravity="center"
+            android:text="请设置SIP账号"
+            android:textColor="@color/black"
+            android:textSize="22sp"
+            android:textStyle="bold" />
+
+        <EditText
+            android:id="@+id/sip_ed"
+            android:layout_width="380dp"
+            android:layout_height="48dp"
+            android:layout_marginTop="20dp"
+            android:background="@drawable/shape_n_login_ed_bg2"
+            android:digits="1234567890."
+            android:gravity="center_vertical"
+            android:hint="请输入SIP账号"
+            android:paddingLeft="24dp"
+            android:textSize="20sp"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:layout_width="400dp"
+            android:layout_height="52dp"
+            android:layout_marginTop="30dp"
+            android:layout_marginBottom="80dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/sip_determine_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="确定"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+
+            <Button
+                android:id="@+id/sip_cancel_button"
+                android:layout_width="180dp"
+                android:layout_height="48dp"
+                android:layout_marginLeft="30dp"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="取消"
+                android:textColor="@drawable/selector_btn_text_color"
+                android:textSize="16sp" />
+        </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>