未验证 提交 7fa9fcf5 编写于 作者: foozuu's avatar foozuu 提交者: GitHub

Merge pull request #1 from Blankj/master

更新最新
---
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: <!-- e.g. 1.16.3 -->
- The version of AndroidUtilCode: <!-- e.g. utilcode:1.16.3 or utilcodex:1.16.3 -->
- The device: <!-- e.g. Nexus 5X -->
- The version of device: <!-- API 27 -->
......@@ -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).
---
name: 提交 Bug
about: 让工具类更完美!
labels: bug
assignees: Blankj
---
## 描述 Bug
简洁地描述下 Bug。
- AndroidUtilCode 的版本:<!-- 例如 utilcode:1.16.3 或 utilcodex:1.16.3(这里面是注释,内容需要放在外面) -->
- 出现 Bug 的设备型号:<!-- 例如 Nexus 5X -->
- 设备的 Android 版本:<!-- 例如 API 27 -->
## 相关代码
<!-- 例如
```java
CrashUtils.init();
```
-->
```
put your code here
```
## 异常堆栈
<!-- 例如
```
Caused by: java.lang.NullPointerException: u should init first
at com.blankj.utilcode.util.Utils.getApp(Utils.java:98)
at com.blankj.utilcode.util.CrashUtils.<clinit>(CrashUtils.java:55)
at com.blankj.utilcode.util.CrashUtils.init(CrashUtils.java:168) 
at com.blankj.androidutilcode.UtilsApp.initCrash(UtilsApp.java:71) 
at com.blankj.androidutilcode.UtilsApp.onCreate(UtilsApp.java:33) 
```
-->
```
put the stack of crash here
```
## 截图
如果有的话请添加屏幕截图以帮助解释问题。
## 请删除当前行及以下内容
感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
---
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).
---
name: 提交需求
about: 让工具类更健全!
labels: help wanted
assignees: Blankj
---
## 描述需求
简洁地描述下需求。
## 可借鉴的
如果有的话,可以给出一些参考文章、链接、代码
## 请删除当前行及以下内容
感谢支持 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode).
......@@ -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
......@@ -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
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
* `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.
......
......@@ -51,7 +51,7 @@
[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
......
......@@ -51,7 +51,7 @@ If this project helps you a lot and you want to support the project's developmen
[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
......
......@@ -5,21 +5,9 @@ buildscript {
// use for debug plugin local
if (Config.depConfig.plugin_bus.useLocal || Config.depConfig.plugin_api.useLocal) {
maven() {
url new File("maven")
url new File("mavenLocal")
}
}
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()'
}
google()
jcenter()
}
......@@ -33,21 +21,7 @@ buildscript {
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"
}
maven { url "https://jitpack.io" }
google()
jcenter()
}
......@@ -58,7 +32,7 @@ allprojects {
resolutionStrategy.eachDependency {
if (it.requested.group == 'com.android.support'
&& !it.requested.name.contains('multidex')) {
it.useVersion Config.support_version
it.useVersion Config.supportVersion
}
}
}
......@@ -66,4 +40,4 @@ allprojects {
task clean(type: Delete) {
delete rootProject.buildDir
}
}
\ No newline at end of file
......@@ -2,12 +2,12 @@ apply {
plugin "com.android.application"
plugin "kotlin-android"
plugin "kotlin-android-extensions"
if (Config.depConfig.plugin_bus.isApply) {
plugin Config.depConfig.plugin_bus.pluginId
}
if (Config.depConfig.plugin_api.isApply) {
plugin Config.depConfig.plugin_api.pluginId
}
if (Config.depConfig.plugin_bus.isApply) {
plugin Config.depConfig.plugin_bus.pluginId
}
}
configSigning()
......@@ -67,8 +67,6 @@ android {
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.depConfig.lib_utildebug.dep
releaseImplementation Config.depConfig.lib_utildebug_no_op.dep
......@@ -84,8 +82,8 @@ dependencies {
}
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() {
......
......@@ -24,20 +24,19 @@ android {
lintOptions {
abortOnError false
}
}
afterEvaluate {
generateReleaseBuildConfig.enabled = false
generateDebugBuildConfig.enabled = false
// viewBinding {
// enabled = true
// }
}
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') {
} else if (project.name.endsWith("_export")) {
api Config.depConfig.lib_common.dep
}
}
\ No newline at end of file
......@@ -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'
}
}
}
......
......@@ -11,66 +11,67 @@ class Config {
static applicationId = 'com.blankj.androidutilcode'
static appName = 'Util'
static compileSdkVersion = 28
static compileSdkVersion = 29
static minSdkVersion = 14
static targetSdkVersion = 28
static targetSdkVersion = 29
static versionCode = 1_026_001
static versionName = '1.26.1'// E.g. 1.9.72 => 1,009,072
static versionName = '1.28.0'// 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 = '3.5.0'
static kotlinVersion = '1.3.50'
static supportVersion = '28.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"),
plugin_api_gradle_plugin : new DepConfig(true , true , ":plugin:api-gradle-plugin"),
plugin_bus_gradle_plugin : new DepConfig(true , 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:$versionName"),
lib_utildebug : new DepConfig(true , true , ":lib:utildebug"),
lib_utildebug_no_op : new DepConfig(true , true , ":lib:utildebug-no-op"),
/*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_gradle : new DepConfig(pluginPath: "com.android.tools.build:gradle:$gradlePluginVersion"),
plugin_kotlin : new DepConfig(pluginPath: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"),
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"),// 注解转非空判断
// 本地第一次上传插件新的版本需设置 isApply = false, useLocal = true
// 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false
// 发布版本的话把 isApply = false, useLocal = false,更新版本号,发布成功后 isApply = true 即可使用远程库版本
// 上传新版本插件更新 pluginPath 中的版本号,并设置 isApply = false
// 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件
plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.2", pluginId: "com.blankj.api"),
//./gradlew plugin:plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew plugin:plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.4", pluginId: "com.blankj.bus"),
//./gradlew plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew plugin: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_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$supportVersion"),
support_design : new DepConfig("com.android.support:design:$supportVersion"),
support_multidex : new DepConfig("com.android.support:multidex:1.0.2"),
support_constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"),
kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"),
kotlin : new DepConfig("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_android : new DepConfig("com.squareup.leakcanary:leakcanary-android:2.1"),
free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"),
free_proguard : new DepConfig("com.blankj:free-proguard:1.0.2"),
swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"),
gson : new DepConfig("com.google.code.gson:gson:2.8.6"),
gson : new DepConfig("com.google.code.gson:gson:2.8.5"),
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"),
......@@ -81,7 +82,7 @@ class Config {
photo_view : new DepConfig("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_robolectric : new DepConfig("org.robolectric:robolectric:4.3.1"),
]
}
//./gradlew clean :lib:utilcode:bintrayUpload
\ No newline at end of file
//./gradlew clean lib:lib_utilcode:bintrayUpload
\ No newline at end of file
......@@ -27,11 +27,11 @@ class ConfigUtils {
def configs = [:]
for (Map.Entry<String, DepConfig> entry : Config.depConfig.entrySet()) {
def (name, config) = [entry.key, entry.value]
if (name.startsWith("plugin_")) {
if (entry.value.pluginPath) {
config.dep = config.pluginPath
} else {
if (config.useLocal) {
config.dep = gradle.rootProject.findProject(config.localPath)
config.dep = gradle.rootProject.findProject(config.projectPath)
} else {
config.dep = config.remotePath
}
......@@ -47,10 +47,10 @@ class ConfigUtils {
void beforeEvaluate(Project project) {
// 在 project 的 build.gradle 前 do sth.
if (project.subprojects.isEmpty()) {
if (project.path.contains(":plugin:")) {
if (project.name.startsWith("plugin")) {
return
}
if (project.name == "app") {
if (project.name.endsWith("_app")) {
GLog.l(project.toString() + " applies buildApp.gradle")
project.apply {
from "${project.rootDir.path}/buildApp.gradle"
......@@ -74,7 +74,7 @@ class ConfigUtils {
static getApplyPlugins() {
def plugins = [:]
for (Map.Entry<String, DepConfig> entry : Config.depConfig.entrySet()) {
if (entry.value.isApply && entry.value.pluginPath != null) {
if (entry.value.isApply && entry.value.pluginPath) {
plugins.put(entry.key, entry.value)
}
}
......
......@@ -50,7 +50,7 @@ class DepConfig {
this.remotePath = remotePath
}
void setPluginPath(String pluginPath){
void setPluginPath(String pluginPath) {
this.pluginPath = pluginPath
this.remotePath = pluginPath
}
......@@ -75,6 +75,10 @@ class DepConfig {
return splits.length == 3 ? splits[2] : null
}
String getProjectPath() {
return localPath.substring(0, localPath.lastIndexOf(":")) + ":" + localPath.substring(1).replace(":", "_")
}
@Override
String toString() {
return "{ isApply = ${getFlag(isApply)}" +
......
......@@ -14,62 +14,98 @@ import java.text.SimpleDateFormat
*/
class GitUtils {
private static String sCurBranchName;
private static Project rootProject;
static void init(Gradle gradle) {
gradle.rootProject(new Action<Project>() {
@Override
void execute(Project project) {
sCurBranchName = getGitBranch()
addGitPushTask(project)
addGitPushAndMerge2MasterTask(project)
addGitNewBranchTask(project)
rootProject = gradle.rootProject
addGitHelpTask()
}
static def addGitHelpTask() {
rootProject.task("gitHelp").doLast {
def commands = [
" ############## input command code #################",
" # [1] Git Push #",
" # [2] Git Push And Merge to Master #",
" # [3] Git New Branch #",
" # [0] exit #",
" ###################################################",
]
String commandTips = String.join(System.getProperty("line.separator"), commands)
while (true) {
GLog.l(commandTips)
Scanner scanner = new Scanner(System.in)
def input = scanner.next()
GLog.l(input)
switch (input) {
case "1":
gitPush()
break
case "2":
gitPushAndMerge2Master()
break
case "3":
gitNewBranch()
break
case "0":
return
}
}
})
}
}
static def getGitBranch() {
return ShellUtils.execCmd('git symbolic-ref --short -q HEAD').successMsg
static void gitPush() {
String branchName = getGitBranch()
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd")
String date = simpleDateFormat.format(new Date())
exeCmd(
"git add -A",
"git commit -m \"see $date log\"",
"git push origin $branchName"
)
}
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 gitPushAndMerge2Master() {
String branchName = getGitBranch()
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd")
String date = simpleDateFormat.format(new Date())
exeCmd(
"git add -A",
"git commit -m \"see $date log\"",
"git push origin $branchName",
"git checkout master",
"git merge $branchName",
"git push origin master",
"git checkout $branchName"
)
}
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 gitNewBranch() {
exeCmd(
"git checkout master",
"git checkout -b ${Config.versionName}",
"git push origin ${Config.versionName}:${Config.versionName}",
)
}
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[]))
private static def getGitBranch() {
return exeCmd("git symbolic-ref --short -q HEAD")
}
private static def exeCmd(String... cmds) {
String output = ""
for (def cmd in cmds) {
output = _exeCmd(cmd)
}
return output
}
private static def _exeCmd(String cmd) {
def output = new StringBuilder()
GLog.l("Execute command: ${cmd}")
def cmdResult = ShellUtils.execCmd(cmd)
GLog.l("$cmdResult")
return cmdResult.successMsg
}
}
// ./gradlew gitPush
// ./gradlew gitPushAndMerge2Master
// ./gradlew gitNewBranch
// ./gradlew gitHelp
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(),
......
package com.blankj.plugin
package com.blankj.plugin.readme
import org.gradle.api.Plugin
import org.gradle.api.Project
......@@ -30,8 +30,12 @@ class ReadmeCorePlugin implements Plugin<Project> {
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("我的二维码")) {
......
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<Project> {
@Override
......@@ -30,9 +27,9 @@ class ReadmeSubPlugin implements Plugin<Project> {
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<Project> {
} else {
sb.append(line)
}
sb.append(LINE_SEP)
sb.append(FormatUtils.LINE_SEP)
}
readmeEng.write(sb.toString(), "UTF-8")
}
......
......@@ -5,8 +5,8 @@
"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": ":plugin:api-gradle-plugin"},
{"isApply": true, "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"},
......@@ -20,8 +20,8 @@
{"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"}
{"isApply": true, "useLocal": true, "localPath": ":lib:utilcode", "remotePath": "com.blankj:utilcode:$versionName"},
{"isApply": true, "useLocal": true, "localPath": ":lib:utildebug"},
{"isApply": true, "useLocal": true, "localPath": ":lib:utildebug-no-op"}
]
}
......@@ -9,9 +9,9 @@ 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.*
......@@ -69,6 +69,6 @@ class MainActivity : CommonActivity() {
}
override fun onBackPressed() {
ActivityUtils.startHomeActivity()
ClickUtils.back2HomeFriendly("Press again to exit.")
}
}
......@@ -28,6 +28,10 @@
android:name=".feature.appStore.AppStoreActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
<activity
android:name=".feature.battery.BatteryActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
<activity
android:name=".feature.country.CountryActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
......
......@@ -3,12 +3,11 @@ package com.blankj.subutil.pkg.feature
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.subutil.pkg.R
import com.blankj.subutil.pkg.feature.appStore.AppStoreActivity
import com.blankj.subutil.pkg.feature.battery.BatteryActivity
import com.blankj.subutil.pkg.feature.country.CountryActivity
import com.blankj.subutil.pkg.feature.dangerous.DangerousActivity
import com.blankj.subutil.pkg.feature.location.LocationActivity
......@@ -42,6 +41,9 @@ class SubUtilActivity : CommonActivity() {
CommonItemClick(R.string.demo_app_store, true) {
AppStoreActivity.start(this)
},
CommonItemClick(R.string.demo_battery, true) {
BatteryActivity.start(this)
},
CommonItemClick(R.string.demo_country, true) {
CountryActivity.start(this)
},
......
package com.blankj.subutil.pkg.feature.battery
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.subutil.pkg.R
import com.blankj.subutil.util.BatteryUtils
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.ToastUtils
/**
* ```
* author: Blankj
* blog : http://blankj.com
* time : 20/03/31
* desc : demo about Battery
* ```
*/
class BatteryActivity : CommonActivity(), BatteryUtils.OnBatteryStatusChangedListener {
private val titleItem: CommonItemTitle = CommonItemTitle("", true);
companion object {
fun start(context: Context) {
val starter = Intent(context, BatteryActivity::class.java)
context.startActivity(starter)
}
}
override fun bindTitleRes(): Int {
return R.string.demo_battery
}
override fun bindItems(): MutableList<CommonItem<*>> {
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)
}
}
......@@ -24,7 +24,7 @@ class DangerousActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestStorageAndSms(object : PermissionHelper.OnPermissionGrantedListener {
PermissionHelper.requestStorageAndSms(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
val starter = Intent(context, DangerousActivity::class.java)
context.startActivity(starter)
......@@ -87,9 +87,9 @@ class DangerousActivity : CommonActivity() {
CommonItemClick(R.string.dangerous_reboot_to_bootloader) {
ToastUtils.showShort(DangerousUtils.reboot2Bootloader().toString())
},
CommonItemSwitch(R.string.dangerous_data_enabled, Utils.Func1 {
CommonItemSwitch(R.string.dangerous_data_enabled, Utils.Supplier {
NetworkUtils.getMobileDataEnabled()
}, Utils.Func1 {
}, Utils.Consumer {
if (AppUtils.isAppSystem()) {
DangerousUtils.setMobileDataEnabled(it)
}
......
......@@ -24,7 +24,7 @@ class LocationActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestLocation(object : PermissionHelper.OnPermissionGrantedListener {
PermissionHelper.requestLocation(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
val starter = Intent(context, LocationActivity::class.java)
context.startActivity(starter)
......
package com.blankj.subutil.pkg.helper
import android.support.v4.app.FragmentActivity
import android.content.Context
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
......@@ -20,9 +19,8 @@ import com.blankj.utilcode.util.StringUtils
*/
object DialogHelper {
fun showRationaleDialog(shouldRequest: ShouldRequest) {
val topActivity = ActivityUtils.getTopActivity() ?: return
CommonDialogContent().init(topActivity as FragmentActivity?,
fun showRationaleDialog(context: Context, shouldRequest: ShouldRequest) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_rationale_message),
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
......@@ -34,9 +32,8 @@ object DialogHelper {
.show()
}
fun showOpenAppSettingDialog() {
val topActivity = ActivityUtils.getTopActivity() ?: return
CommonDialogContent().init(topActivity as FragmentActivity?,
fun showOpenAppSettingDialog(context: Context) {
CommonDialogContent().init(context,
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 {
......
package com.blankj.subutil.pkg.helper
import android.content.Context
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.PermissionUtils
......@@ -14,21 +15,22 @@ import com.blankj.utilcode.util.PermissionUtils
*/
object PermissionHelper {
fun requestStorageAndSms(listener: OnPermissionGrantedListener,
fun requestStorageAndSms(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(listener, deniedListener, PermissionConstants.STORAGE, PermissionConstants.SMS)
request(context, listener, deniedListener, PermissionConstants.STORAGE, PermissionConstants.SMS)
}
fun requestLocation(listener: OnPermissionGrantedListener,
fun requestLocation(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(listener, deniedListener, PermissionConstants.LOCATION)
request(context, listener, deniedListener, PermissionConstants.LOCATION)
}
private fun request(grantedListener: OnPermissionGrantedListener?,
private fun request(context: Context,
grantedListener: OnPermissionGrantedListener?,
deniedListener: OnPermissionDeniedListener?,
@PermissionConstants.Permission vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) }
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......@@ -38,7 +40,7 @@ object PermissionHelper {
override fun onDenied(permissionsDeniedForever: List<String>, permissionsDenied: List<String>) {
LogUtils.d(permissionsDeniedForever, permissionsDenied)
if (!permissionsDeniedForever.isEmpty()) {
DialogHelper.showOpenAppSettingDialog()
DialogHelper.showOpenAppSettingDialog(context)
return
}
deniedListener?.onPermissionDenied()
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="demo_app_store">App Store Demo</string>
<string name="demo_battery">Battery Demo</string>
<string name="demo_country">Country Demo</string>
<string name="demo_dangerous">Dangerous Demo</string>
<string name="demo_location">LocationUtils Demo</string>
......
......@@ -4,6 +4,7 @@
<!-- app -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<!-- bar -->
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
......@@ -142,6 +143,10 @@
android:name=".feature.device.DeviceActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
<activity
android:name=".feature.file.FileActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
<activity
android:name=".feature.flashlight.FlashlightActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
......
package com.blankj.utilcode.pkg
import android.os.Environment
import com.blankj.utilcode.util.Utils
import com.blankj.utilcode.util.PathUtils
/**
* ```
......@@ -12,20 +11,9 @@ import com.blankj.utilcode.util.Utils
* ```
*/
object Config {
val FILE_SEP = System.getProperty("file.separator")
val LINE_SEP = System.getProperty("line.separator")
const val TEST_PKG = "com.blankj.testinstall"
val CACHE_PATH: String
val TEST_APK_PATH: String
init {
val cacheDir = Utils.getApp().externalCacheDir
CACHE_PATH = if (cacheDir != null) {
cacheDir.absolutePath
} else {
Environment.getExternalStorageDirectory().absolutePath
} + FILE_SEP
TEST_APK_PATH = CACHE_PATH + "test_install.apk"
}
val CACHE_PATH = PathUtils.getCachePathExternalFirst() + FILE_SEP
val TEST_APK_PATH: String = CACHE_PATH + "test_install.apk"
}
......@@ -2,6 +2,8 @@ package com.blankj.utilcode.pkg.feature
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.TextView
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
......@@ -16,6 +18,7 @@ import com.blankj.utilcode.pkg.feature.bus.BusActivity
import com.blankj.utilcode.pkg.feature.clean.CleanActivity
import com.blankj.utilcode.pkg.feature.click.ClickActivity
import com.blankj.utilcode.pkg.feature.device.DeviceActivity
import com.blankj.utilcode.pkg.feature.file.FileActivity
import com.blankj.utilcode.pkg.feature.flashlight.FlashlightActivity
import com.blankj.utilcode.pkg.feature.fragment.FragmentActivity
import com.blankj.utilcode.pkg.feature.image.ImageActivity
......@@ -43,6 +46,7 @@ import com.blankj.utilcode.pkg.feature.span.SpanActivity
import com.blankj.utilcode.pkg.feature.toast.ToastActivity
import com.blankj.utilcode.pkg.feature.vibrate.VibrateActivity
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.UtilsTransActivity
/**
* ```
......@@ -100,6 +104,9 @@ class CoreUtilActivity : CommonActivity() {
CommonItemClick(R.string.demo_device, true) {
DeviceActivity.start(this)
},
CommonItemClick(R.string.demo_file, true) {
FileActivity.start(this)
},
CommonItemClick(R.string.demo_flashlight, true) {
FlashlightActivity.start(this)
},
......@@ -175,6 +182,15 @@ class CoreUtilActivity : CommonActivity() {
CommonItemClick(R.string.demo_toast, true) {
ToastActivity.start(this)
},
CommonItemClick(R.string.demo_trans_activity, true) {
UtilsTransActivity.start(this, object : UtilsTransActivity.TransActivityDelegate() {
override fun onCreated(activity: UtilsTransActivity, savedInstanceState: Bundle?) {
super.onCreated(activity, savedInstanceState)
activity.setContentView(R.layout.common_dialog_loading)
activity.findViewById<TextView>(R.id.utilActionLoadingMsgTv).text = "Trans Activity is showing..."
}
})
},
CommonItemClick(R.string.demo_vibrate, true) {
VibrateActivity.start(this)
}
......
......@@ -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()
}
......
......@@ -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)
}
......
......@@ -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
......
......@@ -3,8 +3,6 @@ package com.blankj.utilcode.pkg.feature.app
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
......@@ -26,7 +24,7 @@ class AppActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestStorage(object : PermissionHelper.OnPermissionGrantedListener {
PermissionHelper.requestStorage(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
val starter = Intent(context, AppActivity::class.java)
context.startActivity(starter)
......@@ -49,6 +47,11 @@ class AppActivity : CommonActivity() {
return R.string.demo_app
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
LogUtils.e(requestCode, resultCode)
}
override fun bindItems(): List<CommonItem<*>> {
return CollectionUtils.newArrayList(
CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
......
......@@ -42,20 +42,20 @@ class BarNavActivity : CommonActivity() {
if (BarUtils.isSupportNavBar()) {
add(CommonItemSwitch(
R.string.bar_nav_visibility,
Utils.Func1 {
Utils.Supplier {
BarUtils.isNavBarVisible(this@BarNavActivity)
},
Utils.Func1 {
Utils.Consumer {
BarUtils.setNavBarVisibility(this@BarNavActivity, it)
}
))
add(CommonItemSwitch(
R.string.bar_nav_light_mode,
Utils.Func1 {
Utils.Supplier {
BarUtils.isNavBarLightMode(this@BarNavActivity)
},
Utils.Func1 {
Utils.Consumer {
BarUtils.setNavBarLightMode(this@BarNavActivity, it)
}
))
......
......@@ -37,19 +37,19 @@ class BarStatusActivity : CommonActivity() {
CommonItemTitle("getStatusBarHeight", BarUtils.getStatusBarHeight().toString()),
CommonItemSwitch(
R.string.bar_status_visibility,
Utils.Func1 {
Utils.Supplier {
BarUtils.isStatusBarVisible(this)
},
Utils.Func1 {
Utils.Consumer {
BarUtils.setStatusBarVisibility(this, it)
}
),
CommonItemSwitch(
R.string.bar_status_light_mode,
Utils.Func1 {
Utils.Supplier {
BarUtils.isStatusBarLightMode(this)
},
Utils.Func1 {
Utils.Consumer {
BarUtils.setStatusBarLightMode(this, it)
}
)
......
......@@ -73,10 +73,10 @@ class BarStatusActivityDrawer : CommonActivity() {
})
return CollectionUtils.newArrayList(
CommonItemSwitch(R.string.bar_status_title_alpha, Utils.Func1 {
CommonItemSwitch(R.string.bar_status_title_alpha, Utils.Supplier {
updateStatusBar()
return@Func1 mAlphaStatus
}, Utils.Func1 {
return@Supplier mAlphaStatus
}, Utils.Consumer {
mAlphaStatus = it
if (mAlphaStatus) {
barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena)
......@@ -86,9 +86,9 @@ class BarStatusActivityDrawer : CommonActivity() {
commonItemAdapter.replaceItem(2, randomColorItem, true)
}
}),
CommonItemSwitch(R.string.bar_status_is_front, Utils.Func1 {
return@Func1 mFrontStatus
}, Utils.Func1 {
CommonItemSwitch(R.string.bar_status_is_front, Utils.Supplier {
return@Supplier mFrontStatus
}, Utils.Consumer {
mFrontStatus = it
updateStatusBar()
}),
......
......@@ -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
......@@ -70,10 +68,10 @@ class BrightnessActivity : CommonActivity() {
}),
CommonItemSwitch(
R.string.brightness_auto_brightness,
Utils.Func1 {
Utils.Supplier {
BrightnessUtils.isAutoBrightnessEnabled()
},
Utils.Func1 {
Utils.Consumer {
BrightnessUtils.setAutoBrightnessEnabled(it)
}
)
......
......@@ -4,14 +4,13 @@ import android.content.Context
import android.content.Intent
import android.support.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
})
}
......
......@@ -34,22 +34,22 @@ class ClickActivity : CommonActivity() {
override fun bindItems(): MutableList<CommonItem<*>> {
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<ClickItem> {
private val mFunc1: Utils.Func1<Unit, View>;
private val mConsumer: Utils.Consumer<View>;
private val mTitle: String
constructor(@StringRes title: Int, func1: Utils.Func1<Unit, View>) : super(R.layout.common_item_title_click) {
mFunc1 = func1
constructor(@StringRes title: Int, consumer: Utils.Consumer<View>) : super(R.layout.common_item_title_click) {
mConsumer = consumer
mTitle = StringUtils.getString(title)
}
......@@ -110,6 +110,6 @@ class ClickItem : CommonItem<ClickItem> {
.setDuration(SnackbarUtils.LENGTH_LONG)
.show()
}
mFunc1.call(holder.itemView)
mConsumer.accept(holder.itemView)
}
}
......@@ -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
......
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 ClickUtils
* ```
*/
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<CommonItem<*>> {
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()
}
}
......@@ -3,7 +3,6 @@ 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.item.CommonItem
import com.blankj.common.item.CommonItemSwitch
import com.blankj.common.item.CommonItemTitle
......@@ -30,7 +29,7 @@ class FlashlightActivity : CommonActivity() {
ToastUtils.showLong("Didn't support flashlight.")
return
}
PermissionHelper.requestCamera(object : PermissionHelper.OnPermissionGrantedListener {
PermissionHelper.requestCamera(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
val starter = Intent(context, FlashlightActivity::class.java)
context.startActivity(starter)
......@@ -53,10 +52,10 @@ class FlashlightActivity : CommonActivity() {
if (FlashlightUtils.isFlashlightEnable()) {
add(CommonItemSwitch(
R.string.flashlight_status,
Utils.Func1 {
Utils.Supplier {
FlashlightUtils.isFlashlightOn()
},
Utils.Func1 {
Utils.Consumer {
FlashlightUtils.setFlashlightStatus(it)
}
))
......
......@@ -80,69 +80,69 @@ class ImageActivity : CommonActivity() {
}
})
})
add(CommonItemImage(R.string.image_src, Utils.Func1 {
add(CommonItemImage(R.string.image_src, Utils.Consumer {
it.setImageBitmap(src)
}))
add(CommonItemImage(R.string.image_add_color, Utils.Func1 {
add(CommonItemImage(R.string.image_add_color, Utils.Consumer {
it.setImageBitmap(ImageUtils.drawColor(src, Color.parseColor("#8000FF00")))
}))
add(CommonItemImage(R.string.image_scale, Utils.Func1 {
add(CommonItemImage(R.string.image_scale, Utils.Consumer {
it.setImageBitmap(ImageUtils.scale(src, width / 2, height / 2))
}))
add(CommonItemImage(R.string.image_clip, Utils.Func1 {
add(CommonItemImage(R.string.image_clip, Utils.Consumer {
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, Utils.Consumer {
it.setImageBitmap(ImageUtils.skew(src, 0.2f, 0.1f))
}))
add(CommonItemImage(R.string.image_rotate, Utils.Func1 {
add(CommonItemImage(R.string.image_rotate, Utils.Consumer {
it.setImageBitmap(ImageUtils.rotate(src, 90, (width / 2).toFloat(), (height / 2).toFloat()))
}))
add(CommonItemImage(R.string.image_to_round) { it ->
it.setImageBitmap(ImageUtils.toRound(src))
})
add(CommonItemImage(R.string.image_to_round_border, Utils.Func1 {
add(CommonItemImage(R.string.image_to_round_border, Utils.Consumer {
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, Utils.Consumer {
it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f))
}))
add(CommonItemImage(R.string.image_to_round_corner_border, Utils.Func1 {
add(CommonItemImage(R.string.image_to_round_corner_border, Utils.Consumer {
it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f, 16, Color.GREEN))
}))
add(CommonItemImage(R.string.image_add_corner_border, Utils.Func1 {
add(CommonItemImage(R.string.image_add_corner_border, Utils.Consumer {
it.setImageBitmap(ImageUtils.addCornerBorder(src, 16, Color.GREEN, 0f))
}))
add(CommonItemImage(R.string.image_add_circle_border, Utils.Func1 {
add(CommonItemImage(R.string.image_add_circle_border, Utils.Consumer {
it.setImageBitmap(ImageUtils.addCircleBorder(round, 16, Color.GREEN))
}))
add(CommonItemImage(R.string.image_add_reflection, Utils.Func1 {
add(CommonItemImage(R.string.image_add_reflection, Utils.Consumer {
it.setImageBitmap(ImageUtils.addReflection(src, 80))
}))
add(CommonItemImage(R.string.image_add_text_watermark, Utils.Func1 {
add(CommonItemImage(R.string.image_add_text_watermark, Utils.Consumer {
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, Utils.Consumer {
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, Utils.Consumer {
it.setImageBitmap(ImageUtils.toGray(src))
}))
add(CommonItemImage(R.string.image_fast_blur, Utils.Func1 {
add(CommonItemImage(R.string.image_fast_blur, Utils.Consumer {
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, Utils.Consumer {
it.setImageBitmap(ImageUtils.renderScriptBlur(src, 10f))
}))
}
add(CommonItemImage(R.string.image_stack_blur, Utils.Func1 {
add(CommonItemImage(R.string.image_stack_blur, Utils.Consumer {
it.setImageBitmap(ImageUtils.stackBlur(src, 10))
}))
add(CommonItemImage(R.string.image_compress_by_scale, Utils.Func1 {
add(CommonItemImage(R.string.image_compress_by_scale, Utils.Consumer {
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, Utils.Consumer {
it.setImageBitmap(ImageUtils.compressBySampleSize(src, 2))
}))
}
......
......@@ -67,7 +67,7 @@ class KeyboardActivity : CommonActivity() {
},
CommonItemClick(R.string.keyboard_show_dialog) {
keyboardEt.clearFocus()
DialogHelper.showKeyboardDialog()
DialogHelper.showKeyboardDialog(this)
}
)
}
......
......@@ -114,23 +114,23 @@ class LogActivity : CommonActivity() {
return CollectionUtils.newArrayList(
CommonItemSwitch(
R.string.log_switch,
Utils.Func1 {
Utils.Supplier {
mConfig.isLogSwitch
},
Utils.Func1 {
Utils.Consumer {
mConfig.isLogSwitch = it
}
),
CommonItemSwitch(
R.string.log_console_console,
Utils.Func1 {
Utils.Supplier {
mConfig.isLog2ConsoleSwitch
},
Utils.Func1 {
Utils.Consumer {
mConfig.setConsoleSwitch(it)
}
),
CommonItemClick("Global Tag", if (mConfig.globalTag == "") "\"\"" else mConfig.globalTag).setOnClickUpdateContentListener {
CommonItemClick("Global Tag", if (mConfig.globalTag == "") "null" else mConfig.globalTag).setOnClickUpdateContentListener {
if (StringUtils.isSpace(mConfig.globalTag)) {
mConfig.globalTag = TAG
} else {
......@@ -140,19 +140,19 @@ class LogActivity : CommonActivity() {
},
CommonItemSwitch(
R.string.log_head_switch,
Utils.Func1 {
Utils.Supplier {
mConfig.isLogHeadSwitch
},
Utils.Func1 {
Utils.Consumer {
mConfig.isLogHeadSwitch = it
}
),
CommonItemSwitch(
R.string.log_file_switch,
Utils.Func1 {
Utils.Supplier {
mConfig.isLog2FileSwitch
},
Utils.Func1 {
Utils.Consumer {
mConfig.isLog2FileSwitch = it
}
),
......@@ -166,19 +166,19 @@ class LogActivity : CommonActivity() {
},
CommonItemSwitch(
R.string.log_border_switch,
Utils.Func1 {
Utils.Supplier {
mConfig.isLogBorderSwitch
},
Utils.Func1 {
Utils.Consumer {
mConfig.setBorderSwitch(it)
}
),
CommonItemSwitch(
R.string.log_single_tag_switch,
Utils.Func1 {
Utils.Supplier {
mConfig.isSingleTagSwitch
},
Utils.Func1 {
Utils.Consumer {
mConfig.setSingleTagSwitch(it)
}
),
......
......@@ -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
/**
* ```
......
......@@ -23,6 +23,6 @@ public interface IMvp {
}
interface Model {
void requestUpdateMsg(final Utils.Func1<Void, String> func1);
void requestUpdateMsg(final Utils.Consumer<String> consumer);
}
}
......@@ -27,17 +27,17 @@ public class MvpModel extends BaseModel implements IMvp.Model {
}
@Override
public void requestUpdateMsg(final Utils.Func1<Void, String> func1) {
public void requestUpdateMsg(final Utils.Consumer<String> consumer) {
ThreadUtils.executeByCached(addAutoDestroyTask(new ThreadUtils.SimpleTask<String>() {
@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);
}
}));
}
......
......@@ -21,12 +21,11 @@ public class MvpPresenter extends BasePresenter<MvpView>
@Override
public void updateMsg() {
getView().setLoadingVisible(true);
getModel(MvpModel.class).requestUpdateMsg(new Utils.Func1<Void, String>() {
getModel(MvpModel.class).requestUpdateMsg(new Utils.Consumer<String>() {
@Override
public Void call(String param) {
getView().showMsg(param);
public void accept(String s) {
getView().showMsg(s);
getView().setLoadingVisible(false);
return null;
}
});
}
......
......@@ -56,6 +56,7 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
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()),
......@@ -73,10 +74,10 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
CommonItemSwitch(
R.string.network_wifi_enabled,
Utils.Func1 {
Utils.Supplier {
NetworkUtils.getWifiEnabled()
},
Utils.Func1 {
Utils.Consumer {
NetworkUtils.setWifiEnabled(it)
ThreadUtils.executeByIo(getItemsTask())
}
......
......@@ -56,47 +56,47 @@ 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.Supplier {
return@Supplier PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR)
},
Utils.Func1 {
Utils.Consumer {
requestCalendar()
}
))
add(CommonItemSwitch(
R.string.permission_record_audio_status,
Utils.Func1 {
return@Func1 PermissionUtils.isGranted(Manifest.permission.RECORD_AUDIO)
Utils.Supplier {
return@Supplier PermissionUtils.isGranted(Manifest.permission.RECORD_AUDIO)
},
Utils.Func1 {
Utils.Consumer {
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.Supplier {
return@Supplier PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR, Manifest.permission.RECORD_AUDIO)
},
Utils.Func1 {
Utils.Consumer {
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.Supplier {
return@Supplier PermissionUtils.isGrantedWriteSettings()
},
Utils.Func1 {
Utils.Consumer {
requestWriteSettings()
}
))
add(CommonItemSwitch(
R.string.permission_write_settings_status,
Utils.Func1 {
return@Func1 PermissionUtils.isGrantedDrawOverlays()
Utils.Supplier {
return@Supplier PermissionUtils.isGrantedDrawOverlays()
},
Utils.Func1 {
Utils.Consumer {
requestDrawOverlays()
}
))
......@@ -106,7 +106,7 @@ class PermissionActivity : CommonActivity() {
private fun requestCalendar() {
PermissionUtils.permission(PermissionConstants.CALENDAR)
.rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) }
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......@@ -131,7 +131,7 @@ class PermissionActivity : CommonActivity() {
private fun requestRecordAudio() {
PermissionUtils.permission(PermissionConstants.MICROPHONE)
.rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) }
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......@@ -155,7 +155,7 @@ class PermissionActivity : CommonActivity() {
private fun requestCalendarAndRecordAudio() {
PermissionUtils.permission(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE)
.rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) }
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......
......@@ -23,7 +23,7 @@ class PhoneActivity : CommonActivity() {
companion object {
fun start(context: Context) {
PermissionHelper.requestPhone(object : PermissionHelper.OnPermissionGrantedListener {
PermissionHelper.requestPhone(context, object : PermissionHelper.OnPermissionGrantedListener {
override fun onPermissionGranted() {
val starter = Intent(context, PhoneActivity::class.java)
context.startActivity(starter)
......
......@@ -61,10 +61,10 @@ class ScreenActivity : CommonActivity() {
CommonItemSwitch(
"isFullScreen",
Utils.Func1 {
Utils.Supplier {
ScreenUtils.isFullScreen(this)
},
Utils.Func1 {
Utils.Consumer {
if (it) {
ScreenUtils.setFullScreen(this)
BarUtils.setStatusBarVisibility(this, false)
......@@ -76,10 +76,10 @@ class ScreenActivity : CommonActivity() {
),
CommonItemSwitch(
"isLandscape",
Utils.Func1 {
Utils.Supplier {
ScreenUtils.isLandscape()
},
Utils.Func1 {
Utils.Consumer {
if (it) {
ScreenUtils.setLandscape(this)
} else {
......
......@@ -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))
)
}
}
......@@ -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))
}
}
package com.blankj.utilcode.pkg.helper
import android.content.Context
import android.content.DialogInterface
import android.graphics.Bitmap
import android.graphics.drawable.ColorDrawable
......@@ -18,7 +19,6 @@ 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
/**
* ```
......@@ -30,9 +30,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,
fun showRationaleDialog(context: Context, shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
StringUtils.getString(R.string.permission_rationale_message),
Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
......@@ -43,9 +42,8 @@ object DialogHelper {
})).show()
}
fun showOpenAppSettingDialog() {
val topActivity = ActivityUtils.getTopActivity() ?: return
CommonDialogContent().init(topActivity as FragmentActivity,
fun showOpenAppSettingDialog(context: Context) {
CommonDialogContent().init(context,
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 {
......@@ -56,9 +54,8 @@ object DialogHelper {
.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 +85,7 @@ object DialogHelper {
contentView.findViewById<View>(R.id.keyboardDialogCloseBtn).setOnClickListener(listener)
dialog.dialog.setOnShowListener(DialogInterface.OnShowListener {
KeyboardUtils.fixAndroidBug5497(dialog.dialog.window)
KeyboardUtils.fixAndroidBug5497(dialog.dialog.window!!)
})
}
......
package com.blankj.utilcode.pkg.helper
import android.content.Context
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.PermissionUtils
......@@ -14,26 +15,26 @@ import com.blankj.utilcode.util.PermissionUtils
*/
object PermissionHelper {
fun requestCamera(listener: OnPermissionGrantedListener,
fun requestCamera(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(listener, deniedListener, PermissionConstants.CAMERA)
request(context, listener, deniedListener, PermissionConstants.CAMERA)
}
fun requestStorage(listener: OnPermissionGrantedListener,
fun requestStorage(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(listener, deniedListener, PermissionConstants.STORAGE)
request(context, listener, deniedListener, PermissionConstants.STORAGE)
}
fun requestPhone(listener: OnPermissionGrantedListener,
fun requestPhone(context: Context, listener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener) {
request(listener, deniedListener, PermissionConstants.PHONE)
request(context, listener, deniedListener, PermissionConstants.PHONE)
}
private fun request(grantedListener: OnPermissionGrantedListener,
private fun request(context: Context, grantedListener: OnPermissionGrantedListener,
deniedListener: OnPermissionDeniedListener,
@PermissionConstants.Permission vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { shouldRequest -> DialogHelper.showRationaleDialog(shouldRequest) }
.rationale { activity, shouldRequest -> DialogHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List<String>) {
LogUtils.d(permissionsGranted)
......@@ -43,7 +44,7 @@ object PermissionHelper {
override fun onDenied(permissionsDeniedForever: List<String>, permissionsDenied: List<String>) {
LogUtils.d(permissionsDeniedForever, permissionsDenied)
if (!permissionsDeniedForever.isEmpty()) {
DialogHelper.showOpenAppSettingDialog()
DialogHelper.showOpenAppSettingDialog(context)
return
}
deniedListener.onPermissionDenied()
......
......@@ -2,6 +2,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorAccent" />
<solid android:color="#80FF73A3" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimary" />
<solid android:color="#8034A48E" />
<corners android:radius="@dimen/radius_16" />
</shape>
\ No newline at end of file
......@@ -4,5 +4,6 @@
style="@style/CommonTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/common_content_dialog_bg"
android:padding="@dimen/spacing_16"
android:scrollbars="vertical" />
\ No newline at end of file
......@@ -6,34 +6,57 @@
android:orientation="vertical"
android:padding="16dp">
<View
android:layout_width="match_parent"
android:layout_height="32dp" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="32dp"
android:background="@drawable/common_item_divider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
android:gravity="center"
android:orientation="horizontal">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@color/colorAccent"
android:layout_gravity="center"
android:background="#80FF73A3"
android:clickable="true" />
<View
android:id="@+id/shadowRectView"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="32dp"
android:background="@color/colorAccent"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:background="#80FF73A3"
android:clickable="true" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="#80FF73A3"
android:clickable="true" />
<View
android:id="@+id/shadowRectView1"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="#80FF73A3"
android:clickable="true" />
</FrameLayout>
</LinearLayout>
<View
......@@ -41,23 +64,22 @@
android:layout_height="1px"
android:background="@drawable/common_item_divider" />
<View
android:layout_width="match_parent"
android:layout_height="32dp" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="32dp"
android:background="@drawable/common_item_divider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
android:gravity="center"
android:orientation="horizontal">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@drawable/shadow_round_rect"
android:clickable="true" />
......@@ -65,34 +87,57 @@
android:id="@+id/shadowRoundRectView"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="32dp"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:background="@drawable/shadow_round_rect"
android:clickable="true" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@drawable/shadow_round_rect"
android:clickable="true" />
<View
android:id="@+id/shadowRoundRectView1"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@drawable/shadow_round_rect"
android:clickable="true" />
</FrameLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@drawable/common_item_divider" />
<View
android:layout_width="match_parent"
android:layout_height="32dp" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="32dp"
android:background="@drawable/common_item_divider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
android:gravity="center"
android:orientation="horizontal">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@drawable/shadow_circle"
android:clickable="true" />
......@@ -100,10 +145,33 @@
android:id="@+id/shadowCircleView"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="32dp"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:background="@drawable/shadow_circle"
android:clickable="true" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp">
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@drawable/shadow_circle"
android:clickable="true" />
<View
android:id="@+id/shadowCircleView1"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@drawable/shadow_circle"
android:clickable="true" />
</FrameLayout>
</LinearLayout>
<View
......
......@@ -6,12 +6,12 @@
<string name="demo_app">AppUtils Demo</string>
<string name="demo_bar">BarUtils Demo</string>
<string name="demo_brightness">BrightnessUtils Demo</string>
<string name="demo_blur">BlurUtils Demo</string>
<string name="demo_bus">BusUtils Demo</string>
<string name="demo_clean">CleanUtils Demo</string>
<string name="demo_click">ClickUtils Demo</string>
<string name="demo_bus">BusUtils Demo</string>
<string name="demo_crash">CrashUtils Demo</string>
<string name="demo_device">DeviceUtils Demo</string>
<string name="demo_file">FileUtils Demo</string>
<string name="demo_flashlight">FlashlightUtils Demo</string>
<string name="demo_fragment">FragmentUtils Demo</string>
<string name="demo_image">ImageUtils Demo</string>
......@@ -37,6 +37,7 @@
<string name="demo_spStatic">SPStaticUtils Demo</string>
<string name="demo_span">SpanUtils Demo</string>
<string name="demo_toast">ToastUtils Demo</string>
<string name="demo_trans_activity">TransActivity Demo</string>
<string name="demo_vibrate">VibrateUtils Demo</string>
<!--Activity 相关-->
......@@ -70,6 +71,7 @@
<string name="activity_start_launcher_activity">Start Launcher Activity</string>
<string name="activity_finish_activity">Finish CoreUtilActivity</string>
<string name="activity_finish_to_activity">Finish To CoreUtilActivity</string>
<string name="activity_finish_all_activities_except_newest">Finish All Activities Except Newest</string>
<string name="activity_finish_all_activities">Finish All Activities</string>
<!--Api 相关-->
......
/*
1. must add the following classpath in root build.gradle
classpath "com.github.dcendents:android-maven-gradle-plugin:2.1"
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4"
2. add bintrayUser, bintrayKey in root local.properties
3. copy the file to the directory of gradle, and apply the file in the module
apply from: "${rootDir.path}/gradle/publish.gradle"
publish {
name = "UtilCode"
groupId = "com.blankj"
artifactId = "utilcode"
version = "xx.xx"
website = "https://github.com/Blankj/AndroidUtilCode"
}
4. execute following command to publish
./gradlew bintrayUpload -> upload to bintray
./gradlew mavenLocal -> upload to local maven
*/
apply plugin: "com.github.dcendents.android-maven"
apply plugin: "com.jfrog.bintray"
extensions.create('publish', PublishExtension)
afterEvaluate {
def ext = project['publish'] as PublishExtension
loadBintray(ext)
configMaven(project, ext)
configBintray(project, ext)
configJavadoc(project, ext)
}
private void loadBintray(PublishExtension ext) {
Properties properties = new Properties()
File localPropertiesFile = project.rootProject.file("local.properties");
if (localPropertiesFile.exists()) {
properties.load(localPropertiesFile.newDataInputStream())
ext.bintrayUser = properties.getProperty("bintrayUser")
ext.bintrayKey = properties.getProperty("bintrayKey")
}
}
def configMaven(Project project, PublishExtension ext) {
project.group = ext.groupId
project.version = ext.version
project.install {
repositories.mavenInstaller {
configPom(pom, ext)
}
}
project.tasks.create("mavenLocal", Upload) {
configuration = project.configurations.archives
repositories.mavenDeployer {
repository(url: uri(new File(project.rootDir.getPath() + "/mavenLocal")))
configPom(pom, ext)
}
doFirst {
checkExt(project, ext)
}
}
project.tasks.findByName("bintrayUpload").doFirst {
checkExt(project, ext)
}
}
def configPom(pom, PublishExtension ext) {
pom.project {
name ext.name
groupId ext.groupId
artifactId ext.artifactId
version ext.version
packaging isAndroid() ? "aar" : "jar"
description ext.name
url ext.website
scm {
url ext.website
connection ext.website
developerConnection ext.website + ".git"
}
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id ext.bintrayUser
name ext.bintrayUser
}
}
}
}
static def checkExt(Project project, PublishExtension ext) {
if (ext.isBintrayEmpty()) {
throw new NullPointerException("U should set bintrayUser and bintrayKey in local.properties")
}
ext.check()
}
def configBintray(Project project, PublishExtension ext) {
project.bintray {
user = ext.bintrayUser
key = ext.bintrayKey
configurations = ['archives']
override = false
publish = true
pkg {
repo = "maven"
name = ext.name
websiteUrl = ext.website
vcsUrl = ext.website + '.git'
licenses = ["Apache-2.0"]
}
}
}
private void configJavadoc(Project project, PublishExtension ext) {
if (isAndroid()) {
// 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 ext.version
links "http://docs.oracle.com/javase/7/docs/api"
title "${ext.name} ${ext.version}"
}
}
artifacts {
archives javadocJar
archives sourcesJar
}
}
def isAndroid() {
return project.getPlugins().hasPlugin('com.android.application') ||
project.getPlugins().hasPlugin('com.android.library')
}
class PublishExtension {
String name
String groupId
String artifactId
String version
String website
String bintrayUser
String bintrayKey
void check() {
checkField(name, "name")
checkField(groupId, "groupId")
checkField(artifactId, "artifactId")
checkField(version, "version")
checkField(website, "website")
checkField(bintrayUser, "bintrayUser")
checkField(bintrayKey, "bintrayKey")
}
boolean isBintrayEmpty() {
return isEmpty(bintrayUser) || isEmpty(bintrayKey)
}
static void checkField(String field, String fieldName) {
if (isEmpty(field)) {
throw new NullPointerException("$fieldName is empty!!")
}
}
static boolean isEmpty(String str) {
return str == null || str.length() == 0
}
}
\ No newline at end of file
// load properties
Properties properties = new Properties()
File localPropertiesFile = project.file("local.properties");
if (localPropertiesFile.exists()) {
properties.load(localPropertiesFile.newDataInputStream())
}
File projectPropertiesFile = project.file("project.properties");
if (projectPropertiesFile.exists()) {
properties.load(projectPropertiesFile.newDataInputStream())
}
// read properties
def projectName = properties.getProperty("project.name")
def projectGroupId = properties.getProperty("project.groupId")
def projectArtifactId = properties.getProperty("project.artifactId")
def projectVersionName = android.defaultConfig.versionName
def projectPackaging = properties.getProperty("project.packaging")
def projectSiteUrl = properties.getProperty("project.siteUrl")
def projectGitUrl = properties.getProperty("project.gitUrl")
def developerId = properties.getProperty("developer.id")
def developerName = properties.getProperty("developer.name")
def developerEmail = properties.getProperty("developer.email")
def bintrayUser = properties.getProperty("bintray.user")
def bintrayApikey = properties.getProperty("bintray.apikey")
def javadocName = properties.getProperty("javadoc.name")
group = projectGroupId
// This generates POM.xml with proper parameters
install {
repositories.mavenInstaller {
pom {
project {
name projectName
groupId projectGroupId
artifactId projectArtifactId
version projectVersionName
packaging projectPackaging
url projectSiteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection projectGitUrl
developerConnection projectGitUrl
url projectSiteUrl
}
}
}
}
}
if (project.hasProperty("kotlin")) {
// Disable creating javadocs
tasks.withType(Javadoc) {
enabled = false
}
}
// This generates sources.jar
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += configurations.compile
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
// This generates javadoc.jar
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
// javadoc configuration
javadoc {
options {
encoding "UTF-8"
charSet 'UTF-8'
author true
version projectVersionName
links "http://docs.oracle.com/javase/7/docs/api"
title javadocName
}
}
// bintray configuration
bintray {
user = bintrayUser
key = bintrayApikey
configurations = ['archives']
pkg {
repo = "maven"
name = projectName
websiteUrl = projectSiteUrl
vcsUrl = projectGitUrl
licenses = ["Apache-2.0"]
publish = true
}
}
\ No newline at end of file
// load properties
Properties properties = new Properties()
File localPropertiesFile = project.file("local.properties");
if (localPropertiesFile.exists()) {
properties.load(localPropertiesFile.newDataInputStream())
}
File projectPropertiesFile = project.file("project.properties");
if (projectPropertiesFile.exists()) {
properties.load(projectPropertiesFile.newDataInputStream())
}
// read properties
def projectName = properties.getProperty("project.name")
def projectGroupId = properties.getProperty("project.groupId")
def projectSiteUrl = properties.getProperty("project.siteUrl")
def projectGitUrl = properties.getProperty("project.gitUrl")
def developerId = properties.getProperty("developer.id")
def developerName = properties.getProperty("developer.name")
def developerEmail = properties.getProperty("developer.email")
def bintrayUser = properties.getProperty("bintray.user")
def bintrayApikey = properties.getProperty("bintray.apikey")
def javadocName = properties.getProperty("javadoc.name")
// This generates POM.xml with proper parameters
install.repositories.mavenInstaller.pom.project {
name projectName
url projectSiteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection projectGitUrl
developerConnection projectGitUrl
url projectSiteUrl
}
}
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives sourcesJar
archives javadocJar
}
// bintray configuration
bintray {
user = bintrayUser
key = bintrayApikey
configurations = ['archives']
pkg {
repo = "maven"
name = projectName
websiteUrl = projectSiteUrl
vcsUrl = projectGitUrl
licenses = ["Apache-2.0"]
publish = true
}
}
\ No newline at end of file
......@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
......@@ -12,5 +12,4 @@ dependencies {
api Config.depConfig.swipe_panel.dep
api Config.depConfig.eventbus_lib.dep
compileOnly Config.depConfig.lib_utildebug_no_op.dep
compileOnly Config.depConfig.leakcanary_android_no_op.dep
}
\ No newline at end of file
......@@ -8,7 +8,8 @@ import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.CrashUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ProcessUtils;
import com.squareup.leakcanary.LeakCanary;
import com.blankj.utildebug.DebugUtils;
import com.blankj.utildebug.debug.IDebug;
import java.util.ArrayList;
......@@ -37,26 +38,13 @@ public class BaseApplication extends Application {
MultiDex.install(this);
}
// provider
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
initLeakCanary();
initLog();
initCrash();
}
private void initLeakCanary() {// 内存泄露检查工具
if (isDebug()) {
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
}
initDebugMenu();
}
// init it in ur application
......@@ -100,6 +88,10 @@ public class BaseApplication extends Application {
});
}
private void initDebugMenu() {
DebugUtils.addDebugs(new ArrayList<IDebug>());
}
private boolean isDebug() {
if (isDebug == null) isDebug = AppUtils.isAppDebug();
return isDebug;
......
......@@ -9,7 +9,7 @@ import android.view.View;
import android.view.Window;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.Utils;
import com.blankj.utilcode.util.ThreadUtils;
/**
* <pre>
......@@ -53,7 +53,7 @@ public abstract class BaseDialog extends Dialog {
@Override
public void show() {
Utils.runOnUiThread(new Runnable() {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
if (ActivityUtils.isActivityAlive(getContext())) {
......@@ -65,7 +65,7 @@ public abstract class BaseDialog extends Dialog {
@Override
public void dismiss() {
Utils.runOnUiThread(new Runnable() {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
if (ActivityUtils.isActivityAlive(getContext())) {
......
package com.blankj.base.dialog;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
......@@ -16,7 +18,8 @@ import android.view.ViewGroup;
import android.view.Window;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.Utils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ThreadUtils;
/**
* <pre>
......@@ -34,18 +37,28 @@ public class BaseDialogFragment extends DialogFragment {
protected FragmentActivity mActivity;
protected View mContentView;
public BaseDialogFragment init(FragmentActivity activity, DialogLayoutCallback listener) {
mActivity = activity;
public BaseDialogFragment init(Context context, DialogLayoutCallback listener) {
mActivity = getFragmentActivity(context);
mDialogLayoutCallback = listener;
return this;
}
public BaseDialogFragment init(FragmentActivity activity, DialogCallback dialogCallback) {
mActivity = activity;
public BaseDialogFragment init(Context context, DialogCallback dialogCallback) {
mActivity = getFragmentActivity(context);
mDialogCallback = dialogCallback;
return this;
}
private FragmentActivity getFragmentActivity(Context context) {
Activity activity = ActivityUtils.getActivityByContext(context);
if (activity == null) return null;
if (activity instanceof FragmentActivity) {
return (FragmentActivity) activity;
}
LogUtils.w(context + "not instanceof FragmentActivity");
return null;
}
@Override
public int getTheme() {
if (mDialogLayoutCallback != null) {
......@@ -59,10 +72,19 @@ public class BaseDialogFragment extends DialogFragment {
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog;
if (mDialogCallback != null) {
return mDialogCallback.bindDialog(mActivity);
dialog = mDialogCallback.bindDialog(mActivity);
} else {
dialog = super.onCreateDialog(savedInstanceState);
}
Window window = dialog.getWindow();
if (mDialogCallback != null) {
mDialogCallback.setWindowStyle(window);
} else if (mDialogLayoutCallback != null) {
mDialogLayoutCallback.setWindowStyle(window);
}
return super.onCreateDialog(savedInstanceState);
return dialog;
}
@Nullable
......@@ -83,20 +105,6 @@ public class BaseDialogFragment extends DialogFragment {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog == null) return;
Window window = dialog.getWindow();
if (window == null) return;
if (mDialogCallback != null) {
mDialogCallback.setWindowStyle(window);
} else if (mDialogLayoutCallback != null) {
mDialogLayoutCallback.setWindowStyle(window);
}
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
......@@ -118,7 +126,7 @@ public class BaseDialogFragment extends DialogFragment {
}
public void show(final String tag) {
Utils.runOnUiThread(new Runnable() {
ThreadUtils.runOnUiThread(new Runnable() {
@SuppressLint("CommitTransaction")
@Override
public void run() {
......@@ -128,7 +136,7 @@ public class BaseDialogFragment extends DialogFragment {
if (prev != null) {
fm.beginTransaction().remove(prev);
}
BaseDialogFragment.super.showNow(fm, tag);
BaseDialogFragment.super.show(fm, tag);
}
}
});
......@@ -136,7 +144,7 @@ public class BaseDialogFragment extends DialogFragment {
@Override
public void dismiss() {
Utils.runOnUiThread(new Runnable() {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
if (ActivityUtils.isActivityAlive(mActivity)) {
......
package com.blankj.base.mvp;
import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.Utils;
import java.util.HashMap;
import java.util.Map;
......@@ -19,7 +19,7 @@ import java.util.Map;
* desc :
* </pre>
*/
public abstract class BasePresenter<V extends BaseView> implements LifecycleObserver {
public abstract class BasePresenter<V extends BaseView> extends Utils.ActivityLifecycleCallbacks {
private V mView;
private Map<Class, BaseModel> mModelMap = new HashMap<>();
......@@ -29,6 +29,7 @@ public abstract class BasePresenter<V extends BaseView> implements LifecycleObse
void bindView(V view) {
this.mView = view;
onAttachView();
ActivityUtils.addActivityLifecycleCallbacks(mView.getActivity(), this);
}
public V getView() {
......@@ -54,9 +55,16 @@ public abstract class BasePresenter<V extends BaseView> implements LifecycleObse
return null;
}
@CallSuper
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyPresenter() {
@Override
public void onLifecycleChanged(@NonNull Activity activity, Lifecycle.Event event) {
super.onLifecycleChanged(activity, event);
if (event == Lifecycle.Event.ON_DESTROY) {
destroyPresenter();
}
LogUtils.i("onLifecycleChanged: " + event);
}
private void destroyPresenter() {
if (mView != null) {
mView.mPresenterMap.remove(this.getClass());
mView.onDestroyView();
......@@ -67,11 +75,5 @@ public abstract class BasePresenter<V extends BaseView> implements LifecycleObse
}
}
mModelMap.clear();
LogUtils.e("onDestroyPresenter");
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onLifecycleChanged(LifecycleOwner owner, Lifecycle.Event event) {
LogUtils.e(event.toString());
}
}
package com.blankj.base.mvp;
import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.Utils;
import java.util.HashMap;
import java.util.Map;
......@@ -19,20 +24,17 @@ public abstract class BaseView<V extends BaseView> {
private FragmentActivity mActivity;
private Fragment mFragment;
private Lifecycle mLifecycle;
Map<Class, BasePresenter<V>> mPresenterMap = new HashMap<>();
public abstract void onDestroyView();
public BaseView(FragmentActivity activity) {
mActivity = activity;
mLifecycle = activity.getLifecycle();
}
public BaseView(Fragment fragment) {
mFragment = fragment;
mActivity = fragment.getActivity();
mLifecycle = fragment.getLifecycle();
}
public <T extends FragmentActivity> T getActivity() {
......@@ -49,9 +51,6 @@ public abstract class BaseView<V extends BaseView> {
mPresenterMap.put(presenter.getClass(), presenter);
//noinspection unchecked
presenter.bindView((V) this);
if (mLifecycle != null) {
mLifecycle.addObserver(presenter);
}
}
public <P extends BasePresenter<V>> P getPresenter(Class<P> presenterClass) {
......
......@@ -9,6 +9,8 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* <pre>
* author: Blankj
......@@ -113,10 +115,19 @@ public abstract class BaseItem<T extends BaseItem> {
}
public void update() {
if (getAdapter() == null) return;
//noinspection unchecked
getAdapter().updateItem((T) this);
}
public List<T> getItems() {
return getAdapter().getItems();
}
public int getCount() {
return getAdapter().getItemCount();
}
public int getIndex() {
//noinspection SuspiciousMethodCalls
return getAdapter().getItems().indexOf(this);
......
package com.blankj.common.dialog;
import android.support.v4.app.FragmentActivity;
import android.content.Context;
import android.text.TextUtils;
import android.util.Pair;
import android.view.View;
......@@ -31,10 +31,10 @@ public class CommonDialogContent extends BaseDialogFragment {
private TextView cdcBottomPositiveTv;
private TextView cdcBottomNegativeTv;
public CommonDialogContent init(FragmentActivity activity, final CharSequence title, final CharSequence content,
public CommonDialogContent init(Context context, final CharSequence title, final CharSequence content,
final Pair<CharSequence, View.OnClickListener> positiveBtnAction,
final Pair<CharSequence, View.OnClickListener> negativeBtnAction) {
super.init(activity, new DialogLayoutCallback() {
super.init(context, new DialogLayoutCallback() {
@Override
public int bindTheme() {
return R.style.CommonContentDialogStyle;
......
package com.blankj.common.dialog;
import android.support.v4.app.FragmentActivity;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.blankj.base.dialog.BaseDialogFragment;
import com.blankj.base.dialog.DialogLayoutCallback;
import com.blankj.common.R;
import com.blankj.utilcode.util.BarUtils;
/**
* <pre>
......@@ -18,8 +21,8 @@ import com.blankj.common.R;
*/
public class CommonDialogLoading extends BaseDialogFragment {
public CommonDialogLoading init(FragmentActivity activity, final Runnable onCancelListener) {
super.init(activity, new DialogLayoutCallback() {
public CommonDialogLoading init(Context context, final Runnable onCancelListener) {
super.init(context, new DialogLayoutCallback() {
@Override
public int bindTheme() {
return R.style.CommonLoadingDialogStyle;
......@@ -40,7 +43,9 @@ public class CommonDialogLoading extends BaseDialogFragment {
}
@Override
public void setWindowStyle(Window window) {
public void setWindowStyle(final Window window) {
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
BarUtils.setStatusBarColor(window, Color.TRANSPARENT);
}
@Override
......
......@@ -11,8 +11,6 @@ import com.blankj.utilcode.util.ClickUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import kotlin.Unit;
/**
* <pre>
* author: blankj
......@@ -103,11 +101,11 @@ public class CommonItemClick extends CommonItem<CommonItemClick> {
});
}
public CommonItemClick setOnClickUpdateContentListener(@NonNull final Utils.Func1<CharSequence, Unit> func1) {
public CommonItemClick setOnClickUpdateContentListener(@NonNull final Utils.Supplier<CharSequence> supplier) {
setOnItemClickListener(new OnItemClickListener<CommonItemClick>() {
@Override
public void onItemClick(ItemViewHolder holder, CommonItemClick item, int position) {
item.mContent = func1.call(null);
item.mContent = supplier.get();
update();
}
});
......
......@@ -10,8 +10,6 @@ import com.blankj.common.R;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import kotlin.Unit;
/**
* <pre>
* author: blankj
......@@ -22,17 +20,17 @@ import kotlin.Unit;
*/
public class CommonItemImage extends CommonItem {
private CharSequence mTitle;
private Utils.Func1<Unit, ImageView> mSetImageFunc1;
private CharSequence mTitle;
private Utils.Consumer<ImageView> mSetImageConsumer;
public CommonItemImage(@StringRes int title, @NonNull Utils.Func1<Unit, ImageView> setImageFunc1) {
this(StringUtils.getString(title), setImageFunc1);
public CommonItemImage(@StringRes int title, @NonNull Utils.Consumer<ImageView> setImageConsumer) {
this(StringUtils.getString(title), setImageConsumer);
}
public CommonItemImage(@NonNull CharSequence title, @NonNull Utils.Func1<Unit, ImageView> setImageFunc1) {
public CommonItemImage(@NonNull CharSequence title, @NonNull Utils.Consumer<ImageView> setImageConsumer) {
super(R.layout.common_item_title_image);
mTitle = title;
mSetImageFunc1 = setImageFunc1;
mSetImageConsumer = setImageConsumer;
}
@Override
......@@ -42,6 +40,6 @@ public class CommonItemImage extends CommonItem {
titleTv.setText(mTitle);
ImageView commonItemIv = holder.findViewById(R.id.commonItemIv);
mSetImageFunc1.call(commonItemIv);
mSetImageConsumer.accept(commonItemIv);
}
}
......@@ -14,8 +14,6 @@ import com.blankj.utilcode.util.ClickUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import kotlin.Unit;
/**
* <pre>
* author: blankj
......@@ -26,23 +24,23 @@ import kotlin.Unit;
*/
public class CommonItemSwitch extends CommonItem {
private CharSequence mTitle;
private CharSequence mContent;
private boolean mState;
private Utils.Func1<Boolean, Unit> mGetStateFunc1;
private Utils.Func1<Unit, Boolean> mSetStateFunc1;
private CharSequence mTitle;
private CharSequence mContent;
private boolean mState;
private Utils.Supplier<Boolean> mGetStateSupplier;
private Utils.Consumer<Boolean> mSetStateConsumer;
public CommonItemSwitch(@StringRes int title, @NonNull Utils.Func1<Boolean, Unit> getStateFun1, @NonNull Utils.Func1<Unit, Boolean> setStateFun1) {
this(StringUtils.getString(title), getStateFun1, setStateFun1);
public CommonItemSwitch(@StringRes int title, @NonNull Utils.Supplier<Boolean> getStateSupplier, @NonNull Utils.Consumer<Boolean> setStateConsumer) {
this(StringUtils.getString(title), getStateSupplier, setStateConsumer);
}
public CommonItemSwitch(@NonNull CharSequence title, @NonNull Utils.Func1<Boolean, Unit> getStateFun1, @NonNull Utils.Func1<Unit, Boolean> setStateFun1) {
public CommonItemSwitch(@NonNull CharSequence title, @NonNull Utils.Supplier<Boolean> getStateSupplier, @NonNull Utils.Consumer<Boolean> setStateConsumer) {
super(R.layout.common_item_title_switch);
mTitle = title;
mGetStateFunc1 = getStateFun1;
mSetStateFunc1 = setStateFun1;
mState = getStateFun1.call(null);
mGetStateSupplier = getStateSupplier;
mSetStateConsumer = setStateConsumer;
mState = getStateSupplier.get();
mContent = String.valueOf(mState);
}
......@@ -69,8 +67,8 @@ public class CommonItemSwitch extends CommonItem {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSetStateFunc1.call(!mState);
mState = mGetStateFunc1.call(null);
mSetStateConsumer.accept(!mState);
mState = mGetStateSupplier.get();
contentTv.setText(String.valueOf(mState));
switchView.setChecked(mState);
}
......
......@@ -11,8 +11,6 @@ import com.blankj.common.R;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.Utils;
import kotlin.Unit;
/**
* <pre>
* author: blankj
......@@ -23,15 +21,15 @@ import kotlin.Unit;
*/
public class CommonItemTitle extends CommonItem {
private CharSequence mTitle;
private Utils.Func1<CharSequence, Unit> mGetTitleFunc1;
private boolean mIsTitleCenter;
private CharSequence mContent;
private CharSequence mTitle;
private Utils.Supplier<CharSequence> mGetTitleSupplier;
private boolean mIsTitleCenter;
private CharSequence mContent;
public CommonItemTitle(@NonNull Utils.Func1<CharSequence, Unit> getTitleFunc1, boolean isTitleCenter) {
public CommonItemTitle(@NonNull Utils.Supplier<CharSequence> getTitleSupplier, boolean isTitleCenter) {
super(R.layout.common_item_title_content);
mTitle = mGetTitleFunc1.call(null);
mGetTitleFunc1 = getTitleFunc1;
mTitle = mGetTitleSupplier.get();
mGetTitleSupplier = getTitleSupplier;
mIsTitleCenter = isTitleCenter;
}
......@@ -54,8 +52,8 @@ public class CommonItemTitle extends CommonItem {
@Override
public void bind(@NonNull ItemViewHolder holder, int position) {
super.bind(holder, position);
if (mGetTitleFunc1 != null) {
mTitle = mGetTitleFunc1.call(null);
if (mGetTitleSupplier != null) {
mTitle = mGetTitleSupplier.get();
}
final TextView titleTv = holder.findViewById(R.id.commonItemTitleTv);
final TextView contentTv = holder.findViewById(R.id.commonItemContentTv);
......
package com.blankj.common.view;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
/**
* <pre>
* author: blankj
* blog : http://blankj.com
* time : 2020/03/28
* desc :
* </pre>
*/
public class RotateView extends View {
private ObjectAnimator headerAnimator;
public RotateView(Context context) {
this(context, null);
}
public RotateView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public RotateView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (headerAnimator == null) {
initAnimator();
}
if (visibility == VISIBLE) {
headerAnimator.start();
} else {
headerAnimator.end();
}
}
private void initAnimator() {
headerAnimator = ObjectAnimator.ofFloat(this, "rotation", 0f, 360f);
headerAnimator.setRepeatCount(ObjectAnimator.INFINITE);
headerAnimator.setInterpolator(new LinearInterpolator());
headerAnimator.setRepeatMode(ObjectAnimator.RESTART);
headerAnimator.setDuration(1000);
headerAnimator.start();
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#BB000000" />
<corners android:radius="50dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateDrawable="@drawable/common_rotate_loading" />
android:layout_gravity="bottom|center_horizontal"
android:layout_marginLeft="64dp"
android:layout_marginRight="64dp"
android:layout_marginBottom="120dp"
android:background="@drawable/common_loading_bg"
android:gravity="center"
android:minWidth="100dp"
android:minHeight="40dp"
android:paddingLeft="20dp"
android:paddingTop="10dp"
android:paddingRight="20dp"
android:paddingBottom="10dp">
</RelativeLayout>
\ No newline at end of file
<com.blankj.common.view.RotateView
android:layout_width="22dp"
android:layout_height="22dp"
android:background="@drawable/common_loading" />
<TextView
android:id="@+id/utilActionLoadingMsgTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:lineSpacingExtra="2dp"
android:text="Loading..."
android:textColor="@color/white"
android:textSize="14dp" />
</LinearLayout>
</FrameLayout>
\ No newline at end of file
......@@ -10,7 +10,7 @@
</style>
<style name="SplashTheme" parent="AppTheme">
<!-- <item name="android:windowDisablePreview">true</item>-->
<!-- <item name="android:windowDisablePreview">true</item>-->
</style>
......@@ -59,18 +59,20 @@
<item name="android:background">@null</item>
</style>
<style name="CommonLoadingDialogStyle" parent="android:Theme.Dialog">
<style name="CommonLoadingDialogStyle">
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="statusBarBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">false</item>
</style>
<style name="CommonContentDialogStyle" parent="android:Theme.Dialog">
<style name="CommonContentDialogStyle">
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowMinWidthMajor">85%</item>
<item name="android:windowMinWidthMinor">85%</item>
</style>
......
......@@ -11,6 +11,13 @@
getAppStoreIntent: 获取跳转应用商店意图
```
* ### 电池相关 -> [BatteryUtils.java][battery.java] -> [Demo][battery.demo]
```
registerBatteryStatusChangedListener : 注册电池状态改变监听器
isRegisteredBatteryStatusChangedListener: 判断是否注册电池状态改变监听器
unregisterBatteryStatusChangedListener : 注销电池状态改变监听器
```
* ### 剪贴板相关 -> [ClipboardUtils.java][clipboard.java] -> [Test][clipboard.test]
```
copyText : 复制文本到剪贴板
......@@ -81,6 +88,9 @@ getSurnameFirstLetter: 根据名字获取姓氏的首字母
[appStore.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
[appStore.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
[battery.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
[battery.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
......
......@@ -11,6 +11,13 @@ You should copy the following classes which you want to use in your project.
getAppStoreIntent
```
* ### About Battery -> [BatteryUtils.java][battery.java] -> [Demo][battery.demo]
```
registerBatteryStatusChangedListener
isRegisteredBatteryStatusChangedListener
unregisterBatteryStatusChangedListener
```
* ### About Clipboard -> [ClipboardUtils.java][clipboard.java] -> [Test][clipboard.test]
```
copyText
......@@ -81,6 +88,9 @@ getSurnameFirstLetter
[appStore.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
[appStore.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/appStore/AppStoreActivity.kt
[battery.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
[battery.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
......
apply {
plugin Config.depConfig.plugin_traute.pluginId
plugin Config.depConfig.plugin_maven.pluginId
plugin Config.depConfig.plugin_bintray.pluginId
plugin "readme-sub"
}
......
......@@ -21,7 +21,7 @@ import java.util.List;
* desc : utils about app store
* </pre>
*/
public class AppStoreUtils {
public final class AppStoreUtils {
private static final String TAG = "AppStoreUtils";
......
package com.blankj.subutil.util;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.support.annotation.IntDef;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.Utils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashSet;
import java.util.Set;
/**
* <pre>
* author: blankj
* blog : http://blankj.com
* time : 2020/03/31
* desc :
* </pre>
*/
public final class BatteryUtils {
@IntDef({BatteryStatus.UNKNOWN, BatteryStatus.DISCHARGING, BatteryStatus.CHARGING,
BatteryStatus.NOT_CHARGING, BatteryStatus.FULL})
@Retention(RetentionPolicy.SOURCE)
public @interface BatteryStatus {
int UNKNOWN = BatteryManager.BATTERY_STATUS_UNKNOWN;
int DISCHARGING = BatteryManager.BATTERY_STATUS_DISCHARGING;
int CHARGING = BatteryManager.BATTERY_STATUS_CHARGING;
int NOT_CHARGING = BatteryManager.BATTERY_STATUS_NOT_CHARGING;
int FULL = BatteryManager.BATTERY_STATUS_FULL;
}
/**
* Register the status of battery changed listener.
*
* @param listener The status of battery changed listener.
*/
public static void registerBatteryStatusChangedListener(final OnBatteryStatusChangedListener listener) {
BatteryChangedReceiver.getInstance().registerListener(listener);
}
/**
* Return whether the status of battery changed listener has been registered.
*
* @param listener The status of battery changed listener.
* @return true to registered, false otherwise.
*/
public static boolean isRegistered(final OnBatteryStatusChangedListener listener) {
return BatteryChangedReceiver.getInstance().isRegistered(listener);
}
/**
* Unregister the status of battery changed listener.
*
* @param listener The status of battery changed listener.
*/
public static void unregisterBatteryStatusChangedListener(final OnBatteryStatusChangedListener listener) {
BatteryChangedReceiver.getInstance().unregisterListener(listener);
}
public static final class BatteryChangedReceiver extends BroadcastReceiver {
private static BatteryChangedReceiver getInstance() {
return BatteryChangedReceiver.LazyHolder.INSTANCE;
}
private Set<OnBatteryStatusChangedListener> mListeners = new HashSet<>();
void registerListener(final OnBatteryStatusChangedListener listener) {
if (listener == null) return;
ThreadUtils.runOnUiThread(new Runnable() {
@SuppressLint("MissingPermission")
@Override
public void run() {
int preSize = mListeners.size();
mListeners.add(listener);
if (preSize == 0 && mListeners.size() == 1) {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
Utils.getApp().registerReceiver(BatteryChangedReceiver.getInstance(), intentFilter);
}
}
});
}
boolean isRegistered(final OnBatteryStatusChangedListener listener) {
if (listener == null) return false;
return mListeners.contains(listener);
}
void unregisterListener(final OnBatteryStatusChangedListener listener) {
if (listener == null) return;
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
int preSize = mListeners.size();
mListeners.remove(listener);
if (preSize == 1 && mListeners.size() == 0) {
Utils.getApp().unregisterReceiver(BatteryChangedReceiver.getInstance());
}
}
});
}
@SuppressLint("MissingPermission")
@Override
public void onReceive(Context context, final Intent intent) {
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryStatus.UNKNOWN);
for (OnBatteryStatusChangedListener listener : mListeners) {
listener.onBatteryStatusChanged(new Status(level, status));
}
}
});
}
}
private static class LazyHolder {
private static final BatteryChangedReceiver INSTANCE = new BatteryChangedReceiver();
}
}
public interface OnBatteryStatusChangedListener {
void onBatteryStatusChanged(Status status);
}
public static final class Status {
private int level;
@BatteryStatus
private int status;
Status(int level, int status) {
this.level = level;
this.status = status;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@BatteryStatus
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return batteryStatus2String(status) + ": " + level + "%";
}
public static String batteryStatus2String(@BatteryStatus int status) {
if (status == BatteryStatus.DISCHARGING) {
return "discharging";
}
if (status == BatteryStatus.CHARGING) {
return "charging";
}
if (status == BatteryStatus.NOT_CHARGING) {
return "not_charging";
}
if (status == BatteryStatus.FULL) {
return "full";
}
return "unknown";
}
}
}
......@@ -11,6 +11,7 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import com.blankj.utilcode.util.IntentUtils;
import com.blankj.utilcode.util.ShellUtils;
import com.blankj.utilcode.util.Utils;
......@@ -229,9 +230,7 @@ public class DangerousUtils {
try {
ShellUtils.CommandResult result = ShellUtils.execCmd("reboot -p", true);
if (result.result == 0) return true;
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
Utils.getApp().startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
Utils.getApp().startActivity(IntentUtils.getShutdownIntent());
return true;
} catch (Exception e) {
return false;
......
......@@ -30,6 +30,5 @@ public class BaseTest {
@Test
public void test() throws Exception {
System.out.println("1234");
}
}
此差异已折叠。
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.26.0'
implementation 'com.blankj:utilcode:1.28.0'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.26.0'
implementation 'com.blankj:utilcodex:1.28.0'
```
......@@ -13,7 +13,9 @@ implementation 'com.blankj:utilcodex:1.26.0'
* ### About Activity -> [ActivityUtils.java][activity.java] -> [Demo][activity.demo]
```
getActivityByView
addActivityLifecycleCallbacks
removeActivityLifecycleCallbacks
getAliveActivityByContext
getActivityByContext
isActivityExists
startActivity
......@@ -272,6 +274,8 @@ applyPressedBgAlpha
applyPressedBgDark
applySingleDebouncing
applyGlobalDebouncing
expandClickArea
back2HomeFriendly
ClickUtils#OnDebouncingClickListener
ClickUtils#OnMultiClickListener
```
......@@ -345,6 +349,12 @@ getRandomColor
bytes2Bits, bits2Bytes
bytes2Chars, chars2Bytes
bytes2HexString, hexString2Bytes
bytes2String, string2Bytes
bytes2JSONObject, jsonObject2Bytes
bytes2JSONArray, jsonArray2Bytes
bytes2Parcelable, parcelable2Bytes
bytes2Object, serializable2Bytes
bytes2Bitmap, bitmap2Bytes
memorySize2Byte, byte2MemorySize
byte2FitMemorySize
timeSpan2Millis, millis2TimeSpan
......@@ -354,7 +364,7 @@ inputStream2Bytes, bytes2InputStream
outputStream2Bytes, bytes2OutputStream
inputStream2String, string2InputStream
outputStream2String, string2OutputStream
bitmap2Bytes, bytes2Bitmap
inputStream2Lines
drawable2Bitmap, bitmap2Drawable
drawable2Bytes, bytes2Drawable
view2Bitmap
......@@ -401,6 +411,8 @@ base64Encode2String
base64Decode
htmlEncode
htmlDecode
binaryEncode
binaryDecode
```
* ### About Encrypt -> [EncryptUtils.java][encrypt.java] -> [Test][encrypt.test]
......@@ -427,6 +439,7 @@ encryptAES, encryptAES2HexString, encryptAES2Base64
decryptAES, decryptHexStringAES, decryptBase64AES
encryptRSA, encryptRSA2HexString, encryptRSA2Base64
decryptRSA, decryptHexStringRSA, decryptBase64RSA
rc4
```
* ### About FileIO -> [FileIOUtils.java][fileIo.java] -> [Test][fileIo.test]
......@@ -474,6 +487,8 @@ getFileName
getFileNameNoExtension
getFileExtension
notifySystemToScan
getFsTotalSize
getFsAvailableSize
```
* ### About Fragment -> [FragmentUtils.java][fragment.java] -> [Demo][fragment.demo]
......@@ -506,6 +521,8 @@ setBackground
* ### About Gson -> [GsonUtils.java][gson.java] -> [Test][gson.test]
```
setGsonDelegate
setGson
getGson
toJson
fromJson
......@@ -580,6 +597,9 @@ clickBlankArea2HideSoftInput
```
applySystemLanguage
applyLanguage
isAppliedSystemLanguage
isAppliedLanguage
getCurrentLocale
```
* ### About Log -> [LogUtils.java][log.java] -> [Demo][log.demo]
......@@ -645,25 +665,26 @@ getMetaDataInReceiver
```
openWirelessSettings
isConnected
isAvailable[Async] : 判断网络是否可用
isAvailableByPing[Async] : 用 ping 判断网络是否可用
isAvailableByDns[Async] : 用 DNS 判断网络是否可用
isAvailable[Async] : 判断网络是否可用
isAvailableByPing[Async] : 用 ping 判断网络是否可用
isAvailableByDns[Async] : 用 DNS 判断网络是否可用
getMobileDataEnabled
isMobileData
is4G
getWifiEnabled
setWifiEnabled
isWifiConnected
isWifiAvailable[Async] : 判断 wifi 数据是否可用
isWifiAvailable[Async] : 判断 wifi 数据是否可用
getNetworkOperatorName
getNetworkType
getIPAddress[Async] : 获取 IP 地址
getDomainAddress[Async] : 获取域名 IP 地址
getIPAddress[Async] : 获取 IP 地址
getDomainAddress[Async] : 获取域名 IP 地址
getIpAddressByWifi
getGatewayByWifi
getNetMaskByWifi
getServerAddressByWifi
registerNetworkStatusChangedListener
isRegisteredNetworkStatusChangedListener
unregisterNetworkStatusChangedListener
```
......@@ -676,18 +697,27 @@ cancelAll
setNotificationBarVisibility
```
* ### About Number -> [NumberUtils.java][number.java] -> [Test][number.test]
```
format
float2Double
```
* ### About Object -> [ObjectUtils.java][object.java] -> [Test][object.test]
```
isEmpty
isNotEmpty
equals
requireNonNull
compare
requireNonNull(s)
getOrDefault
hashCode
toString
hashCode(s)
```
* ### About Path -> [PathUtils.java][path.java] -> [Demo][path.demo]
```
join
getRootPath
getDataPath
getDownloadCachePath
......@@ -724,6 +754,10 @@ getExternalAppDownloadPath
getExternalAppDcimPath
getExternalAppDocumentsPath
getExternalAppObbPath
getRootPathExternalFirst
getAppDataPathExternalFirst
getFilesPathExternalFirst
getCachePathExternalFirst
```
* ### About Permission -> [PermissionUtils.java][permission.java] -> [Demo][permission.demo]
......@@ -796,6 +830,20 @@ getMatches
getSplits
getReplaceFirst
getReplaceAll
RegexConstants.REGEX_DOUBLE_BYTE_CHAR
RegexConstants.REGEX_BLANK_LINE
RegexConstants.REGEX_QQ_NUM
RegexConstants.REGEX_CHINA_POSTAL_CODE
RegexConstants.REGEX_INTEGER
RegexConstants.REGEX_POSITIVE_INTEGER
RegexConstants.REGEX_NEGATIVE_INTEGER
RegexConstants.REGEX_NOT_NEGATIVE_INTEGER
RegexConstants.REGEX_NOT_POSITIVE_INTEGER
RegexConstants.REGEX_FLOAT
RegexConstants.REGEX_POSITIVE_FLOAT
RegexConstants.REGEX_NEGATIVE_FLOAT
RegexConstants.REGEX_NOT_NEGATIVE_FLOAT
RegexConstants.REGEX_NOT_POSITIVE_FLOAT
```
* ### About Resource -> [ResourceUtils.java][resource.java] -> [Demo][resource.demo]
......@@ -873,6 +921,10 @@ isSDCardEnableByEnvironment
getSDCardPathByEnvironment
getSDCardInfo
getMountedSDCardPath
getExternalTotalSize
getExternalAvailableSize
getInternalTotalSize
getInternalAvailableSize
```
* ### About Service -> [ServiceUtils.java][service.java]
......@@ -1005,11 +1057,16 @@ lowerFirstLetter
reverse
toDBC
toSBC
getString
getStringArray
```
* ### About Thread -> [ThreadUtils.java][thread.java] -> [Test][thread.test]
```
isMainThread
getMainHandler
runOnUiThread
runOnUiThreadDelayed
getFixedPool
getSinglePool
getCachedPool
......@@ -1039,6 +1096,7 @@ setDeliver
* ### About Time -> [TimeUtils.java][time.java] -> [Test][time.test]
```
getSafeDateFormat
millis2String
string2Millis
string2Date
......@@ -1098,10 +1156,16 @@ removeListener
* ### About Uri -> [UriUtils.java][uri.java]
```
res2Uri
file2Uri
uri2File
```
* ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
```
start
```
* ### About Vibrate -> [VibrateUtils.java][vibrate.java] -> [Demo][vibrate.demo]
```
vibrate
......@@ -1250,6 +1314,9 @@ getComments
[notification.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
[notification.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/notification/NotificationActivity.kt
[number.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/NumberUtils.java
[number.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/NumberUtilsTest.java
[object.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
[object.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
......@@ -1321,6 +1388,8 @@ getComments
[uri.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
[trans.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
......
apply {
plugin Config.depConfig.plugin_traute.pluginId
plugin Config.depConfig.plugin_maven.pluginId
plugin Config.depConfig.plugin_bintray.pluginId
plugin "readme-core"
from "${rootDir.path}/gradle/upload/bintrayUploadAndroid.gradle"
}
readme {
......@@ -11,6 +8,24 @@ readme {
readmeCnFile file('./README-CN.md')
}
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'
}
}
}
dependencies {
implementation Config.depConfig.gson.dep
......@@ -19,6 +34,21 @@ dependencies {
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
testImplementation Config.depConfig.gson.dep
testImplementation Config.depConfig.support_appcompat_v7.dep
testImplementation Config.depConfig.support_design.dep
testImplementation Config.depConfig.eventbus_lib.dep
}
afterEvaluate {
verifyReleaseResources.enabled(false)
}
apply from: "${rootDir.path}/gradle/publish.gradle"
publish {
name = "UtilCode"
groupId = Config.depConfig.lib_utilcode.groupId
artifactId = Config.depConfig.lib_utilcode.artifactId
version = Config.depConfig.lib_utilcode.version
website = "https://github.com/Blankj/AndroidUtilCode"
}
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册