diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /dev/null +++ b/app/libs/lite-release.aar Binary files differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt new file mode 100644 index 0000000..eb2bfd5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -0,0 +1,12 @@ +package com.casic.xz.meterage.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.casic.xz.meterage.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt new file mode 100644 index 0000000..eb2bfd5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -0,0 +1,12 @@ +package com.casic.xz.meterage.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.casic.xz.meterage.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt new file mode 100644 index 0000000..a0da700 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt @@ -0,0 +1,74 @@ +package com.casic.xz.meterage.view + +import android.os.CountDownTimer +import com.casic.xz.meterage.R +import com.casic.xz.meterage.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.SaveKeyValues +import pub.devrel.easypermissions.EasyPermissions + +class PermissionActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + + private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean + private val countDownTimer = object : CountDownTimer(2000, 500) { + override fun onFinish() { + navigatePageTo() + finish() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + override fun initData() { + EasyPermissions.requestPermissions( + this, resources.getString(R.string.app_name) + "需要获取必要权限", + LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS + ) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_permission + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (isFirstEnter) { + SaveKeyValues.putValue("isFirstEnter", false) + navigatePageTo() + finish() + } else { + countDownTimer.start() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer.cancel() + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt new file mode 100644 index 0000000..eb2bfd5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -0,0 +1,12 @@ +package com.casic.xz.meterage.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.casic.xz.meterage.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt new file mode 100644 index 0000000..a0da700 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt @@ -0,0 +1,74 @@ +package com.casic.xz.meterage.view + +import android.os.CountDownTimer +import com.casic.xz.meterage.R +import com.casic.xz.meterage.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.SaveKeyValues +import pub.devrel.easypermissions.EasyPermissions + +class PermissionActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + + private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean + private val countDownTimer = object : CountDownTimer(2000, 500) { + override fun onFinish() { + navigatePageTo() + finish() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + override fun initData() { + EasyPermissions.requestPermissions( + this, resources.getString(R.string.app_name) + "需要获取必要权限", + LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS + ) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_permission + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (isFirstEnter) { + SaveKeyValues.putValue("isFirstEnter", false) + navigatePageTo() + finish() + } else { + countDownTimer.start() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml new file mode 100644 index 0000000..60d5b26 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt new file mode 100644 index 0000000..eb2bfd5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -0,0 +1,12 @@ +package com.casic.xz.meterage.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.casic.xz.meterage.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt new file mode 100644 index 0000000..a0da700 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt @@ -0,0 +1,74 @@ +package com.casic.xz.meterage.view + +import android.os.CountDownTimer +import com.casic.xz.meterage.R +import com.casic.xz.meterage.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.SaveKeyValues +import pub.devrel.easypermissions.EasyPermissions + +class PermissionActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + + private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean + private val countDownTimer = object : CountDownTimer(2000, 500) { + override fun onFinish() { + navigatePageTo() + finish() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + override fun initData() { + EasyPermissions.requestPermissions( + this, resources.getString(R.string.app_name) + "需要获取必要权限", + LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS + ) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_permission + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (isFirstEnter) { + SaveKeyValues.putValue("isFirstEnter", false) + navigatePageTo() + finish() + } else { + countDownTimer.start() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml new file mode 100644 index 0000000..60d5b26 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml @@ -0,0 +1,10 @@ + + + + + + + \ 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..fe2dd30 --- /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..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt new file mode 100644 index 0000000..eb2bfd5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -0,0 +1,12 @@ +package com.casic.xz.meterage.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.casic.xz.meterage.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt new file mode 100644 index 0000000..a0da700 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt @@ -0,0 +1,74 @@ +package com.casic.xz.meterage.view + +import android.os.CountDownTimer +import com.casic.xz.meterage.R +import com.casic.xz.meterage.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.SaveKeyValues +import pub.devrel.easypermissions.EasyPermissions + +class PermissionActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + + private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean + private val countDownTimer = object : CountDownTimer(2000, 500) { + override fun onFinish() { + navigatePageTo() + finish() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + override fun initData() { + EasyPermissions.requestPermissions( + this, resources.getString(R.string.app_name) + "需要获取必要权限", + LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS + ) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_permission + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (isFirstEnter) { + SaveKeyValues.putValue("isFirstEnter", false) + navigatePageTo() + finish() + } else { + countDownTimer.start() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml new file mode 100644 index 0000000..60d5b26 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml @@ -0,0 +1,10 @@ + + + + + + + \ 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..fe2dd30 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..859933d --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/ +.DS_Store +/build/ +/app/build/ +/captures/ +.externalNativeBuild +.cxx +local.properties diff --git a/app/Meterage.jks b/app/Meterage.jks new file mode 100644 index 0000000..72a95e4 --- /dev/null +++ b/app/Meterage.jks Binary files differ diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..3c25340 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,85 @@ +import java.text.SimpleDateFormat + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + signingConfigs { + release { + storeFile file('/Users/a203/Desktop/AndroidProjects/Xuzhou/Meterage/app/Meterage.jks') + storePassword '123456789' + keyAlias 'key0' + keyPassword '123456789' + } + } + + compileSdkVersion 31 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.casic.xz.meterage" + minSdkVersion 22 + targetSdkVersion 31 + versionCode 1 + versionName "1.0.0.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + kotlin { + experimental { + coroutines 'enable' + } + } + viewBinding { + enabled true + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "XZJL" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" + } + } +} + +static def getBuildDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMM", Locale.CHINA) + return dateFormat.format(System.currentTimeMillis()) +} + +dependencies { + //基础依赖库 + implementation files('libs/lite-release.aar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + //Google官方授权框架 + implementation 'pub.devrel:easypermissions:3.0.0' + //腾讯Android UI框架 + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + implementation 'com.qmuiteam:arch:0.3.1' + //沉浸式状态栏。基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + //fragment快速实现 + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' + //官方Json解析库 + implementation 'com.google.code.gson:gson:2.9.0' + //Kotlin协程 + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' +} \ 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..45da4df --- /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..1c93a4b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt new file mode 100644 index 0000000..43f04b5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/base/BaseApplication.kt @@ -0,0 +1,20 @@ +package com.casic.xz.meterage.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/xz/meterage/extensions/Context.kt b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt new file mode 100644 index 0000000..467d6e5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/extensions/Context.kt @@ -0,0 +1,17 @@ +package com.casic.xz.meterage.extensions + +import android.content.Context +import android.view.ViewGroup +import com.casic.xz.meterage.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +fun Context.initLayoutImmersionBar(rootView: ViewGroup) { + //根据不同设备状态栏高度设置"跳过"按钮的Margin值 + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } + rootView.setPadding(0, statusBarHeight, 0, 0) + rootView.requestLayout() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt new file mode 100644 index 0000000..8b7bef4 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -0,0 +1,13 @@ +package com.casic.xz.meterage.utils + +import android.Manifest + +object LocaleConstant { + val USER_PERMISSIONS = arrayOf( + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + const val PERMISSIONS_CODE = 999 +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt new file mode 100644 index 0000000..3579db3 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/LoginActivity.kt @@ -0,0 +1,29 @@ +package com.casic.xz.meterage.view + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import kotlinx.android.synthetic.main.activity_login.* + +class LoginActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_login + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt new file mode 100644 index 0000000..eb2bfd5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/MainActivity.kt @@ -0,0 +1,12 @@ +package com.casic.xz.meterage.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.casic.xz.meterage.R + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt new file mode 100644 index 0000000..a0da700 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/PermissionActivity.kt @@ -0,0 +1,74 @@ +package com.casic.xz.meterage.view + +import android.os.CountDownTimer +import com.casic.xz.meterage.R +import com.casic.xz.meterage.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.SaveKeyValues +import pub.devrel.easypermissions.EasyPermissions + +class PermissionActivity : KotlinBaseActivity(), EasyPermissions.PermissionCallbacks { + + private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean + private val countDownTimer = object : CountDownTimer(2000, 500) { + override fun onFinish() { + navigatePageTo() + finish() + } + + override fun onTick(millisUntilFinished: Long) { + + } + } + + override fun initData() { + EasyPermissions.requestPermissions( + this, resources.getString(R.string.app_name) + "需要获取必要权限", + LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS + ) + } + + override fun initEvent() { + + } + + override fun initLayoutView(): Int = R.layout.activity_permission + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) + } + + override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { + if (isFirstEnter) { + SaveKeyValues.putValue("isFirstEnter", false) + navigatePageTo() + finish() + } else { + countDownTimer.start() + } + } + + override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { + + } + + override fun onDestroy() { + super.onDestroy() + countDownTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml new file mode 100644 index 0000000..60d5b26 --- /dev/null +++ b/app/src/main/res/drawable/bg_edit_text_border_radius_3.xml @@ -0,0 +1,10 @@ + + + + + + + \ 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..fe2dd30 --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..41a0ed3 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + +