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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +