Pārlūkot izejas kodu

Merge branch 'yz_watch_wdklwebrtc_1.0.0' of http://git.wdklian.com/allen/ncs_android_frame into yz_watch_wdklwebrtc_1.0.0

wjk 4 gadi atpakaļ
vecāks
revīzija
dec5ba1f13
18 mainītis faili ar 1135 papildinājumiem un 67 dzēšanām
  1. 4 2
      .idea/gradle.xml
  2. 1 1
      .idea/misc.xml
  3. 2 1
      app/src/main/AndroidManifest.xml
  4. 1 1
      build.gradle
  5. 4 3
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/AppUpdateActivity.kt
  6. 7 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/EventActivity.kt
  7. 16 1
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt
  8. 656 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt
  9. 9 1
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt
  10. 48 38
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt
  11. 0 3
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioRingingActivity.kt
  12. 4 2
      home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt
  13. 46 11
      home/src/main/code/com/wdkl/ncs/android/component/home/helper/AppUpdateHelper.java
  14. 261 0
      home/src/main/res/layout/watch_activity_home2.xml
  15. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  16. 12 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt
  17. 60 2
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt
  18. 2 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

+ 4 - 2
.idea/gradle.xml

@@ -1,14 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
+        <option name="testRunner" value="PLATFORM" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="modules">
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/AmDemo_R" />
+            <option value="$PROJECT_DIR$/WebRTC" />
             <option value="$PROJECT_DIR$/app" />
             <option value="$PROJECT_DIR$/common" />
             <option value="$PROJECT_DIR$/extra" />
@@ -21,12 +24,11 @@
             <option value="$PROJECT_DIR$/setting" />
             <option value="$PROJECT_DIR$/shop" />
             <option value="$PROJECT_DIR$/starRTC" />
-            <option value="$PROJECT_DIR$/webrtc" />
             <option value="$PROJECT_DIR$/welcome" />
           </set>
         </option>
         <option name="resolveModulePerSourceSet" value="false" />
-        <option name="testRunner" value="PLATFORM" />
+        <option name="useQualifiedModuleNames" value="true" />
       </GradleProjectSettings>
     </option>
   </component>

+ 1 - 1
.idea/misc.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">

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

@@ -47,8 +47,9 @@
 
 <!--        <activity android:name="com.wdkl.ncs.android.component.welcome.activity.WelcomeActivity"-->
 <!--            >-->
-        <activity android:name="com.wdkl.ncs.android.component.home.activity.WatchRegisterActivity">
+<!--        <activity android:name="com.wdkl.ncs.android.component.home.activity.WatchRegisterActivity">-->
 <!--        <activity android:name="com.starrtc.demo.demo.SplashActivity">-->
+        <activity android:name="com.wdkl.ncs.android.component.home.activity.WatchHome2Activity">-->
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
 

+ 1 - 1
build.gradle

@@ -272,7 +272,7 @@ buildscript {
     /**
      * SDK最小支持版本
      */
-    ext.min_sdk_version = 19
+    ext.min_sdk_version = 24
 
     /**
      * SDK目标支持版本

+ 4 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/activity/AppUpdateActivity.kt

@@ -85,9 +85,10 @@ class AppUpdateActivity :BaseActivity<AppUpdatePresenter, ActivityAppUpdateBindi
                 override fun onSuccess() {
                     runOnUiThread {
                         showMessage("升级成功")
-                        //finish()
-                        android.os.Process.killProcess(android.os.Process.myPid())
-                        System.exit(0)
+                        finish()
+                        //有root权限用这个
+//                        android.os.Process.killProcess(android.os.Process.myPid())
+//                        System.exit(0)
                     }
                 }
             })

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

@@ -18,6 +18,8 @@ import com.wdkl.ncs.android.middleware.api.ApiManager
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
 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.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.channel.EventUtil
@@ -29,6 +31,7 @@ import kotlinx.android.synthetic.main.watch_activity_event.*
 class EventActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEventBinding>(), WatchHomeActivityContract.View, View.OnClickListener {
 
 
+
     var TAG = EventActivity::class.java.simpleName
 
     var tcpModel = TcpModel()
@@ -196,7 +199,11 @@ class EventActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEven
 
     override fun networkMonitor(state: NetState) {
     }
+    override fun showData(data: DeviceDO) {
+    }
 
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
     override fun onClick(p0: View?) {
         if (interactionVO!!.actionType == TcpType.EVENT.name) {
             if (!Constants.ids.equals("")) {

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

@@ -30,6 +30,8 @@ import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
 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.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
@@ -48,6 +50,7 @@ import org.greenrobot.eventbus.ThreadMode
 @Router(path = "/event/detail")
 class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEventDetailBinding>(), WatchHomeActivityContract.View {
 
+
     var TAG = WatchEventDetailActivity::class.java.getSimpleName()
     //参数自动注入
     @Autowired(name = "tcpModelStr", required = true)
@@ -234,7 +237,11 @@ class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchA
             }
         }
     }
+    override fun showData(data: DeviceDO) {
+    }
 
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
@@ -277,7 +284,15 @@ class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchA
             //sip
             var intent = Intent()
             intent.setClass(this, WebRTCVoipAudioActivity::class.java)
-            intent.putExtra("targetId", interactionVO?.fromSipId)
+
+//            Log.e(TAG,"interactionVO?.actionDirectionType"+interactionVO?.actionDirectionType)
+//            Log.e(TAG,"interactionVO?.fromSipId"+interactionVO?.fromSipId)
+//            Log.e(TAG,"interactionVO?.toSipId"+interactionVO?.toSipId)
+            if(interactionVO?.actionDirectionType == 1){ //呼入
+                intent.putExtra("targetId", interactionVO?.fromSipId)
+            }else { //呼出
+                intent.putExtra("targetId", interactionVO?.toSipId)
+            }
             intent.putExtra("TcpModel", tcpModel)
             intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALL)
             startActivity(intent)

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

@@ -0,0 +1,656 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.Manifest
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.graphics.Color
+import android.net.wifi.WifiManager
+import android.os.Handler
+import android.telephony.PhoneStateListener
+import android.telephony.SignalStrength
+import android.telephony.TelephonyManager
+import android.text.TextUtils
+import android.util.Log
+import android.view.View
+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.google.gson.Gson
+import com.starrtc.demo.demo.service.KeepLiveService
+import com.starrtc.demo.utils.AEvent
+import com.vvsip.ansip.IVvsipServiceListener
+import com.vvsip.ansip.VvsipCall
+import com.wdkl.core.consts.Urls
+import com.wdkl.core.socket.IUserState
+import com.wdkl.core.socket.SocketManager
+import com.wdkl.core.voip.VoipEvent
+import com.wdkl.ncs.android.component.home.BuildConfig
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.SOSEmergencyCallActivity
+import com.wdkl.ncs.android.component.home.SipUtil.SipCallBack
+import com.wdkl.ncs.android.component.home.SipUtil.SipHelper
+import com.wdkl.ncs.android.component.home.SipUtil.SipHelperUtil
+import com.wdkl.ncs.android.component.home.SipUtil.SipHelperUtil2
+import com.wdkl.ncs.android.component.home.broadcast.BatteryBroadcastReceiver
+import com.wdkl.ncs.android.component.home.databinding.WatchActivityHomeBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.service.APPService
+import com.wdkl.ncs.android.component.home.service.TcpHandleService
+import com.wdkl.ncs.android.component.home.util.NetHelper
+import com.wdkl.ncs.android.component.home.util.SpeechUtil
+import com.wdkl.ncs.android.component.home.util.Util
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.joinManager
+import com.wdkl.ncs.android.lib.utils.push
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
+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.tcp.TcpClient
+
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.skywebrtc.SkyEngineKit
+import com.wdkl.skywebrtc.except.NotInitializedException
+import io.reactivex.Observable
+import kotlinx.android.synthetic.main.watch_activity_home.*
+import kotlinx.android.synthetic.main.watch_activity_home.battery_warning_tv
+import kotlinx.android.synthetic.main.watch_activity_home.call_records_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.customer_list_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.electric_quantity_tv
+import kotlinx.android.synthetic.main.watch_activity_home.list_item_img_icon_num
+import kotlinx.android.synthetic.main.watch_activity_home.other_linyout
+import kotlinx.android.synthetic.main.watch_activity_home.sip_state_tv
+import kotlinx.android.synthetic.main.watch_activity_home.state_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.user_nume_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.watch_name_tv
+import kotlinx.android.synthetic.main.watch_activity_home.watch_role_name_tv
+import kotlinx.android.synthetic.main.watch_activity_home.wifi_rssi_tv
+import kotlinx.android.synthetic.main.watch_activity_home2.*
+import kotlinx.android.synthetic.main.watch_activity_register.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.math.log
+
+@Router(path = "/watch/home")
+class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener, View.OnLongClickListener,
+        SipCallBack, IVvsipServiceListener, IUserState {
+
+
+    var TAG = WatchHome2Activity::class.java.getSimpleName()
+
+    //监听网络变化
+    lateinit var wifiManager: WifiManager
+    lateinit var teleManager: TelephonyManager
+    lateinit var wifiReceiver: WifiReceiver
+    private var netType: Int = -1
+
+    lateinit var batteryBroadcastReceiver: BatteryBroadcastReceiver
+
+
+    override fun getLayId(): Int {
+        return R.layout.watch_activity_home2
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+//        AppTool.SystemUI.showNavigationBar(this,false)
+//        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
+
+        presenter.loadTcpServerHost()
+
+        requestPermissions()
+
+
+    }
+
+    private fun requestPermissions() {
+        Observable.just("").compose(RxPermissions(this).ensure(Manifest.permission.CAMERA,
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.ACCESS_WIFI_STATE,
+                Manifest.permission.BLUETOOTH,
+                Manifest.permission.RECORD_AUDIO,
+                Manifest.permission.READ_PHONE_STATE)).subscribe {
+            if (it) {
+                Constants.imei = Util().getIMEI(this)
+                Log.e(TAG, "IMEI " + Util().getIMEI(this))
+
+                Constants.mac = NetHelper.getInstance().macAddress
+                //Constants.mac = "4C:C0:0A:8E:D6:BB"
+                Log.e(TAG, "mac " + Constants.mac)
+                tv_mac_addr.text = "MAC地址: " + Constants.mac + "\n" + "IMEI号:" + Constants.imei
+
+//                presenter.loadData(Constants.mac)//传Mac
+                presenter.loadData(Constants.imei)// 传imei
+            } else {
+                showMessage("请重新授权,进入App")
+                requestPermissions()
+            }
+        }.joinManager(disposableManager)
+
+
+    }
+
+    private fun regReceiver() {
+        wifiReceiver = WifiReceiver()
+        val intentFilter = IntentFilter()
+        intentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION)
+        registerReceiver(wifiReceiver, intentFilter)
+    }
+
+    override fun userLogin() {
+        Log.e(TAG, "webrtc 注册完成")
+        sip_state_tv.setBackgroundColor(Color.parseColor("#00FFFF"))
+        // webRTC呼叫测试
+//        var room = UUID.randomUUID().toString() + System.currentTimeMillis()
+//        var gEngineKit:SkyEngineKit? = null
+//        try {
+//            SkyEngineKit.init(VoipEvent()) //重新初始化
+//          gEngineKit = SkyEngineKit.Instance()
+//        } catch (e: NotInitializedException) {
+//            SkyEngineKit.init(VoipEvent()) //重新初始化
+//            try {
+//                gEngineKit = SkyEngineKit.Instance()
+//            } catch (ex: NotInitializedException) {
+//            }
+//        }
+//        val b = gEngineKit?.startOutCall(applicationContext, room, "4000000210", true)
+
+    }
+
+    override fun userLogout() {
+        sip_state_tv.setBackgroundColor(Color.parseColor("#FF0000"))
+        Log.e(TAG, "webrtc 注册失败")
+    }
+
+    private fun unRegReceiver() {
+        unregisterReceiver(wifiReceiver)
+    }
+
+    override fun bindEvent() {
+        customer_list_linlyout.setOnClickListener(this)
+        call_records_linlyout.setOnClickListener(this)
+        user_nume_linlyout.setOnClickListener(this)
+        state_linlyout.setOnClickListener(this)
+        user_nume_linlyout.setOnLongClickListener(this)
+        other_linyout.setOnClickListener(this)
+    }
+
+    override fun destory() {
+        unRegReceiver()
+        SpeechUtil.getInstance().release()
+//        SipHelperUtil.getInstance(this).unRegisterSip()
+//        SipHelper.getInstance().unRegisterSip()
+
+        //注销webRTC
+        SocketManager.getInstance().unConnect()
+
+        if (batteryBroadcastReceiver != null) {
+            unregisterReceiver(batteryBroadcastReceiver)
+        }
+    }
+
+    override fun render(appInfo: AppVersionDO) {
+        Log.d("AppUpdate", "loadAppVersion111 =====>>  version_code: " + appInfo.versionCode + ", path: " + appInfo.appPath)
+        val newAppVersion = appInfo.versionCode.substring(1)
+        Log.d("AppUpdate", "loadAppVersion222 =====>>  newAppVersion: " + newAppVersion + ", curAppVersion: " + BuildConfig.VERSION_NAME)
+        showMessage("获取版本成功,当前版本: " + BuildConfig.VERSION_NAME + ", 服务器版本: " + newAppVersion)
+
+        //服务器版本和当前版本不一致才做升级操作
+        if (!BuildConfig.VERSION_NAME.equals(newAppVersion)) {
+            Constants.APP_PATH = appInfo.appPath
+            AppTool.Time.delay(200) {
+                push("/callingbed/update")
+            }
+        }
+    }
+
+    fun checkAppVersion() {
+        Constants.APP_PATH = ""
+        //获取APP版本信息,7寸分机type=204
+        if (Constants.part_id != null) {
+            presenter.getAppVersion(Constants.part_id, 7)
+        }
+        Log.d("AppUpdate", "checkAppVersion =====>>  Constant.PART_ID: " + Constants.part_id)
+    }
+
+    /**
+     * 返回的设备信息
+     */
+    override fun showData(data: DeviceDO) {
+        watch_activity_register_layout.visibility = View.GONE
+        watch_activity_home_linyout.visibility = View.VISIBLE
+
+        Log.e(TAG, "收到返回的设备信息 ")
+        Constants.part_id = data.partId
+        Constants.ids = "" + data.id
+        Constants.sip_id = data.sipId
+        Constants.eth_ip = "192.168.1.138:8006/"
+        Constants.sip_ip = "192.168.1.162"
+        Constants.sip_id = data.sipId
+        Constants.sip_password = data.sipPassword
+        Constants.user_name = data.memberName
+        Constants.user_role_name = data.name
+
+        if (TextUtils.isEmpty(Constants.ids) || TextUtils.isEmpty(Constants.sip_id) || TextUtils.isEmpty(Constants.user_name)
+                || TextUtils.isEmpty(Constants.user_role_name)) {
+            showMessage("初始化数据时服务器返回数据不全,请联系管理员")
+            tv_feedback_device_info.text = "初始化数据时服务器返回数据不全,请联系管理员"
+            return
+        } else if (TextUtils.isEmpty(Constants.tcp_server)) {
+            showMessage("初始化tcp连接数据为null")
+            tv_feedback_device_info.text = "初始化tcp连接数据为null"
+            return
+        }
+
+        //这里的是视频通话有关的
+        AEvent.setHandler(Handler())
+        //这里的是视频通话有关的
+
+//        initSDK("000100")
+        initSDK(data.sipId)
+        initInterfaceData()
+        showMessage("初始化完成")
+    }
+
+    /**
+     * 返回的tcp信息
+     */
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+        Constants.tcp_server = tcpSeverDTO.publicIp
+        Constants.tcp_port = tcpSeverDTO.tcpPort
+        Constants.heart_beat = tcpSeverDTO.readerIdleTime
+
+        startConnectTcpServer()
+        showMessage("开始连接TCP服务器...")
+
+    }
+
+    private fun startConnectTcpServer() {
+        Thread(Runnable {
+            run {
+                //TcpClient.getInstance().init("192.168.1.138", 5080, 9)
+                //TcpClient.getInstance().init("47.106.200.55", 5080, 9)
+
+                TcpClient.getInstance().init(Constants.tcp_server, Constants.tcp_port, Constants.heart_beat)
+            }
+        }).start()
+    }
+
+    private fun initSDK(DeviceSipId: String) {
+        val intent = Intent(this, KeepLiveService::class.java)
+        intent.putExtra("DeviceSipId", DeviceSipId)
+        startService(intent)
+
+        val intent2 = Intent(this, TcpHandleService::class.java)
+        startService(intent2)
+
+
+        val intent3 = Intent(this, APPService::class.java)
+        startService(intent3)
+
+
+//        val intent2 = Intent(this, RTCKeepLiveService::class.java)
+//        startService(intent2)
+    }
+
+    /**
+     * 初始化界面数据
+     */
+    fun initInterfaceData() {
+        watch_name_tv.text = Constants.user_name
+
+        if (Constants.user_role_name!!.contains("腕表")) {
+            watch_role_name_tv.text = Constants.user_role_name!!.substring(0, (Constants.user_role_name)!!.indexOf("腕表"))
+        } else {
+            watch_role_name_tv.text = Constants.user_role_name
+        }
+
+        //开始ping网络,30秒ping一次
+//        NetHelper.startNetCheck()
+//        //SIP准备工作
+//        initSip()
+        //WEBRTC 语音初始化
+        // 添加登录回调
+        SocketManager.getInstance().addUserStateCallback(this)
+        // 连接socket:登录
+        SocketManager.getInstance().connect(Urls.WS, Constants.sip_id, 0)
+
+        Log.e(TAG, "Urls.WS " + Urls.WS + " sip_id " + Constants.sip_id)
+
+        wifiManager = (applicationContext.getSystemService(Context.WIFI_SERVICE)) as WifiManager
+        teleManager = (applicationContext.getSystemService(Context.TELEPHONY_SERVICE)) as TelephonyManager
+
+        netType = NetHelper.getInstance().getNetworkState(applicationContext)
+        Log.e(TAG, "wzlll 网络类型:" + netType)
+        if (netType == NetHelper.NETWORK_2G || netType == NetHelper.NETWORK_3G || netType == NetHelper.NETWORK_4G) {
+            if (teleManager != null) {
+                teleManager.listen(object : PhoneStateListener() {
+                    override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
+                        super.onSignalStrengthsChanged(signalStrength)
+                        val asu = signalStrength.gsmSignalStrength
+                        val lastSignal = -113 + 2 * asu;
+                        if (lastSignal > 0) {
+                            var mobileNetworkSignal = lastSignal
+                        }
+                        Log.e(TAG, "wzlll 数据连接信号强度:" + lastSignal)
+                    }
+                }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
+            }
+        }
+        regReceiver()
+
+        batteryBroadcastReceiver = BatteryBroadcastReceiver(electric_quantity_tv)
+
+        val intentFilter = IntentFilter()
+        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED)
+        registerReceiver(batteryBroadcastReceiver, intentFilter)
+
+        //TTS初始化
+        SpeechUtil.getInstance().init(BaseApplication.appContext)
+        SpeechUtil.getInstance().startSpeechThread()
+
+        //检查版本
+//        checkAppVersion()
+
+    }
+
+
+    override fun onError(message: String, type: Int) {
+    }
+
+    override fun complete(message: String, type: Int) {
+    }
+
+    override fun start() {
+    }
+
+    override fun networkMonitor(state: NetState) {
+    }
+
+    private fun initSip() {
+
+
+        //=============================================Sip启动服务===================================//
+        SipHelperUtil.getInstance(this).sipStartService(Constants.sip_ip, Constants.sip_id, Constants.sip_password)
+        //=============================================SIP状态回调===================================//
+        SipHelperUtil.getInstance(this).setSipCallBack(this)
+        //=============================================SIP服务监听===================================//
+        SipHelperUtil.getInstance(this).obtainSipInfo()
+
+//        SipHelper.getInstance().sipStartService()
+//        SipHelper.getInstance().initSip(this, Constants.sip_ip,Constants.sip_id,Constants.sip_password)
+//        SipHelper.getInstance().setSipCallBack(this)
+//        SipHelper.getInstance().setSipListner(this)
+    }
+
+
+    /**
+     * sip开始通话    ------------------sip回调操作----------------------
+     */
+    override fun startCall(sipAddress: String?) {
+        SipHelperUtil.getInstance(this).startCall(sipAddress)
+    }
+
+    /**
+     * sip自动接听
+     */
+    override fun autoTalking() {
+        SipHelperUtil.getInstance(this).autoTalking()
+    }
+
+    /**
+     * sip结束通话
+     */
+    override fun endCall() {
+        SipHelperUtil.getInstance(this).endCall()
+    }
+
+    override fun onNewVvsipCallEvent(call: VvsipCall?) {
+        SipHelperUtil.getInstance(this).addCallObject(call)
+    }
+
+    override fun onRemoveVvsipCallEvent(call: VvsipCall?) {
+        SipHelperUtil.getInstance(this).removeCallObject(call)
+    }
+
+    override fun onStatusVvsipCallEvent(call: VvsipCall?) {
+    }
+
+    override fun onRegistrationEvent(rid: Int, remote_uri: String?, code: Int, reason: String?) {
+    }
+
+    /**
+     * 监听
+     */
+    override fun onClick(p0: View) {
+        when (p0.id) {
+            R.id.customer_list_linlyout -> {
+                push("/watch/contacts")
+
+            }
+            R.id.call_records_linlyout -> {
+//                push("/watch/callrecords")
+                var intent = Intent(this, WatchCallRecordsActivity::class.java)
+                intent.putExtra("action", "ALL")
+                intent.putExtra("customer_id", "")
+                startActivity(intent)
+            }
+            R.id.user_nume_linlyout -> {
+                var intent = Intent(this, WatchCallRecordsActivity::class.java)
+                intent.putExtra("action", "UNREAD")
+                intent.putExtra("customer_id", "")
+                startActivity(intent)
+
+            }
+            R.id.state_linlyout -> {
+
+            }
+
+            R.id.other_linyout -> {
+                val intent = Intent(this, WatchUserSettingActivity::class.java)
+                startActivity(intent)
+            }
+        }
+    }
+
+    /**
+     * 长按进入
+     */
+    override fun onLongClick(p0: View): Boolean {
+        when (p0.id) {
+            R.id.user_nume_linlyout -> {
+//                val intent = Intent(this, WatchUserSettingActivity::class.java)
+//                startActivity(intent)
+            }
+        }
+        return true
+    }
+
+
+    // ====================================== 处理tcp
+    var calling: Boolean = false
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+//        Log.e(TAG,""+messageEvent.tag)
+//        var tcpModels = messageEvent.getMessage() as TcpModel
+//        Log.e(TAG,""+tcpModels.getAction())
+        if (messageEvent.tag == 14) {
+            //唤醒屏幕并解锁屏幕
+            Util().wakeUpAndUnlock(this)
+
+        } else if (messageEvent.tag == Constants.EVENT_TCP_APP_UPDATE) {
+            //更新APP
+            checkAppVersion()
+        } else if (messageEvent.tag == Constants.EVENT_SIP_REGISTER_STATUS) {
+            var message = messageEvent.getMessage() as String
+            Log.e(TAG, "收到sip註冊消息 " + message)
+            runOnUiThread {
+                if (message.equals(SipHelperUtil.REGISTERING)) {
+                    sip_state_tv.setBackgroundColor(Color.parseColor("#FFFF00"))
+                } else if (message.equals(SipHelperUtil.REGISTERFAIL)) {
+                    sip_state_tv.setBackgroundColor(Color.parseColor("#FF0000"))
+                } else if (message.equals(SipHelperUtil.REGISTERCOM)) {
+                    sip_state_tv.setBackgroundColor(Color.parseColor("#00FFFF"))
+                }
+            }
+        } else if (messageEvent.tag == Constants.EVENT_INTERNETPING) {
+            SipHelperUtil.getInstance(this).obtainSipInfo()
+
+        } else if (messageEvent.tag == Constants.EVENT_UNTREATED_QUANTITY) {
+            var message = messageEvent.getMessage() as ArrayList<InteractionVO>
+            list_item_img_icon_num.text = "" + message.size
+
+        } else if (messageEvent.tag == Constants.EVENT_WIFI_RSSI) {
+            var message = messageEvent.getMessage() as Int
+            if (10 < message && message < 20) {
+                electric_quantity_tv.text = "" + message
+                battery_warning_tv.setTextColor(Color.parseColor("#FF3030"))
+                battery_warning_tv.visibility = View.VISIBLE
+                battery_warning_tv.text = "低电量,请注意充电"
+
+            } else if (10 > message) {
+                electric_quantity_tv.text = "" + message
+                battery_warning_tv.setTextColor(Color.parseColor("#8B2323"))
+                battery_warning_tv.visibility = View.VISIBLE
+                battery_warning_tv.text = "电量过低,请充电"
+            } else {
+                battery_warning_tv.visibility = View.GONE
+                electric_quantity_tv.text = "" + message
+            }
+
+
+        } else if (messageEvent.tag == 0) {
+            //唤醒屏幕并解锁屏幕
+            Util().wakeUpAndUnlock(this)
+
+            var tcpModel = messageEvent.getMessage() as TcpModel
+            var responseTcpModel: TcpModel
+            Log.e(TAG, "" + tcpModel.getType() + " " + tcpModel.getAction())
+            when (tcpModel.getType()) {
+                TcpType.CALLBACK -> if (tcpModel.getAction() === TcpAction.CallbackAction.SUCCESS) {
+                    //todo: 刷新呼叫记录列表
+
+                } else if (tcpModel.getAction() === TcpAction.CallbackAction.FAILED) {
+                    //呼叫失败
+                }
+                TcpType.VOICE -> if (tcpModel.getAction() === TcpAction.VoiceAction.CALL) { //语音呼入
+                    val interactionVO = Gson().fromJson<InteractionVO>(tcpModel.getData().toString(), InteractionVO::class.java)
+                    //判断当前是否通话
+                    // 通话中
+                    if (calling) {
+                        responseTcpModel = VoiceUtil.voiceCalling(tcpModel.getToId(), tcpModel.getFromId(), interactionVO.getId())
+                        //给服务器发送正在通话中 tcp
+                        TcpClient.getInstance().sendMsg(responseTcpModel.toJson())
+                    } else {
+                        Log.e(TAG, "启动接听界面")
+                        responseTcpModel = VoiceUtil.voiceSuccess(tcpModel.getToId(), tcpModel.getFromId(), interactionVO.getId())
+                        TcpClient.getInstance().sendMsg(responseTcpModel.toJson())
+
+                        //界面呈现
+                        AppTool.Time.delay(300) {
+                            //rtc
+//                            var intent = Intent()
+//                            intent.setClass(this, RTCVoipAudioRingingActivity::class.java)
+//                            intent.putExtra("targetId", interactionVO.fromSipId)
+//                            intent.putExtra("TcpModel", tcpModel)
+//                            startActivity(intent)
+
+                            //sip
+//                            var intent = Intent()
+//                            intent.setClass(this, SipVoipAudioRingingActivity::class.java)
+//                            intent.putExtra("targetId", interactionVO.fromSipId)
+//                            intent.putExtra("TcpModel", tcpModel)
+//                            startActivity(intent)
+
+
+                            //webRTC
+                            var intent = Intent()
+                            intent.setClass(this, WebRTCVoipAudioRingingActivity::class.java)
+                            intent.putExtra("targetId", interactionVO.fromSipId)
+                            intent.putExtra("TcpModel", tcpModel)
+                            startActivity(intent)
+
+                        }
+                    }
+                } else if (tcpModel.getAction() === TcpAction.VoiceAction.HANDOFF) { //对方挂断,不论我方呼出或呼入
+                    //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方已挂断并停留3秒,结束至正常界面;更新左侧
+
+                } else if (tcpModel.getAction() === TcpAction.VoiceAction.SUCCESS) {
+                    //todo 更新呼出的TcpModel,data放置vo
+                }
+                TcpType.VIDEO -> {
+                }
+                TcpType.IM -> if (tcpModel.getAction() === TcpAction.IMAction.MSG) {
+                    //todo: 使用通话中界面,显示有语音留言,停留3秒,结束至正常界面
+
+                }
+                TcpType.EVENT -> if (tcpModel.getAction() === TcpAction.EventAction.KEY_CLICK) { //有新事件过来
+                    //todo: 服务端通过data给出具体的事件名称放置data。使用通话中界面,显示事件名称,停留3秒,结束至正常界面
+                    Log.e(TAG, "收到事件tcp")
+                }
+                TcpType.SOS -> if (tcpModel.getAction() === TcpAction.SOSAction.CALL) {
+                    Log.e(TAG, "" + tcpModel.getType() + " " + tcpModel.getAction())
+
+                    var intent = Intent()
+                    intent.setClass(this, SOSEmergencyCallActivity::class.java)
+                    intent.putExtra("TcpModel", tcpModel)
+                    startActivity(intent)
+                }
+                TcpType.DEVICE -> if (tcpModel.getAction() === TcpAction.DeviceAction.APP_UPDATE) {//更新APP
+                    checkAppVersion()
+                } else if (tcpModel.getAction() === TcpAction.DeviceAction.RESTART) { //刷新数据
+
+                }
+            }
+        }
+    }
+
+
+    //WiFi监听
+    inner class WifiReceiver : BroadcastReceiver() {
+        override fun onReceive(context: Context, intent: Intent) {
+            if (intent.action == WifiManager.RSSI_CHANGED_ACTION) {
+                if (wifiManager != null && netType == NetHelper.NETWORK_WIFI) {
+                    val wifiInfo = wifiManager.getConnectionInfo()
+                    val wifi = wifiInfo.getRssi();//获取wifi信号强度
+//                    Log.e(TAG,"wifi 信号强度"+wifi)
+
+                    if (wifi > -50 && wifi < 0) {//最强
+//                        Log.e(TAG, "wzlll 最强")
+                        wifi_rssi_tv.text = "较强"
+                    } else if (wifi > -70 && wifi < -50) {//较强
+//                        Log.e(TAG, "wzlll 较强")
+                        wifi_rssi_tv.text = "一般"
+                    } else if (wifi > -80 && wifi < -70) {//较弱
+//                        Log.e(TAG, "wzlll 较弱")
+                        wifi_rssi_tv.text = "微弱"
+                    } else if (wifi > -100 && wifi < -80) {//微弱
+//                        Log.e(TAG, "wzlll 微弱")
+                        wifi_rssi_tv.setTextColor(Color.parseColor("#FF3030"))
+                        wifi_rssi_tv.text = "wifi信号较弱,请注意"
+                    }
+                }
+            }
+        }
+    }
+}

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

@@ -42,6 +42,8 @@ import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
 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.tcp.TcpClient
 
@@ -65,6 +67,7 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
         SipCallBack , IVvsipServiceListener, IUserState {
 
 
+
     var TAG = WatchHomeActivity::class.java.getSimpleName()
 
     //监听网络变化
@@ -219,6 +222,11 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
             }
         }
     }
+    override fun showData(data: DeviceDO) {
+    }
+
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
 
     fun checkAppVersion() {
         Constants.APP_PATH = ""
@@ -354,7 +362,7 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
             //唤醒屏幕并解锁屏幕
             Util().wakeUpAndUnlock(this)
 
-        }else if(messageEvent.tag == 13){
+        }else if(messageEvent.tag == Constants.EVENT_TCP_APP_UPDATE){
             //更新APP
             checkAppVersion()
         }else if(messageEvent.tag == Constants.EVENT_SIP_REGISTER_STATUS){

+ 48 - 38
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt

@@ -7,8 +7,10 @@ import android.os.Handler
 import android.os.SystemClock
 import android.support.v7.app.AlertDialog
 import android.util.Log
+import android.view.KeyEvent
 import android.view.View
 import android.view.WindowManager
+import android.widget.Toast
 import com.google.gson.Gson
 import com.vvsip.ansip.IVvsipServiceListener
 import com.wdkl.core.voip.VoipEvent
@@ -366,45 +368,53 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
     }
 
 
-    override fun onBackPressed() {
-        AlertDialog.Builder(this).setCancelable(true)
-                .setTitle("是否挂断?")
-                .setNegativeButton("取消") { arg0, arg1
-                    -> }.setPositiveButton("确定"
-                ) { arg0, arg1 ->
-                    var interactionVO: InteractionVO? = null
-                    if (tcpModel.data.javaClass.name == String::class.java.name) {
-                        interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                    } else {
-                        interactionVO = tcpModel.data as InteractionVO
-                    }
-                    Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
-                    Log.e(TAG, "tcpModel" + tcpModel.toJson())
-                    //todo 给服务器发送挂断 tcp
-                    if (interactionVO != null) {
-                        if (tcpModel.type == TcpType.VOICE) {
-                            if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
-                                val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.toId, interactionVO.id)
-                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-                            } else if (tcpModel.action === TcpAction.VoiceAction.CALL) {
-                                val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.fromId, interactionVO.id)
-                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-                            }
-//                      SipHelperUtil.getInstance(this).getmSipCallBack().endCall()
-
-                            //webrtc
-                            val session = gEngineKit?.getCurrentSession()
-                            if (session != null) {
-                                SkyEngineKit.Instance().endCall()
-                            }
-
-                            finish()
-
-                        }
-
-                    }
+//    override fun onBackPressed() {
+//        AlertDialog.Builder(this).setCancelable(true)
+//                .setTitle("是否挂断?")
+//                .setNegativeButton("取消") { arg0, arg1
+//                    -> }.setPositiveButton("确定"
+//                ) { arg0, arg1 ->
+//                    var interactionVO: InteractionVO? = null
+//                    if (tcpModel.data.javaClass.name == String::class.java.name) {
+//                        interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+//                    } else {
+//                        interactionVO = tcpModel.data as InteractionVO
+//                    }
+//                    Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+//                    Log.e(TAG, "tcpModel" + tcpModel.toJson())
+//                    //todo 给服务器发送挂断 tcp
+//                    if (interactionVO != null) {
+//                        if (tcpModel.type == TcpType.VOICE) {
+//                            if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
+//                                val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.toId, interactionVO.id)
+//                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                            } else if (tcpModel.action === TcpAction.VoiceAction.CALL) {
+//                                val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.fromId, interactionVO.id)
+//                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                            }
+////                      SipHelperUtil.getInstance(this).getmSipCallBack().endCall()
+//
+//                            //webrtc
+//                            val session = gEngineKit?.getCurrentSession()
+//                            if (session != null) {
+//                                SkyEngineKit.Instance().endCall()
+//                            }
+//
+//                            finish()
+//
+//                        }
+//
+//                    }
+//
+//                }.show()
+//    }
 
-                }.show()
+    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+//            Toast.makeText(this, "按下了back键   onKeyDown()", Toast.LENGTH_SHORT).show()
+            return false
+        }
+        return super.onKeyDown(keyCode, event)
     }
 
     override fun onDestroy() {

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

@@ -187,9 +187,6 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         }
     }
 
-
-
-
     override fun onDestroy() {
         super.onDestroy()
         isAnswerOrHangUp = false

+ 4 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt

@@ -22,16 +22,18 @@ interface HomeComponent {
     fun inject(activity: CategoryFragment)
 
     //手表
+    fun inject(activity: WatchRegisterActivity)
+
     fun inject(activity: WatchHomeActivity)
 
+    fun inject(activity: WatchHome2Activity)
+
     fun inject(activity: AppUpdateActivity)
 
     fun inject(activity: WatchContactsActivity)
 
     fun inject(activity: WatchCallRecordsActivity)
 
-    fun inject(activity: WatchRegisterActivity)
-
     fun inject(activity: EventActivity)
 
     fun inject(activity: WatchEventDetailActivity)

+ 46 - 11
home/src/main/code/com/wdkl/ncs/android/component/home/helper/AppUpdateHelper.java

@@ -8,6 +8,7 @@ import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Environment;
+import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import java.io.BufferedReader;
@@ -29,7 +30,10 @@ public class AppUpdateHelper {
      */
     public static final String FILE_APK_NAME = "CallingBed2APK.apk";
 
+    public static Context mContext;
+
     public static void updateApp(Context context, UpdateCallBack callBack) {
+        mContext = context;
         if (checkApkExit(context)) {
             Log.d(TAG, "文件存在");
         } else {
@@ -49,17 +53,17 @@ public class AppUpdateHelper {
 
 
         //if (installApp(context.getPackageName(), path)) {
-        if (rootSilenceInstall(path)) {
-            Log.d(TAG, "安装成功");
-            if (callBack != null) {
-                callBack.onSuccess();
-            }
-        } else {
-            Log.d(TAG, "安装失败");
-            if (callBack != null) {
-                callBack.onFailed();
-            }
-        }
+//        if (rootSilenceInstall(path)) {
+//            Log.d(TAG, "安装成功");
+//            if (callBack != null) {
+//                callBack.onSuccess();
+//            }
+//        } else {
+//            Log.d(TAG, "安装失败");
+//            if (callBack != null) {
+//                callBack.onFailed();
+//            }
+//        }
 
 //        if (silentInstall(context, path)) {
 //            Log.d(TAG, "app 安装成功");
@@ -67,8 +71,38 @@ public class AppUpdateHelper {
 //                callBack.onSuccess();
 //            }
 //        }
+
+        if (installAPP(path)) {
+            Log.d(TAG, "安装成功");
+            if (callBack != null) {
+                callBack.onSuccess();
+            }
+        }
     }
 
+
+    public static boolean installAPP(String path) {
+
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        File apkFile = new File(path);
+        // 由于没有在Activity环境下启动Activity,设置下面的标签
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        //Android 7.0以上要使用FileProvider
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
+            Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile);
+            //添加这一句表示对目标应用临时授权该Uri所代表的文件
+//                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.setDataAndType(uri, "application/vnd.android.package-archive");
+        } else {
+            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
+        }
+        mContext.startActivity(intent);
+        return true;
+    }
+
+
     private static boolean checkApkExit(Context context) {
         File file = new File(FILE_APK_PATH + "/" + FILE_APK_NAME);
         return file.exists();
@@ -189,6 +223,7 @@ public class AppUpdateHelper {
 
     public interface UpdateCallBack {
         void onFailed();
+
         void onSuccess();
     }
 }

+ 261 - 0
home/src/main/res/layout/watch_activity_home2.xml

@@ -0,0 +1,261 @@
+<?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">
+
+      <include
+          android:id="@+id/watch_activity_register_layout"
+          layout="@layout/watch_activity_register"
+          ></include>>
+
+        <LinearLayout
+            android:id="@+id/watch_activity_home_linyout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:visibility="gone">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1">
+
+                <LinearLayout
+                    android:id="@+id/customer_list_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#00B5DC"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/gu_ke_lie_biao" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="10px"
+                        android:text="顾客列表"
+                        android:textColor="#ffffff"
+                        android:textSize="16px" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/call_records_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#E56D37"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/tong_hu_ji_lu" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="10px"
+                        android:text="通话记录"
+                        android:textColor="#ffffff"
+                        android:textSize="16px" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+
+                <RelativeLayout
+                    android:id="@+id/user_nume_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#5CB615"
+                    >
+
+                    <TextView
+                        android:id="@+id/list_item_img_icon_num"
+                        android:layout_width="10dp"
+                        android:layout_height="10dp"
+                        android:layout_alignParentRight="true"
+                        android:background="@drawable/shape_untreated_quantity"
+                        android:gravity="center"
+                        android:textColor="#FF3030"
+                        android:textSize="12sp" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:orientation="vertical">
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:src="@drawable/hu_shi_to_xiang" />
+
+                        <TextView
+                            android:id="@+id/watch_name_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="10px"
+                            android:text="王护士"
+                            android:textColor="#ffffff"
+                            android:textSize="16px" />
+
+                        <TextView
+                            android:id="@+id/watch_role_name_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="10px"
+                            android:text="护士"
+                            android:textColor="#ffffff"
+                            android:textSize="16px" />
+                    </LinearLayout>
+                </RelativeLayout>
+
+                <LinearLayout
+                    android:id="@+id/state_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"
+                        android:layout_weight="1"
+                        android:orientation="horizontal">
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#EA89C0"
+                            android:gravity="center"
+                            android:orientation="vertical">
+
+                            <ImageView
+                                android:id="@+id/network_state_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/wifi_lian_jie" />
+
+                            <TextView
+                                android:id="@+id/wifi_rssi_tv"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="100%"
+                                android:textColor="#ffffff"
+                                android:textSize="16px" />
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#FF9900"
+                            android:gravity="center">
+
+                            <ImageView
+                                android:id="@+id/sip_state_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/sip_lian_jie" />
+
+                        </LinearLayout>
+
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"
+                        android:layout_weight="1"
+                        android:orientation="horizontal">
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#48CFB0"
+                            android:gravity="center"
+                            android:orientation="vertical">
+
+                            <ImageView
+                                android:id="@+id/electric_quantity_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/dian_liang" />
+
+                            <TextView
+                                android:id="@+id/electric_quantity_tv"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="100%"
+                                android:textColor="#ffffff"
+                                android:textSize="16px" />
+
+                            <TextView
+                                android:id="@+id/battery_warning_tv"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text=""
+                                android:textColor="#ffffff"
+                                android:textSize="16px"
+                                android:visibility="gone" />
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:id="@+id/other_linyout"
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#FFDE00"
+                            android:gravity="center"
+                            android:orientation="vertical">
+
+                            <TextView
+                                android:id="@+id/sip_state_tv"
+                                android:layout_width="8dp"
+                                android:layout_height="8dp"
+                                android:background="#FF0000"
+                                 />
+
+                            <ImageView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginTop="2dp"
+                                android:src="@drawable/geng_duo" />
+
+
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+    </RelativeLayout>
+</layout>

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

@@ -31,6 +31,8 @@ class Constants {
 
         val EVENT_TCP_RETRANSMISSION  = 0x16 //tcp掉线
 
+        val EVENT_TCP_APP_UPDATE  = 0x13 //app更新
+
         var APP_PATH = "" //app版本
     }
 

+ 12 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt

@@ -2,13 +2,25 @@ package com.wdkl.ncs.android.middleware.logic.contract.home
 
 import com.wdkl.ncs.android.lib.base.BaseContract
 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.WatchContactsVO
 
 interface WatchHomeActivityContract{
     interface View : BaseContract.BaseView{
+        //显示设备信息
+        fun showData(data : DeviceDO)
+        //显示tcp通讯地址
+        fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO)
+        //版本号信息
         fun render(appInfo: AppVersionDO)
     }
     interface Presenter : BaseContract.BasePresenter{
+        //获取设备信息
+        fun loadData(ethMac:String)
+        //获取tcp服务器地址
+        fun loadTcpServerHost()
+        //获取版本信息
         fun getAppVersion(partId: Int, deviceType: Int)
     }
 }

+ 60 - 2
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt

@@ -11,10 +11,13 @@ import com.wdkl.ncs.android.lib.utils.ConnectionObserver
 import com.wdkl.ncs.android.lib.utils.getEventCenter
 import com.wdkl.ncs.android.lib.utils.getJsonString
 import com.wdkl.ncs.android.lib.vo.NetStateEvent
+import com.wdkl.ncs.android.middleware.api.WatchDeviceInfoAndTCPMailingAddressApi
 import com.wdkl.ncs.android.middleware.api.WatchManageDeviceApi
 import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 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 io.reactivex.disposables.Disposable
 import javax.inject.Inject
 
@@ -22,9 +25,16 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
 
 
 
+
+
+    /**
+     *获取当前设备数据api
+     */
     @Inject
-    protected lateinit var watchManageDeviceApi: WatchManageDeviceApi
+    protected lateinit var registerDeviceApi: WatchDeviceInfoAndTCPMailingAddressApi
 
+    @Inject
+    protected lateinit var watchManageDeviceApi: WatchManageDeviceApi
 
 
     override fun bindDagger() {
@@ -39,7 +49,25 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
 
         override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
             providerView().complete()
-            providerView().render(result as AppVersionDO)
+            when (result) {
+                is DeviceDO -> {
+                    providerView().complete()
+                    providerView().showData(result as DeviceDO)
+                }
+
+                is TcpSeverDTO -> {
+                    //tcp服务器地址
+                    providerView().complete("")
+                    providerView().setTcpServerHost(result)
+                }
+                 is AppVersionDO -> {
+                     //版本信息
+                     providerView().complete("")
+                     providerView().render(result as AppVersionDO)
+                 }
+
+            }
+
         }
 
         override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
@@ -56,6 +84,36 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
     }
 
 
+    /**
+     *获取当前设备数据
+     */
+    override fun loadData(ethMac:String) {
+
+        registerDeviceApi.getDeviceMessage(ethMac).map {
+            var deviceDO = DeviceDO()
+
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            deviceDO = gson.fromJson(it.getJsonString(), DeviceDO::class.java)
+            return@map deviceDO
+        }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observer)
+
+    }
+
+    override fun loadTcpServerHost() {
+        registerDeviceApi.getTcpServerHost()
+                .map {
+                    val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                    val tcpServer = gson.fromJson(it.getJsonString(), TcpSeverDTO::class.java)
+
+                    return@map tcpServer
+                }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observer)
+    }
+
+
     override fun getAppVersion(partId: Int, deviceType: Int) {
 
         watchManageDeviceApi.getAppVersion(partId, deviceType)

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

@@ -7,6 +7,7 @@ import android.os.PowerManager;
 import android.util.Log;
 
 import com.google.gson.Gson;
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
@@ -71,7 +72,7 @@ public class DeviceChannel {
         }else if(tcpModel.getType() == TcpType.DEVICE &&tcpModel.getAction() == TcpAction.DeviceAction.RESTART||
                 tcpModel.getType() == TcpType.DEVICE && tcpModel.getAction() == TcpAction.DeviceAction.DEVICE_REFRESH||
                 tcpModel.getType() == TcpType.DEVICE && tcpModel.getAction() == TcpAction.DeviceAction.APP_UPDATE){
-
+            EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.Companion.getEVENT_TCP_APP_UPDATE()));
         }else {
             EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
         }