Browse Source

项目初始化

郭彪 2 years ago
commit
7a1038a265
100 changed files with 2841 additions and 0 deletions
  1. 15 0
      .gitignore
  2. 3 0
      .idea/.gitignore
  3. 6 0
      .idea/compiler.xml
  4. 23 0
      .idea/gradle.xml
  5. 35 0
      .idea/jarRepositories.xml
  6. 35 0
      .idea/misc.xml
  7. 6 0
      .idea/vcs.xml
  8. 1 0
      BaseLibrary/.gitignore
  9. 128 0
      BaseLibrary/build.gradle
  10. 21 0
      BaseLibrary/proguard-rules.pro
  11. 24 0
      BaseLibrary/src/androidTest/java/com/cooleshow/base/ExampleInstrumentedTest.kt
  12. 13 0
      BaseLibrary/src/main/AndroidManifest.xml
  13. 60 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/AppManager.kt
  14. 42 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseApplication.kt
  15. 17 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.kt
  16. 10 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/ResultCode.kt
  17. 79 0
      BaseLibrary/src/main/java/com/cooleshow/base/data/net/RetrofitFactory.kt
  18. 9 0
      BaseLibrary/src/main/java/com/cooleshow/base/data/protocol/BaseResp.kt
  19. 131 0
      BaseLibrary/src/main/java/com/cooleshow/base/ext/CommonExt.kt
  20. 12 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/ActivityScope.kt
  21. 12 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/PerComponentScope.kt
  22. 20 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/component/ActivityComponent.kt
  23. 16 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/component/AppComponent.kt
  24. 22 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/module/ActivityModule.kt
  25. 20 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/module/AppModule.kt
  26. 17 0
      BaseLibrary/src/main/java/com/cooleshow/base/injection/module/LifecycleProviderModule.kt
  27. 34 0
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/BasePresenter.kt
  28. 10 0
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/view/BaseView.kt
  29. 6 0
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseException.kt
  30. 20 0
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFunc.kt
  31. 20 0
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFuncBoolean.kt
  32. 25 0
      BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseSubscriber.kt
  33. 34 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/BaseActivity.kt
  34. 77 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/BaseMvpActivity.kt
  35. 159 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/BaseTakePhotoActivity.kt
  36. 48 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/adapter/BaseRecyclerViewAdapter.kt
  37. 9 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/fragment/BaseFragment.kt
  38. 76 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/fragment/BaseMvpFragment.kt
  39. 105 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/AppPrefsUtils.kt
  40. 266 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/DateUtils.kt
  41. 35 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/GlideUtils.kt
  42. 38 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/NetWorkUtils.kt
  43. 131 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/YuanFenConverter.kt
  44. 14 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/BannerImageLoader.kt
  45. 97 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/BottomNavBar.kt
  46. 18 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/DefaultTextWatcher.kt
  47. 93 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/HeaderBar.kt
  48. 48 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/LabelTextView.kt
  49. 59 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/ProgressLoading.kt
  50. 56 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/RoundRectImageView.kt
  51. 83 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/VerifyButton.kt
  52. 6 0
      BaseLibrary/src/main/res/anim/push_bottom_in.xml
  53. 6 0
      BaseLibrary/src/main/res/anim/push_bottom_out.xml
  54. 30 0
      BaseLibrary/src/main/res/drawable-v24/ic_launcher_foreground.xml
  55. 6 0
      BaseLibrary/src/main/res/drawable/border_all.xml
  56. 10 0
      BaseLibrary/src/main/res/drawable/border_bottom.xml
  57. 10 0
      BaseLibrary/src/main/res/drawable/border_bottom_gray.xml
  58. 7 0
      BaseLibrary/src/main/res/drawable/border_corner_all.xml
  59. 7 0
      BaseLibrary/src/main/res/drawable/border_corner_all_blue.xml
  60. 10 0
      BaseLibrary/src/main/res/drawable/border_top.xml
  61. 10 0
      BaseLibrary/src/main/res/drawable/bottom_nav_cart_selector.xml
  62. 7 0
      BaseLibrary/src/main/res/drawable/bottom_nav_text_selector.xml
  63. 6 0
      BaseLibrary/src/main/res/drawable/btn_common_disable.xml
  64. 6 0
      BaseLibrary/src/main/res/drawable/btn_common_nor.xml
  65. 6 0
      BaseLibrary/src/main/res/drawable/btn_common_pressed.xml
  66. 7 0
      BaseLibrary/src/main/res/drawable/btn_common_selector.xml
  67. 10 0
      BaseLibrary/src/main/res/drawable/collect_selector.xml
  68. 8 0
      BaseLibrary/src/main/res/drawable/common_check_selector.xml
  69. 7 0
      BaseLibrary/src/main/res/drawable/corner_blue_white_bg.xml
  70. 7 0
      BaseLibrary/src/main/res/drawable/corner_gray_white_bg.xml
  71. 7 0
      BaseLibrary/src/main/res/drawable/home_header_corner_bg.xml
  72. 170 0
      BaseLibrary/src/main/res/drawable/ic_launcher_background.xml
  73. 16 0
      BaseLibrary/src/main/res/drawable/progress_dialog_anim.xml
  74. 12 0
      BaseLibrary/src/main/res/drawable/progress_dialog_bg.xml
  75. 12 0
      BaseLibrary/src/main/res/drawable/state_loading.xml
  76. 10 0
      BaseLibrary/src/main/res/drawable/tab_selector.xml
  77. 27 0
      BaseLibrary/src/main/res/layout/layout_header_bar.xml
  78. 14 0
      BaseLibrary/src/main/res/layout/layout_label_textview.xml
  79. 13 0
      BaseLibrary/src/main/res/layout/layout_state_empty.xml
  80. 14 0
      BaseLibrary/src/main/res/layout/layout_state_error.xml
  81. 19 0
      BaseLibrary/src/main/res/layout/layout_state_loading.xml
  82. 13 0
      BaseLibrary/src/main/res/layout/progress_dialog.xml
  83. 5 0
      BaseLibrary/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  84. 5 0
      BaseLibrary/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  85. BIN
      BaseLibrary/src/main/res/mipmap-hdpi/ic_launcher.webp
  86. BIN
      BaseLibrary/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  87. BIN
      BaseLibrary/src/main/res/mipmap-mdpi/ic_launcher.webp
  88. BIN
      BaseLibrary/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  89. BIN
      BaseLibrary/src/main/res/mipmap-xhdpi/ic_launcher.webp
  90. BIN
      BaseLibrary/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  91. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_cart_normal.png
  92. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_cart_press.png
  93. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_category_normal.png
  94. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_category_press.png
  95. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_home_normal.png
  96. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_home_press.png
  97. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_msg_normal.png
  98. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_msg_press.png
  99. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_user_normal.png
  100. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_user_press.png

+ 15 - 0
.gitignore

@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 6 - 0
.idea/compiler.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <bytecodeTargetLevel target="11" />
+  </component>
+</project>

+ 23 - 0
.idea/gradle.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="testRunner" value="GRADLE" />
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="Embedded JDK" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/BaseLibrary" />
+            <option value="$PROJECT_DIR$/Provider" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 35 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="BintrayJCenter" />
+      <option name="name" value="BintrayJCenter" />
+      <option name="url" value="https://jcenter.bintray.com/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven" />
+      <option name="name" value="maven" />
+      <option name="url" value="https://jitpack.io" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="MavenRepo" />
+      <option name="name" value="MavenRepo" />
+      <option name="url" value="https://repo.maven.apache.org/maven2/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="Google" />
+      <option name="name" value="Google" />
+      <option name="url" value="https://dl.google.com/dl/android/maven2/" />
+    </remote-repository>
+  </component>
+</project>

+ 35 - 0
.idea/misc.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DesignSurface">
+    <option name="filePathToZoomLevelMap">
+      <map>
+        <entry key="../../../../layout/custom_preview.xml" value="0.16041666666666668" />
+        <entry key="../../Library/Android/sdk/platforms/android-31/data/res/layout/auto_complete_list.xml" value="0.13385416666666666" />
+        <entry key="../../Library/Android/sdk/platforms/android-31/data/res/layout/progress_dialog.xml" value="0.2916666666666667" />
+        <entry key="BaseLibrary/src/main/res/drawable/border_all.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/border_bottom_gray.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/bottom_nav_cart_selector.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/bottom_nav_text_selector.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/collect_selector.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/common_check_selector.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/progress_dialog_anim.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/drawable/state_loading.xml" value="0.1" />
+        <entry key="BaseLibrary/src/main/res/layout/layout_header_bar.xml" value="0.2916666666666667" />
+        <entry key="BaseLibrary/src/main/res/layout/layout_label_textview.xml" value="0.2916666666666667" />
+        <entry key="BaseLibrary/src/main/res/layout/layout_state_empty.xml" value="0.2916666666666667" />
+        <entry key="BaseLibrary/src/main/res/layout/layout_state_error.xml" value="0.2916666666666667" />
+        <entry key="BaseLibrary/src/main/res/layout/layout_state_loading.xml" value="0.2916666666666667" />
+        <entry key="BaseLibrary/src/main/res/layout/progress_dialog.xml" value="0.2916666666666667" />
+        <entry key="app/src/main/res/layout/activity_main.xml" value="0.1175925925925926" />
+        <entry key="app/src/main/res/layout/fragment_home.xml" value="0.10833333333333334" />
+        <entry key="app/src/main/res/layout/fragment_me.xml" value="0.2916666666666667" />
+      </map>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 1 - 0
BaseLibrary/.gitignore

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

+ 128 - 0
BaseLibrary/build.gradle

@@ -0,0 +1,128 @@
+plugins {
+    id 'com.android.library'
+    id 'org.jetbrains.kotlin.android'
+//    id 'kotlin-parcelize'
+    id 'kotlin-android'
+//    id 'kotlin-android-extensions'
+}
+apply plugin: 'kotlin-kapt'
+apply plugin: 'kotlin-android-extensions'
+android {
+    compileSdk 31
+
+    defaultConfig {
+
+        minSdk 21
+        targetSdk 31
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+
+
+    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 {
+        jvmTarget = '1.8'
+    }
+}
+
+kapt {
+    arguments {
+        arg("AROUTER_MODULE_NAME", project.getName())
+    }
+}
+
+dependencies {
+
+    testImplementation 'junit:junit:4.13.2'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+    implementation 'androidx.core:core-ktx:1.7.0'
+//    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation 'androidx.appcompat:appcompat:1.3.0'
+    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
+
+    //kotlin
+    api 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1'
+    api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    api "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8"
+
+
+    //recyclerview
+    implementation("androidx.recyclerview:recyclerview:1.2.1")
+    // For control over item selection of both touch and mouse driven selection
+    implementation("androidx.recyclerview:recyclerview-selection:1.1.0")
+
+    implementation 'com.alibaba:arouter-api:1.5.2'
+    kapt 'com.alibaba:arouter-compiler:1.5.2'
+
+
+    //RxLifecycle
+    api 'com.trello.rxlifecycle4:rxlifecycle-android-lifecycle-kotlin:4.0.2'
+    api 'com.trello.rxlifecycle4:rxlifecycle-components:4.0.2'
+
+    //Glide
+//    implementation "com.github.bumptech.glide:glide:$glide_version"
+
+    implementation "com.github.bumptech.glide:glide:$glide_version"
+    kapt "com.github.bumptech.glide:compiler:$glide_version"
+    //Banner
+    api 'io.github.youth5201314:banner:2.2.2'
+
+    // BottomNavigation
+    api 'com.ashokvarma.android:bottom-navigation-bar:2.2.0'
+    //Anko
+//    implementation "org.jetbrains.anko:anko-appcompat-v7-commons:$anko_version"
+//    implementation "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
+//    implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
+
+    // Add Dagger dependencies
+    api "com.google.dagger:dagger:$dagger_version"
+    kapt "com.google.dagger:dagger-compiler:$dagger_version"
+
+//    implementation("io.reactivex.rxjava3:rxkotlin:3.x.y")
+//    // RxKotlin and RxAndroid
+////    implementation "io.reactivex:rxkotlin:$rx_kotlin_version"
+//    implementation 'com.github.ReactiveX:RxKotlin:3.x-SNAPSHOT'
+
+//    compile "io.reactivex:rxkotlin:$rx_kotlin_version"
+    implementation("io.reactivex.rxjava2:rxkotlin:2.0.0")
+//    compile "io.reactivex:rxandroid:${rx_android_version}"
+    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
+    // Because RxAndroid releases are few and far between, it is recommended you also
+    // explicitly depend on RxJava's latest version for bug fixes and new features.
+    // (see https://github.com/ReactiveX/RxJava/releases for latest 3.x.x version)
+    implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
+
+
+    //Retrofit
+    implementation("com.squareup.okhttp3:okhttp:${ok_http_version}")
+    implementation "com.squareup.okhttp3:logging-interceptor:${ok_http_version}"
+
+    implementation "com.squareup.retrofit2:retrofit:${retrofit_version}"
+    implementation "com.squareup.retrofit2:converter-gson:${retrofit_version}"
+    implementation "com.squareup.retrofit2:adapter-rxjava:${retrofit_version}"
+
+    //MulitStateView
+    api "com.github.Kennyc1012:MultiStateView:$multi_state_view_version"
+
+    //ARouter
+//    implementation "com.alibaba:arouter-api:$arouter_api_version"
+
+
+    api "com.alibaba:arouter-api:$arouter_api_version"
+    kapt "com.alibaba:arouter-compiler:$arouter_api_version"
+
+
+}

+ 21 - 0
BaseLibrary/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
BaseLibrary/src/androidTest/java/com/cooleshow/base/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package com.cooleshow.base
+
+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.cooleshow.baselibrary", appContext.packageName)
+    }
+}

+ 13 - 0
BaseLibrary/src/main/AndroidManifest.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.cooleshow.base">
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/Theme.CooleShow" />
+
+</manifest>

+ 60 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/AppManager.kt

@@ -0,0 +1,60 @@
+package com.cooleshow.base.common
+
+import android.app.Activity
+import android.app.ActivityManager
+import android.content.Context
+import java.util.*
+
+/*
+    Activity管理器
+ */
+class AppManager private constructor(){
+
+    private val activityStack:Stack<Activity> = Stack()
+
+    companion object {
+        val instance:AppManager by lazy { AppManager() }
+    }
+
+    /*
+        Activity入栈
+     */
+    fun addActivity(activity: Activity){
+        activityStack.add(activity)
+    }
+
+    /*
+        Activity出栈
+     */
+    fun finishActivity(activity: Activity){
+        activity.finish()
+        activityStack.remove(activity)
+    }
+
+    /*
+        获取当前栈顶
+     */
+    fun currentActivity():Activity{
+        return activityStack.lastElement()
+    }
+
+    /*
+        清理栈
+     */
+    fun finishAllActivity(){
+        for (activity in activityStack){
+            activity.finish()
+        }
+        activityStack.clear()
+    }
+
+    /*
+        退出应用程序
+     */
+    fun exitApp(context:Context){
+        finishAllActivity()
+        val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+        activityManager.killBackgroundProcesses(context.packageName)
+        System.exit(0)
+    }
+}

+ 42 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/BaseApplication.kt

@@ -0,0 +1,42 @@
+package com.cooleshow.base.common
+
+import android.app.Application
+import android.content.Context
+import com.alibaba.android.arouter.launcher.ARouter
+import com.cooleshow.base.injection.component.AppComponent
+import com.cooleshow.base.injection.module.AppModule
+
+/*
+    Application 基类
+ */
+open class BaseApplication : Application() {
+
+    lateinit var appComponent: AppComponent
+
+    override fun onCreate() {
+        super.onCreate()
+
+        initAppInjection()
+        context = this
+
+        //ARouter初始化
+        ARouter.openLog()    // 打印日志
+        ARouter.openDebug()
+        ARouter.init(this)
+    }
+
+
+    /*
+        Application Component初始化
+     */
+    private fun initAppInjection() {
+//        appComponent = DaggerAppComponent.builder().appModule(AppModule(this)).build()
+    }
+
+    /*
+        全局伴生对象
+     */
+    companion object {
+        lateinit var context: Context
+    }
+}

+ 17 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.kt

@@ -0,0 +1,17 @@
+package com.cooleshow.base.common
+
+/*
+    基础常量
+ */
+class BaseConstant{
+    companion object {
+        //七牛服务地址
+        const val IMAGE_SERVER_ADDRESS = "http://osea2fxp7.bkt.clouddn.com/"
+        //本地服务器地址
+        const val SERVER_ADDRESS = "http://10.28.14.168:8080"
+        //SP表名
+        const val TABLE_PREFS = "Kotlin_mall"
+        //Token Key
+        const val KEY_SP_TOKEN = "token"
+    }
+}

+ 10 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/ResultCode.kt

@@ -0,0 +1,10 @@
+package com.cooleshow.base.common
+
+/*
+    网络响应码
+ */
+class ResultCode {
+    companion object {
+        const val SUCCESS = 0
+    }
+}

+ 79 - 0
BaseLibrary/src/main/java/com/cooleshow/base/data/net/RetrofitFactory.kt

@@ -0,0 +1,79 @@
+package com.cooleshow.base.data.net
+
+import com.alibaba.android.arouter.facade.annotation.Interceptor
+import com.cooleshow.base.common.BaseConstant
+import com.cooleshow.base.utils.AppPrefsUtils
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory
+import retrofit2.converter.gson.GsonConverterFactory
+
+import java.util.concurrent.TimeUnit
+
+/*
+    Retrofit工厂,单例
+ */
+class RetrofitFactory private constructor(){
+
+    /*
+        单例实现
+     */
+    companion object {
+        val instance:RetrofitFactory by lazy { RetrofitFactory() }
+    }
+
+//    private val interceptor: Interceptor
+    private val retrofit: Retrofit
+
+    //初始化
+    init {
+//        //通用拦截
+//        interceptor = Interceptor {
+//            chain -> val request = chain.request()
+//                .newBuilder()
+//                .addHeader("Content_Type","application/json")
+//                .addHeader("charset","UTF-8")
+//                .addHeader("token", AppPrefsUtils.getString(BaseConstant.KEY_SP_TOKEN))
+//                .build()
+//
+//            chain.proceed(request)
+//        }
+
+        //Retrofit实例化
+        retrofit = Retrofit.Builder()
+                .baseUrl(BaseConstant.SERVER_ADDRESS)
+                .addConverterFactory(GsonConverterFactory.create())
+                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
+                .client(initClient())
+                .build()
+    }
+
+    /*
+        OKHttp创建
+     */
+    private fun initClient(): OkHttpClient {
+        return OkHttpClient.Builder()
+                .addInterceptor(initLogInterceptor())
+//                .addInterceptor(interceptor)
+                .connectTimeout(10,TimeUnit.SECONDS)
+                .readTimeout(10,TimeUnit.SECONDS)
+                .build()
+    }
+
+    /*
+        日志拦截器
+     */
+    private fun initLogInterceptor(): HttpLoggingInterceptor {
+        val interceptor = HttpLoggingInterceptor()
+        interceptor.level = HttpLoggingInterceptor.Level.BODY
+        return interceptor
+    }
+
+    /*
+        具体服务实例化
+     */
+    fun <T> create(service:Class<T>):T{
+        return retrofit.create(service)
+    }
+}

+ 9 - 0
BaseLibrary/src/main/java/com/cooleshow/base/data/protocol/BaseResp.kt

@@ -0,0 +1,9 @@
+package com.cooleshow.base.data.protocol
+
+/*
+    能用响应对象
+    @status:响应状态码
+    @message:响应文字消息
+    @data:具体响应业务对象
+ */
+data class BaseResp<out T>(val status:Int, val message:String, val data:T)

+ 131 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ext/CommonExt.kt

@@ -0,0 +1,131 @@
+package com.cooleshow.base.ext
+
+import android.content.Context
+import android.graphics.drawable.AnimationDrawable
+import android.view.View
+import android.widget.Button
+import android.widget.EditText
+import android.widget.ImageView
+import android.widget.Toast
+import androidx.fragment.app.Fragment
+
+import com.cooleshow.base.R
+import com.cooleshow.base.data.protocol.BaseResp
+import com.cooleshow.base.rx.BaseFunc
+import com.cooleshow.base.rx.BaseFuncBoolean
+import com.cooleshow.base.rx.BaseSubscriber
+import com.cooleshow.base.utils.GlideUtils
+import com.cooleshow.base.widgets.DefaultTextWatcher
+import com.trello.rxlifecycle4.LifecycleProvider
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
+
+
+import rx.Observable
+
+import rx.schedulers.Schedulers
+
+//Kotlin通用扩展
+
+
+/*
+    扩展Observable执行
+ */
+//fun <T> Observable<T>.excute(subscriber: BaseSubscriber<T>, lifecycleProvider: LifecycleProvider<*>) {
+//    this.subscribeOn(Schedulers.io())
+//            .observeOn(AndroidSchedulers.mainThread())
+//            .compose(lifecycleProvider.bindToLifecycle())
+//            .subscribe(subscriber)
+//}
+
+/*
+    扩展数据转换
+ */
+fun <T> Observable<BaseResp<T>>.convert():Observable<T>{
+    return this.flatMap(BaseFunc())
+}
+
+/*
+    扩展Boolean类型数据转换
+ */
+fun <T> Observable<BaseResp<T>>.convertBoolean():Observable<Boolean>{
+    return this.flatMap(BaseFuncBoolean())
+}
+
+/*
+    扩展点击事件
+ */
+fun View.onClick(listener:View.OnClickListener):View{
+    setOnClickListener(listener)
+    return this
+}
+
+/*
+    扩展点击事件,参数为方法
+ */
+fun View.onClick(method:() -> Unit):View{
+    setOnClickListener { method() }
+    return this
+}
+
+/*
+    扩展Button可用性
+ */
+fun Button.enable(et:EditText,method: () -> Boolean){
+    val btn = this
+    et.addTextChangedListener(object : DefaultTextWatcher(){
+        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+            btn.isEnabled = method()
+        }
+    })
+}
+
+/*
+    ImageView加载网络图片
+ */
+fun ImageView.loadUrl(url: String) {
+    GlideUtils.loadUrlImage(context, url, this)
+}
+
+/*
+    多状态视图开始加载
+ */
+//fun MultiStateView.startLoading(){
+//    viewState = MultiStateView.VIEW_STATE_LOADING
+//    val loadingView = getView(MultiStateView.VIEW_STATE_LOADING)
+//    val animBackground = loadingView!!.find<View>(R.id.loading_anim_view).background
+//    (animBackground as AnimationDrawable).start()
+//}
+
+/*
+    扩展视图可见性
+ */
+fun View.setVisible(visible:Boolean){
+    this.visibility = if (visible) View.VISIBLE else View.GONE
+}
+
+
+fun Context.showToast(content: String): Toast {
+    val toast = Toast.makeText(this.applicationContext, content, Toast.LENGTH_SHORT)
+    toast.show()
+    return toast
+}
+
+fun Context.showLongToast(content: String): Toast {
+    val toast = Toast.makeText(this.applicationContext, content, Toast.LENGTH_LONG)
+    toast.show()
+    return toast
+}
+
+
+
+fun Fragment.showToast(content: String): Toast {
+    val toast = Toast.makeText(this.activity?.applicationContext, content, Toast.LENGTH_SHORT)
+    toast.show()
+    return toast
+}
+
+fun Fragment.showLongToast(content: String): Toast {
+    val toast = Toast.makeText(this.activity?.applicationContext, content, Toast.LENGTH_LONG)
+    toast.show()
+    return toast
+}

+ 12 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/ActivityScope.kt

@@ -0,0 +1,12 @@
+package com.cooleshow.base.injection
+
+import java.lang.annotation.Retention
+import java.lang.annotation.RetentionPolicy
+import javax.inject.Scope
+
+/*
+    Activity级别 作用域
+ */
+@Scope
+@Retention(RetentionPolicy.RUNTIME)
+annotation class ActivityScope

+ 12 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/PerComponentScope.kt

@@ -0,0 +1,12 @@
+package com.cooleshow.base.injection
+
+import java.lang.annotation.Retention
+import java.lang.annotation.RetentionPolicy
+import javax.inject.Scope
+
+/*
+    组件级别 作用域
+ */
+@Scope
+@Retention(RetentionPolicy.RUNTIME)
+annotation class PerComponentScope

+ 20 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/component/ActivityComponent.kt

@@ -0,0 +1,20 @@
+package com.cooleshow.base.injection.component
+
+import android.app.Activity
+import android.content.Context
+import com.cooleshow.base.injection.ActivityScope
+import com.cooleshow.base.injection.module.ActivityModule
+import com.cooleshow.base.injection.module.LifecycleProviderModule
+import com.trello.rxlifecycle4.LifecycleProvider
+import dagger.Component
+
+/*
+    Activity级别Component
+ */
+@ActivityScope
+@Component(dependencies = arrayOf(AppComponent::class),modules = arrayOf(ActivityModule::class,LifecycleProviderModule::class))
+interface ActivityComponent {
+    fun activity():Activity
+    fun context(): Context
+    fun lifecycleProvider(): LifecycleProvider<*>
+}

+ 16 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/component/AppComponent.kt

@@ -0,0 +1,16 @@
+package com.cooleshow.base.injection.component
+
+import android.content.Context
+import com.cooleshow.base.injection.module.AppModule
+import dagger.Component
+import javax.inject.Singleton
+
+/*
+    Application级别Component
+ */
+@Singleton
+@Component(modules = arrayOf(AppModule::class))
+interface AppComponent {
+
+    fun context():Context
+}

+ 22 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/module/ActivityModule.kt

@@ -0,0 +1,22 @@
+package com.cooleshow.base.injection.module
+
+import android.app.Activity
+import android.content.Context
+import com.cooleshow.base.common.BaseApplication
+import com.cooleshow.base.injection.ActivityScope
+import dagger.Module
+import dagger.Provides
+import javax.inject.Singleton
+
+/*
+    Activity级别Module
+ */
+@Module
+class ActivityModule(private val activity: Activity) {
+
+    @ActivityScope
+    @Provides
+    fun provideActivity(): Activity {
+        return this.activity
+    }
+}

+ 20 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/module/AppModule.kt

@@ -0,0 +1,20 @@
+package com.cooleshow.base.injection.module
+
+import android.content.Context
+import com.cooleshow.base.common.BaseApplication
+import dagger.Module
+import dagger.Provides
+import javax.inject.Singleton
+
+/*
+    Application级别Module
+ */
+@Module
+class AppModule(private val context:BaseApplication) {
+
+    @Singleton
+    @Provides
+    fun provideContext():Context{
+        return this.context
+    }
+}

+ 17 - 0
BaseLibrary/src/main/java/com/cooleshow/base/injection/module/LifecycleProviderModule.kt

@@ -0,0 +1,17 @@
+package com.cooleshow.base.injection.module
+
+import com.trello.rxlifecycle4.LifecycleProvider
+import dagger.Module
+import dagger.Provides
+
+/*
+    Rx生命周期管理能用Module
+ */
+@Module
+class LifecycleProviderModule(private val lifecycleProvider: LifecycleProvider<*>) {
+
+    @Provides
+    fun provideLifecycleProvider(): LifecycleProvider<*> {
+        return this.lifecycleProvider
+    }
+}

+ 34 - 0
BaseLibrary/src/main/java/com/cooleshow/base/presenter/BasePresenter.kt

@@ -0,0 +1,34 @@
+package com.cooleshow.base.presenter
+
+import android.content.Context
+import com.cooleshow.base.presenter.view.BaseView
+import com.cooleshow.base.utils.NetWorkUtils
+import com.trello.rxlifecycle4.LifecycleProvider
+import javax.inject.Inject
+
+/*
+    MVP中P层 基类
+ */
+open class BasePresenter<T:BaseView>{
+
+    lateinit var mView:T
+
+    //Dagger注入,Rx生命周期管理
+    @Inject
+    lateinit var lifecycleProvider: LifecycleProvider<*>
+
+
+    @Inject
+    lateinit var context:Context
+
+    /*
+        检查网络是否可用
+     */
+    fun checkNetWork():Boolean{
+        if(NetWorkUtils.isNetWorkAvailable(context)){
+            return true
+        }
+        mView.onError("网络不可用")
+        return false
+    }
+}

+ 10 - 0
BaseLibrary/src/main/java/com/cooleshow/base/presenter/view/BaseView.kt

@@ -0,0 +1,10 @@
+package com.cooleshow.base.presenter.view
+
+/*
+    MVP中视图回调 基类
+ */
+interface BaseView {
+    fun showLoading()
+    fun hideLoading()
+    fun onError(text:String)
+}

+ 6 - 0
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseException.kt

@@ -0,0 +1,6 @@
+package com.cooleshow.base.rx
+
+/*
+    定义通用异常
+ */
+class BaseException(val status:Int,val msg:String) :Throwable()

+ 20 - 0
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFunc.kt

@@ -0,0 +1,20 @@
+package com.cooleshow.base.rx
+
+import com.cooleshow.base.rx.BaseException
+import com.cooleshow.base.common.ResultCode
+import com.cooleshow.base.data.protocol.BaseResp
+import rx.Observable
+import rx.functions.Func1
+
+/*
+    通用数据类型转换封装
+ */
+class BaseFunc<T>:Func1<BaseResp<T>,Observable<T>>{
+    override fun call(t: BaseResp<T>): Observable<T> {
+        if (t.status != ResultCode.SUCCESS){
+            return Observable.error(BaseException(t.status,t.message))
+        }
+
+        return Observable.just(t.data)
+    }
+}

+ 20 - 0
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseFuncBoolean.kt

@@ -0,0 +1,20 @@
+package com.cooleshow.base.rx
+
+import com.cooleshow.base.rx.BaseException
+import com.cooleshow.base.common.ResultCode
+import com.cooleshow.base.data.protocol.BaseResp
+import rx.Observable
+import rx.functions.Func1
+
+/*
+    Boolean类型转换封装
+ */
+class BaseFuncBoolean<T>: Func1<BaseResp<T>, Observable<Boolean>> {
+    override fun call(t: BaseResp<T>): Observable<Boolean> {
+        if (t.status != ResultCode.SUCCESS){
+            return Observable.error(BaseException(t.status, t.message))
+        }
+
+        return Observable.just(true)
+    }
+}

+ 25 - 0
BaseLibrary/src/main/java/com/cooleshow/base/rx/BaseSubscriber.kt

@@ -0,0 +1,25 @@
+package com.cooleshow.base.rx
+
+import com.cooleshow.base.rx.BaseException
+import com.cooleshow.base.presenter.view.BaseView
+import rx.Subscriber
+
+/*
+    Rx订阅者默认实现
+ */
+open class BaseSubscriber<T>(val baseView:BaseView):Subscriber<T>() {
+
+    override fun onCompleted() {
+        baseView.hideLoading()
+    }
+
+    override fun onNext(t: T) {
+    }
+
+    override fun onError(e: Throwable?) {
+        baseView.hideLoading()
+        if (e is BaseException){
+            baseView.onError(e.msg)
+        }
+    }
+}

+ 34 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/BaseActivity.kt

@@ -0,0 +1,34 @@
+package com.cooleshow.base.ui.activity
+
+import android.os.Bundle
+import android.view.View
+import android.widget.FrameLayout
+import com.cooleshow.base.common.AppManager
+import com.trello.rxlifecycle4.components.support.RxAppCompatActivity
+
+/*
+    Activity基类,业务无关
+ */
+open class BaseActivity: RxAppCompatActivity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        AppManager.instance.addActivity(this)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+
+        AppManager.instance.finishActivity(this)
+    }
+
+
+
+    //获取Window中视图content
+    val contentView:View
+        get() {
+            val content = findViewById<FrameLayout>(android.R.id.content)
+            return content.getChildAt(0)
+        }
+}

+ 77 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/BaseMvpActivity.kt

@@ -0,0 +1,77 @@
+package com.cooleshow.base.ui.activity
+
+import android.os.Bundle
+import com.alibaba.android.arouter.launcher.ARouter
+import com.cooleshow.base.ui.activity.BaseActivity
+import com.cooleshow.base.common.BaseApplication
+import com.cooleshow.base.ext.showToast
+import com.cooleshow.base.injection.component.ActivityComponent
+import com.cooleshow.base.injection.component.DaggerActivityComponent
+import com.cooleshow.base.injection.module.ActivityModule
+import com.cooleshow.base.injection.module.LifecycleProviderModule
+import com.cooleshow.base.presenter.BasePresenter
+import com.cooleshow.base.presenter.view.BaseView
+import com.cooleshow.base.widgets.ProgressLoading
+import javax.inject.Inject
+
+/*
+    Activity基类,业务相关
+ */
+abstract open class BaseMvpActivity<T : BasePresenter<*>> : BaseActivity(), BaseView {
+
+    //Presenter泛型,Dagger注入
+    @Inject
+    lateinit var mPresenter: T
+
+    lateinit var mActivityComponent:ActivityComponent
+
+    private lateinit var mLoadingDialog: ProgressLoading
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        initActivityInjection()
+        injectComponent()
+
+        //初始加载框
+        mLoadingDialog = ProgressLoading.create(this)
+        //ARouter注册
+        ARouter.getInstance().inject(this)
+    }
+
+    /*
+        Dagger注册
+     */
+    protected abstract fun injectComponent()
+
+    /*
+        初始Activity Component
+     */
+    private fun initActivityInjection() {
+        mActivityComponent = DaggerActivityComponent.builder().appComponent((application as BaseApplication).appComponent)
+                .activityModule(ActivityModule(this))
+                .lifecycleProviderModule(LifecycleProviderModule(this))
+                .build()
+
+    }
+
+    /*
+        显示加载框,默认实现
+     */
+    override fun showLoading() {
+        mLoadingDialog.showLoading()
+    }
+
+    /*
+        隐藏加载框,默认实现
+     */
+    override fun hideLoading() {
+        mLoadingDialog.hideLoading()
+    }
+
+    /*
+        错误信息提示,默认实现
+     */
+    override fun onError(text:String) {
+        showToast(text)
+    }
+}

+ 159 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/BaseTakePhotoActivity.kt

@@ -0,0 +1,159 @@
+//package com.cooleshow.base.ui.activity
+//
+//import android.content.Intent
+//import android.net.Uri
+//import android.os.Bundle
+//import android.os.Environment
+//import android.util.Log
+//import android.widget.Toast
+//import com.alibaba.android.arouter.launcher.ARouter
+//import com.bigkoo.alertview.AlertView
+//import com.bigkoo.alertview.OnItemClickListener
+//import com.cooleshow.base.common.AppManager
+//import com.cooleshow.base.ui.activity.BaseActivity
+//import com.jph.takephoto.app.TakePhoto
+//import com.jph.takephoto.app.TakePhotoImpl
+//import com.jph.takephoto.compress.CompressConfig
+//import com.jph.takephoto.model.TResult
+//import com.cooleshow.base.common.BaseApplication
+//import com.cooleshow.base.injection.component.ActivityComponent
+//import com.cooleshow.base.injection.component.DaggerActivityComponent
+//import com.cooleshow.base.injection.module.ActivityModule
+//import com.cooleshow.base.injection.module.LifecycleProviderModule
+//import com.cooleshow.base.presenter.BasePresenter
+//import com.cooleshow.base.presenter.view.BaseView
+//import com.cooleshow.base.utils.DateUtils
+//import com.cooleshow.base.widgets.ProgressLoading
+//import java.io.File
+//import javax.inject.Inject
+//
+///*
+//    存在选择图片的Activity基础封装
+// */
+//abstract open class BaseTakePhotoActivity<T : BasePresenter<*>> : BaseActivity(), BaseView, TakePhoto.TakeResultListener {
+//
+//    private lateinit var mTakePhoto:TakePhoto
+//
+//    private lateinit var mTempFile: File
+//
+//    @Inject
+//    lateinit var mPresenter: T
+//
+//    lateinit var mActivityComponent: ActivityComponent
+//
+//    private lateinit var mLoadingDialog: ProgressLoading
+//
+//    override fun onCreate(savedInstanceState: Bundle?) {
+//        super.onCreate(savedInstanceState)
+//        initActivityInjection()
+//        injectComponent()
+//
+//        mTakePhoto = TakePhotoImpl(this,this)
+//        mTakePhoto.onCreate(savedInstanceState)
+//
+//        mLoadingDialog = ProgressLoading.create(this)
+//        ARouter.getInstance().inject(this)
+//    }
+//
+//    /*
+//        Dagger注册
+//     */
+//    protected abstract fun injectComponent()
+//
+//    /*
+//        初始化Activity Component
+//     */
+//    private fun initActivityInjection() {
+//        mActivityComponent = DaggerActivityComponent.builder().appComponent((application as BaseApplication).appComponent)
+//                .activityModule(ActivityModule(this))
+//                .lifecycleProviderModule(LifecycleProviderModule(this))
+//                .build()
+//
+//    }
+//
+//    /*
+//        显示加载框,默认实现
+//     */
+//    override fun showLoading() {
+//        mLoadingDialog.showLoading()
+//    }
+//
+//    /*
+//        隐藏加载框,默认实现
+//     */
+//    override fun hideLoading() {
+//        mLoadingDialog.hideLoading()
+//    }
+//
+//    /*
+//        错误信息提示,默认实现
+//     */
+//    override fun onError(text:String) {
+//        toast(text)
+////        Toast.makeText(AppManager.instance, text, Toast.LENGTH_SHORT).show()
+//
+//    }
+//
+//    /*
+//        弹出选择框,默认实现
+//        可根据实际情况,自行修改
+//     */
+//    protected fun showAlertView() {
+//        AlertView("选择图片", "", "取消", null, arrayOf("拍照", "相册"), this,
+//                AlertView.Style.ActionSheet, OnItemClickListener { o, position ->
+//            mTakePhoto.onEnableCompress(CompressConfig.ofDefaultConfig(),false)
+//            when (position) {
+//                0 -> {
+//                    createTempFile()
+//                    mTakePhoto.onPickFromCapture(Uri.fromFile(mTempFile))
+//                }
+//                1 -> mTakePhoto.onPickFromGallery()
+//            }
+//        }
+//
+//        ).show()
+//
+//    }
+//
+//    /*
+//        获取图片,成功回调
+//     */
+//    override fun takeSuccess(result: TResult?) {
+//        Log.d("TakePhoto",result?.image?.originalPath)
+//        Log.d("TakePhoto",result?.image?.compressPath)
+//    }
+//
+//    /*
+//        获取图片,取消回调
+//     */
+//    override fun takeCancel() {
+//    }
+//
+//    /*
+//        获取图片,失败回调
+//     */
+//    override fun takeFail(result: TResult?, msg: String?) {
+//        Log.e("takePhoto",msg)
+//    }
+//
+//    /*
+//        TakePhoto默认实现
+//     */
+//    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+//        super.onActivityResult(requestCode, resultCode, data)
+//        mTakePhoto.onActivityResult(requestCode,resultCode,data)
+//    }
+//
+//    /*
+//        新建临时文件
+//     */
+//    fun createTempFile(){
+//        val tempFileName = "${DateUtils.curTime}.png"
+//        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
+//            this.mTempFile = File(Environment.getExternalStorageDirectory(),tempFileName)
+//            return
+//        }
+//
+//        this.mTempFile = File(filesDir,tempFileName)
+//    }
+//}

+ 48 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/adapter/BaseRecyclerViewAdapter.kt

@@ -0,0 +1,48 @@
+package com.cooleshow.base.ui.adapter
+
+import android.content.Context
+import androidx.recyclerview.widget.RecyclerView
+
+
+/*
+    RecyclerViewAdapter基类
+ */
+abstract class BaseRecyclerViewAdapter<T, VH : RecyclerView.ViewHolder>(var mContext: Context) : RecyclerView.Adapter<VH>() {
+
+    //ItemClick事件
+    var mItemClickListener: OnItemClickListener<T>? = null
+
+    //数据集合
+    var dataList: MutableList<T> = mutableListOf()
+
+    /*
+        设置数据
+        Presenter处理过为null的情况,所以为不会为Null
+     */
+    fun setData(sources: MutableList<T>) {
+        dataList = sources
+        notifyDataSetChanged()
+    }
+
+    override fun onBindViewHolder(holder: VH, position: Int) {
+        holder.itemView.setOnClickListener {
+            if (mItemClickListener != null)
+                mItemClickListener!!.onItemClick(dataList[position], position)
+        }
+    }
+
+    override fun getItemCount(): Int {
+        return dataList.size
+    }
+
+    /*
+        ItemClick事件声明
+     */
+    interface OnItemClickListener<in T> {
+        fun onItemClick(item: T, position: Int)
+    }
+
+    fun setOnItemClickListener(listener: OnItemClickListener<T>) {
+        this.mItemClickListener = listener
+    }
+}

+ 9 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/fragment/BaseFragment.kt

@@ -0,0 +1,9 @@
+package com.cooleshow.base.ui.fragment
+
+
+import com.trello.rxlifecycle4.components.support.RxFragment
+
+/*
+    Fragment基类,业务无关
+ */
+open class BaseFragment : RxFragment()

+ 76 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/fragment/BaseMvpFragment.kt

@@ -0,0 +1,76 @@
+package com.cooleshow.base.ui.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import com.cooleshow.base.common.BaseApplication
+import com.cooleshow.base.injection.component.ActivityComponent
+import com.cooleshow.base.injection.module.ActivityModule
+import com.cooleshow.base.injection.module.LifecycleProviderModule
+import com.cooleshow.base.presenter.BasePresenter
+import com.cooleshow.base.presenter.view.BaseView
+import com.cooleshow.base.widgets.ProgressLoading
+
+
+import javax.inject.Inject
+
+/*
+    Fragment基类,业务相关
+ */
+abstract open class BaseMvpFragment<T : BasePresenter<*>> : BaseFragment(), BaseView {
+
+    @Inject
+    lateinit var mPresenter: T
+
+    lateinit var mActivityComponent: ActivityComponent
+
+    private lateinit var mLoadingDialog: ProgressLoading
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        initActivityInjection()
+        injectComponent()
+
+        //初始加载框
+        mLoadingDialog = ProgressLoading.create(requireContext())
+        return super.onCreateView(inflater, container, savedInstanceState)
+    }
+
+    /*
+        Dagger注册
+     */
+    protected abstract fun injectComponent()
+
+    /*
+        初始化Activity级别Component
+     */
+    private fun initActivityInjection() {
+//        mActivityComponent = DaggerActivityComponent.builder().appComponent((activity?.application as BaseApplication).appComponent)
+//                .activityModule(ActivityModule(activity!!))
+//                .lifecycleProviderModule(LifecycleProviderModule(this))
+//                .build()
+
+    }
+
+    /*
+       显示加载框,默认实现
+    */
+    override fun showLoading() {
+        mLoadingDialog.showLoading()
+    }
+
+    /*
+        隐藏加载框,默认实现
+     */
+    override fun hideLoading() {
+        mLoadingDialog.hideLoading()
+    }
+
+    /*
+        错误信息提示,默认实现
+     */
+    override fun onError(text:String) {
+        Toast.makeText(BaseApplication.context, "text", Toast.LENGTH_SHORT).show()
+    }
+}

+ 105 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/AppPrefsUtils.kt

@@ -0,0 +1,105 @@
+package com.cooleshow.base.utils
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.content.SharedPreferences.Editor
+import com.cooleshow.base.common.BaseApplication
+import com.cooleshow.base.common.BaseConstant
+
+/*
+    SP工具类
+ */
+object AppPrefsUtils {
+    private var sp: SharedPreferences = BaseApplication.context.getSharedPreferences(BaseConstant.TABLE_PREFS, Context.MODE_PRIVATE)
+    private var ed: Editor
+
+    init {
+        ed = sp.edit()
+    }
+
+    /*
+        Boolean数据
+     */
+    fun putBoolean(key: String, value: Boolean) {
+        ed.putBoolean(key, value)
+        ed.commit()
+    }
+
+    /*
+        默认 false
+     */
+    fun getBoolean(key: String): Boolean {
+        return sp.getBoolean(key, false)
+    }
+
+    /*
+        String数据
+     */
+    fun putString(key: String, value: String) {
+        ed.putString(key, value)
+        ed.commit()
+    }
+
+    /*
+        默认 ""
+     */
+    fun getString(key: String): String? {
+        return sp?.getString(key, "")
+    }
+
+    /*
+        Int数据
+     */
+    fun putInt(key: String, value: Int) {
+        ed.putInt(key, value)
+        ed.commit()
+    }
+
+    /*
+        默认 0
+     */
+    fun getInt(key: String): Int {
+        return sp.getInt(key, 0)
+    }
+
+    /*
+        Long数据
+     */
+    fun putLong(key: String, value: Long) {
+        ed.putLong(key, value)
+        ed.commit()
+    }
+
+    /*
+        默认 0
+     */
+    fun getLong(key: String): Long {
+        return sp.getLong(key, 0)
+    }
+
+    /*
+        Set数据
+     */
+    fun putStringSet(key: String, set: Set<String>) {
+        val localSet = getStringSet(key)?.toMutableSet()
+        localSet?.addAll(set)
+        ed.putStringSet(key, localSet)
+        ed.commit()
+    }
+
+    /*
+        默认空set
+     */
+    fun getStringSet(key: String): MutableSet<String>? {
+        val set = setOf<String>()
+        return sp.getStringSet(key, set)
+    }
+
+    /*
+        删除key数据
+     */
+    fun remove(key: String) {
+        ed.remove(key)
+        ed.commit()
+    }
+}

+ 266 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/DateUtils.kt

@@ -0,0 +1,266 @@
+package com.cooleshow.base.utils
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Date
+import java.util.TimeZone
+
+/**
+ * 日期工具类 默认使用 "yyyy-MM-dd HH:mm:ss" 格式化日期
+
+ */
+object DateUtils {
+    /**
+     * 英文简写(默认)如:12-01
+     */
+    var FORMAT_MONTH_DAY = "MM-dd"
+    /**
+     * 英文简写(默认)如:2010-12-01
+     */
+    var FORMAT_SHORT = "yyyy-MM-dd"
+    /**
+     * 英文全称 如:2010-12-01 23:15:06
+     */
+    /**
+     * 获得默认的 date pattern
+     */
+    var datePattern = "yyyy-MM-dd HH:mm:ss"
+
+    var FORMAT_LONG_NEW = "yyyy-MM-dd HH:mm"
+    /**
+     * 精确到毫秒的完整时间 如:yyyy-MM-dd HH:mm:ss.S
+     */
+    var FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.S"
+    /**
+     * 中文简写 如:2010年12月01日
+     */
+    var FORMAT_SHORT_CN_MINI = "MM月dd日 HH:mm"
+    /**
+     * 中文简写 如:2010年12月01日
+     */
+    var FORMAT_SHORT_CN = "yyyy年MM月dd日"
+    /**
+     * 中文全称 如:2010年12月01日 23时15分06秒
+     */
+    var FORMAT_LONG_CN = "yyyy年MM月dd日  HH时mm分ss秒"
+    /**
+     * 精确到毫秒的完整中文时间
+     */
+    var FORMAT_FULL_CN = "yyyy年MM月dd日  HH时mm分ss秒SSS毫秒"
+    /**
+     * 精确到毫秒的完整中文时间
+     */
+    var FORMAT_SPEFULL_CN = "yyyy年MM月dd日  HH:mm"
+    /**
+     * 英文简写(默认)如:2010-12-01
+     */
+    var FORMAT_SHORT_SPE = "yyyyMMdd"
+    var FORMAT_SHORT_SPE_ = "HH:mm"
+
+    var TIMEZONE = "Asia/Shanghai"
+
+    /**
+     * 根据预设格式返回当前日期
+
+     * @return
+     */
+    val now: String
+        get() = format(Date())
+
+    /**
+     * 根据用户格式返回当前日期
+
+     * @param format
+     * *
+     * @return
+     */
+    fun getNow(format: String): String {
+        return format(Date(), format)
+    }
+
+
+    val defTimeZone: TimeZone
+        get() = TimeZone.getTimeZone(TIMEZONE)
+
+    /**
+     * 使用用户格式格式化日期
+
+     * @param date
+     * *            日期
+     * *
+     * @param pattern
+     * *            日期格式
+     * *
+     * @return
+     */
+    @JvmOverloads fun format(date: Date?, pattern: String = datePattern): String {
+        var returnValue = ""
+        if (date != null) {
+            val df = SimpleDateFormat(pattern)
+            df.timeZone = defTimeZone
+            returnValue = df.format(date)
+        }
+        return returnValue
+    }
+
+    /**
+     * 使用用户格式提取字符串日期
+
+     * @param strDate
+     * *            日期字符串
+     * *
+     * @param pattern
+     * *            日期格式
+     * *
+     * @return
+     */
+    @JvmOverloads fun parse(strDate: String, pattern: String = datePattern): Date? {
+        val df = SimpleDateFormat(pattern)
+        df.timeZone = defTimeZone
+        try {
+            return df.parse(strDate)
+        } catch (e: ParseException) {
+            e.printStackTrace()
+            return null
+        }
+
+    }
+
+    /**
+     * 时间戳转date str
+
+     */
+
+    fun convertTimeToString(time: Long, format: String): String {
+        val sdf = SimpleDateFormat(format)
+        sdf.timeZone = defTimeZone
+        return sdf.format(time)
+    }
+
+    /**
+     * 获取当前时间的前一天时间
+     * @param cl
+     * *
+     * @return
+     */
+    fun getBeforeDay(cl: Calendar): Calendar {
+        val day = cl.get(Calendar.DATE)
+        cl.set(Calendar.DATE, day - 1)
+        return cl
+    }
+
+    /**
+     * 获取当前时间的后一天时间
+     * @param cl
+     * *
+     * @return
+     */
+    fun getAfterDay(cl: Calendar): Calendar {
+        val day = cl.get(Calendar.DATE)
+        cl.set(Calendar.DATE, day + 1)
+        return cl
+    }
+
+    fun getWeek(c: Calendar): String {
+        var Week = ""
+
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+            Week += "周天"
+        }
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
+            Week += "周一"
+        }
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
+            Week += "周二"
+        }
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) {
+            Week += "周三"
+        }
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
+            Week += "周四"
+        }
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
+            Week += "周五"
+        }
+        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
+            Week += "周六"
+        }
+        return Week
+    }
+
+    // date类型转换为String类型
+    // formatType格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
+    // data Date类型的时间
+    fun dateToString(date: Date, formatType: String): String {
+        val sdf = SimpleDateFormat(formatType)
+        sdf.timeZone = defTimeZone
+        return sdf.format(date)
+    }
+
+    // long类型转换为String类型
+    // currentTime要转换的long类型的时间
+    // formatType要转换的string类型的时间格式
+    @Throws(ParseException::class)
+    fun longToString(currentTime: Long, formatType: String): String {
+        val date = longToDate(currentTime, formatType) // long类型转成Date类型
+        val strTime = dateToString(date, formatType) // date类型转成String
+        return strTime
+    }
+
+    // string类型转换为date类型
+    // strTime要转换的string类型的时间,formatType要转换的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日
+    // HH时mm分ss秒,
+    // strTime的时间格式必须要与formatType的时间格式相同
+    @Throws(ParseException::class)
+    fun stringToDate(strTime: String, formatType: String): Date {
+        val formatter = SimpleDateFormat(formatType)
+        formatter.timeZone = defTimeZone
+        var date: Date? = null
+        date = formatter.parse(strTime)
+        return date
+    }
+
+    // long转换为Date类型
+    // currentTime要转换的long类型的时间
+    // formatType要转换的时间格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
+    @Throws(ParseException::class)
+    fun longToDate(currentTime: Long, formatType: String): Date {
+        val dateOld = Date(currentTime) // 根据long类型的毫秒数生命一个date类型的时间
+        val sDateTime = dateToString(dateOld, formatType) // 把date类型的时间转换为string
+        val date = stringToDate(sDateTime, formatType) // 把String类型转换为Date类型
+        return date
+    }
+
+    // string类型转换为long类型
+    // strTime要转换的String类型的时间
+    // formatType时间格式
+    // strTime的时间格式和formatType的时间格式必须相同
+    fun stringToLong(strTime: String, formatType: String): Long {
+        var date: Date? = null // String类型转成date类型
+        try {
+            date = stringToDate(strTime, formatType)
+        } catch (e: ParseException) {
+            e.printStackTrace()
+        }
+
+        return if (date == null) {
+            0
+        } else {
+            dateToLong(date)
+        }
+    }
+
+    // date类型转换为long类型
+    // date要转换的date类型的时间
+    fun dateToLong(date: Date): Long {
+        return date.time
+    }
+
+    //当前时间毫秒数
+    val curTime: Long
+        get() {
+            val c = Calendar.getInstance(defTimeZone)
+            return c.timeInMillis
+        }
+}

+ 35 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/GlideUtils.kt

@@ -0,0 +1,35 @@
+package com.cooleshow.base.utils
+
+import android.content.Context
+import android.widget.ImageView
+import com.bumptech.glide.Glide
+//import com.bumptech.glide.load.resource.drawable.GlideDrawable
+//import com.bumptech.glide.request.animation.GlideAnimation
+import com.bumptech.glide.request.target.SimpleTarget
+import com.cooleshow.base.R
+
+/*
+    Glide工具类
+ */
+object GlideUtils {
+    fun loadImage(context: Context, url: String, imageView: ImageView) {
+        Glide.with(context).load(url).centerCrop().into(imageView)
+    }
+
+    fun loadImageFitCenter(context: Context, url: String, imageView: ImageView) {
+        Glide.with(context).load(url).fitCenter().into(imageView)
+    }
+
+    /*
+        当fragment或者activity失去焦点或者destroyed的时候,Glide会自动停止加载相关资源,确保资源不会被浪费
+     */
+    fun loadUrlImage(context: Context, url: String, imageView: ImageView){
+//        Glide.with(context).load(url).placeholder(R.drawable.icon_back).error(R.drawable.icon_back).centerCrop().into(
+//                object : SimpleTarget<GlideDrawable>() {
+//                    override fun onResourceReady(resource: GlideDrawable,
+//                                                 glideAnimation: GlideAnimation<in GlideDrawable>) {
+//                        imageView.setImageDrawable(resource)
+//                    }
+//                })
+    }
+}

+ 38 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/NetWorkUtils.kt

@@ -0,0 +1,38 @@
+package com.cooleshow.base.utils
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.NetworkInfo
+
+/*
+    网络工具
+ */
+object NetWorkUtils {
+
+    /*
+        判断网络是否可用
+     */
+    fun isNetWorkAvailable(context: Context): Boolean {
+        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+        val networkInfo = connectivityManager.activeNetworkInfo
+        return networkInfo != null && networkInfo.isConnected
+    }
+
+    /*
+        检测wifi是否连接
+     */
+    fun isWifiConnected(context: Context): Boolean {
+        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+        val networkInfo = cm.activeNetworkInfo
+        return networkInfo != null && networkInfo.type == ConnectivityManager.TYPE_WIFI
+    }
+
+    /*
+        检测3G是否连接
+     */
+    fun is3gConnected(context: Context): Boolean {
+        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+        val networkInfo = cm.activeNetworkInfo
+        return networkInfo != null && networkInfo.type == ConnectivityManager.TYPE_MOBILE
+    }
+}

+ 131 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/YuanFenConverter.kt

@@ -0,0 +1,131 @@
+package com.cooleshow.base.utils
+
+import java.math.BigDecimal
+
+/*
+    金额 元与分 转换
+ */
+object YuanFenConverter {
+    val CURRENCY_FEN_REGEX = "\\-?[0-9]+"
+
+    /*
+        分 转换为 元
+     */
+    fun changeF2Y(amount: Long?, defaultString: String): String {
+        var result = defaultString
+        try {
+            result = changeF2Y(amount)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        return result
+    }
+
+    /*
+        分 转换为 元
+     */
+    fun changeF2Y(amount: Int?, defaultString: String): String {
+        return changeF2Y(amount as Long, defaultString)
+    }
+
+    /*
+        分 转换为 元
+     */
+    @Throws(Exception::class)
+    fun changeF2Y(amount: Long?): String {
+        if (null == amount) {
+            return "0"
+        }
+
+        if (!amount.toString().matches(CURRENCY_FEN_REGEX.toRegex())) {
+            throw Exception("Invalid format")
+        }
+
+        var flag = 0
+        var amString = amount.toString()
+        if (amString[0] == '-') {
+            flag = 1
+            amString = amString.substring(1)
+        }
+        val result = StringBuffer()
+        if (amString.length == 1) {
+            result.append("0.0").append(amString)
+        } else if (amString.length == 2) {
+            result.append("0.").append(amString)
+        } else {
+            val intString = amString.substring(0, amString.length - 2)
+            for (i in 1..intString.length) {
+                if ((i - 1) % 3 == 0 && i != 1) {
+                    //                    result.append(",");
+                }
+                result.append(intString.substring(intString.length - i, intString.length - i + 1))
+            }
+            result.reverse().append(".").append(amString.substring(amString.length - 2))
+        }
+        if (flag == 1) {
+            return "-" + result.toString()
+        } else {
+            return result.toString()
+        }
+    }
+
+    /*
+        分 转换为 元
+     */
+    fun changeF2Y(amount: String, defaultString: String): String {
+        var result = defaultString
+        try {
+            result = changeF2Y(amount)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        return result
+    }
+
+    /*
+        分 转换为 元
+     */
+    @Throws(Exception::class)
+    fun changeF2Y(amount: String): String {
+        if (!amount.matches(CURRENCY_FEN_REGEX.toRegex())) {
+            throw Exception("Invalid format")
+        }
+        return BigDecimal.valueOf(java.lang.Long.valueOf(amount)!!).divide(BigDecimal(100)).toString()
+    }
+
+    /*
+        元 转换为 分
+     */
+    fun changeY2F(amount: Long?): String {
+        return BigDecimal.valueOf(amount!!).multiply(BigDecimal(100)).toString()
+    }
+
+    /*
+        元 转换为 分
+     */
+    fun changeY2F(amount: String): String {
+        val currency = amount.replace("\\$|\\¥|\\,".toRegex(), "")
+        val index = currency.indexOf(".")
+        val length = currency.length
+        var amLong: Long? = 0L
+        if (index == -1) {
+            amLong = java.lang.Long.valueOf(currency + "00")
+        } else if (length - index >= 3) {
+            amLong = java.lang.Long.valueOf(currency.substring(0, index + 3).replace(".", ""))
+        } else if (length - index == 2) {
+            amLong = java.lang.Long.valueOf(currency.substring(0, index + 2).replace(".", "") + 0)
+        } else {
+            amLong = java.lang.Long.valueOf(currency.substring(0, index + 1).replace(".", "") + "00")
+        }
+        return amLong!!.toString()
+    }
+
+    /*
+        分 转换为 元,带单位
+     */
+    fun changeF2YWithUnit(amount:Long):String{
+        return "¥${YuanFenConverter.changeF2Y(amount)}"
+    }
+}

+ 14 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/BannerImageLoader.kt

@@ -0,0 +1,14 @@
+package com.cooleshow.base.widgets
+
+import android.content.Context
+import android.widget.ImageView
+import com.cooleshow.base.utils.GlideUtils
+
+/*
+    Banner图片加载器
+ */
+//class BannerImageLoader : ImageLoader() {
+//    override fun displayImage(context: Context, path: Any, imageView: ImageView) {
+//        GlideUtils.loadUrlImage(context, path.toString(), imageView)
+//    }
+//}

+ 97 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/BottomNavBar.kt

@@ -0,0 +1,97 @@
+package com.cooleshow.base.widgets
+
+import android.content.Context
+import android.util.AttributeSet
+import com.ashokvarma.bottomnavigation.BottomNavigationBar
+import com.ashokvarma.bottomnavigation.BottomNavigationItem
+import com.ashokvarma.bottomnavigation.ShapeBadgeItem
+import com.ashokvarma.bottomnavigation.TextBadgeItem
+import com.cooleshow.base.R
+
+/*
+    底部导航
+ */
+class BottomNavBar @JvmOverloads constructor(
+        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BottomNavigationBar(context, attrs, defStyleAttr) {
+
+    //购物车Tab 标签
+    private val mCartBadge:TextBadgeItem
+    //消息Tab 标签
+    private val mMsgBadge:ShapeBadgeItem
+
+    init {
+        //首页
+        val homeItem = BottomNavigationItem(R.mipmap.btn_nav_home_press,resources.getString(R.string.nav_bar_home))
+                .setInactiveIconResource(R.mipmap.btn_nav_home_normal)
+                .setActiveColorResource(R.color.common_blue)
+                .setInActiveColorResource(R.color.text_normal)
+
+        //分类
+        val categoryItem = BottomNavigationItem(R.mipmap.btn_nav_category_press,resources.getString(R.string.nav_bar_category))
+                .setInactiveIconResource(R.mipmap.btn_nav_category_normal)
+                .setActiveColorResource(R.color.common_blue)
+                .setInActiveColorResource(R.color.text_normal)
+
+//        //购物车
+        val cartItem = BottomNavigationItem(R.mipmap.btn_nav_cart_press,resources.getString(R.string.nav_bar_cart))
+                .setInactiveIconResource(R.mipmap.btn_nav_cart_normal)
+                .setActiveColorResource(R.color.common_blue)
+                .setInActiveColorResource(R.color.text_normal)
+
+        mCartBadge = TextBadgeItem()
+        cartItem.setBadgeItem(mCartBadge)
+
+//        //消息
+        val msgItem = BottomNavigationItem(R.mipmap.btn_nav_msg_press,resources.getString(R.string.nav_bar_msg))
+                .setInactiveIconResource(R.mipmap.btn_nav_msg_normal)
+                .setActiveColorResource(R.color.common_blue)
+                .setInActiveColorResource(R.color.text_normal)
+
+        mMsgBadge = ShapeBadgeItem()
+        mMsgBadge.setShape(ShapeBadgeItem.SHAPE_OVAL)
+        msgItem.setBadgeItem(mMsgBadge)
+
+        //我的
+        val userItem = BottomNavigationItem(R.mipmap.btn_nav_user_press,resources.getString(R.string.nav_bar_user))
+                .setInactiveIconResource(R.mipmap.btn_nav_user_normal)
+                .setActiveColorResource(R.color.common_blue)
+                .setInActiveColorResource(R.color.text_normal)
+
+        //设置底部导航模式及样式
+        setMode(BottomNavigationBar.MODE_FIXED)
+        setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC)
+        setBarBackgroundColor(R.color.common_white)
+        //添加Tab
+        addItem(homeItem)
+                .addItem(categoryItem)
+                .addItem(cartItem)
+                .addItem(msgItem)
+                .addItem(userItem)
+                .setFirstSelectedPosition(0)
+                .initialise()
+    }
+
+    /*
+        检查购物车Tab是否显示标签
+     */
+    fun checkCartBadge(count:Int){
+        if (count == 0){
+            mCartBadge.hide()
+        }else{
+            mCartBadge.show()
+            mCartBadge.setText("$count")
+        }
+    }
+
+    /*
+        检查消息Tab是否显示标签
+     */
+    fun checkMsgBadge(isVisiable:Boolean){
+        if (isVisiable){
+            mMsgBadge.show()
+        }else {
+            mMsgBadge.hide()
+        }
+    }
+}

+ 18 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/DefaultTextWatcher.kt

@@ -0,0 +1,18 @@
+package com.cooleshow.base.widgets
+
+import android.text.Editable
+import android.text.TextWatcher
+
+/*
+    默认TextWatcher,空实现
+ */
+open class DefaultTextWatcher:TextWatcher{
+    override fun afterTextChanged(s: Editable?) {
+    }
+
+    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+    }
+
+    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+    }
+}

+ 93 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/HeaderBar.kt

@@ -0,0 +1,93 @@
+package com.cooleshow.base.widgets
+
+import android.app.Activity
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.FrameLayout
+import android.widget.ImageView
+import android.widget.TextView
+import com.cooleshow.base.R
+import com.cooleshow.base.ext.onClick
+
+
+/*
+    Header Bar封装
+ */
+class HeaderBar @JvmOverloads constructor(
+        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr) {
+
+    //是否显示"返回"图标
+    private var isShowBack = true
+    //Title文字
+    private var titleText:String? = null
+    //右侧文字
+    private var rightText:String? = null
+    private var mLeftIv:ImageView? = null
+    private var mTitleTv:TextView? = null
+    private var mRightTv:TextView? = null
+
+    init {
+        //获取自定义属性
+        val typedArray = context.obtainStyledAttributes(attrs,R.styleable.HeaderBar)
+
+        isShowBack = typedArray.getBoolean(R.styleable.HeaderBar_isShowBack,true)
+
+        titleText = typedArray.getString(R.styleable.HeaderBar_titleText)
+        rightText = typedArray.getString(R.styleable.HeaderBar_rightText)
+
+        initView()
+        typedArray.recycle()
+    }
+
+    /*
+        初始化视图
+     */
+    private fun initView() {
+        inflate(context,R.layout.layout_header_bar,this)
+        mLeftIv =  findViewById<ImageView>(R.id.mLeftIv)
+        mTitleTv =  findViewById<TextView>(R.id.mTitleTv)
+        mRightTv =  findViewById<TextView>(R.id.mRightTv)
+        mLeftIv?.visibility = if (isShowBack) VISIBLE else GONE
+
+        //标题不为空,设置值
+        titleText?.let {
+            mTitleTv?.text = it
+        }
+
+        //右侧文字不为空,设置值
+        rightText?.let {
+            mRightTv?.text = it
+            mRightTv?.visibility = VISIBLE
+        }
+
+        //返回图标默认实现(关闭Activity)
+        mLeftIv?.onClick {
+            if (context is Activity){
+                (context as Activity).finish()
+            }
+        }
+
+    }
+
+    /*
+        获取左侧视图
+     */
+    fun getLeftView():ImageView{
+        return mLeftIv!!
+    }
+
+    /*
+        获取右侧视图
+     */
+    fun getRightView():TextView{
+        return mRightTv!!
+    }
+
+    /*
+        获取右侧文字
+     */
+    fun getRightText():String{
+        return mRightTv?.text.toString()?:""
+    }
+}

+ 48 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/LabelTextView.kt

@@ -0,0 +1,48 @@
+//package com.cooleshow.base.widgets
+//
+//import android.content.Context
+//import android.util.AttributeSet
+//import android.view.View
+//import android.widget.FrameLayout
+//import com.cooleshow.base.R
+//import kotlinx.android.synthetic.main.layout_label_textview.view.*
+//
+//
+///*
+// * LabelTextView封装
+// */
+//class LabelTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) {
+//
+//    private var mLabelText: CharSequence? = null
+//    private var mContentText: CharSequence? = null
+//
+//    //初始化属性
+//    init {
+//        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.LabelText)
+//        this.mLabelText = typedArray.getText(R.styleable.LabelText_labelText)
+//        this.mContentText = typedArray.getText(R.styleable.LabelText_contentText)
+//        initView()
+//        typedArray.recycle()
+//    }
+//
+//    //初始化视图
+//    private fun initView() {
+//        View.inflate(context, R.layout.layout_label_textview, this)
+//
+//        mLabelText?.let {
+//            mLabelTv.text = it
+//        }
+//
+//        mContentText?.let {
+//            mContentTv.text = it
+//        }
+//
+//    }
+//
+//    /*
+//        设置内容文本
+//     */
+//    fun setContentText(text:String){
+//        mContentTv.text = text
+//    }
+//}

+ 59 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/ProgressLoading.kt

@@ -0,0 +1,59 @@
+package com.cooleshow.base.widgets
+
+import android.app.Dialog
+import android.content.Context
+import android.graphics.drawable.AnimationDrawable
+import android.view.Gravity
+import android.widget.ImageView
+import com.cooleshow.base.R
+
+/*
+    加载对话框封装
+ */
+class ProgressLoading private constructor(context: Context, theme: Int) : Dialog(context, theme) {
+
+    companion object {
+        private lateinit var mDialog: ProgressLoading
+        private var animDrawable: AnimationDrawable? = null
+
+        /*
+            创建加载对话框
+         */
+        fun create(context: Context): ProgressLoading {
+            //样式引入
+            mDialog = ProgressLoading(context, R.style.LightProgressDialog)
+            //设置布局
+            mDialog.setContentView(R.layout.progress_dialog)
+            mDialog.setCancelable(true)
+            mDialog.setCanceledOnTouchOutside(false)
+            mDialog.window?.attributes?.gravity = Gravity.CENTER
+
+            val lp = mDialog.window?.attributes
+            lp?.dimAmount = 0.2f
+            //设置属性
+            mDialog.window?.attributes = lp
+
+            //获取动画视图
+            val loadingView = mDialog.findViewById<ImageView>(R.id.iv_loading)
+            animDrawable = loadingView.background as AnimationDrawable
+
+            return mDialog
+        }
+    }
+
+    /*
+        显示加载对话框,动画开始
+     */
+    fun showLoading() {
+        super.show()
+        animDrawable?.start()
+    }
+
+    /*
+        隐藏加载对话框,动画停止
+     */
+    fun hideLoading(){
+        super.dismiss()
+        animDrawable?.stop()
+    }
+}

+ 56 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/RoundRectImageView.kt

@@ -0,0 +1,56 @@
+//package com.cooleshow.base.widgets
+//
+//import android.content.Context
+//import android.graphics.Bitmap
+//import android.graphics.Canvas
+//import android.graphics.Paint
+//import android.graphics.Path
+//import android.graphics.PorterDuff
+//import android.graphics.PorterDuffXfermode
+//import android.graphics.RectF
+//import android.util.AttributeSet
+//import android.widget.ImageView
+//import com.cooleshow.base.R
+//import org.jetbrains.anko.dimen
+//
+///*
+//    圆角图标
+//    左上,右上为圆角
+// */
+//class RoundRectImageView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr:Int = 0): ImageView(context,attrs,defStyleAttr) {
+//    val radius = dimen(R.dimen.common_radius).toFloat()
+//    //设置圆角为左上和右上
+//    private val radiusArray:FloatArray = floatArrayOf(radius,radius,radius,radius,0.0f,0.0f,0.0f,0.0f)
+//
+//
+//    /*
+//        绘制圆角
+//     */
+//    private fun drawRoundAngle(paramCanvas: Canvas) {
+//        val paint = Paint()
+//        paint.isAntiAlias = true
+//        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
+//        val path = Path()
+//        path.addRoundRect(RectF(0.0f, 0.0f, width.toFloat(), height.toFloat()), this.radiusArray, Path.Direction.CW)
+//        path.fillType = Path.FillType.INVERSE_WINDING
+//        paramCanvas.drawPath(path, paint)
+//    }
+//
+//    /*
+//        重新绘制
+//     */
+//    override fun draw(paramCanvas: Canvas) {
+//        var bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+//        var localCanvas = Canvas(bitmap)
+//        if (bitmap.isRecycled) {
+//            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
+//            localCanvas = Canvas(bitmap)
+//        }
+//        super.draw(localCanvas)
+//        drawRoundAngle(localCanvas)
+//        val paint = Paint()
+//        paint.xfermode = null
+//        paramCanvas.drawBitmap(bitmap, 0.0f, 0.0f, paint)
+//        bitmap.recycle()
+//    }
+//}

+ 83 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/VerifyButton.kt

@@ -0,0 +1,83 @@
+package com.cooleshow.base.widgets
+
+import android.content.Context
+import android.os.Handler
+import android.util.AttributeSet
+import android.widget.Button
+import com.cooleshow.base.R
+
+/*
+    获取验证码按钮
+    带倒计时
+ */
+class VerifyButton(mContext: Context, attrs: AttributeSet) : Button(mContext, attrs) {
+    private val mHandler: Handler
+    private var mCount = 60
+    private var mOnVerifyBtnClick: OnVerifyBtnClick? = null
+
+    init {
+        this.text = "获取验证码"
+        mHandler = Handler()
+
+    }
+
+    /*
+        倒计时,并处理点击事件
+     */
+    fun requestSendVerifyNumber() {
+        mHandler.postDelayed(countDown, 0)
+        if (mOnVerifyBtnClick != null) {
+            mOnVerifyBtnClick!!.onClick()
+        }
+
+    }
+
+    /*
+        倒计时
+     */
+    private val countDown = object : Runnable {
+        override fun run() {
+            this@VerifyButton.text = mCount.toString() + "s "
+            this@VerifyButton.setBackgroundColor(resources.getColor(R.color.common_disable))
+            this@VerifyButton.setTextColor(resources.getColor(R.color.common_white))
+            this@VerifyButton.isEnabled = false
+
+            if (mCount > 0) {
+                mHandler.postDelayed(this, 1000)
+            } else {
+                resetCounter()
+            }
+            mCount--
+        }
+    }
+
+    fun removeRunable() {
+        mHandler.removeCallbacks(countDown)
+    }
+
+    /*
+        恢复到初始状态
+     */
+    fun resetCounter(vararg text: String) {
+        this.isEnabled = true
+        if (text.isNotEmpty() && "" != text[0]) {
+            this.text = text[0]
+        } else {
+            this.text = "重获验证码"
+        }
+        this.setBackgroundColor(resources.getColor(R.color.transparent))
+        this.setTextColor(resources.getColor(R.color.common_blue))
+        mCount = 60
+    }
+
+    /*
+        点击事件接口
+     */
+    interface OnVerifyBtnClick {
+        fun onClick()
+    }
+
+    fun setOnVerifyBtnClick(onVerifyBtnClick: OnVerifyBtnClick) {
+        this.mOnVerifyBtnClick = onVerifyBtnClick
+    }
+}

+ 6 - 0
BaseLibrary/src/main/res/anim/push_bottom_in.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:duration="500"
+               android:fromYDelta="100.0%p"
+               android:toYDelta="0.0"/>
+</set>

+ 6 - 0
BaseLibrary/src/main/res/anim/push_bottom_out.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate android:duration="500"
+               android:fromYDelta="0.0"
+               android:toYDelta="100.0%p"/>
+</set>

+ 30 - 0
BaseLibrary/src/main/res/drawable-v24/ic_launcher_foreground.xml

@@ -0,0 +1,30 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="85.84757"
+                android:endY="92.4963"
+                android:startX="42.9492"
+                android:startY="49.59793"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1" />
+</vector>

+ 6 - 0
BaseLibrary/src/main/res/drawable/border_all.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_white" />
+    <stroke android:width="@dimen/common_border_size" android:color="@color/common_gray" />
+</shape>

+ 10 - 0
BaseLibrary/src/main/res/drawable/border_bottom.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:left="-2.0dip" android:top="-2.0dip" android:right="-2.0dip" android:bottom="0.0dip">
+        <shape android:shape="rectangle">
+            <solid android:color="@color/common_white" />
+            <stroke android:width="@dimen/common_border_size" android:color="@color/common_divider" />
+        </shape>
+    </item>
+</layer-list>

+ 10 - 0
BaseLibrary/src/main/res/drawable/border_bottom_gray.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:left="-2.0dip" android:top="-2.0dip" android:right="-2.0dip" android:bottom="0.0dip">
+        <shape android:shape="rectangle">
+            <solid android:color="@color/common_bg" />
+            <stroke android:width="@dimen/common_border_size" android:color="@color/common_divider" />
+        </shape>
+    </item>
+</layer-list>

+ 7 - 0
BaseLibrary/src/main/res/drawable/border_corner_all.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_white" />
+    <stroke android:width="@dimen/common_border_size" android:color="@color/common_gray" />
+    <corners android:radius="@dimen/common_radius" />
+</shape>

+ 7 - 0
BaseLibrary/src/main/res/drawable/border_corner_all_blue.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_white" />
+    <stroke android:width="@dimen/common_border_size" android:color="@color/common_blue" />
+    <corners android:radius="@dimen/common_radius" />
+</shape>

+ 10 - 0
BaseLibrary/src/main/res/drawable/border_top.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:left="-2.0dip" android:top="0.0dip" android:right="-2.0dip" android:bottom="-2.0dip">
+        <shape android:shape="rectangle">
+            <solid android:color="@color/common_white" />
+            <stroke android:width="@dimen/common_border_size" android:color="@color/common_divider" />
+        </shape>
+    </item>
+</layer-list>

+ 10 - 0
BaseLibrary/src/main/res/drawable/bottom_nav_cart_selector.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@mipmap/btn_nav_cart_press" />
+    <item android:state_focused="true" android:drawable="@mipmap/btn_nav_cart_press" />
+    <item android:state_pressed="true" android:drawable="@mipmap/btn_nav_cart_press" />
+    <item android:state_selected="false" android:drawable="@mipmap/btn_nav_cart_normal" />
+    <item android:state_pressed="false" android:drawable="@mipmap/btn_nav_cart_normal" />
+    <item android:drawable="@mipmap/btn_nav_cart_normal" />
+</selector>

+ 7 - 0
BaseLibrary/src/main/res/drawable/bottom_nav_text_selector.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="false" android:color="@color/text_normal" />
+    <item android:state_selected="true" android:color="@color/common_blue" />
+    <item android:color="@color/text_normal" />
+</selector>

+ 6 - 0
BaseLibrary/src/main/res/drawable/btn_common_disable.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_disable" />
+    <corners android:radius="@dimen/common_radius" />
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/btn_common_nor.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_blue" />
+    <corners android:radius="@dimen/common_radius" />
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/btn_common_pressed.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_blue_dark" />
+    <corners android:radius="@dimen/common_radius" />
+</shape>

+ 7 - 0
BaseLibrary/src/main/res/drawable/btn_common_selector.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false" android:drawable="@drawable/btn_common_disable" />
+    <item android:state_pressed="true" android:drawable="@drawable/btn_common_pressed" />
+    <item android:drawable="@drawable/btn_common_nor" />
+</selector>

+ 10 - 0
BaseLibrary/src/main/res/drawable/collect_selector.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@mipmap/icon_favorite_checked" />
+    <item android:state_focused="true" android:drawable="@mipmap/icon_favorite_checked" />
+    <item android:state_pressed="true" android:drawable="@mipmap/icon_favorite_checked" />
+    <item android:state_selected="false" android:drawable="@mipmap/icon_favorite_nor" />
+    <item android:state_pressed="false" android:drawable="@mipmap/icon_favorite_nor" />
+    <item android:drawable="@mipmap/icon_favorite_nor" />
+</selector>

+ 8 - 0
BaseLibrary/src/main/res/drawable/common_check_selector.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@mipmap/icon_box_checked" />
+    <item android:state_checked="false" android:drawable="@mipmap/icon_box_nor" />
+    <item android:state_checked="true" android:drawable="@mipmap/icon_box_checked" />
+    <item android:drawable="@mipmap/icon_box_nor" />
+</selector>

+ 7 - 0
BaseLibrary/src/main/res/drawable/corner_blue_white_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_white" />
+    <corners android:radius="@dimen/common_radius" />
+    <stroke android:width="@dimen/common_border_size" android:color="@color/common_blue" />
+</shape>

+ 7 - 0
BaseLibrary/src/main/res/drawable/corner_gray_white_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_white" />
+    <corners android:radius="@dimen/common_radius" />
+    <stroke android:width="@dimen/common_border_size" android:color="@color/common_divider" />
+</shape>

+ 7 - 0
BaseLibrary/src/main/res/drawable/home_header_corner_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/common_blue_light" />
+    <corners android:radius="@dimen/common_radius" />
+    <stroke android:width="@dimen/common_border_size" android:color="@color/common_blue_light" />
+</shape>

+ 170 - 0
BaseLibrary/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:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillColor="#3DDC84"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+</vector>

+ 16 - 0
BaseLibrary/src/main/res/drawable/progress_dialog_anim.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false">
+    <item android:drawable="@mipmap/light_progress_loading1" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading2" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading3" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading4" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading5" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading6" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading7" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading8" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading9" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading10" android:duration="200"/>
+    <item android:drawable="@mipmap/light_progress_loading11" android:duration="200"/>
+</animation-list>

+ 12 - 0
BaseLibrary/src/main/res/drawable/progress_dialog_bg.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <solid android:color="#7f000000" />
+
+    <corners
+        android:bottomLeftRadius="8dp"
+        android:bottomRightRadius="8dp"
+        android:topLeftRadius="8dp"
+        android:topRightRadius="8dp" />
+
+</shape>

+ 12 - 0
BaseLibrary/src/main/res/drawable/state_loading.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list android:oneshot="false"
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:duration="100" android:drawable="@mipmap/loading0" />
+    <item android:duration="100" android:drawable="@mipmap/loading1" />
+    <item android:duration="100" android:drawable="@mipmap/loading2" />
+    <item android:duration="100" android:drawable="@mipmap/loading3" />
+    <item android:duration="100" android:drawable="@mipmap/loading4" />
+    <item android:duration="100" android:drawable="@mipmap/loading5" />
+    <item android:duration="100" android:drawable="@mipmap/loading6" />
+    <item android:duration="100" android:drawable="@mipmap/loading7" />
+</animation-list>

+ 10 - 0
BaseLibrary/src/main/res/drawable/tab_selector.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true">
+        <color android:color="@color/common_blue" />
+    </item>
+    <item android:state_selected="false">
+        <color android:color="@color/common_blue" />
+    </item>
+</selector>

+ 27 - 0
BaseLibrary/src/main/res/layout/layout_header_bar.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:background="@color/common_blue"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/common_header_bar_height">
+    <ImageView android:id="@+id/mLeftIv"
+               android:paddingLeft="@dimen/common_padding"
+               android:paddingRight="@dimen/common_padding"
+               style="@style/WrapMatch"
+               android:src="@mipmap/icon_back"/>
+    <TextView
+            android:id="@+id/mTitleTv"
+            android:textSize="@dimen/text_large_size"
+            android:textColor="@color/common_white"
+            style="@style/WrapWrap"
+            android:layout_centerInParent="true"/>
+    <TextView
+            android:id="@+id/mRightTv"
+            style="@style/WrapMatch"
+            android:textColor="@color/common_white"
+            android:gravity="center"
+            android:paddingLeft="@dimen/common_padding"
+            android:paddingRight="@dimen/common_padding"
+            android:visibility="gone"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"/>
+</RelativeLayout>

+ 14 - 0
BaseLibrary/src/main/res/layout/layout_label_textview.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              style="@style/MatchWrap.Horizontal"
+              android:minHeight="@dimen/common_line_height"
+              android:background="@drawable/border_bottom"
+              android:paddingLeft="@dimen/common_padding"
+              android:paddingRight="@dimen/common_padding"
+              android:gravity="center_vertical">
+    <TextView android:id="@+id/mLabelTv"
+              android:layout_marginRight="@dimen/common_margin"
+              style="@style/LabelTitleTextStyle"/>
+    <TextView android:id="@+id/mContentTv"
+              style="@style/LabelContentTextStyle"/>
+</LinearLayout>

+ 13 - 0
BaseLibrary/src/main/res/layout/layout_state_empty.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:gravity="center"
+              style="@style/MatchMatch.Vertical">
+    <ImageView
+            style="@style/WrapWrap"
+            android:scaleType="centerCrop"/>
+    <TextView
+            style="@style/WrapWrap"
+            android:textSize="@dimen/text_large_size"
+            android:gravity="center"
+            android:text="@string/coming_soon_tip"/>
+</LinearLayout>

+ 14 - 0
BaseLibrary/src/main/res/layout/layout_state_error.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:gravity="center"
+              style="@style/MatchMatch.Vertical">
+    <ImageView
+            style="@style/WrapWrap"
+            android:src="@mipmap/icon_state_error"
+            android:scaleType="centerCrop"/>
+    <TextView
+            style="@style/WrapWrap"
+            android:textSize="@dimen/text_large_size"
+            android:gravity="center"
+            android:text="加载错误"/>
+</LinearLayout>

+ 19 - 0
BaseLibrary/src/main/res/layout/layout_state_loading.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                style="@style/MatchMatch.Common">
+    <TextView
+            android:id="@+id/tv_loading"
+            style="@style/WrapWrap"
+            android:textSize="@dimen/text_small_size"
+            android:textColor="@color/text_normal"
+            android:layout_marginTop="@dimen/common_margin_small"
+            android:layout_marginBottom="@dimen/common_margin_middle"
+            android:text="正在加载"
+            android:layout_centerInParent="true"/>
+    <View android:id="@+id/loading_anim_view"
+          android:background="@drawable/state_loading"
+          android:layout_width="60.0dip"
+          android:layout_height="12.0dip"
+          android:layout_below="@id/tv_loading"
+          android:layout_centerHorizontal="true"/>
+</RelativeLayout>

+ 13 - 0
BaseLibrary/src/main/res/layout/progress_dialog.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              style="@style/WrapWrap.Vertical"
+              android:background="@drawable/progress_dialog_bg"
+              android:gravity="center_horizontal"
+              android:padding="40dp">
+    <ImageView
+            android:id="@+id/iv_loading"
+            style="@style/WrapWrap"
+            android:layout_gravity="center"
+            android:background="@drawable/progress_dialog_anim"/>
+
+</LinearLayout>

+ 5 - 0
BaseLibrary/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
BaseLibrary/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
BaseLibrary/src/main/res/mipmap-hdpi/ic_launcher.webp


BIN
BaseLibrary/src/main/res/mipmap-hdpi/ic_launcher_round.webp


BIN
BaseLibrary/src/main/res/mipmap-mdpi/ic_launcher.webp


BIN
BaseLibrary/src/main/res/mipmap-mdpi/ic_launcher_round.webp


BIN
BaseLibrary/src/main/res/mipmap-xhdpi/ic_launcher.webp


BIN
BaseLibrary/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_cart_normal.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_cart_press.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_category_normal.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_category_press.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_home_normal.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_home_press.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_msg_normal.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_msg_press.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_user_normal.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/btn_nav_user_press.png


Some files were not shown because too many files changed in this diff