Browse Source

兼容大朝华15.6寸A01型号主机,升级gradle版本,解决集成的大朝华主机jar包编译报错问题,sip优化等

weizhengliang 1 year ago
parent
commit
1a75f3ec6f
55 changed files with 573 additions and 507 deletions
  1. 1 12
      android_host/build.gradle
  2. 2 2
      android_host/src/main/common/java/com/wdkl/ncs/host/sip/core/CorePreferences.kt
  3. 6 7
      android_host/src/main/common/java/com/wdkl/ncs/host/sip/core/LinCoreService.java
  4. 18 11
      android_host/src/main/common/java/com/wdkl/ncs/host/sip/core/LinphoneManager.kt
  5. 123 88
      android_host/src/main/common/java/com/wdkl/ncs/host/util/AudioRouteUtils.kt
  6. 0 171
      android_host/src/main/common/java/com/wdkl/ncs/host/util/AudioRouteUtils.kt.bak
  7. 138 0
      android_host/src/main/common/java/com/wdkl/ncs/host/util/AudioRouteUtils.kt.bak2
  8. 2 1
      android_host/src/main/h10_wke_1h/AndroidManifest.xml
  9. 14 0
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/AppUpdateActivity.kt
  10. 115 62
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt
  11. 6 4
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/TestActivity.kt
  12. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/BroadcastAdapter.kt
  13. 2 2
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/CallRecordsItemAdapter.kt
  14. 2 2
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/DoctorHostAdapter.kt
  15. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/FrameBedVosAdapter.kt
  16. 2 2
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/FrameBedVosConfinementAdapter.kt
  17. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/FrameRoomBedAdapter.java
  18. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/InpatientWardAdapter.kt
  19. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/IotDeviceAdapter.kt
  20. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/LedItemAdapter.kt
  21. 2 2
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/NurseMoveAdapter.kt
  22. 2 2
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/OtherHostAdapter.kt
  23. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/ResponsibilityBedAdapter.kt
  24. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/TrusteeshipAdapter.kt
  25. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/VisitManagementAdapter.kt
  26. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/CallRecordsFragment.kt
  27. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt
  28. 10 67
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SipCallFragment.kt
  29. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SkyCallFragment.kt
  30. 10 3
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt
  31. 0 12
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/receiver/WdBootReceiver.java
  32. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java
  33. 1 1
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/util/XCrashUtils.java
  34. 2 2
      android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/window/IncidentWindow.kt
  35. 1 1
      app/build.gradle
  36. 8 0
      app/src/main/AndroidManifest.xml
  37. 8 0
      app/src/main/sharedUserId/AndroidManifest.xml
  38. 6 2
      build.gradle
  39. 17 11
      common/build.gradle
  40. 0 0
      common/libs/common-1.1.9.aar
  41. 0 0
      common/libs/linphone-sdk-android-5.0.71.aar
  42. BIN
      common/libs/meiai_api.jar
  43. 2 2
      common/src/main/code/com/wdkl/ncs/android/lib/adapter/TextViewDelegateAdapter.kt
  44. 36 8
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  45. 1 1
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseFragment.kt
  46. 2 2
      common/src/main/code/com/wdkl/ncs/android/lib/base/GalleryActivity.kt
  47. 2 2
      common/src/main/code/com/wdkl/ncs/android/lib/utils/BaseRecyclerViewHolder.kt
  48. 1 1
      common/src/main/code/com/wdkl/ncs/android/lib/widget/PopCommonView.kt
  49. BIN
      gstream/libs/armeabi-v7a/libc++_shared.so
  50. 15 8
      middleware/build.gradle
  51. BIN
      middleware/libs/libvlc-armv7-3.2-eap10.aar
  52. BIN
      middleware/libs/linphone-sdk-android-5.2.10.aar
  53. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/bind/DataBindingHelper.kt
  54. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/PostCommentViewModel.kt
  55. 1 1
      welcome/build.gradle

+ 1 - 12
android_host/build.gradle

@@ -28,10 +28,6 @@ android {
         dataBinding {
             enabled = true
         }
-
-        buildConfigField "String", "BUILD_TIME", getDate()
-        buildConfigField "String", "APP_DEVICE_TYPE", "\""+app_device_type+"\""
-        buildConfigField 'String', 'OEM_NAME', "\"${project.rootProject.ext.oem_name}\""
     }
 
     sourceSets {
@@ -77,13 +73,6 @@ android {
     }
 }
 
-//获取编译日期
-static String getDate() {
-    Date date = new Date()
-    String dates = "\""+date.format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))+"\""
-    return dates
-}
-
 dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
@@ -121,7 +110,7 @@ dependencies {
     /**
      * Kotlin依赖
      */
-    kapt 'com.android.databinding:compiler:2.3.3'
+    //kapt 'com.android.databinding:compiler:2.3.3'
 
     /**
      * 路由注解处理器

+ 2 - 2
android_host/src/main/common/java/com/wdkl/ncs/host/sip/core/CorePreferences.kt

@@ -238,14 +238,14 @@ class CorePreferences constructor(private val context: Context) {
         }
 
     var routeAudioToBluetoothIfAvailable: Boolean
-        get() = config.getBool("app", "route_audio_to_bluetooth_if_available", true)
+        get() = config.getBool("app", "route_audio_to_bluetooth_if_available", false)
         set(value) {
             config.setBool("app", "route_audio_to_bluetooth_if_available", value)
         }
 
     // This won't be done if bluetooth or wired headset is used
     var routeAudioToSpeakerWhenVideoIsEnabled: Boolean
-        get() = config.getBool("app", "route_audio_to_speaker_when_video_enabled", true)
+        get() = config.getBool("app", "route_audio_to_speaker_when_video_enabled", false)
         set(value) {
             config.setBool("app", "route_audio_to_speaker_when_video_enabled", value)
         }

+ 6 - 7
android_host/src/main/common/java/com/wdkl/ncs/host/sip/core/LinCoreService.java

@@ -37,7 +37,6 @@ import org.linphone.core.CoreListenerStub;
 import org.linphone.core.Factory;
 import org.linphone.core.tools.Log;
 import org.linphone.core.tools.compatibility.DeviceUtils;
-import org.linphone.core.tools.service.CoreManager;
 
 /**
  * This service is used to monitor activities lifecycle and detect when app is in background/foreground.
@@ -108,7 +107,7 @@ public class LinCoreService extends Service {
             }
         };
 
-        if (CoreManager.isReady()) {
+        /*if (CoreManager.isReady()) {
             Core core = CoreManager.instance().getCore();
             if (core != null) {
                 Log.i("[Core Service] Core Manager found, adding our listener");
@@ -116,17 +115,17 @@ public class LinCoreService extends Service {
                 if (core.getCallsNb() > 0) {
                     Log.w("[Core Service] Service started while at least one call active !");
                     startForeground();
-                    /*Call call = core.getCurrentCall();
+                    Call call = core.getCurrentCall();
                     if (call != null) {
                         if (call.getDir() == Call.Dir.Incoming && call.getState() == Call.State.IncomingReceived && core.isVibrationOnIncomingCallEnabled()) {
                             vibrate();
                         }
                     } else {
                         Log.w("[Core Service] Couldn't find current call...");
-                    }*/
+                    }
                 }
             }
-        }
+        }*/
 
         Log.i("[Core Service] Created");
     }
@@ -148,13 +147,13 @@ public class LinCoreService extends Service {
     @Override
     public synchronized void onDestroy() {
         Log.i("[Core Service] Stopping");
-        if (CoreManager.isReady()) {
+        /*if (CoreManager.isReady()) {
             Core core = CoreManager.instance().getCore();
             if (core != null) {
                 Log.i("[Core Service] Core Manager found, removing our listener");
                 core.removeListener(mListener);
             }
-        }
+        }*/
 
         super.onDestroy();
     }

+ 18 - 11
android_host/src/main/common/java/com/wdkl/ncs/host/sip/core/LinphoneManager.kt

@@ -2,8 +2,7 @@ package com.wdkl.ncs.host.sip.core
 
 import android.annotation.SuppressLint
 import android.content.Context
-import android.os.Handler
-import android.os.Looper
+import android.os.Build
 import android.telephony.PhoneStateListener
 import android.telephony.TelephonyManager
 import android.util.Log
@@ -121,7 +120,9 @@ class LinphoneManager private constructor(private val context: Context) {
                     }
                 }*/
 
-                Call.State.Connected -> phoneCallback?.callConnected(call)
+                Call.State.Connected -> {
+                    phoneCallback?.callConnected(call)
+                }
 
                 Call.State.StreamsRunning -> {
                     Log.i(TAG, "StreamsRunning...")
@@ -180,8 +181,7 @@ class LinphoneManager private constructor(private val context: Context) {
 
             initLinphone()
 
-            val telephonyManager =
-                context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+            val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
             Log.i(TAG, "[Context] Registering phone state listener")
             telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)
         }
@@ -192,8 +192,7 @@ class LinphoneManager private constructor(private val context: Context) {
      */
     fun stop() {
         coreIsStart = false
-        val telephonyManager =
-            context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+        val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
 
         Log.i(TAG, "[Context] Unregistering phone state listener")
         telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
@@ -352,14 +351,22 @@ class LinphoneManager private constructor(private val context: Context) {
 
     /**
      * 扬声器或听筒
-     * @param SpeakerEnabled Boolean
+     * @param speakerEnabled Boolean
      */
-    fun enableSpeaker(SpeakerEnabled: Boolean) {
-        if (SpeakerEnabled) {
+    fun enableSpeaker(speakerEnabled: Boolean) {
+        Log.e(TAG, "audio enable speaker: $speakerEnabled")
+        if (speakerEnabled) {
             AudioRouteUtils.routeAudioToSpeaker(core)
         } else {
-            AudioRouteUtils.routeAudioToEarpiece(core)
+            if ("A01".equals(Build.MODEL)) {
+                //耳机模式
+                AudioRouteUtils.routeAudioToHeadset(core)
+            } else {
+                AudioRouteUtils.routeAudioToEarpiece(core)
+            }
         }
+
+        Log.e(TAG, "input device: " + core.defaultInputAudioDevice.type + ", output device: " + core.defaultOutputAudioDevice.type)
     }
 
 

+ 123 - 88
android_host/src/main/common/java/com/wdkl/ncs/host/util/AudioRouteUtils.kt

@@ -1,132 +1,167 @@
-/*
- * Copyright (c) 2010-2021 Belledonne Communications SARL.
- *
- * This file is part of linphone-android
- * (see https://www.linphone.org).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
 package com.wdkl.ncs.host.util
 
-
+import android.util.Log
 import org.linphone.core.AudioDevice
 import org.linphone.core.Call
 import org.linphone.core.Core
-import org.linphone.core.tools.Log
 
 class AudioRouteUtils {
     companion object {
-        fun routeAudioToEarpiece(core: Core, call: Call? = null) {
-            if (core.callsNb == 0) {
-                Log.e("[Audio Route Helper] No call found, aborting earpiece audio route change")
-                return
-            }
-            val currentCall = call ?: core.currentCall ?: core.calls[0]
+        val TAG = "AudioRoute"
 
-            for (audioDevice in core.audioDevices) {
-                if (audioDevice.type == AudioDevice.Type.Earpiece) {
-                    Log.i("[Audio Route Helper] Found earpiece audio device [${audioDevice.deviceName}], routing audio to it")
-                    currentCall.outputAudioDevice = audioDevice
-                    return
-                }
+        private fun applyAudioRouteChange(
+            core: Core,
+            call: Call?,
+            types: List<AudioDevice.Type>,
+            output: Boolean = true
+        ) {
+            val currentCall = if (core.callsNb > 0) {
+                call ?: core.currentCall ?: core.calls[0]
+            } else {
+                Log.w(TAG, "[Audio Route Helper] No call found, setting audio route on Core")
+                null
             }
-            Log.e("[Audio Route Helper] Couldn't find earpiece audio device")
-        }
-
-        fun routeAudioToSpeaker(core: Core, call: Call? = null) {
-            if (core.callsNb == 0) {
-                Log.e("[Audio Route Helper] No call found, aborting speaker audio route change")
-                return
+            val conference = core.conference
+            val capability = if (output)
+                AudioDevice.Capabilities.CapabilityPlay
+            else
+                AudioDevice.Capabilities.CapabilityRecord
+            val preferredDriver = if (output) {
+                core.defaultOutputAudioDevice.driverName
+            } else {
+                core.defaultInputAudioDevice.driverName
             }
-            val currentCall = call ?: core.currentCall ?: core.calls[0]
 
-            for (audioDevice in core.audioDevices) {
-                if (audioDevice.type == AudioDevice.Type.Speaker) {
-                    Log.i("[Audio Route Helper] Found speaker audio device [${audioDevice.deviceName}], routing audio to it")
-                    currentCall.outputAudioDevice = audioDevice
-                    return
+            val extendedAudioDevices = core.extendedAudioDevices
+            Log.i(TAG,"[Audio Route Helper] Looking for an ${if (output) "output" else "input"} audio device with capability [$capability], driver name [$preferredDriver] and type [$types] in extended audio devices list (size ${extendedAudioDevices.size})")
+            val foundAudioDevice = extendedAudioDevices.find {
+                it.driverName == preferredDriver && types.contains(it.type) && it.hasCapability(capability)
+            }
+            val audioDevice = if (foundAudioDevice == null) {
+                Log.w(TAG,"[Audio Route Helper] Failed to find an audio device with capability [$capability], driver name [$preferredDriver] and type [$types]")
+                extendedAudioDevices.find {
+                    types.contains(it.type) && it.hasCapability(capability)
                 }
+            } else {
+                foundAudioDevice
             }
-            Log.e("[Audio Route Helper] Couldn't find speaker audio device")
-        }
 
-        fun routeAudioToBluetooth(core: Core, call: Call? = null) {
-            if (core.callsNb == 0) {
-                Log.e("[Audio Route Helper] No call found, aborting bluetooth audio route change")
+            if (audioDevice == null) {
+                Log.e(TAG,"[Audio Route Helper] Couldn't find audio device with capability [$capability] and type [$types]")
+                for (device in extendedAudioDevices) {
+                    // TODO: switch to debug?
+                    Log.i(TAG,"[Audio Route Helper] Extended audio device: [${device.deviceName} (${device.driverName}) ${device.type} / ${device.capabilities}]")
+                }
                 return
             }
-            val currentCall = call ?: core.currentCall ?: core.calls[0]
+            if (conference != null && conference.isIn) {
+                Log.i(TAG,"[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], routing conference audio to it")
+                if (output) conference.outputAudioDevice = audioDevice
+                else conference.inputAudioDevice = audioDevice
+            } else if (currentCall != null) {
+                Log.i(TAG,"[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], routing call audio to it")
+                if (output) currentCall.outputAudioDevice = audioDevice
+                else currentCall.inputAudioDevice = audioDevice
+            } else {
+                Log.i(TAG,"[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], changing core default audio device")
+                if (output) core.outputAudioDevice = audioDevice
+                else core.inputAudioDevice = audioDevice
+            }
+        }
 
-            for (audioDevice in core.audioDevices) {
-                if (audioDevice.type == AudioDevice.Type.Bluetooth) {
-                    if (audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
-                        Log.i("[Audio Route Helper] Found bluetooth audio device [${audioDevice.deviceName}], routing audio to it")
-                        currentCall.outputAudioDevice = audioDevice
-                        return
+        private fun changeCaptureDeviceToMatchAudioRoute(core: Core, call: Call?, types: List<AudioDevice.Type>) {
+            when (types.first()) {
+                AudioDevice.Type.Bluetooth -> {
+                    if (isBluetoothAudioRecorderAvailable(core)) {
+                        Log.i(TAG,"[Audio Route Helper] Bluetooth device is able to record audio, also change input audio device")
+                        applyAudioRouteChange(core, call, arrayListOf(AudioDevice.Type.Bluetooth), false)
+                    }
+                }
+                AudioDevice.Type.Headset, AudioDevice.Type.Headphones -> {
+                    if (isHeadsetAudioRecorderAvailable(core)) {
+                        Log.i(TAG,"[Audio Route Helper] Headphones/Headset device is able to record audio, also change input audio device")
+                        applyAudioRouteChange(core, call, (arrayListOf(AudioDevice.Type.Headphones, AudioDevice.Type.Headset)), false)
                     }
                 }
+                AudioDevice.Type.Earpiece, AudioDevice.Type.Speaker -> {
+                    Log.i(TAG,"[Audio Route Helper] Audio route requested to Earpiece or Speaker, setting input to Microphone")
+                    applyAudioRouteChange(core, call, (arrayListOf(AudioDevice.Type.Microphone)), false)
+                }
+                else -> {
+                    Log.w(TAG,"[Audio Route Helper] Unexpected audio device type: ${types.first()}")
+                }
             }
-            Log.e("[Audio Route Helper] Couldn't find bluetooth audio device")
         }
 
-        fun routeAudioToHeadset(core: Core, call: Call? = null) {
-            if (core.callsNb == 0) {
-                Log.e("[Audio Route Helper] No call found, aborting headset audio route change")
-                return
-            }
-            val currentCall = call ?: core.currentCall ?: core.calls[0]
+        private fun routeAudioTo(
+            core: Core,
+            call: Call?,
+            types: List<AudioDevice.Type>,
+            skipTelecom: Boolean = false
+        ) {
+            val currentCall = call ?: core.currentCall ?: core.calls.firstOrNull()
 
-            for (audioDevice in core.audioDevices) {
-                if (audioDevice.type == AudioDevice.Type.Headphones || audioDevice.type == AudioDevice.Type.Headset) {
-                    if (audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
-                        Log.i("[Audio Route Helper] Found headset audio device [${audioDevice.deviceName}], routing audio to it")
-                        currentCall.outputAudioDevice = audioDevice
-                        return
-                    }
+                if (currentCall != null) {
+                    Log.i(TAG,"[Audio Route Helper] Telecom Helper & matching connection found, dispatching audio route change through it")
+                    // We will be called here again by NativeCallWrapper.onCallAudioStateChanged()
+                    // but this time with skipTelecom = true
+                    //if (!Compatibility.changeAudioRouteForTelecomManager(connection, route)) {
+                        Log.w(TAG,"[Audio Route Helper] Connection is already using this route internally, make the change!")
+                        applyAudioRouteChange(core, currentCall, types)
+                        changeCaptureDeviceToMatchAudioRoute(core, currentCall, types)
+                    //}
                 }
-            }
-            Log.e("[Audio Route Helper] Couldn't find headset audio device")
+
         }
 
-        fun isBluetoothAudioRouteCurrentlyUsed(core: Core, call: Call? = null): Boolean {
-            if (core.callsNb == 0) {
-                Log.w("[Audio Route Helper] No call found, so bluetooth audio route isn't used")
-                return false
-            }
-            val currentCall = call ?: core.currentCall ?: core.calls[0]
+        fun routeAudioToEarpiece(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
+            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Earpiece), skipTelecom)
+        }
+
+        fun routeAudioToSpeaker(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
+            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Speaker), skipTelecom)
+        }
+
+        fun routeAudioToBluetooth(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
+            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Bluetooth), skipTelecom)
+        }
 
-            val audioDevice = currentCall.outputAudioDevice
-            Log.i("[Audio Route Helper] Audio device currently in use is [${audioDevice?.deviceName}]")
-            return audioDevice?.type == AudioDevice.Type.Bluetooth
+        fun routeAudioToHeadset(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
+            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Headphones, AudioDevice.Type.Headset), skipTelecom)
         }
 
+
+
         fun isBluetoothAudioRouteAvailable(core: Core): Boolean {
             for (audioDevice in core.audioDevices) {
                 if (audioDevice.type == AudioDevice.Type.Bluetooth &&
-                        audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
-                    Log.i("[Audio Route Helper] Found bluetooth audio device [${audioDevice.deviceName}]")
+                    audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)
+                ) {
+                    Log.i(TAG,"[Audio Route Helper] Found bluetooth audio device [${audioDevice.deviceName} (${audioDevice.driverName})]")
+                    return true
+                }
+            }
+            return false
+        }
+
+        private fun isBluetoothAudioRecorderAvailable(core: Core): Boolean {
+            for (audioDevice in core.audioDevices) {
+                if (audioDevice.type == AudioDevice.Type.Bluetooth &&
+                    audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityRecord)
+                ) {
+                    Log.i(TAG,"[Audio Route Helper] Found bluetooth audio recorder [${audioDevice.deviceName} (${audioDevice.driverName})]")
                     return true
                 }
             }
             return false
         }
 
-        fun isHeadsetAudioRouteAvailable(core: Core): Boolean {
+        private fun isHeadsetAudioRecorderAvailable(core: Core): Boolean {
             for (audioDevice in core.audioDevices) {
                 if ((audioDevice.type == AudioDevice.Type.Headset || audioDevice.type == AudioDevice.Type.Headphones) &&
-                        audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
-                    Log.i("[Audio Route Helper] Found headset/headphones audio device [${audioDevice.deviceName}]")
+                    audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityRecord)
+                ) {
+                    Log.i(TAG,"[Audio Route Helper] Found headset/headphones audio recorder [${audioDevice.deviceName} (${audioDevice.driverName})]")
                     return true
                 }
             }

+ 0 - 171
android_host/src/main/common/java/com/wdkl/ncs/host/util/AudioRouteUtils.kt.bak

@@ -1,171 +0,0 @@
-package com.wdkl.ncs.host.util
-
-import android.util.Log
-import org.linphone.core.AudioDevice
-import org.linphone.core.Call
-import org.linphone.core.Core
-
-class AudioRouteUtils {
-    companion object {
-        val TAG = "AudioRoute"
-
-        private fun applyAudioRouteChange(
-            core: Core,
-            call: Call?,
-            types: List<AudioDevice.Type>,
-            output: Boolean = true
-        ) {
-            val currentCall = if (core.callsNb > 0) {
-                call ?: core.currentCall ?: core.calls[0]
-            } else {
-                Log.w(TAG, "[Audio Route Helper] No call found, setting audio route on Core")
-                null
-            }
-            val conference = core.conference
-            val capability = if (output)
-                AudioDevice.Capabilities.CapabilityPlay
-            else
-                AudioDevice.Capabilities.CapabilityRecord
-            val preferredDriver = if (output) {
-                core.defaultOutputAudioDevice?.driverName
-            } else {
-                core.defaultInputAudioDevice?.driverName
-            }
-
-            val extendedAudioDevices = core.extendedAudioDevices
-            Log.i(TAG,"[Audio Route Helper] Looking for an ${if (output) "output" else "input"} audio device with capability [$capability], driver name [$preferredDriver] and type [$types] in extended audio devices list (size ${extendedAudioDevices.size})")
-            val foundAudioDevice = extendedAudioDevices.find {
-                it.driverName == preferredDriver && types.contains(it.type) && it.hasCapability(capability)
-            }
-            val audioDevice = if (foundAudioDevice == null) {
-                Log.w(TAG,"[Audio Route Helper] Failed to find an audio device with capability [$capability], driver name [$preferredDriver] and type [$types]")
-                extendedAudioDevices.find {
-                    types.contains(it.type) && it.hasCapability(capability)
-                }
-            } else {
-                foundAudioDevice
-            }
-
-            if (audioDevice == null) {
-                Log.e(TAG,"[Audio Route Helper] Couldn't find audio device with capability [$capability] and type [$types]")
-                for (device in extendedAudioDevices) {
-                    // TODO: switch to debug?
-                    Log.i(TAG,"[Audio Route Helper] Extended audio device: [${device.deviceName} (${device.driverName}) ${device.type} / ${device.capabilities}]")
-                }
-                return
-            }
-            if (conference != null && conference.isIn) {
-                Log.i(TAG,"[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], routing conference audio to it")
-                if (output) conference.outputAudioDevice = audioDevice
-                else conference.inputAudioDevice = audioDevice
-            } else if (currentCall != null) {
-                Log.i(TAG,"[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], routing call audio to it")
-                if (output) currentCall.outputAudioDevice = audioDevice
-                else currentCall.inputAudioDevice = audioDevice
-            } else {
-                Log.i(TAG,"[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], changing core default audio device")
-                if (output) core.outputAudioDevice = audioDevice
-                else core.inputAudioDevice = audioDevice
-            }
-        }
-
-        private fun changeCaptureDeviceToMatchAudioRoute(core: Core, call: Call?, types: List<AudioDevice.Type>) {
-            when (types.first()) {
-                AudioDevice.Type.Bluetooth -> {
-                    if (isBluetoothAudioRecorderAvailable(core)) {
-                        Log.i(TAG,"[Audio Route Helper] Bluetooth device is able to record audio, also change input audio device")
-                        applyAudioRouteChange(core, call, arrayListOf(AudioDevice.Type.Bluetooth), false)
-                    }
-                }
-                AudioDevice.Type.Headset, AudioDevice.Type.Headphones -> {
-                    if (isHeadsetAudioRecorderAvailable(core)) {
-                        Log.i(TAG,"[Audio Route Helper] Headphones/Headset device is able to record audio, also change input audio device")
-                        applyAudioRouteChange(core, call, (arrayListOf(AudioDevice.Type.Headphones, AudioDevice.Type.Headset)), false)
-                    }
-                }
-                AudioDevice.Type.Earpiece, AudioDevice.Type.Speaker -> {
-                    Log.i(TAG,"[Audio Route Helper] Audio route requested to Earpiece or Speaker, setting input to Microphone")
-                    applyAudioRouteChange(core, call, (arrayListOf(AudioDevice.Type.Microphone)), false)
-                }
-                else -> {
-                    Log.w(TAG,"[Audio Route Helper] Unexpected audio device type: ${types.first()}")
-                }
-            }
-        }
-
-        private fun routeAudioTo(
-            core: Core,
-            call: Call?,
-            types: List<AudioDevice.Type>,
-            skipTelecom: Boolean = false
-        ) {
-            val currentCall = call ?: core.currentCall ?: core.calls.firstOrNull()
-
-                if (currentCall != null) {
-                    Log.i(TAG,"[Audio Route Helper] Telecom Helper & matching connection found, dispatching audio route change through it")
-                    // We will be called here again by NativeCallWrapper.onCallAudioStateChanged()
-                    // but this time with skipTelecom = true
-                    //if (!Compatibility.changeAudioRouteForTelecomManager(connection, route)) {
-                        Log.w(TAG,"[Audio Route Helper] Connection is already using this route internally, make the change!")
-                        applyAudioRouteChange(core, currentCall, types)
-                        changeCaptureDeviceToMatchAudioRoute(core, currentCall, types)
-                    //}
-                }
-
-        }
-
-        fun routeAudioToEarpiece(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
-            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Earpiece), skipTelecom)
-        }
-
-        fun routeAudioToSpeaker(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
-            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Speaker), skipTelecom)
-        }
-
-        fun routeAudioToBluetooth(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
-            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Bluetooth), skipTelecom)
-        }
-
-        fun routeAudioToHeadset(core: Core, call: Call? = null, skipTelecom: Boolean = false) {
-            routeAudioTo(core, call, arrayListOf(AudioDevice.Type.Headphones, AudioDevice.Type.Headset), skipTelecom)
-        }
-
-
-
-        fun isBluetoothAudioRouteAvailable(core: Core): Boolean {
-            for (audioDevice in core.audioDevices) {
-                if (audioDevice.type == AudioDevice.Type.Bluetooth &&
-                    audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)
-                ) {
-                    Log.i(TAG,"[Audio Route Helper] Found bluetooth audio device [${audioDevice.deviceName} (${audioDevice.driverName})]")
-                    return true
-                }
-            }
-            return false
-        }
-
-        private fun isBluetoothAudioRecorderAvailable(core: Core): Boolean {
-            for (audioDevice in core.audioDevices) {
-                if (audioDevice.type == AudioDevice.Type.Bluetooth &&
-                    audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityRecord)
-                ) {
-                    Log.i(TAG,"[Audio Route Helper] Found bluetooth audio recorder [${audioDevice.deviceName} (${audioDevice.driverName})]")
-                    return true
-                }
-            }
-            return false
-        }
-
-        private fun isHeadsetAudioRecorderAvailable(core: Core): Boolean {
-            for (audioDevice in core.audioDevices) {
-                if ((audioDevice.type == AudioDevice.Type.Headset || audioDevice.type == AudioDevice.Type.Headphones) &&
-                    audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityRecord)
-                ) {
-                    Log.i(TAG,"[Audio Route Helper] Found headset/headphones audio recorder [${audioDevice.deviceName} (${audioDevice.driverName})]")
-                    return true
-                }
-            }
-            return false
-        }
-    }
-}

+ 138 - 0
android_host/src/main/common/java/com/wdkl/ncs/host/util/AudioRouteUtils.kt.bak2

@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2010-2021 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-android
+ * (see https://www.linphone.org).
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.wdkl.ncs.host.util
+
+
+import org.linphone.core.AudioDevice
+import org.linphone.core.Call
+import org.linphone.core.Core
+import org.linphone.core.tools.Log
+
+class AudioRouteUtils {
+    companion object {
+        fun routeAudioToEarpiece(core: Core, call: Call? = null) {
+            if (core.callsNb == 0) {
+                Log.e("[Audio Route Helper] No call found, aborting earpiece audio route change")
+                return
+            }
+            val currentCall = call ?: core.currentCall ?: core.calls[0]
+
+            for (audioDevice in core.audioDevices) {
+                if (audioDevice.type == AudioDevice.Type.Earpiece) {
+                    Log.i("[Audio Route Helper] Found earpiece audio device [${audioDevice.deviceName}], routing audio to it")
+                    currentCall.outputAudioDevice = audioDevice
+                    return
+                }
+            }
+            Log.e("[Audio Route Helper] Couldn't find earpiece audio device")
+        }
+
+        fun routeAudioToSpeaker(core: Core, call: Call? = null) {
+            if (core.callsNb == 0) {
+                Log.e("[Audio Route Helper] No call found, aborting speaker audio route change")
+                return
+            }
+            val currentCall = call ?: core.currentCall ?: core.calls[0]
+
+            for (audioDevice in core.audioDevices) {
+                Log.e("[speaker audio device] found: ${audioDevice.type}, name: ${audioDevice.deviceName}, capability: ${audioDevice.capabilities}")
+                if (audioDevice.type == AudioDevice.Type.Speaker) {
+                    Log.i("[Audio Route Helper] Found speaker audio device [${audioDevice.deviceName}], routing audio to it")
+                    currentCall.outputAudioDevice = audioDevice
+                    return
+                }
+            }
+            Log.e("[Audio Route Helper] Couldn't find speaker audio device")
+        }
+
+        fun routeAudioToBluetooth(core: Core, call: Call? = null) {
+            if (core.callsNb == 0) {
+                Log.e("[Audio Route Helper] No call found, aborting bluetooth audio route change")
+                return
+            }
+            val currentCall = call ?: core.currentCall ?: core.calls[0]
+
+            for (audioDevice in core.audioDevices) {
+                if (audioDevice.type == AudioDevice.Type.Bluetooth) {
+                    if (audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
+                        Log.i("[Audio Route Helper] Found bluetooth audio device [${audioDevice.deviceName}], routing audio to it")
+                        currentCall.outputAudioDevice = audioDevice
+                        return
+                    }
+                }
+            }
+            Log.e("[Audio Route Helper] Couldn't find bluetooth audio device")
+        }
+
+        fun routeAudioToHeadset(core: Core, call: Call? = null) {
+            if (core.callsNb == 0) {
+                Log.e("[Audio Route Helper] No call found, aborting headset audio route change")
+                return
+            }
+            val currentCall = call ?: core.currentCall ?: core.calls[0]
+
+            for (audioDevice in core.audioDevices) {
+                Log.e("[headset audio device] found: ${audioDevice.type}, name: ${audioDevice.deviceName}, capability: ${audioDevice.capabilities}")
+                if (audioDevice.type == AudioDevice.Type.Headphones || audioDevice.type == AudioDevice.Type.Headset) {
+                    if (audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
+                        Log.i("[Audio Route Helper] Found headset audio device [${audioDevice.deviceName}], routing audio to it")
+                        currentCall.outputAudioDevice = audioDevice
+                        return
+                    }
+                }
+            }
+            Log.e("[Audio Route Helper] Couldn't find headset audio device")
+        }
+
+        fun isBluetoothAudioRouteCurrentlyUsed(core: Core, call: Call? = null): Boolean {
+            if (core.callsNb == 0) {
+                Log.w("[Audio Route Helper] No call found, so bluetooth audio route isn't used")
+                return false
+            }
+            val currentCall = call ?: core.currentCall ?: core.calls[0]
+
+            val audioDevice = currentCall.outputAudioDevice
+            Log.i("[Audio Route Helper] Audio device currently in use is [${audioDevice?.deviceName}]")
+            return audioDevice?.type == AudioDevice.Type.Bluetooth
+        }
+
+        fun isBluetoothAudioRouteAvailable(core: Core): Boolean {
+            for (audioDevice in core.audioDevices) {
+                if (audioDevice.type == AudioDevice.Type.Bluetooth &&
+                        audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
+                    Log.i("[Audio Route Helper] Found bluetooth audio device [${audioDevice.deviceName}]")
+                    return true
+                }
+            }
+            return false
+        }
+
+        fun isHeadsetAudioRouteAvailable(core: Core): Boolean {
+            for (audioDevice in core.audioDevices) {
+                if ((audioDevice.type == AudioDevice.Type.Headset || audioDevice.type == AudioDevice.Type.Headphones) &&
+                        audioDevice.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) {
+                    Log.i("[Audio Route Helper] Found headset/headphones audio device [${audioDevice.deviceName}]")
+                    return true
+                }
+            }
+            return false
+        }
+    }
+}

+ 2 - 1
android_host/src/main/h10_wke_1h/AndroidManifest.xml

@@ -52,7 +52,8 @@
     <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name= "android.manifest.permission.INTERNAL_SYSTEM_WINDOW"/>
+    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.manifest.permission.INTERNAL_SYSTEM_WINDOW"/>
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

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

@@ -13,6 +13,8 @@ import com.wdkl.ncs.android.component.nursehome.databinding.UpdateLayBinding
 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.AppUpdateHelper
+import com.wdkl.ncs.android.component.nursehome.util.AppUpdateHelper.FILE_APK_NAME
+import com.wdkl.ncs.android.component.nursehome.util.AppUpdateHelper.FILE_APK_PATH
 import com.wdkl.ncs.android.component.nursehome.util.HttpHelper
 import com.wdkl.ncs.android.component.nursehome.util.LocaleMangerUtils
 import com.wdkl.ncs.android.component.nursehome.util.StatusBarHelper
@@ -125,6 +127,12 @@ class AppUpdateActivity :BaseActivity<AppUpdatePresenter, UpdateLayBinding>(), A
         } else if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F")
             || Build.MODEL.toLowerCase(Locale.ROOT) == "kt8001_2c" || "m3520b_bnkj_zx".equals(Build.MODEL)) {
             installAppKaer()
+        } else if ("A01".equals(Build.MODEL)) {
+            if (apiConnect) {
+                manager?.silentInstallApk("$FILE_APK_PATH/$FILE_APK_NAME", true)
+            } else {
+                installAppKaer()
+            }
         } else {
             AppUpdateHelper.installAPK(this)
             finish()
@@ -170,6 +178,12 @@ class AppUpdateActivity :BaseActivity<AppUpdatePresenter, UpdateLayBinding>(), A
         if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
             StatusBarHelper.toggleStatusBar(activity, true)
         }
+
+        if ("A01".equals(Build.MODEL)) {
+            if (apiConnect) {
+                manager?.hideNavBar(false)
+            }
+        }
     }
 
     override fun destory() {

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

@@ -29,7 +29,6 @@ import com.enation.javashop.net.engine.plugin.permission.RxPermissions
 import com.google.common.base.Strings
 import com.google.gson.Gson
 import com.serenegiant.helper.ScreenRecordHelper
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
 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
@@ -43,6 +42,7 @@ import com.wdkl.ncs.android.component.nursehome.window.IncidentWindow
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.common.SipStatus
 import com.wdkl.ncs.android.middleware.entity.CallingItem
@@ -123,7 +123,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
     var receiver :TimeReceiver? = null
     var batteryBroadcastReceiver: BatteryBroadcastReceiver? = null
 
-    //private var mAccountCreator: AccountCreator? = null
     private var linphoneManager: LinphoneManager? = null
 
     //当前选中的button id
@@ -196,11 +195,14 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
         if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
             StatusBarHelper.toggleStatusBar(activity, true)
-            //permissionGranted()
-        } /*else {
-            //申请权限
-            requestAppPermissions()
-        }*/
+        }
+
+        if ("A01".equals(Build.MODEL)) {
+            //大朝华15.6寸rk平台主机
+            if (apiConnect) {
+                manager?.hideNavBar(false)
+            }
+        }
 
         home_radio_bt.isChecked = true
 
@@ -213,15 +215,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
     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)
-            }*/
-
             linphoneManager = LinphoneManager.getInstance(BaseApplication.appContext)
             linphoneManager?.start()
             linphoneManager?.phoneCallback = object : PhoneCallback() {
@@ -289,24 +282,31 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         //显示设备信息
         Constants.mac = NetHelper.getInstance().macAddress
         Constants.imei = NetHelper.getInstance().imei
-        Log.e(TAG,"mac: "+ Constants.mac + ", imei: " + Constants.imei)
-        home_view_local_mac.text = "MAC:"+ Constants.mac
-        home_view_local_imei.text = "IMEI: " + Constants.imei
-        //home_view_device_model.text = "rom: " + Build.MODEL
 
-        if ("YUNPAI_H6".equals(Build.MODEL) || "YUNPAI_H6B".equals(Build.MODEL) || "m3520b_bnkj_zx".equals(Build.MODEL) || "A01".equals(Build.MODEL)) {
+        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 if (Build.MODEL.toLowerCase(Locale.ROOT) == "kt8001_2c") {
             Constants.imei = NetHelper.getInstance().imeI2
-            home_view_local_imei.text = "IMEI: " + Constants.imei
             Constants.device_serial_id = Constants.imei
+        } else if ("A01".equals(Build.MODEL)) {
+            if (apiConnect) {
+                Constants.imei = manager?.serial
+                Constants.mac = manager?.ethMacAddress
+                Constants.device_serial_id = Constants.imei
+            } else {
+                Constants.device_serial_id = Constants.imei
+            }
         } else {
             Constants.device_serial_id = Constants.mac
         }
 
+        home_view_local_mac.text = "MAC:"+ Constants.mac
+        home_view_local_imei.text = "IMEI: " + Constants.imei
+        Log.e(TAG,"mac: "+ Constants.mac + ", imei: " + Constants.imei)
+
         Thread{
             //val logoBitmap = BitmapFactory.decodeResource(resources, R.mipmap.erlogo)
             var builder = StringBuilder()
@@ -340,7 +340,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             }
         }.start()
 
-        val macAddr = NetHelper.getInstance().macAddress
+        //val macAddr = NetHelper.getInstance().macAddress
         val ipAddr = NetHelper.getInstance().localIP
         val buildUrl = UrlManager.build()
         serverIp =  buildUrl.buyer.substringAfterLast("//").substringBefore(":")
@@ -350,7 +350,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                 + "\r\nSDK: " + Build.VERSION.SDK_INT + "_" + Build.MODEL)
 
         home_view_local_ip.text = "IP: " + ipAddr + ", server: " + serverIp
-        home_view_local_mac.text = "MAC: " + macAddr
+        //home_view_local_mac.text = "MAC: " + macAddr
         home_view_app_version.text = str
 
         //presenter.loadDeviceData(Constants.device_serial_id!!)
@@ -587,23 +587,46 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
     }
 
     private fun requestAppPermissions(){
-        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所有权限")
-                permissionGranted()
-            }else{
-                showMessage(R.string.permission_grant_tips)
-                requestAppPermissions()
-            }
-        }.joinManager(disposableManager)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            Observable.just("").compose(
+                RxPermissions(this).ensure(
+                    Manifest.permission.CAMERA,
+                    Manifest.permission.READ_EXTERNAL_STORAGE,
+                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                    Manifest.permission.MANAGE_EXTERNAL_STORAGE,
+                    Manifest.permission.ACCESS_WIFI_STATE,
+                    Manifest.permission.RECORD_AUDIO,
+                    Manifest.permission.READ_PHONE_STATE
+                )
+            ).subscribe {
+                if (it) {
+                    Log.e(TAG, "拿到APP所有权限")
+                    permissionGranted()
+                } else {
+                    showMessage(R.string.permission_grant_tips)
+                    requestAppPermissions()
+                }
+            }.joinManager(disposableManager)
+        } else {
+            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所有权限")
+                    permissionGranted()
+                } else {
+                    showMessage(R.string.permission_grant_tips)
+                    requestAppPermissions()
+                }
+            }.joinManager(disposableManager)
+        }
     }
 
     private fun gotoMainHome() {
@@ -670,9 +693,15 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
 
         if (Settings.canDrawOverlays(this) && Settings.System.canWrite(this)) {
-            if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL) || "A01".equals(Build.MODEL)) {
+            if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
                 StatusBarHelper.toggleStatusBar(activity, false)
             }
+
+            if ("A01".equals(Build.MODEL)) {
+                if (apiConnect) {
+                    manager?.hideNavBar(true)
+                }
+            }
         }
 
         updatePower()
@@ -701,6 +730,12 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
                 StatusBarHelper.toggleStatusBar(activity, false)
             }
+
+            if ("A01".equals(Build.MODEL)) {
+                if (apiConnect) {
+                    manager?.hideNavBar(true)
+                }
+            }
         }
     }
 
@@ -710,6 +745,12 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
             StatusBarHelper.toggleStatusBar(activity, true)
         }
+
+        if ("A01".equals(Build.MODEL)) {
+            if (apiConnect) {
+                manager?.hideNavBar(false)
+            }
+        }
     }
 
     /**
@@ -999,6 +1040,11 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
                 StatusBarHelper.toggleStatusBar(activity, true)
             }
+            if ("A01".equals(Build.MODEL)) {
+                if (apiConnect) {
+                    manager?.hideNavBar(false)
+                }
+            }
             AppUpdateHelper.restartApp(activity)
         }
 
@@ -1017,8 +1063,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
         btn_set_debug.setOnClickListener {
             PasswordDialogHelper.showPasswordDialog(activity) {
-                if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F")) {
-                    if (AppUtil.openNetwrokDebug()) {
+                if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F")
+                    || "A01".equals(Build.MODEL)) {
+                    if (AppUtil.openNetworkDebug()) {
                         showMessage(R.string.enable_debug)
                     }
                 } else {
@@ -1042,6 +1089,13 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
             StatusBarHelper.toggleStatusBar(activity, true)
         }
+
+        if ("A01".equals(Build.MODEL)) {
+            if (apiConnect) {
+                manager?.hideNavBar(false)
+            }
+        }
+
         SpeechUtil.getInstance().release()
         if (executor != null) {
             executor!!.shutdownNow()
@@ -1718,10 +1772,10 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                 Log.e(TAG,"手柄放下 ")
                 Constants.hookOn = true
                 EventBus.getDefault().post(MessageEvent(true, Constants.EVENT_TOGGLE_SPEAKER))
-                if (System.currentTimeMillis() - hookonTime > 2000) {
-                    VoiceManagerUtil.switchAudioMode(activity, true)
-                    VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+                VoiceManagerUtil.switchAudioMode(activity, true)
+                VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
 
+                if (System.currentTimeMillis() - hookonTime > 2000) {
                     if (Constants.CALL_STATE == Constants.CALL_OUTGOING) {
                         //呼出取消
                         Constants.CALL_STATE = Constants.CALL_STANDBY
@@ -1739,10 +1793,10 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                 Log.e(TAG,"手柄拿起 ")
                 Constants.hookOn = false
                 EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_TOGGLE_SPEAKER))
-                if (System.currentTimeMillis() - hookoffTime > 2000) {
-                    VoiceManagerUtil.switchAudioMode(activity, false)
-                    VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+                VoiceManagerUtil.switchAudioMode(activity, false)
+                VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
 
+                if (System.currentTimeMillis() - hookoffTime > 2000) {
                     if (Constants.CALL_STATE == Constants.CALL_STANDBY) {
                         //不是呼出也不是通话状态则接听电话
                         EventBus.getDefault().post(MessageEvent("hookoff", Constants.EVENT_HOOK_OFF))
@@ -1763,11 +1817,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         if (keyCode == 135 || keyCode == 139) {
             //手柄拿起
             Constants.hookOn = false
-            EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_TOGGLE_SPEAKER))
-            if (System.currentTimeMillis() - hookoffTime > 2000) {
-                VoiceManagerUtil.switchAudioMode(activity, false)
-                VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+            VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
 
+            if (System.currentTimeMillis() - hookoffTime > 2000) {
                 if (Constants.CALL_STATE == Constants.CALL_STANDBY) {
                     //不是呼出也不是通话状态则接听电话
                     EventBus.getDefault().post(MessageEvent("hookoff", Constants.EVENT_HOOK_OFF))
@@ -1775,15 +1827,16 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                     EventBus.getDefault().post(MessageEvent("hookoff", Constants.EVENT_V_HOOK_OFF))
                 }
             }
+
+            EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_TOGGLE_SPEAKER))
+            VoiceManagerUtil.switchAudioMode(activity, false)
             hookoffTime = System.currentTimeMillis()
         } else if (keyCode == 134 || keyCode == 138) {
             //手柄放下
             Constants.hookOn = true
-            EventBus.getDefault().post(MessageEvent(true, Constants.EVENT_TOGGLE_SPEAKER))
-            if (System.currentTimeMillis() - hookonTime > 2000) {
-                VoiceManagerUtil.switchAudioMode(activity, true)
-                VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
+            VoiceManagerUtil.setCallVoice(activity, SettingConfig.getHostCallVolume(activity))
 
+            if (System.currentTimeMillis() - hookonTime > 2000) {
                 if (Constants.CALL_STATE == Constants.CALL_OUTGOING) {
                     //呼出取消
                     Constants.CALL_STATE = Constants.CALL_STANDBY
@@ -1795,6 +1848,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                     EventBus.getDefault().post(MessageEvent("handoff", Constants.EVENT_END_CALL))
                 }
             }
+
+            EventBus.getDefault().post(MessageEvent(true, Constants.EVENT_TOGGLE_SPEAKER))
+            VoiceManagerUtil.switchAudioMode(activity, true)
             hookonTime = System.currentTimeMillis()
         }
         return super.onKeyDown(keyCode, event)
@@ -1808,11 +1864,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         if (value <= 15) {
             val nm = this.activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !nm.isNotificationPolicyAccessGranted) {
-//                showAlterDialog()
-
                 val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
                 startActivity(intent)
-
             } else {
                 VoiceManagerUtil.setSystemVoice(this.activity, value)
                 VoiceManagerUtil.setMusicVoice(this.activity, value)
@@ -2456,7 +2509,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         }
                     } else if (tcpModel.action == TcpAction.DeviceAction.OPEN_DEBUG) {
                         //打开调试
-                        if (AppUtil.openNetwrokDebug()) {
+                        if (AppUtil.openNetworkDebug()) {
                             showMessage(R.string.enable_debug)
                         }
                     } else if (tcpModel.action == TcpAction.DeviceAction.REBOOT) {

+ 6 - 4
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/activity/TestActivity.kt

@@ -56,7 +56,11 @@ class TestActivity : BaseActivity<DevicePresenter, TestActivityBinding>(), Devic
     }
 
     override fun destory() {
+        if (receiver != null) {
+            unregisterReceiver(receiver)
+        }
     }
+
     var receiver : TimeReceiver? = null
     /**
      * 时间变化监听
@@ -114,11 +118,9 @@ class TestActivity : BaseActivity<DevicePresenter, TestActivityBinding>(), Devic
         }
     }
     override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
-
-        if (keyCode == 135) {
+        if (keyCode == 135 || keyCode == 139) {
             EventBus.getDefault().post(MessageEvent("hook_on", Constants.EVENT_SERIAL_TEST))
-
-        } else if (keyCode == 134) {
+        } else if (keyCode == 134 || keyCode == 138) {
             //手柄放下
             EventBus.getDefault().post(MessageEvent("hook_off", Constants.EVENT_SERIAL_TEST))
         }

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

@@ -46,7 +46,7 @@ class BroadcastAdapter(var context: BroadcastFragment, val data: ArrayList<Strin
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterBroadcastBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterBroadcastBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_broadcast)
     }
 

+ 2 - 2
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/CallRecordsItemAdapter.kt

@@ -8,7 +8,6 @@ import com.alibaba.android.vlayout.LayoutHelper
 import com.alibaba.android.vlayout.layout.LinearLayoutHelper
 import com.alibaba.fastjson.JSONObject
 import com.google.common.base.Strings
-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
@@ -19,6 +18,7 @@ import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
@@ -66,7 +66,7 @@ class CallRecordsItemAdapter(val data:ArrayList<InteractionVO>) : BaseDelegateAd
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterCallRecordsItemBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterCallRecordsItemBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_call_records_item)
     }
     /**

+ 2 - 2
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/DoctorHostAdapter.kt

@@ -4,12 +4,12 @@ import android.view.ViewGroup
 import com.alibaba.android.vlayout.LayoutHelper
 import com.alibaba.android.vlayout.layout.GridLayoutHelper
 import com.alibaba.android.vlayout.layout.LinearLayoutHelper
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.databinding.AdapterDoctorHostBinding
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.then
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 import com.wdkl.ncs.android.middleware.model.vo.FrameRoomVO
 /**
@@ -63,7 +63,7 @@ class DoctorHostAdapter(val data:ArrayList<DeviceDO>) : BaseDelegateAdapter<Base
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterDoctorHostBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterDoctorHostBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_doctor_host)
     }
 

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

@@ -44,7 +44,7 @@ class FrameBedVosAdapter(val data:ArrayList<FrameBedVO>) : BaseDelegateAdapter<B
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterFrameBedVosBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterFrameBedVosBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_frame_bed_vos)
     }
     /**

+ 2 - 2
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/FrameBedVosConfinementAdapter.kt

@@ -7,12 +7,12 @@ import android.view.View
 import android.view.ViewGroup
 import com.alibaba.android.vlayout.LayoutHelper
 import com.alibaba.android.vlayout.layout.GridLayoutHelper
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.databinding.AdapterHospitalFramePartBinding
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.then
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.model.dto.NurseConfigDto
 import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO
 import com.wdkl.ncs.android.middleware.utils.StringUtil
@@ -70,7 +70,7 @@ class FrameBedVosConfinementAdapter(val data: ArrayList<FrameBedVO>) : BaseDeleg
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterHospitalFramePartBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterHospitalFramePartBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_hospital_frame_part)
     }
 

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

@@ -13,8 +13,8 @@ import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
-import com.wdkl.ncs.android.component.nursehome.BuildConfig;
 import com.wdkl.ncs.android.component.nursehome.R;
+import com.wdkl.ncs.android.middleware.BuildConfig;
 import com.wdkl.ncs.android.middleware.entity.FrameRoomBed;
 import com.wdkl.ncs.android.middleware.model.dto.NurseConfigDto;
 import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO;

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

@@ -27,7 +27,7 @@ class InpatientWardAdapter(val data:ArrayList<String>) : BaseDelegateAdapter<Bas
         return LinearLayoutHelper(0,data.size)
     }
 
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterInpatientWardBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterInpatientWardBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_inpatient_ward)
     }
 

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

@@ -58,7 +58,7 @@ class IotDeviceAdapter (val data:ArrayList<DeviceVO>) : BaseDelegateAdapter<Base
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterNbIotDeviceBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterNbIotDeviceBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_nb_iot_device)
     }
 

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

@@ -5,10 +5,10 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.led.LedItem
 import com.wdkl.ncs.android.component.nursehome.led.LedManagerUtils
+import com.wdkl.ncs.android.middleware.BuildConfig
 
 class LedItemAdapter: RecyclerView.Adapter<LedItemAdapter.ViewHolder> {
     private var data: ArrayList<LedItem>

+ 2 - 2
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/NurseMoveAdapter.kt

@@ -3,12 +3,12 @@ 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.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.databinding.AdapterMobileDeviceBinding
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.then
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.model.vo.WatchUsingVO
 
 class NurseMoveAdapter(val data:ArrayList<WatchUsingVO>) : BaseDelegateAdapter<BaseRecyclerViewHolder<AdapterMobileDeviceBinding>, WatchUsingVO>(){
@@ -59,7 +59,7 @@ class NurseMoveAdapter(val data:ArrayList<WatchUsingVO>) : BaseDelegateAdapter<B
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterMobileDeviceBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterMobileDeviceBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_mobile_device)
     }
 

+ 2 - 2
android_host/src/main/h10_wke_1h/java/com/wdkl/ncs/android/component/nursehome/adapter/OtherHostAdapter.kt

@@ -3,12 +3,12 @@ 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.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.databinding.AdapterOtherHostBinding
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.then
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
 
 /**
@@ -62,7 +62,7 @@ class OtherHostAdapter (val data:ArrayList<DeviceDO>) : BaseDelegateAdapter<Base
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterOtherHostBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterOtherHostBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_other_host)
     }
 

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

@@ -53,7 +53,7 @@ class ResponsibilityBedAdapter(val data:ArrayList<String>) : BaseDelegateAdapter
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterResponsibilityBedBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterResponsibilityBedBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_responsibility_bed)
     }
 

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

@@ -57,7 +57,7 @@ class TrusteeshipAdapter(val data:ArrayList<DeviceDO>) : BaseDelegateAdapter<Bas
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterTrusteeshipHostBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterTrusteeshipHostBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_trusteeship_host)
     }
 

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

@@ -53,7 +53,7 @@ class VisitManagementAdapter(val data:ArrayList<String>) : BaseDelegateAdapter<B
     /**
      * 创建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterDoctorHostBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterDoctorHostBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.adapter_doctor_host)
     }
 

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

@@ -10,7 +10,6 @@ import com.alibaba.android.vlayout.VirtualLayoutManager
 import com.enation.javashop.net.engine.model.NetState
 import com.google.gson.Gson
 import com.scwang.smartrefresh.layout.footer.ClassicsFooter
-import com.wdkl.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.component.nursehome.adapter.CallRecordsItemAdapter
@@ -24,6 +23,7 @@ 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.lib.vo.filter
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.entity.CallingItem
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.CallRecordsFragmentContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.CallRecordsFragmentPresenter

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

@@ -13,7 +13,6 @@ import com.alibaba.android.vlayout.VirtualLayoutManager
 import com.alibaba.fastjson.JSONObject
 import com.enation.javashop.net.engine.model.NetState
 import com.scwang.smartrefresh.layout.footer.ClassicsFooter
-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.component.nursehome.adapter.*
@@ -29,6 +28,7 @@ import com.wdkl.ncs.android.lib.utils.DisplayUtils
 import com.wdkl.ncs.android.lib.utils.debugLog
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.vo.filter
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.entity.FrameRoomBed
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.FramePartContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.FramePartPresenter

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

@@ -7,7 +7,6 @@ import android.util.Log
 import android.view.View
 import android.widget.SeekBar
 import com.google.gson.Gson
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
 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.RingPlayHelper
@@ -16,6 +15,7 @@ import com.wdkl.ncs.android.component.nursehome.util.VoiceManagerUtil
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.TimeHandle
 import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.middleware.model.bean.SettingConfiguration
 import com.wdkl.ncs.android.middleware.model.dos.InteractionDO
@@ -28,13 +28,9 @@ import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.ncs.android.middleware.utils.StringUtil
 import com.wdkl.ncs.host.sip.core.LinphoneManager
-//import com.wdkl.ncs.host.service.WdklSipService
-import com.wdkl.ncs.host.util.AudioRouteUtils
 import kotlinx.android.synthetic.main.sip_voice_call_layout.*
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
-import org.linphone.core.Core
-import org.linphone.core.MediaEncryption
 
 class SipCallFragment: BaseCallFragment() {
     private val TAG = "SipCallFragment"
@@ -50,7 +46,6 @@ class SipCallFragment: BaseCallFragment() {
     lateinit var countDownTimer: CountDownTimer
 
 
-    //private var sipCore: Core? = null
     private var linphoneManager: LinphoneManager? = null
 
     override fun getLayId(): Int {
@@ -66,19 +61,9 @@ class SipCallFragment: BaseCallFragment() {
 
         initCountDownTimer()
 
-        /*sipCore = WdklSipService.getCore()
-        if (sipCore == null) {
-            showMessage("sip core is null...")
-            callEnd(true)
-        }*/
         linphoneManager = LinphoneManager.getInstance(BaseApplication.appContext)
 
         if (!onlyAudio) {
-            //sipCore?.nativeVideoWindowId = sip_full_video_frame
-            //sipCore?.nativePreviewWindowId = sip_pip_video_frame
-            //sipCore?.isVideoPreviewEnabled = true
-            //sipCore?.enableVideoPreview(true)
-
             linphoneManager?.setVideoWindowId(sip_full_video_frame, sip_pip_video_frame)
             linphoneManager?.enableMic(true)
         }
@@ -91,8 +76,6 @@ class SipCallFragment: BaseCallFragment() {
         tv_volume.text = "" + volume/10
 
         VoiceManagerUtil.setCallVoice(activity, volume)
-        //sipCore?.isMicEnabled = true
-        //sipCore?.enableMic(true)
         linphoneManager?.enableMic(true)
 
         //Log.e(TAG, "udpPort: ${sipCore!!.transports.udpPort}, tcpPort: ${sipCore!!.transports.tcpPort}")
@@ -187,19 +170,13 @@ class SipCallFragment: BaseCallFragment() {
         }
 
         sky_voice_call_mute.setOnClickListener {
-            //val micEnable = sipCore!!.isMicEnabled
-            //val micEnable = sipCore!!.micEnabled()
             val micEnable = linphoneManager?.micEnabled()
             Log.d(TAG,"mic enable: $micEnable")
 
             if (micEnable == true) {
-                //sipCore!!.isMicEnabled = false
-                //sipCore!!.enableMic(false)
                 linphoneManager?.enableMic(false)
                 sky_voice_call_mute.isSelected = true
             } else {
-                //sipCore!!.isMicEnabled = true
-                //sipCore!!.enableMic(true)
                 linphoneManager?.enableMic(true)
                 sky_voice_call_mute.isSelected = false
             }
@@ -230,14 +207,6 @@ class SipCallFragment: BaseCallFragment() {
     }
 
     private fun callTerminate() {
-        /*if (sipCore != null && sipCore!!.callsNb > 0) {
-            var call = sipCore!!.currentCall
-            if (call == null) {
-                call = sipCore!!.calls[0]
-            }
-            call?.terminate()
-        }*/
-
         linphoneManager?.terminateCall()
     }
 
@@ -294,14 +263,6 @@ class SipCallFragment: BaseCallFragment() {
         Constants.CALL_STATE = Constants.CALL_CALLING
         DeviceChannel.calling = true
 
-        if (Constants.hookOn) {
-            //免提
-            toggleSpeaker(true)
-        } else {
-            //听筒
-            toggleSpeaker(false)
-        }
-
         if (audioOnly) {
             ll_voice_call.visibility = View.VISIBLE
         } else {
@@ -319,6 +280,14 @@ class SipCallFragment: BaseCallFragment() {
         sky_voice_call_timer.start()
         sky_voice_call_mute.visibility = View.VISIBLE
         ll_voice_volume_bar.visibility = View.VISIBLE
+
+        if (Constants.hookOn) {
+            //免提
+            toggleSpeaker(true)
+        } else {
+            //听筒
+            toggleSpeaker(false)
+        }
     }
 
     private fun cancelCall(fromId: Int, toId: Int?, interactionId: Int?) {
@@ -357,16 +326,7 @@ class SipCallFragment: BaseCallFragment() {
     }
 
     private fun toggleSpeaker(enable: Boolean) {
-        /*Log.d(TAG, "toggle speaker: $enable, sipCore: $sipCore")
-        if ( sipCore == null) {
-            return
-        }
-
-        if (enable) {
-            AudioRouteUtils.routeAudioToSpeaker(sipCore!!)
-        } else {
-            AudioRouteUtils.routeAudioToEarpiece(sipCore!!)
-        }*/
+        Log.e(TAG, "toggle speaker: $enable")
 
         linphoneManager?.enableSpeaker(enable)
     }
@@ -402,23 +362,6 @@ class SipCallFragment: BaseCallFragment() {
                                 }
                                 callEnd(true)
                             } else {
-                                /*val addressToCall = sipCore!!.interpretUrl(curIt.toSipId)
-                                val params = sipCore!!.createCallParams(null)
-                                if (onlyAudio) {
-                                    //params?.isVideoEnabled = false
-                                    params?.enableVideo(false)
-                                } else {
-                                    //params?.isVideoEnabled = true
-                                    params?.enableVideo(true)
-                                    //params?.mediaEncryption = MediaEncryption.None
-                                    //params?.isLowBandwidthEnabled = true
-                                }
-
-                                if (addressToCall != null) {
-                                    sipCore!!.inviteAddressWithParams(addressToCall, params!!)
-                                    Log.d(TAG, ">>>>>>>>>>> invite address: " + addressToCall.asString())
-                                }*/
-
                                 linphoneManager?.startCall(curIt.toSipId, !onlyAudio)
                             }
                         } else if (curTcpModel.action == TcpAction.VoiceAction.REJECT) {//对方拒绝

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

@@ -18,7 +18,6 @@ import com.alibaba.android.vlayout.VirtualLayoutManager
 import com.google.gson.Gson
 import com.serenegiant.helper.ScreenRecordHelper
 import com.serenegiant.service.ScreenRecorderService
-import com.wdkl.ncs.android.component.nursehome.BuildConfig
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.adapter.BedItemAdapter
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
@@ -28,6 +27,7 @@ import com.wdkl.ncs.android.component.nursehome.util.Util
 import com.wdkl.ncs.android.component.nursehome.util.VoiceManagerUtil
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.BuildConfig
 import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.middleware.model.bean.SettingConfiguration
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO

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

@@ -10,7 +10,6 @@ import android.view.View
 import android.widget.AdapterView
 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
@@ -22,6 +21,7 @@ import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.base.BaseFragment
 import com.wdkl.ncs.android.lib.utils.DeleteFileUtil
 import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.BuildConfig
 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
@@ -291,8 +291,9 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
             }
 
             if (clickTimes > 9) {
-                if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F")) {
-                    if (AppUtil.openNetwrokDebug()) {
+                if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F")
+                    || "A01".equals(Build.MODEL)) {
+                    if (AppUtil.openNetworkDebug()) {
                         showMessage(R.string.enable_debug)
                     }
                 } else {
@@ -516,6 +517,12 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter,FragmentSystem
                     if (Build.BOARD.equals("k37tv1_64_bsp") || Build.BOARD.equals("k37mv1_64_bsp") || Build.MODEL.equals("KT10-3F") || "m3520b_bnkj_zx".equals(Build.MODEL)) {
                         StatusBarHelper.toggleStatusBar(activity, true)
                     }
+
+                    if ("A01".equals(Build.MODEL)) {
+                        if ((activity as NurseHomeActivity).apiConnect) {
+                            (activity as NurseHomeActivity).manager?.hideNavBar(false)
+                        }
+                    }
                 }
             }
 

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

@@ -20,18 +20,6 @@ public class WdBootReceiver extends BroadcastReceiver {
             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);
-            }*/
-
         }
     }
 

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

@@ -124,7 +124,7 @@ public class AppUtil {
     }
 
     //开启网络调试
-    public static boolean openNetwrokDebug() {
+    public static boolean openNetworkDebug() {
         try {
             Process process = Runtime.getRuntime().exec("su");
             if (null == process) {

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

@@ -3,7 +3,7 @@ package com.wdkl.ncs.android.component.nursehome.util;
 import android.app.Application;
 import android.util.Log;
 
-import com.wdkl.ncs.android.component.nursehome.BuildConfig;
+import com.wdkl.ncs.android.middleware.BuildConfig;
 import com.wdkl.ncs.android.middleware.api.UrlManager;
 import org.json.JSONObject;
 

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

@@ -106,7 +106,7 @@ class IncidentWindow(var activity: Activity) {
             delegateAdapter = DelegateAdapter(virtualLayoutManager)
             delegateAdapter.addAdapter(adapter)
 
-            val windowIncidentBinding: WindowIncidentBinding = DataBindingUtil.bind(view)
+            val windowIncidentBinding: WindowIncidentBinding = DataBindingUtil.bind(view!!)!!
 
             windowIncidentBinding.rvEventList.layoutManager = virtualLayoutManager
             windowIncidentBinding.rvEventList.adapter = delegateAdapter
@@ -289,7 +289,7 @@ class IncidentWindow(var activity: Activity) {
         }
 
         override fun onCreateViewHolder(
-            p0: ViewGroup?,
+            p0: ViewGroup,
             p1: Int
         ): BaseRecyclerViewHolder<AdapterEventListItemBinding> {
             return BaseRecyclerViewHolder.build(p0, R.layout.adapter_event_list_item)

+ 1 - 1
app/build.gradle

@@ -130,7 +130,7 @@ dependencies {
     /**
      * Kotlin依赖
      */
-    kapt 'com.android.databinding:compiler:2.3.3'
+    //kapt 'com.android.databinding:compiler:2.3.3'
     /**
      * 路由注解处理器
      */

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

@@ -16,11 +16,19 @@
 
     <uses-permission android:name ="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
+
+    <queries>
+        <intent>
+            <action android:name="android.intent.action.TTS_SERVICE" />
+        </intent>
+    </queries>
+
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_home_launch"
         android:label="@string/wdkl_app_name"
         android:supportsRtl="true"
+        android:extractNativeLibs="true"
         tools:replace="android:label"
         tools:remove="android:requestLegacyExternalStorage"
         android:networkSecurityConfig="@xml/network_security_config"

+ 8 - 0
app/src/main/sharedUserId/AndroidManifest.xml

@@ -17,11 +17,19 @@
 
     <uses-permission android:name ="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
+
+    <queries>
+        <intent>
+            <action android:name="android.intent.action.TTS_SERVICE" />
+        </intent>
+    </queries>
+
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_home_launch"
         android:label="@string/wdkl_app_name"
         android:supportsRtl="true"
+        android:extractNativeLibs="true"
         tools:replace="android:label"
         tools:remove="android:requestLegacyExternalStorage"
         android:networkSecurityConfig="@xml/network_security_config"

+ 6 - 2
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"
 
     //OEM: wdkl,legrand
     ext.oem_name = "wdkl"
@@ -105,7 +105,7 @@ buildscript {
         /**
          * Gradle插件
          */
-        classpath 'com.android.tools.build:gradle:3.0.1'
+        classpath 'com.android.tools.build:gradle:4.2.2'
 
         /**
          * Kawo组件化插件
@@ -159,6 +159,10 @@ allprojects {
             // Replace snapshots by releases for releases !
             url "https://linphone.org/maven_repository"
         }
+
+        flatDir {
+            dirs '../common/libs' //申明本地库
+        }
     }
 }
 

+ 17 - 11
common/build.gradle

@@ -15,10 +15,6 @@ android {
         dataBinding {
             enabled = true
         }
-//        ndk{
-//            moduleName "JavaShopCommonNDK"       //生成的so文件名字,调用C程序的代码中会用到该名字
-//            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库
-//        }
     }
     lintOptions {
         abortOnError false
@@ -29,14 +25,10 @@ android {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
-//        debug {
-//            jniDebuggable true
-//        }
     }
+
     sourceSets {
         main.java.srcDirs += 'src/main/code'
-//        main.jni.srcDirs = []
-//        main.jniLibs.srcDir 'src/main/libs'
     }
 }
 
@@ -93,6 +85,8 @@ dependencies {
      */
     compile 'com.enation.geamtear:jrouter-logic:1.0.3'
 
+    compile 'com.enation.geamtear:jrouter-annotation:1.0.1'
+
     /**
      *  JavaShop_Android 图片选择工具库
      */
@@ -141,7 +135,7 @@ dependencies {
     /**
      *  Databinding
      */
-    kapt "com.android.databinding:compiler:2.3.3"
+    //kapt "com.android.databinding:compiler:2.3.3"
 
     /**
      *  Dagger依赖
@@ -191,13 +185,21 @@ dependencies {
      */
     compile 'com.github.hackware1993:magicindicator:1.5.0'
 
+    api(name: 'common-1.1.9', ext: 'aar')
+
+    api(name: 'linphone-sdk-android-5.0.71', ext: 'aar')
+
     /**
      * 汉字辅助
      */
     compile files('libs/chinese2py.jar')
 
     //toast 框架
-    compile files('libs/Toaster-12.2.aar')
+    //compile files('libs/Toaster-12.2.aar')
+    api(name: 'Toaster-12.2', ext: 'aar')
+
+    //大朝华15.6寸rk主机api
+    implementation files('libs/meiai_api.jar')
 
     /**
      * 二维码扫描
@@ -243,6 +245,10 @@ dependencies {
      * netty
      */
     compile 'io.netty:netty-all:4.1.42.Final'
+    //解决 引入上方库,Log4J2Logger报错的问题
+    implementation 'org.apache.logging.log4j:log4j-core:2.7'
+    implementation 'org.apache.logging.log4j:log4j-api:2.7'
+
     //eventbus
     compile 'org.greenrobot:eventbus:3.0.0'
 }

middleware/libs/common-1.1.9.aar → common/libs/common-1.1.9.aar


middleware/libs/linphone-sdk-android-5.0.71.aar → common/libs/linphone-sdk-android-5.0.71.aar


BIN
common/libs/meiai_api.jar


+ 2 - 2
common/src/main/code/com/wdkl/ncs/android/lib/adapter/TextViewDelegateAdapter.kt

@@ -44,7 +44,7 @@ class TextViewDelegateAdapter(val text :String,val textLineCount :Int ,val textC
      * @Date   2018/4/19 下午3:18
      * @Note   构建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<TextAdapterLayBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<TextAdapterLayBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.text_adapter_lay)
     }
 
@@ -123,7 +123,7 @@ class TextViewListDelegateAdapter(val text :ArrayList<String>,val textLineCount
      * @Date   2018/4/19 下午3:18
      * @Note   构建ViewHolder
      */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<TextAdapterLayBinding> {
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<TextAdapterLayBinding> {
         return BaseRecyclerViewHolder.build(parent, R.layout.text_adapter_lay)
     }
 

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

@@ -4,22 +4,24 @@ import android.content.Context
 import android.content.Intent
 import android.databinding.DataBindingUtil
 import android.databinding.ViewDataBinding
+import android.os.Build
 import android.os.Bundle
+import android.util.Log
 import android.view.View
 import android.view.WindowManager
 import android.view.inputmethod.InputMethodManager
 import com.enation.javashop.android.jrouter.JRouter
-import com.wdkl.ncs.android.lib.R
+import com.enation.javashop.utils.base.tool.BaseToolActivity
+import com.meiai.manager.MyManager
+import com.meiai.manager.MyManager.ServiceConnectedInterface
 import com.wdkl.ncs.android.lib.utils.debugLog
 import com.wdkl.ncs.android.lib.utils.errorLog
-import com.enation.javashop.utils.base.tool.BaseToolActivity
-import com.enation.javashop.utils.base.tool.CommonTool
-import com.enation.javashop.utils.base.widget.LoadingDialog
 import kotlinx.android.synthetic.main.custom_loading.view.*
 import org.greenrobot.eventbus.EventBus
 import java.lang.reflect.Field
 import javax.inject.Inject
 
+
 /**
  * @author  LDD
  * @Data   2017/12/26 上午9:26
@@ -57,6 +59,9 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
      */
     protected val disposableManager by lazy { DisposableManager() }
 
+    var manager: MyManager? = null
+    var apiConnect = false
+
     private val FULL_SCREEN_FLAG = (
             View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                     or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
@@ -89,7 +94,7 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         /**创建根视图*/
         val rootView = layoutInflater.inflate(getLayId(), null, false)
         /**初始化Databinding对象*/
-        mViewBinding = DataBindingUtil.bind(rootView)
+        mViewBinding = DataBindingUtil.bind(rootView)!!
         /**设置根视图到Activity*/
         setContentView(rootView)
 
@@ -100,8 +105,25 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         bindDagger()
         /**Presenter绑定View*/
         attachView()
-        /**执行初始化操作*/
-        init()
+
+        if ("A01".equals(Build.MODEL)) {
+            try {
+                manager = MyManager.getInstance(this)
+                manager?.bindAIDLService(this)
+                manager?.setConnectClickInterface {
+                    Log.e("Base", "api connect...")
+                    apiConnect = true
+                    /**执行初始化操作*/
+                    init()
+                }
+            } catch (e: Exception) {
+                init()
+                //e.printStackTrace()
+            }
+        } else {
+            init()
+        }
+
         /**执行绑定event操作*/
         bindEvent()
     }
@@ -169,8 +191,14 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         /**清除声明周期监听引用*/
         removeAllCallBack()
         /**处理android4.4.2 底层内存泄漏*/
-        fixInputMethodManagerLeak(activity)
+        //fixInputMethodManagerLeak(activity)
         errorLog("PageDestory","页面销毁======>$localClassName")
+
+        try {
+            manager?.unBindAIDLService(this)
+        } catch (e: Exception) {
+            //e.printStackTrace()
+        }
     }
 
     /**

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

@@ -74,7 +74,7 @@ import javax.inject.Inject
         /**初始化根视图及DataBinding*/
         if (layout == null) {
             layout = inflater.inflate(getLayId(), null)
-            mViewDataBinding = DataBindingUtil.bind(layout)
+            mViewDataBinding = DataBindingUtil.bind(layout!!)!!
         }
 
         /**初始化宿主Activity*/

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

@@ -94,7 +94,7 @@ import javax.inject.Inject
         /**创建根视图*/
         val rootView = layoutInflater.inflate(getLayId(), null, false)
         /**初始化Databinding对象*/
-        mViewBinding = DataBindingUtil.bind(rootView)
+        mViewBinding = DataBindingUtil.bind(rootView)!!
         /**设置根视图到Activity*/
         setContentView(rootView)
         /**执行抽象方法初始化Dagger相应操作*/
@@ -323,7 +323,7 @@ import javax.inject.Inject
      * @Data   2017/12/26 下午12:12
      * @Note   保存参数,防止丢失
      */
-    override fun onSaveInstanceState(outState: Bundle?) {
+    override fun onSaveInstanceState(outState: Bundle) {
         getTakePhoto()!!.onSaveInstanceState(outState)
         super.onSaveInstanceState(outState)
     }

+ 2 - 2
common/src/main/code/com/wdkl/ncs/android/lib/utils/BaseRecyclerViewHolder.kt

@@ -23,8 +23,8 @@ class BaseRecyclerViewHolder<out BindType:ViewDataBinding>(val databinding:BindT
          * @param  parent   父容器
          * @param  layoutId 布局ID
          */
-        fun <BindType:ViewDataBinding>build(parent: ViewGroup?,layoutId : Int) : BaseRecyclerViewHolder<BindType>{
-            return BaseRecyclerViewHolder(DataBindingUtil.bind(LayoutInflater.from(parent?.context).inflate(layoutId,parent,false)))
+        fun <BindType:ViewDataBinding>build(parent: ViewGroup,layoutId : Int) : BaseRecyclerViewHolder<BindType>{
+            return BaseRecyclerViewHolder(DataBindingUtil.bind(LayoutInflater.from(parent.context).inflate(layoutId,parent,false))!!)
         }
     }
 

+ 1 - 1
common/src/main/code/com/wdkl/ncs/android/lib/widget/PopCommonView.kt

@@ -119,7 +119,7 @@ class PopCommonView : PopWindowCompatible{
      */
     private fun createUI(){
         contentView = activity.layoutInflater.inflate(R.layout.pop_common_lay,null)
-        binding = DataBindingUtil.bind(contentView)
+        binding = DataBindingUtil.bind(contentView)!!
         /**初始化LayoutMannager*/
         virtualLayoutManager = VirtualLayoutManager(this.activity)
         /**初始化适配器*/

BIN
gstream/libs/armeabi-v7a/libc++_shared.so


+ 15 - 8
middleware/build.gradle

@@ -22,6 +22,13 @@ android {
         dataBinding {
             enabled = true
         }
+
+        buildConfigField 'String', 'VERSION_NAME', "\"${project.rootProject.ext.app_version}\""
+        buildConfigField 'int', 'VERSION_CODE', "${project.rootProject.ext.app_version_code}"
+
+        buildConfigField "String", "BUILD_TIME", getDate()
+        buildConfigField "String", "APP_DEVICE_TYPE", "\""+app_device_type+"\""
+        buildConfigField 'String', 'OEM_NAME', "\"${project.rootProject.ext.oem_name}\""
     }
 
     lintOptions {
@@ -50,6 +57,13 @@ android {
     }
 }
 
+//获取编译日期
+static String getDate() {
+    Date date = new Date()
+    String dates = "\""+date.format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))+"\""
+    return dates
+}
+
 dependencies {
     compile fileTree(include: ['*.jar'], dir: 'libs')
     testCompile 'junit:junit:4.12'
@@ -57,13 +71,6 @@ dependencies {
         exclude group: 'com.android.support', module: 'support-annotations'
     })
 
-    /**
-     * vlc 流播放器
-     */
-    //compile files('libs/libvlc-armv7-3.2-eap10.aar')
-    compile files('libs/common-1.1.9.aar')
-    compile files('libs/linphone-sdk-android-5.0.71.aar')
-
     compile project(':common')
     compile project(':resource')
 
@@ -75,7 +82,7 @@ dependencies {
     /**
      * Kotlin依赖
      */
-    kapt 'com.android.databinding:compiler:2.3.3'
+    //kapt 'com.android.databinding:compiler:2.3.3'
 
     /**
      * 路由注解处理器

BIN
middleware/libs/libvlc-armv7-3.2-eap10.aar


BIN
middleware/libs/linphone-sdk-android-5.2.10.aar


+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/bind/DataBindingHelper.kt

@@ -184,7 +184,7 @@ object DataBindingHelper {
     @BindingAdapter(value = ["bind:text_num_count_percent"],requireAll = true)
     @JvmStatic
     fun textNumCountPercent(view :TextView ,text :ObserableString){
-        view.text = "${text.get().length}/500"
+        view.text = "${text.get()!!.length}/500"
     }
 
     /**

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/PostCommentViewModel.kt

@@ -18,7 +18,7 @@ data class PostCommentViewModel(val sn :String,
         val goods = ArrayList<PostGoodsModel>()
         goodsList.forEach {
             val item = PostGoodsModel()
-            item.content = it.commentContent.get()
+            item.content = it.commentContent.get()!!
             if (it.goodsStar < 3) {
                 item.grade = "bad"
             } else if (it.goodsStar == 3 || it.goodsStar == 4) {

+ 1 - 1
welcome/build.gradle

@@ -96,7 +96,7 @@ dependencies {
     /**
      * Kotlin依赖
      */
-    kapt 'com.android.databinding:compiler:2.3.3'
+    //kapt 'com.android.databinding:compiler:2.3.3'
 
     /**
      * 路由注解处理器