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