diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_unselected.png b/app/src/main/res/mipmap-hdpi/task_unselected.png
new file mode 100644
index 0000000..572d054
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_unselected.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_unselected.png b/app/src/main/res/mipmap-hdpi/task_unselected.png
new file mode 100644
index 0000000..572d054
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_inspection.png b/app/src/main/res/mipmap-hdpi/today_inspection.png
new file mode 100644
index 0000000..d9a519d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_inspection.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_unselected.png b/app/src/main/res/mipmap-hdpi/task_unselected.png
new file mode 100644
index 0000000..572d054
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_inspection.png b/app/src/main/res/mipmap-hdpi/today_inspection.png
new file mode 100644
index 0000000..d9a519d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_inspection.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_task.png b/app/src/main/res/mipmap-hdpi/today_task.png
new file mode 100644
index 0000000..aecfc6f
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_task.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_unselected.png b/app/src/main/res/mipmap-hdpi/task_unselected.png
new file mode 100644
index 0000000..572d054
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_inspection.png b/app/src/main/res/mipmap-hdpi/today_inspection.png
new file mode 100644
index 0000000..d9a519d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_inspection.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_task.png b/app/src/main/res/mipmap-hdpi/today_task.png
new file mode 100644
index 0000000..aecfc6f
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_task.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/total_inspection.png b/app/src/main/res/mipmap-hdpi/total_inspection.png
new file mode 100644
index 0000000..d07aa00
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/total_inspection.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_unselected.png b/app/src/main/res/mipmap-hdpi/task_unselected.png
new file mode 100644
index 0000000..572d054
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_inspection.png b/app/src/main/res/mipmap-hdpi/today_inspection.png
new file mode 100644
index 0000000..d9a519d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_inspection.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_task.png b/app/src/main/res/mipmap-hdpi/today_task.png
new file mode 100644
index 0000000..aecfc6f
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_task.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/total_inspection.png b/app/src/main/res/mipmap-hdpi/total_inspection.png
new file mode 100644
index 0000000..d07aa00
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/total_inspection.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/total_task.png b/app/src/main/res/mipmap-hdpi/total_task.png
new file mode 100644
index 0000000..61c0428
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/total_task.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..2914721
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml
new file mode 100644
index 0000000..2a160f3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_slide_list.xml b/app/src/main/res/layout/item_slide_list.xml
new file mode 100644
index 0000000..de23792
--- /dev/null
+++ b/app/src/main/res/layout/item_slide_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/alarm_selected.png b/app/src/main/res/mipmap-hdpi/alarm_selected.png
new file mode 100644
index 0000000..2fff656
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/alarm_unselected.png b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
new file mode 100644
index 0000000..8975947
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/alarm_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/bg_login.png b/app/src/main/res/mipmap-hdpi/bg_login.png
new file mode 100644
index 0000000..aac03ab
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/bg_login.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_selected.png b/app/src/main/res/mipmap-hdpi/home_selected.png
new file mode 100644
index 0000000..aabeb65
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/home_unselected.png b/app/src/main/res/mipmap-hdpi/home_unselected.png
new file mode 100644
index 0000000..75173a3
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/home_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/main_act_slider.jpg b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
new file mode 100644
index 0000000..5330283
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/main_act_slider.jpg
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_selected.png b/app/src/main/res/mipmap-hdpi/mine_selected.png
new file mode 100644
index 0000000..be3eca0
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/mine_unselected.png b/app/src/main/res/mipmap-hdpi/mine_unselected.png
new file mode 100644
index 0000000..f22faec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/mine_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/password.png b/app/src/main/res/mipmap-hdpi/password.png
new file mode 100644
index 0000000..1f114ec
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/password.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_selected.png b/app/src/main/res/mipmap-hdpi/task_selected.png
new file mode 100644
index 0000000..63201ac
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_selected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/task_unselected.png b/app/src/main/res/mipmap-hdpi/task_unselected.png
new file mode 100644
index 0000000..572d054
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/task_unselected.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_inspection.png b/app/src/main/res/mipmap-hdpi/today_inspection.png
new file mode 100644
index 0000000..d9a519d
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_inspection.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/today_task.png b/app/src/main/res/mipmap-hdpi/today_task.png
new file mode 100644
index 0000000..aecfc6f
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/today_task.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/total_inspection.png b/app/src/main/res/mipmap-hdpi/total_inspection.png
new file mode 100644
index 0000000..d07aa00
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/total_inspection.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/total_task.png b/app/src/main/res/mipmap-hdpi/total_task.png
new file mode 100644
index 0000000..61c0428
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/total_task.png
Binary files differ
diff --git a/app/src/main/res/mipmap-hdpi/user_name.png b/app/src/main/res/mipmap-hdpi/user_name.png
new file mode 100644
index 0000000..27582a9
--- /dev/null
+++ b/app/src/main/res/mipmap-hdpi/user_name.png
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e879e56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+app/build
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..3a4c73e
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,100 @@
+import java.text.SimpleDateFormat
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+
+ defaultConfig {
+ applicationId "com.casic.br.ktd"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1000
+ versionName "1.0.0.0"
+
+ ndk {
+ abiFilters 'armeabi-v7a', "arm64-v8a"
+ }
+ }
+
+ 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'
+ }
+
+ kotlin {
+ experimental {
+ coroutines 'enable'
+ }
+ }
+ viewBinding {
+ enabled true
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = "KTD_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+static def getBuildDate() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
+ return dateFormat.format(System.currentTimeMillis())
+}
+
+dependencies {
+ //基础依赖库
+ implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.7'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.9.0'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //fragment快速实现
+ implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0'
+ //图片加载框架
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ //图片选择框架
+ implementation 'io.github.lucksiege:pictureselector:v3.0.4'
+ //图片压缩
+ implementation 'top.zibin:Luban:1.1.8'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ //Kotlin协程
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //返回值转换器
+ implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
+ implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ //okhttp3日志拦截器
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0'
+ //网络请求和接口封装
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //图表
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //高德导航、定位、地图三合一
+ implementation 'com.amap.api:navi-3dmap:latest.integration'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/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
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fb8af
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
new file mode 100644
index 0000000..c20100a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/base/BaseApplication.kt
@@ -0,0 +1,22 @@
+package com.casic.br.ktd.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ private val kTag = "BaseApplication"
+
+ companion object {
+ private var application: BaseApplication by Delegates.notNull()
+
+ fun get() = application
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ application = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
new file mode 100644
index 0000000..b8941ed
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/AlarmPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class AlarmPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_alarm
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..e9c0aec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/HomePageFragment.kt
@@ -0,0 +1,60 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.amap.api.maps.AMap
+import com.amap.api.maps.AMapOptions
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.fragment_home.*
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ private lateinit var aMap: AMap
+
+ override fun initData(savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ aMap = mapView.map
+ val uiSettings = aMap.uiSettings
+ uiSettings.isCompassEnabled = true
+ uiSettings.isMyLocationButtonEnabled = true
+ uiSettings.isScaleControlsEnabled = true
+ uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER
+ uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ /***以下是地图生命周期管理************************************************************************/
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ mapView.onPause()
+ super.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ mapView.onDestroy()
+ super.onDestroy()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..90313ac
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/MinePageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MinePageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
new file mode 100644
index 0000000..6c5c7cf
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/fragment/TaskPageFragment.kt
@@ -0,0 +1,25 @@
+package com.casic.br.ktd.fragment
+
+import android.os.Bundle
+import com.casic.br.ktd.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class TaskPageFragment : KotlinBaseFragment() {
+ override fun initData(savedInstanceState: Bundle?) {
+
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.fragment_task
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
new file mode 100644
index 0000000..860de82
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/utils/LocaleConstant.kt
@@ -0,0 +1,26 @@
+package com.casic.br.ktd.utils
+
+import android.Manifest
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.READ_PHONE_STATE,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
new file mode 100644
index 0000000..76874bd
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/LoginActivity.kt
@@ -0,0 +1,53 @@
+package com.casic.br.ktd.view
+
+import android.os.Bundle
+import com.amap.api.maps.MapsInitializer
+import com.casic.br.ktd.R
+import com.casic.br.ktd.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import kotlinx.android.synthetic.main.activity_login.*
+import pub.devrel.easypermissions.EasyPermissions
+
+class LoginActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks {
+
+ override fun initData(savedInstanceState: Bundle?) {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+ loginButton.setOnClickListener { navigatePageTo() }
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_login
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: MutableList) {
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ MapsInitializer.updatePrivacyAgree(this, true)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: MutableList) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
new file mode 100644
index 0000000..06094f5
--- /dev/null
+++ b/app/src/main/java/com/casic/br/ktd/view/MainActivity.kt
@@ -0,0 +1,134 @@
+package com.casic.br.ktd.view
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.casic.br.ktd.R
+import com.casic.br.ktd.fragment.AlarmPageFragment
+import com.casic.br.ktd.fragment.HomePageFragment
+import com.casic.br.ktd.fragment.MinePageFragment
+import com.casic.br.ktd.fragment.TaskPageFragment
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private val slideUnSelectedItems = ArrayList()
+ private val slideSelectedItems = ArrayList()
+ private val fragmentPages = ArrayList()
+ private val slideAdapter by lazy { SlideAdapter(this) }
+
+ init {
+ slideUnSelectedItems.add(SlideItem(R.mipmap.home_unselected, "首页"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.alarm_unselected, "报警记录"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.task_unselected, "任务"))
+ slideUnSelectedItems.add(SlideItem(R.mipmap.mine_unselected, "我的"))
+
+ slideSelectedItems.add(SlideItem(R.mipmap.home_selected, "首页"))
+ slideSelectedItems.add(SlideItem(R.mipmap.alarm_selected, "报警记录"))
+ slideSelectedItems.add(SlideItem(R.mipmap.task_selected, "任务"))
+ slideSelectedItems.add(SlideItem(R.mipmap.mine_selected, "我的"))
+
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(AlarmPageFragment())
+ fragmentPages.add(TaskPageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initData(savedInstanceState: Bundle?) {
+ slideListView.adapter = slideAdapter
+
+ //默认选中第一个
+ slideAdapter.setSelectItem(0)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //显示首页
+ switchPage(fragmentPages[0])
+ }
+
+ override fun initEvent() {
+ slideListView.setOnItemClickListener { _, _, position, _ ->
+ slideAdapter.setSelectItem(position)
+ slideAdapter.notifyDataSetInvalidated()
+
+ //切换页面
+ switchPage(fragmentPages[position])
+ }
+ }
+
+ private fun switchPage(description: Fragment) {
+ val transition = supportFragmentManager.beginTransaction()
+ transition.replace(R.id.contentLayout, description)
+ transition.commit()
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ }
+
+ /**
+ * 侧边导航栏数据模型
+ * */
+ data class SlideItem(val icon: Int, val title: String)
+
+ /**
+ * 侧边导航适配器
+ * */
+ inner class SlideAdapter(context: Context) : BaseAdapter() {
+
+ private var inflater: LayoutInflater = LayoutInflater.from(context)
+ private var selectedPosition = -1
+
+ override fun getCount(): Int = slideUnSelectedItems.size
+
+ override fun getItem(position: Int): Any = slideUnSelectedItems[position]
+
+ override fun getItemId(position: Int): Long = position.toLong()
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
+ var view = convertView
+ val holder: SlideItemViewHolder?
+ if (view == null) {
+ view = inflater.inflate(R.layout.item_slide_list, parent, false)
+ holder = SlideItemViewHolder()
+ holder.rootLayout = view.findViewById(R.id.rootLayout) as LinearLayout
+ holder.imageView = view.findViewById(R.id.imageView) as ImageView
+ holder.textView = view.findViewById(R.id.textView) as TextView
+ view.tag = holder
+ } else {
+ holder = view.tag as SlideItemViewHolder
+ }
+ if (selectedPosition == position) {
+ holder.imageView.setImageResource(slideSelectedItems[position].icon)
+ } else {
+ holder.imageView.setImageResource(slideUnSelectedItems[position].icon)
+ }
+ holder.textView.text = slideUnSelectedItems[position].title
+ return view
+ }
+
+ fun setSelectItem(position: Int) {
+ selectedPosition = position
+ }
+ }
+
+ inner class SlideItemViewHolder {
+ lateinit var rootLayout: LinearLayout
+ lateinit var imageView: ImageView
+ lateinit var textView: TextView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_inspection.xml b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
new file mode 100644
index 0000000..9a9bb76
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_today_task.xml b/app/src/main/res/drawable/bg_home_data_today_task.xml
new file mode 100644
index 0000000..382b26f
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_today_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_inspection.xml b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
new file mode 100644
index 0000000..e87170e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_inspection.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_home_data_total_task.xml b/app/src/main/res/drawable/bg_home_data_total_task.xml
new file mode 100644
index 0000000..9f5b563
--- /dev/null
+++ b/app/src/main/res/drawable/bg_home_data_total_task.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml
new file mode 100644
index 0000000..ece8881
--- /dev/null
+++ b/app/src/main/res/drawable/button_main_selector.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/login_act_line.xml b/app/src/main/res/drawable/login_act_line.xml
new file mode 100644
index 0000000..0a8e939
--- /dev/null
+++ b/app/src/main/res/drawable/login_act_line.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/fzzdhjt.ttf b/app/src/main/res/font/fzzdhjt.ttf
new file mode 100644
index 0000000..d5567cd
--- /dev/null
+++ b/app/src/main/res/font/fzzdhjt.ttf
Binary files differ
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..8237496
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..87adefe
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_alarm.xml b/app/src/main/res/layout/fragment_alarm.xml
new file mode 100644
index 0000000..abba3c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_alarm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..8800166
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+