diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shop.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shop.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shop.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_empty_view.xml b/app/src/main/res/layout/include_empty_view.xml
new file mode 100644
index 0000000..37de024
--- /dev/null
+++ b/app/src/main/res/layout/include_empty_view.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shop.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_empty_view.xml b/app/src/main/res/layout/include_empty_view.xml
new file mode 100644
index 0000000..37de024
--- /dev/null
+++ b/app/src/main/res/layout/include_empty_view.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml
new file mode 100644
index 0000000..65c6f43
--- /dev/null
+++ b/app/src/main/res/menu/bottom_nav_menu.xml
@@ -0,0 +1,45 @@
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml
new file mode 100644
index 0000000..b284ea3
--- /dev/null
+++ b/app/src/main/res/drawable/bottom_text_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..5875998
--- /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/button_white_selector.xml b/app/src/main/res/drawable/button_white_selector.xml
new file mode 100644
index 0000000..4dd3c0b
--- /dev/null
+++ b/app/src/main/res/drawable/button_white_selector.xml
@@ -0,0 +1,17 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/device_selector.xml b/app/src/main/res/drawable/device_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/device_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/home_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..b612ce9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_camera.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_device.xml b/app/src/main/res/drawable/ic_device.xml
new file mode 100644
index 0000000..831c4c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_device.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
new file mode 100644
index 0000000..52e376f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..898c1cf
--- /dev/null
+++ b/app/src/main/res/drawable/ic_storage.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/message_selector.xml b/app/src/main/res/drawable/message_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/message_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/mine_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shop_selector.xml b/app/src/main/res/drawable/shop_selector.xml
new file mode 100644
index 0000000..559ea94
--- /dev/null
+++ b/app/src/main/res/drawable/shop_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..60ad732
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_permssion.xml b/app/src/main/res/layout/activity_permssion.xml
new file mode 100644
index 0000000..9f87568
--- /dev/null
+++ b/app/src/main/res/layout/activity_permssion.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..a84f957
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_device.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_mine.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml
new file mode 100644
index 0000000..b73f9d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shop.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml
new file mode 100644
index 0000000..1d115fa
--- /dev/null
+++ b/app/src/main/res/layout/include_base_title.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/include_empty_view.xml b/app/src/main/res/layout/include_empty_view.xml
new file mode 100644
index 0000000..37de024
--- /dev/null
+++ b/app/src/main/res/layout/include_empty_view.xml
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml
new file mode 100644
index 0000000..65c6f43
--- /dev/null
+++ b/app/src/main/res/menu/bottom_nav_menu.xml
@@ -0,0 +1,45 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..10cfdbf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..a23d24b
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,90 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.casic.br"
+ minSdkVersion 23
+ targetSdkVersion 31
+ versionCode 1
+ versionName "1.0.0"
+
+ ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" }
+ }
+
+ 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'
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ outputFileName = defaultConfig.versionName + ".apk"
+ }
+ }
+}
+
+dependencies {
+ //基础依赖库
+ implementation files('libs/lite-release.aar')
+ implementation 'androidx.core:core-ktx:1.8.0'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ //Google官方授权框架
+ implementation 'pub.devrel:easypermissions:3.0.0'
+ //沉浸式状态栏。基础依赖包,必须要依赖
+ implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
+ //空白页
+ implementation 'com.qmuiteam:qmui:2.0.0-alpha10'
+ implementation 'com.qmuiteam:arch:0.3.1'
+ //MVVM+LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
+ implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
+ //Kotlin协程
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.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'
+ //返回值转换器
+ 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'
+ //官方Json解析库
+ implementation 'com.google.code.gson:gson:2.8.6'
+ //上拉加载下拉刷新
+ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
+ //ZBar(综合Java和C++扫码),生成二维码
+ implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2'
+}
\ No newline at end of file
diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar
new file mode 100644
index 0000000..bae3254
--- /dev/null
+++ b/app/libs/lite-release.aar
Binary files differ
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..0e77665
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
new file mode 100644
index 0000000..2d3376a
--- /dev/null
+++ b/app/src/main/java/com/casic/br/adapter/ViewPagerAdapter.kt
@@ -0,0 +1,15 @@
+package com.casic.br.adapter
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+
+class ViewPagerAdapter(list: ArrayList, manager: FragmentManager) :
+ FragmentPagerAdapter(manager) {
+
+ private var pageList: List = list
+
+ override fun getItem(position: Int) = pageList[position]
+
+ override fun getCount() = pageList.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt
new file mode 100644
index 0000000..ddcd382
--- /dev/null
+++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt
@@ -0,0 +1,20 @@
+package com.casic.br.base
+
+import android.app.Application
+import com.pengxh.kt.lite.utils.SaveKeyValues
+import kotlin.properties.Delegates
+
+class BaseApplication : Application() {
+
+ companion object {
+ private var instance: BaseApplication by Delegates.notNull()
+
+ fun obtainInstance() = instance
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ instance = this
+ SaveKeyValues.initSharedPreferences(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
new file mode 100644
index 0000000..2d32a78
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class DevicePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_device
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..d2f7404
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class HomePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_home
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
new file mode 100644
index 0000000..76c5414
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MessagePageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class MessagePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_message
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
new file mode 100644
index 0000000..8d3d2ec
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+import kotlinx.android.synthetic.main.include_base_title.*
+
+class MinePageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_mine
+
+ override fun setupTopBarLayout() {
+ leftTitleView.text = "我的"
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
new file mode 100644
index 0000000..3163fce
--- /dev/null
+++ b/app/src/main/java/com/casic/br/fragment/ShopPageFragment.kt
@@ -0,0 +1,21 @@
+package com.casic.br.fragment
+
+import com.casic.br.R
+import com.pengxh.kt.lite.base.KotlinBaseFragment
+
+class ShopPageFragment : KotlinBaseFragment() {
+
+ override fun initLayoutView(): Int = R.layout.fragment_shop
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
new file mode 100644
index 0000000..dce9300
--- /dev/null
+++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt
@@ -0,0 +1,43 @@
+package com.casic.br.utils
+
+import android.Manifest
+
+
+object LocaleConstant {
+ /**
+ * =============================================================================================
+ * Array
+ * =============================================================================================
+ * */
+ val USER_PERMISSIONS = arrayOf(
+ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
+ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.READ_PHONE_STATE
+ )
+
+ /**
+ * =============================================================================================
+ * Int
+ * =============================================================================================
+ * */
+ const val PERMISSIONS_CODE = 999
+
+ /**
+ * =============================================================================================
+ * Long
+ * =============================================================================================
+ * */
+
+
+ /**
+ * =============================================================================================
+ * String
+ * =============================================================================================
+ * */
+ const val USER_DETAIL_MODEL = "userDetailModel"
+ const val SERVER_BASE_URL = "http://111.198.10.15:11304"
+ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
+ const val ACCOUNT = "account"
+ const val PASSWORD = "password"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt
new file mode 100644
index 0000000..c2fe809
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/MainActivity.kt
@@ -0,0 +1,102 @@
+package com.casic.br.view
+
+import android.view.KeyEvent
+import android.view.MenuItem
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.casic.br.R
+import com.casic.br.adapter.ViewPagerAdapter
+import com.casic.br.fragment.*
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_main.*
+
+class MainActivity : KotlinBaseActivity() {
+
+ private var menuItem: MenuItem? = null
+ private var fragmentPages: ArrayList = ArrayList()
+ private var clickTime: Long = 0
+
+ init {
+ fragmentPages.add(HomePageFragment())
+ fragmentPages.add(DevicePageFragment())
+ fragmentPages.add(ShopPageFragment())
+ fragmentPages.add(MessagePageFragment())
+ fragmentPages.add(MinePageFragment())
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_main
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+
+ }
+
+ override fun initEvent() {
+ bottomNavigation.itemIconTintList = null
+ bottomNavigation.setOnItemSelectedListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.nav_home -> {
+ mainViewPager.currentItem = 0
+ }
+ R.id.nav_device -> {
+ mainViewPager.currentItem = 1
+ }
+ R.id.nav_shop -> {
+ mainViewPager.currentItem = 2
+ }
+ R.id.nav_message -> {
+ mainViewPager.currentItem = 3
+ }
+ R.id.nav_mine -> {
+ mainViewPager.currentItem = 4
+ }
+ }
+ false
+ }
+ mainViewPager.adapter = ViewPagerAdapter(fragmentPages, supportFragmentManager)
+ mainViewPager.offscreenPageLimit = fragmentPages.size //缓存页数
+ mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrollStateChanged(state: Int) {
+
+ }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+
+ }
+
+ override fun onPageSelected(position: Int) {
+ if (menuItem != null) {
+ menuItem!!.isChecked = false
+ } else {
+ bottomNavigation.menu.getItem(0).isChecked = false
+ }
+ menuItem = bottomNavigation.menu.getItem(position)
+ menuItem!!.isChecked = true
+ }
+ })
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ return if (keyCode == KeyEvent.KEYCODE_BACK) {
+ if (System.currentTimeMillis() - clickTime > 2000) {
+ "再按一次退出程序".show(this)
+ clickTime = System.currentTimeMillis()
+ true
+ } else {
+ super.onKeyDown(keyCode, event)
+ }
+ } else super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/PermissionActivity.kt b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
new file mode 100644
index 0000000..62a5fb8
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/PermissionActivity.kt
@@ -0,0 +1,62 @@
+package com.casic.br.view
+
+import com.casic.br.R
+import com.casic.br.utils.LocaleConstant
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.convertColor
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
+import kotlinx.android.synthetic.main.activity_permssion.*
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+
+class PermissionActivity : KotlinBaseActivity(), PermissionCallbacks {
+
+ override fun initLayoutView(): Int = R.layout.activity_permssion
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
+ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this))
+ }
+
+ override fun initData() {
+ //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
+ if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
+ startSplashScreenActivity()
+ } else {
+ enterMainButton.setOnClickListener {
+ EasyPermissions.requestPermissions(
+ this@PermissionActivity,
+ resources.getString(R.string.app_name) + "需要获取存储相关权限",
+ LocaleConstant.PERMISSIONS_CODE,
+ *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+ }
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun startSplashScreenActivity() {
+ navigatePageTo()
+ finish()
+ }
+
+ 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: List) {
+ startSplashScreenActivity()
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
new file mode 100644
index 0000000..26ea221
--- /dev/null
+++ b/app/src/main/java/com/casic/br/view/SplashScreenActivity.kt
@@ -0,0 +1,57 @@
+package com.casic.br.view
+
+import android.annotation.SuppressLint
+import android.os.CountDownTimer
+import android.view.ViewGroup
+import com.casic.br.R
+import com.gyf.immersionbar.ImmersionBar
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import kotlinx.android.synthetic.main.activity_splash.*
+
+@SuppressLint("CustomSplashScreen")
+class SplashScreenActivity : KotlinBaseActivity() {
+
+ private lateinit var countDownTimer: CountDownTimer
+
+ override fun initLayoutView(): Int = R.layout.activity_splash
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
+ //根据不同设备状态栏高度设置"跳过"按钮的Margin值
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ val rightMargin = QMUIDisplayHelper.dp2px(this, 10)
+ if (skipButton.layoutParams is ViewGroup.MarginLayoutParams) {
+ val params = skipButton.layoutParams as ViewGroup.MarginLayoutParams
+ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0)
+ skipButton.requestLayout()
+ }
+ }
+
+ override fun initData() {
+ countDownTimer = object : CountDownTimer(4000, 1000) {
+ override fun onFinish() {
+ startMainActivity()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+ skipButton.text = String.format("跳过\u3000${(millisUntilFinished / 1000)}s")
+ }
+ }
+ }
+
+ override fun initEvent() {
+ countDownTimer.start()
+ skipButton.setChangeAlphaWhenPress(true)
+ skipButton.setOnClickListener {
+ countDownTimer.cancel()
+ startMainActivity()
+ }
+ }
+
+ fun startMainActivity() {
+ navigatePageTo()
+ finish()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+