Преглед изворни кода

<新系统5寸分机sip等功能整合>

weizhengliang пре 4 година
родитељ
комит
7ee9f4ae67
100 измењених фајлова са 3509 додато и 10 уклоњено
  1. 1 0
      .gitignore
  2. 21 1
      app/build.gradle
  3. 139 0
      app/keystore_wuyuqing_3128/keytool-importkeypair
  4. 1 0
      app/keystore_wuyuqing_3128/password.txt
  5. BIN
      app/keystore_wuyuqing_3128/platform.pk8
  6. 24 0
      app/keystore_wuyuqing_3128/platform.x509.pem
  7. BIN
      app/keystore_wuyuqing_3128/rk3128.jks
  8. 7 0
      app/keystore_wuyuqing_3128/rk3128_generate_key.sh
  9. 139 0
      app/keystore_wuyuqing_3128/rk3128_signapk/keytool-importkeypair
  10. BIN
      app/keystore_wuyuqing_3128/rk3128_signapk/platform.pk8
  11. 24 0
      app/keystore_wuyuqing_3128/rk3128_signapk/platform.x509.pem
  12. BIN
      app/keystore_wuyuqing_3128/rk3128_signapk/rk3128.jks
  13. 7 0
      app/keystore_wuyuqing_3128/rk3128_signapk/rk3128_generate_key.sh
  14. BIN
      app/keystore_wuyuqing_3128/rk3128_signapk/signapk.jar
  15. BIN
      app/keystore_wuyuqing_3128/signapk.jar
  16. 10 4
      app/src/main/AndroidManifest.xml
  17. 2 0
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  18. 14 4
      build.gradle
  19. 1 0
      callingbed/.gitignore
  20. 119 0
      callingbed/build.gradle
  21. 21 0
      callingbed/proguard-rules.pro
  22. 24 0
      callingbed/src/androidTest/java/com/wdkl/app/ncs/callingbed2/ExampleInstrumentedTest.kt
  23. 16 0
      callingbed/src/main/AndroidManifest.xml
  24. 267 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt
  25. 20 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/common/Constant.java
  26. 30 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/common/MessageEvent.java
  27. 13 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/di/CallingbedComponent.kt
  28. 142 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/fragment/MainFragment.kt
  29. 314 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/helper/NetHelper.java
  30. 20 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/launch/CallingbedLaunch.kt
  31. 16 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/ClientEncoder.java
  32. 47 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/ClientHandler.java
  33. 14 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/DataBean.java
  34. 87 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/NettyClient.java
  35. 579 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/sip/SipHelper.java
  36. 17 0
      callingbed/src/main/java/com/wdkl/app/ncs/callingbed/sip/SipStatus.java
  37. 34 0
      callingbed/src/main/res/drawable-v24/ic_launcher_foreground.xml
  38. 170 0
      callingbed/src/main/res/drawable/ic_launcher_background.xml
  39. 5 0
      callingbed/src/main/res/drawable/selector_main.xml
  40. 220 0
      callingbed/src/main/res/layout/callingbed_main_lay.xml
  41. 7 0
      callingbed/src/main/res/layout/main_view2.xml
  42. 67 0
      callingbed/src/main/res/layout/main_view_layout.xml
  43. 85 0
      callingbed/src/main/res/layout/view_title_layout.xml
  44. 5 0
      callingbed/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  45. 5 0
      callingbed/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  46. BIN
      callingbed/src/main/res/mipmap-hdpi/ic_launcher.png
  47. BIN
      callingbed/src/main/res/mipmap-hdpi/ic_launcher_round.png
  48. BIN
      callingbed/src/main/res/mipmap-mdpi/ic_etherneted.png
  49. BIN
      callingbed/src/main/res/mipmap-mdpi/ic_launcher.png
  50. BIN
      callingbed/src/main/res/mipmap-mdpi/ic_launcher_round.png
  51. BIN
      callingbed/src/main/res/mipmap-mdpi/ic_no_ethernet.png
  52. BIN
      callingbed/src/main/res/mipmap-mdpi/ic_wifi_high.png
  53. BIN
      callingbed/src/main/res/mipmap-mdpi/ic_wifi_nor.png
  54. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_care_normal.png
  55. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_care_press.png
  56. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_cost_normal.png
  57. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_cost_press.png
  58. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_main_normal.png
  59. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_main_press.png
  60. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_medical_advice_normal.png
  61. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_medical_advice_press.png
  62. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_settings_normal.png
  63. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_settings_press.png
  64. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_support_normal.png
  65. BIN
      callingbed/src/main/res/mipmap-mdpi/icon_support_press.png
  66. BIN
      callingbed/src/main/res/mipmap-xhdpi/ic_launcher.png
  67. BIN
      callingbed/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  68. BIN
      callingbed/src/main/res/mipmap-xxhdpi/ic_launcher.png
  69. BIN
      callingbed/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  70. BIN
      callingbed/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  71. BIN
      callingbed/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  72. 91 0
      callingbed/src/main/res/values/colors.xml
  73. 86 0
      callingbed/src/main/res/values/dimens.xml
  74. 5 0
      callingbed/src/main/res/values/strings.xml
  75. 11 0
      callingbed/src/main/res/values/styles.xml
  76. 17 0
      callingbed/src/test/java/com/wdkl/app/ncs/callingbed/ExampleUnitTest.kt
  77. 7 0
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  78. 8 0
      common/src/main/code/com/wdkl/ncs/android/lib/utils/TimeHandle.kt
  79. 1 1
      common/src/main/res/values/styles.xml
  80. 3 0
      gradle.properties
  81. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/ApiManager.kt
  82. 12 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/CallingbedApi.kt
  83. 5 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApiProvides.kt
  84. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApplicationComponent.kt
  85. 7 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/PresenterComponent.kt
  86. 16 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/callingbed/CallingbedActivityContract.kt
  87. 17 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/callingbed/MainFragmentContract.kt
  88. 56 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/callingbed/CallingbedActivityPresenter.kt
  89. 60 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/callingbed/MainFragmentPresenter.kt
  90. 43 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/NurseConfigDto.java
  91. 326 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/CustomerInfoVO.java
  92. BIN
      resource/src/main/res/mipmap-hdpi/launcher.png
  93. BIN
      resource/src/main/res/mipmap-hdpi/welcome.png
  94. BIN
      resource/src/main/res/mipmap-mdpi/launcher.png
  95. BIN
      resource/src/main/res/mipmap-mdpi/welcome.png
  96. BIN
      resource/src/main/res/mipmap-xhdpi/launcher.png
  97. BIN
      resource/src/main/res/mipmap-xhdpi/welcome.png
  98. BIN
      resource/src/main/res/mipmap-xxhdpi/launcher.png
  99. BIN
      resource/src/main/res/mipmap-xxhdpi/welcome.png
  100. 0 0
      resource/src/main/res/mipmap-xxxhdpi/launcher.png

+ 1 - 0
.gitignore

@@ -2,6 +2,7 @@
 /local.properties
 /.idea/workspace.xml
 /.idea/libraries
+/.idea
 .DS_Store
 /build
 /captures

+ 21 - 1
app/build.gradle

@@ -10,12 +10,29 @@ kapt {
     }
 }
 android {
+    // wuyq add for sign begin
+    signingConfigs {
+        release {
+            storeFile file("keystore_wuyuqing_3128/rk3128.jks")
+            storePassword "111111"
+            keyAlias "rk3128"
+            keyPassword "111111"
+        }
+        debug {
+            storeFile file("keystore_wuyuqing_3128/rk3128.jks")
+            storePassword "111111"
+            keyAlias "rk3128"
+            keyPassword "111111"
+        }
+    }
+    // wuyq add for sign end
+
     compileSdkVersion target_sdk_version
     buildToolsVersion build_tools_version
     aaptOptions.cruncherEnabled = false
     aaptOptions.useNewCruncher = false
     defaultConfig {
-        applicationId "com.enation.app.javashop"
+        applicationId "com.wdkl.app.ncs.callingbed"
         minSdkVersion min_sdk_version
         targetSdkVersion target_sdk_version
         versionCode app_version_code
@@ -33,10 +50,12 @@ android {
 
     buildTypes {
         release {
+            signingConfig signingConfigs.release
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
         debug {
+            signingConfig signingConfigs.debug
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
@@ -98,6 +117,7 @@ dependencies {
         compile project(':setting')   // ===> 设置模块 设置 缓存 App分享等
         compile project(':extra')    // ===> 额外的一些页面 比如二维码扫描等一些附加功能
         compile project(':hello')
+        compile project(':callingbed')
     }
     /**
      * JavaShopAndroid 中间件依赖库

+ 139 - 0
app/keystore_wuyuqing_3128/keytool-importkeypair

@@ -0,0 +1,139 @@
+#! /bin/bash
+#
+# This file is part of keytool-importkeypair.
+#
+# keytool-importkeypair 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.
+#
+# keytool-importkeypair 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 keytool-importkeypair.  If not, see
+# <http://www.gnu.org/licenses/>.
+#
+
+DEFAULT_KEYSTORE=$HOME/.keystore
+keystore=$DEFAULT_KEYSTORE
+pk8=""
+cert=""
+alias=""
+passphrase=""
+tmpdir=""
+
+scriptname=`basename $0`
+
+usage() {
+cat << EOF
+usage: ${scriptname} [-k keystore] [-p storepass]
+-pk8 pk8 -cert cert -alias key_alias
+
+This script is used to import a key/certificate pair
+into a Java keystore.
+
+If a keystore is not specified then the key pair is imported into
+~/.keystore in the user's home directory.
+
+The passphrase can also be read from stdin.
+EOF
+}
+
+cleanup() {
+if [ ! -z "${tmpdir}" -a -d ${tmpdir} ]; then
+   rm -fr ${tmpdir}
+fi
+}
+
+while [ $# -gt 0 ]; do
+        case $1
+        in
+                -p | --passphrase | -passphrase)
+                        passphrase=$2
+                        shift 2
+        ;;
+                -h | --help)
+                        usage
+                        exit 0
+        ;;
+                -k | -keystore | --keystore)
+                        keystore=$2
+                        shift 2
+        ;;
+                -pk8 | --pk8 | -key | --key)
+                        pk8=$2
+                        shift 2
+        ;;
+                -cert | --cert | -pem | --pem)
+                        cert=$2
+                        shift 2
+        ;;
+                -a | -alias | --alias)
+                        alias=$2
+                        shift 2
+        ;;
+                *)
+                        echo "${scriptname}: Unknown option $1, exiting" 1>&2
+                        usage
+                        exit 1
+        ;;
+        esac
+done
+
+if [ -z "${pk8}" -o -z "${cert}" -o -z "${alias}" ]; then
+   echo "${scriptname}: Missing option, exiting..." 1>&2
+   usage
+   exit 1
+fi
+
+
+for f in "${pk8}" "${cert}"; do
+    if [ ! -f "$f" ]; then
+       echo "${scriptname}: Can't find file $f, exiting..." 1>&2
+       exit 1
+    fi
+done
+
+if [ ! -f "${keystore}" ]; then
+   storedir=`dirname "${keystore}"`
+   if [ ! -d "${storedir}" -o ! -w "${storedir}" ]; then
+      echo "${scriptname}: Can't access ${storedir}, exiting..." 1>&2
+      exit 1
+   fi
+fi
+
+# Create temp directory ofr key and pkcs12 bundle
+tmpdir=`mktemp -q -d "/tmp/${scriptname}.XXXX"`
+
+if [ $? -ne 0 ]; then
+   echo "${scriptname}: Can't create temp directory, exiting..." 1>&2
+   exit 1
+fi
+
+key="${tmpdir}/key"
+p12="${tmpdir}/p12"
+
+if [ -z "${passphrase}" ]; then
+   # Request a passphrase
+  read -p "Enter a passphrase: " -s passphrase
+  echo ""
+fi
+
+# Convert PK8 to PEM KEY
+openssl pkcs8 -inform DER -nocrypt -in "${pk8}" -out "${key}"
+
+# Bundle CERT and KEY
+openssl pkcs12 -export -in "${cert}" -inkey "${key}" -out "${p12}" -password pass:"${passphrase}" -name "${alias}"
+
+# Print cert
+echo -n "Importing \"${alias}\" with "
+openssl x509 -noout -fingerprint -in "${cert}"
+
+# Import P12 in Keystore
+keytool -importkeystore -deststorepass "${passphrase}" -destkeystore "${keystore}" -srckeystore "${p12}" -srcstoretype PKCS12 -srcstorepass "${passphrase}" 
+
+# Cleanup
+cleanup

+ 1 - 0
app/keystore_wuyuqing_3128/password.txt

@@ -0,0 +1 @@
+111111

BIN
app/keystore_wuyuqing_3128/platform.pk8


+ 24 - 0
app/keystore_wuyuqing_3128/platform.x509.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIJAP8GQTI8+VUSMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD
+VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
+VmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UE
+AwwHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+Fw0xNDEyMjMwNjQzNDFaFw00MjA1MTAwNjQzNDFaMIGUMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHQW5kcm9p
+ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+hvcNAQEBBQADggENADCCAQgCggEBAKHY8Fl4XZzpJvgHoezYjhmKPvdq9DGYVc/X
+9NQO5oUlYIA/Ci5rzvljz13KbNve/KxuEu9HN8SzsLg9EBhghOko8JxEg7I8W6uP
+VOoRngNCMvXzjf6av77vxPqphlgq++Y4MIC+fiOxLd+gpYq0p6W7RWxEgrzLHnWi
+CX0dRmWDs+ey2t4f1WKzGoRQQS0Tn21CViThrVEe+zNwANnhErUcvoQB2m4/PQot
+uij7LZNccHJvUOUf5/4wIZd8JOgO3VLwzFO/HhrqUjafCvkpKTjW8oQmHLUz5m40
+ljETGEjqQ6AuAwmaeFT+Bwj1DUaYg+m7AzalJ2aAtHVX0FftRUkCAQOjUDBOMB0G
+A1UdDgQWBBQi+LgbyFfWSoWCbQ+NVDF4ZKTPCjAfBgNVHSMEGDAWgBQi+LgbyFfW
+SoWCbQ+NVDF4ZKTPCjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBH
+1kIQlSBjXRMuQdaDLytr8ZaJXIN1HApg2QA8azYQXOS/B16gwm6tBfh1dL86LL/7
+w09oM9LZv8WwtQyFNjM97vvQvkaOGW/ubhrKOk3+8HTHkEx4n7H6tYGOLdpmWepD
+fBSEFuLwq6yqG6wZFdd7IKO+sPlCxqUpqg40YAb4WOwzDbiuJnswDftP3wIaaJPh
+li6OIjRKyd3Sgw1MtffHOy+WSwqHLkGNgH6GAgvZlvhPA/yim+rjnE9oKV5G6Pyg
+QK7kJJjS/LdeqxE7M7pNRYPhcLT7qhE7MiuBuyqwAMTTBoU8u3lTdOZwNErbRT5t
+SXkgVMffkfN7wBNqpSSY
+-----END CERTIFICATE-----

BIN
app/keystore_wuyuqing_3128/rk3128.jks


+ 7 - 0
app/keystore_wuyuqing_3128/rk3128_generate_key.sh

@@ -0,0 +1,7 @@
+#!/bin/sh
+# 转换系统签名命令
+./keytool-importkeypair -k rk3128.jks -p 111111 -pk8 platform.pk8 -cert platform.x509.pem -alias rk3128
+# rk3128.jks : 签名文件
+# 111111 : 签名文件密码
+# platform.pk8、platform.x509.pem : 系统签名文件
+# rk3128 : 签名文件别名

+ 139 - 0
app/keystore_wuyuqing_3128/rk3128_signapk/keytool-importkeypair

@@ -0,0 +1,139 @@
+#! /bin/bash
+#
+# This file is part of keytool-importkeypair.
+#
+# keytool-importkeypair 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.
+#
+# keytool-importkeypair 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 keytool-importkeypair.  If not, see
+# <http://www.gnu.org/licenses/>.
+#
+
+DEFAULT_KEYSTORE=$HOME/.keystore
+keystore=$DEFAULT_KEYSTORE
+pk8=""
+cert=""
+alias=""
+passphrase=""
+tmpdir=""
+
+scriptname=`basename $0`
+
+usage() {
+cat << EOF
+usage: ${scriptname} [-k keystore] [-p storepass]
+-pk8 pk8 -cert cert -alias key_alias
+
+This script is used to import a key/certificate pair
+into a Java keystore.
+
+If a keystore is not specified then the key pair is imported into
+~/.keystore in the user's home directory.
+
+The passphrase can also be read from stdin.
+EOF
+}
+
+cleanup() {
+if [ ! -z "${tmpdir}" -a -d ${tmpdir} ]; then
+   rm -fr ${tmpdir}
+fi
+}
+
+while [ $# -gt 0 ]; do
+        case $1
+        in
+                -p | --passphrase | -passphrase)
+                        passphrase=$2
+                        shift 2
+        ;;
+                -h | --help)
+                        usage
+                        exit 0
+        ;;
+                -k | -keystore | --keystore)
+                        keystore=$2
+                        shift 2
+        ;;
+                -pk8 | --pk8 | -key | --key)
+                        pk8=$2
+                        shift 2
+        ;;
+                -cert | --cert | -pem | --pem)
+                        cert=$2
+                        shift 2
+        ;;
+                -a | -alias | --alias)
+                        alias=$2
+                        shift 2
+        ;;
+                *)
+                        echo "${scriptname}: Unknown option $1, exiting" 1>&2
+                        usage
+                        exit 1
+        ;;
+        esac
+done
+
+if [ -z "${pk8}" -o -z "${cert}" -o -z "${alias}" ]; then
+   echo "${scriptname}: Missing option, exiting..." 1>&2
+   usage
+   exit 1
+fi
+
+
+for f in "${pk8}" "${cert}"; do
+    if [ ! -f "$f" ]; then
+       echo "${scriptname}: Can't find file $f, exiting..." 1>&2
+       exit 1
+    fi
+done
+
+if [ ! -f "${keystore}" ]; then
+   storedir=`dirname "${keystore}"`
+   if [ ! -d "${storedir}" -o ! -w "${storedir}" ]; then
+      echo "${scriptname}: Can't access ${storedir}, exiting..." 1>&2
+      exit 1
+   fi
+fi
+
+# Create temp directory ofr key and pkcs12 bundle
+tmpdir=`mktemp -q -d "/tmp/${scriptname}.XXXX"`
+
+if [ $? -ne 0 ]; then
+   echo "${scriptname}: Can't create temp directory, exiting..." 1>&2
+   exit 1
+fi
+
+key="${tmpdir}/key"
+p12="${tmpdir}/p12"
+
+if [ -z "${passphrase}" ]; then
+   # Request a passphrase
+  read -p "Enter a passphrase: " -s passphrase
+  echo ""
+fi
+
+# Convert PK8 to PEM KEY
+openssl pkcs8 -inform DER -nocrypt -in "${pk8}" -out "${key}"
+
+# Bundle CERT and KEY
+openssl pkcs12 -export -in "${cert}" -inkey "${key}" -out "${p12}" -password pass:"${passphrase}" -name "${alias}"
+
+# Print cert
+echo -n "Importing \"${alias}\" with "
+openssl x509 -noout -fingerprint -in "${cert}"
+
+# Import P12 in Keystore
+keytool -importkeystore -deststorepass "${passphrase}" -destkeystore "${keystore}" -srckeystore "${p12}" -srcstoretype PKCS12 -srcstorepass "${passphrase}" 
+
+# Cleanup
+cleanup

BIN
app/keystore_wuyuqing_3128/rk3128_signapk/platform.pk8


+ 24 - 0
app/keystore_wuyuqing_3128/rk3128_signapk/platform.x509.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIJAP8GQTI8+VUSMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD
+VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
+VmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UE
+AwwHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+Fw0xNDEyMjMwNjQzNDFaFw00MjA1MTAwNjQzNDFaMIGUMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHQW5kcm9p
+ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+hvcNAQEBBQADggENADCCAQgCggEBAKHY8Fl4XZzpJvgHoezYjhmKPvdq9DGYVc/X
+9NQO5oUlYIA/Ci5rzvljz13KbNve/KxuEu9HN8SzsLg9EBhghOko8JxEg7I8W6uP
+VOoRngNCMvXzjf6av77vxPqphlgq++Y4MIC+fiOxLd+gpYq0p6W7RWxEgrzLHnWi
+CX0dRmWDs+ey2t4f1WKzGoRQQS0Tn21CViThrVEe+zNwANnhErUcvoQB2m4/PQot
+uij7LZNccHJvUOUf5/4wIZd8JOgO3VLwzFO/HhrqUjafCvkpKTjW8oQmHLUz5m40
+ljETGEjqQ6AuAwmaeFT+Bwj1DUaYg+m7AzalJ2aAtHVX0FftRUkCAQOjUDBOMB0G
+A1UdDgQWBBQi+LgbyFfWSoWCbQ+NVDF4ZKTPCjAfBgNVHSMEGDAWgBQi+LgbyFfW
+SoWCbQ+NVDF4ZKTPCjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBH
+1kIQlSBjXRMuQdaDLytr8ZaJXIN1HApg2QA8azYQXOS/B16gwm6tBfh1dL86LL/7
+w09oM9LZv8WwtQyFNjM97vvQvkaOGW/ubhrKOk3+8HTHkEx4n7H6tYGOLdpmWepD
+fBSEFuLwq6yqG6wZFdd7IKO+sPlCxqUpqg40YAb4WOwzDbiuJnswDftP3wIaaJPh
+li6OIjRKyd3Sgw1MtffHOy+WSwqHLkGNgH6GAgvZlvhPA/yim+rjnE9oKV5G6Pyg
+QK7kJJjS/LdeqxE7M7pNRYPhcLT7qhE7MiuBuyqwAMTTBoU8u3lTdOZwNErbRT5t
+SXkgVMffkfN7wBNqpSSY
+-----END CERTIFICATE-----

BIN
app/keystore_wuyuqing_3128/rk3128_signapk/rk3128.jks


+ 7 - 0
app/keystore_wuyuqing_3128/rk3128_signapk/rk3128_generate_key.sh

@@ -0,0 +1,7 @@
+#!/bin/sh
+# 转换系统签名命令
+./keytool-importkeypair -k rk3128.jks -p 111111 -pk8 platform.pk8 -cert platform.x509.pem -alias rk3128
+# rk3128.jks : 签名文件
+# 111111 : 签名文件密码
+# platform.pk8、platform.x509.pem : 系统签名文件
+# rk3128 : 签名文件别名

BIN
app/keystore_wuyuqing_3128/rk3128_signapk/signapk.jar


BIN
app/keystore_wuyuqing_3128/signapk.jar


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

@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
-          package="com.wdkl.app.ncs">
+    xmlns:tools="http://schemas.android.com/tools"
+    android:sharedUserId="android.uid.system"
+    package="com.wdkl.app.ncs">
+    <!--android:sharedUserId="android.uid.system"-->
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
     <uses-permission android:name="android.permission.INTERNET"/>
@@ -14,6 +16,9 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
+    <uses-permission android:name="android.permission.CAMERA"/>
+    <uses-permission android:name="android.permission.BLUETOOTH"/>
+    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
     <uses-permission android:name ="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
@@ -31,12 +36,13 @@
             android:value="GlideModule" />
         <meta-data
             android:name="design_width_in_dp"
-            android:value="360"/>
+            android:value="800"/>
         <meta-data
             android:name="design_height_in_dp"
-            android:value="640"/>
+            android:value="480"/>
 
         <activity android:name="com.wdkl.ncs.android.component.welcome.activity.WelcomeActivity"
+            android:screenOrientation="landscape"
             >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>

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

@@ -46,6 +46,8 @@ class Application : BaseApplication() {
         JRouter.prepare().create("/extra/launch").seek()
 
         JRouter.prepare().create("/hello/launch").seek()
+        //5寸分机
+        JRouter.prepare().create("/callingbed/launch").seek()
     }
 
     /**

+ 14 - 4
build.gradle

@@ -62,10 +62,14 @@ buildscript {
             /**
              * 依赖仓储
              */
-            maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
+            /*maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
             maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
             maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
-            maven { url 'https://jitpack.io' }
+            maven { url 'https://jitpack.io' }*/
+
+            jcenter()
+            mavenCentral()
+            google()
         }
         /**
          * Gradle插件
@@ -98,10 +102,16 @@ buildscript {
  */
 allprojects {
     repositories {
-        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
+        /*maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
         maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
         maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
-        maven { url 'https://jitpack.io' }
+        maven { url 'https://jitpack.io' }*/
+
+        google()
+        jcenter()
+        mavenCentral()
+        maven { url 'https://dl.bintray.com/geamtear/maven' }
+        maven { url "https://jitpack.io" }
     }
     tasks.withType(Javadoc) { // 新增
         options.addStringOption('Xdoclint:none', '-quiet')

+ 1 - 0
callingbed/.gitignore

@@ -0,0 +1 @@
+/build

+ 119 - 0
callingbed/build.gradle

@@ -0,0 +1,119 @@
+if (componentTag){
+    apply plugin: 'com.android.application'
+    apply plugin: 'com.enation.javashop.aspectjrt'
+}else{
+    apply plugin: 'com.android.library'
+}
+
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+
+kapt {
+    arguments {
+        arg("moduleName", project.getName())
+    }
+}
+
+android {
+    compileSdkVersion target_sdk_version
+    buildToolsVersion build_tools_version
+
+
+    defaultConfig {
+        if (componentTag){
+            applicationId "com.wdkl.app.ncs.callingbed"
+            multiDexEnabled true
+        }
+
+        minSdkVersion min_sdk_version
+        targetSdkVersion target_sdk_version
+        versionCode app_version_code
+        versionName app_version
+        dataBinding {
+            enabled = true
+        }
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    lintOptions {
+        abortOnError false
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+        exclude group: 'com.android.support', module: 'support-annotations'
+    })
+    /**
+     * 单元测试
+     */
+    testCompile 'junit:junit:4.12'
+
+    /**
+     *  Android基础依赖库
+     */
+    compile "com.android.support:design:$support_library_version"
+    compile "com.android.support:support-v4:$support_library_version"
+    compile "com.android.support:cardview-v7:$support_library_version"
+    compile "com.android.support:appcompat-v7:$support_library_version"
+
+    /**
+     * 公共库依赖
+     */
+    compile project(':middleware')
+    compile project(':sip2')
+
+    //netty
+    compile 'io.netty:netty-all:4.1.20.Final'
+    //eventbus
+    compile 'org.greenrobot:eventbus:3.0.0'
+
+    if(componentTag){
+        debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
+        releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
+        testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
+    }
+
+    /**
+     * Dagger编译依赖
+     */
+    kapt 'com.google.dagger:dagger-compiler:2.7'
+
+    /**
+     * Kotlin依赖
+     */
+    kapt 'com.android.databinding:compiler:2.3.3'
+
+    /**
+     * 路由注解处理器
+     */
+    kapt "com.enation.geamtear:jrouter-compiler:$router_version"
+
+    /**
+     *  constraint-layout布局依赖
+     */
+    compile 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
+}
+
+/**
+ * kawo组件化框架配置
+ */
+if(componentTag){
+    kawo {
+        /**
+         * Aop注解排除Jar
+         */
+        aspectExcludeJarFilter 'com.enation.geamtear.pay','AlipaySdk'
+    }
+}

+ 21 - 0
callingbed/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 24 - 0
callingbed/src/androidTest/java/com/wdkl/app/ncs/callingbed2/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.wdkl.app.ncs.callingbed2
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+    @Test
+    fun useAppContext() {
+        // Context of the app under test.
+        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+        assertEquals("com.wdkl.app.ncs.callingbed2", appContext.packageName)
+    }
+}

+ 16 - 0
callingbed/src/main/AndroidManifest.xml

@@ -0,0 +1,16 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.wdkl.app.ncs.callingbed">
+
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:supportsRtl="true" >
+
+        <activity android:name=".activity.CallingbedActivity"
+            android:screenOrientation="landscape"/>
+    </application>
+</manifest>

+ 267 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt

@@ -0,0 +1,267 @@
+package com.wdkl.app.ncs.callingbed.activity
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.net.ConnectivityManager
+import android.util.Log
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.app.ncs.callingbed.sip.SipHelper
+import com.wdkl.app.ncs.callingbed.sip.SipStatus
+import com.vvsip.ansip.IVvsipServiceListener
+import com.vvsip.ansip.VvsipCall
+import com.wdkl.app.ncs.callingbed.R
+import com.wdkl.app.ncs.callingbed.common.Constant
+import com.wdkl.app.ncs.callingbed.common.MessageEvent
+import com.wdkl.app.ncs.callingbed.databinding.CallingbedMainLayBinding
+import com.wdkl.app.ncs.callingbed.fragment.MainFragment
+import com.wdkl.app.ncs.callingbed.helper.NetHelper
+import com.wdkl.app.ncs.callingbed.launch.CallingbedLaunch
+//import com.wdkl.app.ncs.sip.service.SipService
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.utils.TimeHandle
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.lib.vo.filter
+import com.wdkl.ncs.android.middleware.logic.contract.callingbed.CallingbedActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.callingbed.CallingbedActivityPresenter
+import com.wdkl.ncs.android.middleware.model.vo.CustomerInfoVO
+import kotlinx.android.synthetic.main.view_title_layout.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+
+/**
+ * CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2MainLayBinding>
+ *     CallingbedActivityPresenter: 位置com.wdkl.ncs.android.middleware.logic.presenter.callingbed
+ *     CallingbedMainLayBinding: 位置callingbed_main_lay.xml
+ *     CallingbedActivityContract: 位置com.wdkl.ncs.android.middleware.logic.contract.callingbed
+ */
+
+@Router(path = "/callingbed/main")
+class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMainLayBinding>(), CallingbedActivityContract.View, IVvsipServiceListener {
+
+    private lateinit var receiver: TimeReceiver;
+
+    override fun getLayId(): Int {
+        return R.layout.callingbed_main_lay;
+    }
+
+    override fun bindDagger() {
+        CallingbedLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        //开始ping网络,30秒ping一次
+        NetHelper.startNetCheck()
+        //sip初始化
+        initSip()
+        //显示日期时间
+        updateDateTime()
+        //注册广播
+        regReceiver()
+
+        //启动主fragment
+        supportFragmentManager.beginTransaction().replace(R.id.callingbed_main_frame, MainFragment(), "main_fragment")
+                .commit();
+    }
+
+    override fun bindEvent() {
+
+    }
+
+    override fun destory() {
+        SipHelper.getInstance().unRegisterSip()
+        unRegReceiver()
+    }
+
+    //数据加载错误
+    override fun onError(message: String, type: Int) {
+        dismissDialog()
+        showMessage(message)
+    }
+
+    //数据加载完成
+    override fun complete(message: String, type: Int) {
+        dismissDialog()
+
+    }
+
+    //开始获取数据
+    override fun start() {
+        showDialog()
+    }
+
+    //网络监听
+    override fun networkMonitor(state: NetState) {
+        state.filter(onMobile = {
+
+        },onWifi = {
+
+        },offline = {
+
+        })
+    }
+
+    //数据加载完成,显示数据
+    override fun showData(customInfo: CustomerInfoVO) {
+        //calling_data.setText(customInfo.named)
+    }
+
+    /*private fun startNewService() {
+        val intent = Intent(this, SipService::class.java)
+        startService(intent)
+    }
+
+    fun startToActivity(intent: Intent) {
+        AppTool.Setting.startNewActivity(this@Callingbed2Activity, intent)
+    }*/
+
+    override fun onStart() {
+        EventBus.getDefault().register(this)
+        super.onStart()
+    }
+
+    override fun onStop() {
+        EventBus.getDefault().unregister(this)
+        super.onStop()
+    }
+
+    private fun regReceiver() {
+        receiver = TimeReceiver()
+        var intentFilter = IntentFilter()
+        intentFilter.addAction(Intent.ACTION_TIME_TICK)
+        intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED)
+        intentFilter.addAction(Intent.ACTION_TIME_CHANGED)
+        registerReceiver(receiver, intentFilter)
+    }
+
+    private fun unRegReceiver() {
+        unregisterReceiver(receiver)
+    }
+
+    private fun initSip() {
+        //=============================================SIP启动服务===================================//
+        SipHelper.getInstance().initSip(this@CallingbedActivity,"192.168.101.1", getString(R.string.local_sip), getString(R.string.local_sip))
+        SipHelper.getInstance().sipStartService()
+        SipHelper.getInstance().setSipListner(this)
+    }
+
+    fun sendCall(sipId: String) {
+        showMessage("已呼叫...")
+        SipHelper.getInstance().startCall(sipId)
+    }
+
+    fun endCall() {
+        showMessage("已挂断...")
+        SipHelper.getInstance().endCall()
+    }
+
+    override fun onNewVvsipCallEvent(call: VvsipCall?) {
+        Log.d("sip", "onNewVvsipCallEvent----")
+        if (call != null) {
+            SipHelper.getInstance().addCallObject(call)
+        }
+    }
+
+    override fun onRegistrationEvent(rid: Int, remote_uri: String?, code: Int, reason: String?) {
+        Log.d("sip", "onRegistrationEvent----code: " + code + ", reason: " + reason)
+    }
+
+    override fun onRemoveVvsipCallEvent(call: VvsipCall?) {
+        Log.d("sip", "onRemoveVvsipCallEvent----call.mState:==" + call?.mState)
+        SipHelper.getInstance().removeCallObject(call)
+    }
+
+    override fun onStatusVvsipCallEvent(call: VvsipCall?) {
+        Log.d("sip", "onStatusVvsipCallEvent----call.mState:==" + call?.mState + call?.isIncomingCall())
+
+        EventBus.getDefault().post(MessageEvent(call?.mState, Constant.EVENT_SIP_CALL_STATUS))
+
+        /*when (call?.mState) {
+            0 -> {
+                //正在呼叫中:子机自动接通 isIncomingCall() = true  mState = 0  //正在通话中:isIncomingCall() = true
+                //=============================================SIP自动接听===================================//
+                SipHelper.getInstance().autoTalking()
+                Log.d("sip", "auto talking...")
+                //正在通话中:isIncomingCall() = true
+            }
+            1 -> {
+                //???
+            }
+            2 -> {
+                //正在通话中:isIncomingCall() = true  mState = 2
+                Log.d("sip", "in call...")
+            }
+            3 -> {
+                //无人应答/挂断:isIncomingCall() = true  mState = 3
+                Log.d("sip", "end call...")
+            }
+        }*/
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        when (messageEvent.getType()) {
+            //Sip注册状态
+            Constant.EVENT_SIP_REGISTER_STATUS -> {
+                if (messageEvent.message is String) run {
+                    val status = messageEvent.message as String
+                    Log.d("sip", "sip regist status: " + status)
+                    updateStatus(status)
+                }
+            }
+            //网络ping状态
+            Constant.EVENT_INTERNETPING -> {
+                SipHelper.getInstance().obtainSipInfo()
+                if (NetHelper.NetConn && NetHelper.getInstance().getNetworkType() == ConnectivityManager.TYPE_ETHERNET) {
+                    view_title_layout_iv_ethernet.setImageResource(R.mipmap.ic_etherneted)
+                } else {
+                    view_title_layout_iv_ethernet.setImageResource(R.mipmap.ic_no_ethernet)
+                }
+                view_title_layout_iv_wifi.setImageResource(R.mipmap.ic_wifi_nor)
+            }
+        }
+    }
+
+    /**
+     * Sip状态灯显示
+     *
+     * @param state
+     */
+    private fun updateStatus(state: String) {
+        this.runOnUiThread {
+            when (state) {
+                SipStatus.REGISTERING -> {
+                    //netOff = false
+                    view_title_layout_tv_point.setBackgroundResource(R.color.yellow_color)
+                }
+                SipStatus.REGISTERFAIL -> {
+                    //netOff = true
+                    //handler.sendEmptyMessageDelayed(RESET_ETHE, 120000)
+                    view_title_layout_tv_point.setBackgroundResource(R.color.red_color)
+                }
+                SipStatus.REGISTERCOM -> {
+                    //netOff = false
+                    view_title_layout_tv_point.setBackgroundResource(R.color.green)
+                }
+            }
+        }
+    }
+
+    private fun updateDateTime() {
+        view_title_layout_tv_time.setText(TimeHandle.getDateTime("yyyy-MM-dd HH:mm E"));
+    }
+
+    inner class TimeReceiver: BroadcastReceiver() {
+        override fun onReceive(context: Context, intent: Intent) {
+            if (intent.action == Intent.ACTION_TIME_TICK
+                    || intent.action == Intent.ACTION_TIME_CHANGED
+                    || intent.action == Intent.ACTION_TIMEZONE_CHANGED) {
+                updateDateTime()
+            }
+        }
+    }
+}

+ 20 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/common/Constant.java

@@ -0,0 +1,20 @@
+package com.wdkl.app.ncs.callingbed.common;
+
+public class Constant {
+
+    /**
+     * Sip注册状态
+     */
+    public static final int EVENT_SIP_REGISTER_STATUS = 0x01;
+
+    /**
+     * Sip通话状态
+     */
+    public static final int EVENT_SIP_CALL_STATUS = 0x02;
+
+    /**
+     * 以太网ping状态
+     */
+    public static final int EVENT_INTERNETPING = 0x03;
+
+}

+ 30 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/common/MessageEvent.java

@@ -0,0 +1,30 @@
+package com.wdkl.app.ncs.callingbed.common;
+
+/**
+ * Created by Administrator on 2016/8/15 0015.
+ */
+public class MessageEvent {
+    private Object message;
+    private int type;
+
+    public MessageEvent(Object message, int type) {
+        this.message = message;
+        this.type = type;
+    }
+
+    public Object getMessage() {
+        return message;
+    }
+
+    public void setMessage(Object message) {
+        this.message = message;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+}

+ 13 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/di/CallingbedComponent.kt

@@ -0,0 +1,13 @@
+package com.wdkl.app.ncs.callingbed.di
+
+import com.wdkl.app.ncs.callingbed.activity.CallingbedActivity
+import com.wdkl.app.ncs.callingbed.fragment.MainFragment
+import com.wdkl.ncs.android.middleware.di.ApplicationComponent
+import dagger.Component
+
+@Component(dependencies = arrayOf(ApplicationComponent::class))
+interface CallingbedComponent {
+    fun inject(activity :CallingbedActivity)
+
+    fun inject(activity :MainFragment)
+}

+ 142 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/fragment/MainFragment.kt

@@ -0,0 +1,142 @@
+package com.wdkl.app.ncs.callingbed.fragment
+
+import android.content.Intent
+import android.util.Log
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.app.ncs.callingbed.R
+import com.wdkl.app.ncs.callingbed.activity.CallingbedActivity
+import com.wdkl.app.ncs.callingbed.common.Constant
+import com.wdkl.app.ncs.callingbed.common.MessageEvent
+import com.wdkl.app.ncs.callingbed.databinding.MainViewLayoutBinding
+import com.wdkl.app.ncs.callingbed.launch.CallingbedLaunch
+import com.wdkl.app.ncs.callingbed.net.NettyClient
+import com.wdkl.app.ncs.callingbed.sip.SipHelper
+//import com.wdkl.app.ncs.sip.activity.VoipAudioActivity
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.utils.debugLog
+import com.wdkl.ncs.android.lib.utils.errorLog
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.lib.utils.to
+import com.wdkl.ncs.android.lib.vo.filter
+import com.wdkl.ncs.android.middleware.logic.contract.callingbed.MainFragmentContract
+import com.wdkl.ncs.android.middleware.logic.presenter.callingbed.MainFragmentPresenter
+import kotlinx.android.synthetic.main.main_view_layout.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class MainFragment: BaseFragment<MainFragmentPresenter, MainViewLayoutBinding>(), MainFragmentContract.View{
+    val TAG = "MainFragment"
+
+    override fun getLayId(): Int {
+        return R.layout.main_view_layout
+    }
+
+    override fun bindDagger() {
+        CallingbedLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        //presenter.loadData();
+        NettyClient.getInstance().connect()
+    }
+
+    override fun bindEvent() {
+        debugLog(TAG,"bindEvent")
+        btn_start.setOnClickListener {
+            //startVoipAudio()
+            activity.to<CallingbedActivity>().sendCall(edit_sip_target.text.toString())
+        }
+
+        btn_end.setOnClickListener{
+            activity.to<CallingbedActivity>().endCall()
+        }
+    }
+
+    override fun onResume() {
+        EventBus.getDefault().register(this)
+        super.onResume()
+    }
+
+    override fun onPause() {
+        EventBus.getDefault().unregister(this)
+        super.onPause()
+    }
+
+    override fun destory() {
+        debugLog(TAG,"destory")
+    }
+
+    override fun showData(data: ArrayList<Any>) {
+        debugLog(TAG,"showData")
+    }
+
+    override fun onError(message: String, type: Int) {
+        getUtils().dismissDialog()
+        errorLog("error",message)
+        showMessage(message)
+    }
+
+    override fun complete(message: String, type: Int) {
+        getUtils().dismissDialog()
+    }
+
+    override fun start() {
+        getUtils().showDialog()
+    }
+
+    override fun networkMonitor(state: NetState) {
+        state.filter(onWifi = {
+
+        },onMobile = {
+
+        },offline = {
+
+        })
+    }
+
+    /*private fun startVoipAudio() {
+        val targetId = edit_sip_target.text.toString();
+        val intent = Intent(VoipAudioActivity.START_ACTION)
+        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        intent.putExtra("targetId", targetId)
+        intent.putExtra(VoipAudioActivity.ACTION, VoipAudioActivity.CALLING)
+        activity.to<Callingbed2Activity>().startToActivity(intent)
+    }*/
+
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        when (messageEvent.getType()) {
+            Constant.EVENT_SIP_CALL_STATUS -> {
+                if (messageEvent.message is Int) run {
+                    val status = messageEvent.message as Int
+                    Log.d("sip", "sip call status: " + status)
+
+                    when (status) {
+                        0 -> {
+                            //正在呼叫中:子机自动接通 isIncomingCall() = true  mState = 0  //正在通话中:isIncomingCall() = true
+                            //=============================================SIP自动接听===================================//
+                            Log.d("sip", "auto talking...")
+                            //正在通话中:isIncomingCall() = true
+                        }
+                        1 -> {
+                            //???
+                        }
+                        2 -> {
+                            //正在通话中:isIncomingCall() = true  mState = 2
+                            Log.d("sip", "in call...")
+                        }
+                        3 -> {
+                            //无人应答/挂断:isIncomingCall() = true  mState = 3
+                            Log.d("sip", "end call...")
+                        }
+                        else -> {
+                            //none
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 314 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/helper/NetHelper.java

@@ -0,0 +1,314 @@
+package com.wdkl.app.ncs.callingbed.helper;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+
+import com.wdkl.app.ncs.callingbed.common.MessageEvent;
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import static com.wdkl.app.ncs.callingbed.common.Constant.EVENT_INTERNETPING;
+
+public class NetHelper {
+    private Context mContext;
+    private WifiManager wifiManager;
+    private ConnectivityManager connManager;
+    private static NetHelper sInstance = null;
+
+    private static Timer timerNetStatus = null;
+    private static final int SCHEDULE_TIME = 30000;
+    public static boolean NetConn = false;
+
+    /**
+     * 以太网是否ping成功
+     */
+    public static final String ETHERNETSTATUS = "ethernetStatus";
+
+    public NetHelper() {
+    }
+
+    public static NetHelper getInstance() {
+        if (sInstance == null) {
+            synchronized (NetHelper.class) {
+                if (sInstance == null) {
+                    sInstance = new NetHelper();
+                }
+            }
+        }
+        return sInstance;
+    }
+
+    public void init(Context context) {
+        mContext = context;
+        wifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        connManager = (ConnectivityManager) mContext.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+    }
+
+    public static void startNetCheck() {
+        if (timerNetStatus != null) {
+            timerNetStatus.purge();
+        }
+        timerNetStatus = new Timer();
+        timerNetStatus.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                NetConn = ping(getLocalElement(3), 2, null);
+
+                EventBus.getDefault().post(new MessageEvent(ETHERNETSTATUS, EVENT_INTERNETPING));//循环检测SIP,以太网ping状态
+            }
+        }, 10, SCHEDULE_TIME);
+    }
+
+    /**
+     * ping 网络
+     *
+     * @param host
+     * @param pingCount
+     * @param stringBuffer
+     * @return
+     */
+    public static boolean ping(String host, int pingCount, StringBuffer stringBuffer) {
+        String line = null;
+        Process process = null;
+        BufferedReader successReader = null;
+        String command = "ping -c " + pingCount + " " + host;
+        boolean isSuccess = false;
+        try {
+            process = Runtime.getRuntime().exec(command);
+            if (process == null) {
+                append(stringBuffer, "ping fail:process is null.");
+                return false;
+            }
+            successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            while ((line = successReader.readLine()) != null) {
+                append(stringBuffer, line);
+            }
+            int status = process.waitFor();
+            if (status == 0) {
+                append(stringBuffer, "exec cmd success:" + command);
+                isSuccess = true;
+            } else {
+                append(stringBuffer, "exec cmd fail.");
+                isSuccess = false;
+            }
+            append(stringBuffer, "exec finished.");
+        } catch (IOException e) {
+        } catch (InterruptedException e) {
+        } finally {
+            if (process != null) {
+                process.destroy();
+            }
+            if (successReader != null) {
+                try {
+                    successReader.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+
+        return isSuccess;
+    }
+
+    private static void append(StringBuffer stringBuffer, String text) {
+        if (stringBuffer != null) {
+            stringBuffer.append(text + "\n");
+        }
+    }
+
+    /**
+     * 获取网关  Waderson
+     * <p>
+     * 1 WIFI情况下获取网关 2 有线网络下的DHCP模式连接 3 有线网络其他连接方式:比如静态ip、pppoe拨号、ipoe拨号等
+     */
+    public static String getLocalElement(int type) {
+        String e = "";
+        if (1 == type) {
+            //e = getLocalElementByWifi();
+        } else if (2 == type) {
+            e = getLocalElementByDhcp();
+        } else if (3 == type) {
+            e = getLocalElementByIp();
+        }
+        if (!TextUtils.isEmpty(e) && e.length() >= 11 && e.length() <= 15) {
+            return e;
+        } else {
+            return "192.168.101.1";
+        }
+    }
+
+
+    /**
+     * 有线网络下的DHCP模式连接
+     */
+    public static String getLocalElementByDhcp() {
+        BufferedReader bufferedReader = null;
+        String str2 = "";
+        String str3 = "getprop dhcp.eth0.gateway";
+        Process exec;
+        BufferedReader bufferedReader2 = null;
+        try {
+            exec = Runtime.getRuntime().exec(str3);
+            try {
+                bufferedReader2 = new BufferedReader(new InputStreamReader(exec.getInputStream()));
+            } catch (Throwable th3) {
+                if (bufferedReader != null) {
+                    bufferedReader.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+            }
+            try {
+                str3 = bufferedReader2.readLine();
+                if (str3 != null) {
+                    TextUtils.isEmpty(str3);
+                }
+                try {
+                    bufferedReader2.close();
+                } catch (IOException iOException222) {
+                    iOException222.printStackTrace();
+                }
+                if (exec != null) {
+                    try {
+                        exec.exitValue();
+                    } catch (Exception e5) {
+                    }
+                }
+            } catch (IOException e6) {
+                str3 = str2;
+                if (bufferedReader2 != null) {
+                    bufferedReader2.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+                return str3;
+            }
+        } catch (IOException e62) {
+            bufferedReader2 = null;
+            exec = null;
+            str3 = str2;
+            if (bufferedReader2 != null) {
+                try {
+                    bufferedReader2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+            return str3;
+        } catch (Throwable th4) {
+            exec = null;
+            if (bufferedReader != null) {
+                try {
+                    bufferedReader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+        }
+        return str3;
+    }
+
+    /**
+     * 有线网络其他连接方式:比如静态ip、pppoe拨号、ipoe拨号等
+     */
+    public static String getLocalElementByIp() {
+        BufferedReader bufferedReader = null;
+        String result = "";
+        String str2 = "";
+        String str3 = "ip route list table 0";
+        Process exec;
+        BufferedReader bufferedReader2 = null;
+        try {
+            exec = Runtime.getRuntime().exec(str3);
+            try {
+                bufferedReader2 = new BufferedReader(new InputStreamReader(exec.getInputStream()));
+            } catch (Throwable th3) {
+                if (bufferedReader != null) {
+                    bufferedReader.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+            }
+            try {
+                str2 = bufferedReader2.readLine();
+                if (str2 != null) {
+                    str2 = str2.trim();
+                    String[] strings = str2.split("\\s+");
+                    if (strings.length > 3) {
+                        result = strings[2];
+                    }
+                }
+                try {
+                    bufferedReader2.close();
+                } catch (IOException iOException222) {
+                    iOException222.printStackTrace();
+                }
+                if (exec != null) {
+                    try {
+                        exec.exitValue();
+                    } catch (Exception e5) {
+                    }
+                }
+            } catch (IOException e6) {
+                if (bufferedReader2 != null) {
+                    bufferedReader2.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+                return result;
+            }
+        } catch (IOException e62) {
+            bufferedReader2 = null;
+            exec = null;
+            if (bufferedReader2 != null) {
+                try {
+                    bufferedReader2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+            return result;
+        } catch (Throwable th4) {
+            exec = null;
+            if (bufferedReader != null) {
+                try {
+                    bufferedReader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+        }
+        return result;
+    }
+
+    public int getNetworkType() {
+        if (connManager != null && connManager.getActiveNetworkInfo() != null) {
+            return connManager.getActiveNetworkInfo().getType();
+        }
+
+        return -1;
+    }
+}

+ 20 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/launch/CallingbedLaunch.kt

@@ -0,0 +1,20 @@
+package com.wdkl.app.ncs.callingbed.launch
+
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.wdkl.app.ncs.callingbed.di.CallingbedComponent
+import com.wdkl.app.ncs.callingbed.di.DaggerCallingbedComponent
+import com.wdkl.ncs.android.lib.base.BaseLaunch
+import com.wdkl.ncs.android.middleware.di.DaggerManager
+
+@Router(path = "/callingbed/launch")
+class CallingbedLaunch :BaseLaunch() {
+    companion object {
+        lateinit var component: CallingbedComponent
+    }
+
+    override fun moduleInit() {
+        component = DaggerCallingbedComponent.builder()
+                .applicationComponent(DaggerManager.APPLICATION_COMPONENT)
+                .build()
+    }
+}

+ 16 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/ClientEncoder.java

@@ -0,0 +1,16 @@
+package com.wdkl.app.ncs.callingbed.net;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToByteEncoder;
+
+public class ClientEncoder extends MessageToByteEncoder<Object> {
+
+    private static final String TAG = "ClientEncoder";
+
+    @Override
+    protected void encode(ChannelHandlerContext channelHandlerContext, Object data, ByteBuf byteBuf) throws Exception {
+        //自己发送过来的东西进行编码
+        byteBuf.writeBytes(data.toString().getBytes());
+    }
+}

+ 47 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/ClientHandler.java

@@ -0,0 +1,47 @@
+package com.wdkl.app.ncs.callingbed.net;
+
+import android.util.Log;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+
+public class ClientHandler extends SimpleChannelInboundHandler<Object> {
+
+    private static final String TAG = "ClientHandler";
+
+    /**
+     * 当收到数据的回调
+     *
+     * @param channelHandlerContext 封装的连接对像
+     * @param o
+     * @throws Exception
+     */
+    @Override
+    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+
+    }
+
+    /**
+     * 与服务端连接成功的回调
+     *
+     * @param ctx
+     * @throws Exception
+     */
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        super.channelActive(ctx);
+        Log.d(TAG, "与服务端连接成功:" + ctx.toString());
+    }
+
+    /**
+     * 与服务端断开的回调
+     *
+     * @param ctx
+     * @throws Exception
+     */
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        super.channelInactive(ctx);
+        Log.d(TAG, "与服务端断开连接:" + ctx.toString());
+    }
+}

+ 14 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/DataBean.java

@@ -0,0 +1,14 @@
+package com.wdkl.app.ncs.callingbed.net;
+
+public class DataBean {
+
+    private String data;
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+}

+ 87 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/net/NettyClient.java

@@ -0,0 +1,87 @@
+package com.wdkl.app.ncs.callingbed.net;
+
+import android.util.Log;
+
+import java.net.InetSocketAddress;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelPipeline;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+
+public class NettyClient {
+
+    private static final String TAG = "NettyClient";
+    private final int PORT = 7010;
+    //连接的服务端ip地址
+    private final String IP = "192.168.101.129";
+    private static NettyClient nettyClient;
+    //与服务端的连接通道
+    private Channel channel;
+
+    public static NettyClient getInstance() {
+        if (nettyClient == null) {
+            nettyClient = new NettyClient();
+        }
+        return nettyClient;
+    }
+    /**
+     *需要在子线程中发起连接
+     */
+    private NettyClient() {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                connect();
+            }
+        }).start();
+    }
+
+    /**
+     * 获取与服务端的连接
+     */
+    public static Channel getChannel() {
+        if (nettyClient == null) {
+            return null;
+        }
+        return nettyClient.channel;
+    }
+
+    /**
+     * 连接服务端
+     */
+    public void connect() {
+        try {
+            NioEventLoopGroup group = new NioEventLoopGroup();
+            Bootstrap bootstrap = new Bootstrap()
+                    // 指定channel类型
+                    .channel(NioSocketChannel.class)
+                    // 指定EventLoopGroup
+                    .group(group)
+                    // 指定Handler
+                    .handler(new ChannelInitializer<SocketChannel>() {
+                        @Override
+                        protected void initChannel(SocketChannel socketChannel) throws Exception {
+                            ChannelPipeline pipeline = socketChannel.pipeline();
+                            //添加发送数据编码器
+                            pipeline.addLast(new ClientEncoder());
+                            //添加数据处理器
+                            pipeline.addLast(new ClientHandler());
+                        }
+                    });
+            // 连接到服务端
+            ChannelFuture channelFuture = bootstrap.connect(new InetSocketAddress(IP, PORT));
+            //获取连接通道
+            channel = channelFuture.sync().channel();
+            Log.e(TAG, "连接成功");
+        } catch (Exception e) {
+            Log.e(TAG, "连接失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+}

+ 579 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/sip/SipHelper.java

@@ -0,0 +1,579 @@
+package com.wdkl.app.ncs.callingbed.sip;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.util.Log;
+
+import com.vvsip.ansip.IVvsipService;
+import com.vvsip.ansip.IVvsipServiceListener;
+import com.vvsip.ansip.VvsipCall;
+import com.vvsip.ansip.VvsipService;
+import com.vvsip.ansip.VvsipServiceBinder;
+import com.vvsip.ansip.VvsipTask;
+import com.wdkl.app.ncs.callingbed.common.MessageEvent;
+import com.wdkl.app.ncs.callingbed.helper.NetHelper;
+
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.wdkl.app.ncs.callingbed.common.Constant.EVENT_SIP_REGISTER_STATUS;
+import static com.wdkl.app.ncs.callingbed.sip.SipStatus.REGISTERCOM;
+import static com.wdkl.app.ncs.callingbed.sip.SipStatus.REGISTERFAIL;
+import static com.wdkl.app.ncs.callingbed.sip.SipStatus.REGISTERING;
+import static com.vvsip.ansip.VvsipTask.EXOSIP_CALL_CLOSED;
+
+
+public class SipHelper {
+
+    private final static String SIP_IP_END = ":5060";
+
+    private static String sipIP = "";
+    private static String sipID = "";
+    private static String sipPWD = "";
+
+    /**
+     * Sip启动注册.
+     */
+    protected int mSipRegisterTime = 5000;
+    private Handler sipRegisterHandler = null;
+    private Runnable sipRegisterRunnable = null;
+
+    /**
+     * SIP信息
+     */
+    public static final String SipInfoTag = "SipInfo";
+    /**
+     * 电话呼叫对象
+     */
+    private List<VvsipCall> mVvsipCalls = null;
+
+
+    private static SipHelper sipHelper;
+
+    public Handler getSipRegisterHandler() {
+        return sipRegisterHandler;
+    }
+
+    public Runnable getSipRegisterRunnable() {
+        return sipRegisterRunnable;
+    }
+
+    public List<VvsipCall> getmVvsipCalls() {
+        return mVvsipCalls;
+    }
+
+    private IVvsipServiceListener sipListner;
+
+
+    private Context mContext;
+
+    public static SipHelper getInstance() {
+        if (sipHelper == null) {
+            synchronized (SipHelper.class) {
+                if (sipHelper == null) {
+                    sipHelper = new SipHelper();
+                }
+            }
+        }
+        return sipHelper;
+    }
+
+    /**
+     * Instantiates a new Sip register util.
+     */
+    private SipHelper() {
+        if (mVvsipCalls == null) {
+            mVvsipCalls = new ArrayList<VvsipCall>();
+        }
+
+        // Runnable exiting the splash screen and launching the menu
+        sipRegisterRunnable = new Runnable() {
+            public void run() {
+                isSuccessRegisterSip();
+            }
+        };
+
+        // Run the exitRunnable in in mSipRegisterTime ms
+        sipRegisterHandler = new Handler();
+
+        IVvsipService sipservice = VvsipService.getService();
+        if (sipservice != null) {
+            sipRegisterHandler.postDelayed(sipRegisterRunnable, 3000);
+            return;
+        }
+        sipRegisterHandler.postDelayed(sipRegisterRunnable, mSipRegisterTime);
+    }
+
+    public void initSip(Context context, String ip, String id, String pwd) {
+        mContext = context;
+        sipIP = ip;
+        sipID = id;
+        sipPWD = pwd;
+    }
+
+    public void setSipListner(IVvsipServiceListener listner) {
+        sipListner = listner;
+    }
+
+    /*public void addSipListner(IVvsipServiceListener listner) {
+        IVvsipService sipService = VvsipService.getService();
+        if (sipService != null && listner != null) {
+            sipService.addListener(listner);
+            Log.d("sip", "add sip listner");
+        }
+    }
+
+    public void removeSipListner(IVvsipServiceListener listner) {
+        IVvsipService sipService = VvsipService.getService();
+        if (sipService != null && listner != null) {
+            sipService.removeListener(listner);
+            Log.d("sip", "remove sip listner");
+        }
+    }*/
+
+    /**
+     * 检测Sip服务是否注册成功
+     */
+    public void isSuccessRegisterSip() {
+        VvsipTask vvsipTask = VvsipTask.getVvsipTask();
+        if (vvsipTask != null && VvsipTask.global_failure != 0) {
+            /**
+             * ==================================sip服务启动失败 ================================
+             */
+        }
+    }
+
+    /**
+     * 注销Sip服务
+     */
+    public void unRegisterSip() {
+        //LogUtil.i(SipInfoTag, "lifecycle // onDestroy");
+
+        IVvsipService sipservice = VvsipService.getService();
+        if (sipservice != null && sipListner != null) {
+            sipservice.removeListener(sipListner);
+        }
+
+        getSipServiceStartHandler().removeCallbacks(getSipServiceStartRunnable());
+        sipRegisterHandler.removeCallbacks(sipRegisterRunnable);
+        if (getSipServiceConnection() != null && isRegister) {
+            try {
+                mContext.unbindService(getSipServiceConnection());
+                setSipServiceConnection(null);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if (mVvsipCalls != null) {
+            mVvsipCalls.clear();
+            mVvsipCalls = null;
+        }
+
+        //Log.i(SipInfoTag, "lifecycle // onDestroy");
+    }
+
+    public static String sipStatus = "";
+
+    /**
+     * Sip信息获取
+     */
+    public void obtainSipInfo() {
+        if (sipStatus.equals(REGISTERCOM) && NetHelper.NetConn) {//sip注册成功并且以太网连上
+            return;
+        }
+        IVvsipService sipService = VvsipService.getService();
+        if (sipService != null && sipListner != null) {
+            //sipService.addListener(sipListner);
+            sipService.setMessageHandler(messageHandler);
+        } else {
+            //LogUtil.i(SipInfoTag, "lifecycle // _service==null");
+        }
+        sipRegister();
+        failUiRefreshSip();
+    }
+
+    private void failUiRefreshSip() {
+        if (!NetHelper.NetConn) {
+            sipStatus = REGISTERFAIL;
+            EventBus.getDefault().post(new MessageEvent(REGISTERFAIL, EVENT_SIP_REGISTER_STATUS));
+            if (mSipThread != null) {
+                mSipThread.interrupt();
+                mSipThread = null;
+            }
+            //LogUtil.e(SipInfoTag, "以太网断开,SIP UI状态刷新为失败");
+        }
+    }
+
+
+    /**
+     * Sip信息
+     */
+    private String sipinfo = "";
+    private static int handleCount = 0;
+    //Sip註冊次數
+    private CountDownTimer mCountDownAutoTimer;
+    @SuppressLint("HandlerLeak")
+    private Handler messageHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            //LogUtil.i("QASE", "handleMessage==" + " msg.obj==" + msg.obj.toString() + " msg.what==" + msg.what);
+            //LogUtil.i(SipInfoTag, "#" + msg.obj);
+            sipinfo = "" + msg.obj + sipinfo;
+            //LogUtil.i(SipInfoTag, "Sip信息" + sipinfo);
+
+            if (msg.what == 22) {//释放资源
+                //EventBus.getDefault().post(new MessageEvent(msg.what, EVENT_SIP_REGISTER_STATUS));
+            }
+
+            if (sipinfo.contains("200 OK")) {//注册成功
+                sipStatus = REGISTERCOM;
+                EventBus.getDefault().post(new MessageEvent(REGISTERCOM, EVENT_SIP_REGISTER_STATUS));
+                if (mSipThread != null) {
+                    mSipThread.interrupt();
+                    mSipThread = null;
+                }
+                if (msg.obj.toString().contains("408")) {//超时
+                    sipStatus = REGISTERFAIL;
+                    EventBus.getDefault().post(new MessageEvent(REGISTERFAIL, EVENT_SIP_REGISTER_STATUS));
+                    sipRegister();
+                }
+            } else {//注册失败
+                sipStatus = REGISTERFAIL;
+                EventBus.getDefault().post(new MessageEvent(REGISTERFAIL, EVENT_SIP_REGISTER_STATUS));
+                if (mSipThread != null) {
+                    mSipThread.interrupt();
+                    mSipThread = null;
+                }
+                sipRegister();
+            }
+            failUiRefreshSip();
+
+            if (msg.obj.toString().contains("autocall")) {
+                VvsipCall pCall = null;
+                //LogUtil.e(SipInfoTag, "onClick1");
+                for (VvsipCall _pCall : mVvsipCalls) {
+                    if (_pCall.cid > 0)
+                        //LogUtil.e(SipInfoTag, "state#" + _pCall.mState);
+                        if (_pCall.cid > 0 && _pCall.mState <= 2) {
+                            pCall = _pCall;
+                            break;
+                        }
+                }
+                //LogUtil.e(SipInfoTag, "onClick2");
+                if (pCall == null)
+                    return;
+                //LogUtil.e(SipInfoTag, "onClick3#" + pCall.mState);
+                IVvsipService _service = VvsipService.getService();
+                if (_service == null)
+                    return;
+                VvsipTask _vvsipTask = _service.getVvsipTask();
+                if (_vvsipTask == null)
+                    return;
+                pCall.stop();
+                _service.setSpeakerModeOff();
+            }
+        }
+    };
+
+    /**
+     * ====================Sip注册======================
+     */
+    private Thread mSipThread;
+
+    private static class SipThread extends Thread {
+        WeakReference<Activity> mThreadCallingBedActivity;
+
+        private SipThread(Activity activity) {
+            mThreadCallingBedActivity = new WeakReference<Activity>(activity);
+        }
+
+        @Override
+        public void run() {
+            super.run();
+            if (mThreadCallingBedActivity == null)
+                return;
+            if (mThreadCallingBedActivity.get() != null) {
+                IVvsipService sipService = VvsipService.getService();
+                try {
+                    if (sipService != null && !SipHelper.getInstance().sipinfo.contains("200 OK") && NetHelper.NetConn) {
+                        sipStatus = REGISTERING;
+                        EventBus.getDefault().post(new MessageEvent(REGISTERING, EVENT_SIP_REGISTER_STATUS));
+                        sipService.register(sipIP + SIP_IP_END, sipID, sipPWD);
+                        handleCount++;
+                        Log.e(SipInfoTag, "以太网连接,SIP UI状态刷新为注册中");
+                    } else if (sipService != null && SipHelper.getInstance().sipinfo.contains("200 OK")) {
+                        sipStatus = REGISTERCOM;
+                        EventBus.getDefault().post(new MessageEvent(REGISTERCOM, EVENT_SIP_REGISTER_STATUS));
+                    }
+                } catch (NullPointerException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    private void sipRegister() {
+        synchronized (this) {
+            mSipThread = new SipThread((Activity) mContext);
+            if (handleCount < 3) {
+                if (mCountDownAutoTimer == null) {
+                    mCountDownAutoTimer = new CountDownTimer(10000, 1000) {
+                        @Override
+                        public void onTick(long l) {
+                        }
+
+                        @Override
+                        public void onFinish() {
+                            handleCount = 0;
+                            if (mSipThread != null) {
+                                mSipThread.start();
+                            }
+                            if (mCountDownAutoTimer != null) {
+                                mCountDownAutoTimer.cancel();
+                                mCountDownAutoTimer = null;
+                            }
+                        }
+                    };
+                    mCountDownAutoTimer.start();
+                }
+                return;
+            } else {
+                if (mCountDownAutoTimer != null) {
+                    mCountDownAutoTimer.cancel();
+                    mCountDownAutoTimer = null;
+                }
+            }
+            if (handleCount == 0) {
+                mSipThread.start();
+            }
+        }
+    }
+
+
+    public void setmSipThread(Thread mSipThread) {
+        this.mSipThread = mSipThread;
+    }
+
+    public Thread getmSipThread() {
+        return mSipThread;
+    }
+
+    /**
+     * 开始通话
+     */
+    public void startCall(String sipUseName) {
+        IVvsipService sipService = VvsipService.getService();
+        if (sipService == null) return;
+        //----------------------------------------------携带呼叫列表转接床头机的Mac地址--------------------------------------------------//
+        sipService.initiateOutgoingCall(sipUseName, "");
+    }
+
+    /**
+     * 结束通话
+     */
+    public void endCall() {
+        VvsipCall call = null;
+        for (VvsipCall pCall : mVvsipCalls) {
+            if (pCall.cid > 0 && pCall.mState <= 2) {
+                call = pCall;
+                break;
+            }
+        }
+        if (call == null) return;
+        IVvsipService sipService = VvsipService.getService();
+        if (sipService == null) return;
+        VvsipTask sipTask = sipService.getVvsipTask();
+        if (sipTask == null) return;
+        VvsipService.getService().mainEndCall(EXOSIP_CALL_CLOSED);
+        call.stop();
+        sipService.setSpeakerModeOff();
+        sipService.stopPlayer();
+        sipService.setAudioNormalMode();
+    }
+
+    /**
+     * 添加一个电话呼叫对象
+     *
+     * @param call
+     */
+    public void addCallObject(final VvsipCall call) {
+        try {
+            if (call == null) {
+                return;
+            }
+
+            if (mVvsipCalls == null)
+                return;
+            mVvsipCalls.add(call);
+        } catch (Exception e) {
+            //LogUtil.e(SipInfoTag, "onNewVvsipCallEvent: " + e);
+        }
+    }
+
+    /**
+     * 移除一个电话呼叫对象
+     *
+     * @param call
+     */
+    public void removeCallObject(final VvsipCall call) {
+        try {
+            if (call == null) {
+                return;
+            }
+
+            // 4 crash detected here for 4.0.9 with mVvsipCalls=NULL
+            if (mVvsipCalls == null)
+                return;
+            mVvsipCalls.remove(call);
+        } catch (Exception e) {
+            //Log.e(SipInfoTag, "onRemoveVvsipCallEvent: " + e);
+        }
+    }
+
+    /**
+     * 自动接电话
+     */
+    public void autoTalking() {
+        if (mVvsipCalls == null) {
+            mVvsipCalls = new ArrayList<VvsipCall>();
+        }
+        for (VvsipCall _pCall : mVvsipCalls) {
+            if (_pCall.cid > 0 && _pCall.mState < 2 && _pCall.mIncomingCall) {
+                // ANSWER EXISTING CALL
+                int i = _pCall.answer(200, 1);
+              //LogUtil.d(SipInfoTag, "ANSWER EXISTING CALL");
+                IVvsipService _service = VvsipService.getService();
+                if (_service != null) {
+                    if (i >= 0) {
+                        _service.stopPlayer();
+                        _service.setSpeakerModeOff();
+                        _service.setAudioInCallMode();
+                    }
+                }
+                break;
+            }
+        }
+    }
+
+    public static boolean isServiceRunning(Context context, String className) {
+        boolean isRunning = false;
+        ActivityManager activityManager = (ActivityManager) context
+                .getSystemService(Context.ACTIVITY_SERVICE);
+        List<ActivityManager.RunningServiceInfo> serviceList = activityManager
+                .getRunningServices(30);
+
+        if (!(serviceList.size() > 0)) {
+            return false;
+        }
+
+        for (int i = 0; i < serviceList.size(); i++) {
+            if (serviceList.get(i).service.getClassName().equals(className) == true) {
+                isRunning = true;
+                break;
+            }
+        }
+        return isRunning;
+    }
+
+    /**
+     * #############################
+     * <p>
+     * Sip启动服务.
+     * <p>
+     * #############################
+     */
+    private static Handler sipServiceStartHandler = null;
+    private static Runnable sipServiceStartRunnable = null;
+    private static ServiceConnection sipServiceConnection;
+
+    public static Runnable getSipServiceStartRunnable() {
+        return sipServiceStartRunnable;
+    }
+
+    public static Handler getSipServiceStartHandler() {
+        return sipServiceStartHandler;
+    }
+
+    public static ServiceConnection getSipServiceConnection() {
+        return sipServiceConnection;
+    }
+
+    public static void setSipServiceConnection(ServiceConnection sipServiceConnections) {
+        sipServiceConnection = sipServiceConnections;
+    }
+
+    /**
+     * 启动服务
+     */
+    public static Boolean isRegister = false;//是否注册
+
+    public void sipStartService() {
+        sipServiceStartHandler = new Handler();
+
+        sipServiceStartRunnable = new Runnable() {
+            public void run() {
+                if (mContext == null) {
+                    sipServiceStartHandler.postDelayed(sipServiceStartRunnable, 1000);
+                    return;
+                }
+                Intent intent = new Intent(mContext.getApplicationContext(), VvsipService.class);
+                mContext.startService(intent);
+
+                sipServiceConnection = new ServiceConnection() {
+                    public void onServiceConnected(ComponentName name, IBinder service) {
+                        IVvsipService sipservice = ((VvsipServiceBinder) service).getService();
+                        if (sipservice != null && sipListner != null) {
+                            //LogUtil.i(SipInfoTag, "Connected!");
+                            sipservice.addListener(sipListner);
+                            SipHelper.getInstance().obtainSipInfo();//Sip信息获取
+                        }
+                    }
+
+                    public void onServiceDisconnected(ComponentName name) {
+                        //LogUtil.i(SipInfoTag, "Disconnected!");
+                    }
+                };
+
+                isRegister = mContext.bindService(intent, sipServiceConnection, Context.BIND_AUTO_CREATE);
+            }
+        };
+
+        sipServiceStartHandler.postDelayed(sipServiceStartRunnable, 0);
+    }
+
+    /**
+     * 用来解析错误代码
+     */
+    public static String analyseErrorCode(String errorCode) {
+        switch (errorCode) {
+            case "200":
+                return "成功";
+            case "408":
+                return "请求超时";
+            case "400":
+                return "服务器不支持请求的语法";
+            case "401":
+                return "未授权";
+            case "403":
+                return "服务器禁止请求";
+            case "404":
+                return "服务器找不到";
+            default:
+                return "未知错误";
+        }
+    }
+
+}

+ 17 - 0
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/sip/SipStatus.java

@@ -0,0 +1,17 @@
+package com.wdkl.app.ncs.callingbed.sip;
+
+public class SipStatus {
+    /**
+     * 注册中
+     */
+    public static final String REGISTERING = "register_ing";
+    /**
+     * 注册失败
+     */
+    public static final String REGISTERFAIL = "register_fail";
+    /**
+     * 注册完成
+     */
+    public static final String REGISTERCOM = "register_com";
+
+}

Разлика између датотеке није приказан због своје велике величине
+ 34 - 0
callingbed/src/main/res/drawable-v24/ic_launcher_foreground.xml


+ 170 - 0
callingbed/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillColor="#008577"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+</vector>

+ 5 - 0
callingbed/src/main/res/drawable/selector_main.xml

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

+ 220 - 0
callingbed/src/main/res/layout/callingbed_main_lay.xml

@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <!--<TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Hello World!"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/calling_data"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />-->
+
+        <include
+            android:id="@+id/activity_calling_bed_layout_title"
+            layout="@layout/view_title_layout"/>
+
+        <FrameLayout
+            android:id="@+id/callingbed_main_frame"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_below="@id/activity_calling_bed_layout_title"/>
+
+        <LinearLayout
+            android:id="@+id/bed_layout_ll_right_view"
+            android:layout_width="60dp"
+            android:layout_height="match_parent"
+            android:layout_below="@+id/activity_calling_bed_layout_title"
+            android:layout_alignParentRight="true"
+            android:background="@color/right_item_bg"
+            android:orientation="vertical"
+            android:visibility="gone">
+
+            <!--首页-->
+            <LinearLayout
+                android:id="@+id/right_ll_main_item"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@drawable/selector_main"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/right_tv_main_icon"
+                    android:layout_width="@dimen/right_view_height"
+                    android:layout_height="@dimen/right_view_height"
+                    android:layout_gravity="center"
+                    android:background="@mipmap/icon_main_normal" />
+
+                <TextView
+                    android:id="@+id/right_tv_main_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:text="首页"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/right_view_font_size"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+            <!--医嘱-->
+            <LinearLayout
+                android:id="@+id/right_ll_advice_item"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@drawable/selector_main"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/right_tv_medical_advice_icon"
+                    android:layout_width="@dimen/right_view_height"
+                    android:layout_height="@dimen/right_view_height"
+                    android:layout_gravity="center"
+                    android:background="@mipmap/icon_medical_advice_normal" />
+
+                <TextView
+                    android:id="@+id/right_tv_medical_advice_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:text="医嘱"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/right_view_font_size"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+            <!--费用查询-->
+            <LinearLayout
+                android:id="@+id/right_ll_cost_item"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@drawable/selector_main"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/right_tv_cost_icon"
+                    android:layout_width="@dimen/right_view_height"
+                    android:layout_height="@dimen/right_view_height"
+                    android:layout_gravity="center"
+                    android:background="@mipmap/icon_cost_normal" />
+
+                <TextView
+                    android:id="@+id/right_tv_cost_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:text="费用查询"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/right_view_font_size"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+            <!--呼叫陪护-->
+            <LinearLayout
+                android:id="@+id/right_ll_call_care_item"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@drawable/selector_main"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/right_tv_call_care_icon"
+                    android:layout_width="@dimen/right_view_height"
+                    android:layout_height="@dimen/right_view_height"
+                    android:layout_gravity="center"
+                    android:background="@mipmap/icon_care_normal" />
+
+                <TextView
+                    android:id="@+id/right_tv_call_care_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:text="呼叫陪护"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/right_view_font_size"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+            <!--请求增援-->
+            <LinearLayout
+                android:id="@+id/right_ll_support_item"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@drawable/selector_main"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/right_tv_support_icon"
+                    android:layout_width="@dimen/right_view_height"
+                    android:layout_height="@dimen/right_view_height"
+                    android:layout_gravity="center"
+                    android:background="@mipmap/icon_support_normal" />
+
+                <TextView
+                    android:id="@+id/right_tv_support_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:text="请求增援"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/right_view_font_size"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+            <!--系统设置-->
+            <LinearLayout
+                android:id="@+id/right_ll_settings_item"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="@drawable/selector_main"
+                android:gravity="center"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/right_tv_settings_icon"
+                    android:layout_width="@dimen/right_view_height"
+                    android:layout_height="@dimen/right_view_height"
+                    android:layout_gravity="center"
+                    android:background="@mipmap/icon_settings_normal" />
+
+                <TextView
+                    android:id="@+id/right_tv_settings_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="6dp"
+                    android:text="系统设置"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/right_view_font_size"
+                    android:textStyle="bold" />
+            </LinearLayout>
+        </LinearLayout>
+    </RelativeLayout>
+</layout>

+ 7 - 0
callingbed/src/main/res/layout/main_view2.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</android.support.constraint.ConstraintLayout>

+ 67 - 0
callingbed/src/main/res/layout/main_view_layout.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="20dp">
+
+    <!--<TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:text="Hello"
+        android:textSize="8sp"/>-->
+
+    <LinearLayout
+        android:id="@+id/ll_sip_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="本机SIP账号:"/>
+        <TextView
+            android:id="@+id/my_sip_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="10dp"
+            android:text="@string/local_sip"/>
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/ll_sip_target"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/ll_sip_name">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="被叫SIP账号:" />
+
+        <EditText
+            android:id="@+id/edit_sip_target"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/target_sip" />
+    </LinearLayout>
+
+
+    <Button
+        android:id="@+id/btn_start"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_below="@id/ll_sip_target"
+        android:text="呼叫"/>
+
+    <Button
+        android:id="@+id/btn_end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_below="@id/btn_start"
+        android:text="挂断" />
+
+</RelativeLayout>
+</layout>

+ 85 - 0
callingbed/src/main/res/layout/view_title_layout.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="42dp"
+    android:background="#3B97D6"
+    android:orientation="vertical">
+
+    <!--SIP状态图标-->
+    <TextView
+        android:id="@+id/view_title_layout_tv_point"
+        android:layout_width="12dp"
+        android:layout_height="12dp"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="20dp" />
+
+    <!--医院名称-->
+    <TextView
+        android:id="@+id/view_title_layout_tv_hospital_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="20dp"
+        android:layout_toRightOf="@+id/view_title_layout_tv_point"
+        android:text=""
+        android:textColor="@color/white"
+        android:textSize="@dimen/font_size_20" />
+
+    <!--日期时间-->
+    <TextView
+        android:id="@+id/view_title_layout_tv_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="5dp"
+        android:text="--"
+        android:textColor="@color/white"
+        android:textSize="@dimen/font_size_20" />
+
+    <!--设备号-->
+    <TextView
+        android:id="@+id/view_title_layout_tv_no"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="10dp"
+        android:layout_toLeftOf="@+id/view_title_layout_ll_right"
+        android:text=""
+        android:textColor="@color/white"
+        android:textSize="@dimen/font_size_20" />
+
+    <!--网络状态图标-->
+    <LinearLayout
+        android:id="@+id/view_title_layout_ll_right"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="20dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/view_title_layout_iv_current_trust"
+            android:layout_width="15dp"
+            android:layout_height="15dp"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="2dp"
+            android:layout_marginRight="2dp" />
+        <ImageView
+            android:id="@+id/view_title_layout_iv_ethernet"
+            android:layout_width="15dp"
+            android:layout_height="15dp"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="2dp"
+            android:layout_marginRight="2dp" />
+        <ImageView
+            android:id="@+id/view_title_layout_iv_wifi"
+            android:layout_width="15dp"
+            android:layout_height="15dp"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="2dp"
+            android:layout_marginRight="2dp" />
+
+    </LinearLayout>
+</RelativeLayout>

+ 5 - 0
callingbed/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

+ 5 - 0
callingbed/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

BIN
callingbed/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
callingbed/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
callingbed/src/main/res/mipmap-mdpi/ic_etherneted.png


BIN
callingbed/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
callingbed/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
callingbed/src/main/res/mipmap-mdpi/ic_no_ethernet.png


BIN
callingbed/src/main/res/mipmap-mdpi/ic_wifi_high.png


BIN
callingbed/src/main/res/mipmap-mdpi/ic_wifi_nor.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_care_normal.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_care_press.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_cost_normal.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_cost_press.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_main_normal.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_main_press.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_medical_advice_normal.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_medical_advice_press.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_settings_normal.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_settings_press.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_support_normal.png


BIN
callingbed/src/main/res/mipmap-mdpi/icon_support_press.png


BIN
callingbed/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
callingbed/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
callingbed/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
callingbed/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
callingbed/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
callingbed/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 91 - 0
callingbed/src/main/res/values/colors.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#008577</color>
+    <color name="colorPrimaryDark">#00574B</color>
+    <color name="colorAccent">#D81B60</color>
+
+    <color name="white">#ffffff</color>
+    <color name="text_black">#808080</color>
+
+    <color name="drawer_header_text">#2c2c2c</color>
+    <color name="black">#000000</color>
+    <color name="drawer_item_bg_p">#e8e8e8</color>
+    <color name="drawer_item_bg_n">#fffff9</color>
+    <color name="green">#00FF00</color>
+
+
+    <color name="content_color">#F3F3F3</color>
+    <color name="transparent">#00000000</color>
+    <!--title颜色-->
+    <color name="title_text_color">#43413f</color>
+    <!--Dialog线颜色-->
+    <color name="dialog_line_color">#e7e7e7</color>
+    <!--红色按钮颜色-->
+    <color name="button_color">#f57550</color>
+
+    <!-- 黄色颜色 -->
+    <color name="yellow_color">#f8c255</color>
+    <!-- 红色颜色 -->
+    <color name="red_color">#FFFD3B30</color>
+    <!--footbar Text-->
+    <color name="footbar_text_color">#7d7d7d</color>
+
+    <color name="zmcx_orange_color">#f29200</color>
+    <!--版本信息字体颜色-->
+    <color name="versioninfo_text_color">#666666</color>
+    <!--公共按钮-->
+    <color name="button_color_n">#e46546</color>
+    <color name="button_color_p">#f37556</color>
+    <!--吐槽字体颜色-->
+    <color name="tuskkomi_et_textcolor">#707070</color>
+    <!--搜索输入框颜色-->
+    <color name="search_et_bg_color">#d2d2d2</color>
+
+    <color name="black_text_color">#333333</color>
+    <color name="black_wlt_color">#666666</color>
+    <color name="gray_text_color">#999999</color>
+
+    <!--APP基本色调-->
+    <color name="app_base_color">#FFF27556</color>
+    <color name="register_text_color">#969696</color>
+
+    <!--sideLetterbar-->
+    <color name="gray">#8c8c8c</color>
+    <color name="gray_deep">#5c5c5c</color>
+    <color name="alpha_gray">#CC646464</color>
+    <color name="theme_gray">#646464</color>
+
+    <!--食安卫士信息-->
+    <color name="saws_tel_btn_color">#ffac51</color>
+    <color name="saws_message_btn_color">#f57550</color>
+    <color name="province_line_border">#B8B8B8</color>
+
+    <!--专题详情-->
+    <color name="special_bg">#FFF2F2F2</color>
+    <color name="sing_bg_color">#eeeeee</color>
+    <!--确认订单-->
+    <color name="duancode_line_color">#dbdbdb</color>
+
+    <!--关于我们-->
+    <color name="about_text_color">#58504e</color>
+
+    <!--产品详情-->
+    <color name="product_detail_rb_bg_color">#cbcbcb</color>
+    <color name="product_bottom_shopcar_bg_color">#d5d5d5</color>
+
+    <!--社区详情输入框-->
+    <color name="board_et_bg_color">#b9bbbe</color>
+
+    <!--删除color-->
+    <color name="delete_text_color">#0090ff</color>
+    <color name="version_background">#b0000000</color>
+
+
+    <!--cost list 列表中的颜色-->
+    <color name="cost_list_title">#C4C4C4</color>
+    <color name="cost_item">#F8F8F8</color>
+
+    <!--右侧菜单栏颜色-->
+    <color name="right_item_bg">#3CA2E0</color>
+    <color name="right_item_select">#B1DAF3</color>
+</resources>

+ 86 - 0
callingbed/src/main/res/values/dimens.xml

@@ -0,0 +1,86 @@
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+    <!-- ToolBar -->
+    <dimen name="toolbar_margin_top">0dp</dimen>
+    <dimen name="toolbar_height">56dp</dimen>
+    <dimen name="tab_bar_margin_top">56dp</dimen>
+
+
+    <dimen name="photo_margin_width">3dp</dimen>
+
+    <dimen name="padding_size10">20px</dimen>
+    <dimen name="padding_size20">40px</dimen>
+    <dimen name="padding_size15">30px</dimen>
+    <dimen name="padding_size5">10px</dimen>
+    <dimen name="foot_text_size">34px</dimen>
+    <dimen name="foot_text_size_dp">16dp</dimen>
+    <dimen name="product_text_size">36px</dimen>
+    <dimen name="foot_big_text_size">20dip</dimen>
+    <dimen name="small_text_size">30px</dimen>
+    <dimen name="small_text_size_dp">16dp</dimen>
+
+    <dimen name="min_small_text_size">28px</dimen>
+
+    <dimen name="side_letter_bar_letter_size">12sp</dimen>
+    <dimen name="side_letter_bar_width">30dp</dimen>
+    <dimen name="city_text_size">16sp</dimen>
+
+
+    <dimen name="padding_size">20px</dimen>
+    <dimen name="foot_drawable_padding">10px</dimen>
+    <dimen name="line_height">1dip</dimen>
+     <!--确认订单-->
+    <dimen name="input_hint_size">36px</dimen>
+    <dimen name="input_hint_size_dp">18dp</dimen>
+    <dimen name="input_padding_size">40px</dimen>
+    <dimen name="input_padding_size_42px">42px</dimen>
+    <dimen name="service_btn_height">30dip</dimen>
+    <dimen name="check_text_padding">15dip</dimen>
+    <dimen name="wlt_progress_info_text_size">12dip</dimen>
+    <dimen name="padding_size_dp">10dp</dimen>
+    <dimen name="padding_size_20px">22px</dimen>
+    <dimen name="foot_drawable_padding_dp">5dp</dimen>
+
+
+    <dimen name="address_text_length">128px</dimen>
+    <dimen name="login_top_length">80px</dimen>
+
+    <dimen name="tab_height">48dp</dimen>
+    
+    
+    <!--控件边距-->
+    <dimen name="margin_to_side_5">5dp</dimen>
+    <dimen name="margin_to_side_10">10dp</dimen>
+    <dimen name="margin_to_side_15">15dp</dimen>
+    <dimen name="margin_to_side_20">20dp</dimen>
+    <dimen name="margin_to_side_50">50dp</dimen>
+
+    <dimen name="right_view_height">20dp</dimen>
+    <dimen name="right_view_font_size">16sp</dimen>
+
+
+    <!--字体大小-->
+    <dimen name="font_size_10">10sp</dimen>
+    <dimen name="font_size_12">12sp</dimen>
+    <dimen name="font_size_14">14sp</dimen>
+    <dimen name="font_size_16">16sp</dimen>
+    <dimen name="font_size_18">18sp</dimen>
+    <dimen name="font_size_20">20sp</dimen>
+    <dimen name="font_size_23">23sp</dimen>
+    <dimen name="font_size_25">25sp</dimen>
+    <dimen name="font_size_28">28sp</dimen>
+    <dimen name="font_size_30">30sp</dimen>
+    <dimen name="font_size_35">35sp</dimen>
+    <dimen name="font_size_40">40sp</dimen>
+    <dimen name="font_size_45">45sp</dimen>
+    <dimen name="font_size_50">50sp</dimen>
+    <dimen name="font_size_55">55sp</dimen>
+    <dimen name="font_size_60">60sp</dimen>
+    <dimen name="font_size_65">65sp</dimen>
+    <dimen name="font_size_70">70sp</dimen>
+
+    <dimen name="font_size_nurse_level">34sp</dimen>
+
+</resources>

+ 5 - 0
callingbed/src/main/res/values/strings.xml

@@ -0,0 +1,5 @@
+<resources>
+    <string name="app_name">Callingbed</string>
+    <string name="local_sip">4000360960</string>
+    <string name="target_sip">4000348830</string>
+</resources>

+ 11 - 0
callingbed/src/main/res/values/styles.xml

@@ -0,0 +1,11 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+</resources>

+ 17 - 0
callingbed/src/test/java/com/wdkl/app/ncs/callingbed/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package com.wdkl.app.ncs.callingbed2
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

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

@@ -6,6 +6,8 @@ import android.databinding.DataBindingUtil
 import android.databinding.ViewDataBinding
 import android.os.Bundle
 import android.view.View
+import android.view.Window
+import android.view.WindowManager
 import android.view.inputmethod.InputMethodManager
 import com.enation.javashop.android.jrouter.JRouter
 import com.wdkl.ncs.android.lib.R
@@ -69,6 +71,11 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         }
         /**父类初始化*/
         super.onCreate(savedInstanceState)
+        //全屏显示
+        requestWindowFeature(Window.FEATURE_NO_TITLE)
+                window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                WindowManager.LayoutParams.FLAG_FULLSCREEN)
+
         /**执行生命周期监听*/
         lifeCycleDo(LIFE_CYCLE_CREATE)
         /**创建根视图*/

+ 8 - 0
common/src/main/code/com/wdkl/ncs/android/lib/utils/TimeHandle.kt

@@ -1,5 +1,6 @@
 package com.wdkl.ncs.android.lib.utils
 
+import java.text.SimpleDateFormat
 import java.util.*
 
 /**
@@ -59,4 +60,11 @@ object TimeHandle {
     fun getDay(time: Int): Int {
         return time / (60 * 60 * 24)
     }
+
+    //按指定格式获取当前日期时间
+    fun getDateTime(format: String): String {
+        val date = Date(System.currentTimeMillis())
+        val sdf = SimpleDateFormat(format)
+        return sdf.format(date)
+    }
 }

+ 1 - 1
common/src/main/res/values/styles.xml

@@ -6,7 +6,7 @@
         <item name="colorPrimaryDark">@color/black</item>
         <item name="colorAccent">@color/black</item>
         <item name="android:windowIsTranslucent">true</item>
-        <item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
+        <item name="windowNoTitle">true</item>
     </style>
     <style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
     </style>

+ 3 - 0
gradle.properties

@@ -19,3 +19,6 @@ systemProp.http.proxyPort=80
 org.gradle.daemon=true
 org.gradle.parallel=true
 org.gradle.configureondemand=true
+android.enableAapt2=false
+#android.useAndroidX=true
+#android.enableJetifier=true

+ 2 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/ApiManager.kt

@@ -132,6 +132,8 @@ object ApiManager {
 
         val API_HELLO :HelloApi by lazy { apiFactory.createService(HelloApi::class.java, urlManager.buyer)}
 
+        //5寸分机
+        val API_CALLINGBED2 :CallingbedApi by lazy { apiFactory.createService(CallingbedApi::class.java, urlManager.buyer) }
 
         /**
          * @author LDD

+ 12 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/CallingbedApi.kt

@@ -0,0 +1,12 @@
+package com.wdkl.ncs.android.middleware.api
+
+import io.reactivex.Observable
+import okhttp3.ResponseBody
+import retrofit2.http.GET
+import retrofit2.http.Path
+
+interface CallingbedApi {
+
+    @GET("/ncs/customer/{customer_id}")
+    fun getBedData(@Path("customer_id") customerId :Int): Observable<ResponseBody>
+}

+ 5 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApiProvides.kt

@@ -184,4 +184,9 @@ class ApiProvides {
     fun provideHelloApi():HelloApi{
         return ApiManager.API_HELLO
     }
+
+    @Provides
+    fun provideCallingbed2Api(): CallingbedApi {
+        return ApiManager.API_CALLINGBED2
+    }
 }

+ 2 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApplicationComponent.kt

@@ -138,4 +138,6 @@ interface ApplicationComponent {
     fun providePassportApi():PassportApi
 
     fun provideHelloApi(): HelloApi
+
+    fun provideCallingbedApi() :CallingbedApi
 }

+ 7 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/PresenterComponent.kt

@@ -1,5 +1,7 @@
 package com.wdkl.ncs.android.middleware.di
 
+import com.wdkl.ncs.android.middleware.logic.presenter.callingbed.CallingbedActivityPresenter
+import com.wdkl.ncs.android.middleware.logic.presenter.callingbed.MainFragmentPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.extra.ScanPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.hello.HelloActivityPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.hello.HelloListActivityPresenter
@@ -50,4 +52,9 @@ interface PresenterComponent {
     fun inject(presenter: HelloActivityPresenter)
 
     fun inject(presenter: HelloListActivityPresenter)
+
+    //5寸分机
+    fun inject(presenter: CallingbedActivityPresenter)
+
+    fun inject(presenter: MainFragmentPresenter)
 }

+ 16 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/callingbed/CallingbedActivityContract.kt

@@ -0,0 +1,16 @@
+package com.wdkl.ncs.android.middleware.logic.contract.callingbed
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.vo.CustomerInfoVO
+
+//定义接口
+interface CallingbedActivityContract {
+
+    interface View :BaseContract.BaseView {
+        fun showData(customInfo :CustomerInfoVO)
+    }
+
+    interface Presenter :BaseContract.BasePresenter {
+        fun loadData(bedId :Int)
+    }
+}

+ 17 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/callingbed/MainFragmentContract.kt

@@ -0,0 +1,17 @@
+package com.wdkl.ncs.android.middleware.logic.contract.callingbed
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+
+interface MainFragmentContract {
+
+    interface View : BaseContract.BaseView {
+
+        fun showData(data: ArrayList<Any>)
+    }
+
+    interface Presenter : BaseContract.BasePresenter {
+
+        fun loadData()
+
+    }
+}

+ 56 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/callingbed/CallingbedActivityPresenter.kt

@@ -0,0 +1,56 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.callingbed
+
+import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
+import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.google.gson.FieldNamingPolicy
+import com.google.gson.GsonBuilder
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.ConnectionObserver
+import com.wdkl.ncs.android.lib.utils.getJsonString
+import com.wdkl.ncs.android.middleware.api.CallingbedApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.callingbed.CallingbedActivityContract
+import com.wdkl.ncs.android.middleware.model.vo.CustomerInfoVO
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+class CallingbedActivityPresenter @Inject constructor() :RxPresenter<CallingbedActivityContract.View>(), CallingbedActivityContract.Presenter {
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    @Inject
+    protected lateinit var callingbed2Api: CallingbedApi
+
+    private val observer = object :ConnectionObserver<Any>() {
+        override fun onStartWithConnection() {
+            providerView().start()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete("")
+            providerView().showData(result as CustomerInfoVO)
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+    }
+
+    override fun loadData(bedId: Int) {
+        callingbed2Api.getBedData(bedId)
+                .map {
+                    var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                    var customerInfoVO = gson.fromJson(it.getJsonString(), CustomerInfoVO::class.java)
+
+                    return@map customerInfoVO
+                }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observer)
+    }
+}

+ 60 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/callingbed/MainFragmentPresenter.kt

@@ -0,0 +1,60 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.callingbed
+
+import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
+import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.api.ExtraApi
+import com.wdkl.ncs.android.middleware.api.PromotionApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.callingbed.MainFragmentContract
+import com.wdkl.ncs.android.middleware.model.*
+import io.reactivex.Observable
+import io.reactivex.disposables.Disposable
+import org.json.JSONArray
+import org.json.JSONObject
+import javax.inject.Inject
+
+class MainFragmentPresenter @Inject constructor() : RxPresenter<MainFragmentContract.View>(), MainFragmentContract.Presenter  {
+
+    /**
+     * @Name  observer
+     * @Type  ConnectionObserver
+     * @Note  数据监听者
+     */
+    private val observer = object : ConnectionObserver<ArrayList<Any>>() {
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: ArrayList<Any>, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            providerView().showData(result)
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+    }
+
+
+    /**
+     * @author LDD
+     * @From   HomeFragmentPresenter
+     * @Date   2018/1/19 下午6:28
+     * @Note   依赖注入初始化
+     */
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    override fun loadData() {
+        //
+    }
+
+}

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

@@ -0,0 +1,43 @@
+package com.wdkl.ncs.android.middleware.model.dos;
+
+public class NurseConfigDto {
+    private Integer id;
+
+    private Integer nurseLevel;
+
+    private Integer nurseConfig;
+
+    private String nurseConfigName;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getNurseLevel() {
+        return nurseLevel;
+    }
+
+    public void setNurseLevel(Integer nurseLevel) {
+        this.nurseLevel = nurseLevel;
+    }
+
+    public Integer getNurseConfig() {
+        return nurseConfig;
+    }
+
+    public void setNurseConfig(Integer nurseConfig) {
+        this.nurseConfig = nurseConfig;
+    }
+
+    public String getNurseConfigName() {
+        return nurseConfigName;
+    }
+
+    public void setNurseConfigName(String nurseConfigName) {
+        this.nurseConfigName = nurseConfigName;
+    }
+}

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

@@ -0,0 +1,326 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+import com.wdkl.ncs.android.middleware.model.dos.NurseConfigDto;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @program nc
+ * @description: 病人信息集合
+ * @author: Vothin
+ * @create: 2021/03/04 15:37
+ */
+
+public class CustomerInfoVO implements Serializable {
+
+    private Integer id;
+
+    private Integer customerId;
+
+    private Integer memberId;
+
+    private String named;
+
+    private Integer age;
+
+    private String ageUnit;
+
+    private String idType;
+
+    private String idNo;
+
+    private String cardNo;
+
+    private Integer status;
+
+    private Long inDate;
+
+    private Long outDate;
+
+    private String illnessDesc;
+
+    private Integer partId;
+
+    private Integer sex;
+
+    private String roleName;
+
+    private String nurseConfigName;
+
+    private String examinationGroupName;
+
+    private String examinationKeyName;
+
+    private String feeGroupName;
+
+    private String feeKeyName;
+
+    private Integer doctorMappingId;
+
+    private Integer nurseMappingId;
+
+    private Integer workerMappingId;
+
+    private Integer doctorId;
+
+    private Integer nurseId;
+
+    private Integer workerId;
+
+    private String doctorName;
+
+    private String nurseName;
+
+    private String workerName;
+
+    private List<NurseConfigDto> list;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getNamed() {
+        return named;
+    }
+
+    public void setNamed(String named) {
+        this.named = named;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public String getAgeUnit() {
+        return ageUnit;
+    }
+
+    public void setAgeUnit(String ageUnit) {
+        this.ageUnit = ageUnit;
+    }
+
+    public String getIdType() {
+        return idType;
+    }
+
+    public void setIdType(String idType) {
+        this.idType = idType;
+    }
+
+    public String getIdNo() {
+        return idNo;
+    }
+
+    public void setIdNo(String idNo) {
+        this.idNo = idNo;
+    }
+
+    public String getCardNo() {
+        return cardNo;
+    }
+
+    public void setCardNo(String cardNo) {
+        this.cardNo = cardNo;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Long getInDate() {
+        return inDate;
+    }
+
+    public void setInDate(Long inDate) {
+        this.inDate = inDate;
+    }
+
+    public Long getOutDate() {
+        return outDate;
+    }
+
+    public void setOutDate(Long outDate) {
+        this.outDate = outDate;
+    }
+
+    public String getIllnessDesc() {
+        return illnessDesc;
+    }
+
+    public void setIllnessDesc(String illnessDesc) {
+        this.illnessDesc = illnessDesc;
+    }
+
+    public Integer getPartId() {
+        return partId;
+    }
+
+    public void setPartId(Integer partId) {
+        this.partId = partId;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getDoctorName() {
+        return doctorName;
+    }
+
+    public void setDoctorName(String doctorName) {
+        this.doctorName = doctorName;
+    }
+
+    public String getNurseName() {
+        return nurseName;
+    }
+
+    public void setNurseName(String nurseName) {
+        this.nurseName = nurseName;
+    }
+
+    public String getWorkerName() {
+        return workerName;
+    }
+
+    public void setWorkerName(String workerName) {
+        this.workerName = workerName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getNurseConfigName() {
+        return nurseConfigName;
+    }
+
+    public void setNurseConfigName(String nurseConfigName) {
+        this.nurseConfigName = nurseConfigName;
+    }
+
+    public String getExaminationGroupName() {
+        return examinationGroupName;
+    }
+
+    public void setExaminationGroupName(String examinationGroupName) {
+        this.examinationGroupName = examinationGroupName;
+    }
+
+    public String getExaminationKeyName() {
+        return examinationKeyName;
+    }
+
+    public void setExaminationKeyName(String examinationKeyName) {
+        this.examinationKeyName = examinationKeyName;
+    }
+
+    public String getFeeGroupName() {
+        return feeGroupName;
+    }
+
+    public void setFeeGroupName(String feeGroupName) {
+        this.feeGroupName = feeGroupName;
+    }
+
+    public String getFeeKeyName() {
+        return feeKeyName;
+    }
+
+    public void setFeeKeyName(String feeKeyName) {
+        this.feeKeyName = feeKeyName;
+    }
+
+    public Integer getDoctorMappingId() {
+        return doctorMappingId;
+    }
+
+    public void setDoctorMappingId(Integer doctorMappingId) {
+        this.doctorMappingId = doctorMappingId;
+    }
+
+    public Integer getNurseMappingId() {
+        return nurseMappingId;
+    }
+
+    public void setNurseMappingId(Integer nurseMappingId) {
+        this.nurseMappingId = nurseMappingId;
+    }
+
+    public Integer getWorkerMappingId() {
+        return workerMappingId;
+    }
+
+    public void setWorkerMappingId(Integer workerMappingId) {
+        this.workerMappingId = workerMappingId;
+    }
+
+    public List<NurseConfigDto> getList() {
+        return list;
+    }
+
+    public void setList(List<NurseConfigDto> list) {
+        this.list = list;
+    }
+
+    public Integer getDoctorId() {
+        return doctorId;
+    }
+
+    public void setDoctorId(Integer doctorId) {
+        this.doctorId = doctorId;
+    }
+
+    public Integer getNurseId() {
+        return nurseId;
+    }
+
+    public void setNurseId(Integer nurseId) {
+        this.nurseId = nurseId;
+    }
+
+    public Integer getWorkerId() {
+        return workerId;
+    }
+
+    public void setWorkerId(Integer workerId) {
+        this.workerId = workerId;
+    }
+
+    public Integer getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(Integer customerId) {
+        this.customerId = customerId;
+    }
+
+    public Integer getMemberId() {
+        return memberId;
+    }
+
+    public void setMemberId(Integer memberId) {
+        this.memberId = memberId;
+    }
+}

BIN
resource/src/main/res/mipmap-hdpi/launcher.png


BIN
resource/src/main/res/mipmap-hdpi/welcome.png


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


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


BIN
resource/src/main/res/mipmap-xhdpi/launcher.png


BIN
resource/src/main/res/mipmap-xhdpi/welcome.png


BIN
resource/src/main/res/mipmap-xxhdpi/launcher.png


BIN
resource/src/main/res/mipmap-xxhdpi/welcome.png


+ 0 - 0
resource/src/main/res/mipmap-xxxhdpi/launcher.png


Неке датотеке нису приказане због велике количине промена