liukai лет назад: 3
Сommit
3dfe4b1913
100 измененных файлов с 3736 добавлено и 0 удалено
  1. 94 0
      .gitignore
  2. 1 0
      app/.gitignore
  3. 93 0
      app/build.gradle
  4. 227 0
      app/proguard-rules.pro
  5. 24 0
      app/src/androidTest/java/com/guadou/kt_zoom/ExampleInstrumentedTest.kt
  6. 31 0
      app/src/main/AndroidManifest.xml
  7. 24 0
      app/src/main/java/com/hongyegroup/nucleicacidtest/MainActivity.kt
  8. 42 0
      app/src/main/java/com/hongyegroup/nucleicacidtest/MyApplication.kt
  9. 24 0
      app/src/main/java/com/hongyegroup/nucleicacidtest/di/ApplicationModule.kt
  10. 34 0
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  11. 170 0
      app/src/main/res/drawable/ic_launcher_background.xml
  12. 31 0
      app/src/main/res/layout/activity_main.xml
  13. 5 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  14. 5 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  15. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  16. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  17. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  18. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  19. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  20. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  21. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  22. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  23. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  24. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  25. 4 0
      app/src/main/res/values/colors.xml
  26. 5 0
      app/src/main/res/values/strings.xml
  27. 17 0
      app/src/test/java/com/guadou/kt_zoom/ExampleUnitTest.kt
  28. 74 0
      build.gradle
  29. 1 0
      cpt_auth/.gitignore
  30. 75 0
      cpt_auth/build.gradle
  31. 0 0
      cpt_auth/consumer-rules.pro
  32. 21 0
      cpt_auth/proguard-rules.pro
  33. 24 0
      cpt_auth/src/androidTest/java/com/guadou/cpt_main/ExampleInstrumentedTest.kt
  34. 10 0
      cpt_auth/src/main/AndroidManifest.xml
  35. 3 0
      cpt_auth/src/main/java/com/hongyegroup/auth/bean/ServerTimeBean.kt
  36. 16 0
      cpt_auth/src/main/java/com/hongyegroup/auth/http/MainApiService.kt
  37. 11 0
      cpt_auth/src/main/java/com/hongyegroup/auth/http/MainRetrofit.kt
  38. 25 0
      cpt_auth/src/main/java/com/hongyegroup/auth/mvvm/AuthRepository.kt
  39. 28 0
      cpt_auth/src/main/java/com/hongyegroup/auth/mvvm/AuthViewModel.kt
  40. 12 0
      cpt_auth/src/main/java/com/hongyegroup/auth/others/MemberDao.kt
  41. 15 0
      cpt_auth/src/main/java/com/hongyegroup/auth/others/MemberServer.kt
  42. 14 0
      cpt_auth/src/main/java/com/hongyegroup/auth/router/AuthComponentImpl.kt
  43. 40 0
      cpt_auth/src/main/java/com/hongyegroup/auth/ui/AuthActivity.kt
  44. 19 0
      cpt_auth/src/main/java/com/hongyegroup/auth/ui/LoginFragment.kt
  45. 22 0
      cpt_auth/src/main/res/layout/activity_auth.xml
  46. 27 0
      cpt_auth/src/main/res/layout/fragment_login.xml
  47. 3 0
      cpt_auth/src/main/res/values/strings.xml
  48. 17 0
      cpt_auth/src/test/java/com/guadou/cpt_main/ExampleUnitTest.kt
  49. 1 0
      cpt_business/.gitignore
  50. 75 0
      cpt_business/build.gradle
  51. 0 0
      cpt_business/consumer-rules.pro
  52. 21 0
      cpt_business/proguard-rules.pro
  53. 24 0
      cpt_business/src/androidTest/java/com/guadou/cpt_main/ExampleInstrumentedTest.kt
  54. 8 0
      cpt_business/src/main/AndroidManifest.xml
  55. 6 0
      cpt_business/src/main/java/com/hongyegroup/business/http/BusinessApiService.kt
  56. 12 0
      cpt_business/src/main/java/com/hongyegroup/business/http/BusinessRetrofit.kt
  57. 3 0
      cpt_business/src/main/res/values/strings.xml
  58. 17 0
      cpt_business/src/test/java/com/guadou/cpt_main/ExampleUnitTest.kt
  59. 1 0
      cpt_personal/.gitignore
  60. 75 0
      cpt_personal/build.gradle
  61. 0 0
      cpt_personal/consumer-rules.pro
  62. 21 0
      cpt_personal/proguard-rules.pro
  63. 24 0
      cpt_personal/src/androidTest/java/com/guadou/cpt_main/ExampleInstrumentedTest.kt
  64. 8 0
      cpt_personal/src/main/AndroidManifest.xml
  65. 6 0
      cpt_personal/src/main/java/com/hongyegroup/personal/http/BusinessApiService.kt
  66. 11 0
      cpt_personal/src/main/java/com/hongyegroup/personal/http/BusinessRetrofit.kt
  67. 3 0
      cpt_personal/src/main/res/values/strings.xml
  68. 17 0
      cpt_personal/src/test/java/com/guadou/cpt_main/ExampleUnitTest.kt
  69. 1 0
      cs_baselib/.gitignore
  70. 146 0
      cs_baselib/build.gradle
  71. 0 0
      cs_baselib/consumer-rules.pro
  72. 2 0
      cs_baselib/multidex-config.pro
  73. 21 0
      cs_baselib/proguard-rules.pro
  74. 39 0
      cs_baselib/src/main/AndroidManifest.xml
  75. BIN
      cs_baselib/src/main/assets/SF-UI-Text/IBMPlexSerif-Medium.ttf
  76. BIN
      cs_baselib/src/main/assets/SF-UI-Text/SF-UI-Text-Light.otf
  77. BIN
      cs_baselib/src/main/assets/SF-UI-Text/San-Francisco-Display-Medium.ttf
  78. BIN
      cs_baselib/src/main/assets/SF-UI-Text/San-Francisco-Display-Regular.ttf
  79. BIN
      cs_baselib/src/main/assets/SF-UI-Text/SanFranciscoText-Semibold.otf
  80. 20 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/annotation/NetWork.java
  81. 54 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/BaseApplication.kt
  82. 114 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/BaseRetrofitClient.kt
  83. 153 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/AbsActivity.kt
  84. 114 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVDBActivity.kt
  85. 129 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVDBLoadingActivity.kt
  86. 95 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVMActivity.kt
  87. 110 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVMLoadingActivity.kt
  88. 76 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/AbsFragment.kt
  89. 120 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVDBFragment.kt
  90. 200 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVDBLazyLoadingFragment.kt
  91. 144 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVDBLoadingFragment.kt
  92. 102 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVMFragment.kt
  93. 181 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVMLazyLoadingFragment.kt
  94. 125 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVMLoadingFragment.kt
  95. 71 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/vm/BaseRepository.kt
  96. 61 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/vm/BaseViewModel.kt
  97. 6 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/base/vm/EmptyViewModel.kt
  98. 3 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/bean/BaseBean.kt
  99. 28 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/bean/DataBindingConfig.kt
  100. 0 0
      cs_baselib/src/main/java/com/guadou/lib_baselib/bean/LoadAction.kt

+ 94 - 0
.gitignore

@@ -0,0 +1,94 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches/build_file_checksums.ser
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+proguardMapping.txt
+
+# ---> Android
+# Built application files
+*.apk
+*.ap_
+
+# Files for the Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# ---> JetBrains
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
+
+*.iml
+
+## Directory-based project format:
+.idea/
+# if you remove the above rule, at least ignore the following:
+
+# User-specific stuff:
+# .idea/workspace.xml
+# .idea/tasks.xml
+# .idea/dictionaries
+
+# Sensitive or high-churn files:
+# .idea/dataSources.ids
+# .idea/dataSources.xml
+# .idea/sqlDataSources.xml
+# .idea/dynamic.xml
+# .idea/uiDesigner.xml
+
+# Gradle:
+# .idea/gradle.xml
+# .idea/libraries
+
+# Mongo Explorer plugin:
+# .idea/mongoSettings.xml
+
+## File-based project format:
+*.ipr
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties

+ 1 - 0
app/.gitignore

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

+ 93 - 0
app/build.gradle

@@ -0,0 +1,93 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'app-joint'
+
+apply plugin: 'kotlin-kapt'
+//apply plugin: 'dagger.hilt.android.plugin'
+
+//apply plugin: 'com.didiglobal.booster'
+
+android {
+    compileSdkVersion versions.compileSdk
+    buildToolsVersion versions.buildToolsVersion
+    defaultConfig {
+        minSdkVersion versions.minSdk
+        targetSdkVersion versions.targetSdk
+
+        versionCode 100
+        versionName "1.0.0"
+        applicationId "com.hongyegroup.nucleicacidtest"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+
+        kotlinOptions {
+            jvmTarget = JavaVersion.VERSION_1_8
+        }
+
+        multiDexEnabled true
+        vectorDrawables.useSupportLibrary = true
+    }
+
+    buildTypes {
+        release {
+            //默认系统混淆
+            minifyEnabled true
+            // 不显示Log
+            buildConfigField "boolean", "LOG_DEBUG", "false"
+            //是否可调试
+            debuggable false
+            //Zipalign优化
+            zipAlignEnabled true
+            //移除无用的resource文件
+            shrinkResources true
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+
+        debug {
+            debuggable true
+        }
+
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+    }
+
+    dexOptions {
+        preDexLibraries true
+        maxProcessCount 8
+    }
+
+    buildFeatures {
+        dataBinding = true
+        viewBinding = true
+    }
+
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    //每个模块都要实现的依赖
+    //Test
+    testImplementation deps.android.junit
+    androidTestImplementation deps.android.test_junit
+    androidTestImplementation deps.android.test_espresso
+    //依赖注入
+//    implementation deps.support.hilt
+//    kapt deps.support.hilt_kapt
+//    implementation deps.support.hilt_vm
+//    kapt deps.support.hilt_vm_kapt
+
+
+    implementation project(':cpt_auth')
+    implementation project(':cpt_business')
+//    implementation project(':cpt_personal')
+}

+ 227 - 0
app/proguard-rules.pro

@@ -0,0 +1,227 @@
+
+#---------------------------------基本指令区----------------------------------
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontskipnonpubliclibraryclassmembers
+-dontpreverify
+-verbose
+-printmapping proguardMapping.txt
+-optimizations !code/simplification/cast,!field/*,!class/merging/*
+-keepattributes *Annotation*,InnerClasses
+-keepattributes Signature
+-keepattributes SourceFile,LineNumberTable
+#---------------------------------默认保留区---------------------------------
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class * extends android.view.View
+-keep public class com.android.vending.licensing.ILicensingService
+-keep class android.support.** {*;}
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+-keepclassmembers class * extends android.app.Activity{
+    public void *(android.view.View);
+}
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+-keep public class * extends android.view.View{
+    *** get*();
+    void set*(***);
+    public <init>(android.content.Context);
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+-keepclasseswithmembers class * {
+    public <init>(android.content.Context, android.util.AttributeSet);
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}
+-keepclassmembers class * implements java.io.Serializable {
+    static final long serialVersionUID;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    private void writeObject(java.io.ObjectOutputStream);
+    private void readObject(java.io.ObjectInputStream);
+    java.lang.Object writeReplace();
+    java.lang.Object readResolve();
+}
+# ActionBarSherlock
+-keep class android.support.** { *; }
+-keep interface android.support.** { *; }
+-keep class com.actionbarsherlock.** { *; }
+-keep interface com.actionbarsherlock.** { *; }
+# Keep line numbers to alleviate debugging stack traces
+-renamesourcefileattribute SourceFile
+
+-keep class **.R$* {
+ *;
+}
+
+-ignorewarnings
+
+-keep class * {
+    public private *;
+}
+
+-keepclassmembers class * {
+    void *(**On*Event);
+}
+
+
+#----------------------------------------------------------------------------
+
+#---------------------------------1.实体类---------------------------------
+
+-keep class com.guadou.kt_zoom.bean.** { *; }
+-keep class com.guadou.lib_baselib.bean.** { *; }
+
+
+#--------------------------------第三方混淆--------------------------------------------
+# OkHttp3
+-dontwarn okhttp3.logging.**
+-keep class okhttp3.internal.**{*;}
+-dontwarn okio.**
+
+#glide
+-keep public class * implements com.bumptech.glide.module.GlideModule
+-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
+  **[] $VALUES;
+  public *;
+}
+
+# Gson
+-keepattributes *Annotation*
+-keepattributes Signature
+-dontwarn sun.misc.**
+-keep class com.google.gson.stream.** { *; }
+-keep class com.google.gson.examples.android.model.** { *; }
+-keep class * implements com.google.gson.TypeAdapterFactory
+-keep class * implements com.google.gson.JsonSerializer
+-keep class * implements com.google.gson.JsonDeserializer
+
+# Retrofit
+-dontwarn retrofit2.**
+-keep class retrofit2.** { *; }
+-keepattributes Signature
+-keepattributes Exceptions
+# converters and adapters. 是否要注释
+-keepclassmembernames,allowobfuscation interface * {
+    @retrofit2.http.* <methods>;
+}
+-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
+
+# RxJava RxAndroid
+-dontwarn sun.misc.**
+-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
+    long producerIndex;
+    long consumerIndex;
+}
+-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
+    rx.internal.util.atomic.LinkedQueueNode producerNode;
+}
+-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
+    rx.internal.util.atomic.LinkedQueueNode consumerNode;
+}
+
+#Retrofit+rxjava+rxandroid+gson+okhttp
+-dontwarn javax.annotation.**
+-dontwarn javax.inject.**
+
+
+#AndPermission
+-dontwarn com.yanzhenjie.permission.**
+
+#激光推送
+-dontoptimize
+-dontpreverify
+-dontwarn cn.jpush.**
+-keep class cn.jpush.** { *; }
+
+#okhttp
+-dontwarn okhttp3.**
+-keep class okhttp3.**{*;}
+
+#okio
+-dontwarn okio.**
+-keep class okio.**{*;}
+
+#brvah
+-keep class com.chad.library.adapter.** {
+*;
+}
+-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter
+-keep public class * extends com.chad.library.adapter.base.BaseViewHolder
+-keepclassmembers  class **$** extends com.chad.library.adapter.base.BaseViewHolder {
+     <init>(...);
+}
+
+
+#==================其他==========================
+
+-dontwarn com.google.**
+-keep class com.google.gson.** {*;}
+-keep class com.google.protobuf.** {*;}
+
+-keep class com.google.gson.examples.android.model.** { *; }
+-keep class * implements com.google.gson.TypeAdapterFactory
+-keep class * implements com.google.gson.JsonSerializer
+-keep class * implements com.google.gson.JsonDeserializer
+
+#Gson容错处理
+-keep class com.ke.gson.** { *; }
+
+##腾讯系列
+#-keep class com.tencent.** { *; }
+
+
+#LiveBus
+-dontwarn com.jeremyliao.liveeventbus.**
+-keep class com.jeremyliao.liveeventbus.** { *; }
+-keep class androidx.lifecycle.** { *; }
+-keep class androidx.arch.core.** { *; }
+
+
+# Rules for Kotlin Coroutines
+-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
+-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
+-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {}
+-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {}
+
+-keepclassmembernames class kotlinx.** {
+    volatile <fields>;
+}
+
+
+#PictureSelector 2.0
+-keep class com.luck.picture.lib.** { *; }
+#Ucrop
+-dontwarn com.yalantis.ucrop**
+-keep class com.yalantis.ucrop** { *; }
+-keep interface com.yalantis.ucrop** { *; }
+#Okio
+-dontwarn org.codehaus.mojo.animal_sniffer.*
+
+
+#Cookiejar混淆
+-dontwarn com.franmontiel.persistentcookiejar.**
+-keep class com.franmontiel.persistentcookiejar.**
+-keepclassmembers class * implements java.io.Serializable {
+    static final long serialVersionUID;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    !static !transient <fields>;
+    private void writeObject(java.io.ObjectOutputStream);
+    private void readObject(java.io.ObjectInputStream);
+    java.lang.Object writeReplace();
+    java.lang.Object readResolve();
+}
+
+

+ 24 - 0
app/src/androidTest/java/com/guadou/kt_zoom/ExampleInstrumentedTest.kt

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

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

@@ -0,0 +1,31 @@
+<?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.hongyegroup.nucleicacidtest"
+    tools:ignore="GoogleAppIndexingWarning">
+
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
+    <application
+        android:name="com.hongyegroup.nucleicacidtest.MyApplication"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:requestLegacyExternalStorage="true"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+
+        <activity android:name="com.hongyegroup.nucleicacidtest.MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+
+    </application>
+
+</manifest>

+ 24 - 0
app/src/main/java/com/hongyegroup/nucleicacidtest/MainActivity.kt

@@ -0,0 +1,24 @@
+package com.hongyegroup.nucleicacidtest
+import com.guadou.cs_router.YYRouterService
+import com.guadou.lib_baselib.base.activity.BaseVMActivity
+import com.guadou.lib_baselib.base.vm.EmptyViewModel
+import com.guadou.lib_baselib.ext.click
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : BaseVMActivity<EmptyViewModel>() {
+
+    override fun getLayoutIdRes(): Int = R.layout.activity_main
+
+    override fun startObserve() {
+
+    }
+
+    override fun init() {
+
+        btn_jump_main.click {
+            YYRouterService.mainComponentServer?.startChooseRoleActivity()
+        }
+
+
+    }
+}

+ 42 - 0
app/src/main/java/com/hongyegroup/nucleicacidtest/MyApplication.kt

@@ -0,0 +1,42 @@
+package com.hongyegroup.nucleicacidtest
+
+import android.app.ActivityManager
+import android.content.Context
+import android.os.Build
+import android.os.Process
+import android.webkit.WebView
+import com.guadou.lib_baselib.base.BaseApplication
+
+
+class MyApplication : BaseApplication() {
+
+    override fun onCreate() {
+        super.onCreate()
+
+        //WebView的兼容
+        setupWebView()
+    }
+
+    //兼容Android-P
+    private fun setupWebView() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            val processName = getProcessName(this)
+            if ("com.monstarlab.yyjobs" != processName) {
+                WebView.setDataDirectorySuffix(processName)
+            }
+        }
+    }
+
+    //获取当前的进程名称
+    private fun getProcessName(context: Context?): String? {
+        if (context == null) return ""
+        val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+        for (processInfo in manager.runningAppProcesses) {
+            if (processInfo.pid == Process.myPid()) {
+                return processInfo.processName
+            }
+        }
+        return ""
+    }
+
+}

+ 24 - 0
app/src/main/java/com/hongyegroup/nucleicacidtest/di/ApplicationModule.kt

@@ -0,0 +1,24 @@
+//package com.hongyegroup.nucleicacidtest.di
+//
+//import android.app.Application
+//import com.hongyegroup.nucleicacidtest.MyApplication
+//import dagger.Module
+//import dagger.Provides
+//import dagger.hilt.InstallIn
+//import dagger.hilt.android.components.ApplicationComponent
+//
+///**
+// * 全局的DI注入
+// */
+//@Module
+//@InstallIn(ApplicationComponent::class)
+//class ApplicationModule {
+//
+//    //如果是自己定义的MyApplication,通过一个Module向下转型
+//    @Provides
+//    fun provideMyApplication(application: Application): MyApplication {
+//        return application as MyApplication
+//    }
+//
+//
+//}

Разница между файлами не показана из-за своего большого размера
+ 34 - 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="#008577"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+</vector>

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

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+        android:id="@+id/easy_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:Easy_hasStatusPadding="true"
+        app:Easy_title="Main" />
+
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:text="Main Page" />
+
+
+    <Button
+        android:id="@+id/btn_jump_main"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="跳转主页模块" />
+
+</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>

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


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


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


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


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


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


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


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


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


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


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

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+</resources>

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

@@ -0,0 +1,5 @@
+<resources>
+
+    <string name="app_name">核酸检测</string>
+
+</resources>

+ 17 - 0
app/src/test/java/com/guadou/kt_zoom/ExampleUnitTest.kt

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

+ 74 - 0
build.gradle

@@ -0,0 +1,74 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply from: "dependent.gradle"
+
+buildscript {
+    ext.kotlin_version = '1.4.21'
+    ext.booster_version = '2.4.0'
+
+    repositories {
+        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        google()
+        jcenter()
+        maven { url 'https://jitpack.io' }
+    }
+
+    dependencies {
+        classpath 'com.android.tools.build:gradle:4.0.1'
+
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+        //路由
+        classpath 'io.github.prototypez:app-joint:1.7'
+
+        //Hilt插件
+        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
+
+        // ==================== Booster优化插件 ====================
+        // 基础框架
+        classpath "com.didiglobal.booster:booster-gradle-plugin:$booster_version"
+
+        // 多线程优化
+        classpath "com.didiglobal.booster:booster-transform-thread:$booster_version"
+        // WebView 预加载
+        classpath "com.didiglobal.booster:booster-transform-webview:$booster_version"
+        // SharedPreferences 优化
+        classpath "com.didiglobal.booster:booster-transform-shared-preferences:$booster_version"
+
+        // 资源压缩
+        classpath "com.didiglobal.booster:booster-task-compression-cwebp:$booster_version"
+        // 文件压缩
+        classpath "com.didiglobal.booster:booster-task-compression-processed-res:$booster_version"
+        // 去冗余资源
+        classpath "com.didiglobal.booster:booster-task-resource-deredundancy:$booster_version"
+        // 资源索引内联
+        classpath "com.didiglobal.booster:booster-transform-r-inline:$booster_version"
+
+        // 修复 finalizer 导致的 TimeoutException
+        classpath "com.didiglobal.booster:booster-transform-finalizer-watchdog-daemon:$booster_version"
+        // 检查覆盖安装导致的 Resources 和 Assets 未加载的 Bug
+        classpath "com.didiglobal.booster:booster-transform-res-check:$booster_version"
+        // 修复 Toast 在 Android 7.1 上的 Bug
+        classpath "com.didiglobal.booster:booster-transform-toast:$booster_version"
+        // 处理系统 Crash
+        classpath "com.didiglobal.booster:booster-transform-activity-thread:$booster_version"
+    }
+
+}
+
+allprojects {
+    repositories {
+        jcenter()
+        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
+        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
+        maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
+        maven { url 'https://jitpack.io' }
+        google()
+        maven { url 'https://dl.bintray.com/umsdk/release' }
+        maven { url "https://androidx.dev/snapshots/builds/6543454/artifacts/repository/" }
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 1 - 0
cpt_auth/.gitignore

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

+ 75 - 0
cpt_auth/build.gradle

@@ -0,0 +1,75 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'kotlin-kapt'
+//apply plugin: 'dagger.hilt.android.plugin'
+
+android {
+    compileSdkVersion versions.compileSdk
+    buildToolsVersion versions.buildToolsVersion
+    defaultConfig {
+        minSdkVersion versions.minSdk
+        targetSdkVersion versions.targetSdk
+
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles 'consumer-rules.pro'
+
+        multiDexEnabled true
+        vectorDrawables.useSupportLibrary = true
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        freeCompilerArgs = ['-Xjvm-default=enable']
+        jvmTarget = JavaVersion.VERSION_1_8
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+    }
+
+    dexOptions {
+        preDexLibraries true
+        maxProcessCount 8
+    }
+
+    buildFeatures {
+        dataBinding = true
+        viewBinding = true
+    }
+
+}
+
+dependencies {
+    api fileTree(dir: 'libs', include: ['*.jar'])
+
+    //每个模块都要实现的依赖
+    //Test
+    testImplementation deps.android.junit
+    androidTestImplementation deps.android.test_junit
+    androidTestImplementation deps.android.test_espresso
+    //依赖注入
+//    implementation deps.support.hilt
+//    kapt deps.support.hilt_kapt
+//    implementation deps.support.hilt_vm
+//    kapt deps.support.hilt_vm_kapt
+
+
+    api project(':cs_cptServices')
+
+}

+ 0 - 0
cpt_auth/consumer-rules.pro


+ 21 - 0
cpt_auth/proguard-rules.pro

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

+ 24 - 0
cpt_auth/src/androidTest/java/com/guadou/cpt_main/ExampleInstrumentedTest.kt

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

+ 10 - 0
cpt_auth/src/main/AndroidManifest.xml

@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.guadou.cpt_main" >
+
+    <application>
+
+        <activity android:name="com.hongyegroup.auth.ui.AuthActivity"/>
+
+    </application>
+
+</manifest>

+ 3 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/bean/ServerTimeBean.kt

@@ -0,0 +1,3 @@
+package com.hongyegroup.auth.bean
+
+data class ServerTimeBean(val timestamps: Long)

+ 16 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/http/MainApiService.kt

@@ -0,0 +1,16 @@
+package com.hongyegroup.auth.http
+
+import com.guadou.testxiecheng.base.BaseBean
+import com.hongyegroup.auth.bean.ServerTimeBean
+import retrofit2.http.GET
+import retrofit2.http.Header
+
+interface MainApiService {
+
+    @GET("/index.php/api/employee/extra/time")
+    suspend fun getServerTime(
+        @Header("Content-Type") contentType: String,
+        @Header("Accept") accept: String
+    ): BaseBean<ServerTimeBean>
+
+}

+ 11 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/http/MainRetrofit.kt

@@ -0,0 +1,11 @@
+package com.hongyegroup.auth.http
+
+import com.guadou.cs_cptservices.Constants
+import com.guadou.lib_baselib.base.BaseRetrofitClient
+
+object MainRetrofit : BaseRetrofitClient() {
+
+    //默认的ApiService
+    val apiService by lazy { getService(MainApiService::class.java, Constants.BASE_URL) }
+
+}

+ 25 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/mvvm/AuthRepository.kt

@@ -0,0 +1,25 @@
+package com.hongyegroup.auth.mvvm
+
+import com.guadou.cs_cptservices.Constants
+import com.guadou.lib_baselib.base.vm.BaseRepository
+import com.guadou.testxiecheng.base.OkResult
+import com.hongyegroup.auth.bean.ServerTimeBean
+import com.hongyegroup.auth.http.MainRetrofit
+
+
+
+class AuthRepository  constructor() : BaseRepository() {
+
+    suspend fun getServerTime(): OkResult<ServerTimeBean> {
+        return handleErrorApiCall({
+            handleApiErrorResponse(
+                MainRetrofit.apiService.getServerTime(
+                    Constants.NETWORK_CONTENT_TYPE,
+                    Constants.NETWORK_ACCEPT_V1
+                )
+            )
+
+        })
+    }
+
+}

+ 28 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/mvvm/AuthViewModel.kt

@@ -0,0 +1,28 @@
+package com.hongyegroup.auth.mvvm
+
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.ext.toast
+
+class AuthViewModel constructor() : BaseViewModel() {
+
+    private val mAuthRepository: AuthRepository by lazy { AuthRepository() }
+
+    fun getServiceTime() {
+
+        launchOnUI {
+
+            loadStartProgress()
+
+            val serverTime = mAuthRepository.getServerTime()
+
+            serverTime.checkSuccess {
+                toast(it.timestamps.toString())
+            }
+
+            loadSuccess()
+
+        }
+
+    }
+
+}

+ 12 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/others/MemberDao.kt

@@ -0,0 +1,12 @@
+//package com.hongyegroup.auth.others
+//
+//import javax.inject.Inject
+//import javax.inject.Singleton
+//
+//@Singleton
+//class MemberDao @Inject constructor() {
+//
+//    fun printUser(): String {
+//        return "User Name"
+//    }
+//}

+ 15 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/others/MemberServer.kt

@@ -0,0 +1,15 @@
+//package com.hongyegroup.auth.others
+//
+//import com.guadou.lib_baselib.ext.toast
+//import com.guadou.lib_baselib.utils.Log.YYLogUtils
+//import dagger.hilt.android.scopes.ActivityScoped
+//import javax.inject.Inject
+//
+//@ActivityScoped
+//class MemberServer @Inject constructor(val userDao: MemberDao) {
+//
+//    fun testUser() {
+//        YYLogUtils.w(userDao.printUser() + userDao.toString())
+//        toast(userDao.printUser())
+//    }
+//}

+ 14 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/router/AuthComponentImpl.kt

@@ -0,0 +1,14 @@
+package com.hongyegroup.auth.router
+
+import com.guadou.cs_router.auth.IAuthComponentServer
+import com.hongyegroup.auth.ui.AuthActivity
+import io.github.prototypez.appjoint.core.ServiceProvider
+
+@ServiceProvider
+class AuthComponentImpl : IAuthComponentServer {
+
+    override fun startChooseRoleActivity() {
+        AuthActivity.startInstance()
+    }
+
+}

+ 40 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/ui/AuthActivity.kt

@@ -0,0 +1,40 @@
+package com.hongyegroup.auth.ui
+
+import android.content.Intent
+import com.guadou.cpt_main.R
+import com.guadou.lib_baselib.base.activity.BaseVMActivity
+import com.guadou.lib_baselib.utils.CommUtils
+import com.hongyegroup.auth.mvvm.AuthViewModel
+
+class AuthActivity : BaseVMActivity<AuthViewModel>() {
+
+    companion object {
+        fun startInstance() {
+            val context = CommUtils.getContext()
+            val intent = Intent(context, AuthActivity::class.java)
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun startObserve() {
+
+    }
+
+    override fun getLayoutIdRes(): Int =
+        R.layout.activity_auth
+
+    override fun init() {
+
+        mViewModel.getServiceTime()
+
+//        YYLogUtils.e("viewmodel:" + mViewModel.toString())
+//        YYLogUtils.e("userServer:" + userServer.toString())
+//        userServer.testUser()
+//
+//        btn_login.setOnClickListener {
+//            mViewModel.getServiceTime()
+//        }
+    }
+
+}

+ 19 - 0
cpt_auth/src/main/java/com/hongyegroup/auth/ui/LoginFragment.kt

@@ -0,0 +1,19 @@
+package com.hongyegroup.auth.ui
+
+import com.guadou.cpt_main.R
+import com.guadou.lib_baselib.base.fragment.BaseVMFragment
+import com.guadou.lib_baselib.base.vm.EmptyViewModel
+
+class LoginFragment : BaseVMFragment<EmptyViewModel>() {
+
+    override fun getLayoutIdRes(): Int = R.layout.fragment_login
+
+
+    override fun startObserve() {
+
+    }
+
+    override fun init() {
+
+    }
+}

+ 22 - 0
cpt_auth/src/main/res/layout/activity_auth.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/d_45dp"
+        app:Easy_title="Main" />
+
+    <Button
+        android:id="@+id/btn_login"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="登录" />
+
+
+
+</LinearLayout>

+ 27 - 0
cpt_auth/src/main/res/layout/fragment_login.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.guadou.lib_baselib.view.titlebar.EasyTitleBar
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:Easy_title="Login" />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/d_300dp"
+        android:gravity="center"
+        android:text="Login的页面" />
+
+
+    <Button
+        android:id="@+id/btn_back"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:text="返回" />
+
+</LinearLayout>

+ 3 - 0
cpt_auth/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+
+</resources>

+ 17 - 0
cpt_auth/src/test/java/com/guadou/cpt_main/ExampleUnitTest.kt

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

+ 1 - 0
cpt_business/.gitignore

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

+ 75 - 0
cpt_business/build.gradle

@@ -0,0 +1,75 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'kotlin-kapt'
+//apply plugin: 'dagger.hilt.android.plugin'
+
+android {
+    compileSdkVersion versions.compileSdk
+    buildToolsVersion versions.buildToolsVersion
+    defaultConfig {
+        minSdkVersion versions.minSdk
+        targetSdkVersion versions.targetSdk
+
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles 'consumer-rules.pro'
+
+        multiDexEnabled true
+        vectorDrawables.useSupportLibrary = true
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        freeCompilerArgs = ['-Xjvm-default=enable']
+        jvmTarget = JavaVersion.VERSION_1_8
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+    }
+
+    dexOptions {
+        preDexLibraries true
+        maxProcessCount 8
+    }
+
+    buildFeatures {
+        dataBinding = true
+        viewBinding = true
+    }
+
+}
+
+dependencies {
+    api fileTree(dir: 'libs', include: ['*.jar'])
+
+    //每个模块都要实现的依赖
+    //Test
+    testImplementation deps.android.junit
+    androidTestImplementation deps.android.test_junit
+    androidTestImplementation deps.android.test_espresso
+    //依赖注入
+//    implementation deps.support.hilt
+//    kapt deps.support.hilt_kapt
+//    implementation deps.support.hilt_vm
+//    kapt deps.support.hilt_vm_kapt
+
+
+    api project(':cs_cptServices')
+
+}

+ 0 - 0
cpt_business/consumer-rules.pro


+ 21 - 0
cpt_business/proguard-rules.pro

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

+ 24 - 0
cpt_business/src/androidTest/java/com/guadou/cpt_main/ExampleInstrumentedTest.kt

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

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

@@ -0,0 +1,8 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.guadou.cpt_main" >
+
+    <application>
+
+    </application>
+
+</manifest>

+ 6 - 0
cpt_business/src/main/java/com/hongyegroup/business/http/BusinessApiService.kt

@@ -0,0 +1,6 @@
+package com.hongyegroup.business.http
+
+interface BusinessApiService {
+
+
+}

+ 12 - 0
cpt_business/src/main/java/com/hongyegroup/business/http/BusinessRetrofit.kt

@@ -0,0 +1,12 @@
+package com.hongyegroup.auth.http
+
+import com.guadou.cs_cptservices.Constants
+import com.guadou.lib_baselib.base.BaseRetrofitClient
+import com.hongyegroup.business.http.BusinessApiService
+
+object BusinessRetrofit : BaseRetrofitClient() {
+
+    //默认的ApiService
+    val apiService by lazy { getService(BusinessApiService::class.java, Constants.BASE_URL) }
+
+}

+ 3 - 0
cpt_business/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+
+</resources>

+ 17 - 0
cpt_business/src/test/java/com/guadou/cpt_main/ExampleUnitTest.kt

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

+ 1 - 0
cpt_personal/.gitignore

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

+ 75 - 0
cpt_personal/build.gradle

@@ -0,0 +1,75 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'kotlin-kapt'
+//apply plugin: 'dagger.hilt.android.plugin'
+
+android {
+    compileSdkVersion versions.compileSdk
+    buildToolsVersion versions.buildToolsVersion
+    defaultConfig {
+        minSdkVersion versions.minSdk
+        targetSdkVersion versions.targetSdk
+
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles 'consumer-rules.pro'
+
+        multiDexEnabled true
+        vectorDrawables.useSupportLibrary = true
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        freeCompilerArgs = ['-Xjvm-default=enable']
+        jvmTarget = JavaVersion.VERSION_1_8
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+    }
+
+    dexOptions {
+        preDexLibraries true
+        maxProcessCount 8
+    }
+
+    buildFeatures {
+        dataBinding = true
+        viewBinding = true
+    }
+
+}
+
+dependencies {
+    api fileTree(dir: 'libs', include: ['*.jar'])
+
+    //每个模块都要实现的依赖
+    //Test
+    testImplementation deps.android.junit
+    androidTestImplementation deps.android.test_junit
+    androidTestImplementation deps.android.test_espresso
+    //依赖注入
+//    implementation deps.support.hilt
+//    kapt deps.support.hilt_kapt
+//    implementation deps.support.hilt_vm
+//    kapt deps.support.hilt_vm_kapt
+
+
+    api project(':cs_cptServices')
+
+}

+ 0 - 0
cpt_personal/consumer-rules.pro


+ 21 - 0
cpt_personal/proguard-rules.pro

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

+ 24 - 0
cpt_personal/src/androidTest/java/com/guadou/cpt_main/ExampleInstrumentedTest.kt

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

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

@@ -0,0 +1,8 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.guadou.cpt_main" >
+
+    <application>
+
+    </application>
+
+</manifest>

+ 6 - 0
cpt_personal/src/main/java/com/hongyegroup/personal/http/BusinessApiService.kt

@@ -0,0 +1,6 @@
+package com.hongyegroup.personal.http
+
+interface BusinessApiService {
+
+
+}

+ 11 - 0
cpt_personal/src/main/java/com/hongyegroup/personal/http/BusinessRetrofit.kt

@@ -0,0 +1,11 @@
+package com.hongyegroup.personal.http
+
+import com.guadou.cs_cptservices.Constants
+import com.guadou.lib_baselib.base.BaseRetrofitClient
+
+object BusinessRetrofit : BaseRetrofitClient() {
+
+    //默认的ApiService
+    val apiService by lazy { getService(BusinessApiService::class.java, Constants.BASE_URL) }
+
+}

+ 3 - 0
cpt_personal/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+
+</resources>

+ 17 - 0
cpt_personal/src/test/java/com/guadou/cpt_main/ExampleUnitTest.kt

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

+ 1 - 0
cs_baselib/.gitignore

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

+ 146 - 0
cs_baselib/build.gradle

@@ -0,0 +1,146 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+apply plugin: 'kotlin-kapt'
+//apply plugin: 'dagger.hilt.android.plugin'
+
+android {
+    compileSdkVersion versions.compileSdk
+    buildToolsVersion versions.buildToolsVersion
+    defaultConfig {
+        minSdkVersion versions.minSdk
+        targetSdkVersion versions.targetSdk
+
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles 'consumer-rules.pro'
+
+        multiDexEnabled true
+        vectorDrawables.useSupportLibrary = true
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            multiDexKeepProguard file('multidex-config.pro')
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+        debug {
+            multiDexKeepProguard file('multidex-config.pro')
+        }
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    kotlinOptions {
+        freeCompilerArgs = ['-Xjvm-default=enable']
+        jvmTarget = JavaVersion.VERSION_1_8
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+    }
+
+    dexOptions {
+        preDexLibraries true
+        maxProcessCount 8
+    }
+
+//    dataBinding{
+//        enabled = true
+//    }
+
+}
+
+configurations.all {
+    resolutionStrategy.force 'androidx.activity:activity:1.1.0'
+    resolutionStrategy.force 'androidx.core:core:1.3.0'
+    resolutionStrategy.force 'androidx.fragment:fragment:1.2.5'
+    resolutionStrategy.force 'androidx.multidex:multidex:2.0.1'
+    resolutionStrategy.force 'androidx.transition:transition:1.3.1'
+
+    resolutionStrategy.force 'androidx.arch.core:core-common:2.1.0'
+    resolutionStrategy.force 'androidx.arch.core:core-runtime:2.1.0'
+    resolutionStrategy.force 'androidx.lifecycle:lifecycle-livedata:2.2.0'
+    resolutionStrategy.force 'androidx.lifecycle:lifecycle-livedata-core:2.2.0'
+
+//    resolutionStrategy.force 'androidx.databinding:databinding-adapters:4.1.1'
+}
+
+dependencies {
+    api fileTree(dir: 'libs', include: ['*.jar'])
+
+    api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    api project(':cs_router')
+
+    //AndroidX
+    api deps.android.appcompat
+    api deps.android.constraint_layout
+    api deps.android.recyclerview
+    api deps.android.design
+    api deps.android.multidex
+    api deps.android.fragment_ktx  //Fragment与Activity的ViewModel扩展(Hilt必须)
+
+
+    //Kotlin相关
+    api deps.android.kt_ktx
+    api deps.android.ktx_coroutines_core
+    api deps.android.ktx_coroutines_android
+    api deps.android.lifecycle
+    api deps.android.lifecycle_vm
+    api deps.android.lifecycle_live
+    api deps.android.lifecycle_scope
+
+    //测试
+    testImplementation deps.android.junit
+    androidTestImplementation deps.android.test_junit
+    androidTestImplementation deps.android.test_espresso
+
+    //图片
+    implementation deps.support.glide
+    implementation deps.support.glide_annotation
+    implementation deps.support.glide_integration
+    kapt deps.support.glide_compiler
+
+    //Hilt依赖与扩展
+//    implementation deps.support.hilt
+//    kapt deps.support.hilt_kapt
+//    implementation deps.support.hilt_vm
+//    kapt deps.support.hilt_vm_kapt
+
+    //网络相关
+    api deps.support.retrofit2
+    api deps.support.retrofit_gson
+    api deps.support.cookie_jar
+
+    //其他依赖
+    implementation deps.support.permission
+    api deps.support.live_bus
+    api deps.support.brvah
+
+    //刷新布局
+    api deps.support.smart_refresh_core
+    api deps.support.smart_refresh_head
+
+    //XPopup弹窗
+    api deps.support.easy_adapter
+    api(deps.support.xpopup) {
+        exclude group: 'androidx.recyclerview'
+        exclude group: 'androidx.appcompat'
+        exclude group: 'com.google.android.material'
+    }
+
+    //图片选择:带luban,ucorp
+//    api(deps.support.picture_selector) {
+//        exclude group: 'androidx.recyclerview'
+//        exclude group: 'androidx.appcompat'
+//        exclude group: 'com.squareup.okio'
+//    }
+
+}

+ 0 - 0
cs_baselib/consumer-rules.pro


+ 2 - 0
cs_baselib/multidex-config.pro

@@ -0,0 +1,2 @@
+#Dex的自定义规则
+-keep class com.guadou.lib_baselib.base.** { *; }

+ 21 - 0
cs_baselib/proguard-rules.pro

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

+ 39 - 0
cs_baselib/src/main/AndroidManifest.xml

@@ -0,0 +1,39 @@
+<?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.guadou.basiclib">
+
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+
+    <!--http9.0兼容设置-->
+    <application
+        android:allowBackup="true"
+        android:networkSecurityConfig="@xml/network_http_o_config"
+        android:supportsRtl="true"
+        android:usesCleartextTraffic="true"
+        android:vmSafeMode="true"
+        tools:ignore="UnusedAttribute">
+
+        <!--9.0兼容http-->
+        <uses-library
+            android:name="org.apache.http.legacy"
+            android:required="false" />
+
+        <!--本项目mate配置-->
+        <meta-data
+            android:name="android.max_aspect"
+            android:value="2.4" />
+
+        <meta-data
+            android:name="android.webkit.WebView.EnableSafeBrowing"
+            android:value="true" />
+
+    </application>
+
+</manifest>

BIN
cs_baselib/src/main/assets/SF-UI-Text/IBMPlexSerif-Medium.ttf


BIN
cs_baselib/src/main/assets/SF-UI-Text/SF-UI-Text-Light.otf


BIN
cs_baselib/src/main/assets/SF-UI-Text/San-Francisco-Display-Medium.ttf


BIN
cs_baselib/src/main/assets/SF-UI-Text/San-Francisco-Display-Regular.ttf


BIN
cs_baselib/src/main/assets/SF-UI-Text/SanFranciscoText-Semibold.otf


+ 20 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/annotation/NetWork.java

@@ -0,0 +1,20 @@
+package com.guadou.lib_baselib.annotation;
+
+
+import com.guadou.lib_baselib.utils.NetWorkUtil;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义注解,用于方法上面的,需要方法的容器注解和解注册
+ * 可以直接把网络变换通知到具体的某一个方法
+ */
+@Target(ElementType.METHOD) //定义在方法上面的注解 ,和EventBus的方式类似
+@Retention(RetentionPolicy.RUNTIME) //定义为运行时,在jvm运行的过程中通过反射获取到注解
+public @interface NetWork {
+
+    NetWorkUtil.NetworkType netWorkType() default NetWorkUtil.NetworkType.NETWORK_NO;
+}

+ 54 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/BaseApplication.kt

@@ -0,0 +1,54 @@
+package com.guadou.lib_baselib.base
+
+import android.app.Application
+import android.content.Context
+import android.os.Handler
+import androidx.multidex.MultiDex
+import com.google.gson.Gson
+import com.guadou.lib_baselib.core.BaseLibCore
+import com.guadou.lib_baselib.receiver.ConnectivityReceiver
+import com.guadou.lib_baselib.utils.NetWorkUtil
+
+/**
+ * 基类的Application
+ */
+open class BaseApplication : Application() {
+
+    //全局的静态Gson对象
+    companion object {
+        val mGson = Gson()
+        lateinit var networkType: NetWorkUtil.NetworkType   //此变量会在网络监听中被动态赋值
+
+        //检查当前是否有网络
+        fun checkHasNet(): Boolean {
+            return networkType != NetWorkUtil.NetworkType.NETWORK_NO && networkType != NetWorkUtil.NetworkType.NETWORK_UNKNOWN
+        }
+
+    }
+
+    override fun onCreate() {
+        super.onCreate()
+
+        //获取到全局的网络状态
+        networkType = NetWorkUtil.getNetworkType(this@BaseApplication.applicationContext)
+
+        //全局的 CommUtil的初始化
+        BaseLibCore.init(this, Handler(), android.os.Process.myTid())
+
+        //网络监听
+        ConnectivityReceiver.registerReceiver(this)
+
+    }
+
+    //Dex分包
+    override fun attachBaseContext(base: Context?) {
+        super.attachBaseContext(base)
+        MultiDex.install(this)
+    }
+
+    override fun onTerminate() {
+        super.onTerminate()
+        ConnectivityReceiver.unregisterReceiver(this)
+    }
+
+}

+ 114 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/BaseRetrofitClient.kt

@@ -0,0 +1,114 @@
+package com.guadou.lib_baselib.base
+
+import com.franmontiel.persistentcookiejar.PersistentCookieJar
+import com.franmontiel.persistentcookiejar.cache.SetCookieCache
+import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.guadou.lib_baselib.utils.CommUtils
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.utils.interceptor.*
+import okhttp3.Cache
+import okhttp3.CacheControl
+import okhttp3.OkHttpClient
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import java.io.File
+import java.util.concurrent.TimeUnit
+
+
+/**
+ * 基类的Retrofit对象
+ */
+abstract class BaseRetrofitClient {
+
+    private var gson: Gson? = null
+    private val cookieJar by lazy {
+        //第三方Cookie管理工具
+        PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(CommUtils.getContext()))
+    }
+
+    companion object {
+        //静态常量
+        private const val TIME_OUT = 20
+    }
+
+    private val client: OkHttpClient
+        get() {
+            val builder = OkHttpClient.Builder()
+
+            //可以添加日志拦截和参数拦截
+            builder
+                .addInterceptor(LoggingInterceptor())
+                .connectTimeout(TIME_OUT.toLong(), TimeUnit.SECONDS)
+                .writeTimeout(TIME_OUT.toLong(), TimeUnit.SECONDS)
+                .readTimeout(TIME_OUT.toLong(), TimeUnit.SECONDS)
+
+            if (needHttpCache()) {
+                handleBuilder(builder)
+            }
+
+            return builder.build()
+        }
+
+    open protected fun needHttpCache(): Boolean = false
+
+    /**
+     * 处理缓存
+     */
+    private fun handleBuilder(builder: OkHttpClient.Builder) {
+
+        val httpCacheDirectory = File(CommUtils.getContext().cacheDir, "responses") //Http缓存目录
+        val cacheSize = 10 * 1024 * 1024L // 10 MiB
+        val cache = Cache(httpCacheDirectory, cacheSize)     //Http缓存对象
+        builder.cache(cache)
+            .cookieJar(cookieJar)
+            .addInterceptor { chain ->
+                var request = chain.request()
+
+                if (!NetWorkUtil.isAvailable(CommUtils.getContext())) {
+                    request = request.newBuilder()
+                        .cacheControl(CacheControl.FORCE_CACHE)
+                        .build()
+                }
+
+                val response = chain.proceed(request)
+                //有网络读取接口,没有网络展示缓存
+                if (!NetWorkUtil.isAvailable(CommUtils.getContext())) {
+                    val maxAge = 60 * 60
+                    response.newBuilder()
+                        .removeHeader("Pragma")
+                        .header("Cache-Control", "public, max-age=$maxAge")
+                        .build()
+                } else {
+                    val maxStale = 60 * 60 * 24 * 28 // tolerate 4-weeks stale
+                    response.newBuilder()
+                        .removeHeader("Pragma")
+                        .header("Cache-Control", "public, only-if-cached, max-stale=$maxStale")
+                        .build()
+                }
+                response
+            }
+    }
+
+    fun <S> getService(serviceClass: Class<S>, baseUrl: String): S {
+        return Retrofit.Builder()
+            .client(client)
+            .addConverterFactory(GsonConverterFactory.create(buildGson()))
+            .baseUrl(baseUrl)
+            .build().create(serviceClass)
+    }
+
+    //容错处理
+    private fun buildGson(): Gson {
+        if (gson == null) {
+            gson = GsonBuilder()
+                .registerTypeAdapter(Int::class.java, IntDefaut0Adapter())
+                .registerTypeAdapter(Double::class.java, DoubleDefault0Adapter())
+                .registerTypeAdapter(Long::class.java, LongDefault0Adapter())
+                .registerTypeAdapter(List::class.java, ArrayDefailtAdapter())
+                .create()
+        }
+        return gson!!
+    }
+}

+ 153 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/AbsActivity.kt

@@ -0,0 +1,153 @@
+package com.guadou.lib_baselib.base.activity
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.content.pm.ActivityInfo
+import android.content.res.Configuration
+import android.content.res.Resources
+import android.graphics.Color
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.guadou.lib_baselib.receiver.ConnectivityReceiver
+import com.guadou.lib_baselib.utils.ActivityManage
+import com.guadou.lib_baselib.utils.StatusBarUtils
+
+
+/**
+ * 最底层的Activity,不带MVP和MVVM,一般不用这个
+ */
+abstract class AbsActivity() : AppCompatActivity(), ConnectivityReceiver.ConnectivityReceiverListener {
+
+    /**
+     * 获取Context对象
+     */
+    protected lateinit var mActivity: Activity
+    protected lateinit var mContext: Context
+
+    abstract fun setContentView()
+
+    abstract fun init()
+
+    /**
+     * 从intent中解析数据,具体子类来实现
+     */
+    open protected fun getDataFromIntent(intent: Intent) {}
+
+    /**
+     * 设置顶部状态栏的颜色(默认为白色背景-黑色文字)
+     */
+    protected fun setStatusBarColor(): Int {
+        //如果状态栏文字能变黑那么背景设置为白色,否则返回背景灰色文本默认为白色
+        return if (StatusBarUtils.setStatusBarBlackText(this)) {
+            Color.WHITE
+        } else {
+            Color.parseColor("#B0B0B0")
+        }
+    }
+
+    /**
+     * 动态的设置状态栏颜色
+     * 当颜色为白色的时候显示白底黑字
+     * 其他颜色为其他颜色底白色字
+     * 一般由子类重写
+     */
+    fun setStatusBarColor(color: Int) {
+
+        if (color == Color.WHITE) {
+            //变黑色文字成功
+            if (StatusBarUtils.setStatusBarBlackText(this)) {
+                StatusBarUtils.setColor(this, Color.WHITE)
+            } else {
+                StatusBarUtils.setColor(this, Color.parseColor("#B0B0B0"))
+            }
+
+        } else {
+
+            //变为白色文字成功
+            StatusBarUtils.setStatusBarWhiteText(this)
+            StatusBarUtils.setColor(this, color)
+
+        }
+    }
+
+    /**
+     * 跳转页面
+     */
+    protected fun gotoActivity(clazz: Class<*>) {
+        startActivity(Intent(mActivity, clazz))
+    }
+
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView()
+
+        mActivity = this
+        mContext = this.applicationContext
+
+        //设置当前页面的顶部状态栏背景.
+        StatusBarUtils.setColor(this, setStatusBarColor())
+
+        //获取intent传递的数据
+        if (intent != null) {
+            getDataFromIntent(intent)
+        }
+
+        //设置竖屏展示
+        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+
+        /** 管理Activity的栈  */
+        ActivityManage.addActivity(this)
+
+        if (needRegisterNetworkChangeObserver()) {
+            ConnectivityReceiver.registerObserver(this)
+            ConnectivityReceiver.registerAnnotationObserver(this)
+        }
+
+        init()
+    }
+
+    /**
+     * 是否需要注册监听网络变换
+     */
+    open protected fun needRegisterNetworkChangeObserver(): Boolean {
+        return false
+    }
+
+
+    /**
+     * 只映射了onDestroy方法
+     */
+    override fun onDestroy() {
+        super.onDestroy()
+
+        ActivityManage.removeActivity(this)
+
+        if (needRegisterNetworkChangeObserver()) {
+            ConnectivityReceiver.unregisterObserver(this)
+            ConnectivityReceiver.unregisterAnnotationObserver(this)
+        }
+    }
+
+    /**
+     * 设置应用的字体不随系统的字体大小而改变
+     */
+    override fun onConfigurationChanged(newConfig: Configuration) {
+        if (newConfig.fontScale != 1f)
+        //非默认值    //当接收系统的字体大小改变的时候。重置为默认
+            resources
+        super.onConfigurationChanged(newConfig)
+    }
+
+    override fun getResources(): Resources {
+        val res = super.getResources()
+        if (res.configuration.fontScale != 1f) {//非默认值
+            val newConfig = Configuration()
+            newConfig.setToDefaults()//设置默认
+            res.updateConfiguration(newConfig, res.displayMetrics)
+        }
+        return res
+    }
+
+}

+ 114 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVDBActivity.kt

@@ -0,0 +1,114 @@
+package com.guadou.lib_baselib.base.activity
+
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.core.util.forEach
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+
+/**
+ * 加入ViewModel与LoadState与DataBinding
+ * 默认为Loading弹窗的加载方式
+ */
+abstract class BaseVDBActivity<VM : BaseViewModel, VDB : ViewDataBinding> : AbsActivity() {
+
+    protected lateinit var mViewModel: VM
+    protected lateinit var mBinding: VDB
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        startObserve()
+    }
+
+    //使用这个方法简化ViewModel的初始化
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    open protected fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView() {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(this, stateObserver)
+
+        val config = getDataBindingConfig()
+        mBinding = DataBindingUtil.setContentView(this, config.getLayout())
+        mBinding.lifecycleOwner = this
+
+        if (config.getVmVariableId() != 0) {
+            mBinding.setVariable(
+                config.getVmVariableId(),
+                config.getViewModel()
+            )
+        }
+
+        val bindingParams = config.getBindingParams()
+        bindingParams.forEach { key, value ->
+            mBinding.setVariable(key, value)
+        }
+    }
+
+    abstract fun getDataBindingConfig(): DataBindingConfig
+    abstract fun startObserve()
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateError(message: String?) {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected open fun showStateLoading() {
+        LoadingDialogManager.get().showLoading(this)
+    }
+
+    protected open fun showStateNoData() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+}

+ 129 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVDBLoadingActivity.kt

@@ -0,0 +1,129 @@
+package com.guadou.lib_baselib.base.activity
+
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.core.util.forEach
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+import com.guadou.lib_baselib.view.gloading.Gloading
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为布局加载的方式
+ */
+abstract class BaseVDBLoadingActivity<VM : BaseViewModel, VDB : ViewDataBinding> : AbsActivity() {
+
+    protected lateinit var mViewModel: VM
+    protected lateinit var mBinding: VDB
+
+    protected val mGLoadingHolder by lazy {
+        generateGLoading()
+    }
+
+    //如果要替换GLoading,重写次方法
+    open protected fun generateGLoading(): Gloading.Holder {
+        return Gloading.getDefault().wrap(this).withRetry {
+            onGoadingRetry()
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        startObserve()
+    }
+
+    //使用这个方法简化ViewModewl的Hilt依赖注入获取
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    open protected fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView() {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(this, stateObserver)
+
+        val config = getDataBindingConfig()
+        mBinding = DataBindingUtil.setContentView(this, config.getLayout())
+        mBinding.lifecycleOwner = this
+
+        if (config.getVmVariableId() != 0) {
+            mBinding.setVariable(
+                config.getVmVariableId(),
+                config.getViewModel()
+            )
+        }
+
+        val bindingParams = config.getBindingParams()
+        bindingParams.forEach { key, value ->
+            mBinding.setVariable(key, value)
+        }
+    }
+
+    abstract fun getDataBindingConfig(): DataBindingConfig
+    abstract fun startObserve()
+    protected open fun onGoadingRetry() {
+    }
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateLoading() {
+        mGLoadingHolder.showLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        mGLoadingHolder.showLoadSuccess()
+    }
+
+    protected open fun showStateError(message: String?) {
+        mGLoadingHolder.showLoadFailed(message)
+    }
+
+    protected open fun showStateNoData() {
+        mGLoadingHolder.showEmpty()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+}

+ 95 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVMActivity.kt

@@ -0,0 +1,95 @@
+package com.guadou.lib_baselib.base.activity
+
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading弹窗的加载方式
+ */
+abstract class BaseVMActivity<VM : BaseViewModel> : AbsActivity() {
+
+    protected lateinit var mViewModel: VM
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        startObserve()
+    }
+
+    //使用这个方法简化ViewModel的初始化
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    open protected fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView() {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(this, stateObserver)
+
+        setContentView(getLayoutIdRes())
+    }
+
+    abstract fun getLayoutIdRes(): Int
+    abstract fun startObserve()
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateError(message: String?) {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected open fun showStateLoading() {
+        LoadingDialogManager.get().showLoading(this)
+    }
+
+    protected open fun showStateNoData() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+}

+ 110 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/activity/BaseVMLoadingActivity.kt

@@ -0,0 +1,110 @@
+package com.guadou.lib_baselib.base.activity
+
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+import com.guadou.lib_baselib.view.gloading.Gloading
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为布局加载的方式
+ */
+abstract class BaseVMLoadingActivity<VM : BaseViewModel> : AbsActivity() {
+
+    protected lateinit var mViewModel: VM
+
+    protected val mGLoadingHolder by lazy {
+        generateGLoading()
+    }
+
+    //如果要替换GLoading,重写次方法
+    open protected fun generateGLoading(): Gloading.Holder {
+        return Gloading.getDefault().wrap(this).withRetry {
+            onGoadingRetry()
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        startObserve()
+    }
+
+    //使用这个方法简化ViewModewl的Hilt依赖注入获取
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    open protected fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView() {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(this, stateObserver)
+
+        setContentView(getLayoutIdRes())
+    }
+
+    abstract fun getLayoutIdRes(): Int
+    abstract fun startObserve()
+    protected open fun onGoadingRetry() {
+    }
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateLoading() {
+        mGLoadingHolder.showLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        mGLoadingHolder.showLoadSuccess()
+    }
+
+    protected open fun showStateError(message: String?) {
+        mGLoadingHolder.showLoadFailed(message)
+    }
+
+    protected open fun showStateNoData() {
+        mGLoadingHolder.showEmpty()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+}

+ 76 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/AbsFragment.kt

@@ -0,0 +1,76 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.app.Activity
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+
+import com.guadou.lib_baselib.receiver.ConnectivityReceiver
+
+
+/**
+ * 普通的Fragment,基类Fragment
+ */
+
+abstract class AbsFragment : Fragment(), ConnectivityReceiver.ConnectivityReceiverListener {
+
+    /**
+     * 获取Context对象
+     */
+    protected lateinit var mActivity: Activity
+    protected lateinit var mContext: Context
+
+
+    abstract fun setContentView(container: ViewGroup?): View
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        mActivity = activity!!
+        mContext = activity!!.applicationContext
+
+        if (needRegisterNetworkChangeObserver()) {
+            ConnectivityReceiver.registerObserver(this)
+            ConnectivityReceiver.registerAnnotationObserver(this)
+        }
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        return transformRootView(setContentView(container))
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        initViews(view)
+    }
+
+    //用于转换根数图View(可以对其做一些别的操作,例如加入GLoading)
+    protected open fun transformRootView(view: View): View {
+        return view
+    }
+
+    protected open fun initViews(view: View) {
+    }
+
+    /**
+     * 只映射了onDestroy方法 取消任务
+     */
+    override fun onDestroy() {
+        super.onDestroy()
+
+        if (needRegisterNetworkChangeObserver()) {
+            ConnectivityReceiver.unregisterObserver(this)
+            ConnectivityReceiver.unregisterAnnotationObserver(this)
+        }
+    }
+
+    /**
+     * 是否需要注册监听网络变换
+     */
+    open protected fun needRegisterNetworkChangeObserver(): Boolean {
+        return false
+    }
+
+}

+ 120 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVDBFragment.kt

@@ -0,0 +1,120 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.util.forEach
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading的加载
+ */
+abstract class BaseVDBFragment<VM : BaseViewModel, VDB : ViewDataBinding> : AbsFragment() {
+
+    protected lateinit var mViewModel: VM
+    protected lateinit var mBinding: VDB
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        init()
+        startObserve()
+    }
+
+    //使用这个方法简化ViewModel的初始化
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    private fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView(container: ViewGroup?): View {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(viewLifecycleOwner, stateObserver)
+
+        val config = getDataBindingConfig()
+        mBinding = DataBindingUtil.inflate(layoutInflater, config.getLayout(), container, false)
+        mBinding.lifecycleOwner = viewLifecycleOwner
+
+        if (config.getVmVariableId() != 0) {
+            mBinding.setVariable(
+                config.getVmVariableId(),
+                config.getViewModel()
+            )
+        }
+
+        val bindingParams = config.getBindingParams()
+        bindingParams.forEach { key, value ->
+            mBinding.setVariable(key, value)
+        }
+
+        return mBinding.root
+    }
+
+    abstract fun getDataBindingConfig(): DataBindingConfig
+    abstract fun startObserve()
+    abstract fun init()
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected fun showStateNormal() {}
+
+    protected fun showStateError(message: String?) {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateSuccess() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateLoading() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun showStateNoData() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+}

+ 200 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVDBLazyLoadingFragment.kt

@@ -0,0 +1,200 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.util.forEach
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+import com.guadou.lib_baselib.view.gloading.Gloading
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading布局的懒加载
+ */
+abstract class BaseVDBLazyLoadingFragment<VM : BaseViewModel, VDB : ViewDataBinding> : AbsFragment() {
+
+    protected lateinit var mViewModel: VM
+    protected lateinit var mBinding: VDB
+    private var isViewCreated = false//布局是否被创建
+    private var isLoadData = false//数据是否加载
+    private var isFirstVisible = true//是否第一次可见
+    protected lateinit var mGLoadingHolder: Gloading.Holder
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        isViewCreated = true
+
+        init()
+        startObserve()
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+
+        if (isFragmentVisible(this) && this.isAdded) {
+
+            if (parentFragment == null || isFragmentVisible(parentFragment)) {
+                onLazyInitData()
+                isLoadData = true
+                if (isFirstVisible) isFirstVisible = false
+            }
+        }
+    }
+
+    //使用这个方法简化ViewModewl的Hilt依赖注入获取
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    private fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView(container: ViewGroup?): View {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(viewLifecycleOwner, stateObserver)
+
+        val config = getDataBindingConfig()
+        mBinding = DataBindingUtil.inflate(layoutInflater, config.getLayout(), container, false)
+        mBinding.lifecycleOwner = viewLifecycleOwner
+
+        if (config.getVmVariableId() != 0) {
+            mBinding.setVariable(
+                config.getVmVariableId(),
+                config.getViewModel()
+            )
+        }
+
+        val bindingParams = config.getBindingParams()
+        bindingParams.forEach { key, value ->
+            mBinding.setVariable(key, value)
+        }
+
+        return mBinding.root
+    }
+
+    abstract fun getDataBindingConfig(): DataBindingConfig
+
+    abstract fun startObserve()
+    abstract fun init()
+    abstract fun onLazyInitData()
+
+    //Loading Create Root View
+    override fun transformRootView(view: View): View {
+        mGLoadingHolder = generateGLoading(view)
+        return mGLoadingHolder.wrapper
+    }
+
+    //如果要替换GLoading,重写次方法
+    open protected fun generateGLoading(view: View): Gloading.Holder {
+        return Gloading.getDefault().wrap(view).withRetry {
+            onGoadingRetry()
+        }
+    }
+
+    protected open fun onGoadingRetry() {
+    }
+
+    override fun onNetworkConnectionChanged(
+        isConnected: Boolean,
+        networkType: NetWorkUtil.NetworkType?
+    ) {
+    }
+
+    // ============================  Lazy Load begin ↓  =============================
+
+    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
+        super.setUserVisibleHint(isVisibleToUser)
+        if (isFragmentVisible(this) && !isLoadData && isViewCreated && this.isAdded) {
+            onLazyInitData()
+            isLoadData = true
+        }
+    }
+
+    override fun onHiddenChanged(hidden: Boolean) {
+        super.onHiddenChanged(hidden)
+        //onHiddenChanged调用在Resumed之前,所以此时可能fragment被add, 但还没resumed
+        if (!hidden && !this.isResumed)
+            return
+        //使用hide和show时,fragment的所有生命周期方法都不会调用,除了onHiddenChanged()
+        if (!hidden && isFirstVisible && this.isAdded) {
+            onLazyInitData()
+            isFirstVisible = false
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+
+        isViewCreated = false
+        isLoadData = false
+        isFirstVisible = true
+    }
+
+    /**
+     * 当前Fragment是否对用户是否可见
+     * @param fragment 要判断的fragment
+     * @return true表示对用户可见
+     */
+    private fun isFragmentVisible(fragment: Fragment?): Boolean {
+        return !fragment?.isHidden!! && fragment.userVisibleHint
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateLoading() {
+        mGLoadingHolder.showLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        mGLoadingHolder.showLoadSuccess()
+    }
+
+    protected open fun showStateError(message: String?) {
+        mGLoadingHolder.showLoadFailed(message)
+    }
+
+    protected open fun showStateNoData() {
+        mGLoadingHolder.showEmpty()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+}

+ 144 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVDBLoadingFragment.kt

@@ -0,0 +1,144 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.util.forEach
+import androidx.databinding.DataBindingUtil
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.DataBindingConfig
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+import com.guadou.lib_baselib.view.gloading.Gloading
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading布局的加载方式
+ */
+abstract class BaseVDBLoadingFragment<VM : BaseViewModel, VDB : ViewDataBinding> : AbsFragment() {
+
+    protected lateinit var mViewModel: VM
+    protected lateinit var mBinding: VDB
+
+    protected lateinit var mGLoadingHolder: Gloading.Holder
+
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        init()
+
+        startObserve()
+    }
+
+
+    override fun transformRootView(view: View): View {
+
+        mGLoadingHolder = generateGLoading(view)
+
+        return mGLoadingHolder.wrapper
+    }
+
+    //如果要替换GLoading,重写次方法
+    open protected fun generateGLoading(view: View): Gloading.Holder {
+        return Gloading.getDefault().wrap(view).withRetry {
+            onGoadingRetry()
+        }
+    }
+
+    protected open fun onGoadingRetry() {
+    }
+
+    //使用这个方法简化ViewModewl的Hilt依赖注入获取
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    private fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView(container: ViewGroup?): View {
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(viewLifecycleOwner, stateObserver)
+
+        val config = getDataBindingConfig()
+        mBinding = DataBindingUtil.inflate(layoutInflater, config.getLayout(), container, false)
+        mBinding.lifecycleOwner = viewLifecycleOwner
+
+        if (config.getVmVariableId() != 0) {
+            mBinding.setVariable(
+                config.getVmVariableId(),
+                config.getViewModel()
+            )
+        }
+
+        val bindingParams = config.getBindingParams()
+        bindingParams.forEach { key, value ->
+            mBinding.setVariable(key, value)
+        }
+
+        return mBinding.root
+    }
+
+    abstract fun getDataBindingConfig(): DataBindingConfig
+    abstract fun startObserve()
+    abstract fun init()
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateLoading() {
+        mGLoadingHolder.showLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        mGLoadingHolder.showLoadSuccess()
+    }
+
+    protected open fun showStateError(message: String?) {
+        mGLoadingHolder.showLoadFailed(message)
+    }
+
+    protected open fun showStateNoData() {
+        mGLoadingHolder.showEmpty()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+}

+ 102 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVMFragment.kt

@@ -0,0 +1,102 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading的加载
+ */
+abstract class BaseVMFragment<VM : BaseViewModel> : AbsFragment() {
+
+    protected lateinit var mViewModel: VM
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(viewLifecycleOwner, stateObserver)
+
+        init()
+        startObserve()
+    }
+
+    //使用这个方法简化ViewModel的初始化
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    private fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView(container: ViewGroup?): View {
+        return layoutInflater.inflate(getLayoutIdRes(), container, false)
+    }
+
+    /**
+     * 获取layout的id,具体由子类实现
+     */
+    abstract fun getLayoutIdRes(): Int
+    abstract fun startObserve()
+    abstract fun init()
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected fun showStateNormal() {}
+
+    protected fun showStateError(message: String?) {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateSuccess() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateLoading() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun showStateNoData() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+}

+ 181 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVMLazyLoadingFragment.kt

@@ -0,0 +1,181 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+import com.guadou.lib_baselib.view.gloading.Gloading
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading布局的懒加载
+ */
+abstract class BaseVMLazyLoadingFragment<VM : BaseViewModel> : AbsFragment() {
+
+    protected lateinit var mViewModel: VM
+    private var isViewCreated = false//布局是否被创建
+    private var isLoadData = false//数据是否加载
+    private var isFirstVisible = true//是否第一次可见
+    protected lateinit var mGLoadingHolder: Gloading.Holder
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        isViewCreated = true
+
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(viewLifecycleOwner, stateObserver)
+
+        init()
+        startObserve()
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+
+        if (isFragmentVisible(this) && this.isAdded) {
+
+            if (parentFragment == null || isFragmentVisible(parentFragment)) {
+                onLazyInitData()
+                isLoadData = true
+                if (isFirstVisible) isFirstVisible = false
+            }
+        }
+    }
+
+    //使用这个方法简化ViewModewl的Hilt依赖注入获取
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    private fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView(container: ViewGroup?): View {
+        return layoutInflater.inflate(getLayoutIdRes(), container, false)
+    }
+
+    /**
+     * 获取layout的id,具体由子类实现
+     */
+    abstract fun getLayoutIdRes(): Int
+    abstract fun startObserve()
+    abstract fun init()
+    abstract fun onLazyInitData()
+
+    //Loading Create Root View
+    override fun transformRootView(view: View): View {
+        mGLoadingHolder = generateGLoading(view)
+        return mGLoadingHolder.wrapper
+    }
+
+    //如果要替换GLoading,重写次方法
+    open protected fun generateGLoading(view: View): Gloading.Holder {
+        return Gloading.getDefault().wrap(view).withRetry {
+            onGoadingRetry()
+        }
+    }
+
+    protected open fun onGoadingRetry() {
+    }
+
+    override fun onNetworkConnectionChanged(
+        isConnected: Boolean,
+        networkType: NetWorkUtil.NetworkType?
+    ) {
+    }
+
+    // ============================  Lazy Load begin ↓  =============================
+
+    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
+        super.setUserVisibleHint(isVisibleToUser)
+        if (isFragmentVisible(this) && !isLoadData && isViewCreated && this.isAdded) {
+            onLazyInitData()
+            isLoadData = true
+        }
+    }
+
+    override fun onHiddenChanged(hidden: Boolean) {
+        super.onHiddenChanged(hidden)
+        //onHiddenChanged调用在Resumed之前,所以此时可能fragment被add, 但还没resumed
+        if (!hidden && !this.isResumed)
+            return
+        //使用hide和show时,fragment的所有生命周期方法都不会调用,除了onHiddenChanged()
+        if (!hidden && isFirstVisible && this.isAdded) {
+            onLazyInitData()
+            isFirstVisible = false
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+
+        isViewCreated = false
+        isLoadData = false
+        isFirstVisible = true
+    }
+
+    /**
+     * 当前Fragment是否对用户是否可见
+     * @param fragment 要判断的fragment
+     * @return true表示对用户可见
+     */
+    private fun isFragmentVisible(fragment: Fragment?): Boolean {
+        return !fragment?.isHidden!! && fragment.userVisibleHint
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateLoading() {
+        mGLoadingHolder.showLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        mGLoadingHolder.showLoadSuccess()
+    }
+
+    protected open fun showStateError(message: String?) {
+        mGLoadingHolder.showLoadFailed(message)
+    }
+
+    protected open fun showStateNoData() {
+        mGLoadingHolder.showEmpty()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+}

+ 125 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/fragment/BaseVMLoadingFragment.kt

@@ -0,0 +1,125 @@
+package com.guadou.lib_baselib.base.fragment
+
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+import com.guadou.lib_baselib.bean.LoadAction
+import com.guadou.lib_baselib.ext.getVMCls
+import com.guadou.lib_baselib.utils.NetWorkUtil
+import com.guadou.lib_baselib.view.LoadingDialogManager
+import com.guadou.lib_baselib.view.gloading.Gloading
+
+/**
+ * 加入ViewModel与LoadState
+ * 默认为Loading布局的加载方式
+ */
+abstract class BaseVMLoadingFragment<VM : BaseViewModel> : AbsFragment() {
+
+    protected lateinit var mViewModel: VM
+
+    protected lateinit var mGLoadingHolder: Gloading.Holder
+
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        mViewModel = createViewModel()
+        //观察网络数据状态
+        mViewModel.getActionLiveData().observe(viewLifecycleOwner, stateObserver)
+
+        init()
+        startObserve()
+    }
+
+
+    override fun transformRootView(view: View): View {
+
+        mGLoadingHolder = generateGLoading(view)
+
+        return mGLoadingHolder.wrapper
+    }
+
+    //如果要替换GLoading,重写次方法
+    open protected fun generateGLoading(view: View): Gloading.Holder {
+        return Gloading.getDefault().wrap(view).withRetry {
+            onGoadingRetry()
+        }
+    }
+
+    protected open fun onGoadingRetry() {
+    }
+
+    //使用这个方法简化ViewModewl的Hilt依赖注入获取
+    protected inline fun <reified VM : BaseViewModel> getViewModel(): VM {
+        val viewModel: VM by viewModels()
+        return viewModel
+    }
+
+    //反射获取ViewModel实例
+    private fun createViewModel(): VM {
+        return ViewModelProvider(this).get(getVMCls(this))
+    }
+
+    override fun setContentView(container: ViewGroup?): View {
+        return layoutInflater.inflate(getLayoutIdRes(), container, false)
+    }
+
+    /**
+     * 获取layout的id,具体由子类实现
+     */
+    abstract fun getLayoutIdRes(): Int
+    abstract fun startObserve()
+    abstract fun init()
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean, networkType: NetWorkUtil.NetworkType?) {
+    }
+
+    // ================== 网络状态的监听 ======================
+
+    private var stateObserver: Observer<LoadAction> = Observer { loadAction ->
+        if (loadAction != null) {
+
+            when (loadAction.action) {
+                LoadAction.STATE_NORMAL -> showStateNormal()
+                LoadAction.STATE_ERROR -> showStateError(loadAction.message)
+                LoadAction.STATE_SUCCESS -> showStateSuccess()
+                LoadAction.STATE_LOADING -> showStateLoading()
+                LoadAction.STATE_NO_DATA -> showStateNoData()
+                LoadAction.STATE_PROGRESS -> showStateProgress()
+                LoadAction.STATE_HIDE_PROGRESS -> hideStateProgress()
+            }
+
+        }
+    }
+
+    protected open fun showStateNormal() {}
+
+    protected open fun showStateLoading() {
+        mGLoadingHolder.showLoading()
+    }
+
+    protected open fun showStateSuccess() {
+        mGLoadingHolder.showLoadSuccess()
+    }
+
+    protected open fun showStateError(message: String?) {
+        mGLoadingHolder.showLoadFailed(message)
+    }
+
+    protected open fun showStateNoData() {
+        mGLoadingHolder.showEmpty()
+    }
+
+    protected fun showStateProgress() {
+        LoadingDialogManager.get().showLoading(mActivity)
+    }
+
+    protected fun hideStateProgress() {
+        LoadingDialogManager.get().dismissLoading()
+    }
+
+}

+ 71 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/vm/BaseRepository.kt

@@ -0,0 +1,71 @@
+package com.guadou.lib_baselib.base.vm
+
+import android.text.TextUtils
+import com.google.gson.JsonParseException
+import com.guadou.testxiecheng.base.BaseBean
+import com.guadou.testxiecheng.base.OkResult
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.coroutineScope
+import retrofit2.HttpException
+import java.io.IOException
+import java.net.ConnectException
+import java.net.SocketException
+import java.net.SocketTimeoutException
+import java.net.UnknownHostException
+
+open class BaseRepository {
+
+    //无异常处理 -> 一般不用这个,一旦报错会App崩溃
+    suspend inline fun <T : Any> handleApiCall(call: suspend () -> BaseBean<T>): BaseBean<T> {
+        return call.invoke()
+    }
+
+    //处理Http错误-内部再处理Api错误
+    suspend fun <T : Any> handleErrorApiCall(call: suspend () -> OkResult<T>, errorMessage: String = ""): OkResult<T> {
+        return try {
+            call()
+        } catch (e: Exception) {
+            if (!TextUtils.isEmpty(errorMessage)) {
+                OkResult.Error(IOException(errorMessage))
+            } else {
+                OkResult.Error(handleExceptionMessage(e))
+            }
+        }
+    }
+
+    //处理Api错误,例如403Token过期 ;把BaseBean的数据转换为自定义的Result数据
+    suspend fun <T : Any> handleApiErrorResponse(
+        response: BaseBean<T>,
+        successBlock: (suspend CoroutineScope.() -> Unit)? = null,
+        errorBlock: (suspend CoroutineScope.() -> Unit)? = null
+    ): OkResult<T> {
+
+        return coroutineScope {
+            //执行挂起函数
+            if (response.code == 200) {  //这里根据业务逻辑来 200 -1 等
+                successBlock?.let { it() }
+                OkResult.Success(response.data)
+            } else {
+                errorBlock?.let { it() }
+                OkResult.Error(IOException(response.message))
+            }
+        }
+    }
+
+
+    //处理自定义错误消息
+    fun handleExceptionMessage(e: Exception): IOException {
+        return when (e) {
+            is UnknownHostException -> IOException("Unable to access domain name, unknown domain name.")
+            is JsonParseException -> IOException("Data parsing exception.")
+            is HttpException -> IOException("The server is on business. Please try again later.")
+            is ConnectException -> IOException("Network connection exception, please check the network.")
+            is SocketException -> IOException("Network connection exception, please check the network.")
+            is SocketTimeoutException -> IOException("Network connection timeout.")
+            is RuntimeException -> IOException("Error running, please try again.")
+            else -> IOException("unknown error.")
+        }
+
+    }
+
+}

+ 61 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/vm/BaseViewModel.kt

@@ -0,0 +1,61 @@
+package com.guadou.lib_baselib.base.vm
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.guadou.lib_baselib.bean.LoadAction
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+open class BaseViewModel : ViewModel() {
+
+    var mLoadActionLiveData: MutableLiveData<LoadAction> = MutableLiveData()
+
+    fun launchOnUI(block: suspend CoroutineScope.() -> Unit) {
+        viewModelScope.launch { block() }
+    }
+
+    suspend fun <T> launchOnIO(block: suspend CoroutineScope.() -> T) {
+        withContext(Dispatchers.IO) {
+            block
+        }
+    }
+
+    /**
+     * 设置并发射加载状态
+     */
+    fun setStateLiveData(loadState: LoadAction) {
+        mLoadActionLiveData.postValue(loadState)
+    }
+
+    fun loadStartLoading() {
+        mLoadActionLiveData.postValue(LoadAction(LoadAction.STATE_LOADING))
+    }
+
+    fun loadSuccess() {
+        mLoadActionLiveData.postValue(LoadAction(LoadAction.STATE_SUCCESS))
+    }
+
+    fun loadError(message: String?) {
+        mLoadActionLiveData.postValue(LoadAction(LoadAction.STATE_ERROR, message))
+    }
+
+    fun loadNoData() {
+        mLoadActionLiveData.postValue(LoadAction(LoadAction.STATE_NO_DATA))
+    }
+
+    fun loadStartProgress() {
+        mLoadActionLiveData.postValue(LoadAction(LoadAction.STATE_PROGRESS))
+    }
+
+    fun loadHideProgress() {
+        mLoadActionLiveData.postValue(LoadAction(LoadAction.STATE_HIDE_PROGRESS))
+    }
+
+    fun getActionLiveData(): MutableLiveData<LoadAction> {
+        return mLoadActionLiveData
+    }
+
+}

+ 6 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/base/vm/EmptyViewModel.kt

@@ -0,0 +1,6 @@
+package com.guadou.lib_baselib.base.vm
+
+
+
+
+class EmptyViewModel constructor() : BaseViewModel()

+ 3 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/bean/BaseBean.kt

@@ -0,0 +1,3 @@
+package com.guadou.testxiecheng.base
+
+data class BaseBean<out T>(val code: Int, val message: String, val data: T)

+ 28 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/bean/DataBindingConfig.kt

@@ -0,0 +1,28 @@
+package com.guadou.lib_baselib.bean
+
+import android.util.SparseArray
+import com.guadou.lib_baselib.base.vm.BaseViewModel
+
+//DataBinding的封装数据
+class DataBindingConfig(private val layout: Int, private val vmVariableId: Int, private val viewModel: BaseViewModel?) {
+
+    constructor(layout: Int) : this(layout, 0, null)
+
+    private var bindingParams: SparseArray<Any> = SparseArray()
+
+    fun getLayout(): Int = layout
+
+    fun getVmVariableId(): Int = vmVariableId
+
+    fun getViewModel(): BaseViewModel? = viewModel
+
+    fun getBindingParams(): SparseArray<Any> = bindingParams
+
+    fun addBindingParams(variableId: Int, objezt: Any): DataBindingConfig {
+        if (bindingParams.get(variableId) == null) {
+            bindingParams.put(variableId, objezt)
+        }
+        return this
+    }
+
+}

+ 0 - 0
cs_baselib/src/main/java/com/guadou/lib_baselib/bean/LoadAction.kt


Некоторые файлы не были показаны из-за большого количества измененных файлов