diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/bug_report.md similarity index 77% rename from .github/ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE/bug_report.md index daea781567..e29c2e45b6 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,8 +1,16 @@ +--- +name: Bug report +about: Make AndroidUtilCode more perfect! +labels: bug +assignees: Blankj + +--- + ## Describe the bug A clear and concise description of what the bug is. -- The version of utilcode: +- The version of AndroidUtilCode: - The device: - The version of device: @@ -39,6 +47,6 @@ put the stack of crash here If applicable, add screenshots to help explain your problem. -Please delete the current line and the followings. +## Please delete the current line and the following. -Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode). \ No newline at end of file +Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode). diff --git a/.github/ISSUE_TEMPLATE/bug_report_cn.md b/.github/ISSUE_TEMPLATE/bug_report_cn.md new file mode 100644 index 0000000000..02ea0223e3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report_cn.md @@ -0,0 +1,52 @@ +--- +name: 提交 Bug +about: 让工具类更完美! +labels: bug +assignees: Blankj + +--- + +## 描述 Bug + +简洁地描述下 Bug。 + +- AndroidUtilCode 的版本: +- 出现 Bug 的设备型号: +- 设备的 Android 版本: + +## 相关代码 + + +``` +put your code here +``` + +## 异常堆栈 + + + +``` +put the stack of crash here +``` + +## 截图 + +如果有的话请添加屏幕截图以帮助解释问题。 + + +## 请删除当前行及以下内容 + +感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode). diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000000..90a0fe1993 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Make AndroidUtilCode more perfect! +labels: help wanted +assignees: Blankj + +--- + +## Describe the feature + +A clear and concise description of what the feature is. + + +## Reference + +Hope to give some reference articles, links, code, if any. + + +## Please delete the current line and the following + +Thank you for supporting [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode). diff --git a/.github/ISSUE_TEMPLATE/feature-request_cn.md b/.github/ISSUE_TEMPLATE/feature-request_cn.md new file mode 100644 index 0000000000..20862d047b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request_cn.md @@ -0,0 +1,21 @@ +--- +name: 提交需求 +about: 让工具类更健全! +labels: help wanted +assignees: Blankj + +--- + +## 描述需求 + +简洁地描述下需求。 + + +## 可借鉴的 + +如果有的话,可以给出一些参考文章、链接、代码 + + +## 请删除当前行及以下内容 + +感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode). diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 3071e5de4e..311fc1deaa 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -8,10 +8,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle - run: ./gradlew build + run: ./gradlew build aR diff --git a/.gitignore b/.gitignore index 94dfba6c2e..9d11f56a24 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,6 @@ local.properties .externalNativeBuild /apk *.phrof -/maven -/reports \ No newline at end of file +/mavenLocal +/reports +*/reports \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 195511dd82..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: android -jdk: oraclejdk8 -sudo: false - -android: - components: - - tools - - platform-tools - - build-tools-27.0.2 - - android-27 - - add-on - - extra - - licenses: - - 'android-sdk-license-.+' - - notifications: - email: false - -before_install: - - yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;26.0.2" - -script: - - ./gradlew aR diff --git a/CHANGELOG.md b/CHANGELOG.md index 30c8d44b10..73e8145bf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,65 @@ +* `22/10/15` [add] Fix some issue. Publish v1.31.1 +* `21/12/06` [add] Publish v1.31.0 +* `21/05/13` [add] Support publish mavenCentral. +* `21/02/22` [add] Fix ToastUtils rtl bug. Publish v1.30.6. +* `20/11/16` [add] Add ImageUtils#save2Album support param of dirName. +* `20/11/13` [add] Fix MessengerUtils ANR. Add NetworkUtils#getWifiScanResult, [add|remove]OnWifiChangedConsumer. Publish v1.30.5. +* `20/10/29` [add] Fix MessengerUtils startService IllegalStateException. Publish v1.30.4. +* `20/10/28` [add] Fix BusUtils ConcurrentModificationException. Publish v1.30.3. +* `20/10/27` [add] Fix AppUtils#getAppSignatures. Add DeviceUtils#isDevelopmentSettingsEnabled. Publish v1.30.2. +* `20/10/26` [add] Fix AppUtils#isAppForeground. Publish v1.30.1. +* `20/10/24` [add] Publish v1.30.0. +* `20/10/23` [fix] LanguageUtils crash on some device. +* `20/10/21` [add] LogUtils.Config#setOnConsoleOutputListener, setOnFileOutputListener, addFileExtraHead. LogUtils.getCurrentLogFilePath. +* `20/10/20` [opt] ToastUtils. +* `20/10/12` [add] PermissionUtils#explain. +* `20/10/10` [add] ClipboardUtils. +* `20/10/08` [add] VolumeUtils. +* `20/09/06` [add] DebouncingUtils#isValid. +* `20/09/04` [fix] ToastUtils adapt SDK 30. +* `20/05/28` [fix] IntentUtils#getInstallAppIntent file exist wrong. Publish v1.29.0. +* `20/05/23` [fix] BusUtils#postSticky times not right. Publish v1.28.6. +* `20/05/22` [add] IntentUtils#getInstallAppIntent support Uri param. +* `20/05/21` [add] Publish bus plugin v2.6. Publish api plugin v1.4. Publish. Publish v1.28.5. +* `20/05/19` [fix] FileUtils#copyOrMoveDird NPE. +* `20/05/18` [add] IntentUtils#getLaunchAppDetailsSettingsIntent support isNewTask. +* `20/05/17` [add] ImageUtils#save2Album, NetworkUtils#getSSID, UtilsTransActivity4MainProcess. +* `20/05/03` [add] Publish bus plugin v2.5. Publish api plugin v1.3. Publish. Publish v1.28.4. +* `20/04/30` [add] BaseItem support partialUpdate. +* `20/04/29` [add] Publish plugin lib com.blankj:base-transform:1.0. +* `20/04/28` [fix] LanguageUtils#applyLanguage. +* `20/04/27` [fix] BarUtils#isNavBarVisible. +* `20/04/26` [fix] Utils#init fit tinker. Publish v1.28.3. +* `20/04/25` [fix] UriUtils#uri2File Unknown URI. Publish 1.28.2. +* `20/04/24` [add] SnackbarUtils support show on the top; UriUtils#uri2InputStream. +* `20/04/23` [fix] UriUtils#uri2File not support HW; TransActivity crash below 21. +* `20/04/23` [fix] PhoneUtils#getSerial, PhoneUtils#getSerial crash on Android 10. +* `20/04/20` [fix] ImageUtils#isImage. +* `20/04/18` [fix] PermissionUtils#callback. Publish v1.28.1. +* `20/04/17` [fix] ImageUtils#view2Bitmap, ImageUtils.getBitmap(InputStream). +* `20/04/16` [add] ConvertUtils#int2HexString, hexString2Int. +* `20/04/15` [add] UiMessageUtils' demo. +* `20/04/13` [add] NumberUtils. Publish v1.28.0. +* `20/04/12` [opt] TimeUtils#SDF_THREAD_LOCAL. +* `20/04/11` [add] SDCardUtils#getXxTotalSize, SDCardUtils#getXxAvailableSize. FileUtils#getFsTotalSize, FileUtils#getFsAvailableSize. +* `20/04/10` [fix] FileUtils#isFileExists; FragmentUtils#getTop bug. Publish v1.27.6. +* `20/04/09` [add] UriUtils#res2Uri, UriUtils#uri2File support QQBrowser; ThreadUtils#getMainHandler; PathUtils#getxxPathExternalFirst. +* `20/04/08` [fix] ActivityUtils#finish bug. Publish v1.27.5. +* `20/04/08` [fix] CleanUtils clean dir not work. FileUtils#isFileExists. Publish v1.27.4. +* `20/04/08` [fix] CrashUtils DefaultUncaughtExceptionHandler is wrong; LogUtils write file failed; Utils#getApp failed run on remote process. Publish v1.27.3. +* `20/04/07` [mdf] GsonUtils#getGson() method public. +* `20/04/04` [fix] ShadowUtils bug running on lower version devices. Publish v1.27.2. +* `20/04/03` [fix] UtilsActivityLifecycleImpl#HashMap#remove IllegalStateException bug. +* `20/04/02` [fix] PathUtils sdcard enable state is wrong; ActivityUtils finish activity wrong; Publish v1.27.1. +* `20/03/31` [add] Publish v1.27.0. +* `20/03/30` [add] BatteryUtils in subutil. +* `20/03/27` [add] publish.gradle. +* `20/03/24` [add] UtilsBridge to clean the utils. +* `20/03/22` [upd] GsonUtils support custom gson. +* `20/03/20` [add] ActivityUtils#addActivityLifecycleCallbacks, ActivityUtils#removeActivityLifecycleCallbacks. +* `20/01/17` [upd] Leak Canary to v2.1. +* `20/01/06` [add] ClickUtils#expandClickArea, ClickUtils#back2HomeFriendly +* `19/11/30` [add] Publish bus plugin v2.4. Publish api plugin v1.2. * `19/11/28` [add] Publish v1.26.0. * `19/11/27` [add] Shadow demo. * `19/11/26` [add] MVP demo. @@ -49,6 +111,7 @@ * `19/04/24` [upd] The swipe panel. * `19/03/17` [fix] The ugly UI. * `19/03/14` [fix] AdaptScreenUtils didn't work on some HaWei tablet. +* `19/03/09` [fix] UriUtils#uri2File. * `19/03/08` [add] LogUtils support multi process. Publish v1.23.7. * `19/03/02` [fix] LogUtils#file. * `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6. diff --git a/README-CN.md b/README-CN.md index 59c3ff9950..5c85dca1fe 100644 --- a/README-CN.md +++ b/README-CN.md @@ -42,16 +42,14 @@ ## 打个小广告 -欢迎加入我的知识星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」,我会在星球中分享 [AucFrame](https://blankj.com/2019/07/22/auc-frame/) 框架、大厂面经、[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 更详尽的说明...一切我所了解的知识,你可以通过支付进入我的星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;**如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美+你的星球昵称)加我个人微信,方便我后续拉你进群(PS:进得越早价格越便宜)。** - -![我的二维码](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/wechat.png) +欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。 [logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame_cn.png -[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.26.0-brightgreen.svg +[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master [auc]: https://github.com/Blankj/AndroidUtilCode [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg diff --git a/README.md b/README.md index 65cc565ff2..9ae668e26e 100644 --- a/README.md +++ b/README.md @@ -42,16 +42,14 @@ If this project helps you a lot and you want to support the project's developmen ## 打个小广告 -欢迎加入我的知识星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」,我会在星球中分享 [AucFrame](https://blankj.com/2019/07/22/auc-frame/) 框架、大厂面经、[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 更详尽的说明...一切我所了解的知识,你可以通过支付进入我的星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;**如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美)加我个人微信,发送给我你的星球 ID,方便我后续拉你进群(PS:进得越早价格越便宜)。** - -![我的二维码](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/wechat.png) +欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。 [logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png -[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.26.0-brightgreen.svg +[aucSvg]: https://github.com/Blankj/AndroidUtilCode/workflows/Android%20CI/badge.svg?branch=master [auc]: https://github.com/Blankj/AndroidUtilCode [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg diff --git a/art/wechat.png b/art/wechat.png deleted file mode 100644 index e166a4783f..0000000000 Binary files a/art/wechat.png and /dev/null differ diff --git a/build.gradle b/build.gradle index 04628ed39a..e0f0f36c87 100644 --- a/build.gradle +++ b/build.gradle @@ -2,53 +2,25 @@ buildscript { ConfigUtils.init(gradle) repositories { - // use for debug plugin local - if (Config.depConfig.plugin_bus.useLocal || Config.depConfig.plugin_api.useLocal) { - maven() { - url new File("maven") - } - } - maven { - url 'https://maven.aliyun.com/repository/public' - name 'replace jcenter() and mavenCentral()' - } - maven { - url 'https://maven.aliyun.com/repository/jcenter' - name 'replace jcenter()' - } - maven { - url 'https://maven.aliyun.com/repository/google' - name 'replace google()' - } + mavenLocal() google() + mavenCentral() jcenter() } dependencies { for (def entrySet : ConfigUtils.getApplyPlugins().entrySet()) { - classpath entrySet.value.dep + classpath entrySet.value.path } } } allprojects { repositories { - maven { - url 'https://maven.aliyun.com/repository/public' - name 'replace jcenter() and mavenCentral()' - } - maven { - url 'https://maven.aliyun.com/repository/jcenter' - name 'replace jcenter()' - } - maven { - url 'https://maven.aliyun.com/repository/google' - name 'replace google()' - } - maven { - url "https://jitpack.io/" - } + mavenLocal() + maven { url "https://jitpack.io/" } google() + mavenCentral() jcenter() } @@ -56,9 +28,9 @@ allprojects { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' resolutionStrategy.eachDependency { - if (it.requested.group == 'com.android.support' - && !it.requested.name.contains('multidex')) { - it.useVersion Config.support_version + if (it.requested.group == 'com.android.support' && !it.requested.name.contains( + 'multidex')) { + it.useVersion Config.supportVersion } } } @@ -66,4 +38,4 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir -} +} \ No newline at end of file diff --git a/buildApp.gradle b/buildApp.gradle index e9cdd3ad72..93f0b9b1d4 100644 --- a/buildApp.gradle +++ b/buildApp.gradle @@ -1,53 +1,44 @@ +apply plugin: "com.android.application" + apply { - plugin "com.android.application" - plugin "kotlin-android" - plugin "kotlin-android-extensions" - if (Config.depConfig.plugin_bus.isApply) { - plugin Config.depConfig.plugin_bus.pluginId + from "${rootDir.path}/buildCommon.gradle" + from "${rootDir.path}/config/flavor.gradle" + if (Config.plugins.plugin_api.isApply) { + plugin Config.plugins.plugin_api.id } - if (Config.depConfig.plugin_api.isApply) { - plugin Config.depConfig.plugin_api.pluginId + if (Config.plugins.plugin_bus.isApply) { + plugin Config.plugins.plugin_bus.id } } configSigning() configApkName() -if (Config.depConfig.plugin_bus.isApply) { - bus { - onlyScanLibRegex = '^([:]|(com\\.blankj)).+$' - } -} - -if (Config.depConfig.plugin_api.isApply) { - api { - onlyScanLibRegex = '^([:]|(com\\.blankj)).+$' - } -} +//if (PluginConfig.plugin_bus.isApply) { +// bus { +// onlyScanLibRegex = '^([:]|(com\\.blankj)).+$' +// } +//} +// +//if (PluginConfig.plugin_api.isApply) { +// api { +// onlyScanLibRegex = '^([:]|(com\\.blankj)).+$' +// } +//} android { - compileSdkVersion Config.compileSdkVersion defaultConfig { - minSdkVersion Config.minSdkVersion - versionCode Config.versionCode - versionName Config.versionName applicationId Config.applicationId + suffix targetSdkVersion Config.targetSdkVersion multiDexEnabled true } buildTypes { - debug { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - applicationIdSuffix ".debug" - resValue "string", "app_name", Config.appName + suffix + ".debug" - } + debug {} release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - resValue "string", "app_name", Config.appName + suffix } } @@ -61,31 +52,42 @@ android { maxProcessCount 8 dexInProcess = true } -} + productFlavors { + dev { + applicationIdSuffix ".dev" + versionNameSuffix "-dev" + resValue "string", "app_name", Config.appName + suffix + "-dev" + } + + production { + resValue "string", "app_name", Config.appName + suffix + } + } +} dependencies { // LeakCanary - debugImplementation Config.depConfig.leakcanary_android.dep - debugImplementation Config.depConfig.leakcanary_support_fragment.dep - releaseImplementation Config.depConfig.leakcanary_android_no_op.dep + debugImplementation Config.libs.leakcanary.path - debugImplementation Config.depConfig.lib_utildebug.dep - releaseImplementation Config.depConfig.lib_utildebug_no_op.dep + debugImplementation Config.modules.lib_utildebug.dep + releaseImplementation Config.modules.lib_utildebug_no_op.dep // 根据 Config.pkgConfig 来依赖所有 pkg for (def entrySet : ConfigUtils.getApplyPkgs().entrySet()) { api entrySet.value.dep } - if (Config.depConfig.feature_mock.isApply) { - api Config.depConfig.feature_mock.dep + if (Config.modules.feature_mock.isApply) { + api ModuleConfig.modules.feature_mock.dep } } def getSuffix() { - if (project.path == ":feature:launcher:app") return "" - return project.path.replace(":", "_").substring(":feature".length(), project.path.length() - ":app".length()) + if (project.name == "feature_launcher_app") return "" + return "." + project. + name. + substring("feature_".length(), project.name.length() - "_app".length()) } def configSigning() { @@ -115,12 +117,14 @@ def configApkName() { if (variant.buildType.name != "debug") { def artifact = variant.getPackageApplicationProvider().get() artifact.outputDirectory = new File("${rootDir.path}/apk") - artifact.outputScope.apkDatas.forEach { apkData -> - apkData.outputFileName = "util" + suffix + - (variant.flavorName == "" ? "" : ("_" + variant.flavorName)) + - "_" + variant.versionName.replace(".", "_") + - "_" + variant.buildType.name + - ".apk" + variant.outputs.each { + it.outputFileName = "util" + suffix + + (variant.flavorName == "" ? "" : ("_" + variant.flavorName)) + + "_" + + variant.versionName.replace(".", "_") + + "_" + + variant.buildType.name + + ".apk" } } } diff --git a/buildCommon.gradle b/buildCommon.gradle new file mode 100644 index 0000000000..2cba3ffea2 --- /dev/null +++ b/buildCommon.gradle @@ -0,0 +1,30 @@ +apply { + plugin "kotlin-android" + plugin "kotlin-android-extensions" +} + +android { + compileSdkVersion Config.compileSdkVersion + defaultConfig { + minSdkVersion Config.minSdkVersion + versionCode Config.versionCode + versionName Config.versionName + consumerProguardFiles 'proguard-rules.pro' + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } +} \ No newline at end of file diff --git a/buildLib.gradle b/buildLib.gradle index 6dc9b18b2b..aed207cbee 100644 --- a/buildLib.gradle +++ b/buildLib.gradle @@ -1,43 +1,13 @@ -apply { - plugin "com.android.library" - plugin "kotlin-android" - plugin "kotlin-android-extensions" -} - -android { - compileSdkVersion Config.compileSdkVersion - defaultConfig { - minSdkVersion Config.minSdkVersion - versionCode Config.versionCode - versionName Config.versionName - consumerProguardFiles 'proguard-rules.pro' - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - consumerProguardFiles 'proguard-rules.pro' - } - } - - lintOptions { - abortOnError false - } -} - -afterEvaluate { - generateReleaseBuildConfig.enabled = false - generateDebugBuildConfig.enabled = false -} +apply plugin: "com.android.library" +apply from: "${rootDir.path}/buildCommon.gradle" dependencies { - if (project.name == 'pkg' || project.name == 'mock') { + if (project.name.endsWith("_pkg") || project.name.endsWith("_mock")) { // if module's name equals 'pkg', api all of export for (def entrySet : ConfigUtils.getApplyExports().entrySet()) { api entrySet.value.dep } - } else if (project.name == 'export') { - api Config.depConfig.lib_common.dep + } else if (project.name.endsWith("_export")) { + api Config.modules.lib_common.dep } } \ No newline at end of file diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 37285c1c20..349aed4fec 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -12,12 +12,12 @@ gradlePlugin { plugins { readmeCore { id = 'readme-core' - implementationClass = 'com.blankj.plugin.ReadmeCorePlugin' + implementationClass = 'com.blankj.plugin.readme.ReadmeCorePlugin' } readmeSub { id = 'readme-sub' - implementationClass = 'com.blankj.plugin.ReadmeSubPlugin' + implementationClass = 'com.blankj.plugin.readme.ReadmeSubPlugin' } } } diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle new file mode 100644 index 0000000000..8a313c3b99 --- /dev/null +++ b/buildSrc/settings.gradle @@ -0,0 +1,8 @@ +//dependencyResolutionManagement { +// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) +// repositories { +// google() +// mavenCentral() +// jcenter() // Warning: this repository is going to shut down soon +// } +//} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index 4a24413e04..9a8d69d659 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -1,87 +1,89 @@ -/** - *
- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/07/13
- *     desc  :
- * 
- */ class Config { static applicationId = 'com.blankj.androidutilcode' static appName = 'Util' - static compileSdkVersion = 28 + static compileSdkVersion = 29 static minSdkVersion = 14 - static targetSdkVersion = 28 - static versionCode = 1_026_001 - static versionName = '1.26.1'// E.g. 1.9.72 => 1,009,072 + static targetSdkVersion = 29 + static versionCode = 1_031_001 + static versionName = '1.31.1'// E.g. 1.9.72 => 1,009,072 // lib version - static kotlin_version = '1.3.50' - static support_version = '28.0.0' - static leakcanary_version = '1.6.3' + static gradlePluginVersion = '4.1.0' + static kotlinVersion = '1.3.72' + static androidxVersion = '1.0.0' - static depConfig = [ - /*Never delete this line*/ - /*Generated by "config.json"*/ - plugin_api_gradle_plugin : new DepConfig(false, true, ":plugin:api-gradle-plugin"), - plugin_bus_gradle_plugin : new DepConfig(false, true, ":plugin:bus-gradle-plugin"), - feature_mock : new DepConfig(false, true, ":feature:mock"), - feature_launcher_app : new DepConfig(true, true, ":feature:launcher:app"), - feature_main_app : new DepConfig(false, true, ":feature:main:app"), - feature_main_pkg : new DepConfig(true, true, ":feature:main:pkg"), - feature_subutil_app : new DepConfig(false, true, ":feature:subutil:app"), - feature_subutil_pkg : new DepConfig(true, true, ":feature:subutil:pkg"), - feature_subutil_export : new DepConfig(true, true, ":feature:subutil:export"), - feature_utilcode_app : new DepConfig(false, true, ":feature:utilcode:app"), - feature_utilcode_pkg : new DepConfig(true, true, ":feature:utilcode:pkg"), - feature_utilcode_export : new DepConfig(true, true, ":feature:utilcode:export"), - lib_base : new DepConfig(true, true, ":lib:base"), - lib_common : new DepConfig(true, true, ":lib:common"), - lib_subutil : new DepConfig(true, true, ":lib:subutil"), - lib_utilcode : new DepConfig(true, true, ":lib:utilcode", "com.blankj:utilcode:1.26.0"), - lib_utildebug : new DepConfig(true, true, ":lib:utildebug", "com.blankj:utildebug:1.25.10-alpha5"), - lib_utildebug_no_op : new DepConfig(true, true, ":lib:utildebug-no-op", "com.blankj:utildebug-no-op:1.25.10-alpha5"), - /*Never delete this line*/ - plugin_gradle : new DepConfig(pluginPath: "com.android.tools.build:gradle:3.5.2"), - plugin_kotlin : new DepConfig(pluginPath: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"), - plugin_maven : new DepConfig(pluginPath: "com.github.dcendents:android-maven-gradle-plugin:2.1", pluginId: "com.github.dcendents.android-maven"),// 上传到 maven - plugin_bintray : new DepConfig(pluginPath: "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4", pluginId: "com.jfrog.bintray"),// 上传到 bintray - plugin_traute : new DepConfig(pluginPath: "tech.harmonysoft:traute-gradle:1.1.10", pluginId: "tech.harmonysoft.oss.traute"),// 注解转非空判断 + static modules = [ + /*Don't delete this line*/ + /*Generated by "module_config.json"*/ + plugin_api_gradle_plugin : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/api-gradle-plugin"), + plugin_bus_gradle_plugin : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/bus-gradle-plugin"), + plugin_lib_base_transform : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/lib/base-transform", remotePath: "com.blankj:base-transform:1.0"), + plugin_buildSrc_plugin : new ModuleConfig(isApply: true , useLocal: true , localPath: "./plugin/buildSrc-plugin"), + feature_mock : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/mock"), + feature_launcher_app : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/launcher/app"), + feature_main_app : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/main/app"), + feature_main_pkg : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/main/pkg"), + feature_subutil_app : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/subutil/app"), + feature_subutil_pkg : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/subutil/pkg"), + feature_subutil_export : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/subutil/export"), + feature_utilcode_app : new ModuleConfig(isApply: false, useLocal: true , localPath: "./feature/utilcode/app"), + feature_utilcode_pkg : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/utilcode/pkg"), + feature_utilcode_export : new ModuleConfig(isApply: true , useLocal: true , localPath: "./feature/utilcode/export", remotePath: "com.blankj:utilcode-export:1.1"), + lib_base : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/base"), + lib_common : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/common"), + lib_subutil : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/subutil"), + lib_utilcode : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"), + lib_utildebug : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug"), + lib_utildebug_no_op : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug-no-op"), + /*Don't delete this line*/ + ] + + static plugins = [ + plugin_gradle : new PluginConfig(path: "com.android.tools.build:gradle:$gradlePluginVersion"), + plugin_kotlin : new PluginConfig(path: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"), + // 上传到 maven + plugin_maven : new PluginConfig(path: "com.github.dcendents:android-maven-gradle-plugin:2.1", id: "com.github.dcendents.android-maven"), - // 本地第一次上传插件新的版本需设置 isApply = false, useLocal = true - // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false - // 发布版本的话把 isApply = false, useLocal = false,更新版本号,发布成功后 isApply = true 即可使用远程库版本 - plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.2", pluginId: "com.blankj.api"), - plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.4", pluginId: "com.blankj.bus"), + // 上传新版本插件更新 path 中的版本号,并设置 isApply = false + // 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件 + plugin_api : new PluginConfig(isApply: true, useLocal: false, path: "com.blankj:api-gradle-plugin:1.5", id: "com.blankj.api"), + //./gradlew clean :plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal + //./gradlew clean :plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter + plugin_bus : new PluginConfig(isApply: true, useLocal: false, path: "com.blankj:bus-gradle-plugin:2.6", id: "com.blankj.bus"), + //./gradlew clean :plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal + //./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter + plugin_buildSrc: new PluginConfig(isApply: false, useLocal: false, path: "com.blankj:buildSrc-plugin:1.0", id: "com.blankj.buildSrc"), + //./gradlew clean :plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal + //./gradlew clean :plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter + ] - support_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$support_version"), - support_design : new DepConfig("com.android.support:design:$support_version"), - support_multidex : new DepConfig("com.android.support:multidex:1.0.2"), - support_constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"), + static libs = [ + androidx_appcompat : new LibConfig(path: "androidx.appcompat:appcompat:$androidxVersion"), + androidx_material : new LibConfig(path: "com.google.android.material:material:$androidxVersion"), + androidx_multidex : new LibConfig(path: "androidx.multidex:multidex:2.0.0"), + androidx_constraint: new LibConfig(path: "androidx.constraintlayout:constraintlayout:1.1.3"), - kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"), + kotlin : new LibConfig(path: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"), - leakcanary_android : new DepConfig("com.squareup.leakcanary:leakcanary-android:$leakcanary_version"), - leakcanary_android_no_op : new DepConfig("com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version"), - leakcanary_support_fragment: new DepConfig("com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version"), + leakcanary : new LibConfig(path: "com.squareup.leakcanary:leakcanary-android:2.1"), - free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"), - swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), + free_proguard : new LibConfig(path: "com.blankj:free-proguard:1.0.2"), + swipe_panel : new LibConfig(path: "com.blankj:swipe-panel:1.2"), - gson : new DepConfig("com.google.code.gson:gson:2.8.6"), - glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"), - retrofit : new DepConfig("com.squareup.retrofit2:retrofit:2.4.0"), - commons_io : new DepConfig("commons-io:commons-io:2.6"), + gson : new LibConfig(path: "com.google.code.gson:gson:2.8.5"), + glide : new LibConfig(path: "com.github.bumptech.glide:glide:4.7.1"), + retrofit : new LibConfig(path: "com.squareup.retrofit2:retrofit:2.4.0"), + commons_io : new LibConfig(path: "commons-io:commons-io:2.6"), - eventbus_lib : new DepConfig("org.greenrobot:eventbus:3.1.1"), - eventbus_processor : new DepConfig("org.greenrobot:eventbus-annotation-processor:3.0.1"), + eventbus_lib : new LibConfig(path: "org.greenrobot:eventbus:3.1.1"), + eventbus_processor : new LibConfig(path: "org.greenrobot:eventbus-annotation-processor:3.0.1"), - photo_view : new DepConfig("com.github.chrisbanes:PhotoView:2.0.0"), + photo_view : new LibConfig(path: "com.github.chrisbanes:PhotoView:2.0.0"), - test_junit : new DepConfig("junit:junit:4.12"), - test_robolectric : new DepConfig("org.robolectric:robolectric:4.2"), + test_junit : new LibConfig(path: "junit:junit:4.12"), + test_robolectric : new LibConfig(path: "org.robolectric:robolectric:4.3.1"), ] } -//./gradlew clean :lib:utilcode:bintrayUpload \ No newline at end of file +//./gradlew clean :lib_utilcode:bintrayUpload \ No newline at end of file diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy index 4fc02f91a7..6a09d2f2d9 100644 --- a/buildSrc/src/main/groovy/ConfigUtils.groovy +++ b/buildSrc/src/main/groovy/ConfigUtils.groovy @@ -17,7 +17,6 @@ class ConfigUtils { generateDep(gradle) addCommonGradle(gradle) TaskDurationUtils.init(gradle) - GitUtils.init(gradle) } /** @@ -25,16 +24,12 @@ class ConfigUtils { */ private static void generateDep(Gradle gradle) { def configs = [:] - for (Map.Entry entry : Config.depConfig.entrySet()) { + for (Map.Entry entry : Config.modules.entrySet()) { def (name, config) = [entry.key, entry.value] - if (name.startsWith("plugin_")) { - config.dep = config.pluginPath + if (config.useLocal) { + config.dep = gradle.rootProject.findProject(name) } else { - if (config.useLocal) { - config.dep = gradle.rootProject.findProject(config.localPath) - } else { - config.dep = config.remotePath - } + config.dep = config.remotePath } configs.put(name, config) } @@ -46,20 +41,18 @@ class ConfigUtils { @Override void beforeEvaluate(Project project) { // 在 project 的 build.gradle 前 do sth. - if (project.subprojects.isEmpty()) { - if (project.path.contains(":plugin:")) { - return + if (project.name.contains("plugin")) { + return + } + if (project.name.endsWith("_app")) { + GLog.l(project.toString() + " applies buildApp.gradle") + project.apply { + from "${project.rootDir.path}/buildApp.gradle" } - if (project.name == "app") { - GLog.l(project.toString() + " applies buildApp.gradle") - project.apply { - from "${project.rootDir.path}/buildApp.gradle" - } - } else { - GLog.l(project.toString() + " applies buildLib.gradle") - project.apply { - from "${project.rootDir.path}/buildLib.gradle" - } + } else { + GLog.l(project.toString() + " applies buildLib.gradle") + project.apply { + from "${project.rootDir.path}/buildLib.gradle" } } } @@ -73,8 +66,8 @@ class ConfigUtils { static getApplyPlugins() { def plugins = [:] - for (Map.Entry entry : Config.depConfig.entrySet()) { - if (entry.value.isApply && entry.value.pluginPath != null) { + for (Map.Entry entry : Config.plugins.entrySet()) { + if (entry.value.isApply) { plugins.put(entry.key, entry.value) } } @@ -84,7 +77,7 @@ class ConfigUtils { static getApplyPkgs() { def pkgs = [:] - for (Map.Entry entry : Config.depConfig.entrySet()) { + for (Map.Entry entry : Config.modules.entrySet()) { if (entry.value.isApply && entry.key.endsWith("_pkg")) { pkgs.put(entry.key, entry.value) } @@ -95,7 +88,7 @@ class ConfigUtils { static getApplyExports() { def exports = [:] - for (Map.Entry entry : Config.depConfig.entrySet()) { + for (Map.Entry entry : Config.modules.entrySet()) { if (entry.value.isApply && entry.key.endsWith("_export")) { exports.put(entry.key, entry.value) } diff --git a/buildSrc/src/main/groovy/DepConfig.groovy b/buildSrc/src/main/groovy/DepConfig.groovy deleted file mode 100644 index bbef6505d5..0000000000 --- a/buildSrc/src/main/groovy/DepConfig.groovy +++ /dev/null @@ -1,89 +0,0 @@ -/** - *
- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/07/13
- *     desc  :
- * 
- */ -class DepConfig { - boolean isApply // 是否应用 - boolean useLocal // 是否使用本地的 - String localPath // 本地路径 - String remotePath// 远程路径 - String pluginPath// 插件路径 - String pluginId // 插件 ID - def dep // 根据条件生成项目最终的依赖项 - - DepConfig() { - isApply = true - } - - DepConfig(String path) { - this(true, path) - } - - DepConfig(boolean isApply, String path) { - if (path.startsWith(":")) { - this.useLocal = true - this.localPath = path - this.isApply = isApply - } else { - this.useLocal = false - this.remotePath = path - this.isApply = isApply - } - } - - DepConfig(boolean useLocal, String localPath, String remotePath) { - this(true, useLocal, localPath, remotePath) - } - - DepConfig(boolean isApply, boolean useLocal, String localPath) { - this(isApply, useLocal, localPath, null) - } - - DepConfig(boolean isApply, boolean useLocal, String localPath, String remotePath) { - this.isApply = isApply - this.useLocal = useLocal - this.localPath = localPath - this.remotePath = remotePath - } - - void setPluginPath(String pluginPath){ - this.pluginPath = pluginPath - this.remotePath = pluginPath - } - - String getPath() { - if (pluginPath != null) return pluginPath - return useLocal ? localPath : remotePath - } - - String getGroupId() { - String[] splits = remotePath.split(":") - return splits.length == 3 ? splits[0] : null - } - - String getArtifactId() { - String[] splits = remotePath.split(":") - return splits.length == 3 ? splits[1] : null - } - - String getVersion() { - String[] splits = remotePath.split(":") - return splits.length == 3 ? splits[2] : null - } - - @Override - String toString() { - return "{ isApply = ${getFlag(isApply)}" + - ", useLocal = ${getFlag(useLocal)}" + - (dep == null ? ", path = " + path : (", dep = " + dep)) + - " }" - } - - static String getFlag(boolean b) { - return b ? "✅" : "❌" - } -} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/GitUtils.groovy b/buildSrc/src/main/groovy/GitUtils.groovy deleted file mode 100644 index a78cb982d5..0000000000 --- a/buildSrc/src/main/groovy/GitUtils.groovy +++ /dev/null @@ -1,75 +0,0 @@ -import org.gradle.api.Action -import org.gradle.api.Project -import org.gradle.api.invocation.Gradle - -import java.text.SimpleDateFormat - -/** - *
- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/08/16
- *     desc  :
- * 
- */ -class GitUtils { - - private static String sCurBranchName; - - static void init(Gradle gradle) { - gradle.rootProject(new Action() { - @Override - void execute(Project project) { - sCurBranchName = getGitBranch() - addGitPushTask(project) - addGitPushAndMerge2MasterTask(project) - addGitNewBranchTask(project) - } - }) - } - - static def getGitBranch() { - return ShellUtils.execCmd('git symbolic-ref --short -q HEAD').successMsg - } - - static void addGitPushTask(Project project) { - project.task("gitPush").doLast { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd") - String date = simpleDateFormat.format(new Date()) - GLog.d(ShellUtils.execCmd([ - "git add -A", - "git commit -m \"see $date log\"", - "git push origin $sCurBranchName" - ] as String[])) - } - } - - static void addGitPushAndMerge2MasterTask(Project project) { - project.task("gitPushAndMerge2Master").doLast { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd") - String date = simpleDateFormat.format(new Date()) - GLog.d(ShellUtils.execCmd([ - "git add -A", - "git commit -m \"see $date log\"", - "git push origin $sCurBranchName", - "git checkout master", - "git merge $sCurBranchName", - "git push origin master", - "git checkout $sCurBranchName", - ] as String[])) - } - } - - static void addGitNewBranchTask(Project project) { - project.task("gitNewBranch").doLast { - GLog.d(ShellUtils.execCmd([ - "git checkout master", - "git checkout -b ${Config.versionName}", - "git push origin ${Config.versionName}:${Config.versionName}", - ] as String[])) - } - } -} -// ./gradlew gitPush -// ./gradlew gitPushAndMerge2Master -// ./gradlew gitNewBranch diff --git a/buildSrc/src/main/groovy/LibConfig.groovy b/buildSrc/src/main/groovy/LibConfig.groovy new file mode 100644 index 0000000000..6369553ba0 --- /dev/null +++ b/buildSrc/src/main/groovy/LibConfig.groovy @@ -0,0 +1,29 @@ +class LibConfig { + + String path + + String getGroupId() { + String[] splits = path.split(":") + return splits.length == 3 ? splits[0] : null + } + + String getArtifactId() { + String[] splits = path.split(":") + return splits.length == 3 ? splits[1] : null + } + + String getVersion() { + String[] splits = path.split(":") + return splits.length == 3 ? splits[2] : null + } + + @Override + String toString() { + return "LibConfig { path = $path }" + } + + static String getFlag(boolean b) { + return b ? "✅" : "❌" + } +} + diff --git a/buildSrc/src/main/groovy/ModuleConfig.groovy b/buildSrc/src/main/groovy/ModuleConfig.groovy new file mode 100644 index 0000000000..291abd8ffe --- /dev/null +++ b/buildSrc/src/main/groovy/ModuleConfig.groovy @@ -0,0 +1,35 @@ +class ModuleConfig { + + boolean isApply // 是否应用 + boolean useLocal // 是否使用本地的 + String localPath // 本地路径 + String remotePath // 远程路径 + def dep // 根据条件生成项目最终的依赖项 + + String getGroupId() { + String[] splits = remotePath.split(":") + return splits.length == 3 ? splits[0] : null + } + + String getArtifactId() { + String[] splits = remotePath.split(":") + return splits.length == 3 ? splits[1] : null + } + + String getVersion() { + String[] splits = remotePath.split(":") + return splits.length == 3 ? splits[2] : null + } + + @Override + String toString() { + return "ModuleConfig { isApply = ${getFlag(isApply)}" + + ", dep = " + dep + + " }" + } + + static String getFlag(boolean b) { + return b ? "✅" : "❌" + } +} + diff --git a/buildSrc/src/main/groovy/PluginConfig.groovy b/buildSrc/src/main/groovy/PluginConfig.groovy new file mode 100644 index 0000000000..3811c6a0ca --- /dev/null +++ b/buildSrc/src/main/groovy/PluginConfig.groovy @@ -0,0 +1,35 @@ +final class PluginConfig { + + boolean isApply = true // 是否应用 + boolean useLocal // 是否使用本地的 + String path // 插件路径 + String id // 插件 ID + + String getGroupId() { + String[] splits = path.split(":") + return splits.length == 3 ? splits[0] : null + } + + String getArtifactId() { + String[] splits = path.split(":") + return splits.length == 3 ? splits[1] : null + } + + String getVersion() { + String[] splits = path.split(":") + return splits.length == 3 ? splits[2] : null + } + + @Override + String toString() { + return "PluginConfig { isApply = ${getFlag(isApply)}" + + ", useLocal = ${getFlag(useLocal)}" + + ", path = " + path + + ", id = " + id + + " }" + } + + static String getFlag(boolean b) { + return b ? "✅" : "❌" + } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/ShellUtils.java b/buildSrc/src/main/groovy/ShellUtils.java deleted file mode 100644 index ef4917c68e..0000000000 --- a/buildSrc/src/main/groovy/ShellUtils.java +++ /dev/null @@ -1,228 +0,0 @@ -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.List; - -/** - *
- *     author: Blankj
- *     blog  : http://blankj.com
- *     time  : 2016/08/07
- *     desc  : utils about shell
- * 
- */ -public final class ShellUtils { - - private static final String LINE_SEP = System.getProperty("line.separator"); - - private ShellUtils() { - throw new UnsupportedOperationException("u can't instantiate me..."); - } - - /** - * Execute the command. - * - * @param command The command. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final String command) { - return execCmd(new String[]{command}, false, true); - } - - /** - * Execute the command. - * - * @param command The command. - * @param isRooted True to use root, false otherwise. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final String command, final boolean isRooted) { - return execCmd(new String[]{command}, isRooted, true); - } - - /** - * Execute the command. - * - * @param commands The commands. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final List commands) { - return execCmd(commands == null ? null : commands.toArray(new String[]{}), false, true); - } - - /** - * Execute the command. - * - * @param commands The commands. - * @param isRooted True to use root, false otherwise. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final List commands, final boolean isRooted) { - return execCmd(commands == null ? null : commands.toArray(new String[]{}), isRooted, true); - } - - /** - * Execute the command. - * - * @param commands The commands. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final String[] commands) { - return execCmd(commands, false, true); - } - - /** - * Execute the command. - * - * @param commands The commands. - * @param isRooted True to use root, false otherwise. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final String[] commands, final boolean isRooted) { - return execCmd(commands, isRooted, true); - } - - /** - * Execute the command. - * - * @param command The command. - * @param isRooted True to use root, false otherwise. - * @param isNeedResultMsg True to return the message of result, false otherwise. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final String command, - final boolean isRooted, - final boolean isNeedResultMsg) { - return execCmd(new String[]{command}, isRooted, isNeedResultMsg); - } - - /** - * Execute the command. - * - * @param commands The commands. - * @param isRooted True to use root, false otherwise. - * @param isNeedResultMsg True to return the message of result, false otherwise. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final List commands, - final boolean isRooted, - final boolean isNeedResultMsg) { - return execCmd(commands == null ? null : commands.toArray(new String[]{}), - isRooted, - isNeedResultMsg); - } - - /** - * Execute the command. - * - * @param commands The commands. - * @param isRooted True to use root, false otherwise. - * @param isNeedResultMsg True to return the message of result, false otherwise. - * @return the single {@link CommandResult} instance - */ - public static CommandResult execCmd(final String[] commands, - final boolean isRooted, - final boolean isNeedResultMsg) { - int result = -1; - if (commands == null || commands.length == 0) { - return new CommandResult(result, "", ""); - } - Process process = null; - BufferedReader successResult = null; - BufferedReader errorResult = null; - StringBuilder successMsg = null; - StringBuilder errorMsg = null; - DataOutputStream os = null; - try { - process = Runtime.getRuntime().exec(isRooted ? "su" : "sh"); - os = new DataOutputStream(process.getOutputStream()); - for (String command : commands) { - if (command == null) continue; - os.write(command.getBytes()); - os.writeBytes(LINE_SEP); - os.flush(); - } - os.writeBytes("exit" + LINE_SEP); - os.flush(); - result = process.waitFor(); - if (isNeedResultMsg) { - successMsg = new StringBuilder(); - errorMsg = new StringBuilder(); - successResult = new BufferedReader( - new InputStreamReader(process.getInputStream(), "UTF-8") - ); - errorResult = new BufferedReader( - new InputStreamReader(process.getErrorStream(), "UTF-8") - ); - String line; - if ((line = successResult.readLine()) != null) { - successMsg.append(line); - while ((line = successResult.readLine()) != null) { - successMsg.append(LINE_SEP).append(line); - } - } - if ((line = errorResult.readLine()) != null) { - errorMsg.append(line); - while ((line = errorResult.readLine()) != null) { - errorMsg.append(LINE_SEP).append(line); - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (os != null) { - os.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - try { - if (successResult != null) { - successResult.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - try { - if (errorResult != null) { - errorResult.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - if (process != null) { - process.destroy(); - } - } - return new CommandResult( - result, - successMsg == null ? "" : successMsg.toString(), - errorMsg == null ? "" : errorMsg.toString() - ); - } - - /** - * The result of command. - */ - public static class CommandResult { - public int result; - public String successMsg; - public String errorMsg; - - public CommandResult(final int result, final String successMsg, final String errorMsg) { - this.result = result; - this.successMsg = successMsg; - this.errorMsg = errorMsg; - } - - @Override - public String toString() { - return "result: " + result + "\n" + - "successMsg: " + successMsg + "\n" + - "errorMsg: " + errorMsg; - } - } -} diff --git a/buildSrc/src/main/groovy/TaskDurationUtils.groovy b/buildSrc/src/main/groovy/TaskDurationUtils.groovy index 48b2d2b6cc..6aacfcf30f 100644 --- a/buildSrc/src/main/groovy/TaskDurationUtils.groovy +++ b/buildSrc/src/main/groovy/TaskDurationUtils.groovy @@ -32,12 +32,17 @@ class TaskDurationUtils { @Override void afterExecute(Task task, TaskState state) { def exeDuration = System.currentTimeMillis() - task.ext.startTime - if (exeDuration >= 100) { + if (exeDuration >= 500) { taskInfoList.add(new TaskInfo(task: task, exeDuration: exeDuration)) } } }) grd.addBuildListener(new BuildListener() { + @Override + void beforeSettings(Settings settings) { + super.beforeSettings(settings) + } + @Override void buildStarted(Gradle gradle) {} diff --git a/buildSrc/src/main/java/com/blankj/plugin/FormatUtils.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy similarity index 96% rename from buildSrc/src/main/java/com/blankj/plugin/FormatUtils.groovy rename to buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy index bc82b9f0f6..f617ff2eae 100644 --- a/buildSrc/src/main/java/com/blankj/plugin/FormatUtils.groovy +++ b/buildSrc/src/main/java/com/blankj/plugin/readme/FormatUtils.groovy @@ -1,9 +1,9 @@ -package com.blankj.plugin +package com.blankj.plugin.readme class FormatUtils { static def LINE_SEP = System.getProperty("line.separator") - static def LONG_SPACE = " " + static def LONG_SPACE = " " static def format(File readmeCN) { def sb = new StringBuilder(), diff --git a/buildSrc/src/main/java/com/blankj/plugin/ReadmeCorePlugin.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy similarity index 76% rename from buildSrc/src/main/java/com/blankj/plugin/ReadmeCorePlugin.groovy rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy index 635523ac43..8f3cf47780 100644 --- a/buildSrc/src/main/java/com/blankj/plugin/ReadmeCorePlugin.groovy +++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeCorePlugin.groovy @@ -1,4 +1,4 @@ -package com.blankj.plugin +package com.blankj.plugin.readme import org.gradle.api.Plugin import org.gradle.api.Project @@ -30,11 +30,15 @@ class ReadmeCorePlugin implements Plugin { def sb = new StringBuilder() readmeCN.eachLine { line -> if (line.contains("* ###")) { - String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils")) - sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> "))) + if (line.contains("UtilsTransActivity")) { + sb.append(line) + } else { + String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils")) + sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> "))) + } } else if (line.contains(": ") && !line.contains("[")) { sb.append(line.substring(0, line.indexOf(':')).trim()) - } else if (line.contains("打个小广告") || line.contains("知识星球") || line.contains("我的二维码")) { + } else if (line.contains("打个小广告") || line.contains("基你太美")) { return } else { sb.append(line) diff --git a/buildSrc/src/main/java/com/blankj/plugin/ReadmeExtension.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy similarity index 68% rename from buildSrc/src/main/java/com/blankj/plugin/ReadmeExtension.groovy rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy index 91ca50af95..789e683c80 100644 --- a/buildSrc/src/main/java/com/blankj/plugin/ReadmeExtension.groovy +++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeExtension.groovy @@ -1,4 +1,4 @@ -package com.blankj.plugin +package com.blankj.plugin.readme class ReadmeExtension { diff --git a/buildSrc/src/main/java/com/blankj/plugin/ReadmeSubPlugin.groovy b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy similarity index 85% rename from buildSrc/src/main/java/com/blankj/plugin/ReadmeSubPlugin.groovy rename to buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy index 36af34934e..bade51bbf4 100644 --- a/buildSrc/src/main/java/com/blankj/plugin/ReadmeSubPlugin.groovy +++ b/buildSrc/src/main/java/com/blankj/plugin/readme/ReadmeSubPlugin.groovy @@ -1,11 +1,8 @@ -package com.blankj.plugin +package com.blankj.plugin.readme import org.gradle.api.Plugin import org.gradle.api.Project -import static FormatUtils.LINE_SEP - - class ReadmeSubPlugin implements Plugin { @Override @@ -30,9 +27,9 @@ class ReadmeSubPlugin implements Plugin { static def readmeOfSubUtil2Eng(File readmeCN, File readmeEng) { FormatUtils.format(readmeCN) def lines = readmeCN.readLines("UTF-8"), - sb = new StringBuilder("## How to use" + LINE_SEP - + LINE_SEP + - "You should copy the following classes which you want to use in your project." + LINE_SEP), + sb = new StringBuilder("## How to use" + FormatUtils.LINE_SEP + + FormatUtils.LINE_SEP + + "You should copy the following classes which you want to use in your project." + FormatUtils.LINE_SEP), i = 3, size = lines.size() for (; i < size; ++i) { @@ -45,7 +42,7 @@ class ReadmeSubPlugin implements Plugin { } else { sb.append(line) } - sb.append(LINE_SEP) + sb.append(FormatUtils.LINE_SEP) } readmeEng.write(sb.toString(), "UTF-8") } diff --git a/config.json b/config.json deleted file mode 100644 index 188e2ff509..0000000000 --- a/config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "appConfigDesc": "appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher", - "appConfig": ["launcher"], - "pkgConfigDesc": "pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空", - "pkgConfig": [], - "proConfigDesc": "proConfig 配置的是使用本地还是仓库,优先级低于 appConfig 和 pkgConfig", - "proConfig": [ - {"isApply": false, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"}, - {"isApply": false, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:mock"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:launcher:app"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:main:app"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:main:pkg"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:app"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:pkg"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:export"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:app"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:pkg"}, - {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:export"}, - {"isApply": true, "useLocal": true, "localPath": ":lib:base"}, - {"isApply": true, "useLocal": true, "localPath": ":lib:common"}, - {"isApply": true, "useLocal": true, "localPath": ":lib:subutil"}, - {"isApply": true, "useLocal": true, "localPath": ":lib:utilcode", "remotePath": "com.blankj:utilcode:1.26.0"}, - {"isApply": true, "useLocal": true, "localPath": ":lib:utildebug", "remotePath": "com.blankj:utildebug:1.25.10-alpha5"}, - {"isApply": true, "useLocal": true, "localPath": ":lib:utildebug-no-op", "remotePath": "com.blankj:utildebug-no-op:1.25.10-alpha5"} - ] -} diff --git a/config/flavor.gradle b/config/flavor.gradle new file mode 100644 index 0000000000..25c1801983 --- /dev/null +++ b/config/flavor.gradle @@ -0,0 +1,22 @@ +android { + flavorDimensions "env" + productFlavors { + dev { + dimension "env" + } + + production { + dimension "env" + } + } + + variantFilter { variant -> + def flavorNames = variant.flavors*.name + def buildTypeName = variant.buildType.name + + // production 包不允许 debug 构建 + if (flavorNames.contains("production") && buildTypeName.contains("debug")) { + variant.setIgnore(true) + } + } +} \ No newline at end of file diff --git a/config/publish.gradle b/config/publish.gradle new file mode 100644 index 0000000000..7608215123 --- /dev/null +++ b/config/publish.gradle @@ -0,0 +1,226 @@ +/* + 1. add + signing.keyId=xx + signing.password=xx + signing.secretKeyRingFile=/Users/xx/secring.gpg + ossrhUsername=xx + ossrhPassword=xx + in root local.properties + + 2. copy the file to the directory of gradle, and apply the file in the module + ext { + groupId = Config.modules.lib_utilcode.groupId + artifactId = Config.modules.lib_utilcode.artifactId + version = Config.modules.lib_utilcode.version + website = "https://github.com/Blankj/AndroidUtilCode" +} + apply from: "${rootDir.path}/config/publish.gradle" + + 3. execute following command to publish + ./gradlew :xxmodule:publish2Local -> upload to mavenLocal + ./gradlew :xxmodule:publish2Remote -> upload to mavenCentral +*/ + +apply plugin: 'maven-publish' +apply plugin: 'signing' + +ext.multiPublishMode = true + +File localPropertiesFile = project.rootProject.file("local.properties"); +if (!localPropertiesFile.exists()) { + return +} + +Properties properties = new Properties() +properties.load(new FileInputStream(localPropertiesFile)) +properties.each { name, value -> ext[name] = value } + +afterEvaluate { + def ext = project.ext + publishing { + publications { + release(MavenPublication) { + groupId ext.groupId + artifactId ext.artifactId + version ext.version + + if (isAndroidEnv(project)) { + if (project.ext.multiPublishMode) { + artifact("$buildDir/outputs/aar/${project.getName()}-release.aar") + artifact sourcesJar + } else { + from project.components.release + } + } else { + from project.components.java + } + + pom { + name = ext.artifactId + description = ext.artifactId + url = ext.website + + licenses { + license { + name = 'The Apache Software License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id = ext.ossrhUsername + name = ext.ossrhUsername + } + } + scm { + url = ext.website + connection = ext.website + developerConnection = ext.website + ".git" + } + + if (project.ext.multiPublishMode) { + withXml { + def dependenciesNode = asNode().getAt('dependencies')[0] ?: + asNode().appendNode('dependencies') + + configurations.api.getDependencies().each { + dep -> addDependency(project, dependenciesNode, dep, "compile") + } + configurations.implementation.getDependencies().each { + dep -> addDependency(project, dependenciesNode, dep, "runtime") + } + } + } + } + } + } + + repositories { + maven { + // s01 is newest + def releasesUrl = "https://s01.oss.sonatype.org/content/repositories/releases/" + def snapshotUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/" + url = version.toUpperCase().endsWith('SNAPSHOT') ? snapshotUrl : releasesUrl + + credentials { + username ossrhUsername + password ossrhPassword + } + } + } + } + + signing { + sign publishing.publications + } +} + +private void addDependency(Project project, def dependenciesNode, Dependency dep, String scope) { + if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified") { + return + } + + final dependencyNode = dependenciesNode.appendNode('dependency') + dependencyNode.appendNode('scope', scope) + + if (dep.version == 'unspecified') { + // 检测 module 中的 dependencies 是否有源码依赖 + // 如果是源码依赖,而且没有在 config 中配置 remotePath, + // 那么发布到仓库,其他地方依赖该库时会找不到源码的那个库 + println "publish -> module(unspecified) <${dep.group}:${dep.name}:${dep.version}>" + if (project.ext.groupId || project.ext.version) { + throw new GradleException("The module of <" + dep.name + "> should set groupId & version.") + } + // 源码依赖,但配置了 remotePath,让 pom 中写入 remotePath + println("publish -> module(wrapped) <${project.ext.groupId}:${name}:${project.ext.version}>") + + dependencyNode.appendNode('groupId', project.ext.pomGroupID) + dependencyNode.appendNode('artifactId', dep.name) + dependencyNode.appendNode('version', project.ext.pomVersion) + } else { + dependencyNode.appendNode('groupId', dep.group) + dependencyNode.appendNode('artifactId', dep.name) + dependencyNode.appendNode('version', dep.version) + println("publish -> library <${dep.group}:${dep.name}:${dep.version}>") + } + + if (!dep.transitive) { + // In case of non transitive dependency, + // all its dependencies should be force excluded from them POM file + final exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion') + exclusionNode.appendNode('groupId', '*') + exclusionNode.appendNode('artifactId', '*') + } else if (!dep.properties.excludeRules.empty) { + // For transitive with exclusions, all exclude rules should be added to the POM file + final exclusions = dependencyNode.appendNode('exclusions') + dep.properties.excludeRules.each { ExcludeRule rule -> + final exclusionNode = exclusions.appendNode('exclusion') + exclusionNode.appendNode('groupId', rule.group ?: '*') + exclusionNode.appendNode('artifactId', rule.module ?: '*') + } + } +} + +if (isAndroidEnv(project)) { + // This generates sources.jar + task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.source + } + + task javadoc(type: Javadoc) { + source = android.sourceSets.main.java.source + classpath += configurations.compile + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + } + + task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir + } +} else { + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + } + + task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir + } +} + +if (project.hasProperty("kotlin")) { + // Disable creating javadocs + project.tasks.withType(Javadoc) { + enabled = false + } +} + +javadoc { + options { + encoding "UTF-8" + charSet 'UTF-8' + author true + version project.ext.version + links "http://docs.oracle.com/javase/7/docs/api" + title "${project.ext.artifactId} ${project.ext.version}" + } +} + +artifacts { + archives javadocJar + archives sourcesJar +} + +static def isAndroidEnv(Project project) { + return project.getPlugins().hasPlugin('com.android.application') || project.getPlugins().hasPlugin('com.android.library') +} + +task publish2Local(type: GradleBuild) { + tasks = ['assemble', 'publishReleasePublicationToMavenLocal'] +} + +task publish2Remote(type: GradleBuild) { + tasks = ['assemble', 'publishReleasePublicationToMavenRepository'] +} \ No newline at end of file diff --git a/feature/launcher/app/build.gradle b/feature/launcher/app/build.gradle index 408db62a67..8f2b6d205d 100644 --- a/feature/launcher/app/build.gradle +++ b/feature/launcher/app/build.gradle @@ -1,5 +1,5 @@ apply plugin: 'kotlin-kapt' dependencies { - kapt Config.depConfig.eventbus_processor.dep + kapt Config.libs.eventbus_processor.path } \ No newline at end of file diff --git a/feature/launcher/app/src/main/AndroidManifest.xml b/feature/launcher/app/src/main/AndroidManifest.xml index 19f6313965..4f033c06a6 100644 --- a/feature/launcher/app/src/main/AndroidManifest.xml +++ b/feature/launcher/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:supportsRtl="true" android:theme="@style/AppTheme"> @@ -21,11 +18,6 @@ public static LauncherApp getInstance() { return sInstance; } - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - } - @Override public void onCreate() { super.onCreate(); diff --git a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt index 228abbf0a5..b00aba9585 100644 --- a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt +++ b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt @@ -2,16 +2,16 @@ package com.blankj.main.pkg import android.graphics.Color import android.os.Bundle -import android.support.v7.app.ActionBarDrawerToggle import android.view.View +import androidx.appcompat.app.ActionBarDrawerToggle import com.blankj.common.activity.CommonActivity import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.subutil.export.api.SubUtilApi import com.blankj.utilcode.export.api.UtilCodeApi -import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.ApiUtils import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.ClickUtils import com.blankj.utilcode.util.CollectionUtils import kotlinx.android.synthetic.main.activity_main.* @@ -47,10 +47,10 @@ class MainActivity : CommonActivity() { super.initView(savedInstanceState, contentView) setCommonItems(mainRv, CollectionUtils.newArrayList>( CommonItemClick(R.string.core_util, true) { - ApiUtils.getApi(UtilCodeApi::class.java).startUtilCodeActivity(this) + ApiUtils.getApi(UtilCodeApi::class.java)?.startUtilCodeActivity(this) }, CommonItemClick(R.string.sub_util, true) { - ApiUtils.getApi(SubUtilApi::class.java).startSubUtilActivity(this) + ApiUtils.getApi(SubUtilApi::class.java)?.startSubUtilActivity(this) } )) @@ -69,6 +69,6 @@ class MainActivity : CommonActivity() { } override fun onBackPressed() { - ActivityUtils.startHomeActivity() + ClickUtils.back2HomeFriendly("Press again to exit.") } } diff --git a/feature/main/pkg/src/main/res/layout/activity_main.xml b/feature/main/pkg/src/main/res/layout/activity_main.xml index a78e6dab8b..3a33dd0f8e 100644 --- a/feature/main/pkg/src/main/res/layout/activity_main.xml +++ b/feature/main/pkg/src/main/res/layout/activity_main.xml @@ -1,16 +1,16 @@ - - - - - - + + - - + diff --git a/feature/subutil/pkg/src/main/AndroidManifest.xml b/feature/subutil/pkg/src/main/AndroidManifest.xml index 3e6ea66c69..198eb5c31b 100644 --- a/feature/subutil/pkg/src/main/AndroidManifest.xml +++ b/feature/subutil/pkg/src/main/AndroidManifest.xml @@ -28,6 +28,10 @@ android:name=".feature.appStore.AppStoreActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTop" /> + > { + return CollectionUtils.newArrayList(titleItem) + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + BatteryUtils.registerBatteryStatusChangedListener(this) + } + + override fun onBatteryStatusChanged(status: BatteryUtils.Status) { + titleItem.title = status.toString() + ToastUtils.showShort(status.toString()) + } + + override fun onDestroy() { + super.onDestroy() + BatteryUtils.unregisterBatteryStatusChangedListener(this) + } +} diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt index ed7c028849..cc5c60f470 100644 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt +++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt @@ -3,13 +3,14 @@ package com.blankj.subutil.pkg.feature.dangerous import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemSwitch import com.blankj.subutil.pkg.Config import com.blankj.subutil.pkg.R -import com.blankj.subutil.pkg.helper.PermissionHelper import com.blankj.subutil.util.DangerousUtils +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.util.* /** @@ -24,16 +25,15 @@ class DangerousActivity : CommonActivity() { companion object { fun start(context: Context) { - PermissionHelper.requestStorageAndSms(object : PermissionHelper.OnPermissionGrantedListener { - override fun onPermissionGranted() { + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { val starter = Intent(context, DangerousActivity::class.java) context.startActivity(starter) } - }, object : PermissionHelper.OnPermissionDeniedListener { - override fun onPermissionDenied() { - start(context) + + override fun onDenied() { } - }) + }, PermissionConstants.STORAGE, PermissionConstants.SMS) } } @@ -87,13 +87,15 @@ class DangerousActivity : CommonActivity() { CommonItemClick(R.string.dangerous_reboot_to_bootloader) { ToastUtils.showShort(DangerousUtils.reboot2Bootloader().toString()) }, - CommonItemSwitch(R.string.dangerous_data_enabled, Utils.Func1 { - NetworkUtils.getMobileDataEnabled() - }, Utils.Func1 { - if (AppUtils.isAppSystem()) { - DangerousUtils.setMobileDataEnabled(it) - } - }), + CommonItemSwitch( + R.string.dangerous_data_enabled, + { NetworkUtils.getMobileDataEnabled() }, + { + if (AppUtils.isAppSystem()) { + DangerousUtils.setMobileDataEnabled(it) + } + } + ), CommonItemClick(R.string.dangerous_send_sms_silent) { DangerousUtils.sendSmsSilent("10000", "sendSmsSilent") } diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt index 8748a49a07..8f4217c96c 100755 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt +++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt @@ -6,11 +6,13 @@ import android.content.Intent import android.content.ServiceConnection import android.os.IBinder import com.blankj.common.activity.CommonActivity +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemTitle import com.blankj.subutil.pkg.R -import com.blankj.subutil.pkg.helper.PermissionHelper +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.PermissionUtils /** * ``` @@ -22,18 +24,25 @@ import com.blankj.utilcode.util.CollectionUtils */ class LocationActivity : CommonActivity() { + private var lastLatitude: String = "unknown" + private var lastLongitude: String = "unknown" + private var latitude: String = "unknown" + private var longitude: String = "unknown" + private var country: String = "unknown" + private var locality: String = "unknown" + private var street: String = "unknown" + companion object { fun start(context: Context) { - PermissionHelper.requestLocation(object : PermissionHelper.OnPermissionGrantedListener { - override fun onPermissionGranted() { + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { val starter = Intent(context, LocationActivity::class.java) context.startActivity(starter) } - }, object : PermissionHelper.OnPermissionDeniedListener { - override fun onPermissionDenied() { - start(context) + + override fun onDenied() { } - }) + }, PermissionConstants.LOCATION) } } @@ -47,18 +56,17 @@ class LocationActivity : CommonActivity() { mLocationService.setOnGetLocationListener(object : LocationService.OnGetLocationListener { override fun getLocation(lastLatitude: String, lastLongitude: String, latitude: String, longitude: String, country: String, locality: String, street: String) { + this@LocationActivity.apply { + this.lastLatitude = lastLatitude + this.lastLongitude = lastLongitude + this.latitude = latitude + this.longitude = longitude + this.country = country + this.locality = locality + this.street = street + } runOnUiThread { - itemsView.updateItems( - CollectionUtils.newArrayList>( - CommonItemTitle("lastLatitude", lastLatitude), - CommonItemTitle("lastLongitude", lastLongitude), - CommonItemTitle("latitude", latitude), - CommonItemTitle("longitude", longitude), - CommonItemTitle("getCountryName", country), - CommonItemTitle("getLocality", locality), - CommonItemTitle("getStreet", street) - ) - ) + itemsView.updateItems(bindItems()) } } }) @@ -71,13 +79,13 @@ class LocationActivity : CommonActivity() { override fun bindItems(): MutableList> { return CollectionUtils.newArrayList( - CommonItemTitle("lastLatitude", "unknown"), - CommonItemTitle("lastLongitude", "unknown"), - CommonItemTitle("latitude", "unknown"), - CommonItemTitle("longitude", "unknown"), - CommonItemTitle("getCountryName", "unknown"), - CommonItemTitle("getLocality", "unknown"), - CommonItemTitle("getStreet", "unknown") + CommonItemTitle("lastLatitude", lastLatitude), + CommonItemTitle("lastLongitude", lastLongitude), + CommonItemTitle("latitude", latitude), + CommonItemTitle("longitude", longitude), + CommonItemTitle("getCountryName", country), + CommonItemTitle("getLocality", locality), + CommonItemTitle("getStreet", street) ) } diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt deleted file mode 100644 index bb891aeb06..0000000000 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.blankj.subutil.pkg.helper - -import android.support.v4.app.FragmentActivity -import android.util.Pair -import android.view.View -import com.blankj.common.dialog.CommonDialogContent -import com.blankj.subutil.pkg.R -import com.blankj.utilcode.util.ActivityUtils -import com.blankj.utilcode.util.PermissionUtils -import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest -import com.blankj.utilcode.util.StringUtils - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2018/01/10 - * desc : helper about dialog - * ``` - */ -object DialogHelper { - - fun showRationaleDialog(shouldRequest: ShouldRequest) { - val topActivity = ActivityUtils.getTopActivity() ?: return - CommonDialogContent().init(topActivity as FragmentActivity?, - StringUtils.getString(android.R.string.dialog_alert_title), - StringUtils.getString(R.string.permission_rationale_message), - Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { - shouldRequest.again(true) - }), - Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { - shouldRequest.again(false) - })) - .show() - } - - fun showOpenAppSettingDialog() { - val topActivity = ActivityUtils.getTopActivity() ?: return - CommonDialogContent().init(topActivity as FragmentActivity?, - StringUtils.getString(android.R.string.dialog_alert_title), - StringUtils.getString(R.string.permission_denied_forever_message), - Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { - PermissionUtils.launchAppDetailsSettings() - }), - Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { - })) - .show() - } -} diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/PermissionHelper.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/PermissionHelper.kt deleted file mode 100644 index 0ace31c34a..0000000000 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/PermissionHelper.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.blankj.subutil.pkg.helper - -import com.blankj.utilcode.constant.PermissionConstants -import com.blankj.utilcode.util.LogUtils -import com.blankj.utilcode.util.PermissionUtils - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2018/01/06 - * desc : helper about permission - * ``` - */ -object PermissionHelper { - - fun requestStorageAndSms(listener: OnPermissionGrantedListener, - deniedListener: OnPermissionDeniedListener) { - request(listener, deniedListener, PermissionConstants.STORAGE, PermissionConstants.SMS) - } - - fun requestLocation(listener: OnPermissionGrantedListener, - deniedListener: OnPermissionDeniedListener) { - request(listener, deniedListener, PermissionConstants.LOCATION) - } - - private fun request(grantedListener: OnPermissionGrantedListener?, - deniedListener: OnPermissionDeniedListener?, - @PermissionConstants.Permission vararg permissions: String) { - PermissionUtils.permission(*permissions) - .rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) } - .callback(object : PermissionUtils.FullCallback { - override fun onGranted(permissionsGranted: List) { - LogUtils.d(permissionsGranted) - grantedListener?.onPermissionGranted() - } - - override fun onDenied(permissionsDeniedForever: List, permissionsDenied: List) { - LogUtils.d(permissionsDeniedForever, permissionsDenied) - if (!permissionsDeniedForever.isEmpty()) { - DialogHelper.showOpenAppSettingDialog() - return - } - deniedListener?.onPermissionDenied() - } - }) - .request() - } - - interface OnPermissionGrantedListener { - fun onPermissionGranted() - } - - interface OnPermissionDeniedListener { - fun onPermissionDenied() - } -} diff --git a/feature/subutil/pkg/src/main/res/values/strings.xml b/feature/subutil/pkg/src/main/res/values/strings.xml index 7e2ee1e5a0..e758c294a0 100644 --- a/feature/subutil/pkg/src/main/res/values/strings.xml +++ b/feature/subutil/pkg/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ App Store Demo + Battery Demo Country Demo Dangerous Demo LocationUtils Demo @@ -23,4 +24,6 @@ Reboot To Bootloader Send SMS Silent Mobile Data Enabled + + \ No newline at end of file diff --git a/feature/utilcode/export/build.gradle b/feature/utilcode/export/build.gradle index e69de29bb2..30e59272ee 100644 --- a/feature/utilcode/export/build.gradle +++ b/feature/utilcode/export/build.gradle @@ -0,0 +1,8 @@ +ext { + groupId = Config.modules.feature_utilcode_export.groupId + artifactId = Config.modules.feature_utilcode_export.artifactId + version = Config.modules.feature_utilcode_export.version + website = "https://github.com/Blankj/AndroidUtilCode" +} +//apply from: "${rootDir.path}/config/publish.gradle" +//./gradlew :feature_utilcode_export:mavenLocal // 上传到本地 mavenLocal \ No newline at end of file diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml index c89d06353c..8da0667a23 100644 --- a/feature/utilcode/pkg/src/main/AndroidManifest.xml +++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + @@ -17,6 +18,7 @@ + @@ -138,10 +140,18 @@ android:name=".feature.click.ClickActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTop" /> + + + + android:value="D1234567890123456789012345678901234567890" /> + + (R.id.utilActionLoadingMsgTv).text = "Trans Activity is showing..." + } + }) + }, + CommonItemClick(R.string.demo_uiMessage, true) { + UiMessageActivity.start(this) + }, CommonItemClick(R.string.demo_vibrate, true) { VibrateActivity.start(this) + }, + CommonItemClick(R.string.demo_volume, true) { + VolumeActivity.start(this) } ) } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + LogUtils.e(requestCode, requestCode) + } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt index 96f2e5a7bf..97023b94c2 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt @@ -4,8 +4,8 @@ import android.content.Context import android.content.Intent import android.graphics.drawable.BitmapDrawable import android.os.Bundle -import android.support.v4.app.ActivityOptionsCompat import android.widget.ImageView +import androidx.core.app.ActivityOptionsCompat import com.blankj.base.rv.ItemViewHolder import com.blankj.common.activity.CommonActivity import com.blankj.common.item.CommonItem @@ -53,6 +53,7 @@ class ActivityActivity : CommonActivity() { CommonItemTitle("isActivityExists(${SubActivityActivity::class.java.name})", ActivityUtils.isActivityExists(AppUtils.getAppPackageName(), SubActivityActivity::class.java.name).toString()), CommonItemTitle("getLauncherActivity", ActivityUtils.getLauncherActivity(AppUtils.getAppPackageName())), CommonItemTitle("getMainActivities", ActivityUtils.getMainActivities().toString()), + CommonItemTitle("getActivityList", CollectionUtils.collect(ActivityUtils.getActivityList()) { input -> input.javaClass.simpleName }.toString()), CommonItemTitle("getTopActivity", ActivityUtils.getTopActivity().toString()), CommonItemTitle("isActivityExistsInStack", ActivityUtils.isActivityExistsInStack(CoreUtilActivity::class.java).toString()), CommonItemImage("getActivityIcon") { @@ -143,6 +144,9 @@ class ActivityActivity : CommonActivity() { CommonItemClick(R.string.activity_finish_to_activity, true) { ActivityUtils.finishToActivity(CoreUtilActivity::class.java, false, true) }, + CommonItemClick(R.string.activity_finish_all_activities_except_newest, true) { + ActivityUtils.finishAllActivitiesExceptNewest() + }, CommonItemClick(R.string.activity_finish_all_activities, true) { ActivityUtils.finishAllActivities() } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt index 9c972d6234..3505709cd2 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt @@ -3,7 +3,7 @@ package com.blankj.utilcode.pkg.feature.activity import android.app.Activity import android.content.Intent import android.os.Bundle -import android.support.v4.app.ActivityCompat +import androidx.core.app.ActivityCompat import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt index 6f312e4cd9..f00eedc77c 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt @@ -9,6 +9,8 @@ import android.view.WindowManager import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.AdaptScreenUtils +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.LogUtils class AdaptHeightActivity : CommonActivity() { @@ -28,6 +30,11 @@ class AdaptHeightActivity : CommonActivity() { window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } + override fun onResume() { + super.onResume() + LogUtils.e(BarUtils.getStatusBarHeight()) + } + override fun getResources(): Resources { return AdaptScreenUtils.adaptHeight(super.getResources(), 1920) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt index a6035dc038..9219c75bb5 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt @@ -3,8 +3,6 @@ package com.blankj.utilcode.pkg.feature.adaptScreen import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt index 336176a321..8e11495b09 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/ApiActivity.kt @@ -3,8 +3,6 @@ package com.blankj.utilcode.pkg.feature.api import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R @@ -34,13 +32,13 @@ class ApiActivity : CommonActivity() { return R.string.demo_api } - override fun bindItems(): List> { + override fun bindItems(): MutableList> { return CollectionUtils.newArrayList( CommonItemClick(R.string.api_invoke_with_params) { - ApiUtils.getApi(OtherModuleApi::class.java).invokeWithParams(OtherModuleApi.ApiBean("params")) + ApiUtils.getApi(OtherModuleApi::class.java)?.invokeWithParams(OtherModuleApi.ApiBean("params")) }, CommonItemClick(R.string.api_invoke_with_return_value) { - ToastUtils.showShort(ApiUtils.getApi(OtherModuleApi::class.java).invokeWithReturnValue().name) + ToastUtils.showShort(ApiUtils.getApi(OtherModuleApi::class.java)?.invokeWithReturnValue()?.name) } ); } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt index 4b6aa485ce..21eb351146 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt @@ -1,17 +1,14 @@ package com.blankj.utilcode.pkg.feature.app +import android.app.Activity import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView -import com.blankj.common.item.CommonItem -import com.blankj.common.item.CommonItemClick -import com.blankj.common.item.CommonItemImage -import com.blankj.common.item.CommonItemTitle +import com.blankj.common.helper.PermissionHelper +import com.blankj.common.item.* +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.pkg.Config import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.pkg.helper.PermissionHelper import com.blankj.utilcode.util.* /** @@ -22,20 +19,21 @@ import com.blankj.utilcode.util.* * desc : demo about AppUtils * ``` */ -class AppActivity : CommonActivity() { +class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener { + + var isRegisterAppStatusChangedListener: Boolean = false companion object { fun start(context: Context) { - PermissionHelper.requestStorage(object : PermissionHelper.OnPermissionGrantedListener { - override fun onPermissionGranted() { + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { val starter = Intent(context, AppActivity::class.java) context.startActivity(starter) } - }, object : PermissionHelper.OnPermissionDeniedListener { - override fun onPermissionDenied() { - start(context) + + override fun onDenied() { } - }) + }, PermissionConstants.STORAGE) } } @@ -49,62 +47,102 @@ class AppActivity : CommonActivity() { return R.string.demo_app } - override fun bindItems(): List> { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + LogUtils.e(requestCode, resultCode) + } + + override fun bindItems(): MutableList> { return CollectionUtils.newArrayList( - CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()), - CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()), - CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()), - CommonItemTitle("isAppForeground", AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString()), - CommonItemTitle("isAppRunning", AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString()), - CommonItemImage("getAppIcon") { - it.setImageDrawable(AppUtils.getAppIcon()) - }, - CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()), - CommonItemTitle("getAppName", AppUtils.getAppName()), - CommonItemTitle("getAppPath", AppUtils.getAppPath()), - CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()), - CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()), - CommonItemTitle("getAppSignatureSHA1", AppUtils.getAppSignatureSHA1()), - CommonItemTitle("getAppSignatureSHA256", AppUtils.getAppSignatureSHA256()), - CommonItemTitle("getAppSignatureMD5", AppUtils.getAppSignatureMD5()), - CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()), - CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()), - - CommonItemClick(R.string.app_install) { - if (AppUtils.isAppInstalled(Config.TEST_PKG)) { - ToastUtils.showShort(R.string.app_install_tips) + CommonItemSwitch( + "registerAppStatusChangedListener", + { isRegisterAppStatusChangedListener }, + { + isRegisterAppStatusChangedListener = it + if (it) { + AppUtils.registerAppStatusChangedListener(this) } else { - if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) { - ReleaseInstallApkTask(listener).execute() - } else { - listener.onReleased() - } + AppUtils.unregisterAppStatusChangedListener(this) } - }, - CommonItemClick(R.string.app_uninstall) { - if (AppUtils.isAppInstalled(Config.TEST_PKG)) { - AppUtils.uninstallApp(Config.TEST_PKG) + }), + CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()), + CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()), + CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()), + CommonItemTitle( + "isAppForeground", + AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString() + ), + CommonItemTitle( + "isAppRunning", + AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString() + ), + CommonItemImage("getAppIcon") { + it.setImageDrawable(AppUtils.getAppIcon()) + }, + CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()), + CommonItemTitle("getAppName", AppUtils.getAppName()), + CommonItemTitle("getAppPath", AppUtils.getAppPath()), + CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()), + CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()), + CommonItemTitle("getAppMinSdkVersion", AppUtils.getAppMinSdkVersion().toString()), + CommonItemTitle("getAppTargetSdkVersion", AppUtils.getAppTargetSdkVersion().toString()), + CommonItemTitle("getAppSignaturesSHA1", AppUtils.getAppSignaturesSHA1().toString()), + CommonItemTitle("getAppSignaturesSHA256", AppUtils.getAppSignaturesSHA256().toString()), + CommonItemTitle("getAppSignaturesMD5", AppUtils.getAppSignaturesMD5().toString()), + CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()), + CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()), + + CommonItemClick(R.string.app_install) { + if (AppUtils.isAppInstalled(Config.TEST_PKG)) { + ToastUtils.showShort(R.string.app_install_tips) + } else { + if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) { + ReleaseInstallApkTask(listener).execute() } else { - ToastUtils.showShort(R.string.app_uninstall_tips) + listener.onReleased() } - }, - CommonItemClick(R.string.app_launch) { - AppUtils.launchApp(this.packageName) - }, - CommonItemClick(R.string.app_relaunch) { - AppUtils.relaunchApp() - }, - CommonItemClick(R.string.app_launch_details_settings, true) { - AppUtils.launchAppDetailsSettings() - }, - CommonItemClick(R.string.app_exit) { - AppUtils.exitApp() } + }, + CommonItemClick(R.string.app_uninstall) { + if (AppUtils.isAppInstalled(Config.TEST_PKG)) { + AppUtils.uninstallApp(Config.TEST_PKG) + } else { + ToastUtils.showShort(R.string.app_uninstall_tips) + } + }, + CommonItemClick(R.string.app_launch) { + AppUtils.launchApp(this.packageName) + }, + CommonItemClick(R.string.app_relaunch) { + AppUtils.relaunchApp() + }, + CommonItemClick(R.string.app_launch_details_settings, true) { + AppUtils.launchAppDetailsSettings() + }, + CommonItemClick(R.string.app_exit) { + AppUtils.exitApp() + } ) } + + override fun onForeground(activity: Activity) { + ToastUtils.showShort("onForeground\n${activity.javaClass.simpleName}") + } + + override fun onBackground(activity: Activity) { + ToastUtils.showShort("onBackground\n${activity.javaClass.simpleName}") + } + + override fun onDestroy() { + super.onDestroy() + if (isRegisterAppStatusChangedListener) { + AppUtils.unregisterAppStatusChangedListener(this) + } + } } -class ReleaseInstallApkTask(private val mListener: OnReleasedListener) : ThreadUtils.SimpleTask() { +class ReleaseInstallApkTask(private val mListener: OnReleasedListener) : + ThreadUtils.SimpleTask() { override fun doInBackground() { ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt index 2950c2bf5d..48a738ecd7 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt @@ -12,7 +12,6 @@ import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BarUtils import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.ColorUtils -import com.blankj.utilcode.util.Utils /** * ``` @@ -41,32 +40,43 @@ class BarNavActivity : CommonActivity() { add(CommonItemTitle("isSupportNavBar", BarUtils.isSupportNavBar().toString())) if (BarUtils.isSupportNavBar()) { add(CommonItemSwitch( - R.string.bar_nav_visibility, - Utils.Func1 { - BarUtils.isNavBarVisible(this@BarNavActivity) - }, - Utils.Func1 { - BarUtils.setNavBarVisibility(this@BarNavActivity, it) - } + R.string.bar_nav_visibility, + { BarUtils.isNavBarVisible(this@BarNavActivity) }, + { BarUtils.setNavBarVisibility(this@BarNavActivity, it) } )) add(CommonItemSwitch( - R.string.bar_nav_light_mode, - Utils.Func1 { - BarUtils.isNavBarLightMode(this@BarNavActivity) - }, - Utils.Func1 { - BarUtils.setNavBarLightMode(this@BarNavActivity, it) - } + R.string.bar_nav_light_mode, + { BarUtils.isNavBarLightMode(this@BarNavActivity) }, + { BarUtils.setNavBarLightMode(this@BarNavActivity, it) } )) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - add(CommonItemClick("getNavBarColor: ${ColorUtils.int2ArgbString(BarUtils.getNavBarColor(this@BarNavActivity))}").setOnItemClickListener() { _, item, _ -> - BarUtils.setNavBarColor(this@BarNavActivity, ColorUtils.getRandomColor()) - itemsView.updateItems(bindItems()) - item.title = "getNavBarColor: ${ColorUtils.int2ArgbString(BarUtils.getNavBarColor(this@BarNavActivity))}" - }) + add( + CommonItemClick( + "getNavBarColor: ${ + ColorUtils.int2ArgbString( + BarUtils.getNavBarColor( + this@BarNavActivity + ) + ) + }" + ).setOnItemClickListener() { _, item, _ -> + BarUtils.setNavBarColor( + this@BarNavActivity, + ColorUtils.getRandomColor() + ) + itemsView.updateItems(bindItems()) + item.title = "getNavBarColor: ${ + ColorUtils.int2ArgbString( + BarUtils.getNavBarColor(this@BarNavActivity) + ) + }" + }) } + add(CommonItemClick("transparentNavBar").setOnItemClickListener() { _, item, _ -> + BarUtils.transparentNavBar(this@BarNavActivity) + }) } } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt index 5983365f83..da20870e79 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt @@ -37,21 +37,13 @@ class BarStatusActivity : CommonActivity() { CommonItemTitle("getStatusBarHeight", BarUtils.getStatusBarHeight().toString()), CommonItemSwitch( R.string.bar_status_visibility, - Utils.Func1 { - BarUtils.isStatusBarVisible(this) - }, - Utils.Func1 { - BarUtils.setStatusBarVisibility(this, it) - } + { BarUtils.isStatusBarVisible(this) }, + { BarUtils.setStatusBarVisibility(this, it) } ), CommonItemSwitch( R.string.bar_status_light_mode, - Utils.Func1 { - BarUtils.isStatusBarLightMode(this) - }, - Utils.Func1 { - BarUtils.setStatusBarLightMode(this, it) - } + { BarUtils.isStatusBarLightMode(this) }, + { BarUtils.setStatusBarLightMode(this, it) } ) ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt index b7464443bd..fa886e5be5 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt @@ -45,15 +45,15 @@ class BarStatusActivityAlpha : CommonActivity() { private fun getItems(): List> { return CollectionUtils.newArrayList>( - CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return mAlpha + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { mAlpha = progress updateStatusBar() } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }).apply { backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt index 2ddbc3c13f..d8e092d466 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt @@ -15,7 +15,6 @@ import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BarUtils import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.ColorUtils -import com.blankj.utilcode.util.Utils import kotlinx.android.synthetic.main.bar_status_drawer_activity.* @@ -61,37 +60,43 @@ class BarStatusActivityDrawer : CommonActivity() { return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) } - val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return mAlpha + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { mAlpha = progress updateStatusBar() } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }) return CollectionUtils.newArrayList( - CommonItemSwitch(R.string.bar_status_title_alpha, Utils.Func1 { - updateStatusBar() - return@Func1 mAlphaStatus - }, Utils.Func1 { - mAlphaStatus = it - if (mAlphaStatus) { - barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena) - commonItemAdapter.replaceItem(2, alphaItem, true) - } else { - barStatusDrawerRootLl.setBackgroundColor(Color.TRANSPARENT) - commonItemAdapter.replaceItem(2, randomColorItem, true) - } - }), - CommonItemSwitch(R.string.bar_status_is_front, Utils.Func1 { - return@Func1 mFrontStatus - }, Utils.Func1 { - mFrontStatus = it - updateStatusBar() - }), + CommonItemSwitch( + R.string.bar_status_title_alpha, + { + updateStatusBar() + mAlphaStatus + }, + { + mAlphaStatus = it + if (mAlphaStatus) { + barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena) + commonItemAdapter.replaceItem(2, alphaItem, true) + } else { + barStatusDrawerRootLl.setBackgroundColor(Color.TRANSPARENT) + commonItemAdapter.replaceItem(2, randomColorItem, true) + } + } + ), + CommonItemSwitch( + R.string.bar_status_is_front, + { mFrontStatus }, + { + mFrontStatus = it + updateStatusBar() + } + ), randomColorItem ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt index 533a40d7f5..86542caec5 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt @@ -44,15 +44,15 @@ class BarStatusActivityImageView : CommonActivity() { private fun getItems(): List> { return CollectionUtils.newArrayList>( - CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return mAlpha + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { mAlpha = progress updateStatusBar() } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }) ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt index d504987c93..6df145b5be 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt @@ -3,13 +3,13 @@ package com.blankj.utilcode.pkg.feature.bar.status.fragment import android.content.Context import android.content.Intent import android.os.Bundle -import android.support.design.widget.BottomNavigationView -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentPagerAdapter -import android.support.v4.view.ViewPager import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentPagerAdapter +import androidx.viewpager.widget.ViewPager import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R +import com.google.android.material.bottomnavigation.BottomNavigationView import kotlinx.android.synthetic.main.bar_status_fragment_activity.* import java.util.* @@ -37,7 +37,7 @@ class BarStatusFragmentActivity : CommonActivity() { R.id.barStatusFragmentNavigationCustom ) - private val mFragmentList = ArrayList() + private val mFragmentList = ArrayList() private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item -> when (item.itemId) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt index 15797fc505..ab368c0295 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt @@ -47,15 +47,15 @@ class BarStatusFragmentAlpha : CommonFragment() { private fun getItems(): List> { return CollectionUtils.newArrayList>( - CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return mAlpha + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { mAlpha = progress updateFakeStatusBar() } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }).apply { backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt index 54571b6ddd..686e50995c 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt @@ -46,15 +46,15 @@ class BarStatusFragmentImageView : CommonFragment() { private fun getItems(): List> { return CollectionUtils.newArrayList>( - CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return mAlpha + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { mAlpha = progress updateFakeStatusBar() } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }) ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt index b3afec2607..435a1ecbed 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt @@ -5,8 +5,6 @@ import android.content.Intent import android.os.Build import android.widget.SeekBar import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemSeekBar import com.blankj.common.item.CommonItemSwitch @@ -50,32 +48,28 @@ class BrightnessActivity : CommonActivity() { override fun bindItems(): MutableList> { return CollectionUtils.newArrayList( - CommonItemSeekBar("getBrightness", 255, BrightnessUtils.getBrightness(), object : SeekBar.OnSeekBarChangeListener { + CommonItemSeekBar("getBrightness", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return BrightnessUtils.getBrightness() + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { BrightnessUtils.setBrightness(progress) } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }), - CommonItemSeekBar("getWindowBrightness", 255, BrightnessUtils.getWindowBrightness(window), object : SeekBar.OnSeekBarChangeListener { + CommonItemSeekBar("getWindowBrightness", 255, object : CommonItemSeekBar.ProgressListener() { + override fun getCurValue(): Int { + return BrightnessUtils.getWindowBrightness(window) + } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { BrightnessUtils.setWindowBrightness(window, progress) } - - override fun onStartTrackingTouch(seekBar: SeekBar?) {} - - override fun onStopTrackingTouch(seekBar: SeekBar?) {} }), CommonItemSwitch( R.string.brightness_auto_brightness, - Utils.Func1 { - BrightnessUtils.isAutoBrightnessEnabled() - }, - Utils.Func1 { - BrightnessUtils.setAutoBrightnessEnabled(it) - } + { BrightnessUtils.isAutoBrightnessEnabled() }, + { BrightnessUtils.setAutoBrightnessEnabled(it) } ) ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt index 67279c131f..9bd7c870d0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt @@ -2,16 +2,15 @@ package com.blankj.utilcode.pkg.feature.bus import android.content.Context import android.content.Intent -import android.support.annotation.Keep +import androidx.annotation.Keep import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BusUtils import com.blankj.utilcode.util.CollectionUtils -import com.blankj.utilcode.util.Utils +import com.blankj.utilcode.util.ThreadUtils import kotlin.random.Random @@ -52,7 +51,7 @@ class BusActivity : CommonActivity() { @BusUtils.Bus(tag = TAG_IO, threadMode = BusUtils.ThreadMode.IO) fun testIo() { val currentThread = Thread.currentThread().toString() - Utils.runOnUiThread(Runnable { + ThreadUtils.runOnUiThread(Runnable { titleItem.title = currentThread }) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt index 7159b3e5a0..3064666c41 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt @@ -157,39 +157,47 @@ class BusCompareActivity : CommonActivity() { * 注销 10000 个订阅者,共执行 10 次取平均值 */ private fun compareUnregister10000Times() { - val tests = ArrayList() - for (i in 0..9999) { - val test = BusEvent() - EventBus.getDefault().register(test) - BusUtils.register(test) - tests.add(test) - } - - compareWithEventBus("Unregister 10000 times.", 10, 1, object : CompareCallback { - override fun runEventBus() { - for (test in tests) { - EventBus.getDefault().unregister(test) - } - } - - override fun runBusUtils() { - for (test in tests) { - BusUtils.unregister(test) - } - } - - override fun restState() { - for (test in tests) { + showLoading() + ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask>() { + override fun doInBackground(): List { + val tests = ArrayList() + for (i in 0..9999) { + val test = BusEvent() EventBus.getDefault().register(test) BusUtils.register(test) + tests.add(test) } + return tests } - }, object : OnFinishCallback { - override fun onFinish() { - for (test in tests) { - EventBus.getDefault().unregister(test) - BusUtils.unregister(test) - } + + override fun onSuccess(tests: List) { + compareWithEventBus("Unregister 10000 times.", 10, 1, object : CompareCallback { + override fun runEventBus() { + for (test in tests) { + EventBus.getDefault().unregister(test) + } + } + + override fun runBusUtils() { + for (test in tests) { + BusUtils.unregister(test) + } + } + + override fun restState() { + for (test in tests) { + EventBus.getDefault().register(test) + BusUtils.register(test) + } + } + }, object : OnFinishCallback { + override fun onFinish() { + for (test in tests) { + EventBus.getDefault().unregister(test) + BusUtils.unregister(test) + } + } + }) } }) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt index 7185cc33cb..f0b8620eca 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clean/CleanActivity.kt @@ -3,8 +3,6 @@ package com.blankj.utilcode.pkg.feature.clean import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R @@ -54,6 +52,11 @@ class CleanActivity : CommonActivity() { showSnackbar(CleanUtils.cleanExternalCache(), externalCacheDir?.absolutePath) }) } + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { + add(CommonItemClick(R.string.clean_app_user_data) { + CleanUtils.cleanAppUserData() + }) + } } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt index 79d408c2a0..7a6a112c15 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt @@ -2,9 +2,9 @@ package com.blankj.utilcode.pkg.feature.click import android.content.Context import android.content.Intent -import android.support.annotation.StringRes import android.view.View import android.widget.TextView +import androidx.annotation.StringRes import com.blankj.base.rv.ItemViewHolder import com.blankj.common.activity.CommonActivity import com.blankj.common.item.CommonItem @@ -34,22 +34,22 @@ class ClickActivity : CommonActivity() { override fun bindItems(): MutableList> { return CollectionUtils.newArrayList( - ClickItem(R.string.click_view_scale_default, Utils.Func1 { + ClickItem(R.string.click_view_scale_default, Utils.Consumer { ClickUtils.applyPressedViewScale(it) }), - ClickItem(R.string.click_view_scale_half, Utils.Func1 { + ClickItem(R.string.click_view_scale_half, Utils.Consumer { ClickUtils.applyPressedViewScale(it, -0.5f) }), - ClickItem(R.string.click_view_alpha_default, Utils.Func1 { + ClickItem(R.string.click_view_alpha_default, Utils.Consumer { ClickUtils.applyPressedViewAlpha(it) }), - ClickItem(R.string.click_bg_alpha_default, Utils.Func1 { - ClickUtils.applyPressedBgAlpha(it) + ClickItem(R.string.click_bg_alpha_default, Utils.Consumer { + ClickUtils.applyPressedBgAlpha(it, 0.6f) }), - ClickItem(R.string.click_bg_dark_default, Utils.Func1 { + ClickItem(R.string.click_bg_dark_default, Utils.Consumer { ClickUtils.applyPressedBgDark(it) }), - ClickItem(R.string.click_single_debouncing, Utils.Func1 { + ClickItem(R.string.click_single_debouncing, Utils.Consumer { ClickUtils.applyPressedBgDark(it) ClickUtils.applySingleDebouncing(it, 5000) { SnackbarUtils.with(mContentView) @@ -59,7 +59,7 @@ class ClickActivity : CommonActivity() { .show() } }), - ClickItem(R.string.click_global_debouncing, Utils.Func1 { + ClickItem(R.string.click_global_debouncing, Utils.Consumer { ClickUtils.applyPressedBgDark(it) ClickUtils.applySingleDebouncing(it, 5000) { SnackbarUtils.with(mContentView) @@ -69,7 +69,7 @@ class ClickActivity : CommonActivity() { .show() } }), - ClickItem(R.string.click_multi, Utils.Func1 { + ClickItem(R.string.click_multi, Utils.Consumer { ClickUtils.applyPressedBgDark(it) it.setOnClickListener(object : ClickUtils.OnMultiClickListener(5) { override fun onTriggerClick(v: View) { @@ -92,11 +92,11 @@ class ClickActivity : CommonActivity() { class ClickItem : CommonItem { - private val mFunc1: Utils.Func1; + private val mConsumer: Utils.Consumer; private val mTitle: String - constructor(@StringRes title: Int, func1: Utils.Func1) : super(R.layout.common_item_title_click) { - mFunc1 = func1 + constructor(@StringRes title: Int, consumer: Utils.Consumer) : super(R.layout.common_item_title_click) { + mConsumer = consumer mTitle = StringUtils.getString(title) } @@ -110,6 +110,6 @@ class ClickItem : CommonItem { .setDuration(SnackbarUtils.LENGTH_LONG) .show() } - mFunc1.call(holder.itemView) + mConsumer.accept(holder.itemView) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt new file mode 100644 index 0000000000..824fdf02ca --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt @@ -0,0 +1,76 @@ +package com.blankj.utilcode.pkg.feature.clipboard + +import android.content.Context +import android.content.Intent +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.common.item.CommonItemSwitch +import com.blankj.common.item.CommonItemTitle +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.ClipboardUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ToastUtils + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2020/09/11 + * desc : demo about ClipboardUtils + * ``` + */ +class ClipboardActivity : CommonActivity() { + + private var index: Int = 0 + private var isAddListener: Boolean = false + private var listener = { + ToastUtils.showShort(ClipboardUtils.getText()) + } + + companion object { + fun start(context: Context) { + val starter = Intent(context, ClipboardActivity::class.java) + context.startActivity(starter) + } + } + + override fun bindTitleRes(): Int { + return R.string.demo_clipboard + } + + override fun bindItems(): MutableList> { + return CollectionUtils.newArrayList( + CommonItemTitle("getText", ClipboardUtils.getText()), + CommonItemTitle("getLabel", ClipboardUtils.getLabel()), + CommonItemClick("copyText: value{$index}").setOnItemClickListener { _, _, _ -> + ClipboardUtils.copyText("value{${index++}}") + itemsView.updateItems(bindItems()) + }, + CommonItemClick("clear").setOnItemClickListener { _, _, _ -> + ClipboardUtils.clear() + itemsView.updateItems(bindItems()) + }, + CommonItemSwitch("clipChangeListener", { isAddListener }, { + isAddListener = it + if (isAddListener) { + ClipboardUtils.addChangedListener(listener) + } else { + ClipboardUtils.removeChangedListener(listener) + } + }) + ) + } + + override fun onResume() { + super.onResume() + itemsView.updateItems(bindItems()) + } + + override fun onDestroy() { + super.onDestroy() + if (isAddListener) { + ClipboardUtils.removeChangedListener(listener) + } + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt index ea68079605..d70fe14e93 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt @@ -4,8 +4,6 @@ import android.content.Context import android.content.Intent import android.os.Build import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R @@ -48,6 +46,9 @@ class DeviceActivity : CommonActivity() { add(CommonItemTitle("getABIs", Arrays.asList(*DeviceUtils.getABIs()).toString())) add(CommonItemTitle("isTablet", DeviceUtils.isTablet().toString())) add(CommonItemTitle("isEmulator", DeviceUtils.isEmulator().toString())) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { + add(CommonItemTitle("isDevelopmentSettingsEnabled", DeviceUtils.isDevelopmentSettingsEnabled().toString())) + } add(CommonItemTitle("getUniqueDeviceId", DeviceUtils.getUniqueDeviceId("util"))) add(CommonItemTitle("isSameDevice", DeviceUtils.isSameDevice(DeviceUtils.getUniqueDeviceId()).toString())) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt new file mode 100644 index 0000000000..de8220dd18 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/file/FileActivity.kt @@ -0,0 +1,59 @@ +package com.blankj.utilcode.pkg.feature.file + +import android.content.Context +import android.content.Intent +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemTitle +import com.blankj.utilcode.pkg.Config.CACHE_PATH +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.FileUtils +import com.blankj.utilcode.util.PathUtils +import com.blankj.utilcode.util.SnackbarUtils +import java.io.File + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2016/09/29 + * desc : demo about FileUtils + * ``` + */ +class FileActivity : CommonActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, FileActivity::class.java) + context.startActivity(starter) + } + + val TEST_FILE_PATH: String = CACHE_PATH + "test_file.txt" + } + + override fun bindTitleRes(): Int { + return R.string.demo_file + } + + override fun bindItems(): MutableList> { + return CollectionUtils.newArrayList( + CommonItemTitle("isFileExists: " + PathUtils.getInternalAppFilesPath(), "" + FileUtils.isFileExists(PathUtils.getInternalAppFilesPath())), + CommonItemTitle("isFileExists: " + PathUtils.getExternalAppFilesPath(), "" + FileUtils.isFileExists(PathUtils.getExternalAppFilesPath())), + CommonItemTitle("isFileExists: " + PathUtils.getExternalStoragePath(), "" + FileUtils.isFileExists(PathUtils.getExternalStoragePath())), + CommonItemTitle("isFileExists: " + PathUtils.getDownloadCachePath(), "" + FileUtils.isFileExists(PathUtils.getDownloadCachePath())), + CommonItemTitle("isFileExists: " + PathUtils.getExternalDownloadsPath(), "" + FileUtils.isFileExists(PathUtils.getExternalDownloadsPath())), + + CommonItemTitle("isFileExists: " + PathUtils.getInternalAppFilesPath(), "" + FileUtils.isFileExists(File(PathUtils.getInternalAppFilesPath()))), + CommonItemTitle("isFileExists: " + PathUtils.getExternalAppFilesPath(), "" + FileUtils.isFileExists(File(PathUtils.getExternalAppFilesPath()))), + CommonItemTitle("isFileExists: " + PathUtils.getExternalStoragePath(), "" + FileUtils.isFileExists(File(PathUtils.getExternalStoragePath()))), + CommonItemTitle("isFileExists: " + PathUtils.getDownloadCachePath(), "" + FileUtils.isFileExists(File(PathUtils.getDownloadCachePath()))), + CommonItemTitle("isFileExists: " + PathUtils.getExternalDownloadsPath(), "" + FileUtils.isFileExists(File(PathUtils.getExternalDownloadsPath()))) + ) + } + + override fun onDestroy() { + super.onDestroy() + SnackbarUtils.dismiss() + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt index 27531515f0..c5f602b9e3 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt @@ -3,16 +3,13 @@ package com.blankj.utilcode.pkg.feature.flashlight import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemSwitch import com.blankj.common.item.CommonItemTitle +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.pkg.helper.PermissionHelper -import com.blankj.utilcode.util.CollectionUtils -import com.blankj.utilcode.util.FlashlightUtils -import com.blankj.utilcode.util.ToastUtils -import com.blankj.utilcode.util.Utils +import com.blankj.utilcode.util.* /** * ``` @@ -30,16 +27,16 @@ class FlashlightActivity : CommonActivity() { ToastUtils.showLong("Didn't support flashlight.") return } - PermissionHelper.requestCamera(object : PermissionHelper.OnPermissionGrantedListener { - override fun onPermissionGranted() { + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { val starter = Intent(context, FlashlightActivity::class.java) context.startActivity(starter) } - }, object : PermissionHelper.OnPermissionDeniedListener { - override fun onPermissionDenied() { - start(context) + + override fun onDenied() { + LogUtils.e("permission denied") } - }) + }, PermissionConstants.CAMERA) } } @@ -53,12 +50,8 @@ class FlashlightActivity : CommonActivity() { if (FlashlightUtils.isFlashlightEnable()) { add(CommonItemSwitch( R.string.flashlight_status, - Utils.Func1 { - FlashlightUtils.isFlashlightOn() - }, - Utils.Func1 { - FlashlightUtils.setFlashlightStatus(it) - } + { FlashlightUtils.isFlashlightOn() }, + { FlashlightUtils.setFlashlightStatus(it) } )) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt index c7c2e5fd0a..a4b1450de5 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt @@ -1,8 +1,8 @@ package com.blankj.utilcode.pkg.feature.fragment import android.os.Bundle -import android.support.v4.app.FragmentManager import android.view.View +import androidx.fragment.app.FragmentManager import com.blankj.common.fragment.CommonFragment import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt index 3e57295596..e21eb521fb 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt @@ -2,12 +2,11 @@ package com.blankj.utilcode.pkg.feature.fragment import android.os.Build import android.os.Bundle -import android.support.annotation.RequiresApi -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentManager import android.transition.* import android.view.View import android.widget.ImageView +import androidx.annotation.RequiresApi +import androidx.fragment.app.FragmentManager import com.blankj.base.rv.ItemViewHolder import com.blankj.common.fragment.CommonFragment import com.blankj.common.item.CommonItem @@ -15,7 +14,6 @@ import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper import com.blankj.utilcode.util.* -import kotlinx.android.synthetic.main.fragment_container.* import java.util.* /** @@ -145,7 +143,7 @@ class ContainerFragment : CommonFragment(), FragmentUtils.OnBackClickListener { } } - private fun addSharedElement(fragment: Fragment): Fragment { + private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { fragment.sharedElementEnterTransition = DetailTransition() fragment.enterTransition = Fade() diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt index 99b6355629..5b337e48d5 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt @@ -4,8 +4,8 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.PersistableBundle -import android.support.design.widget.BottomNavigationView -import android.support.v4.app.Fragment +import com.google.android.material.bottomnavigation.BottomNavigationView +import androidx.fragment.app.Fragment import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R @@ -29,7 +29,7 @@ class FragmentActivity : CommonActivity() { } } - private val mFragments = arrayListOf() + private val mFragments = arrayListOf() private var curIndex: Int = 0 private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt index 1331f2e7da..995bbb22c1 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt @@ -8,12 +8,16 @@ import android.os.Build import android.os.Bundle import android.view.View import com.blankj.common.activity.CommonActivity +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemImage +import com.blankj.common.item.CommonItemTitle +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.pkg.Config import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* +import java.io.File import java.util.* /** @@ -26,10 +30,20 @@ import java.util.* */ class ImageActivity : CommonActivity() { + private val savePath = Config.CACHE_PATH + "lena.jpg" + private val titleItem: CommonItemTitle = CommonItemTitle("isImage: $savePath", ""); + companion object { fun start(context: Context) { - val starter = Intent(context, ImageActivity::class.java) - context.startActivity(starter) + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { + val starter = Intent(context, ImageActivity::class.java) + context.startActivity(starter) + } + + override fun onDenied() { + } + }, PermissionConstants.STORAGE) } } @@ -57,94 +71,125 @@ class ImageActivity : CommonActivity() { val width = src.width val height = src.height + titleItem.setContent(ImageUtils.isImage(savePath).toString()) + return CollectionUtils.newArrayList>().apply { - add(CommonItemClick(R.string.image_save) { - val savePath = Config.CACHE_PATH + "lena.jpg" + add(titleItem) + add(CommonItemClick("Save to $savePath") { ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask() { override fun doInBackground(): Boolean { return ImageUtils.save(src, savePath, Bitmap.CompressFormat.JPEG) } override fun onSuccess(result: Boolean) { + titleItem.setContent(ImageUtils.isImage(savePath).toString()) + titleItem.update() SnackbarUtils.with(mContentView) .setDuration(SnackbarUtils.LENGTH_LONG) .apply { if (result) { - setMessage("save to \"$savePath\" successful.") - .showSuccess() + setMessage("save successful.") + .showSuccess(true) + } else { + setMessage("save failed.") + .showError(true) + } + } + } + }) + }) + add(CommonItemClick("Save to Album") { + ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask() { + override fun doInBackground(): File? { + return ImageUtils.save2Album(src, Bitmap.CompressFormat.JPEG) + } + + override fun onSuccess(result: File?) { + SnackbarUtils.with(mContentView) + .setDuration(SnackbarUtils.LENGTH_LONG) + .apply { + if (result != null) { + setMessage("save successful.") + .showSuccess(true) } else { - setMessage("save to \"$savePath\" failed.") - .showError() + setMessage("save failed.") + .showError(true) } } } }) }) - add(CommonItemImage(R.string.image_src, Utils.Func1 { + add(CommonItemImage(R.string.image_src) { it.setImageBitmap(src) - })) - add(CommonItemImage(R.string.image_add_color, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_add_color) { it.setImageBitmap(ImageUtils.drawColor(src, Color.parseColor("#8000FF00"))) - })) - add(CommonItemImage(R.string.image_scale, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_scale) { it.setImageBitmap(ImageUtils.scale(src, width / 2, height / 2)) - })) - add(CommonItemImage(R.string.image_clip, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_clip) { it.setImageBitmap(ImageUtils.clip(src, 0, 0, width / 2, height / 2)) - })) - add(CommonItemImage(R.string.image_skew, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_skew) { it.setImageBitmap(ImageUtils.skew(src, 0.2f, 0.1f)) - })) - add(CommonItemImage(R.string.image_rotate, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_rotate) { it.setImageBitmap(ImageUtils.rotate(src, 90, (width / 2).toFloat(), (height / 2).toFloat())) - })) - add(CommonItemImage(R.string.image_to_round) { it -> + }) + add(CommonItemImage(R.string.image_to_round) { it.setImageBitmap(ImageUtils.toRound(src)) }) - add(CommonItemImage(R.string.image_to_round_border, Utils.Func1 { + add(CommonItemImage(R.string.image_to_round_border) { it.setImageBitmap(ImageUtils.toRound(src, 16, Color.GREEN)) - })) - add(CommonItemImage(R.string.image_to_round_corner, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_to_round_corner) { it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f)) - })) - add(CommonItemImage(R.string.image_to_round_corner_border, Utils.Func1 { - it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f, 16, Color.GREEN)) - })) - add(CommonItemImage(R.string.image_add_corner_border, Utils.Func1 { - it.setImageBitmap(ImageUtils.addCornerBorder(src, 16, Color.GREEN, 0f)) - })) - add(CommonItemImage(R.string.image_add_circle_border, Utils.Func1 { - it.setImageBitmap(ImageUtils.addCircleBorder(round, 16, Color.GREEN)) - })) - add(CommonItemImage(R.string.image_add_reflection, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_to_round_corner_border) { + it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f, 16f, Color.GREEN)) + }) + add(CommonItemImage(R.string.image_to_round_corner_border) { + it.setImageBitmap(ImageUtils.toRoundCorner(src, floatArrayOf(0f, 0f, 80f, 80f, 0f, 0f, 80f, 80f), 16f, Color.GREEN)) + }) + add(CommonItemImage(R.string.image_add_corner_border) { + it.setImageBitmap(ImageUtils.addCornerBorder(src, 16f, Color.GREEN, 80f)) + }) + add(CommonItemImage(R.string.image_add_corner_border) { + it.setImageBitmap(ImageUtils.addCornerBorder(src, 16f, Color.GREEN, floatArrayOf(0f, 0f, 80f, 80f, 0f, 0f, 80f, 80f))) + }) + add(CommonItemImage(R.string.image_add_circle_border) { + it.setImageBitmap(ImageUtils.addCircleBorder(src, 16f, Color.GREEN)) + }) + add(CommonItemImage(R.string.image_add_reflection) { it.setImageBitmap(ImageUtils.addReflection(src, 80)) - })) - add(CommonItemImage(R.string.image_add_text_watermark, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_add_text_watermark) { it.setImageBitmap(ImageUtils.addTextWatermark(src, "blankj", 40, Color.GREEN, 0f, 0f)) - })) - add(CommonItemImage(R.string.image_add_image_watermark, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_add_image_watermark) { it.setImageBitmap(ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88)) - })) - add(CommonItemImage(R.string.image_to_gray, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_to_gray) { it.setImageBitmap(ImageUtils.toGray(src)) - })) - add(CommonItemImage(R.string.image_fast_blur, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_fast_blur) { it.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5f)) - })) + }) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - add(CommonItemImage(R.string.image_render_script_blur, Utils.Func1 { + add(CommonItemImage(R.string.image_render_script_blur) { it.setImageBitmap(ImageUtils.renderScriptBlur(src, 10f)) - })) + }) } - add(CommonItemImage(R.string.image_stack_blur, Utils.Func1 { + add(CommonItemImage(R.string.image_stack_blur) { it.setImageBitmap(ImageUtils.stackBlur(src, 10)) - })) - add(CommonItemImage(R.string.image_compress_by_scale, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_compress_by_scale) { it.setImageBitmap(ImageUtils.compressByScale(src, 0.5f, 0.5f)) - })) - add(CommonItemImage(R.string.image_compress_by_sample_size, Utils.Func1 { + }) + add(CommonItemImage(R.string.image_compress_by_sample_size) { it.setImageBitmap(ImageUtils.compressBySampleSize(src, 2)) - })) + }) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt new file mode 100644 index 0000000000..06650d0b45 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt @@ -0,0 +1,77 @@ +package com.blankj.utilcode.pkg.feature.intent + +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.utilcode.pkg.Config +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.* +import java.util.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2020/05/29 + * desc : demo about IntentUtils + * ``` + */ +class IntentActivity : CommonActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, IntentActivity::class.java) + context.startActivity(starter) + } + } + + override fun bindTitleRes(): Int { + return R.string.demo_intent + } + + override fun bindItems(): MutableList> { + return CollectionUtils.newArrayList( + CommonItemClick("LaunchApp") { + startActivity(IntentUtils.getLaunchAppIntent(packageName)) + }, + CommonItemClick("LaunchAppDetailsSettings") { + startActivityForResult(IntentUtils.getLaunchAppDetailsSettingsIntent(packageName), 1) + }, + CommonItemClick("ShareText") { + startActivity(IntentUtils.getShareTextIntent("share content")) + }, + CommonItemClick("ShareImage") { + startActivity(IntentUtils.getShareImageIntent(getShareImagePath()[0])); + }, + CommonItemClick("ShareTextImage") { + startActivity(IntentUtils.getShareTextImageIntent("share content", getShareImagePath()[0])); + }, + CommonItemClick("ShareImages") { + startActivity(IntentUtils.getShareImageIntent(getShareImagePath())); + }, + CommonItemClick("ShareTextImages") { + startActivity(IntentUtils.getShareTextImageIntent("share content", getShareImagePath())); + } + ) + } + + private fun getShareImagePath(): LinkedList { + val shareImagePath0 = Config.CACHE_PATH + "share.jpg" + if (!FileUtils.isFile(shareImagePath0)) { + ImageUtils.save(ImageUtils.getBitmap(R.drawable.image_lena), shareImagePath0, Bitmap.CompressFormat.JPEG) + } + val shareImagePath1 = Config.CACHE_PATH + "cheetah.jpg" + if (!FileUtils.isFile(shareImagePath1)) { + ImageUtils.save(ImageUtils.getBitmap(R.drawable.span_cheetah), shareImagePath1, Bitmap.CompressFormat.JPEG) + } + return CollectionUtils.newLinkedList(shareImagePath0, shareImagePath1) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + LogUtils.d("onActivityResult() called with: requestCode = $requestCode, resultCode = $resultCode, data = $data") + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt index 531c78b9f1..5ed25ae4fe 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt @@ -10,8 +10,7 @@ import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper -import com.blankj.utilcode.util.CollectionUtils -import com.blankj.utilcode.util.KeyboardUtils +import com.blankj.utilcode.util.* import kotlinx.android.synthetic.main.keyboard_activity.* /** @@ -67,7 +66,7 @@ class KeyboardActivity : CommonActivity() { }, CommonItemClick(R.string.keyboard_show_dialog) { keyboardEt.clearFocus() - DialogHelper.showKeyboardDialog() + DialogHelper.showKeyboardDialog(this) } ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt index 5d088ba01c..c928da21fa 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt @@ -3,15 +3,15 @@ package com.blankj.utilcode.pkg.feature.language import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick +import com.blankj.common.item.CommonItemSwitch +import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.pkg.feature.CoreUtilActivity import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.LanguageUtils -import com.blankj.utilcode.util.ToastUtils +import com.blankj.utilcode.util.SPStaticUtils +import com.blankj.utilcode.util.StringUtils import java.util.* /** @@ -25,6 +25,9 @@ import java.util.* class LanguageActivity : CommonActivity() { companion object { + + const val SP_KEY_IS_RELAUNCH_APP = "SP_KEY_IS_RELAUNCH_APP" + fun start(context: Context) { val starter = Intent(context, LanguageActivity::class.java) context.startActivity(starter) @@ -37,21 +40,34 @@ class LanguageActivity : CommonActivity() { override fun bindItems(): List> { return CollectionUtils.newArrayList( - CommonItemClick(R.string.language_app_context) { - ToastUtils.showLong(R.string.language) - }, - CommonItemClick(R.string.language_activity_context) { - ToastUtils.showLong(getString(R.string.language)) - }, + CommonItemTitle("isAppliedLanguage", LanguageUtils.isAppliedLanguage().toString()), + CommonItemTitle("isAppliedLanguage(SIMPLIFIED_CHINESE)", LanguageUtils.isAppliedLanguage(Locale.SIMPLIFIED_CHINESE).toString()), + CommonItemTitle("getAppliedLanguage", (LanguageUtils.getAppliedLanguage() ?: "null").toString()), + CommonItemTitle("getActivityContextLanguage", LanguageUtils.getContextLanguage(this).toString()), + CommonItemTitle("getAppContextLanguage", LanguageUtils.getAppContextLanguage().toString()), + CommonItemTitle("getSystemLanguage", LanguageUtils.getSystemLanguage().toString()), + CommonItemSwitch( + StringUtils.getString(R.string.language_relaunch_app), + { isRelaunchApp() }, + { SPStaticUtils.put(SP_KEY_IS_RELAUNCH_APP, it) } + ), CommonItemClick(R.string.language_apply_simple_chinese) { - LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, CoreUtilActivity::class.java) + LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, isRelaunchApp()) }, CommonItemClick(R.string.language_apply_american) { - LanguageUtils.applyLanguage(Locale.US, "") + LanguageUtils.applyLanguage(Locale.US, isRelaunchApp()) + }, + CommonItemClick(R.string.language_apply_english) { + LanguageUtils.applyLanguage(Locale.ENGLISH, isRelaunchApp()) + }, + CommonItemClick(R.string.language_apply_arabic) { + LanguageUtils.applyLanguage(Locale("ar"), isRelaunchApp()) }, CommonItemClick(R.string.language_apply_system) { - LanguageUtils.applySystemLanguage("") + LanguageUtils.applySystemLanguage(isRelaunchApp()) } ) } + + private fun isRelaunchApp() = SPStaticUtils.getBoolean(SP_KEY_IS_RELAUNCH_APP) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt index c545748b0e..096df003e4 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt @@ -5,11 +5,13 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle +import android.util.Log import com.blankj.base.BaseApplication import com.blankj.common.activity.CommonActivity import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemSwitch +import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* import java.io.File @@ -112,25 +114,23 @@ class LogActivity : CommonActivity() { override fun bindItems(): List> { return CollectionUtils.newArrayList( + CommonItemTitle("getLogFiles", LogUtils.getLogFiles().toString()), CommonItemSwitch( R.string.log_switch, - Utils.Func1 { - mConfig.isLogSwitch - }, - Utils.Func1 { - mConfig.isLogSwitch = it - } + { mConfig.isLogSwitch }, + { mConfig.isLogSwitch = it } ), CommonItemSwitch( - R.string.log_console_console, - Utils.Func1 { - mConfig.isLog2ConsoleSwitch - }, - Utils.Func1 { - mConfig.setConsoleSwitch(it) - } + R.string.log_console_switch, + { mConfig.isLog2ConsoleSwitch }, + { mConfig.setConsoleSwitch(it) } ), - CommonItemClick("Global Tag", if (mConfig.globalTag == "") "\"\"" else mConfig.globalTag).setOnClickUpdateContentListener { + CommonItemSwitch( + R.string.log_console_listener_switch, + { mConfig.haveSetOnConsoleOutputListener() }, + { mConfig.setOnConsoleOutputListener { type, tag, content -> Log.println(type, tag, content) } } + ), + CommonItemClick("Global Tag", if (mConfig.globalTag == "") "null" else mConfig.globalTag).setOnClickUpdateContentListener { if (StringUtils.isSpace(mConfig.globalTag)) { mConfig.globalTag = TAG } else { @@ -140,47 +140,41 @@ class LogActivity : CommonActivity() { }, CommonItemSwitch( R.string.log_head_switch, - Utils.Func1 { - mConfig.isLogHeadSwitch - }, - Utils.Func1 { - mConfig.isLogHeadSwitch = it - } + { mConfig.isLogHeadSwitch }, + { mConfig.isLogHeadSwitch = it } ), CommonItemSwitch( R.string.log_file_switch, - Utils.Func1 { - mConfig.isLog2FileSwitch - }, - Utils.Func1 { - mConfig.isLog2FileSwitch = it - } + { mConfig.isLog2FileSwitch }, + { mConfig.isLog2FileSwitch = it } + ), + CommonItemSwitch( + R.string.log_file_listener_switch, + { mConfig.haveSetOnFileOutputListener() }, + { mConfig.setOnFileOutputListener { filePath, content -> Log.d("LogActivity", filePath + "\n" + content) } } ), CommonItemClick("Dir", mConfig.dir).setOnClickUpdateContentListener { if (mConfig.dir != mConfig.defaultDir) { mConfig.dir = mConfig.defaultDir } else { - mConfig.setDir(File(PathUtils.getInternalAppFilesPath(), "log")) + mConfig.setDir(File(PathUtils.getExternalAppFilesPath(), "log")) } return@setOnClickUpdateContentListener mConfig.dir }, CommonItemSwitch( R.string.log_border_switch, - Utils.Func1 { - mConfig.isLogBorderSwitch - }, - Utils.Func1 { - mConfig.setBorderSwitch(it) - } + { mConfig.isLogBorderSwitch }, + { mConfig.setBorderSwitch(it) } + ), + CommonItemSwitch( + R.string.log_single_tag_switch, + { mConfig.isSingleTagSwitch }, + { mConfig.setSingleTagSwitch(it) } ), CommonItemSwitch( R.string.log_single_tag_switch, - Utils.Func1 { - mConfig.isSingleTagSwitch - }, - Utils.Func1 { - mConfig.setSingleTagSwitch(it) - } + { mConfig.isSingleTagSwitch }, + { mConfig.setSingleTagSwitch(it) } ), CommonItemClick("ConsoleFilter", mConfig.consoleFilter.toString()).setOnClickUpdateContentListener { mConfig.setConsoleFilter(if (mConfig.consoleFilter == 'V') LogUtils.W else LogUtils.V) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt index 7c30128522..3d00af0e1a 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/messenger/MessengerActivity.kt @@ -12,6 +12,7 @@ import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.MessengerUtils import com.blankj.utilcode.util.SnackbarUtils +import com.blankj.utilcode.util.ToastUtils /** * ``` diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt index f45304d353..77bb5f8e82 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt @@ -3,8 +3,6 @@ package com.blankj.utilcode.pkg.feature.metaData import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R @@ -35,7 +33,7 @@ class MetaDataActivity : CommonActivity() { override fun bindItems(): List> { return CollectionUtils.newArrayList( CommonItemTitle("getMetaDataInApp", MetaDataUtils.getMetaDataInApp("app_meta_data")), - CommonItemTitle("getMetaDataInActivity", MetaDataUtils.getMetaDataInActivity(this, "activity_meta_data")) + CommonItemTitle("getMetaDataInActivity", MetaDataUtils.getMetaDataInActivity(this, "activity_meta_data").substring(1)) ) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java index 7aa5fe26b1..7fff29f4a7 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java @@ -3,12 +3,13 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; import android.view.View; import com.blankj.common.activity.CommonActivity; import com.blankj.utilcode.pkg.R; +import androidx.annotation.Nullable; + /** *
  *     author: blankj
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
index 94de5120c3..e16b4f1934 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
@@ -12,33 +12,33 @@
  *     desc  :
  * 
*/ -public class MvpModel extends BaseModel implements IMvp.Model { +public class MvpModel extends BaseModel implements MvpMvp.Model { private int index; @Override - public void onCreateModel() { + public void onCreate() { index = 0; } @Override - public void onDestroyModel() { - - } - - @Override - public void requestUpdateMsg(final Utils.Func1 func1) { - ThreadUtils.executeByCached(addAutoDestroyTask(new ThreadUtils.SimpleTask() { + public void requestUpdateMsg(final Utils.Consumer consumer) { + ThreadUtils.executeByCached(new ThreadUtils.SimpleTask() { @Override public String doInBackground() throws Throwable { - Thread.sleep(1000); + Thread.sleep(2000); return "msg: " + index++; } @Override public void onSuccess(String result) { - func1.call(result); + consumer.accept(result); } - })); + }); + } + + @Override + public void onDestroy() { + super.onDestroy(); } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/IMvp.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java similarity index 81% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/IMvp.java rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java index 11a9c28ace..d0335ef203 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/IMvp.java +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpMvp.java @@ -10,7 +10,7 @@ * desc : * */ -public interface IMvp { +public interface MvpMvp { interface View { void setLoadingVisible(boolean visible); @@ -23,6 +23,6 @@ interface Presenter { } interface Model { - void requestUpdateMsg(final Utils.Func1 func1); + void requestUpdateMsg(final Utils.Consumer consumer); } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java index 7dbcba1e02..fcb68bd3ed 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java @@ -1,6 +1,7 @@ package com.blankj.utilcode.pkg.feature.mvp; import com.blankj.base.mvp.BasePresenter; +import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.Utils; /** @@ -12,21 +13,24 @@ * */ public class MvpPresenter extends BasePresenter - implements IMvp.Presenter { + implements MvpMvp.Presenter { @Override - public void onAttachView() { + public void onBindView() { } @Override public void updateMsg() { getView().setLoadingVisible(true); - getModel(MvpModel.class).requestUpdateMsg(new Utils.Func1() { + getModel(MvpModel.class).requestUpdateMsg(new Utils.Consumer() { @Override - public Void call(String param) { - getView().showMsg(param); - getView().setLoadingVisible(false); - return null; + public void accept(String s) { + if (isAlive()) { + getView().showMsg(s); + getView().setLoadingVisible(false); + } else { + LogUtils.iTag(MvpView.TAG, "destroyed"); + } } }); } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java index b74c23ae62..e916398e48 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java @@ -1,12 +1,15 @@ package com.blankj.utilcode.pkg.feature.mvp; -import android.support.v4.app.FragmentActivity; +import android.text.Layout; import android.view.View; import android.widget.TextView; import com.blankj.base.mvp.BaseView; import com.blankj.utilcode.pkg.R; import com.blankj.utilcode.util.ClickUtils; +import com.blankj.utilcode.util.LogUtils; +import com.blankj.utilcode.util.SizeUtils; +import com.blankj.utilcode.util.ThreadUtils; import com.blankj.utilcode.util.ToastUtils; /** @@ -18,11 +21,13 @@ * */ public class MvpView extends BaseView - implements IMvp.View { + implements MvpMvp.View { private TextView mvpTv; + private TextView mvpMeasureWidthTv; + private int i = 0; - public MvpView(FragmentActivity activity) { + public MvpView(MvpActivity activity) { super(activity); mvpTv = activity.findViewById(R.id.mvpUpdateTv); ClickUtils.applyPressedBgDark(mvpTv); @@ -32,6 +37,23 @@ public void onClick(View v) { getPresenter(MvpPresenter.class).updateMsg(); } }); + + mvpMeasureWidthTv = activity.findViewById(R.id.mvpMeasureWidthTv); + + measure(); + } + + private void measure() { + ThreadUtils.runOnUiThreadDelayed(new Runnable() { + @Override + public void run() { + float textWidth = Layout.getDesiredWidth(mvpMeasureWidthTv.getText(), mvpMeasureWidthTv.getPaint()) + SizeUtils.dp2px(16); + float textWidth2 = mvpMeasureWidthTv.getPaint().measureText(mvpMeasureWidthTv.getText().toString()) + SizeUtils.dp2px(16); + LogUtils.i(mvpMeasureWidthTv.getWidth(), textWidth, textWidth2); + mvpMeasureWidthTv.setText(mvpMeasureWidthTv.getText().toString() + i); + measure(); + } + }, 1000); } @Override @@ -53,9 +75,4 @@ public void run() { public void showMsg(CharSequence msg) { ToastUtils.showLong(msg); } - - @Override - public void onDestroyView() { - - } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt index fc9915cb53..452040376d 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt @@ -2,13 +2,17 @@ package com.blankj.utilcode.pkg.feature.network import android.content.Context import android.content.Intent +import android.net.wifi.ScanResult +import android.net.wifi.WifiManager import android.os.Bundle import android.view.View import com.blankj.common.activity.CommonActivity +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemSwitch import com.blankj.common.item.CommonItemTitle +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* @@ -24,12 +28,24 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis companion object { fun start(context: Context) { - val starter = Intent(context, NetworkActivity::class.java) - context.startActivity(starter) + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { + val starter = Intent(context, NetworkActivity::class.java) + context.startActivity(starter) + } + + override fun onDenied() { + } + }, PermissionConstants.LOCATION) } } private lateinit var itemsTask: ThreadUtils.SimpleTask>> + private lateinit var wifiScanResultItem: CommonItemTitle + private val consumer = Utils.Consumer { t -> + wifiScanResultItem.setContent(scanResults2String(t.filterResults)) + wifiScanResultItem.update() + } override fun bindTitleRes(): Int { return R.string.demo_network @@ -51,11 +67,13 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis override fun bindItems(): List> { if (ThreadUtils.isMainThread()) return arrayListOf() + wifiScanResultItem = CommonItemTitle("getWifiScanResult", scanResults2String(NetworkUtils.getWifiScanResult().filterResults)) return CollectionUtils.newArrayList( CommonItemTitle("isConnected", NetworkUtils.isConnected().toString()), CommonItemTitle("getMobileDataEnabled", NetworkUtils.getMobileDataEnabled().toString()), CommonItemTitle("isMobileData", NetworkUtils.isMobileData().toString()), CommonItemTitle("is4G", NetworkUtils.is4G().toString()), + CommonItemTitle("is5G", NetworkUtils.is5G().toString()), CommonItemTitle("isWifiConnected", NetworkUtils.isWifiConnected().toString()), CommonItemTitle("getNetworkOperatorName", NetworkUtils.getNetworkOperatorName()), CommonItemTitle("getNetworkTypeName", NetworkUtils.getNetworkType().toString()), @@ -64,19 +82,27 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis CommonItemTitle("getGatewayByWifi", NetworkUtils.getGatewayByWifi()), CommonItemTitle("getNetMaskByWifi", NetworkUtils.getNetMaskByWifi()), CommonItemTitle("getServerAddressByWifi", NetworkUtils.getServerAddressByWifi()), + CommonItemTitle("getSSID", NetworkUtils.getSSID()), CommonItemTitle("getIPv4Address", NetworkUtils.getIPAddress(true)), CommonItemTitle("getIPv6Address", NetworkUtils.getIPAddress(false)), CommonItemTitle("isWifiAvailable", NetworkUtils.isWifiAvailable().toString()), CommonItemTitle("isAvailable", NetworkUtils.isAvailable().toString()), CommonItemTitle("getBaiduDomainAddress", NetworkUtils.getDomainAddress("baidu.com")), + wifiScanResultItem, CommonItemSwitch( R.string.network_wifi_enabled, - Utils.Func1 { - NetworkUtils.getWifiEnabled() + { + val wifiEnabled = NetworkUtils.getWifiEnabled() + if (wifiEnabled) { + NetworkUtils.addOnWifiChangedConsumer(consumer) + } else { + NetworkUtils.removeOnWifiChangedConsumer(consumer) + } + wifiEnabled }, - Utils.Func1 { + { NetworkUtils.setWifiEnabled(it) ThreadUtils.executeByIo(getItemsTask()) } @@ -112,5 +138,14 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis super.onDestroy() ThreadUtils.cancel(itemsTask) NetworkUtils.unregisterNetworkStatusChangedListener(this) + NetworkUtils.removeOnWifiChangedConsumer(consumer) + } + + private fun scanResults2String(results: List): String { + val sb: StringBuilder = StringBuilder() + for (result in results) { + sb.append(String.format("${result.SSID}, Level: ${WifiManager.calculateSignalLevel(result.level, 4)}\n")) + } + return sb.toString() } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt index b226e4141d..c55d9c945b 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt @@ -1,17 +1,17 @@ package com.blankj.utilcode.pkg.feature.permission -import android.Manifest +import android.Manifest.permission import android.content.Context import android.content.Intent import android.os.Build import com.blankj.common.activity.CommonActivity +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemSwitch import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.pkg.helper.DialogHelper import com.blankj.utilcode.util.* /** @@ -56,57 +56,37 @@ class PermissionActivity : CommonActivity() { add(CommonItemClick(R.string.permission_open_app_settings, true) { PermissionUtils.launchAppDetailsSettings() }) add(CommonItemSwitch( R.string.permission_calendar_status, - Utils.Func1 { - return@Func1 PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR) - }, - Utils.Func1 { - requestCalendar() - } + { PermissionUtils.isGranted(PermissionConstants.CALENDAR) }, + { requestCalendar() } )) add(CommonItemSwitch( R.string.permission_record_audio_status, - Utils.Func1 { - return@Func1 PermissionUtils.isGranted(Manifest.permission.RECORD_AUDIO) - }, - Utils.Func1 { - requestRecordAudio() - } + { PermissionUtils.isGranted(PermissionConstants.MICROPHONE) }, + { requestRecordAudio() } )) add(CommonItemSwitch( R.string.permission_calendar_and_record_audio_status, - Utils.Func1 { - return@Func1 PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR, Manifest.permission.RECORD_AUDIO) - }, - Utils.Func1 { - requestCalendarAndRecordAudio() - } + { PermissionUtils.isGranted(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE) }, + { requestCalendarAndRecordAudio() } )) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { add(CommonItemSwitch( R.string.permission_write_settings_status, - Utils.Func1 { - return@Func1 PermissionUtils.isGrantedWriteSettings() - }, - Utils.Func1 { - requestWriteSettings() - } + { PermissionUtils.isGrantedWriteSettings() }, + { requestWriteSettings() } )) add(CommonItemSwitch( R.string.permission_write_settings_status, - Utils.Func1 { - return@Func1 PermissionUtils.isGrantedDrawOverlays() - }, - Utils.Func1 { - requestDrawOverlays() - } + { PermissionUtils.isGrantedDrawOverlays() }, + { requestDrawOverlays() } )) } } } private fun requestCalendar() { - PermissionUtils.permission(PermissionConstants.CALENDAR) - .rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) } + PermissionUtils.permissionGroup(PermissionConstants.CALENDAR) + .rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) } .callback(object : PermissionUtils.FullCallback { override fun onGranted(permissionsGranted: List) { LogUtils.d(permissionsGranted) @@ -130,8 +110,8 @@ class PermissionActivity : CommonActivity() { } private fun requestRecordAudio() { - PermissionUtils.permission(PermissionConstants.MICROPHONE) - .rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) } + PermissionUtils.permissionGroup(PermissionConstants.MICROPHONE) + .rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) } .callback(object : PermissionUtils.FullCallback { override fun onGranted(permissionsGranted: List) { LogUtils.d(permissionsGranted) @@ -154,28 +134,21 @@ class PermissionActivity : CommonActivity() { } private fun requestCalendarAndRecordAudio() { - PermissionUtils.permission(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE) - .rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) } - .callback(object : PermissionUtils.FullCallback { - override fun onGranted(permissionsGranted: List) { - LogUtils.d(permissionsGranted) - if (permissionsGranted.size == 2) { - showSnackbar(true, "Calendar or Microphone is granted") - } - itemsView.updateItems(bindItems()) + PermissionUtils.permission(permission.READ_CALENDAR, permission.RECORD_AUDIO) + .explain { activity, denied, shouldRequest -> PermissionHelper.showExplainDialog(activity, denied, shouldRequest) } + .callback { isAllGranted, granted, deniedForever, denied -> + LogUtils.d(granted, deniedForever, denied) + itemsView.updateItems(bindItems()) + if (isAllGranted) { + showSnackbar(true, "Calendar and Microphone are granted") + return@callback } - - override fun onDenied(permissionsDeniedForever: List, - permissionsDenied: List) { - LogUtils.d(permissionsDeniedForever, permissionsDenied) - if (permissionsDeniedForever.isNotEmpty()) { - showSnackbar(false, "Calendar or Microphone is denied forever") - } else { - showSnackbar(false, "Calendar or Microphone is denied") - } - itemsView.updateItems(bindItems()) + if (deniedForever.isNotEmpty()) { + showSnackbar(false, "Calendar or Microphone is denied forever") + } else { + showSnackbar(false, "Calendar or Microphone is denied") } - }) + } .request() } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt index c139b43d79..c9b748cdfa 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/phone/PhoneActivity.kt @@ -3,12 +3,14 @@ package com.blankj.utilcode.pkg.feature.phone import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity +import com.blankj.common.helper.PermissionHelper import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemTitle +import com.blankj.utilcode.constant.PermissionConstants import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.pkg.helper.PermissionHelper import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.PermissionUtils import com.blankj.utilcode.util.PhoneUtils /** @@ -23,16 +25,15 @@ class PhoneActivity : CommonActivity() { companion object { fun start(context: Context) { - PermissionHelper.requestPhone(object : PermissionHelper.OnPermissionGrantedListener { - override fun onPermissionGranted() { + PermissionHelper.request(context, object : PermissionUtils.SimpleCallback { + override fun onGranted() { val starter = Intent(context, PhoneActivity::class.java) context.startActivity(starter) } - }, object : PermissionHelper.OnPermissionDeniedListener { - override fun onPermissionDenied() { - start(context) + + override fun onDenied() { } - }) + }, PermissionConstants.PHONE) } } @@ -53,8 +54,8 @@ class PhoneActivity : CommonActivity() { CommonItemTitle("getSimOperatorName", PhoneUtils.getSimOperatorName()), CommonItemTitle("getSimOperatorByMnc", PhoneUtils.getSimOperatorByMnc()), - CommonItemClick(R.string.phone_dial) { PhoneUtils.dial("10000") }, - CommonItemClick(R.string.phone_call) { PhoneUtils.call("10000") }, + CommonItemClick(R.string.phone_dial) { PhoneUtils.dial("*10000#haha") }, + CommonItemClick(R.string.phone_call) { PhoneUtils.call("*10000#haha") }, CommonItemClick(R.string.phone_send_sms) { PhoneUtils.sendSms("10000", "sendSms") } ) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java index e62c518699..b7efb5f4d7 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java @@ -1,6 +1,6 @@ package com.blankj.utilcode.pkg.feature.reflect; -import android.support.annotation.Keep; +import androidx.annotation.Keep; /** *
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
index 53ef761b24..88286c4df5 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
@@ -3,6 +3,8 @@ package com.blankj.utilcode.pkg.feature.screen
 import android.content.Context
 import android.content.Intent
 import android.os.Build
+import android.widget.ImageView
+import android.widget.TextView
 import com.blankj.common.activity.CommonActivity
 import com.blankj.common.item.CommonItem
 import com.blankj.common.item.CommonItemClick
@@ -61,10 +63,8 @@ class ScreenActivity : CommonActivity() {
 
                 CommonItemSwitch(
                         "isFullScreen",
-                        Utils.Func1 {
-                            ScreenUtils.isFullScreen(this)
-                        },
-                        Utils.Func1 {
+                        { ScreenUtils.isFullScreen(this) },
+                        {
                             if (it) {
                                 ScreenUtils.setFullScreen(this)
                                 BarUtils.setStatusBarVisibility(this, false)
@@ -76,10 +76,8 @@ class ScreenActivity : CommonActivity() {
                 ),
                 CommonItemSwitch(
                         "isLandscape",
-                        Utils.Func1 {
-                            ScreenUtils.isLandscape()
-                        },
-                        Utils.Func1 {
+                        { ScreenUtils.isLandscape() },
+                        {
                             if (it) {
                                 ScreenUtils.setLandscape(this)
                             } else {
@@ -88,7 +86,15 @@ class ScreenActivity : CommonActivity() {
                         }
                 ),
                 CommonItemClick(R.string.screen_screenshot) {
-                    DialogHelper.showScreenshotDialog(ScreenUtils.screenShot(this))
+                    val iv :ImageView = ImageView(this)
+                    iv.setImageResource(R.mipmap.ic_launcher)
+
+                    val tv: TextView = TextView(this)
+                    tv.setText("wowowowwowo")
+
+                    DialogHelper.showScreenshotDialog(ImageUtils.view2Bitmap(tv))
+
+//                    DialogHelper.showScreenshotDialog(ScreenUtils.screenShot(this))
                 }
         )
     }
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt
index 62d0f0a218..0c51475952 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/sdcard/SDCardActivity.kt
@@ -7,6 +7,7 @@ import com.blankj.common.item.CommonItem
 import com.blankj.common.item.CommonItemTitle
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ConvertUtils
 import com.blankj.utilcode.util.SDCardUtils
 
 /**
@@ -35,7 +36,11 @@ class SDCardActivity : CommonActivity() {
                 CommonItemTitle("isSDCardEnableByEnvironment", SDCardUtils.isSDCardEnableByEnvironment().toString()),
                 CommonItemTitle("getSDCardPathByEnvironment", SDCardUtils.getSDCardPathByEnvironment()),
                 CommonItemTitle("getSDCardInfo", SDCardUtils.getSDCardInfo().toString()),
-                CommonItemTitle("getMountedSDCardPath", SDCardUtils.getMountedSDCardPath().toString())
+                CommonItemTitle("getMountedSDCardPath", SDCardUtils.getMountedSDCardPath().toString()),
+                CommonItemTitle("getExternalTotalSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getExternalTotalSize(), 2)),
+                CommonItemTitle("getExternalAvailableSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getExternalAvailableSize(), 2)),
+                CommonItemTitle("getInternalTotalSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getInternalTotalSize(), 2)),
+                CommonItemTitle("getInternalAvailableSize", ConvertUtils.byte2FitMemorySize(SDCardUtils.getInternalAvailableSize(), 2))
         )
     }
 }
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt
index fc34e89e60..2ec21ad483 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/shadow/ShadowActivity.kt
@@ -39,9 +39,14 @@ class ShadowActivity : CommonActivity() {
 
     override fun initView(savedInstanceState: Bundle?, contentView: View?) {
         super.initView(savedInstanceState, contentView)
-        ShadowUtils.apply(shadowRectView, Config().setShadowRadius(0.01f).setShadowColor(Color.BLUE, Color.GREEN))
-        ShadowUtils.apply(shadowRoundRectView, Config().setShadowRadius(
-                SizeUtils.dp2px(16f).toFloat()).setShadowColor(Color.RED, Color.BLUE))
-        ShadowUtils.apply(shadowCircleView, Config().setCircle().setShadowColor(Color.GREEN, Color.BLUE))
+        ShadowUtils.apply(shadowRectView, Config().setShadowColor(0x44000000, 0x55000000))
+        ShadowUtils.apply(shadowRoundRectView, Config().setShadowColor(0x44000000, 0x55000000).setShadowRadius(
+                SizeUtils.dp2px(16f).toFloat()))
+        ShadowUtils.apply(shadowCircleView, Config().setCircle().setShadowColor(0x44000000, 0x55000000))
+
+        ShadowUtils.apply(shadowRectView1, Config().setShadowColor(0x44000000, 0x55000000))
+        ShadowUtils.apply(shadowRoundRectView1, Config().setShadowColor(0x44000000, 0x55000000).setShadowRadius(
+                SizeUtils.dp2px(16f).toFloat()))
+        ShadowUtils.apply(shadowCircleView1, Config().setCircle().setShadowColor(0x44000000, 0x55000000))
     }
 }
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index bf50677739..dcde367a5b 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.snackbar
 import android.content.Context
 import android.content.Intent
 import android.graphics.Color
-import android.support.annotation.StringRes
 import android.text.SpannableStringBuilder
 import android.view.ViewGroup
 import android.widget.TextView
+import androidx.annotation.StringRes
 import com.blankj.common.activity.CommonActivity
 import com.blankj.common.item.CommonItem
 import com.blankj.common.item.CommonItemClick
@@ -39,22 +39,37 @@ class SnackbarActivity : CommonActivity() {
 
     override fun bindItems(): MutableList> {
         return CollectionUtils.newArrayList(
-                CommonItemClick(R.string.snackbar_show_short) {
+                CommonItemClick(R.string.snackbar_short) {
                     SnackbarUtils.with(mContentView)
                             .setMessage(getMsg(R.string.snackbar_short))
                             .setMessageColor(Color.WHITE)
                             .setBgResource(R.drawable.snackbar_custom_bg)
                             .show()
                 },
-                CommonItemClick(R.string.snackbar_show_short_with_action) {
+                CommonItemClick(R.string.snackbar_short_top) {
                     SnackbarUtils.with(mContentView)
-                            .setMessage(getMsg(R.string.snackbar_short))
+                            .setMessage(getMsg(R.string.snackbar_short_top))
+                            .setMessageColor(Color.WHITE)
+                            .setBgResource(R.drawable.snackbar_custom_bg)
+                            .show(true)
+                },
+                CommonItemClick(R.string.snackbar_short_with_action) {
+                    SnackbarUtils.with(mContentView)
+                            .setMessage(getMsg(R.string.snackbar_short_with_action))
                             .setMessageColor(Color.WHITE)
                             .setBgResource(R.drawable.snackbar_custom_bg)
                             .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
                             .show()
                 },
-                CommonItemClick(R.string.snackbar_show_long) {
+                CommonItemClick(R.string.snackbar_short_with_action_top) {
+                    SnackbarUtils.with(mContentView)
+                            .setMessage(getMsg(R.string.snackbar_short_with_action_top))
+                            .setMessageColor(Color.WHITE)
+                            .setBgResource(R.drawable.snackbar_custom_bg)
+                            .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
+                            .show(true)
+                },
+                CommonItemClick(R.string.snackbar_long) {
                     SnackbarUtils.with(mContentView)
                             .setMessage(getMsg(R.string.snackbar_long))
                             .setMessageColor(Color.WHITE)
@@ -62,16 +77,16 @@ class SnackbarActivity : CommonActivity() {
                             .setBgResource(R.drawable.snackbar_custom_bg)
                             .show()
                 },
-                CommonItemClick(R.string.snackbar_show_long_with_action) {
+                CommonItemClick(R.string.snackbar_long_with_action) {
                     SnackbarUtils.with(mContentView)
-                            .setMessage(getMsg(R.string.snackbar_long))
+                            .setMessage(getMsg(R.string.snackbar_long_with_action))
                             .setMessageColor(Color.WHITE)
                             .setBgResource(R.drawable.snackbar_custom_bg)
                             .setDuration(SnackbarUtils.LENGTH_LONG)
                             .setAction(getString(R.string.snackbar_click), Color.YELLOW) { ToastUtils.showShort(getString(R.string.snackbar_click)) }
                             .show()
                 },
-                CommonItemClick(R.string.snackbar_show_indefinite) {
+                CommonItemClick(R.string.snackbar_indefinite) {
                     SnackbarUtils.with(mContentView)
                             .setMessage(getMsg(R.string.snackbar_indefinite))
                             .setMessageColor(Color.WHITE)
@@ -79,9 +94,9 @@ class SnackbarActivity : CommonActivity() {
                             .setBgResource(R.drawable.snackbar_custom_bg)
                             .show()
                 },
-                CommonItemClick(R.string.snackbar_show_indefinite_with_action) {
+                CommonItemClick(R.string.snackbar_indefinite_with_action) {
                     SnackbarUtils.with(mContentView)
-                            .setMessage(getMsg(R.string.snackbar_indefinite))
+                            .setMessage(getMsg(R.string.snackbar_indefinite_with_action))
                             .setMessageColor(Color.WHITE)
                             .setDuration(SnackbarUtils.LENGTH_INDEFINITE)
                             .setBgResource(R.drawable.snackbar_custom_bg)
@@ -113,17 +128,17 @@ class SnackbarActivity : CommonActivity() {
                         snackbarView.setOnClickListener { SnackbarUtils.dismiss() }
                     }
                 },
-                CommonItemClick(R.string.snackbar_show_success) {
+                CommonItemClick(R.string.snackbar_success) {
                     SnackbarUtils.with(mContentView)
                             .setMessage(getMsg(R.string.snackbar_success))
                             .showSuccess()
                 },
-                CommonItemClick(R.string.snackbar_show_warning) {
+                CommonItemClick(R.string.snackbar_warning) {
                     SnackbarUtils.with(mContentView)
                             .setMessage(getMsg(R.string.snackbar_warning))
                             .showWarning()
                 },
-                CommonItemClick(R.string.snackbar_show_error) {
+                CommonItemClick(R.string.snackbar_error) {
                     SnackbarUtils.with(mContentView)
                             .setMessage(getMsg(R.string.snackbar_error))
                             .showError()
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index bf5d46b154..84c9f868bb 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,6 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.*
 import android.os.Bundle
-import android.support.annotation.ColorInt
 import android.text.Layout
 import android.text.SpannableStringBuilder
 import android.text.TextPaint
@@ -14,6 +13,7 @@ import android.text.style.ClickableSpan
 import android.text.style.UpdateAppearance
 import android.view.View
 import android.view.animation.LinearInterpolator
+import androidx.annotation.ColorInt
 import com.blankj.common.activity.CommonActivity
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.util.SpanUtils
@@ -81,6 +81,7 @@ class SpanActivity : CommonActivity() {
         SpanUtils.with(spanAboutTv)
                 .appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setHorizontalAlign(Layout.Alignment.ALIGN_CENTER)
                 .appendLine("前景色").setForegroundColor(Color.GREEN)
+//                .appendLine("测试哈哈").setForegroundColor(Color.RED).setBackgroundColor(Color.LTGRAY).setFontSize(10).setLineHeight(280, SpanUtils.ALIGN_BOTTOM)
                 .appendLine("背景色").setBackgroundColor(Color.LTGRAY)
                 .appendLine("行高居中对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY)
                 .appendLine("行高底部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN)
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..f0b6876ad4 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -1,14 +1,11 @@
 package com.blankj.utilcode.pkg.feature.toast
 
-import android.os.Handler
-import android.os.Looper
-import android.support.annotation.StringRes
 import android.widget.TextView
-import android.widget.Toast
-
+import androidx.annotation.StringRes
 import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.StringUtils
 import com.blankj.utilcode.util.ToastUtils
-import com.blankj.utilcode.util.Utils
+import com.blankj.utilcode.util.ViewUtils
 
 /**
  * ```
@@ -20,62 +17,42 @@ import com.blankj.utilcode.util.Utils
  */
 object CustomToast {
 
-    private val HANDLER = Handler(Looper.getMainLooper())
-
     fun showShort(text: CharSequence) {
-        showReal(text, Toast.LENGTH_SHORT)
+        show(text, false)
     }
 
     fun showShort(@StringRes resId: Int) {
-        show(resId, Toast.LENGTH_SHORT)
+        show(StringUtils.getString(resId), false)
     }
 
     fun showShort(@StringRes resId: Int, vararg args: Any) {
-        show(resId, Toast.LENGTH_SHORT, *args)
+        show(StringUtils.getString(resId, args), false)
     }
 
     fun showShort(format: String, vararg args: Any) {
-        show(format, Toast.LENGTH_SHORT, *args)
+        show(StringUtils.format(format, args), false)
     }
 
     fun showLong(text: CharSequence) {
-        showReal(text, Toast.LENGTH_LONG)
+        show(text, true)
     }
 
     fun showLong(@StringRes resId: Int) {
-        show(resId, Toast.LENGTH_LONG)
+        show(StringUtils.getString(resId), true)
     }
 
     fun showLong(@StringRes resId: Int, vararg args: Any) {
-        show(resId, Toast.LENGTH_LONG, *args)
+        show(StringUtils.getString(resId, args), true)
     }
 
     fun showLong(format: String, vararg args: Any) {
-        show(format, Toast.LENGTH_LONG, *args)
-    }
-
-    private fun show(@StringRes resId: Int, duration: Int) {
-        show(Utils.getApp().resources.getString(resId), duration)
-    }
-
-    private fun show(@StringRes resId: Int, duration: Int, vararg args: Any) {
-        show(String.format(Utils.getApp().resources.getString(resId), *args), duration)
-    }
-
-    private fun show(format: String, duration: Int, vararg args: Any) {
-        showReal(String.format(format, *args), duration)
+        show(StringUtils.format(format, args), true)
     }
 
-    private fun showReal(text: CharSequence, duration: Int) {
-        HANDLER.post {
-            val toastView: TextView
-            if (duration == Toast.LENGTH_SHORT) {
-                toastView = ToastUtils.showCustomShort(R.layout.toast_custom) as TextView
-            } else {
-                toastView = ToastUtils.showCustomLong(R.layout.toast_custom) as TextView
-            }
-            toastView.text = text
-        }
+    private fun show(text: CharSequence, isLong: Boolean) {
+        val textView = ViewUtils.layoutId2View(R.layout.toast_custom) as TextView
+        textView.text = text
+        ToastUtils.make().setDurationIsLong(isLong).show(textView)
     }
 
     fun cancel() {
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index b62d9b33f8..f4267ad3a9 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -3,14 +3,15 @@ package com.blankj.utilcode.pkg.feature.toast
 import android.content.Context
 import android.content.Intent
 import android.graphics.Color
-import android.support.v4.content.ContextCompat
 import android.view.Gravity
+import androidx.core.content.ContextCompat
 import com.blankj.common.activity.CommonActivity
 import com.blankj.common.item.CommonItem
 import com.blankj.common.item.CommonItemClick
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.pkg.helper.DialogHelper
 import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
 import com.blankj.utilcode.util.SpanUtils
 import com.blankj.utilcode.util.ToastUtils
 
@@ -38,30 +39,18 @@ class ToastActivity : CommonActivity() {
     override fun bindItems(): MutableList> {
         return CollectionUtils.newArrayList(
                 CommonItemClick(R.string.toast_show_short) {
-                    resetToast()
                     Thread(Runnable { ToastUtils.showShort(R.string.toast_short) }).start()
                 },
                 CommonItemClick(R.string.toast_show_long) {
-                    resetToast()
                     Thread(Runnable { ToastUtils.showLong(R.string.toast_long) }).start()
                 },
-                CommonItemClick(R.string.toast_show_green_font) {
-                    resetToast()
-                    ToastUtils.setMsgColor(Color.GREEN)
-                    ToastUtils.showLong(R.string.toast_green_font)
-                },
-                CommonItemClick(R.string.toast_show_bg_color) {
-                    resetToast()
-                    ToastUtils.setBgColor(ContextCompat.getColor(this, R.color.colorAccent))
-                    ToastUtils.showLong(R.string.toast_bg_color)
+                CommonItemClick(R.string.toast_show_null) {
+                    ToastUtils.showLong(null)
                 },
-                CommonItemClick(R.string.toast_show_bg_resource) {
-                    resetToast()
-                    ToastUtils.setBgResource(R.drawable.toast_round_rect)
-                    ToastUtils.showLong(R.string.toast_custom_bg)
+                CommonItemClick(R.string.toast_show_empty) {
+                    ToastUtils.showLong("")
                 },
                 CommonItemClick(R.string.toast_show_span) {
-                    resetToast()
                     ToastUtils.showLong(
                             SpanUtils()
                                     .appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
@@ -70,34 +59,43 @@ class ToastActivity : CommonActivity() {
                                     .create()
                     )
                 },
-                CommonItemClick(R.string.toast_show_custom_view) {
-                    resetToast()
-                    Thread(Runnable { CustomToast.showLong(R.string.toast_custom_view) }).start()
+                CommonItemClick(R.string.toast_show_long_string) {
+                    ToastUtils.showLong(R.string.toast_long_string)
+                },
+                CommonItemClick(R.string.toast_show_green_font) {
+                    ToastUtils.make().setTextColor(Color.GREEN).setDurationIsLong(true).show(R.string.toast_green_font)
+                },
+                CommonItemClick(R.string.toast_show_bg_color) {
+                    ToastUtils.make().setBgColor(ColorUtils.getColor(R.color.colorAccent)).show(R.string.toast_bg_color)
+                },
+                CommonItemClick(R.string.toast_show_bg_resource) {
+                    ToastUtils.make().setBgResource(R.drawable.toast_round_rect).show(R.string.toast_custom_bg)
+                },
+                CommonItemClick(R.string.toast_show_left_icon) {
+                    ToastUtils.make().setLeftIcon(R.mipmap.ic_launcher).show(R.string.toast_show_left_icon)
+                },
+                CommonItemClick(R.string.toast_show_dark_mode) {
+                    ToastUtils.make().setTopIcon(R.mipmap.ic_launcher).setMode(ToastUtils.MODE.DARK).show(R.string.toast_show_dark_mode)
                 },
                 CommonItemClick(R.string.toast_show_middle) {
-                    resetToast()
-                    ToastUtils.setGravity(Gravity.CENTER, 0, 0)
-                    ToastUtils.showLong(R.string.toast_middle)
+                    ToastUtils.make().setGravity(Gravity.CENTER, 0, 0).show(R.string.toast_middle)
+                },
+                CommonItemClick(R.string.toast_show_top) {
+                    ToastUtils.make().setGravity(Gravity.TOP or Gravity.CENTER_HORIZONTAL, 0, 0).show(R.string.toast_top)
+                },
+                CommonItemClick(R.string.toast_show_custom_view) {
+                    Thread(Runnable { CustomToast.showLong(R.string.toast_custom_view) }).start()
                 },
                 CommonItemClick(R.string.toast_cancel) {
                     ToastUtils.cancel()
                 },
                 CommonItemClick(R.string.toast_show_toast_dialog) {
-                    resetToast()
                     DialogHelper.showToastDialog()
+                },
+                CommonItemClick(R.string.toast_show_toast_when_start_activity) {
+                    ToastUtils.showLong(R.string.toast_show_toast_when_start_activity)
+                    start(this)
                 }
         )
     }
-
-    override fun onDestroy() {
-        resetToast()
-        super.onDestroy()
-    }
-
-    private fun resetToast() {
-        ToastUtils.setMsgColor(-0x1000001)
-        ToastUtils.setBgColor(-0x1000001)
-        ToastUtils.setBgResource(-1)
-        ToastUtils.setGravity(-1, -1, -1)
-    }
 }
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt
new file mode 100644
index 0000000000..a486645654
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt
@@ -0,0 +1,78 @@
+package com.blankj.utilcode.pkg.feature.uiMessage
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.UiMessageUtils
+
+
+/**
+ * ```
+ * author: Blankj
+ * blog  : http://blankj.com
+ * time  : 2020/04/14
+ * desc  : demo about UiMessageUtils
+ * ```
+ */
+class UiMessageActivity : CommonActivity(), UiMessageUtils.UiMessageCallback {
+
+    private val titleItem: CommonItemTitle = CommonItemTitle("", true);
+    private var sendContent: String = ""
+
+    companion object {
+        fun start(context: Context) {
+            val starter = Intent(context, UiMessageActivity::class.java)
+            context.startActivity(starter)
+        }
+    }
+
+    override fun bindTitleRes(): Int {
+        return R.string.demo_uiMessage
+    }
+
+    override fun bindItems(): List> {
+        return CollectionUtils.newArrayList(
+                titleItem,
+                CommonItemClick(R.string.uiMessage_add_listener_id) {
+                    UiMessageUtils.getInstance().addListener(R.id.utilCodeUiMessageAddListenerId, this)
+                },
+                CommonItemClick(R.string.uiMessage_remove_all_id) {
+                    UiMessageUtils.getInstance().removeListeners(R.id.utilCodeUiMessageAddListenerId)
+                },
+                CommonItemClick(R.string.uiMessage_add_listener) {
+                    UiMessageUtils.getInstance().addListener(this)
+                },
+                CommonItemClick(R.string.uiMessage_remove_listener) {
+                    UiMessageUtils.getInstance().removeListener(this)
+                },
+                CommonItemClick(R.string.uiMessage_send) {
+                    sendContent = "send: UiMessageActivity#${UiMessageActivity.hashCode()}"
+                    titleItem.title = ""
+                    UiMessageUtils.getInstance().send(R.id.utilCodeUiMessageAddListenerId, UiMessageActivity)
+                }
+        )
+    }
+
+    override fun handleMessage(localMessage: UiMessageUtils.UiMessage) {
+        if (localMessage.id == R.id.utilCodeUiMessageAddListenerId) {
+            var content: String = sendContent
+            content += "\nreceive: UiMessageActivity#${localMessage.getObject().hashCode()}"
+            titleItem.title = if (titleItem.title.toString().isEmpty()) {
+                content
+            } else {
+                titleItem.title.toString() + "\n" + content
+            }
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        UiMessageUtils.getInstance().removeListeners(R.id.utilCodeUiMessageAddListenerId)
+        UiMessageUtils.getInstance().removeListener(this)
+    }
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
index d2cd9bc147..5dc337bc5b 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
@@ -32,11 +32,23 @@ class VibrateActivity : CommonActivity() {
 
     override fun bindItems(): MutableList> {
         return CollectionUtils.newArrayList(
-                CommonItemClick(R.string.vibrate_1000ms) { VibrateUtils.vibrate(1000) },
+                CommonItemClick(R.string.vibrate_1000ms) {
+                    VibrateUtils.vibrate(1000)
+                },
                 CommonItemClick(R.string.vibrate_custom) {
                     VibrateUtils.vibrate(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1)
                 },
-                CommonItemClick(R.string.vibrate_cancel) { VibrateUtils.cancel() }
+                CommonItemClick(R.string.vibrate_background) {
+                    backHome()
+                    mContentView.postDelayed({
+//                        VibrateUtils.vibrate(1000) -- can not vibrate in background
+                        VibrateUtils.vibrateCompat(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1)
+//                        VibrateUtils.vibrateCompat(1000)
+                    }, 1000)
+                },
+                CommonItemClick(R.string.vibrate_cancel) {
+                    VibrateUtils.cancel()
+                }
         )
     }
 
@@ -44,4 +56,11 @@ class VibrateActivity : CommonActivity() {
         super.onDestroy()
         VibrateUtils.cancel()
     }
+
+    private fun backHome() {
+        val intent = Intent(Intent.ACTION_MAIN).apply {
+            addCategory(Intent.CATEGORY_HOME)
+        }
+        startActivity(intent)
+    }
 }
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
new file mode 100644
index 0000000000..26d67dda07
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
@@ -0,0 +1,63 @@
+package com.blankj.utilcode.pkg.feature.volume
+
+import android.content.Context
+import android.content.Intent
+import android.media.AudioManager
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.VolumeUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog  : http://blankj.com
+ * time  : 2018/12/29
+ * desc  : demo about VibrateUtils
+ * ```
+ */
+class VolumeActivity : CommonActivity() {
+
+    companion object {
+        fun start(context: Context) {
+            val starter = Intent(context, VolumeActivity::class.java)
+            context.startActivity(starter)
+        }
+    }
+
+    override fun bindTitleRes(): Int {
+        return R.string.demo_volume
+    }
+
+    override fun bindItems(): MutableList> {
+        return CollectionUtils.newArrayList(
+                getItemSeekBar("Voice Call", AudioManager.STREAM_VOICE_CALL),
+                getItemSeekBar("System", AudioManager.STREAM_SYSTEM),
+                getItemSeekBar("Music", AudioManager.STREAM_MUSIC),
+                getItemSeekBar("Ring", AudioManager.STREAM_RING),
+                getItemSeekBar("Alarm", AudioManager.STREAM_ALARM),
+                getItemSeekBar("Notification", AudioManager.STREAM_NOTIFICATION),
+                getItemSeekBar("Dtmf", AudioManager.STREAM_DTMF)
+        )
+    }
+
+    private fun getItemSeekBar(title: CharSequence, streamType: Int): CommonItemSeekBar {
+        return CommonItemSeekBar(title, VolumeUtils.getMaxVolume(streamType), object : CommonItemSeekBar.ProgressListener() {
+            override fun getCurValue(): Int {
+                return VolumeUtils.getVolume(streamType)
+            }
+
+            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+                VolumeUtils.setVolume(streamType, progress,  AudioManager.FLAG_SHOW_UI)
+            }
+        })
+    }
+
+    override fun onResume() {
+        super.onResume()
+        itemsView.updateItems(bindItems())
+    }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 91d89a4864..7d38fda3ca 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -1,11 +1,10 @@
 package com.blankj.utilcode.pkg.helper
 
+import android.content.Context
 import android.content.DialogInterface
 import android.graphics.Bitmap
 import android.graphics.drawable.ColorDrawable
-import android.support.v4.app.FragmentActivity
 import android.text.method.ScrollingMovementMethod
-import android.util.Pair
 import android.view.Gravity
 import android.view.View
 import android.view.Window
@@ -13,12 +12,14 @@ import android.widget.Button
 import android.widget.EditText
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.fragment.app.FragmentActivity
 import com.blankj.base.dialog.BaseDialogFragment
 import com.blankj.base.dialog.DialogLayoutCallback
-import com.blankj.common.dialog.CommonDialogContent
 import com.blankj.utilcode.pkg.R
-import com.blankj.utilcode.util.*
-import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest
+import com.blankj.utilcode.util.ActivityUtils
+import com.blankj.utilcode.util.KeyboardUtils
+import com.blankj.utilcode.util.ScreenUtils
+import com.blankj.utilcode.util.ToastUtils
 
 /**
  * ```
@@ -30,35 +31,8 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques
  */
 object DialogHelper {
 
-    fun showRationaleDialog(shouldRequest: ShouldRequest) {
-        val topActivity = ActivityUtils.getTopActivity() ?: return
-        CommonDialogContent().init(topActivity as FragmentActivity,
-                StringUtils.getString(android.R.string.dialog_alert_title),
-                StringUtils.getString(R.string.permission_rationale_message),
-                Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
-                    shouldRequest.again(true)
-                }),
-                Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
-                    shouldRequest.again(false)
-                })).show()
-    }
-
-    fun showOpenAppSettingDialog() {
-        val topActivity = ActivityUtils.getTopActivity() ?: return
-        CommonDialogContent().init(topActivity as FragmentActivity,
-                StringUtils.getString(android.R.string.dialog_alert_title),
-                StringUtils.getString(R.string.permission_denied_forever_message),
-                Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
-                    PermissionUtils.launchAppDetailsSettings()
-                }),
-                Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
-                }))
-                .show()
-    }
-
-    fun showKeyboardDialog() {
-        val topActivity = ActivityUtils.getTopActivity() ?: return
-        BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback {
+    fun showKeyboardDialog(context: Context) {
+        BaseDialogFragment().init(context, object : DialogLayoutCallback {
             override fun bindTheme(): Int {
                 return View.NO_ID
             }
@@ -88,7 +62,8 @@ object DialogHelper {
                 contentView.findViewById(R.id.keyboardDialogCloseBtn).setOnClickListener(listener)
 
                 dialog.dialog.setOnShowListener(DialogInterface.OnShowListener {
-                    KeyboardUtils.fixAndroidBug5497(dialog.dialog.window)
+                    KeyboardUtils.fixAndroidBug5497(dialog.dialog.window!!)
+                    KeyboardUtils.showSoftInput()
                 })
             }
 
@@ -180,4 +155,4 @@ object DialogHelper {
             override fun onDismiss(dialog: BaseDialogFragment) {}
         }).show()
     }
-}
+}
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/PermissionHelper.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/PermissionHelper.kt
deleted file mode 100644
index 22c7483f54..0000000000
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/PermissionHelper.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.blankj.utilcode.pkg.helper
-
-import com.blankj.utilcode.constant.PermissionConstants
-import com.blankj.utilcode.util.LogUtils
-import com.blankj.utilcode.util.PermissionUtils
-
-/**
- * ```
- * author: Blankj
- * blog  : http://blankj.com
- * time  : 2018/01/06
- * desc  : helper about permission
- * ```
- */
-object PermissionHelper {
-
-    fun requestCamera(listener: OnPermissionGrantedListener,
-                      deniedListener: OnPermissionDeniedListener) {
-        request(listener, deniedListener, PermissionConstants.CAMERA)
-    }
-
-    fun requestStorage(listener: OnPermissionGrantedListener,
-                       deniedListener: OnPermissionDeniedListener) {
-        request(listener, deniedListener, PermissionConstants.STORAGE)
-    }
-
-    fun requestPhone(listener: OnPermissionGrantedListener,
-                     deniedListener: OnPermissionDeniedListener) {
-        request(listener, deniedListener, PermissionConstants.PHONE)
-    }
-
-    private fun request(grantedListener: OnPermissionGrantedListener,
-                        deniedListener: OnPermissionDeniedListener,
-                        @PermissionConstants.Permission vararg permissions: String) {
-        PermissionUtils.permission(*permissions)
-                .rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) }
-                .callback(object : PermissionUtils.FullCallback {
-                    override fun onGranted(permissionsGranted: List) {
-                        LogUtils.d(permissionsGranted)
-                        grantedListener.onPermissionGranted()
-                    }
-
-                    override fun onDenied(permissionsDeniedForever: List, permissionsDenied: List) {
-                        LogUtils.d(permissionsDeniedForever, permissionsDenied)
-                        if (!permissionsDeniedForever.isEmpty()) {
-                            DialogHelper.showOpenAppSettingDialog()
-                            return
-                        }
-                        deniedListener.onPermissionDenied()
-                    }
-                })
-                .request()
-    }
-
-    interface OnPermissionGrantedListener {
-        fun onPermissionGranted()
-    }
-
-    interface OnPermissionDeniedListener {
-        fun onPermissionDenied()
-    }
-}
diff --git a/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml b/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml
index abe259f89f..50a4898a07 100644
--- a/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml
+++ b/feature/utilcode/pkg/src/main/res/drawable/bar_status_custom.xml
@@ -2,8 +2,9 @@
 
 
     
+        android:angle="180"
+        android:centerColor="@android:color/transparent"
+        android:endColor="@color/colorPrimary"
+        android:startColor="@color/colorPrimary" />
 
 
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml b/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml
index 5589315966..7abb0e7159 100644
--- a/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml
+++ b/feature/utilcode/pkg/src/main/res/drawable/shadow_circle.xml
@@ -2,6 +2,6 @@
 
 
-    
+    
 
 
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml b/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml
index 97c4e0b168..576688b254 100644
--- a/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml
+++ b/feature/utilcode/pkg/src/main/res/drawable/shadow_round_rect.xml
@@ -1,7 +1,7 @@
 
 
 
-    
+    
     
 
 
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
new file mode 100644
index 0000000000..278fe8c2c6
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -0,0 +1,34 @@
+
+
+
+