Jelajahi Sumber

android无线转换代码

weizhengliang 2 tahun lalu
induk
melakukan
e1ba7a72a3
100 mengubah file dengan 2654 tambahan dan 5820 penghapusan
  1. 48 105
      app/build.gradle
  2. TEMPAT SAMPAH
      app/libs/log4j-1.2.17.jar
  3. TEMPAT SAMPAH
      app/libs/smdt.jar
  4. 0 26
      app/src/androidTest/java/com/enation/javashop/android/ExampleInstrumentedTest.java
  5. 34 71
      app/src/main/AndroidManifest.xml
  6. 0 4
      app/src/main/assets/config.javashop
  7. 0 24
      app/src/main/code/com/wdkl/app/ncs/activity/SchemeActivity.kt
  8. 0 81
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  9. 69 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/Application.java
  10. 401 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/MainActivity.java
  11. 106 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/SerialPortActivity.java
  12. 69 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/SettingsActivity.java
  13. 21 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/common/Constants.java
  14. 33 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/receiver/NetworkConnectChangedReceiver.java
  15. 32 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/receiver/WdBootReceiver.java
  16. 29 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/EventBusModel.java
  17. 54 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/HexDecoder.java
  18. 26 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/HexEncoder.java
  19. 118 8
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java
  20. 41 64
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java
  21. 105 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/TcpClientHandler.java
  22. 24 47
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java
  23. 12 3
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpType.java
  24. 51 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/utils/AlarmMessageUtil.java
  25. 102 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/utils/AutoRebootUtil.java
  26. 368 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/utils/ByteUtil.java
  27. 174 157
      lcd_board/src/main/java/com/wdkl/lcd_board/helper/NetHelper.java
  28. 88 0
      app/src/main/java/com/wdkl/ncs/s433/transbox/utils/SettingConfig.java
  29. 30 0
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  30. 170 0
      app/src/main/res/drawable/ic_launcher_background.xml
  31. 107 0
      app/src/main/res/layout/activity_main.xml
  32. 0 63
      app/src/main/res/layout/notification_lay.xml
  33. 9 0
      app/src/main/res/layout/settings_activity.xml
  34. 5 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  35. 5 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  36. TEMPAT SAMPAH
      app/src/main/res/mipmap-hdpi/ic_launcher.webp
  37. TEMPAT SAMPAH
      app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  38. TEMPAT SAMPAH
      app/src/main/res/mipmap-mdpi/ic_launcher.webp
  39. TEMPAT SAMPAH
      app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  40. TEMPAT SAMPAH
      app/src/main/res/mipmap-xhdpi/ic_launcher.webp
  41. TEMPAT SAMPAH
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  42. TEMPAT SAMPAH
      app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  43. TEMPAT SAMPAH
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  44. TEMPAT SAMPAH
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  45. TEMPAT SAMPAH
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  46. 4 0
      app/src/main/res/values-night/colors.xml
  47. 16 0
      app/src/main/res/values-night/themes.xml
  48. 108 0
      app/src/main/res/values/arrays.xml
  49. 12 0
      app/src/main/res/values/colors.xml
  50. 30 0
      app/src/main/res/values/strings.xml
  51. 16 0
      app/src/main/res/values/themes.xml
  52. 13 0
      app/src/main/res/xml/backup_rules.xml
  53. 19 0
      app/src/main/res/xml/data_extraction_rules.xml
  54. 85 0
      app/src/main/res/xml/root_preferences.xml
  55. 0 17
      app/src/test/java/com/enation/javashop/android/ExampleUnitTest.java
  56. 20 122
      build.gradle
  57. 0 1
      common/.gitignore
  58. 0 291
      common/build.gradle
  59. TEMPAT SAMPAH
      common/libs/chinese2py.jar
  60. TEMPAT SAMPAH
      common/libs/toolkit.jar
  61. 0 17
      common/proguard-rules.pro
  62. 0 26
      common/src/androidTest/java/com/enation/javashop/android/lib/ExampleInstrumentedTest.java
  63. 0 18
      common/src/main/AndroidManifest.xml
  64. 0 156
      common/src/main/code/com/wdkl/ncs/android/lib/adapter/BaseDelegateAdapter.kt
  65. 0 114
      common/src/main/code/com/wdkl/ncs/android/lib/adapter/ListViewBaseAdapter.kt
  66. 0 171
      common/src/main/code/com/wdkl/ncs/android/lib/adapter/TextViewDelegateAdapter.kt
  67. 0 74
      common/src/main/code/com/wdkl/ncs/android/lib/adapter/VlayoutHolderAdapter.kt
  68. 0 322
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  69. 0 99
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseApplication.kt
  70. 0 84
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseContract.kt
  71. 0 32
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseControl.kt
  72. 0 274
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseFragment.kt
  73. 0 41
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseLaunch.kt
  74. 0 49
      common/src/main/code/com/wdkl/ncs/android/lib/base/DisposableManager.kt
  75. 0 384
      common/src/main/code/com/wdkl/ncs/android/lib/base/GalleryActivity.kt
  76. 0 136
      common/src/main/code/com/wdkl/ncs/android/lib/base/GalleryFragment.kt
  77. 0 81
      common/src/main/code/com/wdkl/ncs/android/lib/base/RxPresenter.kt
  78. 0 103
      common/src/main/code/com/wdkl/ncs/android/lib/bind/BaseBindingHelper.kt
  79. 0 97
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/ActivityLifeController.kt
  80. 0 67
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/Framework.kt
  81. 0 161
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/InstallResourceHelper.kt
  82. 0 75
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/JavaShopInstrumentationHook.java
  83. 0 269
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/ResourceManager.java
  84. 0 141
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/UnInstallResourceHelper.kt
  85. 0 68
      common/src/main/code/com/wdkl/ncs/android/lib/core/hack/AndroidHack.kt
  86. 0 23
      common/src/main/code/com/wdkl/ncs/android/lib/core/runtime/ClassNotFoundInterceptor.kt
  87. 0 136
      common/src/main/code/com/wdkl/ncs/android/lib/core/runtime/JavaShopActivityTask.kt
  88. 0 59
      common/src/main/code/com/wdkl/ncs/android/lib/core/split/ComponentManager.kt
  89. 0 36
      common/src/main/code/com/wdkl/ncs/android/lib/core/split/ComponentManagerImpl.kt
  90. 0 15
      common/src/main/code/com/wdkl/ncs/android/lib/jni/CommonJNI.kt
  91. 0 471
      common/src/main/code/com/wdkl/ncs/android/lib/utils/AppTool.kt
  92. 0 47
      common/src/main/code/com/wdkl/ncs/android/lib/utils/AutoClearHelper.kt
  93. 0 69
      common/src/main/code/com/wdkl/ncs/android/lib/utils/AutoClearValue.kt
  94. 0 53
      common/src/main/code/com/wdkl/ncs/android/lib/utils/BaseRecyclerViewHolder.kt
  95. 0 46
      common/src/main/code/com/wdkl/ncs/android/lib/utils/ChineseSortHelper.kt
  96. 0 169
      common/src/main/code/com/wdkl/ncs/android/lib/utils/ConnectionObserver.kt
  97. 0 66
      common/src/main/code/com/wdkl/ncs/android/lib/utils/ConnectionQualityMonitor.kt
  98. 0 374
      common/src/main/code/com/wdkl/ncs/android/lib/utils/Do.kt
  99. 0 113
      common/src/main/code/com/wdkl/ncs/android/lib/utils/EcodeHelper.kt
  100. 0 0
      common/src/main/code/com/wdkl/ncs/android/lib/utils/ExtendMethods.kt

+ 48 - 105
app/build.gradle

@@ -1,16 +1,23 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-apply plugin: 'kotlin-kapt'
-//apply plugin: 'com.enation.javashop.aspectjrt'
-
-kapt {
-    arguments {
-        arg("moduleName", project.getName())
-    }
+plugins {
+    id 'com.android.application'
 }
 android {
-    // wuyq add for sign begin
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    buildToolsVersion rootProject.ext.build_tools_version
+
+    defaultConfig {
+        applicationId "com.wdkl.ncs.s433.transbox"
+        minSdkVersion rootProject.ext.minSdkVersion
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode rootProject.ext.versionCode
+        versionName rootProject.ext.versionName
+
+        ndk {
+            //选择要添加的对应cpu类型的.so库。
+            abiFilters 'armeabi-v7a', 'armeabi-v8a', 'armeabi-v8a'
+        }
+    }
+
     signingConfigs {
         release {
             storeFile file("keystore_wuyuqing_3128/rk3128.jks")
@@ -25,121 +32,57 @@ android {
             keyPassword "111111"
         }
     }
-    // wuyq add for sign end
-
-    compileSdkVersion target_sdk_version
-    buildToolsVersion build_tools_version
-    aaptOptions.cruncherEnabled = false
-    aaptOptions.useNewCruncher = false
-    aaptOptions.noCompress("mp3","wav")
-
-    defaultConfig {
-        applicationId "com.wdkl.app.ncs.lcd_board"
-        minSdkVersion min_sdk_version
-        targetSdkVersion target_sdk_version
-        versionCode app_version_code
-        versionName app_version
-        multiDexEnabled true
-        dataBinding {
-            enabled = true
-        }
-    }
 
     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'
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
-    sourceSets {
-        main.java.srcDirs += 'src/main/code'
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
+
     lintOptions{
         checkReleaseBuilds false
         abortOnError false
     }
-    dexOptions {
-
-        javaMaxHeapSize "4g"
-
-        jumboMode=true
 
-        preDexLibraries=true
-
-        threadCount=8
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
+    aaptOptions {
+        noCompress "ttc", "mp3", "apk"  //表示不让aapt压缩的文件后缀
     }
 }
 
 dependencies {
-    //compile fileTree(include: ['*.jar'], dir: 'libs')
-    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
-        exclude group: 'com.android.support', module: 'support-annotations'
-    })
-    /**
-     * 单元测试
-     */
-    testCompile 'junit:junit:4.12'
-    /**
-     * Dagger编译依赖
-     */
-    kapt 'com.google.dagger:dagger-compiler:2.7'
-    /**
-     * 内存泄漏监控
-     */
-    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'
-    /**
-     * Kotlin依赖
-     */
-    kapt 'com.android.databinding:compiler:2.3.3'
-    /**
-     * 路由注解处理器
-     */
-    kapt "com.enation.geamtear:jrouter-compiler:$router_version"
-    /**
-     * 外部化Moudle配置
-     * moudle独立编译配置
-     */
-    if (!componentTag) {
-        compile project(':welcome') // ===> 开始模块  建议在模块内添加广告 欢迎页 等页面
-        //compile project(':home')   // ===> 主页模块  里面一般是App的首页 分类楼层页面
-        //compile project(':shop')      // ===> 店铺模块 店铺列表 详细 等
-        //compile project(':setting')   // ===> 设置模块 设置 缓存 App分享等
-        compile project(':extra')    // ===> 额外的一些页面 比如二维码扫描等一些附加功能
-        compile project(':lcd_board')
-    }
+    implementation 'androidx.appcompat:appcompat:1.3.0'
+    implementation 'com.google.android.material:material:1.4.0'
+    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+    implementation 'androidx.preference:preference:1.1.1'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+    implementation 'org.apache.commons:commons-text:1.6'
+
     /**
-     * JavaShopAndroid 中间件依赖库
+     * netty
      */
-    compile project(':middleware')
+    implementation 'io.netty:netty-all:4.1.42.Final'
+
+    implementation 'org.greenrobot:eventbus:3.0.0'
+
+    implementation 'com.github.anrwatchdog:anrwatchdog:1.3.0'
+
+    implementation project(':serialport')
 
     /**
-     *  constraint-layout布局依赖
+     * json
      */
-    compile 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
+    implementation 'com.alibaba:fastjson:1.2.23'
 
-}
+    implementation files('libs/log4j-1.2.17.jar')
 
-///**
-// * kawo组件化框架配置
-// */
-//kawo {
-//    /**
-//     * Aop注解排除Jar
-//     */
-//    aspectExcludeJarFilter 'com.enation.geamtear.pay','AlipaySdk'
-//}
-//
+    //志合api
+    implementation files('libs/smdt.jar')
+
+}
 

TEMPAT SAMPAH
app/libs/log4j-1.2.17.jar


TEMPAT SAMPAH
app/libs/smdt.jar


+ 0 - 26
app/src/androidTest/java/com/enation/javashop/android/ExampleInstrumentedTest.java

@@ -1,26 +0,0 @@
-package com.enation.javashop.android;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
-    @Test
-    public void useAppContext() throws Exception {
-        // Context of the app under test.
-        Context appContext = InstrumentationRegistry.getTargetContext();
-
-        assertEquals("com.enation.javashop.android", appContext.getPackageName());
-    }
-}

+ 34 - 71
app/src/main/AndroidManifest.xml

@@ -1,88 +1,51 @@
 <?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">
-    <!--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"/>
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    package="com.wdkl.ncs.s433.transbox">
+
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 允许程序改变网络链接状态 -->
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序访问访问WIFI网络状态信息 -->
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-    <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.WRITE_SETTINGS" />
 
-    <uses-permission android:name ="android.permission.WAKE_LOCK" />
-    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+
     <application
+        android:name="com.wdkl.ncs.s433.transbox.Application"
         android:allowBackup="true"
-        android:icon="@drawable/ic_lcd_board"
-        android:label="@string/javashop_app_name"
+        android:fullBackupContent="@xml/backup_rules"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        tools:replace="android:label"
-        tools:remove="android:requestLegacyExternalStorage"
-        android:networkSecurityConfig="@xml/network_security_config"
-        android:name="com.wdkl.app.ncs.application.Application"
-        android:theme="@style/MyAppTheme">
-        <meta-data
-            android:name="com.enation.javashop.imagepluin.cache.MyGlideModule"
-            android:value="GlideModule" />
-        <meta-data
-            android:name="design_width_in_dp"
-            android:value="1280"/>
-        <meta-data
-            android:name="design_height_in_dp"
-            android:value="240"/>
-
-        <activity android:name="com.wdkl.ncs.android.component.welcome.activity.WelcomeActivity"
-            android:launchMode="singleInstance"
-            android:screenOrientation="landscape">
+        android:theme="@style/Theme.LoraGateway"
+        tools:targetApi="31">
+        <activity
+            android:name="com.wdkl.ncs.s433.transbox.SettingsActivity"
+            android:exported="false"
+            android:label="@string/title_activity_settings" />
+        <activity
+            android:name="com.wdkl.ncs.s433.transbox.MainActivity"
+            android:label="@string/title_activity_main"
+            android:exported="true">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
+                <action android:name="android.intent.action.MAIN" />
 
-                <category android:name="android.intent.category.LAUNCHER"/>
+                <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
 
-        <activity android:name="com.wdkl.app.ncs.activity.SchemeActivity">
-
-            <!-- Schame -->
-            <intent-filter>
-                <data
-                    android:host="m.wdkl.com"
-                    android:scheme="wdkl"/>
-
-                <action android:name="android.intent.action.VIEW"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.BROWSABLE"/>
+        <receiver
+            android:name=".receiver.WdBootReceiver"
+            android:enabled="true"
+            android:exported="true">
+            <intent-filter android:priority="1000">
+                <action android:name="android.intent.action.BOOT_COMPLETED"/>
             </intent-filter>
-
-            <!-- App Links -->
-            <intent-filter android:autoVerify="true">
-                <action android:name="android.intent.action.VIEW"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.BROWSABLE"/>
-
-                <data
-                    android:host="m.wdkl.com"
-                    android:scheme="http"/>
-                <data
-                    android:host="m.wdkl.com"
-                    android:scheme="https"/>
-            </intent-filter>
-        </activity>
-        <meta-data
-            android:name="android.max_aspect"
-            android:value="2.2" />
+        </receiver>
     </application>
 
 </manifest>

+ 0 - 4
app/src/main/assets/config.javashop

@@ -1,4 +0,0 @@
-{
-    "TestMode" : false ,
-    "TestPath" : "/order/create"
-}

+ 0 - 24
app/src/main/code/com/wdkl/app/ncs/activity/SchemeActivity.kt

@@ -1,24 +0,0 @@
-package com.wdkl.app.ncs.activity
-
-import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-import com.enation.javashop.android.jrouter.JRouter
-import com.enation.javashop.android.jrouter.logic.datainfo.Postcard
-import com.enation.javashop.android.jrouter.logic.listener.NavListener
-
-/**
- * Created by LDD on 2017/9/10.
- */
-class SchemeActivity:AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        val uri = intent.data
-        JRouter.prepare().create(uri).seek(this,object:NavListener(){
-            override fun onArrival(postcard: Postcard?) {
-                finish()
-            }
-        })
-    }
-
-}

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

@@ -1,81 +0,0 @@
-package com.wdkl.app.ncs.application
-
-import com.enation.javashop.android.jrouter.JRouter
-import com.wdkl.ncs.android.lib.base.BaseApplication
-import com.enation.javashop.net.engine.config.NetEngineConfig
-import com.enation.javashop.net.engine.plugin.exception.RestfulExceptionInterceptor
-import com.enation.javashop.utils.base.config.BaseConfig
-import com.wdkl.lcd_board.helper.AnrFcExceptionUtil
-import com.wdkl.lcd_board.helper.NetHelper
-
-/**
- * @author LDD
- * @Date   2018/1/11 下午12:48
- * @From   com.enation.javashop.android.application
- * @Note   应用Application
- */
-class Application : BaseApplication() {
-
-
-    /**
-     * @author LDD
-     * @From   Application
-     * @Date   2018/1/11 下午12:50
-     * @Note   应用启动时调用
-     */
-    override fun onCreate() {
-        super.onCreate()
-        initRouter()
-        initFrame()
-        initLeaks()
-    }
-
-    /**
-     * @author  LDD
-     * @From    Application
-     * @Date   2018/1/11 下午12:50
-     * @Note   初始化路由
-     * @return rx观察者
-     */
-    private fun initRouter() {
-        JRouter.init(this)
-        JRouter.openDebug()
-        JRouter.openLog()
-        JRouter.prepare().create("/welcome/launch").seek()
-        JRouter.prepare().create("/extra/launch").seek()
-        JRouter.prepare().create("/lcd_board/launch").seek()
-    }
-
-    /**
-     * @author  LDD
-     * @From    Application
-     * @Date   2018/1/11 下午12:50
-     * @Note   初始化内存检测器
-     * @return rx观察者
-     */
-    private fun initLeaks() {
-
-    }
-
-    /**
-     * @author  LDD
-     * @From    Application
-     * @Date   2018/1/11 下午12:50
-     * @Note   初始化内部框架
-     * @return rx观察者
-     */
-    private fun initFrame() {
-        //禁止滑掉退出
-        BaseConfig.getInstance().addActivity("MainActivity", "AppUpdateActivity", "WelcomeActivity")
-
-        NetEngineConfig.init(baseContext)
-                .openLogger()
-                .addNetInterceptor(RestfulExceptionInterceptor())
-
-        //init
-        NetHelper.getInstance().init()
-
-        //anr catcher
-        AnrFcExceptionUtil.getInstance(this).initFCException()
-    }
-}

+ 69 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/Application.java

@@ -0,0 +1,69 @@
+package com.wdkl.ncs.s433.transbox;
+
+import android.content.Context;
+import android.serialport.SerialPort;
+import android.serialport.SerialPortFinder;
+import android.util.Log;
+
+import com.wdkl.ncs.s433.transbox.utils.SettingConfig;
+
+import java.io.IOException;
+import java.security.InvalidParameterException;
+
+public class Application extends android.app.Application {
+
+    public SerialPortFinder mSerialPortFinder = new SerialPortFinder();
+    private SerialPort mSerialPort = null;
+
+    private static Context context;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        context = getApplicationContext();
+    }
+
+    /**
+     * 获取全局上下文
+     */
+    public static Context getContext() {
+        return context;
+    }
+
+    public SerialPort getSerialPort()
+            throws SecurityException, IOException, InvalidParameterException {
+        if (mSerialPort == null) {
+            /* Read serial port parameters */
+            String path = SettingConfig.getSerialDevicePath(context);
+            Log.i("Application", "getSerialPort: " + path);
+            int baudrate = SettingConfig.getBaudRate(context);
+            int parity = SettingConfig.getParity(context);
+            int dataBits = SettingConfig.getDataBits(context);
+            int stopBits = SettingConfig.getStopBits(context);
+            /* Check parameters */
+            if ((path.length() == 0) || (baudrate == -1)) {
+                throw new InvalidParameterException();
+            }
+
+            /* Open the serial port */
+            //mSerialPort = new SerialPort(new File(path), baudrate, 0);
+
+            SerialPort serialPort = SerialPort //
+                    .newBuilder(path, baudrate) // 串口地址地址,波特率
+                    .parity(parity) // 校验位;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN)
+                    .dataBits(dataBits) // 数据位,默认8;可选值为5~8
+                    .stopBits(stopBits) // 停止位,默认1;1:1位停止位;2:2位停止位
+                    .build();
+
+            mSerialPort = serialPort;
+        }
+        return mSerialPort;
+    }
+
+    public void closeSerialPort() {
+        if (mSerialPort != null) {
+            mSerialPort.close();
+            mSerialPort = null;
+        }
+    }
+}

+ 401 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/MainActivity.java

@@ -0,0 +1,401 @@
+package com.wdkl.ncs.s433.transbox;
+
+import android.app.smdt.SmdtManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkRequest;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceManager;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.wdkl.ncs.s433.transbox.common.Constants;
+import com.wdkl.ncs.s433.transbox.receiver.NetworkConnectChangedReceiver;
+import com.wdkl.ncs.s433.transbox.tcp.EventBusModel;
+import com.wdkl.ncs.s433.transbox.tcp.TcpAction;
+import com.wdkl.ncs.s433.transbox.tcp.TcpClient;
+import com.wdkl.ncs.s433.transbox.tcp.TcpModel;
+import com.wdkl.ncs.s433.transbox.tcp.TcpType;
+import com.wdkl.ncs.s433.transbox.utils.AlarmMessageUtil;
+import com.wdkl.ncs.s433.transbox.utils.AutoRebootUtil;
+import com.wdkl.ncs.s433.transbox.utils.NetUtil;
+import com.wdkl.ncs.s433.transbox.utils.SettingConfig;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+
+public class MainActivity extends SerialPortActivity  {
+    String TAG = "MainActivity";
+    EditText mReception;
+    ConnectivityManager connectivityManager;
+    private SmdtManager smdtManager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        //注册EventBus
+        EventBus.getDefault().register(this);
+        mReception = (EditText) findViewById(R.id.EditTextReception);
+        final Button buttonSetup = (Button) findViewById(R.id.ButtonSetup);
+        buttonSetup.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+//                openNetworkDebug();
+                startActivity(new Intent(MainActivity.this, SettingsActivity.class));
+            }
+        });
+        final Button rebootAppButton = (Button) findViewById(R.id.RebootApp);
+        rebootAppButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                AutoRebootUtil.restartApp();
+            }
+        });
+
+        smdtManager = SmdtManager.create(this);
+
+        this.init();
+//        this.initReceive();
+        NetworkRequest.Builder builder = new NetworkRequest.Builder();
+        NetworkRequest request = builder.build();
+        connectivityManager =(ConnectivityManager) getApplication().getApplicationContext().getSystemService(CONNECTIVITY_SERVICE);
+        connectivityManager.registerNetworkCallback(request,callback);
+    }
+
+    private void init() {
+        TextView settingInfo = (TextView) findViewById(R.id.setttingInfo);
+        StringBuilder sb = new StringBuilder();
+        Context context = getApplicationContext();
+        String path = SettingConfig.getSerialDevicePath(context);
+        Log.i("Application", "getSerialPort: " + path);
+        int baudrate = SettingConfig.getBaudRate(context);
+        int parity = SettingConfig.getParity(context);
+        int dataBits = SettingConfig.getDataBits(context);
+        int stopBits = SettingConfig.getStopBits(context);
+        String tcpServer = SettingConfig.getTcpServer(context);
+        Integer tcpServerPort = SettingConfig.getTcpServerPort(context);
+        Constants.MAC_ADDR = NetUtil.getInstance().getMacAddress();
+        String localIP = NetUtil.getInstance().getLocalIP();
+        sb.append("串口号:" + path + "\n");
+        sb.append("波特率:" + baudrate + "\n");
+        sb.append("校验位:" + parity + "\n");
+        sb.append("数据位:" + dataBits + "\n");
+        sb.append("停止位:" + stopBits + "\n");
+        sb.append("服务器地址:" + tcpServer + "\n");
+        sb.append("服务器端口:" + tcpServerPort + "\n");
+        sb.append("本机MAC地址:" + Constants.MAC_ADDR + "\n");
+        sb.append("本机IP地址:" + localIP + "\n");
+        settingInfo.setText(sb.toString());
+        Log.e(TAG, "init: "+ localIP);
+        TextView tcpstatus = (TextView) findViewById(R.id.serialStatus);
+        if (Constants.SERIAL_PORT_STATUS) {
+            tcpstatus.setText("正常");
+            tcpstatus.setTextColor(getResources().getColor(R.color.green));
+        } else {
+            tcpstatus.setText(Constants.SERIAL_PORT_FAIL_RESON);
+            tcpstatus.setTextColor(getResources().getColor(R.color.red));
+        }
+        //初始化tcp
+        if (Constants.NET_WORK_AVAILABLE) {
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(!TcpClient.getInstance().isRunning()) {
+                        TcpClient.getInstance().init(tcpServer, tcpServerPort, 60);
+                    }else{
+                        TcpClient.getInstance().doConnect();
+                    }
+                }
+            }).start();
+        }
+
+
+        //默认打开网络调试
+        openNetworkDebug();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        EventBus.getDefault().unregister(this);
+        connectivityManager.unregisterNetworkCallback(callback);
+//        unregisterReceiver(networkConnectChangedReceiver);
+    }
+
+    @Override
+    protected void onDataReceived(byte[] buffer, int size) {
+        runOnUiThread(new Runnable() {
+            public void run() {
+                if (mReception != null) {
+                    byte[] bytes = Arrays.copyOfRange(buffer, 0, size);
+                    String receiveData = bytesToHex(bytes);
+                    String receiveString = new String(bytes, 0, size);
+                    Log.e("Application", "receiveData: " + receiveData);
+                    if (receiveString.contains("\r") || receiveString.contains("\n")) {
+                        Log.e("Application", "有回车键: ");
+                    }
+                    /*if (receiveData.startsWith("fe")) {
+                        byte[] cardCode = ArrayUtils.subarray(bytes, 5, 9);
+                        //小端字节顺序,需要将数组反转
+                        ArrayUtils.reverse(cardCode);
+                        String hex = bytesToHex(cardCode);
+                        String s = String.format("%010d", Integer.valueOf(hex, 16));
+                        Log.e("Application", "s: " + s);
+                        Log.e("Application", "receiveString: " + receiveString);
+                        Log.e("Application", "receiveData: " + receiveData);
+                    }
+
+                    if (receiveData.startsWith("fd") && receiveData.endsWith("df")) {
+                        String mac = receiveData.substring(2,  receiveData.indexOf("df"));
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        mReception.append(sdf.format(new Date()) + " 收到数据:" + mac + "\n");
+                        //发送tcp消息
+                        if (TcpClient.getInstance().isRunning()) {
+                            TcpClient.getInstance().sendMsg(AlarmMessageUtil.getAlarmMessage(mac));
+                        }
+
+                    }*/
+
+                }
+            }
+        });
+    }
+
+    private void openNetworkDebug() {
+        try {
+            Process p = Runtime.getRuntime().exec("su");
+            OutputStream op = p.getOutputStream();
+            DataOutputStream os = new DataOutputStream(op);
+//            os.writeBytes("/system/bin/sh\n");
+            os.writeBytes("setprop service.adb.tcp.port 5555\n");
+            os.writeBytes("stop adbd\n");
+            os.writeBytes("start adbd\n");
+            os.writeBytes("exit\n");
+            os.flush();
+            os.close();
+            op.close();
+            Log.i("openNetworkDebug", "打开调试:---- ");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private String bytesToHex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+
+    }
+
+    /**
+     * NFC 读取卡号
+     *
+     * @param bytes
+     * @return
+     */
+    private String bytesToKeyCode(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%c", b));
+        }
+        return sb.toString();
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void onMoonEvent(EventBusModel eventBusModel) {
+        switch (eventBusModel.getMsgType()) {
+            case Constants.EVENT_TCP_STATE: {
+                updateTcpStatus();
+                break;
+            }
+            case Constants.NET_WORK_STATUS_CHANGE: {
+                if ((int) eventBusModel.getMsg() > -1) {
+                    this.init();
+                }
+                break;
+            }
+            case  Constants.NET_WORK_AVAILABLE_CHANGE:{
+                Log.e("TAG", "onMoonEvent: "+(boolean) eventBusModel.getMsg());
+                if((boolean) eventBusModel.getMsg()){
+                    this.init();
+                }else{
+                    if (TcpClient.getInstance().isRunning()){
+                        TcpClient.getInstance().closeClient();
+                    }
+                }
+                break;
+            }
+
+            case Constants.EVENT_TCP_MSG:
+                //处理tcp消息
+                TcpModel tcpModel = (TcpModel) eventBusModel.getMsg();
+                handleTcpMsg(tcpModel);
+                break;
+            case Constants.EVENT_RESTART_APP:
+                //restart app
+                AutoRebootUtil.restartApp();
+                break;
+        }
+    }
+
+    NetworkConnectChangedReceiver networkConnectChangedReceiver;
+
+    private void initReceive() {
+        //网络状态广播
+        networkConnectChangedReceiver = new NetworkConnectChangedReceiver();
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
+        registerReceiver(networkConnectChangedReceiver, intentFilter);
+    }
+
+
+    private void updateTcpStatus() {
+        TextView tcpstatus = (TextView) findViewById(R.id.tcpStatus);
+        if (Constants.TCP_CONNCETED) {
+            tcpstatus.setText("正常");
+            tcpstatus.setTextColor(getResources().getColor(R.color.green));
+        } else {
+            tcpstatus.setText("未连接");
+            tcpstatus.setTextColor(getResources().getColor(R.color.red));
+        }
+
+    }
+
+    private synchronized void handleTcpMsg(final TcpModel tcpModel) {
+        //返回ack
+        TcpModel respondModel = new TcpModel();
+        respondModel.setType(TcpType.S433);
+        respondModel.setAction(TcpAction.S433Action.ACK);
+        respondModel.setData(Constants.MAC_ADDR);
+        TcpClient.getInstance().sendMsg(respondModel.toJson());
+
+        switch (tcpModel.getType()) {
+            case TIME:
+                if (tcpModel.getAction() == TcpAction.TimeAction.SYNC) {
+                    //同步时间
+                    //action: SYNC_TIME, data: {"time_zone":"PRC","time":"1683626639"}
+                    JSONObject jsonObject = JSON.parseObject(tcpModel.getData().toString());
+                    String timezone = jsonObject.getString("time_zone");
+                    long time = Long.parseLong(jsonObject.getString("time")) * 1000;
+
+                    setSysTime(time, timezone);
+                }
+                break;
+            case DEVICE:
+                if (tcpModel.getAction() == TcpAction.DeviceAction.APP_UPDATE) {
+                    //
+                } else if (tcpModel.getAction() == TcpAction.DeviceAction.RESTART) {
+                    AutoRebootUtil.restartApp();
+                } else if (tcpModel.getAction() == TcpAction.DeviceAction.REBOOT) {
+                    AutoRebootUtil.reboot();
+                }
+                break;
+            case SIDE:
+                //
+                break;
+            case S433:
+                if (tcpModel.getAction() == TcpAction.S433Action.SOS_CALL
+                || tcpModel.getAction() == TcpAction.S433Action.CALL
+                || tcpModel.getAction() == TcpAction.S433Action.CANCEL) {
+                    //解析数据并通过433发射出去
+                } else if (tcpModel.getAction() == TcpAction.S433Action.DATA) {
+                    //
+                } else if (tcpModel.getAction() == TcpAction.S433Action.SYNC_TIME) {
+                    //
+                } else if (tcpModel.getAction() == TcpAction.S433Action.EXIST) {
+                    //
+                }
+                //发送433数据
+                break;
+        }
+    }
+
+    private ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback(){
+        @Override
+        public void onAvailable(@NonNull Network network) {
+            super.onAvailable(network);
+            Log.e(TAG, "onAvailable: ");
+            Constants.NET_WORK_AVAILABLE=true;
+            EventBusModel eventBusModel = new EventBusModel(Constants.NET_WORK_AVAILABLE_CHANGE,Constants.NET_WORK_AVAILABLE);
+            EventBus.getDefault().post(eventBusModel);
+        }
+
+        @Override
+        public void onLost(@NonNull Network network) {
+            Log.e(TAG, "onLost: "+NetUtil.getInstance().getNetAvailable());
+            super.onLost(network);
+            if(NetUtil.getInstance().getNetAvailable()){
+                Constants.NET_WORK_AVAILABLE=true;
+            }else{
+                Constants.NET_WORK_AVAILABLE=false;
+            }
+            EventBusModel eventBusModel = new EventBusModel(Constants.NET_WORK_AVAILABLE_CHANGE,Constants.NET_WORK_AVAILABLE);
+            EventBus.getDefault().post(eventBusModel);
+        }
+
+//        @Override
+//        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
+//            super.onCapabilitiesChanged(network, networkCapabilities);
+//            Log.e(TAG, "onCapabilitiesChanged: "+networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED));
+////            if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)){
+////                Constants.NET_WORK_AVAILABLE=true;
+////                EventBusModel eventBusModel = new EventBusModel(Constants.NET_WORK_AVAILABLE_CHANGE,Constants.NET_WORK_AVAILABLE);
+////                EventBus.getDefault().post(eventBusModel);
+////            }
+//        }
+    };
+
+
+    /**
+     * 设置系统时间
+     *
+     * @param time
+     */
+    private void setSysTime(long time, String timeZone) {
+        try {
+            if (smdtManager != null) {
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(new Date(time));
+                smdtManager.setTime(getApplicationContext(),
+                        calendar.get(Calendar.YEAR),
+                        calendar.get(Calendar.MONTH)+1,
+                        calendar.get(Calendar.DAY_OF_MONTH),
+                        calendar.get(Calendar.HOUR_OF_DAY),
+                        calendar.get(Calendar.MINUTE));
+
+                Log.e(TAG, "set sys time: " + time);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 106 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/SerialPortActivity.java

@@ -0,0 +1,106 @@
+package com.wdkl.ncs.s433.transbox;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.serialport.SerialPort;
+
+import com.wdkl.ncs.s433.transbox.common.Constants;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.InvalidParameterException;
+
+public abstract class SerialPortActivity extends Activity {
+
+    protected Application mApplication;
+    protected SerialPort mSerialPort;
+    protected OutputStream mOutputStream;
+    private InputStream mInputStream;
+    private ReadThread mReadThread;
+
+    private class ReadThread extends Thread {
+
+        @Override
+        public void run() {
+            super.run();
+            while (!isInterrupted()) {
+                try {
+                    Thread.sleep(200);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                int size;
+                try {
+                    byte[] buffer = new byte[64];
+                    if (mInputStream == null) return;
+                    if(mInputStream.available()>0) {
+                        size = mInputStream.read(buffer);
+                        if (size > 0) {
+                            onDataReceived(buffer, size);
+                        }
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    return;
+                }
+            }
+        }
+    }
+
+    private void DisplayError(int resourceId) {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle("Error");
+        b.setMessage(resourceId);
+        b.setPositiveButton("OK", new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int which) {
+//                startActivity(new Intent(SerialPortActivity.this, SettingsActivity.class));
+//                SerialPortActivity.this.finish();
+            }
+        });
+        b.show();
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mApplication = (Application) getApplication();
+        try {
+            mSerialPort = mApplication.getSerialPort();
+            mOutputStream = mSerialPort.getOutputStream();
+            mInputStream = mSerialPort.getInputStream();
+
+			/* Create a receiving thread */
+            mReadThread = new ReadThread();
+            mReadThread.start();
+            Constants.SERIAL_PORT_STATUS=true;
+
+
+        } catch (SecurityException e) {
+            Constants.SERIAL_PORT_STATUS=false;
+            Constants.SERIAL_PORT_FAIL_RESON=getResources().getString(R.string.error_security);
+            DisplayError(R.string.error_security);
+        } catch (IOException e) {
+            Constants.SERIAL_PORT_STATUS=false;
+            Constants.SERIAL_PORT_FAIL_RESON=getResources().getString(R.string.error_unknown);
+            DisplayError(R.string.error_unknown);
+        } catch (InvalidParameterException e) {
+            Constants.SERIAL_PORT_STATUS=false;
+            Constants.SERIAL_PORT_FAIL_RESON=getResources().getString(R.string.error_configuration);
+            DisplayError(R.string.error_configuration);
+        }
+    }
+
+    protected abstract void onDataReceived(final byte[] buffer, final int size);
+
+    @Override
+    protected void onDestroy() {
+        if (mReadThread != null) mReadThread.interrupt();
+        mApplication.closeSerialPort();
+        mSerialPort = null;
+        super.onDestroy();
+    }
+}

+ 69 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/SettingsActivity.java

@@ -0,0 +1,69 @@
+package com.wdkl.ncs.s433.transbox;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.serialport.SerialPortFinder;
+import android.view.MenuItem;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.preference.EditTextPreference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
+
+import com.wdkl.ncs.s433.transbox.common.Constants;
+import com.wdkl.ncs.s433.transbox.utils.SettingConfig;
+
+public class SettingsActivity extends AppCompatActivity {
+    private static Application mApplication;
+    private static SerialPortFinder mSerialPortFinder;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        mApplication = (Application) getApplication();
+        mSerialPortFinder = mApplication.mSerialPortFinder;
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.settings_activity);
+        if (savedInstanceState == null) {
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .replace(R.id.settings, new SettingsFragment())
+                    .commit();
+        }
+        ActionBar actionBar = getSupportActionBar();
+        if (actionBar != null) {
+            actionBar.setDisplayHomeAsUpEnabled(true);
+
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            this.finish();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+
+    public static class SettingsFragment extends PreferenceFragmentCompat {
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            setPreferencesFromResource(R.xml.root_preferences, rootKey);
+
+            final androidx.preference.ListPreference devices = (androidx.preference.ListPreference) findPreference("serialDeivce");
+            String[] entries = mSerialPortFinder.getAllDevices();
+            String[] entryValues = mSerialPortFinder.getAllDevicesPath();
+            devices.setEntries(entries);
+            devices.setEntryValues(entryValues);
+
+
+            EditTextPreference serverIpPre = findPreference("tcpServer");
+            serverIpPre.setDefaultValue(SettingConfig.getTcpServer(getContext()));
+
+            EditTextPreference serverPortPre = findPreference("tcpServerPort");
+            serverIpPre.setDefaultValue(SettingConfig.getTcpServerPort(getContext()));
+        }
+    }
+}

+ 21 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/common/Constants.java

@@ -0,0 +1,21 @@
+package com.wdkl.ncs.s433.transbox.common;
+
+public class Constants {
+   public static String MAC_ADDR = "";
+
+   //public static final String default_server_ip = "172.28.100.100";
+   public static final String default_server_ip = "8.129.220.143";
+   public static final int default_server_port = 5080;
+
+   public  static final int  EVENT_TCP_STATE = 0x01;
+   public  static final int  EVENT_SERIAL_PORT_STATE = 0x02;
+   public static final int NET_WORK_STATUS_CHANGE = 0x03;
+   public static final int NET_WORK_AVAILABLE_CHANGE = 0x04 ;
+   public static final int EVENT_TCP_MSG = 0x05;
+   public static final int EVENT_RESTART_APP = 0x06;
+
+   public static  boolean NET_WORK_AVAILABLE = false;
+   public static Boolean TCP_CONNCETED = false;
+   public static Boolean SERIAL_PORT_STATUS = false;
+   public static String SERIAL_PORT_FAIL_RESON="";
+}

+ 33 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/receiver/NetworkConnectChangedReceiver.java

@@ -0,0 +1,33 @@
+package com.wdkl.ncs.s433.transbox.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.util.Log;
+
+
+import com.wdkl.ncs.s433.transbox.common.Constants;
+import com.wdkl.ncs.s433.transbox.tcp.EventBusModel;
+import com.wdkl.ncs.s433.transbox.utils.NetUtil;
+
+import org.greenrobot.eventbus.EventBus;
+
+public class NetworkConnectChangedReceiver extends BroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        // TODO Auto-generated method stub
+        // 如果相等的话就说明网络状态发生了变化
+        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+            int netWorkState = NetUtil.getNetWorkState(context);
+            Log.e("NetworkConnect", "onReceive: "+netWorkState );
+            // 接口回调传过去状态的类型
+            EventBusModel eventBusModel = new EventBusModel(Constants.NET_WORK_STATUS_CHANGE,netWorkState);
+            EventBus.getDefault().post(eventBusModel);
+        }else if(intent.getAction().equals("com.wdkl.loragateway.net.avaiable")){
+            Log.e("NetworkConnect", "onReceive: 收到广播 com.wdkl.loragateway.net.avaiable");
+            EventBusModel eventBusModel = new EventBusModel(Constants.NET_WORK_AVAILABLE_CHANGE,Constants.NET_WORK_AVAILABLE);
+            EventBus.getDefault().post(eventBusModel);
+        }
+    }
+}

+ 32 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/receiver/WdBootReceiver.java

@@ -0,0 +1,32 @@
+package com.wdkl.ncs.s433.transbox.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.util.Log;
+
+import com.wdkl.ncs.s433.transbox.MainActivity;
+
+public class WdBootReceiver extends BroadcastReceiver {
+
+    @Override
+    public void onReceive(final Context context, Intent intent) {
+        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
+            Log.d("wdBoot", "收到开机广播,启动app");
+            new Handler().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    startHome(context);
+                }
+            }, 5000L);
+        }
+    }
+
+    private void startHome(Context context) {
+        Log.d("wdBoot", "start home activity");
+        Intent startIntent= new Intent(context, MainActivity.class);
+        startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        context.startActivity(startIntent);
+    }
+}

+ 29 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/EventBusModel.java

@@ -0,0 +1,29 @@
+package com.wdkl.ncs.s433.transbox.tcp;
+
+public class EventBusModel {
+
+    private Integer msgType;
+
+    private Object msg;
+
+    public EventBusModel(Integer msgType, Object msg) {
+        this.msgType = msgType;
+        this.msg = msg;
+    }
+
+    public Integer getMsgType() {
+        return msgType;
+    }
+
+    public void setMsgType(Integer msgType) {
+        this.msgType = msgType;
+    }
+
+    public Object getMsg() {
+        return msg;
+    }
+
+    public void setMsg(Object msg) {
+        this.msg = msg;
+    }
+}

+ 54 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/HexDecoder.java

@@ -0,0 +1,54 @@
+package com.wdkl.ncs.s433.transbox.tcp;
+
+import java.util.List;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.ByteToMessageDecoder;
+
+public class HexDecoder extends ByteToMessageDecoder {
+
+    @Override
+    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
+        //创建字节数组,buffer.readableBytes可读字节长度
+        byte[] b = new byte[byteBuf.readableBytes()];
+        //复制内容到字节数组b
+        byteBuf.readBytes(b);
+        //字节数组转字符串
+        String str = new String(b);
+
+        // System.out.println(str);
+
+        list.add(bytesToHexString(b));
+    }
+
+    public String bytesToHexString(byte[] bArray) {
+        StringBuffer sb = new StringBuffer(bArray.length);
+        String sTemp;
+        for (int i = 0; i < bArray.length; i++) {
+            sTemp = Integer.toHexString(0xFF & bArray[i]);
+            if (sTemp.length() < 2)
+                sb.append(0);
+            sb.append(sTemp.toUpperCase());
+        }
+        return sb.toString();
+    }
+
+    public static String toHexString1(byte[] b) {
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < b.length; ++i) {
+            buffer.append(toHexString1(b[i]));
+        }
+        return buffer.toString();
+    }
+
+    public static String toHexString1(byte b) {
+        String s = Integer.toHexString(b & 0xFF);
+        if (s.length() == 1) {
+            return "0" + s;
+        } else {
+            return s;
+        }
+    }
+
+}

+ 26 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/HexEncoder.java

@@ -0,0 +1,26 @@
+package com.wdkl.ncs.s433.transbox.tcp;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToByteEncoder;
+
+public class HexEncoder extends MessageToByteEncoder<String> {
+
+
+    @Override
+    protected void encode(ChannelHandlerContext channelHandlerContext, String s, ByteBuf byteBuf) throws Exception {
+        //将16进制字符串转为数组
+        byteBuf.writeBytes(hexString2Bytes(s));
+    }
+
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+
+    }
+
+}

+ 118 - 8
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

@@ -1,4 +1,4 @@
-package com.wdkl.ncs.android.middleware.tcp.enums;
+package com.wdkl.ncs.s433.transbox.tcp;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -14,6 +14,7 @@ public interface TcpAction {
     String getDescription();
 
     enum CallbackAction implements TcpAction {
+        ACK("反馈"),
         SUCCESS("同步"),
         FAILED("失败"),
         NO_MATCH("没有匹配");
@@ -88,7 +89,7 @@ public interface TcpAction {
         HANDOFF("挂断"),
         CANCEL("取消"),
         PCALLING("已经通话中"),
-        VOICE_OFF("通话被接听"),
+        VOICE_OFF("通话被其他设备处理"),
         RS485CALL("485界面发起呼叫"),
         RS485CANCEL("485界面呼叫取消"),
         RS485CANCEL_BY_DOOR("485门口机取消房间内的呼叫"),
@@ -104,6 +105,7 @@ public interface TcpAction {
         GAINED("呼叫被应答"),
         HCALL("手柄呼叫"),
         HRESPONSE("响应手柄"),
+        HRESPONSED("响应过手柄了"),
         NO_MATCH("没有匹配");
 
 
@@ -174,8 +176,9 @@ public interface TcpAction {
 
 
     enum SOSAction implements TcpAction {
-        CALL("紧急呼叫"),
-        CANCEL("取消"),
+        CALL("紧急呼叫"),   //1
+        CANCEL("取消"),   //1
+        CANCELED("已取消"),    //1
         TRANSFER("转接"),
         ALARM_TEST("测试报警"),
         ALARM_INTRUSION("侵入报警"),
@@ -197,7 +200,11 @@ public interface TcpAction {
         AlARM_BUTTON("紧急按钮"),
         ALARM_FALL_RADAR("跌到报警"),
         ALARM_INFUSION_RADAR("输液报警"),
-        ROOM_CALL("房间紧急呼叫"),
+        ROOM_CALL("房间紧急呼叫"),    //1
+        OTHER_CALL("其他紧急呼叫"),   //1
+        RECEIVED("客户端收到确认"),
+        // 当设备在科室级时用这个PART_USER_CALL,比如:用户手环
+        PART_USER_CALL("用户紧急呼叫"),   //
         NO_MATCH("没有匹配");
 
         private final String description;
@@ -321,7 +328,9 @@ public interface TcpAction {
     }
 
     enum DeviceAction implements TcpAction {
-        RESTART("重启"),
+        RESTART("重启APP"),
+        REBOOT("重启机器"),
+        OPEN_DEBUG("打开网络调试"),
         CONNECT("连接"),
         APP_UPDATE("APP更新"),
         DEVICE_REFRESH("设备刷新"),
@@ -329,6 +338,8 @@ public interface TcpAction {
         DEVICE_CHANGE("设备更换"),
         USER_CHANGE("用户绑定"),
         SERVER_CHANGE("设备ip地址更换"),
+        S485_POWER_RESET("485控制版复位电路"),
+        S485_POWER_RESET_SUCCESS("485控制版复位电路成功"),
         NO_MATCH("没有匹配");
 
         private final String description;
@@ -357,13 +368,14 @@ public interface TcpAction {
 
     enum EventAction implements TcpAction {
         KEY_CLICK("按键事件"),
-        RESPONSE("已响应"),
+        RESPONSE("响应"),
+        RESPONSED("已响应"),
         RECEIVED("接收端收到确认"),
         CANCEL("取消"),
         CANCEL_CONFIRM("接收端确认收到取消"),
+        NO_TARGET("没有目标设备"),
         COMPLETED("完成"),
         NO_MATCH("没有匹配");
-
         private final String description;
         EventAction(String description){
             this.description = description;
@@ -396,6 +408,8 @@ public interface TcpAction {
         SOS_CANCEL("取消"),
         NURSING("护理"),
         NURSING_END("护理结束"),
+        SHOW("显示"),
+        CLEAR("清除"),
         NO_MATCH("没有匹配");
 
         private final String description;
@@ -578,4 +592,100 @@ public interface TcpAction {
             return userOptionEnum == null ? NO_MATCH :userOptionEnum;
         }
     }
+
+    /**
+     * 433相关action
+      */
+    enum S433Action implements TcpAction {
+        CALL("呼叫"),
+        SOS_CALL("紧急呼叫"),
+        CANCEL("取消"),
+        SYNC_TIME("同步时间"),
+        DATA("同步数据"),
+        EXIST("调试"),
+        ACK("返回"),
+        NO_MATCH("没有匹配");
+
+        private final String description;
+        S433Action(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , S433Action> ENUM_MAP = new HashMap<String, S433Action>();
+        static {
+            for(S433Action v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static S433Action fromString(String v) {
+            S433Action userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? NO_MATCH :userOptionEnum;
+        }
+    }
+
+    enum SignInAction implements TcpAction{
+        SIGN_IN("发起签到"),
+        SIGN_IN_SUCCESS("签到成功"),
+        SIGN_IN_FAILED("签到失败");
+
+        private final String description;
+        SignInAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , SignInAction> ENUM_MAP = new HashMap<String, SignInAction>();
+        static {
+            for(SignInAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static SignInAction fromString(String v) {
+            SignInAction signInAction = ENUM_MAP.get(v);
+            return signInAction;
+        }
+    }
+
+
+    enum PositionAction implements TcpAction{
+        POSITION_START("定位开始"),
+        POSITION_END("结束定位");
+        private final String description;
+        PositionAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , PositionAction> ENUM_MAP = new HashMap<String, PositionAction>();
+        static {
+            for(PositionAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static PositionAction fromString(String v) {
+            PositionAction positionAction = ENUM_MAP.get(v);
+            return positionAction;
+        }
+    }
+
+
 }

+ 41 - 64
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -1,11 +1,11 @@
-package com.wdkl.ncs.android.middleware.tcp;
+package com.wdkl.ncs.s433.transbox.tcp;
 
-import com.wdkl.ncs.android.middleware.common.Constant;
-import com.wdkl.ncs.android.middleware.common.MessageEvent;
+import android.util.Log;
+
+import com.wdkl.ncs.s433.transbox.common.Constants;
 
 import org.greenrobot.eventbus.EventBus;
 
-import java.util.Scanner;
 import java.util.concurrent.TimeUnit;
 
 import io.netty.bootstrap.Bootstrap;
@@ -24,49 +24,41 @@ import io.netty.handler.codec.string.StringEncoder;
 import io.netty.handler.timeout.IdleStateHandler;
 import io.netty.util.CharsetUtil;
 
-//单例
 public class TcpClient {
-   private String TAG = TcpClient.class.getSimpleName();
+    private String TAG = TcpClient.class.getSimpleName();
 
     private NioEventLoopGroup workGroup;
     public Channel channel;
     private Bootstrap bootstrap;
-
+    //客户端是否启动
+    private volatile boolean isRunning = false;
     //数据处理
-    private TcpClientHandler tcpClientHandler = new TcpClientHandler();
-    //是否运行中
-    public boolean isRunning = false;
+    private  TcpClientHandler tcpClientHandler = new TcpClientHandler();
     //重试间隔
     private Integer retrySeconds = 5;
     //重试计数
     private Integer retryTimes = 1;
     private Integer reconnetTimes = 0;
-    //tcp是否完成初始化
-    private boolean inited = false;
-
-    private TcpCallBack tcpCallBack;
-    private boolean connecting = false;
 
 
     //单例
-    private static class TcpClientHolder{
+    private static class TcpClientHolder {
         private static TcpClient instance = new TcpClient();
     }
 
-    public static TcpClient getInstance(){
+    public static TcpClient getInstance() {
         return TcpClientHolder.instance;
     }
 
     //初始化Netty Tcp Client 并连接
     public void init(String serverIP, Integer serverPort, Integer heartBeatSeconds) {
-
         final Integer hbSeconds = heartBeatSeconds;
-        workGroup = new NioEventLoopGroup(2);
+        workGroup = new NioEventLoopGroup();
         bootstrap = new Bootstrap();
         bootstrap.group(workGroup)
                 .channel(NioSocketChannel.class)
-                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 15*1000)
-                .option(ChannelOption.SO_KEEPALIVE,true)
+                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 15 * 1000)
+                .option(ChannelOption.SO_KEEPALIVE, true)
                 .handler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     protected void initChannel(SocketChannel socketChannel) throws Exception {
@@ -76,51 +68,34 @@ public class TcpClient {
                         // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
                         socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
                         //心跳包应当小于服务器间隔
-//                        socketChannel.pipeline().addLast(new IdleStateHandler(0, hbSeconds, 0, TimeUnit.SECONDS));
                         socketChannel.pipeline().addLast(new IdleStateHandler(hbSeconds*2, hbSeconds, 0, TimeUnit.SECONDS));
                         socketChannel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(tcpClientHandler);
                     }
-                }).remoteAddress(serverIP,serverPort);
-        inited = true;
+                }).remoteAddress(serverIP, serverPort);
         doConnect();
-        System.out.println("connect server host: " + serverIP + ", port: " + serverPort);
+        isRunning=true;
     }
 
     //独立连接方法,用于重新连接
-    public synchronized void doConnect(){
-        if (!inited) {
-            System.out.println("tcp is not initialized");
-            return;
-        }
-
-        if (channel != null && (channel.isActive() || channel.isOpen())){
+    public synchronized void doConnect() {
+        if (channel != null && channel.isActive()) {
             System.out.println("TcpClient connecting");
             return;
         }
 
-        //正在连接
-        if (connecting || Constant.TCP_CONNECTED) {
-            System.out.println("Tcp is connecting or connected");
-            return;
-        }
-        connecting = true;
-
-        System.out.println("tcp connect start");
+        System.out.println("TcpClient connect start");
         ChannelFuture future = bootstrap.connect().addListener(new ChannelFutureListener() {
             @Override
-            public void operationComplete(ChannelFuture channelFuture) throws Exception {
-                connecting = false;
-                if (channelFuture.isSuccess()){
-                    isRunning = true;
+            public void operationComplete(final ChannelFuture channelFuture) throws Exception {
+                if (channelFuture.isSuccess()) {
                     channel = channelFuture.channel();
                     retryTimes = 1;
-                    System.out.println("tcp connect success");
+                    System.out.println("TcpClient connect success");
                 } else {
                     //连接失败时的处理
-                    isRunning = false;
-                    System.out.println("tcp connect retry : " + retryTimes);
+                    System.out.println("TcpClient connect retry : " + retryTimes);
                     channelFuture.channel().eventLoop().schedule(new Runnable() {
                         @Override
                         public void run() {
@@ -133,12 +108,12 @@ public class TcpClient {
                                     public void run() {
                                         System.out.println("TcpClientHandler 重新连接,第" + retryTimes + "次" + ", 重试" + reconnetTimes + "次");
                                         if (reconnetTimes > 2) {
-                                            EventBus.getDefault().post(new MessageEvent(0, Constant.EVENT_RESTART_APP));
+                                            EventBus.getDefault().post(new EventBusModel(Constants.EVENT_RESTART_APP, 0));
                                         } else {
                                             doConnect();
                                         }
                                     }
-                                }, 60*5, TimeUnit.SECONDS);
+                                }, 60*2, TimeUnit.SECONDS);
 
                             }else{
                                 doConnect();
@@ -151,26 +126,28 @@ public class TcpClient {
         });
     }
 
-    //发送消息,线程安全
-    public synchronized void sendMsg(String content){
-        if (tcpClientHandler != null) {
-            tcpClientHandler.sendMsg(content);
-            if (tcpCallBack != null) {
-                tcpCallBack.tcpMsg(content);
+
+    public synchronized void closeClient(){
+        try {
+            if(channel!=null){
+                channel.close();
             }
+        } finally {
+            workGroup.shutdownGracefully();
+            isRunning=false;
         }
     }
 
-
-    public Channel getChannel() {
-        return channel;
+    public boolean isRunning() {
+        return isRunning;
     }
 
-    public void setTcpCallback(TcpCallBack callback) {
-        tcpCallBack = callback;
-    }
 
-    public interface TcpCallBack {
-        void tcpMsg(String msg);
+    //发送消息,线程安全
+    public synchronized void sendMsg(String content) {
+        Log.e(TAG, "发送的数据 " + content);
+        if (tcpClientHandler != null) {
+            tcpClientHandler.sendMsg(content);
+        }
     }
-}
+}

+ 105 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/tcp/TcpClientHandler.java

@@ -0,0 +1,105 @@
+package com.wdkl.ncs.s433.transbox.tcp;
+
+import android.util.Log;
+
+import com.wdkl.ncs.s433.transbox.common.Constants;
+import com.wdkl.ncs.s433.transbox.utils.AlarmMessageUtil;
+
+import org.greenrobot.eventbus.EventBus;
+
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.timeout.IdleState;
+import io.netty.handler.timeout.IdleStateEvent;
+import io.netty.util.ReferenceCountUtil;
+
+@ChannelHandler.Sharable
+public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
+    private String TAG = TcpClientHandler.class.getSimpleName();
+
+    private  ChannelHandlerContext ctx;
+
+    //连接断开变量
+    public static Boolean connected = false;
+
+    //连接成功执行的方法
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        super.channelActive(ctx);
+        this.ctx = ctx;
+        connected = true;
+
+        TcpModel connectModel = new TcpModel();
+        connectModel.setType(TcpType.DEVICE);
+        connectModel.setAction(TcpAction.DeviceAction.CONNECT);
+        connectModel.setData(Constants.MAC_ADDR);
+        TcpClient.getInstance().sendMsg(connectModel.toJson());
+
+        Constants.TCP_CONNCETED=true;
+        EventBus.getDefault().post(new EventBusModel(Constants.EVENT_TCP_STATE, Constants.TCP_CONNCETED));
+    }
+
+    //断开连接
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        super.channelInactive(ctx);
+        connected = false;
+        System.out.println("TcpClientHandler 失去连接");
+        Constants.TCP_CONNCETED=false;
+        EventBus.getDefault().post(new EventBusModel(Constants.EVENT_TCP_STATE, Constants.TCP_CONNCETED));
+        TcpClient.getInstance().doConnect();
+    }
+
+    //读取String消息
+    @Override
+    protected void channelRead0(ChannelHandlerContext ctx, String source) throws Exception {
+        try {
+            System.out.println("TcpClientHandler from server ===> " + source);
+            if (source.equals("1")) {
+                Log.e(TAG, "收到服务器返回的心跳" + "source " + source);
+            } else {
+                TcpModel tcpModel = TcpModel.getModelByJson(source);
+                EventBus.getDefault().post(new EventBusModel(Constants.EVENT_TCP_MSG, tcpModel));
+            }
+            ReferenceCountUtil.release(source);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    //写心跳包。没有消息发送时,每间隔一定时间会由此方法向服务端发送心跳
+    @Override
+    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
+        if (evt instanceof IdleStateEvent) {
+            IdleStateEvent event = (IdleStateEvent) evt;
+            if (event.state() == IdleState.WRITER_IDLE) { //超时未执行写操作,在指定的超时时间内未有写操作,要发送心跳包,告诉服务器连接还存活。服务器收到心跳立马回应,正常客户端收到后执行读操作,
+                ctx.writeAndFlush("0");
+            } else if (event.state() == IdleState.READER_IDLE) { //认为服务不可用,主动断开连接
+                Log.i(TAG, "TcpClientHandler ===> READER_IDLE");
+                ctx.close();
+            } else if (event.state() == IdleState.ALL_IDLE) {
+                Log.i(TAG, "TcpClientHandler ===> ALL_IDLE");
+            }
+        }
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+        cause.printStackTrace();
+        System.out.println("TcpClientHandler 失去连接,错误引起");
+
+        Constants.TCP_CONNCETED=false;
+        EventBus.getDefault().post(new EventBusModel(Constants.EVENT_TCP_STATE, Constants.TCP_CONNCETED));
+    }
+
+    //发送消息,不直接调用些方法,调用TcpClient中的发送消息
+    public void sendMsg(String msg) {
+        if (ctx == null) {
+            System.out.println("ctx is null");
+            return;
+        }
+        ctx.writeAndFlush(msg);
+    }
+
+}

+ 24 - 47
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java

@@ -1,17 +1,11 @@
-package com.wdkl.ncs.android.middleware.tcp.dto;
+package com.wdkl.ncs.s433.transbox.tcp;
 
 import android.text.TextUtils;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.wdkl.ncs.android.middleware.model.dos.DeviceDO;
-import com.wdkl.ncs.android.middleware.model.dos.FrameDO;
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
 
 import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * tcp传输对象
@@ -20,6 +14,9 @@ import java.util.Map;
  * 2021-03-30 11:49
  */
 public class TcpModel implements Serializable {
+
+    private String tid;
+
     /**
      * TCP传输对象的类型
      */
@@ -43,6 +40,13 @@ public class TcpModel implements Serializable {
      */
     private Object data;
 
+    public TcpModel() {
+    }
+
+    public TcpModel(String tid) {
+        this.tid = tid;
+    }
+
     public TcpType getType() {
         return type;
     }
@@ -75,7 +79,7 @@ public class TcpModel implements Serializable {
         this.toId = toId;
     }
 
-    public Object getData() {
+    public Object  getData() {
         return data;
     }
 
@@ -94,6 +98,7 @@ public class TcpModel implements Serializable {
         TcpModel tcpModel = new TcpModel();
 
         JSONObject jsonObject = JSON.parseObject(tcpModelJsonString);
+        String tid = jsonObject.getString("tid");
         String type = jsonObject.getString("type");
         String action = jsonObject.getString("action");
         Integer fromId = jsonObject.getInteger("fromId");
@@ -133,11 +138,14 @@ public class TcpModel implements Serializable {
             case SOS:
                 tcpAction = TcpAction.SOSAction.fromString(action);
                 break;
-            case SIDE:
-                tcpAction=TcpAction.SideAction.fromString(action);
+            case ENTRACEGUARD:
+                tcpAction =TcpAction.EntraceGuardAction.fromString(action);
+                break;
+            case REINFORCE:
+                tcpAction =TcpAction.ReinforceAction.fromString(action);
                 break;
         }
-
+        tcpModel.setTid(tid);
         tcpModel.setType(tcpType);
         tcpModel.setAction(tcpAction);
         tcpModel.setToId(toId);
@@ -176,42 +184,11 @@ public class TcpModel implements Serializable {
         return tcpModel.toJson();
     }
 
-    /**
-     * 示例
-     * @param args
-     */
-    public static void main(String[] args) {
-        //创建对象示例
-        TcpModel tcpModel = new TcpModel();
-        tcpModel.type = TcpType.VOICE;
-        tcpModel.action = TcpAction.VoiceAction.CALL;
-
-        Map map = new HashMap();
-
-        DeviceDO deviceDO = new DeviceDO();
-        deviceDO.setCode("123");
-        deviceDO.setEthMac("abcd");
-        map.put("device",deviceDO);
-
-        FrameDO frameDO = new FrameDO();
-        frameDO.setName("ok");
-        map.put("frame",frameDO);
-
-        tcpModel.setData(map);
-
-        System.out.println("enum show === " + tcpModel.action.getDescription() + " -- " + tcpModel.action.getName());
-
-        //要传输的json字符串
-        String jsonStr = tcpModel.toJson();
-        System.out.println("json show === " + jsonStr);
-
-        //获利传输的JSON字符串,转换为对象
-        TcpModel dTcpModel = TcpModel.getModelByJson(jsonStr);
-        //数据反转
-        String dataString = dTcpModel.getData().toString();
-        JSONObject dataJSON = JSON.parseObject(dataString);
-        DeviceDO dDeviceDO = JSON.parseObject(dataJSON.getString("device"), DeviceDO.class);
+    public String getTid() {
+        return tid;
+    }
 
-        System.out.println("json de show === " + dTcpModel.action + " -- " + dDeviceDO.getEthMac());
+    public void setTid(String tid) {
+        this.tid = tid;
     }
 }

+ 12 - 3
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpType.java

@@ -1,4 +1,4 @@
-package com.wdkl.ncs.android.middleware.tcp.enums;
+package com.wdkl.ncs.s433.transbox.tcp;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -21,9 +21,18 @@ public enum TcpType {
     BROADCAST("广播"),
     ENTRACEGUARD("门禁"),
     CHANNELIM("频道留言"),
-    TIME("时间");
+    TIME("时间"),
+    LOCATION("定位"),
+    S433("433"),
+    /** 新增床旁交互Tcp类型 **/
+    SIGN_IN("床旁交互签到"),
+    POSITION("床旁交互定位"),
+    COUNTDOWN("床旁交互倒计时"),
+    ROOMCHECK("床旁交互巡房"),
+    SCREEN_TIP("设置门口机提示语")
+    ;
 
-    private String description;
+    private final String description;
     TcpType(String description){
         this.description = description;
     }

+ 51 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/utils/AlarmMessageUtil.java

@@ -0,0 +1,51 @@
+package com.wdkl.ncs.s433.transbox.utils;
+
+import android.util.Log;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.nio.charset.StandardCharsets;
+
+public class AlarmMessageUtil {
+
+    public static String getHeartBeatMessage() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("a55a01");
+        JSONObject data = new JSONObject();
+        data.put("devId", NetUtil.getInstance().getMacAddress());
+        String dataJsonStr = data.toJSONString();
+        //数据长度16进制字符串
+        Log.i("数据长度", String.format("%04x",dataJsonStr.length()));
+        sb.append(String.format("%04X",dataJsonStr.length()));
+        String s = ByteUtil.str2HexStr(dataJsonStr);
+        sb.append(s);
+        byte[] bytes = sb.toString().getBytes(StandardCharsets.UTF_8);
+        int sum = 0;
+        for (int i = 0; i < bytes.length; i++) {
+            sum += bytes[i];
+        }
+        sb.append(Integer.toHexString(sum));
+        return sb.toString();
+    }
+
+    public static String getAlarmMessage(String mac){
+        StringBuilder sb = new StringBuilder();
+        sb.append("a55a02");
+        JSONObject data = new JSONObject();
+        data.put("keycoDe", mac);
+        String dataJsonStr = data.toJSONString();
+        //数据长度16进制字符串
+        Log.i("数据长度", String.format("%04x",dataJsonStr.length()));
+        sb.append(String.format("%04X",dataJsonStr.length()));
+        String s = ByteUtil.str2HexStr(dataJsonStr);
+        sb.append(s);
+        byte[] bytes = sb.toString().getBytes(StandardCharsets.UTF_8);
+        int sum = 0;
+        for (int i = 0; i < bytes.length; i++) {
+            sum += bytes[i];
+        }
+        sb.append(Integer.toHexString(sum));
+        return sb.toString();
+    }
+
+}

+ 102 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/utils/AutoRebootUtil.java

@@ -0,0 +1,102 @@
+package com.wdkl.ncs.s433.transbox.utils;
+
+import android.annotation.SuppressLint;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+
+import com.wdkl.ncs.s433.transbox.Application;
+import com.wdkl.ncs.s433.transbox.MainActivity;
+
+import java.util.Calendar;
+
+/**
+ * Created by dengzhe on 2018/4/18.
+ * //========自动重启工具类========//
+ */
+
+public class AutoRebootUtil {
+    private static Context context;
+
+    private static Calendar calendar;
+    private static int countDownMinute;
+    private static String currentTime = "0";
+    private static int timeFirst = 11;
+    private static int timeSecond = 17;
+    private static int mt = 50;
+    private static int lt = 55;
+    private static int hour;
+    private static int minute;
+
+
+    public static boolean sys_Reset = false;
+    public static boolean sys_Shutdown = false;
+
+    public static void reboot(Context context) {
+        if (!sys_Reset) {
+            sys_Reset = true;
+            Intent intent = new Intent(Intent.ACTION_REBOOT);
+            intent.putExtra("nowait", 1);
+            intent.putExtra("interval", 1);
+            intent.putExtra("window", 0);
+            context.sendBroadcast(intent);
+        }
+    }
+
+    public static void shutdown(Context context) {
+        if (!sys_Shutdown) {
+            sys_Shutdown = true;
+            Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
+            intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            context.startActivity(intent);
+        }
+    }
+
+
+    public static void reboot() {
+        if (!sys_Reset) {
+            sys_Reset = true;
+            try {
+                Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot "});
+                proc.waitFor();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    public static void shutdown() {
+        if (!sys_Shutdown) {
+            sys_Shutdown = true;
+            try {
+                Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot -p"});
+                proc.waitFor();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    private static boolean restart = false;
+    public static void restartApp() {
+        if (!restart) {
+            try {
+                Intent intent = new Intent(Application.getContext(), MainActivity.class);
+                @SuppressLint("WrongConstant") PendingIntent mPendingIntent = PendingIntent.getActivity(
+                        Application.getContext(), 0, intent,
+                        Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                AlarmManager mgr = (AlarmManager) Application.getContext().getSystemService(Context.ALARM_SERVICE);
+                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, mPendingIntent);
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            restart = true;
+            android.os.Process.killProcess(android.os.Process.myPid());
+            System.exit(0);
+        }
+    }
+}

+ 368 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/utils/ByteUtil.java

@@ -0,0 +1,368 @@
+package com.wdkl.ncs.s433.transbox.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+
+public class ByteUtil {
+    private static final ByteBuffer buffer = ByteBuffer.allocate(8);
+    /**
+     * int转byte
+     * @param x
+     * @return
+     */
+    public static byte intToByte(int x) {
+        return (byte) x;
+    }
+    /**
+     * byte转int
+     * @param b
+     * @return
+     */
+    public static int byteToInt(byte b) {
+        //Java的byte是有符号,通过 &0xFF转为无符号
+        return b & 0xFF;
+    }
+
+    /**
+     * byte[]转int
+     * @param b
+     * @return
+     */
+    public static int byteArrayToInt(byte[] b) {
+        return   b[3] & 0xFF |
+                (b[2] & 0xFF) << 8 |
+                (b[1] & 0xFF) << 16 |
+                (b[0] & 0xFF) << 24;
+    }
+    public static int byteArrayToInt(byte[] b, int index){
+        return   b[index+3] & 0xFF |
+                (b[index+2] & 0xFF) << 8 |
+                (b[index+1] & 0xFF) << 16 |
+                (b[index+0] & 0xFF) << 24;
+    }
+    /**
+     * int转byte[]
+     * @param a
+     * @return
+     */
+    public static byte[] intToByteArray(int a) {
+        return new byte[] {
+                (byte) ((a >> 24) & 0xFF),
+                (byte) ((a >> 16) & 0xFF),
+                (byte) ((a >> 8) & 0xFF),
+                (byte) (a & 0xFF)
+        };
+    }
+    /**
+     * short转byte[]
+     *
+     * @param b
+     * @param s
+     * @param index
+     */
+    public static void byteArrToShort(byte[] b, short s, int index) {
+        b[index + 1] = (byte) (s >> 8);
+        b[index + 0] = (byte) (s >> 0);
+    }
+    /**
+     * byte[]转short
+     *
+     * @param b
+     * @param index
+     * @return
+     */
+    public static short byteArrToShort(byte[] b, int index) {
+        return (short) (((b[index + 0] << 8) | b[index + 1] & 0xff));
+    }
+    /**
+     * 16位short转byte[]
+     *
+     * @param s
+     *            short
+     * @return byte[]
+     * */
+    public static byte[] shortToByteArr(short s) {
+        byte[] targets = new byte[2];
+        for (int i = 0; i < 2; i++) {
+            int offset = (targets.length - 1 - i) * 8;
+            targets[i] = (byte) ((s >>> offset) & 0xff);
+        }
+        return targets;
+    }
+    /**
+     * byte[]转16位short
+     * @param b
+     * @return
+     */
+    public static short byteArrToShort(byte[] b){
+        return byteArrToShort(b,0);
+    }
+
+    /**
+     * long转byte[]
+     * @param x
+     * @return
+     */
+    public static byte[] longToBytes(long x) {
+        buffer.putLong(0, x);
+        return buffer.array();
+    }
+    /**
+     * byte[]转Long
+     * @param bytes
+     * @return
+     */
+    public static long bytesToLong(byte[] bytes) {
+        buffer.put(bytes, 0, bytes.length);
+        buffer.flip();//need flip
+        return buffer.getLong();
+    }
+    /**
+     * 从byte[]中抽取新的byte[]
+     * @param data - 元数据
+     * @param start - 开始位置
+     * @param end - 结束位置
+     * @return 新byte[]
+     */
+    public static byte[] getByteArr(byte[]data,int start ,int end){
+        byte[] ret=new byte[end-start];
+        for(int i=0;(start+i)<end;i++){
+            ret[i]=data[start+i];
+        }
+        return ret;
+    }
+
+    /**
+     * 流转换为byte[]
+     * @param inStream
+     * @return
+     */
+    public static byte[] readInputStream(InputStream inStream) {
+        ByteArrayOutputStream outStream = null;
+        try {
+            outStream = new ByteArrayOutputStream();
+            byte[] buffer = new byte[1024];
+            byte[] data = null;
+            int len = 0;
+            while ((len = inStream.read(buffer)) != -1) {
+                outStream.write(buffer, 0, len);
+            }
+            data = outStream.toByteArray();
+            return data;
+        }catch (IOException e) {
+            return null;
+        } finally {
+            try {
+                if (outStream != null) {
+                    outStream.close();
+                }
+                if (inStream != null) {
+                    inStream.close();
+                }
+            } catch (IOException e) {
+                return null;
+            }
+        }
+    }
+    /**
+     * byte[]转inputstream
+     * @param b
+     * @return
+     */
+    public static InputStream readByteArr(byte[] b){
+        return new ByteArrayInputStream(b);
+    }
+    /**
+     * byte数组内数字是否相同
+     * @param s1
+     * @param s2
+     * @return
+     */
+    public static boolean isEq(byte[] s1,byte[] s2){
+        int slen=s1.length;
+        if(slen==s2.length){
+            for(int index=0;index<slen;index++){
+                if(s1[index]!=s2[index]){
+                    return false;
+                }
+            }
+            return true;
+        }
+        return  false;
+    }
+    /**
+     * byte数组转换为Stirng
+     * @param s1 -数组
+     * @param encode -字符集
+     * @param err -转换错误时返回该文字
+     * @return
+     */
+    public static String getString(byte[] s1,String encode,String err){
+        try {
+            return new String(s1,encode);
+        } catch (UnsupportedEncodingException e) {
+            return err;
+        }
+    }
+    /**
+     * byte数组转换为Stirng
+     * @param s1-数组
+     * @param encode-字符集
+     * @return
+     */
+    public static String getString(byte[] s1,String encode){
+        return getString(s1,encode,null);
+    }
+    //测试
+    public static void main(String []args){
+        System.err.println(isEq(new byte[]{1,2},new byte[]{1,2}));
+    }
+    /**
+     * 字节数组转16进制字符串
+     * @param b
+     * @return
+     */
+    public static String byteArrToHexString(byte[] b){
+        String result="";
+        for (int i=0; i < b.length; i++) {
+            result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring(1);
+        }
+        return result;
+    }
+
+    /**
+     * 16进制字符创转int
+     * @param hexString
+     * @return
+     */
+    public static int hexStringToInt(String hexString){
+        return Integer.parseInt(hexString,16);
+    }
+    /**
+     * 十进制转二进制
+     * @param i
+     * @return
+     */
+    public static String intToBinary(int i){
+        return Integer.toBinaryString(i);
+    }
+
+
+    /**
+     * 16进制字符串转换成byte数组  这个转的多了会报错
+     * */
+    public static byte[] Hex2Bytes(String hexString){
+        byte[] arrB = hexString.getBytes();
+        int iLen = arrB.length;
+        byte[] arrOut = new byte[iLen / 2];
+        String strTmp = null;
+        for (int i = 0; i < iLen; i += 2)
+        {
+            strTmp = new String(arrB, i, 2);
+            arrOut[(i / 2)] = ((byte)Integer.parseInt(strTmp, 16));
+        }
+        return arrOut;
+    }
+
+    /**
+     * 16进制字符串转换成byte数组
+     * @param hexStr
+     * @return
+     */
+    public static byte[] hexToByteArr(String hexStr) {
+       String HexStr = "0123456789abcdef";
+        char[] charArr = hexStr.toCharArray();
+        byte[] btArr = new byte[charArr.length / 2];
+        int index = 0;
+        for (int i = 0; i < charArr.length; i++) {
+            int highBit = HexStr.indexOf(charArr[i]);
+            int lowBit = HexStr.indexOf(charArr[++i]);
+            btArr[index] = (byte) (highBit << 4 | lowBit);
+            index++;
+        }
+        return btArr;
+    }
+
+
+
+
+    /**
+     * 16进制字符串转换成byte数组
+     * */
+    public static byte[] String2Byte(String s) {
+        s = s.replace(" ", "");
+        s = s.replace("#", "");
+        byte[] baKeyword = new byte[s.length() / 2];
+        for (int i = 0; i < baKeyword.length; i++) {
+            try {
+                baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return baKeyword;
+    }
+
+    public static String hexStr2Str(String hexStr) {
+        String str = "0123456789abcdef";
+        char[] hexs = hexStr.toCharArray();
+        byte[] bytes = new byte[hexStr.length() / 2];
+        int n;
+
+        for (int i = 0; i < bytes.length; i++) {
+            n = str.indexOf(hexs[2 * i]) * 16;
+            n += str.indexOf(hexs[2 * i + 1]);
+            bytes[i] = (byte) (n & 0xff);
+        }
+        return new String(bytes);
+    }
+
+    /**
+     * 字符串转换成为16进制(无需Unicode编码)
+     * @param str
+     * @return
+     */
+    public static String str2HexStr(String str) {
+        char[] chars = "0123456789abcdef".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        byte[] bs = str.getBytes();
+        int bit;
+        for (int i = 0; i < bs.length; i++) {
+            bit = (bs[i] & 0x0f0) >> 4;
+            sb.append(chars[bit]);
+            bit = bs[i] & 0x0f;
+            sb.append(chars[bit]);
+            // sb.append(' ');
+        }
+        return sb.toString().trim();
+    }
+
+    // 16进制表示的字符串转换为字节数组
+    public static byte[] hexStringToByteArray(String hexString) {
+        hexString = hexString.replaceAll(" ", "");
+        int len = hexString.length();
+        byte[] bytes = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
+            bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
+                    .digit(hexString.charAt(i + 1), 16));
+        }
+        return bytes;
+    }
+    // 字节数组转换为16进制表示的字符串
+    public static String BinaryToHexString(byte[] bytes) {
+        String hexStr = "0123456789ABCDEF";
+        StringBuilder result = new StringBuilder();
+        String hex = "";
+        for (byte b : bytes) {
+            hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));
+            hex += String.valueOf(hexStr.charAt(b & 0x0F));
+            result.append(hex).append(" ");
+        }
+        return result.toString();
+    }
+}

+ 174 - 157
lcd_board/src/main/java/com/wdkl/lcd_board/helper/NetHelper.java

@@ -1,22 +1,20 @@
-package com.wdkl.lcd_board.helper;
+package com.wdkl.ncs.s433.transbox.utils;
 
 import android.annotation.SuppressLint;
 import android.bluetooth.BluetoothAdapter;
 import android.content.Context;
 import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
+import android.os.Build;
 import android.text.TextUtils;
 
-import com.wdkl.ncs.android.lib.base.BaseApplication;
-import com.wdkl.ncs.android.middleware.common.MessageEvent;
-
-import org.greenrobot.eventbus.EventBus;
+import com.wdkl.ncs.s433.transbox.Application;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.io.LineNumberReader;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
@@ -25,32 +23,29 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Timer;
-import java.util.TimerTask;
-
-import static com.wdkl.ncs.android.middleware.common.Constant.EVENT_INTERNETPING;
 
-public class NetHelper {
+public class NetUtil {
     private WifiManager wifiManager;
     private ConnectivityManager connManager;
-    private static NetHelper sInstance = null;
+    private static NetUtil sInstance = null;
 
     private static Timer timerNetStatus = null;
     private static final int SCHEDULE_TIME = 30000;
     public static boolean NetConn = false;
-
+    //public static String host = "www.baidu.com";
     /**
      * 以太网是否ping成功
      */
     public static final String ETHERNETSTATUS = "ethernetStatus";
 
-    public NetHelper() {
+    public NetUtil() {
     }
 
-    public static NetHelper getInstance() {
+    public static NetUtil getInstance() {
         if (sInstance == null) {
-            synchronized (NetHelper.class) {
+            synchronized (NetUtil.class) {
                 if (sInstance == null) {
-                    sInstance = new NetHelper();
+                    sInstance = new NetUtil();
                 }
             }
         }
@@ -58,81 +53,64 @@ public class NetHelper {
     }
 
     public void init() {
-        wifiManager = (WifiManager) BaseApplication.appContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
-        connManager = (ConnectivityManager) BaseApplication.appContext.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+        wifiManager = (WifiManager) Application.getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        connManager = (ConnectivityManager) Application.getContext().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);
+//    public static void startNetCheck() {
+//        if (timerNetStatus != null) {
+//            timerNetStatus.purge();
+//        }
+//        timerNetStatus = new Timer();
+//        timerNetStatus.schedule(new TimerTask() {
+//            @Override
+//            public void run() {
+//                if (!TextUtils.isEmpty(Constants.Companion.getTcpIp())) {
+//                    NetConn = ping(Constants.Companion.getTcpIp(), 2, null);
+//                    Constants.Companion.setNET_AVAILABLE(NetConn);
+//                    EventBus.getDefault().post(new MessageEvent("", Constants.Companion.getEVENT_NETWORK_STATE()));
+//                }
+//            }
+//        }, 10, SCHEDULE_TIME);
+//    }
 
-                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;
+
+    //获取本地ip地址
+    public  String getLocalIP() {
         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) {
+            for (Enumeration<NetworkInterface> enNetI = NetworkInterface.getNetworkInterfaces(); enNetI.hasMoreElements(); ) {
+                NetworkInterface netI = enNetI.nextElement();
+                for (Enumeration<InetAddress> enumIpAddr = netI.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
+                    InetAddress inetAddress = enumIpAddr.nextElement();
+                    if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
+                        return inetAddress.getHostAddress();
+                    }
                 }
             }
+        } catch (Exception e) {
+            e.printStackTrace();
         }
-
-        return isSuccess;
+        return null;
     }
 
+
+
+
     private static void append(StringBuffer stringBuffer, String text) {
         if (stringBuffer != null) {
             stringBuffer.append(text + "\n");
         }
     }
 
+    public static boolean isBTConnected() {
+        BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
+        if (btAdapter != null) {
+            return btAdapter.getState() == BluetoothAdapter.STATE_ON;
+        }
+
+        return false;
+    }
     /**
      * 获取网关  Waderson
      * <p>
@@ -235,7 +213,7 @@ public class NetHelper {
 
     /**
      * 有线网络其他连接方式:比如静态ip、pppoe拨号、ipoe拨号等
-     */
+     *///TODO 这个方法在主机上获取不到IP
     public static String getLocalElementByIp() {
         BufferedReader bufferedReader = null;
         String result = "";
@@ -314,44 +292,87 @@ public class NetHelper {
         return result;
     }
 
-    //获取本地ip地址
-    public String getLocalIP() {
-        try {
-            for (Enumeration<NetworkInterface> enNetI = NetworkInterface.getNetworkInterfaces(); enNetI.hasMoreElements(); ) {
-                NetworkInterface netI = enNetI.nextElement();
-                for (Enumeration<InetAddress> enumIpAddr = netI.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
-                    InetAddress inetAddress = enumIpAddr.nextElement();
-                    if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
-                        return inetAddress.getHostAddress();
+    /**
+     * 得到MAC
+     *
+     * @return String
+     */
+    public String getMacAddress() {
+
+        if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.O){//小于安卓8 走这里
+            String mac = "";
+            try {
+                mac = getLocalMacAddressFromIp();
+                if (TextUtils.isEmpty(mac)) {
+                    mac = getNetworkMac();
+                }
+                if (TextUtils.isEmpty(mac)) {
+                    mac = tryGetWifiMac();
+                }
+            } catch (Exception e) {
+            }
+            return mac;
+        }else {//大于安卓8走这里
+            List<NetworkInterface> interfaces = null;
+            try {
+                interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
+                for (NetworkInterface networkInterface : interfaces) {
+                    if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
+                        if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
+                            byte[] macBytes = networkInterface.getHardwareAddress();
+                            if (macBytes != null && macBytes.length > 0) {
+                                StringBuilder str = new StringBuilder();
+                                for (byte b : macBytes) {
+                                    str.append(String.format("%02X:", b));
+                                }
+                                if (str.length() > 0) {
+                                    str.deleteCharAt(str.length() - 1);
+                                }
+                                return str.toString();
+                            }
+                        }
                     }
                 }
+            } catch (SocketException e) {
+                e.printStackTrace();
             }
-        } catch (Exception e) {
-            e.printStackTrace();
+            return "unknown";
+
         }
-        return null;
     }
 
     /**
-     * 得到MAC
-     *
-     * @return String
+     * 兼容安卓5-10 获取Mac地址
+     * @return
      */
-    public String getMacAddress() {
-        String mac = "";
+    public String getMacAddress2() {
+        List<NetworkInterface> interfaces = null;
         try {
-            mac = getLocalMacAddressFromIp();
-            if (TextUtils.isEmpty(mac)) {
-                mac = getNetworkMac();
-            }
-            if (TextUtils.isEmpty(mac)) {
-                mac = tryGetWifiMac();
+            interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
+            for (NetworkInterface networkInterface : interfaces) {
+                if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
+                    if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
+                        byte[] macBytes = networkInterface.getHardwareAddress();
+                        if (macBytes != null && macBytes.length > 0) {
+                            StringBuilder str = new StringBuilder();
+                            for (byte b : macBytes) {
+                                str.append(String.format("%02X:", b));
+                            }
+                            if (str.length() > 0) {
+                                str.deleteCharAt(str.length() - 1);
+                            }
+                            return str.toString();
+                        }
+                    }
+                }
             }
-        } catch (Exception e) {
+        } catch (SocketException e) {
+            e.printStackTrace();
         }
-        return mac;
+        return "unknown";
     }
 
+
     /**
      * 通过WiFiManager获取mac地址
      * 这个方法Android 7.0是获取不到的,返回的是null,其实是返回“02:00:00:00:00:00”
@@ -359,15 +380,17 @@ public class NetHelper {
      * @return
      */
     public String tryGetWifiMac() {
-        String mac;
-        WifiInfo wi = wifiManager.getConnectionInfo();
-        if (wi == null || wi.getMacAddress() == null) {
-            mac = null;
-        }
-        if ("02:00:00:00:00:00".equals(wi.getMacAddress().trim())) {
-            mac = null;
-        } else {
-            mac = wi.getMacAddress().trim();
+        String mac = null;
+        if (wifiManager != null) {
+            WifiInfo wi = wifiManager.getConnectionInfo();
+            if (wi == null || wi.getMacAddress() == null) {
+                mac = null;
+            }
+            if ("02:00:00:00:00:00".equals(wi.getMacAddress().trim())) {
+                mac = null;
+            } else {
+                mac = wi.getMacAddress().trim();
+            }
         }
         return mac;
     }
@@ -468,13 +491,49 @@ public class NetHelper {
         }
         return ip;
     }
-
-    public static boolean isBTConnected() {
-        BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
-        if (btAdapter != null) {
-            return btAdapter.getState() == BluetoothAdapter.STATE_ON;
+    /**
+     * 没有连接网络
+     */
+    public static final int NETWORK_NONE = -1;
+    /**
+     * 本地网络
+     */
+    public static final int NETWORK_ETHERNET = 0;
+    /**
+     * 无线网络
+     */
+    public static final int NETWORK_WIFI = 1;
+    public static int getNetWorkState(Context context) {
+        // 得到连接管理器对象
+        ConnectivityManager connectivityManager = (ConnectivityManager) context
+                .getSystemService(Context.CONNECTIVITY_SERVICE);
+
+        NetworkInfo activeNetworkInfo = connectivityManager
+                .getActiveNetworkInfo();
+        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
+
+            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
+                return NETWORK_WIFI;
+            } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_ETHERNET)) {
+                return NETWORK_ETHERNET;
+            }
+        } else {
+            return NETWORK_NONE;
         }
+        return NETWORK_NONE;
+    }
 
+    /**
+     * 获取初始网络情况
+     * @return
+     */
+    public Boolean getNetAvailable(){
+        if (connManager != null) {
+            NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
+            if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) {
+                return true;
+            }
+        }
         return false;
     }
 
@@ -485,46 +544,4 @@ public class NetHelper {
 
         return -1;
     }
-
-    public boolean networkAvailable() {
-        if (connManager != null && connManager.getActiveNetworkInfo() != null) {
-            return connManager.getActiveNetworkInfo().isConnected();
-        }
-
-        return false;
-    }
-
-
-    public static String getCPUSerial() {
-        String str = "";
-        String strCPU = "";
-        String cpuAddress = "0000000000000000";
-        try {
-            //读取 CPU 信息
-            Process pp = Runtime.getRuntime().exec("cat /proc/cpuinfo");
-            InputStreamReader ir = new InputStreamReader(pp.getInputStream());
-            LineNumberReader input = new LineNumberReader(ir);
-            //查找 CPU 序列号
-            for (int i = 1; i < 100; i++) {
-                str = input.readLine();
-                if (str != null) {
-                    //查找到序列号所在行
-                    if (str.indexOf("Serial") > -1) {
-                        //提取序列号
-                        strCPU = str.substring(str.indexOf(":") + 1, str.length());
-                        //去空格
-                        cpuAddress = strCPU.trim();
-                        break;
-                    }
-                } else {
-                    //文件结尾
-                    break;
-                }
-            }
-        } catch (Exception ex) {
-            //赋予默认值
-            ex.printStackTrace();
-        }
-        return cpuAddress;
-    }
 }

+ 88 - 0
app/src/main/java/com/wdkl/ncs/s433/transbox/utils/SettingConfig.java

@@ -0,0 +1,88 @@
+package com.wdkl.ncs.s433.transbox.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import com.wdkl.ncs.s433.transbox.common.Constants;
+
+
+public class SettingConfig {
+
+    private static final String SP_NAME = "SP_FUNCTION";
+
+    //baudRate,parity,dataBits,stopBits,tcpServer,tcpServerPort
+    private static final String KEY_SP_BAUD_RATE = "KEY_SP_BAUD_RATE";
+    private static final String KEY_SP_PARITY = "KEY_SP_PARITY";
+    private static final String KEY_SP_DATA_BITS = "KEY_SP_DATA_BITS";
+    private static final String KEY_SP_STOP_BITS = "KEY_SP_STOP_BITS";
+    private static final String KEY_SP_TCP_SERVER = "KEY_SP_TCP_SERVER";
+    private static final String KEY_SP_TCP_SERVER_PORT = "KEY_SP_TCP_SERVER_PORT";
+
+    private static final String KEY_SP_SERIAL_DEVICE_PATH = "KEY_SP_SERIAL_DEVICE_PATH";
+
+    public static String getSerialDevicePath(Context context) {
+        return getSP(context).getString(KEY_SP_SERIAL_DEVICE_PATH, "dev/ttyS2");
+    }
+
+    public static void setSerialDevicePath(Context context, String devicePath) {
+        getEditor(context).putString(KEY_SP_SERIAL_DEVICE_PATH, devicePath).apply();
+    }
+
+    public static int getBaudRate(Context context) {
+        return getSP(context).getInt(KEY_SP_BAUD_RATE, 115200);
+    }
+
+    public static void setBaudRate(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_BAUD_RATE, value).apply();
+    }
+
+    public static int getParity(Context context) {
+        return getSP(context).getInt(KEY_SP_PARITY, 0);
+    }
+
+    public static void setParity(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_PARITY, value).apply();
+    }
+
+    public static int getDataBits(Context context) {
+        return getSP(context).getInt(KEY_SP_DATA_BITS, 8);
+    }
+
+    public static void setDataBits(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_DATA_BITS, value).apply();
+    }
+
+    public static int getStopBits(Context context) {
+        return getSP(context).getInt(KEY_SP_STOP_BITS, 1);
+    }
+
+    public static void setStopBits(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_STOP_BITS, value).apply();
+    }
+
+    public static String getTcpServer(Context context) {
+        return getSP(context).getString(KEY_SP_TCP_SERVER, Constants.default_server_ip);
+    }
+
+    public static void setTcpServer(Context context, String value) {
+        getEditor(context).putString(KEY_SP_TCP_SERVER, value).apply();
+    }
+
+    public static int getTcpServerPort(Context context) {
+        return getSP(context).getInt(KEY_SP_TCP_SERVER_PORT, Constants.default_server_port);
+    }
+
+    public static void setTcpServerPort(Context context, int value) {
+        getEditor(context).putInt(KEY_SP_TCP_SERVER_PORT, value).apply();
+    }
+
+
+    private static SharedPreferences getSP(Context context) {
+        return context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
+    }
+
+    private static SharedPreferences.Editor getEditor(Context context) {
+        return getSP(context).edit();
+    }
+
+}

File diff ditekan karena terlalu besar
+ 30 - 0
app/src/main/res/drawable-v24/ic_launcher_foreground.xml


+ 170 - 0
app/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="#3DDC84"
+        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>

+ 107 - 0
app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+<LinearLayout
+    android:layoutDirection="ltr"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <TextView
+            android:layout_weight="1"
+            android:layout_marginLeft="50dp"
+            android:layout_marginTop="50dp"
+            android:lineSpacingExtra="10dp"
+            android:textColor="@color/material_on_surface_emphasis_medium"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="IP地址及版本号:"
+            android:id="@+id/setttingInfo"></TextView>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_marginLeft="50dp"
+            android:layout_marginBottom="10dp"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="10dp"
+                android:lineSpacingExtra="10dp"
+                android:text="TCP连接状态:"
+                ></TextView>
+            <TextView
+                android:id="@+id/tcpStatus"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:lineSpacingExtra="10dp"
+                android:textColor="@color/red"
+                android:text="未连接"
+                ></TextView>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_marginLeft="50dp"
+            android:layout_marginBottom="10dp"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="wrap_content"
+                android:lineSpacingExtra="10dp"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="10dp"
+                android:text="串口状态:"
+                ></TextView>
+            <TextView
+                android:id="@+id/serialStatus"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:lineSpacingExtra="10dp"
+                android:textColor="@color/green"
+                android:text="正常"
+                ></TextView>
+        </LinearLayout>
+        <Button
+            android:id="@+id/ButtonSetup"
+            android:layout_marginLeft="50dp"
+            android:layout_marginRight="50dp"
+            android:textColor="@color/white"
+            android:background="@color/design_default_color_primary"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="10dp"
+            android:layout_marginTop="10dp"
+            android:text="通信设置" />
+        <Button
+            android:layout_marginLeft="50dp"
+            android:layout_marginRight="50dp"
+            android:id="@+id/RebootApp"
+            android:layout_marginBottom="50dp"
+            android:layout_marginTop="10dp"
+            android:textColor="@color/white"
+            android:background="@color/teal_200"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="重启应用使配置生效" />
+
+    </LinearLayout>
+    <EditText
+        android:id="@+id/EditTextReception"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1"
+        android:gravity="top"
+        android:hint="接收区"
+         android:editable="false"
+        android:scrollbarStyle="insideOverlay"
+        android:isScrollContainer="true">
+    </EditText>
+</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 63
app/src/main/res/layout/notification_lay.xml

@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:background="#88000000"
-              android:orientation="horizontal"
-              android:paddingLeft="15dp"
-              android:paddingRight="15dp"
-              android:layout_width="match_parent"
-              android:layout_height="64dp">
-    <ImageView
-        android:layout_width="64dp"
-        android:src="@mipmap/launcher"
-        android:padding="5dp"
-        android:layout_gravity="center_vertical"
-        android:layout_height="64dp"/>
-    <LinearLayout
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-        <LinearLayout
-            android:orientation="horizontal"
-            android:layout_weight="1.5"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-            <TextView
-                android:id="@+id/notification_title"
-                android:text="WdklNCS"
-                android:textColor="#fff"
-                android:gravity="bottom"
-                android:textSize="15dp"
-                android:maxLines="1"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"/>
-            <TextView
-                android:id="@+id/notification_time"
-                android:layout_marginLeft="10dp"
-                android:textSize="12dp"
-                android:text="21-01-07"
-                android:maxLines="1"
-                android:textColor="#99ffffff"
-                android:gravity="bottom"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"/>
-        </LinearLayout>
-        <LinearLayout
-            android:layout_marginBottom="5dp"
-            android:layout_weight="1"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-            <TextView
-                android:id="@+id/notification_content"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:textSize="12dp"
-                android:textColor="#99ffffff"
-                android:gravity="top"
-                android:maxLines="2"
-                android:ellipsize="end"
-                android:layout_marginBottom="5dp"
-                android:text="@string/app_name"
-                />
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>

+ 9 - 0
app/src/main/res/layout/settings_activity.xml

@@ -0,0 +1,9 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <FrameLayout
+        android:id="@+id/settings"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</LinearLayout>

+ 5 - 0
app/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
app/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>

TEMPAT SAMPAH
app/src/main/res/mipmap-hdpi/ic_launcher.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-mdpi/ic_launcher.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-xhdpi/ic_launcher.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


TEMPAT SAMPAH
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 4 - 0
app/src/main/res/values-night/colors.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="green">#00FF00</color>
+</resources>

+ 16 - 0
app/src/main/res/values-night/themes.xml

@@ -0,0 +1,16 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.LoraGateway" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_200</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/black</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_200</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>

+ 108 - 0
app/src/main/res/values/arrays.xml

@@ -0,0 +1,108 @@
+<resources>
+    <!-- Reply Preference -->
+    <string-array name="reply_entries">
+        <item>Reply</item>
+        <item>Reply to all</item>
+    </string-array>
+
+    <string-array name="reply_values">
+        <item>reply</item>
+        <item>reply_all</item>
+    </string-array>
+    <string-array name="stop_bits_entries">
+        <item>1位</item>
+        <item>2位</item>
+        </string-array>
+    <string-array name="stop_bits_values">
+        <item>1</item>
+        <item>2</item>
+    </string-array>
+    <string-array name="parity_entries" >
+        <item>无校验位(NONE)</item>
+        <item>奇校验位(ODD)</item>
+        <item>偶校验位(EVEN)</item>
+    </string-array>
+    <string-array name="parity_values" >
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+    </string-array>
+    <string-array name="data_bits_entries">
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+    </string-array>
+    <string-array name="data_bits_values">
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+    </string-array>
+    <string-array name="baud_rate_entries">
+        <item>50</item>
+        <item>75</item>
+        <item>110</item>
+        <item>134</item>
+        <item>150</item>
+        <item>200</item>
+        <item>300</item>
+        <item>600</item>
+        <item>1200</item>
+        <item>1800</item>
+        <item>2400</item>
+        <item>4800</item>
+        <item>9600</item>
+        <item>19200</item>
+        <item>38400</item>
+        <item>57600</item>
+        <item>115200</item>
+        <item>230400</item>
+        <item>460800</item>
+        <item>500000</item>
+        <item>576000</item>
+        <item>921600</item>
+        <item>1000000</item>
+        <item>1152000</item>
+        <item>1500000</item>
+        <item>2000000</item>
+        <item>2500000</item>
+        <item>3000000</item>
+        <item>3500000</item>
+        <item>4000000</item>
+        </string-array>
+    <string-array name="baud_rate_values">
+        <item>50</item>
+        <item>75</item>
+        <item>110</item>
+        <item>134</item>
+        <item>150</item>
+        <item>200</item>
+        <item>300</item>
+        <item>600</item>
+        <item>1200</item>
+        <item>1800</item>
+        <item>2400</item>
+        <item>4800</item>
+        <item>9600</item>
+        <item>19200</item>
+        <item>38400</item>
+        <item>57600</item>
+        <item>115200</item>
+        <item>230400</item>
+        <item>460800</item>
+        <item>500000</item>
+        <item>576000</item>
+        <item>921600</item>
+        <item>1000000</item>
+        <item>1152000</item>
+        <item>1500000</item>
+        <item>2000000</item>
+        <item>2500000</item>
+        <item>3000000</item>
+        <item>3500000</item>
+        <item>4000000</item>
+    </string-array>
+
+
+</resources>

+ 12 - 0
app/src/main/res/values/colors.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="purple_200">#FFBB86FC</color>
+    <color name="purple_500">#FF6200EE</color>
+    <color name="purple_700">#FF3700B3</color>
+    <color name="teal_200">#FF03DAC5</color>
+    <color name="teal_700">#FF018786</color>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+    <color name="green">#00FF00</color>
+    <color name="red">#F44336</color>
+</resources>

+ 30 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,30 @@
+<resources>
+    <string name="app_name">S433_transbox</string>
+    <string name="error_configuration">请配置串口号</string>
+    <string name="error_security">无法读取串口</string>
+    <string name="error_unknown">串口无法打开</string>
+    <string name="title_activity_main">433转换盒</string>
+    <string name="title_activity_settings">系统通信设置</string>
+
+    <!-- Preference Titles -->
+    <string name="messages_header">串口接收设置</string>
+    <string name="sync_header">服务器通信设置</string>
+
+    <!-- Messages Preferences -->
+    <string name="signature_title">Your signature</string>
+    <string name="reply_title">Default reply action</string>
+
+    <!-- Sync Preferences -->
+    <string name="sync_title">Sync email periodically</string>
+    <string name="attachment_title">Download incoming attachments</string>
+    <string name="attachment_summary_on">Automatically download attachments for incoming emails
+    </string>
+    <string name="attachment_summary_off">Only download attachments when manually requested</string>
+    <string name="serial_deivce">串口号</string>
+    <string name="baud_rate">波特率</string>
+    <string name="data_bits">数据位</string>
+    <string name="parity">校验位</string>
+    <string name="stop_bits">停止位</string>
+    <string name="tcp_server">TCP通讯服务器地址</string>
+    <string name="tcp_server_port">服务器端口号</string>
+</resources>

+ 16 - 0
app/src/main/res/values/themes.xml

@@ -0,0 +1,16 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Theme.LoraGateway" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+        <!-- Primary brand color. -->
+        <item name="colorPrimary">@color/purple_500</item>
+        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorOnPrimary">@color/white</item>
+        <!-- Secondary brand color. -->
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_700</item>
+        <item name="colorOnSecondary">@color/black</item>
+        <!-- Status bar color. -->
+        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+        <!-- Customize your theme here. -->
+    </style>
+</resources>

+ 13 - 0
app/src/main/res/xml/backup_rules.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample backup rules file; uncomment and customize as necessary.
+   See https://developer.android.com/guide/topics/data/autobackup
+   for details.
+   Note: This file is ignored for devices older that API 31
+   See https://developer.android.com/about/versions/12/backup-restore
+-->
+<full-backup-content>
+    <!--
+   <include domain="sharedpref" path="."/>
+   <exclude domain="sharedpref" path="device.xml"/>
+-->
+</full-backup-content>

+ 19 - 0
app/src/main/res/xml/data_extraction_rules.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample data extraction rules file; uncomment and customize as necessary.
+   See https://developer.android.com/about/versions/12/backup-restore#xml-changes
+   for details.
+-->
+<data-extraction-rules>
+    <cloud-backup>
+        <!-- TODO: Use <include> and <exclude> to control what is backed up.
+        <include .../>
+        <exclude .../>
+        -->
+    </cloud-backup>
+    <!--
+    <device-transfer>
+        <include .../>
+        <exclude .../>
+    </device-transfer>
+    -->
+</data-extraction-rules>

+ 85 - 0
app/src/main/res/xml/root_preferences.xml

@@ -0,0 +1,85 @@
+<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <PreferenceCategory app:title="@string/messages_header">
+
+
+        <ListPreference
+            app:defaultValue="/dev/ttyS2"
+            app:key="serialDeivce"
+            app:title="@string/serial_deivce"
+            app:useSimpleSummaryProvider="true" />
+
+        <ListPreference
+            app:defaultValue="115200"
+            app:entries="@array/baud_rate_entries"
+            app:entryValues="@array/baud_rate_values"
+            app:key="baudRate"
+            app:title="@string/baud_rate"
+            app:useSimpleSummaryProvider="true" />
+
+        <ListPreference
+            app:defaultValue="8"
+            app:entries="@array/data_bits_entries"
+            app:entryValues="@array/data_bits_values"
+            app:key="dataBits"
+            app:title="@string/data_bits"
+            app:useSimpleSummaryProvider="true" />
+
+
+        <ListPreference
+            app:defaultValue="0"
+            app:entries="@array/parity_entries"
+            app:entryValues="@array/parity_values"
+            app:key="parity"
+            app:title="@string/parity"
+            app:useSimpleSummaryProvider="true" />
+
+        <ListPreference
+            app:defaultValue="1"
+            app:entries="@array/stop_bits_entries"
+            app:entryValues="@array/stop_bits_values"
+            app:key="stopBits"
+            app:title="@string/stop_bits"
+            app:useSimpleSummaryProvider="true" />
+
+
+<!--        <EditTextPreference-->
+<!--            app:key="signature"-->
+<!--            app:title="@string/signature_title"-->
+<!--            app:useSimpleSummaryProvider="true" />-->
+
+<!--        <ListPreference-->
+<!--            app:defaultValue="reply"-->
+<!--            app:entries="@array/reply_entries"-->
+<!--            app:entryValues="@array/reply_values"-->
+<!--            app:key="reply"-->
+<!--            app:title="@string/reply_title"-->
+<!--            app:useSimpleSummaryProvider="true" />-->
+
+    </PreferenceCategory>
+
+    <PreferenceCategory app:title="@string/sync_header">
+
+                <EditTextPreference
+                    app:defaultValue="172.28.100.100"
+                    app:key="tcpServer"
+                    app:title="@string/tcp_server"
+                    app:useSimpleSummaryProvider="true" />
+
+
+        <EditTextPreference
+            app:defaultValue="5086"
+            app:key="tcpServerPort"
+            app:title="@string/tcp_server_port"
+            app:useSimpleSummaryProvider="true" />
+
+<!--        <SwitchPreferenceCompat-->
+<!--            app:dependency="sync"-->
+<!--            app:key="attachment"-->
+<!--            app:summaryOff="@string/attachment_summary_off"-->
+<!--            app:summaryOn="@string/attachment_summary_on"-->
+<!--            app:title="@string/attachment_title" />-->
+
+    </PreferenceCategory>
+
+</PreferenceScreen>

+ 0 - 17
app/src/test/java/com/enation/javashop/android/ExampleUnitTest.java

@@ -1,17 +0,0 @@
-package com.enation.javashop.android;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-public class ExampleUnitTest {
-    @Test
-    public void addition_isCorrect() throws Exception {
-        assertEquals(4, 2 + 2);
-    }
-}

+ 20 - 122
build.gradle

@@ -1,137 +1,35 @@
 buildscript {
-    /**
-     * Kotlin统一版本
-     */
-    ext.kotlin_version = '1.3.21'
-
-    /**
-     * Aop编制版本
-     */
-    ext.aspectj_version = '1.8.9'
-
-    /**
-     * 是否开启单独Module编译
-     */
-    ext.componentTag = false
-
-    /**
-     * 路由注解处理器版本
-     */
-    ext.router_version = '1.0.2'
-
-    /**
-     * kawo组件化框架版本
-     */
-    ext.kawo_version = '1.0.9'
-
-    /**
-     * SDK最小支持版本
-     */
-    ext.min_sdk_version = 18
-
-    /**
-     * SDK目标支持版本
-     */
-    ext.target_sdk_version = 28
-
-    /**
-     * SDK编译版本
-     */
-    ext.build_tools_version = "26.0.2"
-
-    /**
-     * 支持库版本
-     */
-    ext.support_library_version = "26.0.1"
-
-    /**
-     * APP版本码
-     */
-    ext.app_version_code = 7
-
-    /**
-     * APP版本号
-     */
-    ext.app_version = "1.0.7"
-
-    /**
-     * 项目依赖库
-     */
-    dependencies {
-        repositories {
-            /**
-             * 依赖仓储
-             */
-            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/' }
-
-            //jcenter()
-            mavenCentral()
-            google()
-        }
-        /**
-         * Gradle插件
-         */
-        classpath 'com.android.tools.build:gradle:3.0.1'
-
-        /**
-         * Kawo组件化插件
-         */
-        classpath "com.enation.geamtear.gradle:kawo:$kawo_version"
-
-        /**
-         * KotlinGradle插件
-         */
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-
-        /**
-         * Kotlin辅助工具
-         */
-        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
-
-        /**
-         * Aop埋点相关
-         */
-        classpath "org.aspectj:aspectjtools:$aspectj_version"
-    }
-
     repositories {
-        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/' }
-
-        jcenter()
-        mavenCentral()
         google()
+        mavenCentral()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:4.2.2'
 
-        maven { url "https://jitpack.io" }
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
     }
 }
-/**
- * 统一依赖仓储
- */
+
 allprojects {
     repositories {
-        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/' }
-
-        jcenter()
-        mavenCentral()
         google()
-
-        maven { url "https://jitpack.io" }
-    }
-    tasks.withType(Javadoc) { // 新增
-        options.addStringOption('Xdoclint:none', '-quiet')
-        options.addStringOption('encoding', 'UTF-8')
+        mavenCentral()
+        jcenter() // Warning: this repository is going to shut down soon
     }
 }
 
-/**
- *  清除Build配置时 删除根目录Build文件夹
- */
 task clean(type: Delete) {
     delete rootProject.buildDir
 }
+
+ext {
+    compileSdkVersion = 28
+    build_tools_version = "26.0.2"
+
+    minSdkVersion = 24
+    targetSdkVersion = 28
+
+    versionCode = 1
+    versionName = "1.0.1"
+}

+ 0 - 1
common/.gitignore

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

+ 0 - 291
common/build.gradle

@@ -1,291 +0,0 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-apply plugin: 'kotlin-kapt'
-android {
-    compileSdkVersion target_sdk_version
-    buildToolsVersion build_tools_version
-
-    defaultConfig {
-        minSdkVersion min_sdk_version
-        targetSdkVersion target_sdk_version
-        versionCode app_version_code
-        versionName app_version
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-        dataBinding {
-            enabled = true
-        }
-//        ndk{
-//            moduleName "JavaShopCommonNDK"       //生成的so文件名字,调用C程序的代码中会用到该名字
-//            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库
-//        }
-    }
-    lintOptions {
-        abortOnError false
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-        }
-//        debug {
-//            jniDebuggable true
-//        }
-    }
-    sourceSets {
-        main.java.srcDirs += 'src/main/code'
-//        main.jni.srcDirs = []
-//        main.jniLibs.srcDir 'src/main/libs'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
-    }
-
-}
-
-dependencies {
-    compile fileTree(include: ['*.jar'], dir: 'libs')
-    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
-        exclude group: 'com.android.support', module: 'support-annotations'
-    })
-
-    /**
-     * UI适配
-     */
-    compile 'me.jessyan:autosize:1.1.1'
-
-    /**
-     *  圆形ImageView
-     */
-    compile 'de.hdodenhof:circleimageview:2.2.0'
-
-    /**
-     *  JavaShop_Android 基础工具库
-     */
-    compile 'com.enation.geamtear.util:base:1.1.4'
-
-    /**
-     *  JavaShop_Android 网络库
-     */
-    compile 'com.enation.geamtear.net:engine:1.1.5'
-
-    /**
-     *  JavaShop_Android 图片加载库
-     */
-    compile 'com.enation.geamtear.image:glidepluin:1.0.2'
-
-    /**
-     *  JavaShop_Android 第三方工具库
-     */
-    compile 'com.enation.geamtear.widget:ConnectView:1.1.1'
-
-    /**
-     *  JavaShop_Android 地区选择工具库
-     */
-    compile 'com.enation.geamtear.widget:districtselectorview:1.0.6'
-
-    /**
-     *  JavaShop_Android 导航View
-     */
-    compile 'com.enation.geamtear.widget:NavigationView:1.1.0'
-
-    /**
-     *  JavaShop_Android 路由
-     */
-    compile 'com.enation.geamtear:jrouter-logic:1.0.3'
-
-    /**
-     *  JavaShop_Android 图片选择工具库
-     */
-    compile('com.enation.geamtear.photo:takephoto:1.0.2') {
-        exclude group: 'com.github.bumptech.glide'
-        exclude group: 'io.reactivex.rxjava2'
-    }
-
-    /**
-     *  JavaShop_Android Log日志库
-     */
-    compile 'com.enation.geamtear.util:logger:1.0.7'
-
-    /**
-     *   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"
-    testCompile 'junit:junit:4.12'
-
-    /**
-     *   突破方法数限制
-     */
-    compile 'com.android.support:multidex:1.0.2'
-
-
-    compile 'com.github.1002326270xc:LayoutManager-FlowLayout:v1.7'
-
-    /**
-     *   刷新数据控件
-     */
-    compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-18'
-
-    /**
-     *   动画框架 巨牛逼
-     */
-    compile 'com.airbnb.android:lottie:1.5.3'
-
-    /**
-     *  Kotlin依赖
-     */
-    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-    compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.27.0'
-
-    /**
-     *  Databinding
-     */
-    kapt "com.android.databinding:compiler:2.3.3"
-
-    /**
-     *  Dagger依赖
-     */
-    compile 'com.google.dagger:dagger:2.7'
-
-    /**
-     *  Dagger编译依赖
-     */
-    kapt 'com.google.dagger:dagger-compiler:2.7'
-
-    /**
-     *  七巧板框架
-     */
-    compile 'com.alibaba.android:tangram:2.0.0@aar'
-    compile('com.alibaba.android:vlayout:1.2.6.1@aar') {
-        changing = true
-    }
-    compile 'com.alibaba.android:ultraviewpager:1.0.6.5@aar'
-    compile('me.everything:overscroll-decor-android:1.0.1@aar') {
-        transitive true
-        exclude group: 'com.android.support', module: 'recyclerview-v7'
-    }
-    compile('com.alibaba.android:virtualview:1.0.2@aar') {
-        transitive true
-        exclude group: 'com.android.support', module: 'appcompat-v7'
-        exclude group: 'com.tmall.android', module: 'tmallandroid_mui'
-        exclude group: 'com.google.android', module: 'support-v7-recyclerview'
-        exclude group: 'com.android.support', module: 'support-v4'
-        exclude group: 'com.android.support', module: 'support-annotations'
-    }
-
-    //compile 'com.alibaba.android:tangram:2.2.1@aar'
-
-    /**
-     *  Aop埋点
-     */
-    compile "org.aspectj:aspectjrt:$aspectj_version"
-
-    /**
-     *  constraint-layout布局依赖
-     */
-    compile 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
-
-    /**
-     * 指示器
-     */
-    compile 'com.github.hackware1993:magicindicator:1.5.0'
-
-    /**
-     * 汉字辅助
-     */
-    compile files('libs/chinese2py.jar')
-    //compile files('libs/toolkit.jar')
-
-    /**
-     * 二维码扫描
-     */
-    compile 'cn.yipianfengye.android:zxing-library:2.2'
-
-    /**
-     * GLIDE 图片处理器
-     */
-    compile ('jp.wasabeef:glide-transformations:2.0.1') {
-        exclude group: 'com.github.bumptech.glide'
-    }
-
-    /**
-     * 时间选择器
-     */
-    compile 'com.contrarywind:Android-PickerView:4.1.6'
-
-    /**
-     * 图片查看器
-     */
-    compile 'com.github.iielse:ImageWatcher:1.1.5'
-
-    /**
-     * 权限控制
-     */
-    compile 'pub.devrel:easypermissions:0.2.0'
-
-
-    compile 'com.github.pinguo-zhouwei:MZBannerView:v2.0.2'
-
-    //okthttp
-    //compile 'com.squareup.okhttp3:okhttp:3.10.0'
-    //compile 'com.squareup.okio:okio:1.12.0'
-
-    //eventbus
-    compile 'org.greenrobot:eventbus:3.0.0'
-
-    /**
-     * netty
-     */
-    compile 'io.netty:netty-all:4.1.42.Final'
-
-    /**
-     * json
-     */
-    compile 'com.alibaba:fastjson:1.2.23'
-
-    /**
-     * google
-     */
-    //compile 'com.google.guava:guava:23.0'
-}
-
-//tasks.withType(JavaCompile) {
-//    compileTask -> compileTask.dependsOn ndkBuild
-//}
-//
-//task ndkBuild(type: Exec) {
-//    workingDir file('src/main/jni')
-//    commandLine getNdkBuildCmd()
-//}
-//
-//task cleanNative(type: Exec){
-//    workingDir file('src/main/jni')
-//    commandLine getNdkBuildCmd(), 'clean'
-//}
-//
-//clean.dependsOn cleanNative
-//
-//def getNdkDir() {
-//    if (System.env.ANDROID_NDK_ROOT != null)
-//        return System.env.ANDROID_NDK_ROOT
-//    Properties properties = new Properties()
-//    properties.load(project.rootProject.file('local.properties').newDataInputStream())
-//    def ndkdir = properties.getProperty('ndk.dir', null)
-//    if (ndkdir == null)
-//        throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.")
-//    return ndkdir
-//}
-//
-//def getNdkBuildCmd() {
-//    def ndkbuild = getNdkDir() + "/ndk-build"
-//    //Window下需要加.cmd后缀,Mac下则不需要
-//    ndkbuild += ""
-//    return ndkbuild
-//}
-
-

TEMPAT SAMPAH
common/libs/chinese2py.jar


TEMPAT SAMPAH
common/libs/toolkit.jar


+ 0 - 17
common/proguard-rules.pro

@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Users/Android/MAC_SDK/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# 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 *;
-#}

+ 0 - 26
common/src/androidTest/java/com/enation/javashop/android/lib/ExampleInstrumentedTest.java

@@ -1,26 +0,0 @@
-package com.wdkl.ncs.android.lib;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
-    @Test
-    public void useAppContext() throws Exception {
-        // Context of the app under test.
-        Context appContext = InstrumentationRegistry.getTargetContext();
-
-        assertEquals("com.wdkl.ncs.android.lib.test", appContext.getPackageName());
-    }
-}

+ 0 - 18
common/src/main/AndroidManifest.xml

@@ -1,18 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.wdkl.ncs.android.lib">
-
-    <application android:allowBackup="true"
-                 android:label="@string/app_name"
-                 android:supportsRtl="true"
-    >
-        <receiver android:name=".utils.NetReceiver" >
-            <intent-filter>
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
-            </intent-filter>
-        </receiver>
-    </application>
-
-    <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
-    <uses-permission android:name="android.permission.FLASHLIGHT"></uses-permission>
-
-</manifest>

+ 0 - 156
common/src/main/code/com/wdkl/ncs/android/lib/adapter/BaseDelegateAdapter.kt

@@ -1,156 +0,0 @@
-package com.wdkl.ncs.android.lib.adapter
-
-import android.support.v7.widget.RecyclerView
-import android.widget.ImageView
-import com.alibaba.android.vlayout.DelegateAdapter
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.engine.DiskCacheStrategy
-import com.wdkl.ncs.android.lib.utils.dpToPx
-import com.wdkl.ncs.android.lib.utils.more
-import com.enation.javashop.imagepluin.R
-import jp.wasabeef.glide.transformations.CropSquareTransformation
-import jp.wasabeef.glide.transformations.RoundedCornersTransformation
-
-/**
- * @author LDD
- * @Date   2018/1/30 上午11:46
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   DelegateAdapter基类 添加了点击长按事件
- */
-abstract class BaseDelegateAdapter<VH : RecyclerView.ViewHolder, out DataType> : DelegateAdapter.Adapter<VH>() {
-
-    /**
-     * @Name  tag
-     * @Type  Any
-     * @Note  标识Adapter的标签 同一个列表内 不可使用重复Tag 否则会造成查找失败
-     */
-    var tag : Any? = null
-
-    /**
-     * @Name  itemClickListener
-     * @Type  ((data:DataType, position:Int)->(Unit))?
-     * @Note  点击事件
-     */
-    private var itemClickListener :((data:DataType, position:Int)->(Unit))? = null
-
-    /**
-     * @Name  itemClickListener
-     * @Type  ((data:DataType, position:Int)->(Unit))?
-     * @Note  长按事件
-     */
-    private var itemLongClickListener :((data:DataType, position:Int)->(Unit))? = null
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/2/6 上午10:40
-     * @Note   数据提供者
-     * @return 数据源
-     */
-    abstract fun dataProvider():Any
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/2/6 上午10:40
-     * @Note   数据源处理器 判断是单个数据 还是数据集合
-     * @return 全部转换为数据集合
-     */
-    private fun dataProcessor():List<DataType>{
-        return if (dataProvider() is List<*> || dataProvider() is ArrayList<*>){
-            dataProvider() as List<DataType>
-        }else{
-            listOf(dataProvider() as DataType)
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/1/30 上午11:54
-     * @Note   设置item点击事件
-     * @param  itemClickListener 点击回调
-     */
-    fun setOnItemClickListener(itemClickListener:(data:DataType,position:Int)->(Unit)){
-        this.itemClickListener = itemClickListener
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/1/30 上午11:54
-     * @Note   设置item点击事件
-     * @param  itemLongClickListener 长按回调
-     */
-    fun setOnItemLongClickListener(itemLongClickListener: (data:DataType,position:Int)->(Unit)){
-        this.itemLongClickListener = itemLongClickListener
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/1/30 上午11:55
-     * @Note   重写该方法 对item进行事件配置
-     */
-    override fun onBindViewHolderWithOffset(holder: VH, position: Int, offsetTotal: Int) {
-        super.onBindViewHolderWithOffset(holder, position, offsetTotal)
-        if (itemFilter(position)){
-            itemClickListener?.more {
-                self ->
-                holder.itemView.setOnClickListener {
-                    self.invoke(dataProcessor()[position],position)
-                }
-            }
-            itemLongClickListener?.more {
-                self ->
-                holder.itemView.setOnLongClickListener {
-                    self.invoke(dataProcessor()[position],position)
-                    return@setOnLongClickListener true
-                }
-            }
-        }else{
-            holder.itemView.setOnLongClickListener{true}
-            holder.itemView.setOnClickListener{}
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/2/9 下午2:18
-     * @Note   获取item对应数据
-     * @param  item坐标
-     */
-    open fun getItem(position: Int):DataType{
-        return dataProcessor()[position]
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseDelegateAdapter
-     * @Date   2018/1/30 上午11:56
-     * @Note   用来拦截是否为该item配置响应事件
-     * @param  position item坐标
-     */
-    abstract fun itemFilter(position: Int):Boolean
-
-
-    fun loadImage(url :String,imageView :ImageView){
-        Glide.with(imageView.context)
-                .load(url)
-                .thumbnail(0.1f)
-                .diskCacheStrategy(DiskCacheStrategy.ALL)
-                .placeholder(R.drawable.image_loading)
-                .error(R.drawable.image_error)
-                .into(imageView)
-    }
-
-    fun loadImageRound(url :String,imageView: ImageView,cornerType: RoundedCornersTransformation.CornerType = RoundedCornersTransformation.CornerType.ALL){
-        Glide.with(imageView.context)
-                .load(url)
-                .thumbnail(0.1f)
-                .bitmapTransform(RoundedCornersTransformation(imageView.context,3.dpToPx(),0,cornerType))
-                .into(imageView)
-    }
-
-}

+ 0 - 114
common/src/main/code/com/wdkl/ncs/android/lib/adapter/ListViewBaseAdapter.kt

@@ -1,114 +0,0 @@
-package com.wdkl.ncs.android.lib.adapter
-
-import android.content.Context
-import android.databinding.ViewDataBinding
-import android.view.View
-import android.view.ViewGroup
-import android.widget.BaseAdapter
-import android.databinding.DataBindingUtil
-import android.view.LayoutInflater
-
-/**
- * @author LDD
- * @Date   2018/1/30 上午11:33
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   listView单一种类Item 快速适配器
- */
-abstract class ListViewBaseAdapter<DataType, in BindingType:ViewDataBinding>constructor(private val context: Context, private val layout:Int, var datas : List<DataType>) : BaseAdapter() {
-
-    /**
-     * @Name  binding
-     * @Type  BindingType
-     * @Note  databinding工具类
-     */
-    private lateinit var binding : BindingType
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:35
-     * @Note   获取View
-     * @param  position 坐标
-     * @param  convertView item
-     * @param  parent  父容器
-     */
-    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
-        var currentView = convertView
-        if (currentView == null) {
-            binding = DataBindingUtil.inflate(LayoutInflater.from(context), layout, parent, false)
-            currentView = binding.root
-            reSize(currentView)
-            currentView.tag = binding
-        } else {
-            binding = currentView.tag as BindingType
-        }
-        fillItem(binding,datas.get(position),position)
-        binding.root.setOnClickListener {
-            itemClick(datas.get(position),position)
-        }
-        return currentView!!
-    }
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:36
-     * @Note   获取item数据
-     * @param  position 坐标
-     */
-    override fun getItem(position: Int): DataType {
-        return datas.get(position)
-    }
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:36
-     * @Note   获取ItemID
-     * @param  position 坐标
-     */
-    override fun getItemId(position: Int): Long {
-        return position.toLong()
-    }
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:37
-     * @Note   获取item总数
-     * @return item总数
-     */
-    override fun getCount(): Int {
-        return datas.count()
-    }
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:37
-     * @Note   抽象方法 填充数据
-     * @param  binding databinding
-     * @param  data 数据
-     * @param  position 坐标
-     */
-    abstract fun fillItem(binding: BindingType , data:DataType ,position: Int)
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:39
-     * @Note   重新设置item大小
-     * @param  convertView item
-     */
-    open fun reSize(convertView: View){}
-
-    /**
-     * @author LDD
-     * @From   ListViewBaseAdapter
-     * @Date   2018/1/30 上午11:39
-     * @Note   item点击事件
-     * @param  data itemData
-     * @param  position 坐标
-     */
-    open fun itemClick(data:DataType ,position: Int){}
-}

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

@@ -1,171 +0,0 @@
-package com.wdkl.ncs.android.lib.adapter
-
-import android.graphics.Color
-import android.view.ViewGroup
-import com.alibaba.android.vlayout.LayoutHelper
-import com.alibaba.android.vlayout.layout.LinearLayoutHelper
-import com.wdkl.ncs.android.lib.R
-import com.wdkl.ncs.android.lib.databinding.TextAdapterLayBinding
-import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
-import com.wdkl.ncs.android.lib.utils.then
-
-/**
- * @author LDD
- * @Date   2018/4/19 下午2:12
- * @From   com.wdkl.ncs.android.lib.adapter
- * @Note   文字视图Item适配器
- */
-class TextViewDelegateAdapter(val text :String,val textLineCount :Int ,val textColor :Int ,val top : Int = 0 ,val bottom : Int = 0 ,val left : Int = 0 ,val right : Int = 0,val bgColor:Int = Color.WHITE) :BaseDelegateAdapter<BaseRecyclerViewHolder<TextAdapterLayBinding>,Int>(){
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:17
-     * @Note   数据提供者
-     */
-    override fun dataProvider(): Any {
-        return -1
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:17
-     * @Note   item点击过滤
-     * @param  position item坐标
-     */
-    override fun itemFilter(position: Int): Boolean {
-        return true
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:18
-     * @Note   构建ViewHolder
-     */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<TextAdapterLayBinding> {
-        return BaseRecyclerViewHolder.build(parent, R.layout.text_adapter_lay)
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:19
-     * @Note   获取Item总数
-     */
-    override fun getItemCount(): Int {
-        return 1
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:19
-     * @Note   构建LayoutHelper
-     */
-    override fun onCreateLayoutHelper(): LayoutHelper {
-        return LinearLayoutHelper(0,1).then {
-            self ->
-            self.setMargin(left,top,right,bottom)
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:20
-     * @Note   绑定数据
-     */
-    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<TextAdapterLayBinding>?, position: Int) {
-
-        holder?.bind {
-            binding ->
-            binding.count = textLineCount
-            binding.textview.setTextColor(textColor)
-            binding.text = text
-            binding.root.setBackgroundColor(bgColor)
-        }
-
-    }
-
-}
-
-
-
-
-class TextViewListDelegateAdapter(val text :ArrayList<String>,val textLineCount :Int ,val textColor :Int ,val top : Int = 0 ,val bottom : Int = 0 ,val left : Int = 0 ,val right : Int = 0,val bgColor:Int = Color.WHITE) :BaseDelegateAdapter<BaseRecyclerViewHolder<TextAdapterLayBinding>,String>(){
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:17
-     * @Note   数据提供者
-     */
-    override fun dataProvider(): Any {
-        return text
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:17
-     * @Note   item点击过滤
-     * @param  position item坐标
-     */
-    override fun itemFilter(position: Int): Boolean {
-        return true
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:18
-     * @Note   构建ViewHolder
-     */
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<TextAdapterLayBinding> {
-        return BaseRecyclerViewHolder.build(parent, R.layout.text_adapter_lay)
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:19
-     * @Note   获取Item总数
-     */
-    override fun getItemCount(): Int {
-        return text.count()
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:19
-     * @Note   构建LayoutHelper
-     */
-    override fun onCreateLayoutHelper(): LayoutHelper {
-        return LinearLayoutHelper(0,1).then {
-            self ->
-            self.setMargin(left,top,right,bottom)
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   TextViewDelegateAdapter
-     * @Date   2018/4/19 下午3:20
-     * @Note   绑定数据
-     */
-    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<TextAdapterLayBinding>?, position: Int) {
-
-        holder?.bind {
-            binding ->
-            binding.count = textLineCount
-            binding.textview.setTextColor(textColor)
-            binding.text = getItem(position)
-            binding.root.setBackgroundColor(bgColor)
-        }
-
-    }
-
-}

+ 0 - 74
common/src/main/code/com/wdkl/ncs/android/lib/adapter/VlayoutHolderAdapter.kt

@@ -1,74 +0,0 @@
-package com.wdkl.ncs.android.lib.adapter
-
-import android.support.v7.widget.RecyclerView
-import android.view.View
-import android.view.ViewGroup
-import com.alibaba.android.vlayout.DelegateAdapter
-import com.alibaba.android.vlayout.LayoutHelper
-
-const val  VlayoutItemType   = 7321
-
-class VlayoutHolderAdapter(val callBack : HolderCallBack) : DelegateAdapter.Adapter<RecyclerView.ViewHolder>() {
-
-    /**
-     * @author LDD
-     * @From   CategoryPlaceHolderAdapter
-     * @Date   2018/1/30 下午2:42
-     * @Note   ViewHolder创建
-     */
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
-        return callBack.viewHolderProvider(parent)
-    }
-
-    /**
-     * @author LDD
-     * @From   CategoryPlaceHolderAdapter
-     * @Date   2018/1/30 下午2:42
-     * @Note   Item总数
-     */
-    override fun getItemCount(): Int {
-        return onCreateLayoutHelper().itemCount
-    }
-
-    override fun getItemViewType(position: Int): Int {
-        return VlayoutItemType
-    }
-
-    /**
-     * @author LDD
-     * @From   CategoryPlaceHolderAdapter
-     * @Date   2018/1/30 下午2:42
-     * @Note   提供LayoutHelper
-     */
-    override fun onCreateLayoutHelper(): LayoutHelper {
-        return callBack.layoutHelperProvider()
-    }
-
-    /**
-     * @author LDD
-     * @From   CategoryPlaceHolderAdapter
-     * @Date   2018/1/30 下午2:42
-     * @Note   绑定ViewHolder
-     */
-    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
-        callBack.bindView(holder)
-    }
-
-    /**
-     * @author LDD
-     * @Date   2018/1/30 下午2:44
-     * @From   CategoryPlaceHolderAdapter
-     * @Note   viewHolder
-     */
-    class PlaceHolder constructor(view : View) : RecyclerView.ViewHolder(view)
-
-
-    interface HolderCallBack{
-
-        fun bindView(holder: RecyclerView.ViewHolder)
-
-        fun layoutHelperProvider():LayoutHelper
-
-        fun viewHolderProvider(parent: ViewGroup):RecyclerView.ViewHolder
-    }
-}

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

@@ -1,322 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import android.content.Context
-import android.content.Intent
-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
-import com.wdkl.ncs.android.lib.utils.debugLog
-import com.wdkl.ncs.android.lib.utils.errorLog
-import com.enation.javashop.utils.base.tool.BaseToolActivity
-import com.enation.javashop.utils.base.tool.CommonTool
-import com.enation.javashop.utils.base.widget.LoadingDialog
-import kotlinx.android.synthetic.main.custom_loading.view.*
-import java.lang.reflect.Field
-import javax.inject.Inject
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午9:26
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   Activity基类
- */
-abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBindingType : ViewDataBinding> : BaseToolActivity(),BaseControl {
-
-    /**
-     * @Name  presenter
-     * @Type  T : BaseContract.BasePresenter
-     * @Note  Activity中Presenter Dagger自动注入
-     */
-    @Inject
-    protected lateinit var presenter: PresenterType
-
-    /**
-     * @Name  presenter
-     * @Type  T2 : ViewDataBinding
-     * @Note  DataBinding对象
-     */
-    protected lateinit var mViewBinding: DataBindingType
-
-    /**
-     * @Name  lifecycleCalls
-     * @Type  ArrayList<((state :Int) ->Unit)>
-     * @Note  回调集合
-     */
-    private val lifecycleCalls by lazy { ArrayList<((state :Int) ->Unit)>() }
-
-    /**
-     * @Name  disposableManager
-     * @Type  DisposableManager
-     * @Note  Rx索引管理
-     */
-    protected val disposableManager by lazy { DisposableManager() }
-
-    private val FULL_SCREEN_FLAG = (
-            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
-                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
-                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
-                    or View.SYSTEM_UI_FLAG_FULLSCREEN)
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:30
-     * @Note   Activity创建时进行相关的配置
-     */
-    override fun onCreate(savedInstanceState: Bundle?) {
-        try {
-            JRouter.prepare().inject(this)
-        }catch (e :Exception){
-            debugLog("Init","首页初始化完毕")
-        }
-        /**父类初始化*/
-        super.onCreate(savedInstanceState)
-        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN or
-                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
-                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
-                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
-
-        requestWindowFeature(Window.FEATURE_NO_TITLE)
-
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_CREATE)
-        /**创建根视图*/
-        val rootView = layoutInflater.inflate(getLayId(), null, false)
-        /**初始化Databinding对象*/
-        mViewBinding = DataBindingUtil.bind(rootView)
-        /**设置根视图到Activity*/
-        setContentView(rootView)
-
-        //解决全屏显示时弹出界面会跳一下的问题
-        window.decorView.systemUiVisibility = FULL_SCREEN_FLAG
-
-        /**执行抽象方法初始化Dagger相应操作*/
-        bindDagger()
-        /**Presenter绑定View*/
-        attachView()
-        /**执行初始化操作*/
-        init()
-        /**执行绑定event操作*/
-        bindEvent()
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:46
-     * @Note   执行生命周期监听 恢复
-     */
-    override fun onResume() {
-        super.onResume()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_RESUME)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:46
-     * @Note   执行生命周期监听 暂停
-     */
-    override fun onPause() {
-        super.onPause()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_PAUSE)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:34
-     * @Note   Activity销毁回调
-     */
-    override fun onDestroy() {
-        super.onDestroy()
-        /**Presenter解除绑定*/
-        detachView()
-        /**DataBinding解除绑定*/
-        mViewBinding.unbind()
-        /**执行抽象方法destory()*/
-        destory()
-        /**解除RX引用*/
-        disposableManager.unDisposable()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_DESTORY)
-        /**清除声明周期监听引用*/
-        removeAllCallBack()
-        /**处理android4.4.2 底层内存泄漏*/
-        fixInputMethodManagerLeak(activity)
-        errorLog("PageDestory","页面销毁======>$localClassName")
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:39
-     * @Note   获取Activity_LayoutId
-     */
-    protected abstract fun getLayId(): Int
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:44
-     * @Note   执行绑定Dagger操作
-     */
-    protected abstract fun bindDagger()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:45
-     * @Note   执行初始化操作
-     */
-    protected abstract fun init()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:45
-     * @Note   执行绑定事件操作
-     */
-    protected abstract fun bindEvent()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:46
-     * @Note   执行销毁相关操作
-     */
-    protected abstract fun destory()
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/1/19 下午6:03
-     * @Note   绑定View接口
-     */
-    protected open fun attachView() {
-       presenter.attachView(this )
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/10 下午3:17
-     * @Note   解绑View接口
-     */
-    protected open fun detachView(){
-        presenter.detachView()
-    }
-
-
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:37
-     * @Note   添加callBack
-     * @param  listener 监听回调
-     */
-    override fun addLifeCycleListener(listener: (state: Int) -> Unit) {
-        lifecycleCalls.add(listener)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:43
-     * @Note   清除生命周期监听
-     */
-    private fun removeAllCallBack(){
-        lifecycleCalls.clear()
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:44
-     * @Note   在各个生命周期监听执行
-     * @param  state 生命周期状态
-     */
-    private fun lifeCycleDo(state :Int){
-        lifecycleCalls.forEach {
-            item ->
-            item.invoke(state)
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/27 下午1:22
-     * @Note   页面返回数据
-     * @param  resultCode 返回码
-     * @param  data       数据
-     */
-    open fun resultHandle(resultCode: Int,data: Intent?){
-
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/27 下午1:22
-     * @Note   页面返回数据回调
-     */
-    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        super.onActivityResult(requestCode, resultCode, data)
-        resultHandle(resultCode,data)
-    }
-
-//    /**
-//     * 修改默认加载Dialog
-//     */
-//    override fun loadingDialogProvider(): LoadingDialog {
-//        return CommonTool.createLoadingDialog(this, R.layout.custom_loading,R.id.loadding_image)
-//    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:50
-     * @Note   处理4.4.2 Android底层内存泄漏
-     * @param  destContext 上下文
-     */
-    private fun fixInputMethodManagerLeak(destContext: Context?) {
-        if (destContext == null) {
-            return
-        }
-        val imm = destContext!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager ?: return
-        val arr = arrayOf("mCurRootView", "mServedView", "mNextServedView")
-        var f: Field?
-        var obj_get: Any?
-        arr.indices
-                .asSequence()
-                .map { arr[it] }
-                .forEach {
-                    try {
-                        f = imm.javaClass.getDeclaredField(it)
-                        if (f!!.isAccessible === false) {
-                            f!!.isAccessible = true
-                        }
-                        obj_get = f!!.get(imm)
-                        if (obj_get != null && obj_get is View) {
-                            val v_get = obj_get as View?
-                            if (v_get!!.getContext() === destContext) { // 被InputMethodManager持有引用的context是想要目标销毁的
-                                f!!.set(imm, null) // 置空,破坏掉path to gc节点
-                            }
-                        }
-                    } catch (t: Throwable) {
-                        t.printStackTrace()
-                    }
-                }
-    }
-}

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

@@ -1,99 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import android.annotation.SuppressLint
-import android.app.Application
-import android.content.Context
-import android.content.Intent
-import android.support.multidex.MultiDexApplication
-import com.wdkl.ncs.android.lib.core.framework.Framework
-import com.wdkl.ncs.android.lib.core.hack.AndroidHack
-import com.wdkl.ncs.android.lib.core.runtime.ClassNotFoundInterceptor
-import com.wdkl.ncs.android.lib.utils.AppTool
-import com.enation.javashop.utils.logger.LoggerFactory
-import com.uuzuche.lib_zxing.activity.ZXingLibrary
-
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午9:51
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   Application基类
- */
-open class BaseApplication : MultiDexApplication() {
-
-    /**
-     * 伴生对象
-     */
-    companion object {
-
-        /**
-         * @Name  appContext
-         * @Type  android.support.multidex.MultiDexApplication()
-         * @Note  应用Application对象(单例)
-         */
-        @SuppressLint("StaticFieldLeak")
-        lateinit var appContext: Application
-
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseApplication
-     * @Data   2017/12/26 上午10:06
-     * @Note   Application创建时调用
-     * @param  ...
-     */
-    override fun onCreate() {
-        super.onCreate()
-        closeAndroidPDialog()
-        AppTool.SystemUI.initStatusBarHeight(applicationContext)
-        /**Logger初始化*/
-        LoggerFactory.create(baseContext)
-                     .diskCache()
-                     .setTag("WdklLog")
-                     .build()
-        /**初始化Application对象*/
-        appContext = this
-        /**开始Activity生命周期监听,并启动AutoClearHelper*/
-        Framework.initActivityLifeController(this)
-        /**注入ClassNotFound异常拦截处理器*/
-        Framework.classNotFoundInterceptor = object : ClassNotFoundInterceptor {
-            override fun call(context: Context, intent: Intent?): Intent? {
-
-                return intent
-            }
-        }
-        /**对Instrumentation进行Hook替换成自定义Instrumentation*/
-        AndroidHack.hookInstrumentation()
-
-        /** 初始化Zxing */
-        ZXingLibrary.initDisplayOpinion(this)
-
-    }
-
-
-    private fun closeAndroidPDialog() {
-        try {
-            val aClass = Class.forName("android.content.pm.PackageParser\$Package")
-            val declaredConstructor = aClass.getDeclaredConstructor(String::class.java)
-            declaredConstructor.isAccessible = true
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-
-        try {
-            val cls = Class.forName("android.app.ActivityThread")
-            val declaredMethod = cls.getDeclaredMethod("currentActivityThread")
-            declaredMethod.isAccessible = true
-            val activityThread = declaredMethod.invoke(null)
-            val mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown")
-            mHiddenApiWarningShown.isAccessible = true
-            mHiddenApiWarningShown.setBoolean(activityThread, true)
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-
-    }
-
-
-}

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

@@ -1,84 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import com.enation.javashop.net.engine.model.NetState
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午10:08
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   基础Mvp控制接口
- */
-interface BaseContract {
-
-    /**
-     * @author  LDD
-     * @Data   2017/12/26 上午10:08
-     * @From   com.wdkl.ncs.android.lib.base.BaseContract
-     * @Note   基础Presenter接口
-     */
-    interface BasePresenter {
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.base.BaseContract.BasePresenter
-         * @Data   2017/12/26 上午10:23
-         * @Note   绑定View
-         * @param  view View
-         * @param  api  Api
-         */
-        fun attachView(view: Any)
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.base.BaseContract.BasePresenter
-         * @Data   2017/12/26 上午10:25
-         * @Note   销毁操作
-         */
-        fun detachView()
-    }
-
-    /**
-     * @author  LDD
-     * @Data   2017/12/26 上午10:26
-     * @From   com.wdkl.ncs.android.lib.base.BaseContract
-     * @Note   View控制类基类
-     */
-    interface BaseView {
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.base.BaseContract.BaseView
-         * @Data   2017/12/26 上午10:27
-         * @Note   展示错误信息
-         * @param  message 错误信息
-         */
-        fun onError(message: String, type :Int = -1)
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.base.BaseContract.BaseView
-         * @Data   2017/12/26 上午10:28
-         * @Note   网络请求完成
-         * @param  message  提示信息
-         */
-        fun complete(message: String = "", type :Int = -1)
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.base.BaseContract.BaseView
-         * @Data   2017/12/26 上午11:00
-         * @Note   网络请求开始
-         */
-        fun start()
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.base.BaseContract.BaseView
-         * @Data   2017/12/26 上午11:01
-         * @Note   网络监听
-         * @param  state 网络状态
-         */
-        fun networkMonitor(state: NetState)
-
-    }
-}

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

@@ -1,32 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-/**
- * @author LDD
- * @Date   2018/3/29 上午11:32
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   基础控制器
- */
-interface BaseControl {
-
-    /**
-     * @author LDD
-     * @From   BaseControl
-     * @Date   2018/3/29 上午11:33
-     * @Note   添加生命周期监听
-     * @param  listener 监听
-     */
-    fun addLifeCycleListener(listener :((state :Int) ->Unit))
-
-}
-
-/**创建*/
-const val LIFE_CYCLE_CREATE = 1
-
-/**恢复*/
-const val LIFE_CYCLE_RESUME = 2
-
-/**暂停*/
-const val LIFE_CYCLE_PAUSE = 3
-
-/**销毁*/
-const val LIFE_CYCLE_DESTORY = 4

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

@@ -1,274 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import android.databinding.DataBindingUtil
-import android.databinding.ViewDataBinding
-import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import com.wdkl.ncs.android.lib.utils.errorLog
-import com.enation.javashop.utils.base.tool.BaseInterface
-import com.enation.javashop.utils.base.tool.BaseToolActivity
-import javax.inject.Inject
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午11:26
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   Fragment基类
- */
-  abstract class BaseFragment<PresenterType : BaseContract.BasePresenter, DataBindingType : ViewDataBinding> : Fragment(),BaseControl {
-
-    /**
-     * @Name  layout
-     * @Type  android.view.View
-     * @Note  View根视图
-     */
-    private var layout: View? = null
-
-    /**
-     * @Name  activity
-     * @Type  com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Note  Fragment宿主Activity
-     */
-    protected lateinit var activity: BaseToolActivity
-
-    /**
-     * @Name  mViewDataBinding
-     * @Type  T2 : ViewDataBinding
-     * @Note  DataBinding对象
-     */
-    protected lateinit var mViewDataBinding: DataBindingType
-
-    /**
-     * @Name  lifecycleCalls
-     * @Type  ArrayList<((state :Int) ->Unit)>
-     * @Note  回调集合
-     */
-    private val lifecycleCalls by lazy { ArrayList<((state :Int) ->Unit)>() }
-
-    /**
-     * @Name  presenter
-     * @Type  T : BaseContract.BasePresenter
-     * @Note  Fargment的Presenter Dagger自动注入
-     */
-    @Inject
-    protected lateinit var presenter: PresenterType
-
-    /**
-     * @Name  disposableManager
-     * @Type  DisposableManager
-     * @Note  Rx索引管理
-     */
-    protected val disposableManager by lazy { DisposableManager() }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:38
-     * @Note   Fragment创建时调用
-     */
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        /**初始化根视图及DataBinding*/
-        if (layout == null) {
-            layout = inflater.inflate(getLayId(), null)
-            mViewDataBinding = DataBindingUtil.bind(layout)
-        }
-
-        /**初始化宿主Activity*/
-        activity = getActivity() as BaseToolActivity
-        return layout
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:43
-     * @Note   在Fragment视图创建完毕后调用
-     */
-    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_CREATE)
-
-        /**绑定Dagger*/
-        bindDagger()
-
-        /**绑定视图*/
-        attachView()
-
-        /**执行其他初始化操作*/
-        init()
-
-        /**初始化响应事件*/
-        bindEvent()
-
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:46
-     * @Note   执行生命周期监听 恢复
-     */
-    override fun onResume() {
-        super.onResume()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_RESUME)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:46
-     * @Note   执行生命周期监听 暂停
-     */
-    override fun onPause() {
-        super.onPause()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_PAUSE)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:45
-     * @Note   在Fragment销毁时调用
-     */
-    override fun onDestroyView() {
-
-        /**调用父类方法*/
-        super.onDestroyView()
-
-        /**Presenter解除绑定*/
-        detachView()
-
-        /**ViewBinding解除绑定*/
-        mViewDataBinding.unbind()
-
-        /**执行其他销毁操作*/
-        destory()
-
-        /**解除RX引用*/
-        disposableManager.unDisposable()
-
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_DESTORY)
-
-        /**清除生命周期监听引用*/
-        removeAllCallBack()
-
-        errorLog("FragmentDestory","页面销毁======>${javaClass.name}")
-
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:37
-     * @Note   添加callBack
-     * @param  listener 监听回调
-     */
-    override fun addLifeCycleListener(listener: (state: Int) -> Unit) {
-        lifecycleCalls.add(listener)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:43
-     * @Note   清除生命周期监听
-     */
-    private fun removeAllCallBack(){
-        lifecycleCalls.clear()
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:44
-     * @Note   在各个生命周期监听执行
-     * @param  state 生命周期状态
-     */
-    private fun lifeCycleDo(state :Int){
-        lifecycleCalls.forEach {
-            item ->
-            item.invoke(state)
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:47
-     * @Note   获取根视图LayoutId
-     * @return LayoutId
-     */
-    protected abstract fun getLayId(): Int
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:47
-     * @Note   绑定Dagger
-     */
-    protected abstract fun bindDagger()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:50
-     * @Note   初始化其他操作
-     */
-    protected abstract fun init()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:50
-     * @Note   绑定事件
-     */
-    protected abstract fun bindEvent()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:50
-     * @Note   其他销毁操作
-     */
-    protected abstract fun destory()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:52
-     * @Note   销毁View操作
-     */
-    protected open fun attachView() {
-        presenter.attachView(this)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/10 下午3:17
-     * @Note   解绑View接口
-     */
-    protected open fun detachView(){
-        presenter.detachView()
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseFragment
-     * @Data   2017/12/26 上午11:57
-     * @Note   获取工具对象
-     * @return 工具对象
-     */
-    protected fun getUtils(): BaseInterface {
-
-        return activity
-    }
-}

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

@@ -1,41 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import android.content.Context
-import com.enation.javashop.android.jrouter.logic.template.BaseProvider
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午11:59
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   模块初始化类
- */
-abstract class BaseLaunch :BaseProvider {
-
-    /**
-     * @Name  context
-     * @Type  android.content.Context
-     * @Note  上下文
-     */
-    protected var context :Context? = null
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseLaunch
-     * @Data   2017/12/26 下午12:02
-     * @Note   执行初始化操作
-     * @param  context 上下文
-     */
-    override fun init(context: Context) {
-        this.context = context
-        moduleInit()
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseLaunch
-     * @Data   2017/12/26 下午12:03
-     * @Note   子类初始化操作
-     */
-    abstract fun moduleInit()
-
-}

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

@@ -1,49 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import io.reactivex.disposables.CompositeDisposable
-import io.reactivex.disposables.Disposable
-
-/**
- * @author LDD
- * @Date   2018/4/11 下午4:33
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   RX引用管理器
- */
-open class DisposableManager {
-
-    /**
-     * @Name  compositeDisposable
-     * @Type  io.reactivex.disposables.CompositeDisposable
-     * @Note  Disposable管理器
-     */
-    protected var compositeDisposable: CompositeDisposable? = null
-
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.DisposableManager
-     * @Data   2017/12/26 下午12:28
-     * @Note   移除监听
-     */
-    fun unDisposable() {
-        if (compositeDisposable != null) {
-            compositeDisposable!!.dispose()
-        }
-
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.DisposableManager
-     * @Data   2017/12/26 下午12:29
-     * @Note   添加Disposable
-     * @param  disposable 监听引用
-     */
-    fun addDisposable(disposable: Disposable) {
-        if (compositeDisposable == null) {
-            compositeDisposable = CompositeDisposable()
-        }
-        compositeDisposable!!.add(disposable)
-    }
-
-}

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

@@ -1,384 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import android.content.Context
-import android.content.Intent
-import android.databinding.DataBindingUtil
-import android.databinding.ViewDataBinding
-import android.os.Bundle
-import android.view.View
-import android.view.inputmethod.InputMethodManager
-import com.enation.javashop.android.jrouter.JRouter
-import com.wdkl.ncs.android.lib.utils.debugLog
-import com.enation.javashop.photoutils.app.TakePhoto
-import com.enation.javashop.photoutils.app.TakePhotoImpl
-import com.enation.javashop.photoutils.model.InvokeParam
-import com.enation.javashop.photoutils.model.TContextWrap
-import com.enation.javashop.photoutils.model.TResult
-import com.enation.javashop.photoutils.permission.InvokeListener
-import com.enation.javashop.photoutils.permission.PermissionManager
-import com.enation.javashop.photoutils.permission.TakePhotoInvocationHandler
-import com.enation.javashop.photoutils.uitl.TakePhotoinf
-import com.enation.javashop.utils.base.tool.BaseToolActivity
-import java.lang.reflect.Field
-import javax.inject.Inject
-
-/**
- * @author  LDD
- * @Data   2017/12/26 下午12:07
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   带有相册功能的Activity基类
- */
- abstract class GalleryActivity<PresenterType : BaseContract.BasePresenter, DataBindingType : ViewDataBinding>: BaseToolActivity(),BaseControl , TakePhoto.TakeResultListener, InvokeListener, TakePhotoinf {
-
-
-    /**
-     * @Name  takePhoto
-     * @Type  com.enation.javashop.photoutils.app.TakePhoto
-     * @Note  TakePhoto对象
-     */
-    private  var takePhoto : TakePhoto? = null
-
-    /**
-     * @Name  invokeparam
-     * @Type  com.enation.javashop.photoutils.model.InvokeParam
-     * @Note  invokeparam
-     */
-    private  var invokeparam: InvokeParam? = null
-
-    /**
-     * @Name  presenter
-     * @Type  T : BaseContract.BasePresenter
-     * @Note  Activity中Presenter Dagger自动注入
-     */
-    @Inject
-    protected lateinit var presenter: PresenterType
-
-    /**
-     * @Name  presenter
-     * @Type  T2 : ViewDataBinding
-     * @Note  DataBinding对象
-     */
-    protected lateinit var mViewBinding: DataBindingType
-
-    /**
-     * @Name  lifecycleCalls
-     * @Type  ArrayList<((state :Int) ->Unit)>
-     * @Note  回调集合
-     */
-    private val lifecycleCalls by lazy { ArrayList<((state :Int) ->Unit)>() }
-
-    /**
-     * @Name  disposableManager
-     * @Type  DisposableManager
-     * @Note  Rx索引管理
-     */
-    protected val disposableManager by lazy { DisposableManager() }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:30
-     * @Note   Activity创建时进行相关的配置
-     */
-    override fun onCreate(savedInstanceState: Bundle?) {
-        getTakePhoto()!!.onCreate(savedInstanceState)
-        try {
-            JRouter.prepare().inject(this)
-        }catch (e :Exception){
-            debugLog("Init","首页初始化完毕")
-        }
-        /**父类初始化*/
-        super.onCreate(savedInstanceState)
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_CREATE)
-        /**创建根视图*/
-        val rootView = layoutInflater.inflate(getLayId(), null, false)
-        /**初始化Databinding对象*/
-        mViewBinding = DataBindingUtil.bind(rootView)
-        /**设置根视图到Activity*/
-        setContentView(rootView)
-        /**执行抽象方法初始化Dagger相应操作*/
-        bindDagger()
-        /**Presenter绑定View*/
-        attachView()
-        /**执行初始化操作*/
-        init()
-        /**执行绑定event操作*/
-        bindEvent()
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:46
-     * @Note   执行生命周期监听 恢复
-     */
-    override fun onResume() {
-        super.onResume()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_RESUME)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:46
-     * @Note   执行生命周期监听 暂停
-     */
-    override fun onPause() {
-        super.onPause()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_PAUSE)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:34
-     * @Note   Activity销毁回调
-     */
-    override fun onDestroy() {
-        super.onDestroy()
-        /**初始化相机*/
-        takePhoto = null
-        /**Presenter解除绑定*/
-        detachView()
-        /**DataBinding解除绑定*/
-        mViewBinding.unbind()
-        /**执行抽象方法destory()*/
-        destory()
-        /**解除RX引用*/
-        disposableManager.unDisposable()
-        /**执行生命周期监听*/
-        lifeCycleDo(LIFE_CYCLE_DESTORY)
-        /**清除声明周期监听引用*/
-        removeAllCallBack()
-        /**处理android4.4.2 底层内存泄漏*/
-        fixInputMethodManagerLeak(activity)
-        debugLog("PageDestory","页面销毁======>$localClassName")
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:39
-     * @Note   获取Activity_LayoutId
-     */
-    protected abstract fun getLayId(): Int
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:44
-     * @Note   执行绑定Dagger操作
-     */
-    protected abstract fun bindDagger()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:45
-     * @Note   执行初始化操作
-     */
-    protected abstract fun init()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:45
-     * @Note   执行绑定事件操作
-     */
-    protected abstract fun bindEvent()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:46
-     * @Note   执行销毁相关操作
-     */
-    protected abstract fun destory()
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/1/19 下午6:03
-     * @Note   绑定View接口
-     */
-    protected open fun attachView() {
-        presenter.attachView(this )
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/10 下午3:17
-     * @Note   解绑View接口
-     */
-    protected open fun detachView(){
-        presenter.detachView()
-    }
-
-
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:37
-     * @Note   添加callBack
-     * @param  listener 监听回调
-     */
-    override fun addLifeCycleListener(listener: (state: Int) -> Unit) {
-        lifecycleCalls.add(listener)
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:43
-     * @Note   清除生命周期监听
-     */
-    private fun removeAllCallBack(){
-        lifecycleCalls.clear()
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/3/29 上午11:44
-     * @Note   在各个生命周期监听执行
-     * @param  state 生命周期状态
-     */
-    private fun lifeCycleDo(state :Int){
-        lifecycleCalls.forEach {
-            item ->
-            item.invoke(state)
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/27 下午1:22
-     * @Note   页面返回数据
-     * @param  resultCode 返回码
-     * @param  data       数据
-     */
-    open fun resultHandle(resultCode: Int,data: Intent?){
-
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseActivity
-     * @Date   2018/5/27 下午1:22
-     * @Note   页面返回数据回调
-     */
-    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        super.onActivityResult(requestCode, resultCode, data)
-        getTakePhoto()!!.onActivityResult(requestCode, resultCode, data)
-        resultHandle(resultCode,data)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.BaseActivity
-     * @Data   2017/12/26 上午9:50
-     * @Note   处理4.4.2 Android底层内存泄漏
-     * @param  destContext 上下文
-     */
-    private fun fixInputMethodManagerLeak(destContext: Context?) {
-        if (destContext == null) {
-            return
-        }
-        val imm = destContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-                ?: return
-        val arr = arrayOf("mCurRootView", "mServedView", "mNextServedView")
-        var f: Field?
-        var obj_get: Any?
-        arr.indices
-                .asSequence()
-                .map { arr[it] }
-                .forEach {
-                    try {
-                        f = imm.javaClass.getDeclaredField(it)
-                        if (!f!!.isAccessible) {
-                            f!!.isAccessible = true
-                        }
-                        obj_get = f!!.get(imm)
-                        if (obj_get != null && obj_get is View) {
-                            val v_get = obj_get as View?
-                            if (v_get!!.context === destContext) { // 被InputMethodManager持有引用的context是想要目标销毁的
-                                f!!.set(imm, null) // 置空,破坏掉path to gc节点
-                            }
-                        }
-                    } catch (t: Throwable) {
-                        t.printStackTrace()
-                    }
-                }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryActivity
-     * @Data   2017/12/26 下午12:12
-     * @Note   保存参数,防止丢失
-     */
-    override fun onSaveInstanceState(outState: Bundle?) {
-        getTakePhoto()!!.onSaveInstanceState(outState)
-        super.onSaveInstanceState(outState)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryActivity
-     * @Data   2017/12/26 下午12:12
-     * @Note   获取相机返回数据
-     */
-    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
-        val type = PermissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
-        PermissionManager.handlePermissionsResult(this, type, invokeparam, this)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryActivity
-     * @Data   2017/12/26 下午12:15
-     * @Note   鉴权
-     */
-    override fun invoke(invokeParam: InvokeParam?): PermissionManager.TPermissionType {
-        val type = PermissionManager.checkPermission(TContextWrap.of(this), invokeParam!!.getMethod())
-        if (PermissionManager.TPermissionType.WAIT == type) {
-            this.invokeparam = invokeParam
-        }
-        return type
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryActivity
-     * @Data   2017/12/26 下午12:15
-     * @Note   获取TakePhoto实例
-     */
-    override fun getTakePhoto(): TakePhoto? {
-        if (takePhoto == null) {
-            takePhoto = TakePhotoInvocationHandler.of(this).bind(TakePhotoImpl(this, this)) as TakePhoto
-        }
-        return takePhoto
-    }
-
-    /**
-     * 实现获取照片成功接口 子类自由复写
-     */
-    override fun takeSuccess(result: TResult) {}
-
-    /**
-     * 实现获取照片取消接口 子类自由复写
-     */
-    override fun takeCancel() {}
-
-    /**
-     * 实现获取照片失败接口 子类自由复写
-     */
-    override fun takeFail(result: TResult?, msg: String?) {}
-}

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

@@ -1,136 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import android.content.Intent
-import android.databinding.ViewDataBinding
-import android.os.Bundle
-import com.enation.javashop.photoutils.app.TakePhoto
-import com.enation.javashop.photoutils.app.TakePhotoImpl
-import com.enation.javashop.photoutils.model.InvokeParam
-import com.enation.javashop.photoutils.model.TContextWrap
-import com.enation.javashop.photoutils.model.TResult
-import com.enation.javashop.photoutils.permission.InvokeListener
-import com.enation.javashop.photoutils.permission.PermissionManager
-import com.enation.javashop.photoutils.permission.TakePhotoInvocationHandler
-import com.enation.javashop.photoutils.uitl.TakePhotoinf
-
-/**
- * @author  LDD
- * @Data   2017/12/26 下午12:07
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   带有相册功能的Fragment基类
- */
- abstract class GalleryFragment<PresenterType : BaseContract.BasePresenter, DataBindingType : ViewDataBinding> : BaseFragment<PresenterType,DataBindingType>(), TakePhoto.TakeResultListener, InvokeListener, TakePhotoinf {
-
-    /**
-     * @Name  takePhoto
-     * @Type  com.enation.javashop.photoutils.app.TakePhoto
-     * @Note  TakePhoto对象
-     */
-    private  var takePhoto : TakePhoto? = null
-
-    /**
-     * @Name  invokeparam
-     * @Type  com.enation.javashop.photoutils.model.InvokeParam
-     * @Note  invokeparam
-     */
-    private  var invokeparam: InvokeParam? = null
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:09
-     * @Note   Activity创建时调用 相册对象注册初始化生命周期
-     */
-    override fun onCreate(savedInstanceState: Bundle?) {
-        getTakePhoto()!!.onCreate(savedInstanceState)
-        super.onCreate(savedInstanceState)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:12
-     * @Note   保存参数,防止丢失
-     */
-    override fun onSaveInstanceState(outState: Bundle?) {
-        getTakePhoto()!!.onSaveInstanceState(outState)
-        super.onSaveInstanceState(outState)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:12
-     * @Note   获取相机返回数据
-     */
-    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        getTakePhoto()!!.onActivityResult(requestCode, resultCode, data)
-        super.onActivityResult(requestCode, resultCode, data)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:12
-     * @Note   获取相机返回数据
-     */
-    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
-        val type = PermissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
-        PermissionManager.handlePermissionsResult(getActivity(), type, invokeparam, this)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:13
-     * @Note   Activity销毁时调用
-     */
-    override fun onDestroyView() {
-        takePhoto=null
-        super.onDestroyView()
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:15
-     * @Note   获取TakePhoto实例
-     */
-    override fun getTakePhoto(): TakePhoto? {
-        if (takePhoto == null) {
-            takePhoto = TakePhotoInvocationHandler.of(this).bind(TakePhotoImpl(this, this)) as TakePhoto
-        }
-        return takePhoto
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.GalleryFragment
-     * @Data   2017/12/26 下午12:15
-     * @Note   鉴权
-     */
-    override fun invoke(invokeParam: InvokeParam?): PermissionManager.TPermissionType {
-        val type = PermissionManager.checkPermission(TContextWrap.of(this), invokeParam!!.getMethod())
-        if (PermissionManager.TPermissionType.WAIT == type) {
-            this.invokeparam = invokeParam!!
-        }
-        return type
-    }
-
-
-    /**
-     * 实现获取照片成功接口 子类自由复写
-     */
-    override fun takeSuccess(result: TResult?) {}
-
-    /**
-     * 实现获取照片取消接口 子类自由复写
-     */
-    override fun takeCancel() {}
-
-    /**
-     * 实现获取照片失败接口 子类自由复写
-     */
-    override fun takeFail(result: TResult?, msg: String?) {}
-}

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

@@ -1,81 +0,0 @@
-package com.wdkl.ncs.android.lib.base
-
-import com.wdkl.ncs.android.lib.utils.errorLog
-import com.wdkl.ncs.android.lib.utils.getEventCenter
-import com.wdkl.ncs.android.lib.utils.to
-import com.wdkl.ncs.android.lib.vo.NetStateEvent
-import io.reactivex.disposables.CompositeDisposable
-import io.reactivex.disposables.Disposable
-
-/**
- * @author  LDD
- * @Data   2017/12/26 下午12:22
- * @From   com.wdkl.ncs.android.lib.base
- * @Note   Presenter基类
- */
-abstract class RxPresenter<out ViewType : BaseContract.BaseView> : DisposableManager() , BaseContract.BasePresenter {
-
-     /**
-      * @Name  mView
-      * @Type  T : BaseContract.BaseView
-      * @Note  View接口
-      */
-     private var mView: ViewType? = null
-
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.RxPresenter
-     * @Data   2017/12/26 下午12:31
-     * @Note   注入View接口和API 注册网络状态Event
-     * @param  view View接口
-     * @param  api  API
-     */
-    override fun attachView(view: Any) {
-        bindDagger()
-        /**注入View接口*/
-        try {
-            this.mView = view.to()
-        }catch (e :Exception){
-            errorLog("Interface Not Implement","Fragment/Activity 没有实现对应BaseView接口")
-            throw java.lang.Exception("Interface Not Implement : Fragment/Activity 没有实现对应BaseView接口")
-        }
-        /**注册网络状态事件*/
-        var disposable = getEventCenter().register(NetStateEvent::class.java) {
-            result ->
-            this.mView!!.networkMonitor(result.state)
-        }
-        addDisposable(disposable)
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.base.RxPresenter
-     * @Data   2017/12/26 下午12:35
-     * @Note   销毁操作
-     */
-    override fun detachView() {
-        this.mView = null
-        unDisposable()
-    }
-
-    /**
-     * @author LDD
-     * @Date   2018/1/19 下午6:16
-     * @From   com.wdkl.ncs.android.lib.base.RxPresenter
-     * @Note   依赖注入初始化
-     */
-    abstract fun bindDagger()
-
-    /**
-     * @author LDD
-     * @From   RxPresenter
-     * @Date   2018/1/19 下午6:16
-     * @Note   View接口提供者
-     * @return View接口
-     */
-    fun providerView():ViewType{
-        return mView!!
-    }
-
-}

+ 0 - 103
common/src/main/code/com/wdkl/ncs/android/lib/bind/BaseBindingHelper.kt

@@ -1,103 +0,0 @@
-package com.wdkl.ncs.android.lib.bind
-
-import android.databinding.BindingAdapter
-import android.os.Build
-import android.support.constraint.ConstraintLayout
-import android.text.SpannableStringBuilder
-import android.text.Spanned
-import android.text.style.AbsoluteSizeSpan
-import android.util.TypedValue
-import android.view.View
-import android.widget.ImageView
-import android.widget.TextView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.engine.DiskCacheStrategy
-import com.wdkl.ncs.android.lib.base.BaseApplication
-import com.wdkl.ncs.android.lib.utils.errorLog
-import com.wdkl.ncs.android.lib.utils.getColorCompatible
-import com.wdkl.ncs.android.lib.utils.then
-import com.enation.javashop.imagepluin.R
-import com.enation.javashop.utils.base.tool.ScreenTool
-
-/**
- * @author LDD
- * @Date   2018/1/19 下午3:20
- * @From   com.wdkl.ncs.android.lib.bind
- * @Note   databinding辅助类
- */
-object BaseBindingHelper {
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.binding.BindingHelper
-     * @Data   2017/12/26 上午9:23
-     * @Note   加载图片
-     * @param  imageView 需要加载图片的ImageView
-     * @param  url       图片Url
-     */
-    @BindingAdapter(value = ["bind:url"],requireAll = false)
-    @JvmStatic fun loadImage(imageView: ImageView?, url: String?) {
-        if(imageView == null || url == null ||url == ""){
-            return
-        }
-        Glide.with(imageView.context).load(url).thumbnail(0.1f).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.image_loading).error(R.drawable.image_error).into(imageView)
-    }
-
-    @BindingAdapter(value = ["bind:url_without_holder"],requireAll = false)
-    @JvmStatic fun loadImageWithoutHoldlder(imageView: ImageView?, url: String?) {
-        if(imageView == null || url == null ||url == ""){
-            return
-        }
-        Glide.with(imageView.context).load(url).thumbnail(0.1f).diskCacheStrategy(DiskCacheStrategy.ALL).error(R.drawable.image_error).into(imageView)
-    }
-    /**
-     * @author LDD
-     * @From   BaseBindingHelper
-     * @Date   2018/2/24 下午2:22
-     * @Note   显示价格大小
-     * @param  value 价格
-     */
-    @BindingAdapter(value = ["bind:price_text"], requireAll = false)
-    @JvmStatic
-    fun setPriceText(view: TextView, value: Double) {
-        view.text = SpannableStringBuilder("¥$value").then { self ->
-            self.setSpan(AbsoluteSizeSpan(ScreenTool.dip2px(view.context, 12f)), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
-            self.setSpan(AbsoluteSizeSpan(ScreenTool.dip2px(view.context, 15f)), 1, self.indexOf("."), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
-            self.setSpan(AbsoluteSizeSpan(ScreenTool.dip2px(view.context, 12f)), self.indexOf("."), self.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
-        }
-    }
-    /**
-     * @author LDD
-     * @From   HomeFragmentBindHelper
-     * @Date   2018/1/30 下午3:05
-     * @Note   透明渐变
-     */
-    @BindingAdapter(value = ["bind:alpha"],requireAll = false)
-    @JvmStatic fun backgroundGradient(view: ConstraintLayout, value:Int){
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            var alpha = value
-            if (alpha > 255) {
-                alpha = 255
-                if (view.background.alpha == 255) {
-                    return
-                }
-            }
-            view.background.alpha = alpha
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseBindingHelper
-     * @Date   2018/2/28 上午9:34
-     * @Note   解决ConstraintLayout 无法上色
-     */
-    @BindingAdapter(value = ["bind:backgroundColor"],requireAll = false)
-    @JvmStatic fun setBackgroundColor(view : View, value: Int){
-        view.setBackgroundColor(value)
-    }
-
-    @BindingAdapter(value = ["bind:text_count_for_line"],requireAll = true)
-    @JvmStatic fun setTextSize(tv :TextView , textCount :Int){
-        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX,ScreenTool.getScreenWidth(BaseApplication.appContext)/textCount)
-    }
-}

+ 0 - 97
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/ActivityLifeController.kt

@@ -1,97 +0,0 @@
-package com.wdkl.ncs.android.lib.core.framework
-
-import android.app.Activity
-import android.app.Application
-import android.os.Bundle
-import com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-import com.wdkl.ncs.android.lib.utils.AutoClearHelper
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午7:45
- * @From   com.wdkl.ncs.android.lib.core.framework
- * @Note   Activity生命周期回调
- */
-class ActivityLifeController :Application.ActivityLifecycleCallbacks {
-
-    /**
-     * @Name  autoClearHelper
-     * @Type  com.wdkl.ncs.android.lib.utils.AutoClearHelper
-     * @Note  变量清理辅助类
-     */
-    private var isOpenAutoClear = false
-
-    /**
-     * @author  LDD
-     * @From    ActivityLifeController
-     * @Data   2017/12/26 上午7:48
-     * @Note   开启
-     */
-    fun withAutoValueHelper():ActivityLifeController{
-        isOpenAutoClear = true
-        return this
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework ActivityLifeController
-     * @Data   2017/12/26 上午8:22
-     * @Note   Activity处于不显示或者半透明状态
-     * @return Activity
-     */
-    override fun onActivityPaused(p0: Activity?) {
-
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework ActivityLifeController
-     * @Data   2017/12/26 上午8:22
-     * @Note   Activity处于完全显示状态
-     * @return Activity
-     */
-    override fun onActivityResumed(p0: Activity?) {
-
-    }
-
-    override fun onActivityStarted(p0: Activity?) {
-
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework ActivityLifeController
-     * @Data   2017/12/26 上午8:20
-     * @Note   Activity销毁方法
-     * @return 销毁的Activity
-     */
-    override fun onActivityDestroyed(p0: Activity?) {
-        if (p0 != null && isOpenAutoClear) {
-            AutoClearHelper.intance.destory(p0.localClassName)
-        }
-        if (p0 != null) {
-            JavaShopActivityTask.instance.popFromActivityStack(p0)
-        }
-    }
-
-    override fun onActivitySaveInstanceState(p0: Activity?, p1: Bundle?) {
-
-    }
-
-    override fun onActivityStopped(p0: Activity?) {
-
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework ActivityLifeController
-     * @Data   2017/12/26 上午8:25
-     * @Note   Activity创建回调
-     * @param  p0 创建的Activity
-     */
-    override fun onActivityCreated(p0: Activity?, p1: Bundle?) {
-        if (p0 != null) {
-            JavaShopActivityTask.instance.pushToActivityStack(p0)
-        }
-    }
-}

+ 0 - 67
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/Framework.kt

@@ -1,67 +0,0 @@
-package com.wdkl.ncs.android.lib.core.framework
-
-import android.app.Application
-import com.wdkl.ncs.android.lib.core.runtime.ClassNotFoundInterceptor
-import com.wdkl.ncs.android.lib.core.split.ComponentManager
-import com.wdkl.ncs.android.lib.core.split.ComponentManagerImpl
-import com.wdkl.ncs.android.lib.utils.Do
-import java.io.File
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午8:28
- * @From   com.wdkl.ncs.android.lib.core.framework
- * @Note   JavaShop FrameWork层入口
- */
- class Framework {
-
-    /**
-     * @author  LDD
-     * @Data   2017/12/26 上午8:29
-     * @From   com.wdkl.ncs.android.lib.core.framework Framework
-     * @Note   Framework伴生对象
-     */
-    companion object {
-
-        /**
-         * @Name  com.wdkl.ncs.android.lib.core.framework.Framework.Companion.classNotFoundInterceptor
-         * @Type  com.wdkl.ncs.android.lib.core.runtime.ClassNotFoundInterceptor
-         * @Note  Class拦截器在Class文件查找失败时执行
-         */
-        var classNotFoundInterceptor : ClassNotFoundInterceptor? = null
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-         * @Data   2017/12/26 上午8:32
-         * @Note   初始化Activity生命周期监听器
-         * @param  app  应用Application对象
-         */
-        fun initActivityLifeController(app:Application){
-            app.registerActivityLifecycleCallbacks(ActivityLifeController().withAutoValueHelper())
-        }
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-         * @Data   2017/12/26 上午8:35
-         * @Note   Moudle安装
-         * @param  pakeageName    模块包名
-         * @param  moudleLocation 模块物理路径
-         */
-        fun installMoudle(pakeageName:String, moudleLocation:File){
-            ComponentManager.get().installMoudle(pakeageName,moudleLocation)
-        }
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-         * @Data   2017/12/26 上午8:36
-         * @Note   Moudle卸载
-         * @param  pakeageName 根据包名进行卸载
-         */
-        fun unstallMoudle(pakeageName:String){
-            ComponentManager.get().unstallMoudle(pakeageName)
-        }
-    }
-}

+ 0 - 161
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/InstallResourceHelper.kt

@@ -1,161 +0,0 @@
-package com.wdkl.ncs.android.lib.core.framework
-
-import android.content.Context
-
-
-/**
- * @author LDD
- * @Date   2018/1/17 上午10:15
- * @From   com.wdkl.ncs.android.middleware.resource
- * @Note   加载已安装资源
- */
-class InstallResourceHelper {
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:15
-     * @Note   私有构造方法 防止外部实例化
-     */
-    private constructor()
-
-    /**
-     * @Name  install
-     * @Type  ResourceManager.Installed
-     * @Note  已安装资源
-     */
-    private lateinit var install :ResourceManager.Installed
-
-    /**
-     * @Name  CurrentPackageName
-     * @Type  String
-     * @Note  资源包名
-     */
-    private lateinit var CurrentPackageName : String
-
-    /**
-     * @author LDD
-     * @Date   2018/1/17 上午10:16
-     * @From   InstallResourceHelper
-     * @Note   伴生对象 实现单例
-     */
-    companion object {
-        /**
-         * @Name  com.wdkl.ncs.android.lib.core.framework.InstallResourceHelper.Companion.instance
-         * @Type  com.wdkl.ncs.android.lib.core.framework.InstallResourceHelper
-         * @Note  单例对象 懒加载
-         */
-        private val instance by lazy { InstallResourceHelper() }
-
-        /**
-         * @author LDD
-         * @From   Companion
-         * @Date   2018/1/17 上午10:17
-         * @Note   获取单例对象
-         * @return 已安装文件资源
-         */
-        fun get(): InstallResourceHelper {
-            return instance
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:18
-     * @Note   初始化
-     * @param  context 上下文 一般为Application
-     * @param  packageName 需要加在资源的包名
-     */
-    fun initInstalled(context :Context,packageName:String?){
-        CurrentPackageName = if (packageName == null) {context.applicationContext.packageName} else {packageName}
-        ResourceManager.init(context)
-        install = ResourceManager.installed()
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:19
-     * @Note   初始化 该方法一般用于加载本地资源 用于资源获取出错时使用
-     * @param  context 上下文 一般为Application
-     */
-    fun initInstalled(context: Context){
-        initInstalled(context,null)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取mipmap资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getMipmapId(name : String):Int{
-        return install.getResourceID(CurrentPackageName,"mipmap",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取drawble资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getDrawableId(name : String):Int{
-        return install.getResourceID(CurrentPackageName,"drawble",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取color资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getColorId(name : String):Int{
-
-        return install.getResourceID(CurrentPackageName,"color",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取style资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getStyleId(name : String):Int{
-
-        return install.getResourceID(CurrentPackageName,"style",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取string资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getStringId(name : String):Int{
-        return install.getResourceID(CurrentPackageName,"string",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取anim资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getAnimId(name : String):Int{
-        return install.getResourceID(CurrentPackageName,"anim",name)
-    }
-
-}

+ 0 - 75
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/JavaShopInstrumentationHook.java

@@ -1,75 +0,0 @@
-package com.wdkl.ncs.android.lib.core.framework;
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.util.Log;
-import java.lang.reflect.Method;
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午8:38
- * @From   com.wdkl.ncs.android.lib.core.framework
- * @Note   Instrumentation 的自定义Hook
- */
-public class JavaShopInstrumentationHook extends Instrumentation {
-
-    /**
-     * @Name  oldInstrumentation
-     * @Type  android.app.Instrumentation
-     * @Note  系统原始Instrumentation
-     */
-    public Instrumentation oldInstrumentation;
-
-    /**
-     * @Name  EXEC_START_ACTIVITY
-     * @Type  java.lang.String
-     * @Note  execStartActivity方法名 反射时使用
-     */
-    public static final String EXEC_START_ACTIVITY = "execStartActivity";
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework JavaShopInstrumentationHook
-     * @Data   2017/12/26 上午8:43
-     * @Note   构造方法 传入原始 Instrumentation
-     * @param  oldInstrumentation 原始 Instrumentation
-     */
-    public JavaShopInstrumentationHook(Instrumentation oldInstrumentation) {
-        this.oldInstrumentation = oldInstrumentation;
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework
-     * @Data   2017/12/26 上午8:42
-     * @Note   这个方法是由于原始方法里面的Instrumentation有execStartActivity方法来定的
-     */
-    public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,
-                                            Intent intent, int requestCode, Bundle options) {
-        Method execStartActivity = null;
-        //由于这个方法是隐藏的,所以需要反射来调用,先找到这方法
-        try {
-            execStartActivity = Instrumentation.class.getDeclaredMethod(
-                    EXEC_START_ACTIVITY,
-                    Context.class, IBinder.class, IBinder.class, Activity.class,
-                    Intent.class, int.class, Bundle.class);
-            //因为该属性为私有 设置权限
-            execStartActivity.setAccessible(true);
-            return (ActivityResult) execStartActivity.invoke(oldInstrumentation, who,
-                    contextThread, token, target, intent, requestCode, options);
-        } catch (Exception e) {
-
-            try {
-                return (ActivityResult) execStartActivity.invoke(oldInstrumentation, who,
-                        contextThread, token, target, Framework.Companion.getClassNotFoundInterceptor().call(target,intent), requestCode, options);
-            } catch (Exception e1) {
-                Log.e("StartActivityError",e1.getMessage());
-                return null;
-            }
-        }
-    }
-}

+ 0 - 269
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/ResourceManager.java

@@ -1,269 +0,0 @@
-package com.wdkl.ncs.android.lib.core.framework;
-
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.util.Log;
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-
-import dalvik.system.DexClassLoader;
-
-public class ResourceManager {
-
-    private static final String TAG = "ResourceManager";
-
-    private ResourceManager() {
-    }
-
-    public static void init(Context context) {
-        UnInstalled.sManager.init(context);
-        Installed.sManager.init(context);
-    }
-
-    public static UnInstalled unInstalled() {
-        return UnInstalled.sManager;
-    }
-
-    public static Installed installed() {
-        return Installed.sManager;
-    }
-
-    /**
-     * 针对于未安装应用
-     */
-    public static class UnInstalled {
-
-        static final UnInstalled sManager = new UnInstalled();
-
-        private Context mContext;
-        private Map<String, LoadedResource> mRescources = new HashMap<String, LoadedResource>();
-        private String mDexDir;
-
-        private UnInstalled() {
-
-        }
-
-        /**
-         * 初始化
-         *
-         * @param context
-         */
-        public void init(Context context) {
-            mContext = context.getApplicationContext();
-            File dexDir = mContext.getDir("dex", Context.MODE_PRIVATE);
-            if (!dexDir.exists()) {
-                dexDir.mkdir();
-            }
-            mDexDir = dexDir.getAbsolutePath();
-        }
-
-        /**
-         * 获取未安装应用资源的ID
-         *
-         * @param packageName
-         * @param fieldName
-         * @return
-         */
-        public int getResourceID(String packageName, String type, String fieldName) {
-            int resID = 0;
-            LoadedResource recource = getUnInstalledRecource(packageName);
-            String rClassName = packageName + ".R$" + type;
-            Log.w(TAG, "resource class:" + rClassName + ",fieldName:" + fieldName);
-            try {
-                Class cls = recource.classLoader.loadClass(rClassName);
-                resID = (Integer) cls.getField(fieldName).get(null);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            return resID;
-        }
-
-        /**
-         * 获取未安装应用Drawable
-         *
-         * @param packageName
-         * @param fieldName
-         * @return
-         */
-        public Drawable getDrawable(String packageName, String fieldName) {
-            Drawable drawable = null;
-            int resourceID = getResourceID(packageName, "drawable", fieldName);
-            LoadedResource recource = getUnInstalledRecource(packageName);
-            if (recource != null) {
-                drawable = recource.resources.getDrawable(resourceID);
-            }
-            return drawable;
-        }
-
-        /**
-         * 加载未安装应用资源包
-         *
-         * @param resourcePath
-         * @return
-         */
-        public LoadedResource loadResource(String resourcePath) {
-
-            LoadedResource loadResource = null;
-
-            PackageInfo info = queryPackageInfo(resourcePath);    //    获取未安装APK的PackageInfo
-            if (info != null) {    //   获取成功
-                loadResource = mRescources.get(info.packageName);    // 先从缓存中取, 存在则直接返回, 不重复添加. 否则就搜索添加
-                if (loadResource == null) {
-                    try {
-                        AssetManager assetManager = AssetManager.class.newInstance();    // 创建AssetManager实例
-                        Class cls = AssetManager.class;
-                        Method method = cls.getMethod("addAssetPath", String.class);
-                        method.invoke(assetManager, resourcePath);    // 反射设置资源加载路径
-                        Resources resources = new Resources(assetManager, mContext.getResources().getDisplayMetrics(),
-                                mContext.getResources().getConfiguration());    // 构造出正确的Resource
-                        loadResource = new LoadedResource();
-                        loadResource.resources = resources;
-                        loadResource.packageName = info.packageName;
-                        loadResource.classLoader = new DexClassLoader(resourcePath, mDexDir, null,
-                                mContext.getClassLoader());    //    设置正确的类加载器, 因为需要去加载R文件
-                        mRescources.put(info.packageName, loadResource);    // 缓存
-                        Log.w(TAG, "build resource:" + resourcePath);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-            }
-
-            Log.w(TAG, "load resource:" + resourcePath);
-            return loadResource;
-
-        }
-
-        /**
-         * 获取未安装应用PackageInfo
-         *
-         * @param resourcePath
-         * @return
-         */
-        private PackageInfo queryPackageInfo(String resourcePath) {
-            return mContext.getPackageManager().getPackageArchiveInfo(resourcePath, PackageManager.GET_ACTIVITIES);
-        }
-
-        /**
-         * 获取未安装应用LoadResource
-         *
-         * @param packageName
-         * @return
-         */
-        public LoadedResource getUnInstalledRecource(String packageName) {
-            LoadedResource loadResource = mRescources.get(packageName);
-            if (loadResource == null) {
-                Log.w(TAG, "resource " + packageName + " not founded");
-            }
-            return loadResource;
-        }
-
-    }
-
-    /**
-     * 针对于已安装应用
-     */
-    public static class Installed {
-        static final Installed sManager = new Installed();
-
-        private Context mContext;
-        private Map<String, LoadedResource> mResources = new HashMap<String, LoadedResource>();
-
-        private Installed() {
-
-        }
-
-        /**
-         * 初始化
-         *
-         * @param context
-         */
-        public void init(Context context) {
-            mContext = context.getApplicationContext();
-        }
-
-        /**
-         * 获取已安装应用资源
-         *
-         * @param packageName
-         */
-        public LoadedResource getInstalledResource(String packageName) {
-
-            LoadedResource resource = mResources.get(packageName);    // 先从缓存中取, 没有就去加载
-
-            if (resource == null) {
-                try {
-                    Context context = mContext.createPackageContext(packageName,
-                            Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
-                    resource = new LoadedResource();
-                    resource.packageName = packageName;
-                    resource.resources = context.getResources();
-                    resource.classLoader = context.getClassLoader();
-                    mResources.put(packageName, resource);    // 得到结果缓存起来
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-
-            return resource;
-        }
-
-        /**
-         * 获取资源ID
-         *
-         * @param packageName
-         * @param type
-         * @param fieldName
-         * @return
-         */
-        public int getResourceID(String packageName, String type, String fieldName) {
-
-            int resID = 0;
-            LoadedResource installedResource = getInstalledResource(packageName);    // 获取已安装APK的资源
-            if (installedResource != null) {
-                String rClassName = packageName + ".R$" + type;    // 根据匿名内部类的命名, 拼写出R文件的包名+类名
-                try {
-                    Class cls = installedResource.classLoader.loadClass(rClassName);    //  加载R文件
-                    resID = (Integer) cls.getField(fieldName).get(null);    //  反射获取R文件对应资源名的ID
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            } else {
-                Log.w(TAG, "resource is null:" + packageName);
-            }
-            return resID;
-        }
-
-        /**
-         * 获取已加载应用Drawable
-         *
-         * @param packageName
-         * @param fieldName
-         * @return
-         */
-        public Drawable getDrawable(String packageName, String fieldName) {
-            Drawable drawable = null;
-            int resourceID = getResourceID(packageName, "drawable", fieldName);
-            LoadedResource installedResource = getInstalledResource(packageName);
-            if (installedResource != null) {
-                drawable = installedResource.resources.getDrawable(resourceID);
-            }
-            return drawable;
-        }
-    }
-    public static class LoadedResource {
-        public Resources resources;
-        public String packageName;
-        public ClassLoader classLoader;
-    }
-}
-
-
-

+ 0 - 141
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/UnInstallResourceHelper.kt

@@ -1,141 +0,0 @@
-package com.wdkl.ncs.android.lib.core.framework
-
-import android.content.Context
-
-/**
- * @author LDD
- * @Date   2018/1/17 上午10:26
- * @From   com.wdkl.ncs.android.middleware.resource
- * @Note   加载未安装apk的资源文件
- */
-class UnInstallResourceHelper {
-
-    /**
-     * @Name  resource
-     * @Type  ResourceManager.LoadedResource
-     * @Note  加载完成的资源
-     */
-    private lateinit var resource : ResourceManager.LoadedResource
-
-    /**
-     * @Name  packageName
-     * @Type  String
-     * @Note  资源包名
-     */
-    private lateinit var packageName : String
-
-    /**
-     * @author LDD
-     * @Date   2018/1/17 上午10:23
-     * @From   com.wdkl.ncs.android.middleware.resource
-     * @Note   伴生对象
-     */
-    companion object {
-
-        /**
-         * @Name  com.wdkl.ncs.android.lib.core.framework.UnInstallResourceHelper.Companion.instance
-         * @Type  com.wdkl.ncs.android.lib.core.framework.UnInstallResourceHelper
-         * @Note  单例
-         */
-        private val instance by lazy { UnInstallResourceHelper() }
-
-        /**
-         * @author LDD
-         * @From   Companion
-         * @Date   2018/1/17 上午10:25
-         * @Note   获取单例对象
-         * @return 未安装资源
-         */
-        fun get(): UnInstallResourceHelper {
-            return instance
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   UnInstallResourceHelper
-     * @Date   2018/1/17 上午10:22
-     * @Note   初始化
-     * @param  context 用户上下文
-     * @param  path    外部资源路径
-     */
-    fun init(context: Context,path:String){
-        ResourceManager.init(context)
-        resource = ResourceManager.unInstalled().loadResource(path)
-        packageName = resource.packageName
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取mipmap资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getMipmapId(name : String):Int{
-        return ResourceManager.unInstalled().getResourceID(packageName,"mipmap",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取drawable资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getDrawableId(name : String):Int{
-        return ResourceManager.unInstalled().getResourceID(packageName,"drawble",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取color资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getColorId(name : String):Int{
-
-        return ResourceManager.unInstalled().getResourceID(packageName,"color",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取style资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getStyleId(name : String):Int{
-
-        return ResourceManager.unInstalled().getResourceID(packageName,"style",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取string资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getStringId(name : String):Int{
-        return ResourceManager.unInstalled().getResourceID(packageName,"string",name)
-    }
-
-    /**
-     * @author LDD
-     * @From   InstallResourceHelper
-     * @Date   2018/1/17 上午10:20
-     * @Note   获取anim资源ID
-     * @param  name 资源名
-     * @return 资源ID
-     */
-    fun getAnimId(name : String):Int{
-        return ResourceManager.unInstalled().getResourceID(packageName,"anim",name)
-    }
-}

+ 0 - 68
common/src/main/code/com/wdkl/ncs/android/lib/core/hack/AndroidHack.kt

@@ -1,68 +0,0 @@
-package com.wdkl.ncs.android.lib.core.hack
-
-import android.app.Instrumentation
-import android.util.Log
-import com.wdkl.ncs.android.lib.core.framework.JavaShopInstrumentationHook
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午8:49
- * @From   com.wdkl.ncs.android.lib.core.hack
- * @Note   JavaShop Hack入口
- */
-class AndroidHack {
-
-    /**
-     * 伴生对象
-     */
-    companion object {
-
-            /**
-             * @author  LDD
-             * @From   com.wdkl.ncs.android.lib.core.hack.AndroidHack Companion
-             * @Data   2017/12/26 上午8:50
-             * @Note   替换系统 hookInstrumentation 为null时自动进行JavaShopInstrumentationHook
-             * @param  instrumentationHook 需要进行hook的自定义Instrumentation
-             */
-            fun hookInstrumentation(instrumentationHook: Instrumentation?){
-
-                try {
-                    val mMainThreadClass = Class.forName("android.app.ActivityThread")
-
-                    //获取主线程
-                    val getMainThread = mMainThreadClass.getDeclaredMethod("currentActivityThread")
-                    //私有属性 设置访问权限
-                    getMainThread.isAccessible = true
-                    val currentActivityThread = getMainThread.invoke(null)
-
-                    // 获取mInstrumentation对象
-                    val mInstrumentationField = mMainThreadClass.getDeclaredField("mInstrumentation")
-                    //私有属性 设置访问权限
-                    mInstrumentationField.isAccessible = true
-                    //获取系统Instrumentation
-                    val instrumentation = mInstrumentationField.get(currentActivityThread) as Instrumentation
-                    // Hook Instrumentation 替换成我们自定义Instrumentation
-                    if (instrumentationHook==null){
-                        mInstrumentationField.set(currentActivityThread, JavaShopInstrumentationHook(instrumentation))
-                    }else{
-                        mInstrumentationField.set(currentActivityThread,instrumentationHook)
-                    }
-
-                    Log.i("InstrumentationHook", "JavaShop hook instrumentation success!")
-                } catch (ex: Exception) {
-                    Log.e("InstrumentationHook", "JavaShop hook instrumentation failed! [" + ex.message + "]")
-                }
-
-            }
-
-            /**
-             * @author  LDD
-             * @From   com.wdkl.ncs.android.lib.core.hack.AndroidHack Companion
-             * @Data   2017/12/26 上午8:53
-             * @Note   执行1参hookInstrumentation方法 直接使用JavaShopInstrumentationHook
-             */
-            fun hookInstrumentation(){
-                hookInstrumentation(null)
-            }
-        }
-}

+ 0 - 23
common/src/main/code/com/wdkl/ncs/android/lib/core/runtime/ClassNotFoundInterceptor.kt

@@ -1,23 +0,0 @@
-package com.wdkl.ncs.android.lib.core.runtime
-
-import android.content.Context
-import android.content.Intent
-
-/**
- * @author  LDD
- * @Data   2017/12/26 上午8:56
- * @From   com.wdkl.ncs.android.lib.core.runtime
- * @Note   拦截器接口
- */
-interface ClassNotFoundInterceptor {
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.runtime ClassNotFoundInterceptor
-     * @Data   2017/12/26 上午8:57
-     * @Note   拦截器回调方法
-     * @param  context 上下文
-     * @param  intent  Intent
-     */
-    fun call(context:Context,intent :Intent?):Intent?
-}

+ 0 - 136
common/src/main/code/com/wdkl/ncs/android/lib/core/runtime/JavaShopActivityTask.kt

@@ -1,136 +0,0 @@
-package com.wdkl.ncs.android.lib.core.runtime
-
-import android.app.Activity
-import java.lang.ref.WeakReference
-import java.util.ArrayList
-
- /**
-  * @author  LDD
-  * @Data   2017/12/26 上午9:00
-  * @From   com.wdkl.ncs.android.lib.core.runtime
-  * @Note   Activity栈
-  */
- class JavaShopActivityTask {
-
-     /**
-      * @Name  activityList
-      * @Type  java.util.ArrayList
-      * @Note  Activity序列
-      */
-    private var activityList = ArrayList<WeakReference<Activity>>()
-
-     /**
-      * 伴生对象
-      */
-    companion object {
-         /**
-          * @Name  com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask.Companion.instance
-          * @Type  com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-          * @Note  单例
-          */
-         val instance = JavaShopActivityTask()
-    }
-
-     /**
-      * 构造方法私有化
-      */
-     private constructor()
-
-     /**
-      * @author  LDD
-      * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-      * @Data   2017/12/26 上午9:08
-      * @Note   获取当前应用Activity栈
-      * @return 当前应用Activity栈
-      */
-    fun getActivityArray(): ArrayList<WeakReference<Activity>>{
-        return activityList
-    }
-
-     /**
-      * @author  LDD
-      * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-      * @Data   2017/12/26 上午9:09
-      * @Note   获取当前栈顶Activity
-      * @return 当前栈顶Activity
-      */
-    fun peekTopActivity(): Activity? {
-        if (activityList != null && activityList.size > 0) {
-            val ref = activityList.get(activityList.size - 1)
-            if (ref != null && ref!!.get() != null) {
-                return ref!!.get()
-            }
-        }
-        return null
-    }
-
-     /**
-      * @author  LDD
-      * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-      * @Data   2017/12/26 上午9:13
-      * @Note   Activity创建时调用 添加activity到栈中
-      * @param  activity 新创建的Activity
-      */
-    fun pushToActivityStack(activity: Activity) {
-        activityList.add(WeakReference(activity))
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-     * @Data   2017/12/26 上午9:14
-     * @Note   activity销毁时调用 在栈中移除销毁的Activity
-     * @param  activity 销毁的Activity
-     */
-    fun popFromActivityStack(activity: Activity) {
-        for (x in activityList.indices) {
-            val ref = activityList.get(x)
-            if (ref != null && ref!!.get() != null && ref!!.get() === activity) {
-                activityList.remove(ref)
-                return
-            }
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-     * @Data   2017/12/26 上午9:16
-     * @Note   清除当前Activity栈
-     */
-    fun clearActivityStack() {
-        try {
-            for (ref in activityList) {
-                if (ref != null && ref!!.get() != null && !ref!!.get()!!.isFinishing()) {
-                    ref!!.get()!!.finish()
-                }
-            }
-        } catch (e: Throwable) {
-
-        } finally {
-            activityList.clear()
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-     * @Data   2017/12/26 上午9:17
-     * @Note   判断当前Activity栈是否为空
-     * @return Boolean 是否为空
-     */
-    fun isActivityStackEmpty(): Boolean {
-        return sizeOfActivityStack() == 0
-    }
-
-     /**
-      * @author  LDD
-      * @From   com.wdkl.ncs.android.lib.core.runtime.JavaShopActivityTask
-      * @Data   2017/12/26 上午9:18
-      * @Note   获取当前Activity栈大小
-      * @return 当前Activity栈大小
-      */
-    fun sizeOfActivityStack(): Int {
-        return activityList.size
-    }
-}

+ 0 - 59
common/src/main/code/com/wdkl/ncs/android/lib/core/split/ComponentManager.kt

@@ -1,59 +0,0 @@
-package com.wdkl.ncs.android.lib.core.split
-
-import java.io.File
-
-/**
- * @author  LDD
- * @Date   2018/1/15 下午4:10
- * @From   com.wdkl.ncs.android.lib.core.split
- * @Note   组件控制器协议
- */
-interface ComponentManager {
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-     * @Data   2017/12/26 上午8:35
-     * @Note   Moudle安装
-     * @param  pakeageName    模块包名
-     * @param  moudleLocation 模块绝对路径
-     */
-    fun installMoudle(pakeageName:String, moudleLocation: File)
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-     * @Data   2017/12/26 上午8:36
-     * @Note   Moudle卸载
-     * @param  pakeageName 根据包名进行卸载
-     */
-    fun unstallMoudle(pakeageName:String)
-
-
-    /**
-     * @author  LDD
-     * @Date   2018/1/15 下午4:08
-     * @From   ComponentManager
-     * @Note   伴生对象
-     */
-    companion object {
-
-        /**
-         * @Name  com.wdkl.ncs.android.lib.core.split.ComponentManagerImpl.Companion.INSTANCE
-         * @Type  com.wdkl.ncs.android.lib.core.split.ComponentManager
-         * @Note  组件控制器单例
-         */
-        private val INSTANCE:ComponentManager by lazy { ComponentManagerImpl() }
-
-        /**
-         * @author LDD
-         * @From   Companion
-         * @Date   2018/1/15 下午4:22
-         * @Note   获取单例
-         * @return 单例
-         */
-        fun get() :ComponentManager{
-            return INSTANCE
-        }
-    }
-}

+ 0 - 36
common/src/main/code/com/wdkl/ncs/android/lib/core/split/ComponentManagerImpl.kt

@@ -1,36 +0,0 @@
-package com.wdkl.ncs.android.lib.core.split
-
-import java.io.File
-
-/**
- * @author  LDD
- * @Date   2018/1/15 下午4:10
- * @From   com.wdkl.ncs.android.lib.core.split
- * @Note   组件控制器单例
- */
-class ComponentManagerImpl : ComponentManager{
-
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-     * @Date   2017/12/26 上午8:35
-     * @Note   Moudle安装
-     * @param  pakeageName    模块包名
-     * @param  moudleLocation 模块绝对路径
-     */
-    override fun installMoudle(pakeageName:String, moudleLocation: File){
-
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.core.framework.Framework Companion
-     * @Date   2017/12/26 上午8:36
-     * @Note   Moudle卸载
-     * @param  pakeageName 根据包名进行卸载
-     */
-    override fun unstallMoudle(pakeageName:String){
-
-    }
-}

+ 0 - 15
common/src/main/code/com/wdkl/ncs/android/lib/jni/CommonJNI.kt

@@ -1,15 +0,0 @@
-package com.wdkl.ncs.android.lib.jni
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午5:29
- * @From   com.wdkl.ncs.android.lib.jni
- * @Note   JavaShop通用JNI入口
- */
-class CommonJNI {
-    init {
-        System.loadLibrary("JavaShopCommonNDK")
-    }
-
-    external fun sayHello(): String
-}

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

@@ -1,471 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.app.Activity
-import android.content.Context
-import android.content.Intent
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
-import android.graphics.Color
-import android.os.Build
-import android.os.Handler
-import android.provider.Settings
-import android.support.v4.widget.DrawerLayout
-import android.support.v7.app.AppCompatActivity
-import android.view.View
-import android.view.ViewGroup
-import android.view.WindowManager
-import android.view.animation.AlphaAnimation
-import android.view.animation.Animation
-import android.view.animation.AnimationSet
-import android.view.animation.TranslateAnimation
-import android.view.inputmethod.InputMethodManager
-import android.widget.LinearLayout
-import com.wdkl.ncs.android.lib.base.BaseApplication
-import com.enation.javashop.net.engine.utils.ThreadFromUtils
-import com.enation.javashop.utils.base.tool.ScreenTool
-import io.reactivex.BackpressureStrategy
-import io.reactivex.Flowable
-import io.reactivex.Observable
-import io.reactivex.disposables.Disposable
-import java.io.IOException
-import java.io.InputStream
-import java.net.HttpURLConnection
-import java.net.MalformedURLException
-import java.net.URL
-import java.nio.charset.Charset
-import java.text.NumberFormat
-import java.util.concurrent.TimeUnit
-
-/**
- * @author  LDD
- * @Date   2018/1/10 下午5:46
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   App通用工具类
- */
-object AppTool {
-
-    /**
-     * @author LDD
-     * @Date   2018/3/15 上午11:03
-     * @From   AppTool
-     * @Note   动画工具类
-     */
-    object Anim {
-
-        /**
-         * @author LDD
-         * @From   Anim
-         * @Date   2018/3/15 上午11:04
-         * @Note   构建popwindow进入动画
-         * @param  context 上下文
-         * @param  fromYDelta 开始y点
-         * @param  duration 动画时间
-         */
-        @JvmStatic
-        fun createPopInAnimation(context: Context, fromYDelta: Float, duration: Long): Animation {
-            val set = AnimationSet(context, null)
-            set.setFillAfter(true)
-            val animation = TranslateAnimation(0f, 0f, fromYDelta, 0f)
-            animation.setDuration(duration)
-            set.addAnimation(animation)
-            val alphaAnimation = AlphaAnimation(0f, 1f)
-            alphaAnimation.setDuration(duration)
-            set.addAnimation(alphaAnimation)
-            return set
-        }
-
-        /**
-         * @author LDD
-         * @From   Anim
-         * @Date   2018/3/15 上午11:04
-         * @Note   构建popwindow进入动画
-         * @param  context 上下文
-         * @param  toYDelta 结束y点
-         * @param  duration 动画时间
-         */
-        @JvmStatic
-        fun createPopOutAnimation(context: Context, toYDelta: Float, duration: Long): Animation {
-            val set = AnimationSet(context, null)
-            set.setFillAfter(true)
-            val animation = TranslateAnimation(0f, 0f, 0f, toYDelta)
-            animation.duration = duration
-            set.addAnimation(animation)
-            val alphaAnimation = AlphaAnimation(1f, 0f)
-            alphaAnimation.duration = duration
-            set.addAnimation(alphaAnimation)
-            return set
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @Date   2018/1/10 下午5:46
-     * @From   com.wdkl.ncs.android.lib.utils.AppTool
-     * @Note   网络工具类
-     */
-    object Net {
-
-        /**
-         * @author LDD
-         * @From   Net
-         * @Date   2018/1/16 下午1:07
-         * @Note   验证网速 并toast
-         * @param  bits 网速
-         */
-        @JvmStatic
-        fun verifyNetSpeed(bits: Double) {
-            if (bits < 100) {
-                showMessage("当前网络质量差")
-            }
-        }
-
-        /**
-         * @author LDD
-         * @From   Net
-         * @Date   2018/1/16 下午1:07
-         * @Note   验证网速 网络不好时执行回调  由使用者决定是否显示Toast信息
-         * @param  bits 网速
-         */
-        @JvmStatic
-        fun verifyNetSpeed(bits: Double, callBack: (() -> (Unit)) -> (Unit)) {
-            val toastCallBack = {
-                showMessage("当前网络质量差")
-            }
-            if (bits < 100) {
-                callBack.invoke(toastCallBack)
-            }
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @Date   2018/1/10 下午5:46
-     * @From   com.wdkl.ncs.android.lib.utils.AppTool
-     * @Note   RxJava工具类
-     */
-    object Rx {
-
-    }
-
-    /**
-     * @author LDD
-     * @Date   2018/5/18 上午11:27
-     * @From   com.wdkl.ncs.android.lib.utils.AppTool
-     * @Note   文件工具类
-     */
-    object File {
-
-        /**
-         * @author LDD
-         * @From   File
-         * @Date   2018/5/18 上午11:33
-         * @Note   读取Assets文件夹下的配置信息
-         * @param  context  上下文
-         * @param  fileName 文件名
-         */
-        @JvmStatic
-        fun readAssetsText(context: Context, fileName: String): String {
-            try {
-                val ins = context.assets.open(fileName)
-                val size = ins.available()
-                var buffer = ByteArray(size)
-                ins.read(buffer)
-                ins.close()
-                var text = String(buffer, Charset.forName("utf-8"))
-                return text
-            } catch (e :IOException) {
-                return "读取错误,请检查文件名"
-            }
-        }
-
-    }
-
-    /**
-     * @author LDD
-     * @Date   2018/3/15 下午3:07
-     * @From   AppTool
-     * @Note   关于时间的操作
-     */
-    object Time {
-        private val handler by lazy { Handler() }
-
-        /**
-         * @author LDD
-         * @From   com.wdkl.ncs.android.lib.utils.AppTool.Rx
-         * @Date   2018/1/10 下午5:41
-         * @Note   Observable扩展方法 延时执行
-         * @param  milliSeconds 延时毫秒数
-         * @param  handlerProcessor     处理回调
-         */
-        @JvmStatic
-        fun delay(milliSeconds: Long, handlerProcessor: () -> (Unit)) {
-            handler.postDelayed(handlerProcessor, milliSeconds)
-        }
-    }
-
-    object Calculation{
-
-        /**
-         * @author LDD
-         * @From   Calculation
-         * @Date   2018/5/21 下午3:21
-         * @Note   获取百分比
-         * @param  total 总数
-         * @param  current 当前
-         */
-        @JvmStatic
-        fun getPercentage(total: Int, current: Int): Int {
-            val numberFormat = NumberFormat.getInstance()
-            // 设置精确到小数点后2位
-            numberFormat.maximumFractionDigits = 0
-            val result = numberFormat.format(current.toFloat() / total.toFloat() * 100)
-            return Integer.valueOf(result)!!
-        }
-
-    }
-
-
-    /**
-     * @author LDD
-     * @Date   2018/1/11 上午10:31
-     * @From   com.wdkl.ncs.android.lib.utils.AppTool
-     * @Note   关于设置
-     */
-    object Setting {
-
-        /**
-         * @author  LDD
-         * @From    com.wdkl.ncs.android.lib.utils.AppTool.Setting
-         * @Date    2018/1/11 上午10:31
-         * @Note    跳转网络设置
-         * @param   activity 调用页面
-         */
-        @JvmStatic
-        fun systemNetSetting(activity: AppCompatActivity) {
-            activity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
-        }
-
-        /**
-         * @author  LDD
-         * @From    com.wdkl.ncs.android.lib.utils.AppTool.Setting
-         * @Date    2018/1/11 上午10:31
-         * @Note    跳转WIFI设置
-         * @param   activity 调用页面
-         */
-        @JvmStatic
-        fun systemWifiSetting(activity: AppCompatActivity) {
-            activity.startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
-        }
-
-        /**
-         * @author  LDD
-         * @From    com.wdkl.ncs.android.lib.utils.AppTool.Setting
-         * @Date    2018/1/11 上午10:31
-         * @Note    跳转Mobile设置
-         * @param   activity 调用页面
-         */
-        @JvmStatic
-        fun systemMobileSetting(activity: AppCompatActivity) {
-            activity.startActivity(Intent(Settings.ACTION_DATA_ROAMING_SETTINGS))
-        }
-
-        @JvmStatic
-        fun startNewActivity(activity: AppCompatActivity, intent: Intent) {
-            activity.startActivity(intent)
-        }
-    }
-
-    /**
-     * @author LDD
-     * @Date   2018/4/2 下午3:12
-     * @From   AppTool
-     * @Note   图片工具类
-     */
-    object Image {
-
-        /**
-         * @author LDD
-         * @From   Image
-         * @Date   2018/4/2 下午3:23
-         * @Note   url获取Bitmap
-         * @param  url 图片URL
-         */
-        @JvmStatic
-        fun urlToBitmap(url: String): Observable<Bitmap> {
-            return Observable.create { subscriber ->
-                var fileUrl: URL? = null
-                val bitmap: Bitmap
-
-                try {
-                    fileUrl = URL(url)
-                } catch (e: MalformedURLException) {
-                    subscriber.onError(e)
-                }
-
-
-                try {
-                    val conn = fileUrl!!.openConnection() as HttpURLConnection
-                    conn.doInput = true
-                    conn.connect()
-                    val inStream = conn.inputStream
-                    bitmap = BitmapFactory.decodeStream(inStream)
-                    inStream.close()
-                    subscriber.onNext(bitmap)
-                } catch (e: IOException) {
-                    subscriber.onError(e)
-                }
-            }
-        }
-    }
-
-    /**
-     * @author LDD
-     * @Date   2018/4/2 下午3:12
-     * @From   AppTool
-     * @Note   系统UI工具类
-     */
-    object SystemUI {
-
-        private var statusBarHeight : Int = 0
-
-        @JvmStatic fun getStatusBarHeight() : Int{
-            return statusBarHeight
-        }
-
-        @JvmStatic fun initStatusBarHeight(context: Context){
-            val resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android")
-            if (resourceId > 0) {
-                statusBarHeight = context.getResources().getDimensionPixelSize(resourceId)
-            }
-        }
-
-
-        /**
-         * @author  LDD
-         * @From   SystemUI
-         * @Date   2018/1/12 下午4:09
-         * @Note   设置状态栏透明  4.4.2及以下 不可设置导航栏变色
-         * @param  activity 需要状态栏透明的页面
-         * @param  bottomColor  导航栏变色
-         */
-        @JvmStatic
-        fun ImmersiveWithBottomBarColor(activity: Activity, bottomColor: Int) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                    //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色
-                    var window = activity.window
-                    var decorView = window.decorView
-                    //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
-                    var option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
-                    decorView.systemUiVisibility = option
-                    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
-                    window.statusBarColor = Color.TRANSPARENT
-                    //导航栏颜色也可以正常设置
-                    window.navigationBarColor = bottomColor
-                } else {
-                    var window = activity.window
-                    var attributes = window.attributes
-                    var flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
-                    attributes.flags = flagTranslucentStatus
-                    window.attributes = attributes
-                }
-            }
-        }
-
-        /**
-         * @author LDD
-         * @From   SystemUI
-         * @Date   2018/1/15 下午2:07
-         * @Note   设置当页面有drawlayout时,让drawlayout也实现变色
-         * @param  activity  需要设置的也米娜
-         * @param  rid       当页内容视图
-         */
-        @JvmStatic
-        fun KitkatNavigationViewImmersive(activity: Activity, rid: Int) {
-            //要在内容布局增加状态栏,否则会盖在侧滑菜单上
-            val rootView = activity.findViewById<ViewGroup>(android.R.id.content) as ViewGroup
-            //DrawerLayout 则需要在第一个子视图即内容试图中添加padding
-            val parentView = rootView.getChildAt(0)
-            val linearLayout = LinearLayout(activity)
-            linearLayout.orientation = LinearLayout.VERTICAL
-            //侧滑菜单
-            val drawer = parentView as DrawerLayout
-            //内容视图
-            val content = activity.findViewById<View>(rid)
-            //将内容视图从 DrawerLayout 中移除
-            drawer.removeView(content)
-            //添加内容视图
-            linearLayout.addView(content, content.layoutParams)
-            //将带有占位状态栏的新的内容视图设置给 DrawerLayout
-            drawer.addView(linearLayout, 0)
-
-            if (parentView != null && Build.VERSION.SDK_INT >= 14) {
-                parentView.fitsSystemWindows = true
-                //布局预留状态栏高度的 padding
-                if (parentView is DrawerLayout) {
-                    //将主页面顶部延伸至status bar;虽默认为false,但经测试,DrawerLayout需显示设置
-                    parentView.clipToPadding = false
-                }
-            }
-        }
-
-
-        /**
-         * @author LDD
-         * @From   SystemUI
-         * @Date   2018/1/29 下午8:28
-         * @Note   显示或隐藏导航栏
-         * @param  activity 需要操作的activity
-         * @param  isShow   显示还是隐藏
-         */
-        @JvmStatic
-        fun showNavigationBar(activity: Activity, isShow: Boolean) {
-            if (isShow) {
-                activity.window.decorView.setOnSystemUiVisibilityChangeListener(null)
-                activity.window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
-            } else {
-                activity.window.decorView.setOnSystemUiVisibilityChangeListener {
-                    activity.window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN)
-                }
-                activity.window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN)
-            }
-        }
-
-        /**
-         * @author LDD
-         * @From   SystemUI
-         * @Date   2018/4/17 下午1:44
-         * @Note   dp转px
-         * @param  dp dp大小
-         */
-        @JvmStatic
-        fun dpToPx(dp: Float): Int {
-            return ScreenTool.dip2px(BaseApplication.appContext, dp)
-        }
-
-        @JvmStatic
-        fun getNavigationBarHeight(activity: Activity): Int {
-            val resources = activity.getResources()
-            val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
-            val height = resources.getDimensionPixelSize(resourceId)
-            return height
-        }
-
-        /**
-         * @author LDD
-         * @From   SystemUI
-         * @Date   2018/5/15 下午4:47
-         * @Note   关闭软键盘
-         * @param  context 页面
-         */
-        @JvmStatic
-        fun hideKeyBoard(context: Activity) {
-            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-            if (imm.isActive && context.currentFocus != null) {
-                if (context.currentFocus.windowToken != null) {
-                    imm.hideSoftInputFromWindow(context.currentFocus.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
-                }
-            }
-        }
-    }
-}

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

@@ -1,47 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.util.Log
-import java.util.IdentityHashMap
-
-
-/**
- * @author  LDD
- * @Data   2017/12/21 下午5:25
- * @Note   自动清除数据辅助类 在Activity销毁时,自动处理其中参数,作用于该类
- * {@link com.wdkl.ncs.android.lib.utils.AutoClearValue}
- */
-class AutoClearHelper {
-
-    companion object {
-        val intance:AutoClearHelper by lazy {  AutoClearHelper() }
-    }
-
-    private constructor()
-
-    /**
-     * 储存
-     */
-    private var valueMap : IdentityHashMap<String, () -> Unit> = IdentityHashMap()
-
-    /**
-     * 创建
-     */
-    fun create(key:String,value:()->Unit){
-        valueMap.put(key,value)
-    }
-
-    /**
-     * Activity销毁时调用
-     */
-    fun destory(name :String){
-        valueMap.keys.filter { it == name }.forEach { valueMap[it]!!.invoke() }
-        valueMap.clear()
-    }
-
-    /**
-     * 获取当前AutoValuemap中Value总数
-     */
-    fun valueCount():Int{
-        return valueMap.size
-    }
-}

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

@@ -1,69 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.app.Activity
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentManager
-import android.util.Log
-
-/**
- * @author  LDD
- * @Data   2017/12/21 下午5:53
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   自动清理变量
- */
-class AutoClearValue<ValueType> {
-
-    /**
-     * @Name  value
-     * @Type  ValueType
-     * @Note  自动处理的V安略
-     */
-    private var value : ValueType? = null
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils AutoClearValue
-     * @Data   2017/12/22 下午3:40
-     * @Note   在Fragment中使用的构造方法构造方法
-     * @param  fragment 所在的Fragment
-     */
-    constructor(fragment :Fragment , value: ValueType?) {
-        fragment.fragmentManager.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks(){
-            override fun onFragmentDestroyed(fm: FragmentManager?, f: Fragment?) {
-                if (f == fragment) {
-                    this@AutoClearValue.value = null
-                    if (fm != null) {
-                        fm.unregisterFragmentLifecycleCallbacks(this)
-                    }
-                }
-            }
-        },false)
-        get()
-        this.value = value
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils AutoClearValue
-     * @Data   2017/12/22 下午3:41
-     * @Note   在Activity中使用的构造方法
-     * @param  activity 所在的Activity
-     */
-    constructor(activity: Activity,value:ValueType?){
-        AutoClearHelper.intance.create(activity.localClassName,{
-            this.value = null
-        })
-
-        this.value = value
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils AutoClearValue
-     * @Data   2017/12/21 下午5:53
-     * @Note   获取value
-     */
-    fun get() : ValueType?{
-        return value
-    }
-}

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

@@ -1,53 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.databinding.DataBindingUtil
-import android.databinding.ViewDataBinding
-import android.support.v7.widget.RecyclerView
-import android.view.LayoutInflater
-import android.view.ViewGroup
-
-/**
- * @author LDD
- * @Date   2018/2/2 下午4:02
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   RecyclerView ViewHolder 基类
- */
-class BaseRecyclerViewHolder<out BindType:ViewDataBinding>(val databinding:BindType) :RecyclerView.ViewHolder(databinding.root) {
-
-    companion object {
-        /**
-         * @author LDD
-         * @From   BaseRecyclerViewHolder
-         * @Date   2018/4/10 上午11:18
-         * @Note   快速构建
-         * @param  parent   父容器
-         * @param  layoutId 布局ID
-         */
-        fun <BindType:ViewDataBinding>build(parent: ViewGroup?,layoutId : Int) : BaseRecyclerViewHolder<BindType>{
-            return BaseRecyclerViewHolder(DataBindingUtil.bind(LayoutInflater.from(parent?.context).inflate(layoutId,parent,false)))
-        }
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseRecyclerViewHolder
-     * @Date   2018/2/2 下午4:03
-     * @Note   获取viewbinding
-     * @return ViewDataBinding
-     */
-    fun getBinding():BindType{
-        return databinding
-    }
-
-    /**
-     * @author LDD
-     * @From   BaseRecyclerViewHolder
-     * @Date   2018/2/2 下午4:05
-     * @Note   绑定数据
-     * @param  block 绑定回调
-     */
-    inline fun bind(block :(binding : BindType)-> Unit){
-        block(databinding)
-    }
-
-}

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

@@ -1,46 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import net.sourceforge.pinyin4j.PinyinHelper
-import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
-import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat
-import net.sourceforge.pinyin4j.format.HanyuPinyinToneType
-import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination
-
-
-/**
- * @author LDD
- * @Date   2018/3/27 下午5:46
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   获取汉字首字母
- */
-object ChineseSortHelper {
-    fun getFirstSpell(string: String): String {
-        val pybf = StringBuffer()
-        val arr = string.toCharArray()
-        val defaultFormat = HanyuPinyinOutputFormat()
-        defaultFormat.caseType = HanyuPinyinCaseType.LOWERCASE
-        defaultFormat.toneType = HanyuPinyinToneType.WITHOUT_TONE
-        for (i in arr.indices) {
-            if (arr[i].toInt() > 128) { //如果已经是字母就不用转换了
-                try {
-                    //获取当前汉字的全拼
-                    val temp = PinyinHelper.toHanyuPinyinStringArray(
-                            arr[i], defaultFormat)
-                    if (temp != null) {
-                        pybf.append(temp[0][0])// 取首字母
-                    }
-                } catch (e: BadHanyuPinyinOutputFormatCombination) {
-                    e.printStackTrace()
-                }
-
-            } else {
-                if (arr[i] in 'a'..'z') {
-                    arr[i].minus(32)
-                }
-                pybf.append(arr[i])
-            }
-        }
-        return pybf.toString().substring(0,1).toUpperCase()
-    }
-
-}

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

@@ -1,169 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.content.Context
-import android.net.ConnectivityManager
-import com.wdkl.ncs.android.lib.base.BaseApplication
-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.VoiNetTool
-import io.reactivex.Observer
-import io.reactivex.disposables.Disposable
-import org.json.JSONObject
-import retrofit2.HttpException
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午3:43
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   可以监听网络状态的观察者
- */
-abstract class ConnectionObserver<T> : BaseObserver<T>(BaseApplication.appContext) {
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:44
-     * @Note   实现onStar方法 在此开始执行网络监听 并执行onStartWithConnection抽象方法
-     */
-    override fun onStart() {
-        ConnectionQualityMonitor.INSTANCE.startSample()
-        onStartWithConnection()
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:46
-     * @Note   实现onNext方法 在此停止网络监听 并执行onNextWithConnection
-     *           connectionBitsOfSecond方法 传递网络状态,网络速率
-     */
-    override fun onNext(p0: T) {
-        ConnectionQualityMonitor.INSTANCE.stopSample()
-        onNextWithConnection(p0,ConnectionQualityMonitor.INSTANCE.getConnectionQuanlity())
-        connectionBitsOfSecond(ConnectionQualityMonitor.INSTANCE.getConnectionBits())
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:50
-     * @Note   实现onError方法 传递网络状态,网络速率
-     */
-    override fun onError(p0: ExceptionHandle.ResponeThrowable) {
-        ConnectionQualityMonitor.INSTANCE.stopSample()
-        onErrorWithConnection(p0,ConnectionQualityMonitor.INSTANCE.getConnectionQuanlity())
-        connectionBitsOfSecond(ConnectionQualityMonitor.INSTANCE.getConnectionBits())
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:51
-     * @Note   传递当前网络速率 需要继承者重写
-     * @param  bits 网络速率
-     */
-    open fun connectionBitsOfSecond(bits: Double){}
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:53
-     * @Note   抽象方法,子类可以监听网络请求开始,并可以获得当前网络状态
-     */
-    abstract fun onStartWithConnection()
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:55
-     * @Note   抽象方法,子类可以监听网络请求成功,并获取当前网络状态
-     * @param  result 网络请求结果
-     * @param  connectionQuality 网络状态
-     */
-    abstract fun onNextWithConnection(result:T,connectionQuality :ConnectionQuality)
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionObserver
-     * @Data   2017/12/22 下午3:56
-     * @Note   抽象方法,子类可以监听网络请求失败,并获取当前网络状态
-     * @param  error 自定义网络错误
-     * @param  connectionQuality 当前网络状态
-     */
-    abstract fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable,connectionQuality :ConnectionQuality)
-}
-
-abstract class BaseObserver<T>(private val context: Context) : Observer<T> {
-
-    override fun onSubscribe(disposable: Disposable) {
-        if (VoiNetTool.getAPNType(this.context) == VoiNetTool.netType.noneNet) {
-            //有线以太网会被判断为无网,增加以太网判断
-            if (checkEthernet(this.context)) {
-                this.onStart()
-                this.attachSubscribe(disposable)
-            } else {
-                disposable.dispose()
-                this.onNoneNet()
-            }
-        } else {
-            this.onStart()
-            this.attachSubscribe(disposable)
-        }
-
-    }
-
-    fun checkEthernet(context: Context): Boolean {
-        val connMgr = context
-                .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
-        val networkInfo = connMgr.activeNetworkInfo
-        if (networkInfo == null) {
-            return false
-        }
-        if (networkInfo.type == ConnectivityManager.TYPE_ETHERNET) {
-            return true
-        }
-
-        return false
-    }
-
-    override fun onError(e: Throwable) {
-        try {
-            if (e is HttpException) {
-                var errorJSon = e.response().errorBody()!!.getJsonString()
-                if (errorJSon.contains("html")) {
-                    this.onError(ExceptionHandle.handleException(e))
-                    return
-                }
-                val obj = JSONObject(errorJSon)
-                if (obj.has("code")) {
-                    val result = ExceptionHandle.ResponeThrowable(e, 420)
-                    result.customMessage = obj.getString("message")
-                    this.onError(result)
-                } else {
-                    this.onError(ExceptionHandle.handleException(e))
-                }
-            } else {
-                this.onError(ExceptionHandle.ResponeThrowable(e, 1000).then {
-                    if (e.message == null) {
-                        it.customMessage = "加载失败!"
-                    } else {
-                        it.customMessage = e.message
-                    }
-                })
-            }
-        } catch (exception: Exception) {
-            this.onError(e)
-        }
-
-    }
-
-    abstract fun onError(var1: ExceptionHandle.ResponeThrowable)
-
-    abstract fun onStart()
-
-    abstract fun attachSubscribe(var1: Disposable)
-
-    open fun onNoneNet() {}
-
-    override fun onComplete() {}
-}

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

@@ -1,66 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.util.Log
-import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
-import com.enation.javashop.net.engine.plugin.connection.ConnectionClassManager
-import com.enation.javashop.net.engine.plugin.connection.DeviceBandwidthSampler
-
-
-/**
- * @Coder  LDD
- * @Data   2017/12/22 下午3:58
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   网络状态监听
- */
-class ConnectionQualityMonitor {
-
-    /**伴生对象,其中的方法相当于Java的静态方法*/
-    companion object {
-        /**单利设计模式 懒汉式*/
-        val INSTANCE:ConnectionQualityMonitor by lazy { ConnectionQualityMonitor() }
-    }
-
-    /**
-     * @Coder  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionQualityMonitor
-     * @Data   2017/12/22 下午3:59
-     * @Note   开始网络取样
-     */
-    fun startSample(){
-        DeviceBandwidthSampler.getInstance().startSampling()
-    }
-
-    /**
-     * @Coder  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionQualityMonitor
-     * @Data   2017/12/22 下午3:59
-     * @Note   停止网络取样
-     */
-    fun stopSample(){
-        DeviceBandwidthSampler.getInstance().stopSampling()
-    }
-
-    /**
-     * @Coder  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionQualityMonitor
-     * @Data   2017/12/22 下午4:00
-     * @Note   获取当前网络状态
-     * @return 当前网络状态
-     */
-    fun getConnectionQuanlity() :ConnectionQuality{
-        val quanlity = ConnectionClassManager.getInstance().currentBandwidthQuality
-        return quanlity
-    }
-
-    /**
-     * @Coder  LDD
-     * @From   com.wdkl.ncs.android.lib.utils ConnectionQualityMonitor
-     * @Data   2017/12/22 下午4:00
-     * @Note   获取当前网络速率
-     * @return 当前网络速率
-     */
-    fun getConnectionBits() :Double{
-      return  ConnectionClassManager.getInstance().downloadKBitsPerSecond
-    }
-
-}

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

@@ -1,374 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.os.Looper
-import java.util.concurrent.Executors
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午4:06
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   快速切换线程工具类 保证线程执行顺序
- */
-  class Do :SendResultInterface,NomalResultInterface {
-
-    /**
-     * 伴生对象
-     */
-    companion object {
-
-        /**
-         * @author  LDD
-         * @From   com.wdkl.ncs.android.lib.utils.Do Companion
-         * @Data   2017/12/22 下午4:09
-         * @Note   初始化
-         */
-        fun prepare(): NomalResultInterface {
-            return Do()
-        }
-    }
-
-    /**
-     * @Name  threadPool
-     * @Type  ExecutorService
-     * @Note  可缓存线程池,用于处理非UI线程任务
-     */
-    private var threadPool = Executors.newFixedThreadPool(1)
-
-    /**
-     * @Name  threadQueue
-     * @Type  ArrayList<Any>
-     * @Note  任务序列
-     */
-    private var threadQueue : ArrayList<Any> = ArrayList()
-
-    /**
-     * @Name  onUI
-     * @Type  Int
-     * @Note  UI线程处理标记
-     */
-    private val onUI = 1
-
-    /**
-     * @Name  onThread
-     * @Type  Int
-     * @Note  非UI线程处理标记
-     */
-    private val onThread = 2
-
-    /**
-     * @Name  threadPool
-     * @Type  Handler
-     * @Note  UI任务处理Hander
-     */
-    private val uiThread = android.os.Handler(Looper.getMainLooper())
-
-    /**
-     * @Name  index
-     * @Type  int
-     * @Note  处理标记,编辑当前处理到第几个任务
-     */
-    private var index= 0
-
-    /**
-     * @Name  runFlag
-     * @Type  boolean
-     * @Note  标识当前任务序列是否执行完成
-     */
-    private var runFlag = false
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:16
-     * @Note   开始执行方法 递归处理事件队列
-     */
-    override fun execute(){
-        if (threadQueue.size>0){
-            val data = threadQueue[index]
-            if (runFlag){
-                execute()
-                return
-            }
-            runFlag = true
-            when (data) {
-                is DoModel -> {
-                    nomalDo()
-                }
-                is DoSendModel -> {
-                    sendDo()
-                }
-            }
-        }
-    }
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:17
-     * @Note   常规事件执行方法
-     */
-    private fun nomalDo(){
-        val data:DoModel = threadQueue[index] as DoModel
-        if (data.thread == onUI){
-            uiThread.post{
-                data.call.invoke {
-                    index+=1
-                    if (threadQueue.size > index){
-                        when (threadQueue[index]) {
-                            is DoModel -> {
-                                nomalDo()
-                            }
-                            is DoSendModel -> {
-                                sendDo()
-                            }
-                        }
-                    }else{
-                        clear()
-                    }
-                }
-            }
-        }else if(data.thread == onThread){
-            threadPool.execute {
-                data.call.invoke {
-                    index+=1
-                    if (threadQueue.size > index){
-                        when (threadQueue[index]) {
-                            is DoModel -> {
-                                nomalDo()
-                            }
-                            is DoSendModel -> {
-                                sendDo()
-                            }
-                        }
-                    }else{
-                        clear()
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:18
-     * @Note   发送参数事件处理方法
-     */
-    private fun sendDo(){
-        val data:DoSendModel = threadQueue[index] as DoSendModel
-        if (data.thread == onUI){
-            uiThread.post{
-                data.call.invoke {
-                    value ->
-                    index +=1
-                    if (threadQueue.size > index){
-                        when (threadQueue[index]) {
-                            is DoResultModel ->{
-                                resultDo(value)
-                            }
-                        }
-                    }else{
-                        clear()
-                    }
-                }
-            }
-        }else if(data.thread == onThread){
-            threadPool.execute {
-                data.call.invoke {
-                    value ->
-                    index +=1
-                    if (threadQueue.size > index){
-                        when (threadQueue[index]) {
-                            is DoResultModel ->{
-                                resultDo(value)
-                            }
-                        }
-                    }else{
-                        clear()
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:19
-     * @Note   接受参数事件处理方法
-     * @param  value 所接受的参数
-     */
-    private fun resultDo(value :Any){
-        val data:DoResultModel = threadQueue[index] as DoResultModel
-        if (data.thread == onUI){
-            uiThread.post{
-                data.call.invoke(value) {
-                    index +=1
-                    if (threadQueue.size > index){
-                        when (threadQueue[index]) {
-                            is DoModel -> {
-                                nomalDo()
-                            }
-                            is DoSendModel -> {
-                                sendDo()
-                            }
-                        }
-                    }else{
-                        clear()
-                    }
-                }
-            }
-        }else if(data.thread == onThread){
-            threadPool.execute {
-                data.call.invoke(value) {
-                    index +=1
-                    if (threadQueue.size > index){
-                        when (threadQueue[index]) {
-                            is DoModel -> {
-                                nomalDo()
-                            }
-                            is DoSendModel -> {
-                                sendDo()
-                            }
-                        }
-                    }else{
-                        clear()
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:20
-     * @Note   清除线程池 索引 复原运行标记
-     */
-    private fun clear(){
-        index = 0
-        threadQueue.clear()
-        runFlag = false
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:20
-     * @Note   在UI主线程执行普通方法
-     * @param  call 方法回调
-     */
-    override fun doOnUI(call: (call :() -> Unit) -> Unit):NomalResultInterface{
-        threadQueue.add(DoModel(onUI,call))
-        return this
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:33
-     * @Note   在非UI线程执行普通方法
-     * @param  call 方法回调
-     */
-    override fun doOnBack(call: (call :() -> Unit) -> Unit):NomalResultInterface{
-        threadQueue.add(DoModel(onThread,call))
-        return this
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:37
-     * @Note   在UI线程执行传递参数方法
-     * @param  call 方法回调
-     */
-    override fun onUISend(call: ((value :Any) -> Unit) -> Unit):SendResultInterface{
-        threadQueue.add(DoSendModel(onUI,call))
-        return this
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:37
-     * @Note   在非UI线程执行传递参数方法
-     * @param  call 方法回调
-     */
-    override fun onBackSend(call: ((value :Any) -> Unit) -> Unit):SendResultInterface{
-        threadQueue.add(DoSendModel(onThread,call))
-        return this
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:38
-     * @Note   在主线程执行接受参数方法
-     * @param  call 方法回调
-     */
-    override fun onUIResult(call: (Any,() -> Unit) -> Unit):NomalResultInterface{
-        threadQueue.add(DoResultModel(onUI,call))
-        return this
-    }
-
-    /**
-     * @author  LDD
-     * @From   com.wdkl.ncs.android.lib.utils Do
-     * @Data   2017/12/22 下午4:39
-     * @Note   在非UI线程执行结束参数方法
-     * @param  call 方法回调
-     */
-    override fun onBackResult(call: (Any,() -> Unit) -> Unit):NomalResultInterface{
-        threadQueue.add(DoResultModel(onThread,call))
-        return this
-    }
-
-}
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午4:42
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   执行完发送参数方法后 返回对应接口
- */
-interface SendResultInterface {
-    fun onBackResult (call: (Any,() -> Unit) -> Unit):NomalResultInterface
-    fun onUIResult(call: (Any,() -> Unit) -> Unit):NomalResultInterface
-}
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午4:42
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   执行完普通方法和接受参数方法后 返回对应接口
- */
-interface NomalResultInterface{
-    fun onBackSend(call: ((value :Any) -> Unit) -> Unit):SendResultInterface
-    fun onUISend(call: ((value :Any) -> Unit) -> Unit):SendResultInterface
-    fun doOnBack(call: (call :() -> Unit) -> Unit):NomalResultInterface
-    fun doOnUI(call: (call :() -> Unit) -> Unit):NomalResultInterface
-    fun execute()
-}
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午4:43
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   普通方法 Model
- */
-data class DoModel constructor(var thread :Int, var call :(() -> Unit) -> Unit)
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午4:43
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   发送参数方法 Model
- */
-data class DoSendModel constructor(var thread :Int, var call :((value : Any) -> Unit) -> Unit)
-
-/**
- * @author  LDD
- * @Data   2017/12/22 下午4:43
- * @From   com.wdkl.ncs.android.lib.utils
- * @Note   接收参数方法 Model
- */
-data class DoResultModel constructor(var thread :Int, var call :(result :Any,() -> Unit) -> Unit)

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

@@ -1,113 +0,0 @@
-package com.wdkl.ncs.android.lib.utils
-
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import com.google.zxing.BarcodeFormat
-import com.google.zxing.EncodeHintType
-import com.google.zxing.WriterException
-import com.google.zxing.qrcode.QRCodeWriter
-import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
-import io.reactivex.Observable
-
-/**
- * Created by LDD on 2018/11/9.
- */
-class EcodeHelper {
-
-
-    fun rxCreateQRImage(content: String, heightPix: Int, logoBm: Bitmap?) :Observable<Bitmap>{
-        return Observable.create { observableEmitter ->
-            observableEmitter.onNext(createQRImage(content,heightPix,logoBm)!!)
-        }
-    }
-
-    fun createQRImage(content: String, heightPix: Int, logoBm: Bitmap?): Bitmap? {
-        try {
-            // if (content == null || "".equals(content)) {
-            // return false;
-            // }
-
-            //配置参数
-            val hints = HashMap<EncodeHintType, Any>()
-            hints.put(EncodeHintType.CHARACTER_SET, "utf-8")
-            //容错级别
-            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H)
-            //设置空白边距的宽度
-            // hints.put(EncodeHintType.MARGIN, 2); //default is 4
-
-            // 图像数据转换,使用了矩阵转换
-            val bitMatrix = QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, heightPix, heightPix, hints)
-            val pixels = IntArray(heightPix * heightPix)
-            // 下面这里按照二维码的算法,逐个生成二维码的图片,
-            // 两个for循环是图片横列扫描的结果
-            for (y in 0 until heightPix) {
-                for (x in 0 until heightPix) {
-                    if (bitMatrix.get(x, y)) {
-                        pixels[y * heightPix + x] = -0x1000000
-                    } else {
-                        pixels[y * heightPix + x] = -0x1
-                    }
-                }
-            }
-
-            // 生成二维码图片的格式,使用ARGB_8888
-            var bitmap: Bitmap? = Bitmap.createBitmap(heightPix, heightPix, Bitmap.Config.ARGB_8888)
-            bitmap!!.setPixels(pixels, 0, heightPix, 0, 0, heightPix, heightPix)
-
-            if (logoBm != null) {
-                bitmap = addLogo(bitmap, logoBm)
-            }
-
-            //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
-            return bitmap
-        } catch (e: WriterException) {
-            e.printStackTrace()
-        }
-
-        return null
-    }
-
-    /**
-     * 在二维码中间添加Logo图案
-     */
-    private fun addLogo(src: Bitmap?, logo: Bitmap?): Bitmap? {
-        if (src == null) {
-            return null
-        }
-
-        if (logo == null) {
-            return src
-        }
-
-        //获取图片的宽高
-        val srcWidth = src.width
-        val srcHeight = src.height
-        val logoWidth = logo.width
-        val logoHeight = logo.height
-
-        if (srcWidth == 0 || srcHeight == 0) {
-            return null
-        }
-
-        if (logoWidth == 0 || logoHeight == 0) {
-            return src
-        }
-
-        //logo大小为二维码整体大小的1/5
-        val scaleFactor = srcWidth * 1.0f / 5f / logoWidth.toFloat()
-        var bitmap: Bitmap? = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888)
-        try {
-            val canvas = Canvas(bitmap)
-            canvas.drawBitmap(src, 0f, 0f, null)
-            canvas.scale(scaleFactor, scaleFactor, (srcWidth / 2).toFloat(), (srcHeight / 2).toFloat())
-            canvas.drawBitmap(logo, ((srcWidth - logoWidth) / 2).toFloat(), ((srcHeight - logoHeight) / 2).toFloat(), null)
-            canvas.save()
-            canvas.restore()
-        } catch (e: Exception) {
-            bitmap = null
-            e.stackTrace
-        }
-
-        return bitmap
-    }
-}

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


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini