From 55c3fc2eb9344eb3278b2690b32488d8a200adaa Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Fri, 8 Mar 2019 17:46:44 +0800 Subject: [PATCH 001/138] see 03/08 log --- CHANGELOG.md | 1 + config.gradle | 17 ++++++------- gradle.properties | 4 ++- .../com/blankj/launcher/pkg/MainActivity.kt | 2 +- .../pkg/src/main/res/layout/activity_main.xml | 18 ++++++------- lib/base/build.gradle | 6 ++--- .../java/com/blankj/lib/base/BaseActivity.kt | 2 +- .../com/blankj/lib/base/BaseApplication.kt | 2 +- .../com/blankj/lib/base/BaseDrawerActivity.kt | 6 ++--- .../java/com/blankj/lib/base/BaseFragment.kt | 6 ++--- .../blankj/lib/base/rv/BaseViewHolder.java | 4 +-- .../lib/base/rv/RecycleViewDivider.java | 10 ++++---- .../lib/base/rv/adapter/BaseAdapter.java | 6 ++--- .../lib/base/rv/adapter/SingleAdapter.java | 2 +- .../src/main/res/layout/activity_back.xml | 14 +++++------ .../src/main/res/layout/activity_drawer.xml | 6 ++--- subutil/lib/build.gradle | 6 ++--- .../blankj/subutil/util/LocationUtils.java | 2 +- .../com/blankj/subutil/util/PinyinUtils.java | 2 +- .../java/com/blankj/subutil/util/Utils.java | 4 +-- .../blankj/subutil/pkg/helper/DialogHelper.kt | 2 +- utilcode/lib/build.gradle | 8 +++--- utilcode/lib/project.properties | 2 +- .../utilcode/constant/MemoryConstants.java | 2 +- .../constant/PermissionConstants.java | 2 +- .../utilcode/constant/TimeConstants.java | 2 +- .../blankj/utilcode/util/ActivityUtils.java | 9 ++++--- .../blankj/utilcode/util/AntiShakeUtils.java | 5 ++-- .../com/blankj/utilcode/util/AppUtils.java | 5 ++-- .../com/blankj/utilcode/util/BarUtils.java | 11 ++++---- .../blankj/utilcode/util/BrightnessUtils.java | 5 ++-- .../utilcode/util/CacheDiskStaticUtils.java | 3 ++- .../blankj/utilcode/util/CacheDiskUtils.java | 3 ++- .../utilcode/util/CacheDoubleStaticUtils.java | 3 ++- .../utilcode/util/CacheDoubleUtils.java | 2 +- .../utilcode/util/CacheMemoryStaticUtils.java | 2 +- .../utilcode/util/CacheMemoryUtils.java | 4 +-- .../com/blankj/utilcode/util/ColorUtils.java | 12 ++++----- .../com/blankj/utilcode/util/CrashUtils.java | 4 +-- .../com/blankj/utilcode/util/DeviceUtils.java | 4 +-- .../blankj/utilcode/util/FragmentUtils.java | 21 ++++++++-------- .../com/blankj/utilcode/util/ImageUtils.java | 14 +++++------ .../com/blankj/utilcode/util/IntentUtils.java | 4 +-- .../com/blankj/utilcode/util/LogUtils.java | 8 +++--- .../blankj/utilcode/util/MetaDataUtils.java | 2 +- .../blankj/utilcode/util/NetworkUtils.java | 2 +- .../utilcode/util/NotificationUtils.java | 6 ++--- .../com/blankj/utilcode/util/ObjectUtils.java | 6 ++--- .../blankj/utilcode/util/PermissionUtils.java | 8 +++--- .../com/blankj/utilcode/util/PhoneUtils.java | 2 +- .../blankj/utilcode/util/ProcessUtils.java | 4 +-- .../com/blankj/utilcode/util/RegexUtils.java | 2 +- .../blankj/utilcode/util/ResourceUtils.java | 2 +- .../blankj/utilcode/util/SPStaticUtils.java | 2 +- .../com/blankj/utilcode/util/SPUtils.java | 2 +- .../com/blankj/utilcode/util/ScreenUtils.java | 5 ++-- .../blankj/utilcode/util/SnackbarUtils.java | 14 +++++------ .../com/blankj/utilcode/util/SpanUtils.java | 16 ++++++------ .../com/blankj/utilcode/util/StringUtils.java | 4 +-- .../com/blankj/utilcode/util/ThreadUtils.java | 7 +++--- .../com/blankj/utilcode/util/TimeUtils.java | 2 +- .../com/blankj/utilcode/util/ToastUtils.java | 10 ++++---- .../com/blankj/utilcode/util/UriUtils.java | 25 +++++++++++++------ .../java/com/blankj/utilcode/util/Utils.java | 2 +- .../blankj/utilcode/util/VibrateUtils.java | 2 +- .../blankj/utilcode/util/ObjectUtilsTest.java | 5 ++-- .../pkg/feature/activity/ActivityActivity.kt | 2 +- .../feature/activity/SubActivityActivity.kt | 2 +- .../feature/bar/BarStatusFragmentActivity.kt | 16 ++++++------ .../pkg/feature/fragment/ContainerFragment.kt | 6 ++--- .../pkg/feature/fragment/FragmentActivity.kt | 6 ++--- .../pkg/feature/image/ImageActivity.kt | 8 +++--- .../pkg/feature/snackbar/SnackbarActivity.kt | 2 +- .../utilcode/pkg/feature/span/SpanActivity.kt | 2 +- .../utilcode/pkg/feature/toast/CustomToast.kt | 2 +- .../pkg/feature/toast/ToastActivity.kt | 2 +- .../utilcode/pkg/helper/DialogHelper.kt | 2 +- .../main/res/layout/activity_adaptscreen.xml | 4 +-- .../res/layout/activity_adaptscreen_close.xml | 4 +-- .../layout/activity_adaptscreen_height.xml | 4 +-- .../res/layout/activity_adaptscreen_width.xml | 4 +-- .../layout/activity_bar_status_fragment.xml | 4 +-- .../src/main/res/layout/activity_fragment.xml | 2 +- .../src/main/res/layout/activity_image.xml | 2 +- 84 files changed, 241 insertions(+), 220 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8271c33548..a1706be701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `19/03/09` [fix] UriUtils#uri2File. * `19/03/08` [add] LogUtils support multi process. Publish v1.23.7. * `19/03/02` [fix] LogUtils#file. * `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6. diff --git a/config.gradle b/config.gradle index 57c3d35e99..106f066059 100644 --- a/config.gradle +++ b/config.gradle @@ -2,7 +2,7 @@ ext { applicationId = 'com.blankj.androidutilcode' appName = 'Util' - compileSdkVersion = 27 + compileSdkVersion = 28 minSdkVersion = 14 targetSdkVersion = 27 versionCode = 1_023_007 @@ -16,8 +16,8 @@ ext { // lib version kotlin_version = '1.3.0' - support_version = '27.1.1' leakcanary_version = '1.6.3' + androidx_version = '1.0.0' dep = [ plugin : [ @@ -30,19 +30,18 @@ ext { ], // lib - support : [ - appcompat_v7: "com.android.support:appcompat-v7:$support_version", - design : "com.android.support:design:$support_version", - multidex : "com.android.support:multidex:1.0.2", - ], - constraint : "com.android.support.constraint:constraint-layout:1.1.3", + appcompat : "androidx.appcompat:appcompat:$androidx_version", + design : "com.google.android.material:material:$androidx_version", + multidex : "androidx.multidex:multidex:2.0.1", + constraint : "androidx.constraintlayout:constraintlayout:1.1.3", + kotlin : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", leakcanary : [ android : "com.squareup.leakcanary:leakcanary-android:$leakcanary_version", android_no_op : "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version", support_fragment: "com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version" ], - free_proguard: "com.blankj:free-proguard:0.0.7", + free_proguard: "com.blankj:free-proguard:0.0.12", adapt_screen : "com.blankj:adapt-screen:0.0.3", gson : "com.google.code.gson:gson:2.8.2", diff --git a/gradle.properties b/gradle.properties index e98b0a89fc..ad5471a961 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 \ No newline at end of file +#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt index 27d29a032a..e6dc516ed6 100644 --- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt +++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt @@ -2,7 +2,7 @@ package com.blankj.launcher.pkg import android.graphics.Color import android.os.Bundle -import android.support.v7.app.ActionBarDrawerToggle +import androidx.appcompat.app.ActionBarDrawerToggle import android.view.View import android.widget.ImageView import com.blankj.lib.base.BaseDrawerActivity diff --git a/launcher/pkg/src/main/res/layout/activity_main.xml b/launcher/pkg/src/main/res/layout/activity_main.xml index 3b31dafe32..ee8b62a6fa 100644 --- a/launcher/pkg/src/main/res/layout/activity_main.xml +++ b/launcher/pkg/src/main/res/layout/activity_main.xml @@ -1,17 +1,17 @@ - - - - - - + + - @@ -69,5 +69,5 @@ android:text="@string/sub_util" /> - - + + diff --git a/lib/base/build.gradle b/lib/base/build.gradle index bd369d23ee..8c6cb29835 100644 --- a/lib/base/build.gradle +++ b/lib/base/build.gradle @@ -7,9 +7,9 @@ dependencies { api project(':utilcode-lib') api project(':subutil-lib') - api dep.support.appcompat_v7 - api dep.support.design - api dep.support.multidex + api dep.appcompat + api dep.design + api dep.multidex api dep.constraint api dep.kotlin api dep.free_proguard diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt index deb05718a9..b1b3086f14 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt @@ -2,7 +2,7 @@ package com.blankj.lib.base import android.app.Activity import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity import android.view.LayoutInflater import android.view.View import com.blankj.utilcode.util.AntiShakeUtils diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt index f3eb078f79..873c71fa49 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt @@ -2,7 +2,7 @@ package com.blankj.lib.base import android.app.Application import android.content.Context -import android.support.multidex.MultiDex +import androidx.multidex.MultiDex import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.CrashUtils import com.blankj.utilcode.util.LogUtils diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt index a29cc60cc8..3514d2fdd3 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt @@ -2,8 +2,8 @@ package com.blankj.lib.base import android.content.Intent import android.net.Uri -import android.support.annotation.StringRes -import android.support.v4.widget.DrawerLayout +import androidx.annotation.StringRes +import androidx.drawerlayout.widget.DrawerLayout import android.view.LayoutInflater import android.widget.FrameLayout import com.blankj.utilcode.util.ActivityUtils @@ -20,7 +20,7 @@ import kotlinx.android.synthetic.main.activity_drawer.* */ abstract class BaseDrawerActivity : BaseActivity() { - protected lateinit var mBaseDrawerRootLayout: DrawerLayout + protected lateinit var mBaseDrawerRootLayout: androidx.drawerlayout.widget.DrawerLayout protected lateinit var mBaseDrawerContainerView: FrameLayout override fun isSwipeBack(): Boolean { diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt index 42e7073529..3db893bea2 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt @@ -3,8 +3,8 @@ package com.blankj.lib.base import android.app.Activity import android.content.Context import android.os.Bundle -import android.support.annotation.IdRes -import android.support.v4.app.Fragment +import androidx.annotation.IdRes +import androidx.fragment.app.Fragment import android.util.Log import android.view.LayoutInflater import android.view.View @@ -19,7 +19,7 @@ import com.blankj.utilcode.util.AntiShakeUtils * desc : base about v4-fragment * ``` */ -abstract class BaseFragment : Fragment(), IBaseView { +abstract class BaseFragment : androidx.fragment.app.Fragment(), IBaseView { companion object { private const val TAG = "BaseFragment" diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java index ee47e751f5..6441f8c1fd 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java @@ -1,7 +1,7 @@ package com.blankj.lib.base.rv; -import android.support.annotation.IdRes; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.IdRes; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.View; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java index 3d2b90f302..dd20894e10 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java @@ -5,11 +5,11 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.support.annotation.DrawableRes; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.ViewCompat; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.LinearLayout; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java index f5acee0bb3..b8cf5ae12d 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java @@ -1,9 +1,9 @@ package com.blankj.lib.base.rv.adapter; import android.content.Context; -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java index 619c8fc688..b7e81b892b 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java @@ -1,6 +1,6 @@ package com.blankj.lib.base.rv.adapter; -import android.support.annotation.LayoutRes; +import androidx.annotation.LayoutRes; import java.util.List; diff --git a/lib/base/src/main/res/layout/activity_back.xml b/lib/base/src/main/res/layout/activity_back.xml index 5747922950..848cc885fe 100644 --- a/lib/base/src/main/res/layout/activity_back.xml +++ b/lib/base/src/main/res/layout/activity_back.xml @@ -1,26 +1,26 @@ - - - - + - - - + + diff --git a/lib/base/src/main/res/layout/activity_drawer.xml b/lib/base/src/main/res/layout/activity_drawer.xml index 1fec3fc953..697e83f643 100644 --- a/lib/base/src/main/res/layout/activity_drawer.xml +++ b/lib/base/src/main/res/layout/activity_drawer.xml @@ -1,5 +1,5 @@ - - - + diff --git a/subutil/lib/build.gradle b/subutil/lib/build.gradle index a8b9264e6c..8f8aa8198f 100644 --- a/subutil/lib/build.gradle +++ b/subutil/lib/build.gradle @@ -1,7 +1,7 @@ apply { from "${rootDir.path}/config_lib.gradle" - plugin "tech.harmonysoft.oss.traute" +// plugin "tech.harmonysoft.oss.traute" plugin "com.github.dcendents.android-maven" plugin "com.jfrog.bintray" plugin "readme-sub" @@ -13,8 +13,8 @@ readme { } dependencies { - compileOnly dep.support.appcompat_v7 - compileOnly dep.support.design + compileOnly dep.appcompat + compileOnly dep.design api(dep.glide) { exclude group: "com.android.support" } diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java index 7ee8747902..0c177b534c 100755 --- a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java +++ b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java @@ -11,7 +11,7 @@ import android.location.LocationProvider; import android.os.Bundle; import android.provider.Settings; -import android.support.annotation.RequiresPermission; +import androidx.annotation.RequiresPermission; import android.util.Log; import java.io.IOException; diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java index 22486b3a91..934408c65e 100644 --- a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java +++ b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java @@ -1,6 +1,6 @@ package com.blankj.subutil.util; -import android.support.v4.util.SimpleArrayMap; +import androidx.collection.SimpleArrayMap; /** *
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
index 9cbf4e06fd..91b336abcf 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
@@ -7,8 +7,8 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.lang.reflect.InvocationTargetException;
 
diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
index 45e67a4a0d..9eba25c622 100644
--- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
+++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.subutil.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import com.blankj.subutil.pkg.R
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.PermissionUtils
diff --git a/utilcode/lib/build.gradle b/utilcode/lib/build.gradle
index 3570124816..41b0dacaa4 100644
--- a/utilcode/lib/build.gradle
+++ b/utilcode/lib/build.gradle
@@ -1,7 +1,7 @@
 apply {
     from "${rootDir.path}/config_lib.gradle"
 
-    plugin "tech.harmonysoft.oss.traute"
+//    plugin "tech.harmonysoft.oss.traute"
     plugin "com.github.dcendents.android-maven"
     plugin "com.jfrog.bintray"
     plugin "readme-core"
@@ -17,10 +17,10 @@ apply from: "${rootDir.path}/gradle/bintrayUploadAndroid.gradle"
 dependencies {
     compile dep.gson
 
-    compileOnly dep.support.appcompat_v7
-    compileOnly dep.support.design
+    compileOnly dep.appcompat
+    compileOnly dep.design
 
     testImplementation dep.junit
     testImplementation dep.robolectric
-    testImplementation dep.support.appcompat_v7
+    testImplementation dep.appcompat
 }
\ No newline at end of file
diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index 22ae3b8603..d0f2a3f7e0 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,7 +1,7 @@
 #project
 project.name=UtilCode
 project.groupId=com.blankj
-project.artifactId=utilcode
+project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
index b68bfcb113..5c05c0163e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index 76f7e9a217..6db826e4ab 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -4,7 +4,7 @@
 import android.Manifest.permission;
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.StringDef;
+import androidx.annotation.StringDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
index 9932037bf8..45090576e3 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index 4b8a9a07b5..9dd16d6e48 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -10,15 +10,16 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.util.Pair;
 import android.util.Log;
 import android.view.View;
 
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.util.Pair;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
index 7e87e73474..ca9036225e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
@@ -1,9 +1,10 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.View;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index 136f27b5ed..357c423fc6 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -17,8 +17,6 @@
 import android.net.Uri;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import java.io.File;
@@ -27,6 +25,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..22178a5c20 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -8,11 +8,6 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.widget.DrawerLayout;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Display;
@@ -27,6 +22,12 @@
 
 import java.lang.reflect.Method;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import static android.Manifest.permission.EXPAND_STATUS_BAR;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
index f9344b0a59..bacc519540 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
@@ -2,11 +2,12 @@
 
 import android.content.ContentResolver;
 import android.provider.Settings;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.Window;
 import android.view.WindowManager;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
index bb48a4b5cf..c5a9a17a6d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
index 99aef6b078..2e6637febf 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
@@ -8,7 +8,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
 import com.blankj.utilcode.constant.CacheConstants;
@@ -37,6 +36,8 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
index 2ef267bd01..6dbb9f7475 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
index c800423c78..aca1c25837 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
@@ -3,7 +3,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
index 56abfba117..aedcfa7fc4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
index d0e06e394d..ddaa2baed9 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
-import android.support.v4.util.LruCache;
+import androidx.annotation.NonNull;
+import androidx.collection.LruCache;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 4c0c22232b..a6603cfc44 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
 import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index 9ef930c467..a096321cf4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -5,8 +5,8 @@
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedWriter;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index c1c2c3c76e..d0c1788a02 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -8,8 +8,8 @@
 import android.os.Build;
 import android.os.PowerManager;
 import android.provider.Settings;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
 import android.text.TextUtils;
 
 import java.io.File;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
index 43b8537e75..9e8ae14ef1 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
@@ -3,16 +3,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.AnimatorRes;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.View;
 
@@ -20,6 +10,17 @@
 import java.util.Collections;
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.AnimatorRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 83e01eb1ad..cbee7dd4bd 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -27,13 +27,13 @@
 import android.renderscript.Element;
 import android.renderscript.RenderScript;
 import android.renderscript.ScriptIntrinsicBlur;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.view.View;
 
 import java.io.BufferedOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 6faa37d043..1e26dc8a9a 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,8 +8,8 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.content.FileProvider;
+import androidx.annotation.RequiresPermission;
+import androidx.core.content.FileProvider;
 
 import java.io.File;
 import java.util.ArrayList;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
index e1e2e78600..f5d814207d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -12,10 +12,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.RequiresApi;
+import androidx.collection.SimpleArrayMap;
 import android.util.Log;
 
 import com.google.gson.Gson;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
index 6f6cf85b80..bd4b8da935 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
@@ -8,7 +8,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index f281d777c2..3171837f46 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -7,7 +7,7 @@
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.format.Formatter;
 import android.util.Log;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
index b8163d2e66..73a900b465 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
@@ -5,9 +5,9 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
index be5491ece0..3c0c087a39 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
@@ -1,9 +1,9 @@
 package com.blankj.utilcode.util;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.RequiresApi;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index 235a0f3f94..1cb3df0156 100755
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -10,10 +10,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.WindowManager;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
index 99068781a4..f407f81b5f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
@@ -7,7 +7,7 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
index 7db75522d9..00c2bf6f73 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
@@ -10,8 +10,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index ba57fab956..817a94149f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 import com.blankj.utilcode.constant.RegexConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
index 92424163bb..ee41e95958 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.RawRes;
+import androidx.annotation.RawRes;
 
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
index d3e21fb873..21274c3023 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
index 554a2ed586..a9d18a1a55 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
@@ -3,7 +3,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index c3e089a90f..f55e4a21db 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -7,12 +7,11 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Point;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.DisplayMetrics;
 import android.view.Surface;
 import android.view.View;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
index b164e6154e..eab1990d29 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.Snackbar;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.snackbar.Snackbar;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
index 641204fd63..d79cf9262b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
@@ -14,14 +14,14 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
 import android.text.Layout;
 import android.text.Layout.Alignment;
 import android.text.SpannableStringBuilder;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..70f0defe50 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -1,8 +1,8 @@
 package com.blankj.utilcode.util;
 
 import android.content.res.Resources;
-import android.support.annotation.ArrayRes;
-import android.support.annotation.StringRes;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.StringRes;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index ba7122e366..819af790e8 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -2,9 +2,6 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -21,6 +18,10 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
index adaa920474..a5286b0fbe 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.TimeConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index b4fe658945..b25360e52c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -14,11 +14,11 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.core.app.NotificationManagerCompat;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 98f3ef66a8..8e4fd9d09c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -8,12 +8,14 @@
 import android.os.Environment;
 import android.provider.DocumentsContract;
 import android.provider.MediaStore;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
 import android.util.Log;
 
 import java.io.File;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
@@ -70,12 +72,19 @@ public static File uri2File(@NonNull final Uri uri) {
                 Log.d("UriUtils", uri.toString() + " parse failed. -> 1");
                 return null;
             } else if ("com.android.providers.downloads.documents".equals(authority)) {
-                final String id = DocumentsContract.getDocumentId(uri);
-                final Uri contentUri = ContentUris.withAppendedId(
-                        Uri.parse("content://downloads/public_downloads"),
-                        Long.valueOf(id)
-                );
-                return getFileFromUri(contentUri, 2);
+                String id = DocumentsContract.getDocumentId(uri);
+                if (!TextUtils.isEmpty(id)) {
+                    if (id.startsWith("raw:")) {
+                        return new File(id.substring(4));
+                    }
+                    final Uri contentUri = ContentUris.withAppendedId(
+                            Uri.parse(Environment.DIRECTORY_DOWNLOADS),
+                            Long.valueOf(id)
+                    );
+                    return getFileFromUri(contentUri, 2);
+                }
+                Log.d("UriUtils", uri.toString() + " parse failed. -> 3");
+                return null;
             } else if ("com.android.providers.media.documents".equals(authority)) {
                 final String docId = DocumentsContract.getDocumentId(uri);
                 final String[] split = docId.split(":");
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
index 52b82376e1..d858e4ad22 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
@@ -7,7 +7,7 @@
 import android.app.Application.ActivityLifecycleCallbacks;
 import android.content.Context;
 import android.os.Bundle;
-import android.support.v4.content.FileProvider;
+import androidx.core.content.FileProvider;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
index a57bbb8241..622d657817 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.os.Vibrator;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 
 import static android.Manifest.permission.VIBRATE;
 
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
index a0203f78fc..ed12c24d8d 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
@@ -1,7 +1,5 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
@@ -12,6 +10,9 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index 5ace21f5b1..f3d3600a27 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -6,7 +6,7 @@ import android.graphics.Bitmap
 import android.graphics.drawable.BitmapDrawable
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityOptionsCompat
+import androidx.core.app.ActivityOptionsCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
index 4815032936..864f1c12b4 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.activity
 
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityCompat
+import androidx.core.app.ActivityCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
index b2633ddf5c..0dac18c72c 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.bar
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentPagerAdapter
-import android.support.v4.view.ViewPager
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -37,7 +37,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             R.id.barStatusFragmentNavigationCustom
     )
 
-    private val mFragmentList = ArrayList()
+    private val mFragmentList = ArrayList()
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
         when (item.itemId) {
@@ -78,8 +78,8 @@ class BarStatusFragmentActivity : BaseActivity() {
         mFragmentList.add(BarStatusCustomFragment.newInstance())
 
         barStatusFragmentVp.offscreenPageLimit = 3
-        barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
-            override fun getItem(position: Int): Fragment {
+        barStatusFragmentVp.adapter = object : androidx.fragment.app.FragmentPagerAdapter(supportFragmentManager) {
+            override fun getItem(position: Int): androidx.fragment.app.Fragment {
                 return mFragmentList[position]
             }
 
@@ -88,7 +88,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             }
         }
 
-        barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+        barStatusFragmentVp.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
             override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
 
             override fun onPageSelected(position: Int) {
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
index ca0289a158..117c7d121e 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -2,8 +2,8 @@ package com.blankj.utilcode.pkg.feature.fragment
 
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.RequiresApi
-import android.support.v4.app.Fragment
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
 import android.transition.*
 import android.view.View
 import com.blankj.lib.base.BaseLazyFragment
@@ -129,7 +129,7 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener
         }
     }
 
-    private fun addSharedElement(fragment: Fragment): Fragment {
+    private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             fragment.sharedElementEnterTransition = DetailTransition()
             fragment.enterTransition = Fade()
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
index b768f563e5..6e3137b9c6 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -4,8 +4,8 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.os.PersistableBundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -30,7 +30,7 @@ class FragmentActivity : BaseActivity() {
         }
     }
 
-    private val mFragments = arrayListOf()
+    private val mFragments = arrayListOf()
     private var curIndex: Int = 0
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 496c5a4032..636d92c030 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -6,9 +6,9 @@ import android.graphics.Bitmap
 import android.graphics.Color
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.LayoutRes
-import android.support.annotation.StringRes
-import android.support.v7.widget.LinearLayoutManager
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.LinearLayoutManager
 import android.view.View
 import android.widget.ImageView
 import android.widget.TextView
@@ -92,7 +92,7 @@ class ImageActivity : BaseActivity() {
         }
 
         imageRv.adapter = ImageAdapter(mList, R.layout.item_image)
-        imageRv.layoutManager = LinearLayoutManager(this)
+        imageRv.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this)
     }
 
     override fun doBusiness() {}
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index 4bd07d274e..34d3914fe1 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.text.SpannableStringBuilder
 import android.view.View
 import android.view.ViewGroup
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index f3a1a3ee02..7c5fd45308 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.*
 import android.os.Bundle
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
 import android.text.Layout
 import android.text.SpannableStringBuilder
 import android.text.TextPaint
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..458ecbb3fb 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.toast
 
 import android.os.Handler
 import android.os.Looper
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.widget.TextView
 import android.widget.Toast
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index ea6c10c24d..40055d14b9 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v4.content.ContextCompat
+import androidx.core.content.ContextCompat
 import android.view.Gravity
 import android.view.View
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 7e6094414a..c3247b1312 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import android.text.method.ScrollingMovementMethod
 import android.view.LayoutInflater
 import android.view.View
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
index 003c6f5840..e33848b84d 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
index c3f88ecba3..e43cbb2bb5 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.CloseAdaptActivity">
 
-    
 
@@ -42,6 +42,6 @@
             android:textSize="30pt"
             app:layout_constraintTop_toBottomOf="@id/adaptScreenCloseAdaptDpTv" />
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
index 0b207d97f5..07c76be55b 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.HeightActivity">
 
-    
 
@@ -94,6 +94,6 @@
         
 
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
index 46e0f2f1a2..5a791d924f 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.WidthActivity">
 
-    
 
@@ -147,6 +147,6 @@
 
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
index c5f975b58f..1a36770b58 100644
--- a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
@@ -7,7 +7,7 @@
     android:background="@color/white"
     android:orientation="vertical">
 
-    
 
-    
 
-    
 
-    

From 70b6089109b6e58734d0a500820f54cb41858eba Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 8 Mar 2019 18:07:14 +0800
Subject: [PATCH 002/138] see 03/08 log

---
 utilcode/README-CN.md | 3 +++
 utilcode/README.md    | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index f3756be966..7fc06ebf99 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -3,6 +3,9 @@
 Gradle:
 ```groovy
 implementation 'com.blankj:utilcode:1.23.7'
+
+// if u use AndroidX, use the following
+implementation 'com.blankj:utilcodex:1.23.7'
 ```
 
 
diff --git a/utilcode/README.md b/utilcode/README.md
index 75d8757892..094cc44c08 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -3,6 +3,9 @@
 Gradle:
 ```groovy
 implementation 'com.blankj:utilcode:1.23.7'
+
+// if u use AndroidX, use the following
+implementation 'com.blankj:utilcodex:1.23.7'
 ```
 
 

From 2fa66306221456a5be12d9d201c7495958596fb4 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Mon, 11 Mar 2019 20:45:31 +0800
Subject: [PATCH 003/138] see 03/11 log

---
 utilcode/lib/project.properties | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index d0f2a3f7e0..d238eda740 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,9 +1,9 @@
 #project
-project.name=UtilCode
+project.name=UtilCodeX
 project.groupId=com.blankj
 project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
 #javadoc
-javadoc.name=UtilCode
\ No newline at end of file
+javadoc.name=UtilCodeX
\ No newline at end of file

From 6b0ff9575675cf0ae15c9c9a85eb249b5591c3a8 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Mon, 3 Jun 2019 20:49:21 +0800
Subject: [PATCH 004/138] see 06/03 log

---
 .gitignore                                    |  2 +-
 CHANGELOG.md                                  |  1 +
 gradle.properties                             |  8 +++++-
 gradle/config/config.gradle                   | 10 ++++----
 gradle/config/configApp.gradle                |  5 +++-
 launcher/app/build.gradle                     |  6 ++---
 launcher/pkg/build.gradle                     |  2 +-
 .../com/blankj/launcher/pkg/MainActivity.kt   |  2 +-
 .../pkg/src/main/res/layout/activity_main.xml | 18 ++++++-------
 lib/base/build.gradle                         |  2 +-
 .../com/blankj/lib/base/BaseActivity.java     |  5 ++--
 .../com/blankj/lib/base/BaseApplication.java  |  3 ++-
 .../blankj/lib/base/BaseDrawerActivity.java   | 11 ++++----
 .../com/blankj/lib/base/BaseFragment.java     | 13 +++++-----
 .../blankj/lib/base/BaseTitleActivity.java    |  9 ++++---
 .../java/com/blankj/lib/base/IBaseView.java   |  5 ++--
 .../com/blankj/lib/base/rv/BaseAdapter.java   |  5 ++--
 .../java/com/blankj/lib/base/rv/BaseCell.java |  3 ++-
 .../blankj/lib/base/rv/BaseViewHolder.java    |  4 +--
 .../lib/base/rv/RecycleViewDivider.java       | 10 ++++----
 .../main/res/layout/activity_base_title.xml   | 11 ++++----
 .../activity_base_title_stub_scroll.xml       |  4 +--
 .../src/main/res/layout/activity_drawer.xml   |  6 ++---
 subutil/app/build.gradle                      |  2 +-
 subutil/lib/build.gradle                      |  2 +-
 .../blankj/subutil/util/LocationUtils.java    |  2 +-
 .../com/blankj/subutil/util/PinyinUtils.java  |  2 +-
 .../java/com/blankj/subutil/util/Utils.java   |  4 +--
 .../subutil/util/http/ExecutorFactory.java    |  3 ++-
 .../blankj/subutil/util/http/HttpUtils.java   |  3 ++-
 .../com/blankj/subutil/util/http/Request.java |  3 ++-
 .../blankj/subutil/util/http/SSLConfig.java   |  3 ++-
 subutil/pkg/build.gradle                      |  2 +-
 .../blankj/subutil/pkg/helper/DialogHelper.kt |  2 +-
 utilcode/README-CN.md                         |  2 +-
 utilcode/README.md                            |  2 +-
 utilcode/app/build.gradle                     |  2 +-
 utilcode/lib/build.gradle                     |  2 +-
 utilcode/lib/project.properties               |  6 ++---
 .../utilcode/constant/MemoryConstants.java    |  2 +-
 .../constant/PermissionConstants.java         |  2 +-
 .../utilcode/constant/TimeConstants.java      |  2 +-
 .../blankj/utilcode/util/ActivityUtils.java   | 11 ++++----
 .../blankj/utilcode/util/AntiShakeUtils.java  |  5 ++--
 .../com/blankj/utilcode/util/AppUtils.java    |  5 ++--
 .../com/blankj/utilcode/util/BarUtils.java    | 11 ++++----
 .../blankj/utilcode/util/BrightnessUtils.java |  5 ++--
 .../com/blankj/utilcode/util/BusUtils.java    |  5 ++--
 .../utilcode/util/CacheDiskStaticUtils.java   |  3 ++-
 .../blankj/utilcode/util/CacheDiskUtils.java  |  3 ++-
 .../utilcode/util/CacheDoubleStaticUtils.java |  3 ++-
 .../utilcode/util/CacheDoubleUtils.java       |  2 +-
 .../utilcode/util/CacheMemoryStaticUtils.java |  2 +-
 .../utilcode/util/CacheMemoryUtils.java       |  4 +--
 .../com/blankj/utilcode/util/ColorUtils.java  | 12 ++++-----
 .../com/blankj/utilcode/util/CrashUtils.java  |  4 +--
 .../com/blankj/utilcode/util/DeviceUtils.java |  5 ++--
 .../blankj/utilcode/util/FragmentUtils.java   | 21 ++++++++--------
 .../com/blankj/utilcode/util/ImageUtils.java  | 14 +++++------
 .../com/blankj/utilcode/util/IntentUtils.java |  4 +--
 .../blankj/utilcode/util/KeyboardUtils.java   |  3 ++-
 .../com/blankj/utilcode/util/LogUtils.java    |  8 +++---
 .../blankj/utilcode/util/MetaDataUtils.java   |  2 +-
 .../blankj/utilcode/util/NetworkUtils.java    |  5 ++--
 .../utilcode/util/NotificationUtils.java      |  6 ++---
 .../com/blankj/utilcode/util/ObjectUtils.java |  6 ++---
 .../blankj/utilcode/util/PermissionUtils.java |  8 +++---
 .../com/blankj/utilcode/util/PhoneUtils.java  |  2 +-
 .../blankj/utilcode/util/ProcessUtils.java    |  4 +--
 .../com/blankj/utilcode/util/RegexUtils.java  |  2 +-
 .../blankj/utilcode/util/ResourceUtils.java   |  2 +-
 .../blankj/utilcode/util/SPStaticUtils.java   |  2 +-
 .../com/blankj/utilcode/util/SPUtils.java     |  2 +-
 .../com/blankj/utilcode/util/ScreenUtils.java |  4 +--
 .../com/blankj/utilcode/util/ShellUtils.java  |  2 +-
 .../blankj/utilcode/util/SnackbarUtils.java   | 14 +++++------
 .../com/blankj/utilcode/util/SpanUtils.java   | 16 ++++++------
 .../com/blankj/utilcode/util/StringUtils.java |  4 +--
 .../com/blankj/utilcode/util/ThreadUtils.java |  5 ++--
 .../com/blankj/utilcode/util/TimeUtils.java   |  2 +-
 .../com/blankj/utilcode/util/ToastUtils.java  | 10 ++++----
 .../com/blankj/utilcode/util/UriUtils.java    | 25 +++++++++++++------
 .../java/com/blankj/utilcode/util/Utils.java  |  3 ++-
 .../blankj/utilcode/util/VibrateUtils.java    |  2 +-
 .../com/blankj/utilcode/util/BaseTest.java    | 11 +++-----
 .../blankj/utilcode/util/ObjectUtilsTest.java |  5 ++--
 utilcode/pkg/build.gradle                     |  2 +-
 .../pkg/feature/activity/ActivityActivity.kt  |  2 +-
 .../feature/activity/SubActivityActivity.kt   |  2 +-
 .../feature/bar/BarStatusFragmentActivity.kt  | 16 ++++++------
 .../pkg/feature/fragment/ContainerFragment.kt |  6 ++---
 .../pkg/feature/fragment/FragmentActivity.kt  |  6 ++---
 .../pkg/feature/image/ImageActivity.kt        |  4 +--
 .../pkg/feature/snackbar/SnackbarActivity.kt  |  2 +-
 .../utilcode/pkg/feature/span/SpanActivity.kt |  2 +-
 .../utilcode/pkg/feature/toast/CustomToast.kt |  2 +-
 .../pkg/feature/toast/ToastActivity.kt        |  2 +-
 .../utilcode/pkg/helper/DialogHelper.kt       |  5 ++--
 .../main/res/layout/activity_adaptscreen.xml  |  4 +--
 .../res/layout/activity_adaptscreen_close.xml |  4 +--
 .../layout/activity_adaptscreen_height.xml    |  7 +++---
 .../res/layout/activity_adaptscreen_width.xml |  4 +--
 .../layout/activity_bar_status_fragment.xml   |  4 +--
 .../src/main/res/layout/activity_fragment.xml |  2 +-
 .../src/main/res/layout/activity_image.xml    |  3 +--
 105 files changed, 293 insertions(+), 253 deletions(-)

diff --git a/.gitignore b/.gitignore
index 201b88771a..193619553c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,4 @@
 .externalNativeBuild
 /apk
 *.phrof
-/maven
+/busMaven
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 95dfb60cc3..9c48786e89 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 * `19/04/24` [upd] The swipe panel.
 * `19/03/17` [fix] The ugly UI.
 * `19/03/14` [fix] AdaptScreenUtils didn't work on some HaWei tablet.
+* `19/03/09` [fix] UriUtils#uri2File.
 * `19/03/08` [add] LogUtils support multi process. Publish v1.23.7.
 * `19/03/02` [fix] LogUtils#file.
 * `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6.
diff --git a/gradle.properties b/gradle.properties
index 110f0cb7ef..c209c08b84 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -19,4 +19,10 @@
 
 #org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
 
-org.gradle.jvmargs=-XX:MaxHeapSize=1024m -Xmx1024m
\ No newline at end of file
+org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+org.gradle.daemon=true
+org.gradle.configureondemand=true
+org.gradle.parallel=true
+
+android.enableJetifier=true
+android.useAndroidX=true
\ No newline at end of file
diff --git a/gradle/config/config.gradle b/gradle/config/config.gradle
index e455c4dba6..e8c793b6b3 100644
--- a/gradle/config/config.gradle
+++ b/gradle/config/config.gradle
@@ -5,7 +5,7 @@ gradle.ext {
     applicationId = 'com.blankj.androidutilcode'
     appName = 'Util'
 
-    compileSdkVersion = 27
+    compileSdkVersion = 28
     minSdkVersion = 14
     targetSdkVersion = 27
     versionCode = 1_024_000
@@ -13,8 +13,8 @@ gradle.ext {
 
     // lib version
     kotlin_version = '1.3.10'
-    support_version = '27.1.1'
     leakcanary_version = '1.6.3'
+    androidx_version = '1.0.0'
 
     dep = [:]
 
@@ -36,11 +36,11 @@ gradle.ext {
             subutil_lib                : new DepConfig(":subutil:lib"),
             subutil_pkg                : new DepConfig(":subutil:pkg"),
             utilcode_app               : new DepConfig(":utilcode:app"),
-            utilcode_lib               : new DepConfig(false, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
+            utilcode_lib               : new DepConfig(true, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
             utilcode_pkg               : new DepConfig(":utilcode:pkg"),
 
-            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("androidx.appcompat:appcompat:$androidx_version"),
+            support_material           : new DepConfig("com.google.android.material:material:$androidx_version"),
             support_multidex           : new DepConfig("com.android.support:multidex:1.0.2"),
 
             constraint                 : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"),
diff --git a/gradle/config/configApp.gradle b/gradle/config/configApp.gradle
index cb8d5a290a..809cb07cd4 100644
--- a/gradle/config/configApp.gradle
+++ b/gradle/config/configApp.gradle
@@ -42,8 +42,11 @@ android {
     }
 
     dexOptions {
+        preDexLibraries true
         javaMaxHeapSize "8g"
         maxProcessCount 8
+        incremental true
+        dexInProcess = true
     }
 }
 
@@ -57,7 +60,7 @@ dependencies {
 
 private String getSuffix() {
     if (project.path == ":launcher:app") return ""
-    return project.path.replace(":" , "_").substring(0, project.path.length() - 4)
+    return project.path.replace(":", "_").substring(0, project.path.length() - 4)
 }
 
 def configSigning(Project pro) {
diff --git a/launcher/app/build.gradle b/launcher/app/build.gradle
index eb9f8d906f..bf68fb45ff 100644
--- a/launcher/app/build.gradle
+++ b/launcher/app/build.gradle
@@ -4,7 +4,7 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation project(':launcher:pkg')
-    implementation project(':subutil:pkg')
-    implementation project(':utilcode:pkg')
+    implementation gradle.ext.dep.launcher_pkg
+    implementation gradle.ext.dep.subutil_pkg
+    implementation gradle.ext.dep.utilcode_pkg
 }
\ No newline at end of file
diff --git a/launcher/pkg/build.gradle b/launcher/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/launcher/pkg/build.gradle
+++ b/launcher/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    api project(':lib:base')
+    api gradle.ext.dep.lib_base
 }
\ No newline at end of file
diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
index 02491cd88d..0e9f0a8477 100644
--- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
+++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.launcher.pkg
 
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v7.app.ActionBarDrawerToggle
+import androidx.appcompat.app.ActionBarDrawerToggle
 import android.view.View
 import android.widget.ImageView
 import com.blankj.lib.base.BaseDrawerActivity
diff --git a/launcher/pkg/src/main/res/layout/activity_main.xml b/launcher/pkg/src/main/res/layout/activity_main.xml
index 3b31dafe32..ee8b62a6fa 100644
--- a/launcher/pkg/src/main/res/layout/activity_main.xml
+++ b/launcher/pkg/src/main/res/layout/activity_main.xml
@@ -1,17 +1,17 @@
 
-
 
-    
 
-        
 
-            
 
-        
-    
+        
+    
 
     
 
-    
@@ -69,5 +69,5 @@
                 android:text="@string/sub_util" />
 
         
-    
-
+    
+
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
index 370036c062..67f9762d82 100644
--- a/lib/base/build.gradle
+++ b/lib/base/build.gradle
@@ -8,7 +8,7 @@ dependencies {
     api gradle.ext.dep.subutil_lib
 
     api gradle.ext.dep.support_appcompat_v7
-    api gradle.ext.dep.support_design
+    api gradle.ext.dep.support_material
     api gradle.ext.dep.support_multidex
     api gradle.ext.dep.constraint
     api gradle.ext.dep.kotlin
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
index caae1d45cf..0c9d8fa419 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
@@ -3,11 +3,12 @@
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.v7.app.AppCompatActivity;
 import android.view.LayoutInflater;
 import android.view.View;
 
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.AppCompatActivity;
+
 import com.blankj.swipepanel.SwipePanel;
 import com.blankj.utilcode.util.AntiShakeUtils;
 import com.blankj.utilcode.util.AppUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
index 1e0ddc0b27..5d2eba8260 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
@@ -2,7 +2,8 @@
 
 import android.app.Application;
 import android.content.Context;
-import android.support.multidex.MultiDex;
+
+import androidx.multidex.MultiDex;
 
 import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.CrashUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
index c7f7f1daea..ec3c895f6e 100755
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
@@ -3,17 +3,18 @@
 import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.net.Uri;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.StringRes;
-import android.support.design.widget.NavigationView;
-import android.support.v4.widget.DrawerLayout;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.widget.FrameLayout;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.StringUtils;
+import com.google.android.material.navigation.NavigationView;
 
 
 /**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
index 5667f3f02c..0e4e7ba5cc 100755
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
@@ -4,17 +4,18 @@
 import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.IdRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
+
 import com.blankj.utilcode.util.AntiShakeUtils;
 
 /**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
index a40230420d..e0ed3ed10a 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
@@ -1,16 +1,17 @@
 package com.blankj.lib.base;
 
 import android.annotation.SuppressLint;
-import android.support.annotation.LayoutRes;
-import android.support.design.widget.CoordinatorLayout;
-import android.support.v7.app.ActionBar;
-import android.support.v7.widget.Toolbar;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewStub;
 import android.widget.FrameLayout;
 
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.Toolbar;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
+
 import com.blankj.utilcode.util.BarUtils;
 import com.blankj.utilcode.util.ColorUtils;
 
diff --git a/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java b/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
index 29e8553899..b0550f126c 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
@@ -1,10 +1,11 @@
 package com.blankj.lib.base;
 
 import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.Nullable;
 import android.view.View;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+
 
 /**
  * 
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
index 11aa94e015..e69be6c6df 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
@@ -1,12 +1,13 @@
 package com.blankj.lib.base.rv;
 
 import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
 import java.util.List;
 
 /**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
index cdf42c7882..332c4caee0 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
@@ -1,10 +1,11 @@
 package com.blankj.lib.base.rv;
 
-import android.support.annotation.NonNull;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
 import android.view.View;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
index ceb1c46eac..0bd892f317 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
@@ -1,7 +1,7 @@
 package com.blankj.lib.base.rv;
 
-import android.support.annotation.IdRes;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.IdRes;
+import androidx.recyclerview.widget.RecyclerView;
 import android.util.SparseArray;
 import android.view.View;
 
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
index 3d2b90f302..dd20894e10 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
@@ -5,11 +5,11 @@
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.RecyclerView;
 import android.view.View;
 import android.widget.LinearLayout;
 
diff --git a/lib/base/src/main/res/layout/activity_base_title.xml b/lib/base/src/main/res/layout/activity_base_title.xml
index b11ecf7341..986d3669b6 100644
--- a/lib/base/src/main/res/layout/activity_base_title.xml
+++ b/lib/base/src/main/res/layout/activity_base_title.xml
@@ -1,24 +1,23 @@
 
-
 
-    
 
-        
-    
+    
 
     
 
-
+
diff --git a/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml b/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
index 96f5e09d49..bd031cfb67 100644
--- a/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
+++ b/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
 
diff --git a/lib/base/src/main/res/layout/activity_drawer.xml b/lib/base/src/main/res/layout/activity_drawer.xml
index 72f70ed969..be44cd718c 100644
--- a/lib/base/src/main/res/layout/activity_drawer.xml
+++ b/lib/base/src/main/res/layout/activity_drawer.xml
@@ -1,5 +1,5 @@
 
-
 
-    
 
-
+
diff --git a/subutil/app/build.gradle b/subutil/app/build.gradle
index a2e0172413..a7027c15ef 100644
--- a/subutil/app/build.gradle
+++ b/subutil/app/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation project(':subutil:pkg')
+    implementation gradle.ext.dep.subutil_pkg
 }
\ No newline at end of file
diff --git a/subutil/lib/build.gradle b/subutil/lib/build.gradle
index 9dcbe0b542..f3140b4f0b 100644
--- a/subutil/lib/build.gradle
+++ b/subutil/lib/build.gradle
@@ -14,7 +14,7 @@ readme {
 
 dependencies {
     compileOnly gradle.ext.dep.support_appcompat_v7
-    compileOnly gradle.ext.dep.support_design
+    compileOnly gradle.ext.dep.support_material
     api(gradle.ext.dep.glide) {
         exclude group: "com.android.support"
     }
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
index 7ee8747902..0c177b534c 100755
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
@@ -11,7 +11,7 @@
 import android.location.LocationProvider;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.IOException;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
index 22486b3a91..934408c65e 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.subutil.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 /**
  * 
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
index 9cbf4e06fd..91b336abcf 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
@@ -7,8 +7,8 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.lang.reflect.InvocationTargetException;
 
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
index f5583397d9..2f26fb9c24 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
@@ -2,7 +2,8 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
index b952f318cb..bdd4174486 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
@@ -1,7 +1,8 @@
 package com.blankj.subutil.util.http;
 
 import android.accounts.NetworkErrorException;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
index fe39b1299c..c6eddf9b96 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
@@ -1,6 +1,7 @@
 package com.blankj.subutil.util.http;
 
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
index b8624af490..0cf43662f2 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
@@ -2,7 +2,8 @@
 
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.io.IOException;
 import java.net.InetAddress;
diff --git a/subutil/pkg/build.gradle b/subutil/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/subutil/pkg/build.gradle
+++ b/subutil/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    api project(':lib:base')
+    api gradle.ext.dep.lib_base
 }
\ No newline at end of file
diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
index 45e67a4a0d..9eba25c622 100644
--- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
+++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.subutil.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import com.blankj.subutil.pkg.R
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.PermissionUtils
diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index 445f206121..0bdb622940 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -5,7 +5,7 @@ Gradle:
 implementation 'com.blankj:utilcode:1.24.0'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.23.7'
+implementation 'com.blankj:utilcodex:1.24.0'
 ```
 
 
diff --git a/utilcode/README.md b/utilcode/README.md
index f449736061..5a6a295b4c 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -5,7 +5,7 @@ Gradle:
 implementation 'com.blankj:utilcode:1.24.0'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.23.7'
+implementation 'com.blankj:utilcodex:1.24.0'
 ```
 
 
diff --git a/utilcode/app/build.gradle b/utilcode/app/build.gradle
index 5616386892..ea5c172cd7 100644
--- a/utilcode/app/build.gradle
+++ b/utilcode/app/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation project(':utilcode:pkg')
+    implementation gradle.ext.dep.utilcode_pkg
 }
\ No newline at end of file
diff --git a/utilcode/lib/build.gradle b/utilcode/lib/build.gradle
index e4dd3a6716..6d6c599298 100644
--- a/utilcode/lib/build.gradle
+++ b/utilcode/lib/build.gradle
@@ -18,7 +18,7 @@ dependencies {
     compile gradle.ext.dep.gson
 
     compileOnly gradle.ext.dep.support_appcompat_v7
-    compileOnly gradle.ext.dep.support_design
+    compileOnly gradle.ext.dep.support_material
 
     testImplementation gradle.ext.dep.junit
     testImplementation gradle.ext.dep.robolectric
diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index 22ae3b8603..d238eda740 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,9 +1,9 @@
 #project
-project.name=UtilCode
+project.name=UtilCodeX
 project.groupId=com.blankj
-project.artifactId=utilcode
+project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
 #javadoc
-javadoc.name=UtilCode
\ No newline at end of file
+javadoc.name=UtilCodeX
\ No newline at end of file
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
index b68bfcb113..5c05c0163e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index 76f7e9a217..6db826e4ab 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -4,7 +4,7 @@
 import android.Manifest.permission;
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.StringDef;
+import androidx.annotation.StringDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
index 9932037bf8..45090576e3 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index d6a671e4fe..de1bfeb005 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -10,14 +10,15 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.util.Pair;
 import android.util.Log;
 import android.view.View;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.util.Pair;
+
 import java.util.List;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
index 7e87e73474..ca9036225e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
@@ -1,9 +1,10 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.View;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index a9368be59f..5a9194ce66 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -17,8 +17,6 @@
 import android.net.Uri;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import java.io.File;
@@ -27,6 +25,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..22178a5c20 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -8,11 +8,6 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.widget.DrawerLayout;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Display;
@@ -27,6 +22,12 @@
 
 import java.lang.reflect.Method;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import static android.Manifest.permission.EXPAND_STATUS_BAR;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
index f9344b0a59..bacc519540 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
@@ -2,11 +2,12 @@
 
 import android.content.ContentResolver;
 import android.provider.Settings;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.Window;
 import android.view.WindowManager;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
index f04202043e..d272c99b98 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
@@ -16,11 +16,12 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
index bb48a4b5cf..c5a9a17a6d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
index 67e6b3fb0e..a8ae8afa5b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
@@ -8,9 +8,10 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+
 import com.blankj.utilcode.constant.CacheConstants;
 
 import org.json.JSONArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
index 2ef267bd01..6dbb9f7475 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
index c800423c78..aca1c25837 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
@@ -3,7 +3,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
index 56abfba117..aedcfa7fc4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
index d0e06e394d..ddaa2baed9 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
-import android.support.v4.util.LruCache;
+import androidx.annotation.NonNull;
+import androidx.collection.LruCache;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 4c0c22232b..a6603cfc44 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
 import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index 18b5f814a3..081dd09761 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -5,8 +5,8 @@
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedWriter;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index e6b1910cfc..c641c9bdae 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -11,11 +11,12 @@
 import android.os.Debug;
 import android.os.PowerManager;
 import android.provider.Settings;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+
 import java.io.File;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
index 43b8537e75..9e8ae14ef1 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
@@ -3,16 +3,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.AnimatorRes;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.View;
 
@@ -20,6 +10,17 @@
 import java.util.Collections;
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.AnimatorRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 83e01eb1ad..cbee7dd4bd 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -27,13 +27,13 @@
 import android.renderscript.Element;
 import android.renderscript.RenderScript;
 import android.renderscript.ScriptIntrinsicBlur;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.view.View;
 
 import java.io.BufferedOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 6faa37d043..1e26dc8a9a 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,8 +8,8 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.content.FileProvider;
+import androidx.annotation.RequiresPermission;
+import androidx.core.content.FileProvider;
 
 import java.io.File;
 import java.util.ArrayList;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
index cfa568fa7c..de3eb285cc 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
@@ -7,7 +7,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.ResultReceiver;
-import android.support.annotation.NonNull;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@@ -16,6 +15,8 @@
 import android.view.inputmethod.InputMethodManager;
 import android.widget.FrameLayout;
 
+import androidx.annotation.NonNull;
+
 import java.lang.reflect.Field;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
index 1372ecd40b..9a7e11cbf5 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -10,10 +10,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.RequiresApi;
+import androidx.collection.SimpleArrayMap;
 import android.util.Log;
 
 import com.google.gson.Gson;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
index 6f6cf85b80..bd4b8da935 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
@@ -8,7 +8,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index d59eb28240..24a05a26b7 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -7,13 +7,14 @@
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.text.format.Formatter;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
+
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.net.InterfaceAddress;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
index b8163d2e66..73a900b465 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
@@ -5,9 +5,9 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
index be5491ece0..3c0c087a39 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
@@ -1,9 +1,9 @@
 package com.blankj.utilcode.util;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.RequiresApi;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index d35cbcc620..602efcb5db 100755
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -9,10 +9,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.WindowManager;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
index 99068781a4..f407f81b5f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
@@ -7,7 +7,7 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
index adcd265f72..619b175549 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
@@ -10,8 +10,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.util.Arrays;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index ba57fab956..817a94149f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 import com.blankj.utilcode.constant.RegexConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
index 81d10f08cf..3fb515c06b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.RawRes;
+import androidx.annotation.RawRes;
 
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
index d3e21fb873..21274c3023 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
index 554a2ed586..a9d18a1a55 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
@@ -3,7 +3,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index 7390fceed0..3245eb115c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -10,8 +10,8 @@
 import android.graphics.Point;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.DisplayMetrics;
 import android.view.Surface;
 import android.view.View;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
index b7ad2fa9d2..fc10a601ae 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.io.BufferedReader;
 import java.io.DataOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
index b164e6154e..eab1990d29 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.Snackbar;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.snackbar.Snackbar;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
index b8d9d53aed..4d49451ec0 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
@@ -14,14 +14,14 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
 import android.text.Layout;
 import android.text.Layout.Alignment;
 import android.text.SpannableStringBuilder;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..70f0defe50 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -1,8 +1,8 @@
 package com.blankj.utilcode.util;
 
 import android.content.res.Resources;
-import android.support.annotation.ArrayRes;
-import android.support.annotation.StringRes;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.StringRes;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index 0545a27fa0..19de94ca33 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -2,10 +2,11 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Executor;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
index adaa920474..a5286b0fbe 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.TimeConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index 150425cdba..0dd47cfa3e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -12,11 +12,11 @@
 import android.os.Build;
 import android.os.Handler;
 import android.os.Message;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.core.app.NotificationManagerCompat;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 9ad408912a..20fdc39b81 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -8,12 +8,14 @@
 import android.os.Environment;
 import android.provider.DocumentsContract;
 import android.provider.MediaStore;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
 import android.util.Log;
 
 import java.io.File;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
@@ -75,12 +77,19 @@ public static File uri2File(@NonNull final Uri uri) {
                 Log.d("UriUtils", uri.toString() + " parse failed. -> 1");
                 return null;
             } else if ("com.android.providers.downloads.documents".equals(authority)) {
-                final String id = DocumentsContract.getDocumentId(uri);
-                final Uri contentUri = ContentUris.withAppendedId(
-                        Uri.parse("content://downloads/public_downloads"),
-                        Long.valueOf(id)
-                );
-                return getFileFromUri(contentUri, 2);
+                String id = DocumentsContract.getDocumentId(uri);
+                if (!TextUtils.isEmpty(id)) {
+                    if (id.startsWith("raw:")) {
+                        return new File(id.substring(4));
+                    }
+                    final Uri contentUri = ContentUris.withAppendedId(
+                            Uri.parse(Environment.DIRECTORY_DOWNLOADS),
+                            Long.valueOf(id)
+                    );
+                    return getFileFromUri(contentUri, 2);
+                }
+                Log.d("UriUtils", uri.toString() + " parse failed. -> 3");
+                return null;
             } else if ("com.android.providers.media.documents".equals(authority)) {
                 final String docId = DocumentsContract.getDocumentId(uri);
                 final String[] split = docId.split(":");
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
index d0c98afc96..1992a2c902 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
@@ -13,13 +13,14 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
-import android.support.v4.content.FileProvider;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 
+import androidx.core.content.FileProvider;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
index a57bbb8241..622d657817 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.os.Vibrator;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 
 import static android.Manifest.permission.VIBRATE;
 
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
index 85bc9d8ac2..2dadedff8c 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
@@ -1,8 +1,5 @@
 package com.blankj.utilcode.util;
 
-
-import android.support.annotation.NonNull;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -29,7 +26,7 @@ public BaseTest() {
         ShadowLog.stream = System.out;
         ThreadUtils.setDeliver(new Executor() {
             @Override
-            public void execute(@NonNull Runnable command) {
+            public void execute(Runnable command) {
                 command.run();
             }
         });
@@ -201,8 +198,8 @@ public void onFail(Throwable t) {
     static class Person implements Comparable {
 
         String name;
-        int age;
-        int time;
+        int    age;
+        int    time;
 
         public Person(String name) {
             this.name = name;
@@ -220,7 +217,7 @@ public String toString() {
         }
 
         @Override
-        public int compareTo(@NonNull Person o) {
+        public int compareTo(Person o) {
             int res = o.age - age;
             if (res != 0) {
                 return res;
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
index a0203f78fc..ed12c24d8d 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
@@ -1,7 +1,5 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
@@ -12,6 +10,9 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/utilcode/pkg/build.gradle b/utilcode/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/utilcode/pkg/build.gradle
+++ b/utilcode/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    api project(':lib:base')
+    api gradle.ext.dep.lib_base
 }
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index e784f98401..9982c948b7 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -6,7 +6,7 @@ import android.graphics.Bitmap
 import android.graphics.drawable.BitmapDrawable
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityOptionsCompat
+import androidx.core.app.ActivityOptionsCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
index 0c63773639..abf0151bbc 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.activity
 
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityCompat
+import androidx.core.app.ActivityCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
index d4f0d60530..fc8020b3e5 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.bar
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentPagerAdapter
-import android.support.v4.view.ViewPager
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -37,7 +37,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             R.id.barStatusFragmentNavigationCustom
     )
 
-    private val mFragmentList = ArrayList()
+    private val mFragmentList = ArrayList()
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
         when (item.itemId) {
@@ -78,8 +78,8 @@ class BarStatusFragmentActivity : BaseActivity() {
         mFragmentList.add(BarStatusCustomFragment.newInstance())
 
         barStatusFragmentVp.offscreenPageLimit = 3
-        barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
-            override fun getItem(position: Int): Fragment {
+        barStatusFragmentVp.adapter = object : androidx.fragment.app.FragmentPagerAdapter(supportFragmentManager) {
+            override fun getItem(position: Int): androidx.fragment.app.Fragment {
                 return mFragmentList[position]
             }
 
@@ -88,7 +88,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             }
         }
 
-        barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+        barStatusFragmentVp.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
             override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
 
             override fun onPageSelected(position: Int) {
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
index ada9dd0d10..86972c449d 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -2,8 +2,8 @@ package com.blankj.utilcode.pkg.feature.fragment
 
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.RequiresApi
-import android.support.v4.app.Fragment
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
 import android.transition.*
 import android.view.View
 import com.blankj.lib.base.BaseLazyFragment
@@ -128,7 +128,7 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener
         }
     }
 
-    private fun addSharedElement(fragment: Fragment): Fragment {
+    private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             fragment.sharedElementEnterTransition = DetailTransition()
             fragment.enterTransition = Fade()
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
index 446271b366..b18a2e236b 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -4,8 +4,8 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.os.PersistableBundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -29,7 +29,7 @@ class FragmentActivity : BaseActivity() {
         }
     }
 
-    private val mFragments = arrayListOf()
+    private val mFragments = arrayListOf()
     private var curIndex: Int = 0
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 0e092e0062..2c6656f220 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -6,12 +6,12 @@ import android.graphics.Bitmap
 import android.graphics.Color
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.StringRes
-import android.support.v7.widget.LinearLayoutManager
 import android.view.View
 import android.widget.Button
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.LinearLayoutManager
 import com.blankj.lib.base.BaseTaskActivity
 import com.blankj.lib.base.rv.BaseAdapter
 import com.blankj.lib.base.rv.BaseCell
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index a0ea36d528..cd1c1b0d99 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.text.SpannableStringBuilder
 import android.view.View
 import android.view.ViewGroup
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index d84ced168c..202069ed61 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.*
 import android.os.Bundle
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
 import android.text.Layout
 import android.text.SpannableStringBuilder
 import android.text.TextPaint
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..458ecbb3fb 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.toast
 
 import android.os.Handler
 import android.os.Looper
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.widget.TextView
 import android.widget.Toast
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index 51c9e53774..47f91e826e 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v4.content.ContextCompat
+import androidx.core.content.ContextCompat
 import android.view.Gravity
 import android.view.View
 import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 344a69e448..a495a13013 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -3,7 +3,6 @@ package com.blankj.utilcode.pkg.helper
 import android.app.Dialog
 import android.graphics.Bitmap
 import android.graphics.drawable.ColorDrawable
-import android.support.v7.app.AlertDialog
 import android.text.method.ScrollingMovementMethod
 import android.view.Gravity
 import android.view.LayoutInflater
@@ -12,9 +11,9 @@ import android.widget.Button
 import android.widget.EditText
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.appcompat.app.AlertDialog
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.util.*
-import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest
 
 /**
  * ```
@@ -26,7 +25,7 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques
  */
 object DialogHelper {
 
-    fun showRationaleDialog(shouldRequest: ShouldRequest) {
+    fun showRationaleDialog(shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
         val topActivity = ActivityUtils.getTopActivity()
         AlertDialog.Builder(topActivity)
                 .setTitle(android.R.string.dialog_alert_title)
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
index 792ae5672e..9be8749952 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
index ccc88dddb6..1522b0741b 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
@@ -8,7 +8,7 @@
     android:fillViewport="true"
     tools:context=".feature.adaptScreen.AdaptCloseActivity">
 
-    
 
@@ -43,6 +43,6 @@
             android:textSize="30pt"
             app:layout_constraintTop_toBottomOf="@id/adaptScreenCloseAdaptDpTv" />
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
index 350921b04d..75fa87e8e5 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
@@ -1,13 +1,12 @@
 
-
 
-    
 
@@ -94,6 +93,6 @@
                 android:textSize="30pt" />
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
index 121415e1b6..dd9f9f40c7 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
@@ -8,7 +8,7 @@
     android:fillViewport="true"
     tools:context=".feature.adaptScreen.AdaptWidthActivity">
 
-    
 
@@ -149,6 +149,6 @@
 
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
index 3ce196004b..bd6e43e7a7 100644
--- a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
@@ -6,7 +6,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    
 
-    
 
-    
-
Date: Sat, 29 Jun 2019 19:59:42 +0800
Subject: [PATCH 005/138] see 06/29 log

---
 .../test/java/com/blankj/utilcode/util/TimeUtilsTest.java    | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
index 2ba0a41586..5ab8ee17eb 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
@@ -42,15 +42,14 @@ public class TimeUtilsTest  {
     public void millis2String() {
         assertEquals(timeString, TimeUtils.millis2String(timeMillis));
         assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, mFormat));
-        assertEquals("2017年05月04日", TimeUtils.millis2String(timeMillis, "yyyy年MM月dd日"));
-        assertEquals("16时37分", TimeUtils.millis2String(timeMillis, "HH时mm分"));
+        assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, "yyyy MM dd HH:mm:ss"));
     }
 
     @Test
     public void string2Millis() {
         assertEquals(timeMillis, TimeUtils.string2Millis(timeString));
         assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, mFormat));
-        assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, "yyyy年MM月dd日HH时mm分"));
+        assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, "yyyy MM dd HH:mm:ss"));
     }
 
     @Test

From 40c0e36fbb1dc33ebce09a6fa162e07380271cf9 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Thu, 15 Aug 2019 01:36:03 +0800
Subject: [PATCH 006/138] see 08/15 log

---
 lib/utilcode/README-CN.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index d610595e3c..cce78181fc 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -1185,7 +1185,7 @@ getComments       : 获取压缩文件中的注释链表
 [log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
 
 [map.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/MapUtils.java
-[map.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/MapUtilsTest.java
+[map.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/MapUtilsTest.java
 
 [metaData.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
 [metaData.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt

From c80cdc9c05529da6a6e5701b160817301dbb6528 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 16 Aug 2019 17:39:00 +0800
Subject: [PATCH 007/138] see 08/16 log

---
 buildSrc/src/main/groovy/GitUtils.groovy | 77 ++++++++++--------------
 1 file changed, 32 insertions(+), 45 deletions(-)

diff --git a/buildSrc/src/main/groovy/GitUtils.groovy b/buildSrc/src/main/groovy/GitUtils.groovy
index 929f750f4f..a78cb982d5 100644
--- a/buildSrc/src/main/groovy/GitUtils.groovy
+++ b/buildSrc/src/main/groovy/GitUtils.groovy
@@ -1,6 +1,5 @@
 import org.gradle.api.Action
 import org.gradle.api.Project
-import org.gradle.api.Task
 import org.gradle.api.invocation.Gradle
 
 import java.text.SimpleDateFormat
@@ -34,55 +33,43 @@ class GitUtils {
     }
 
     static void addGitPushTask(Project project) {
-        project.task("gitPush", new Action() {
-            @Override
-            void execute(Task task) {
-                task.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[]))
-                }
-            }
-        })
+        project.task("gitPush").doLast {
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd")
+            String date = simpleDateFormat.format(new Date())
+            GLog.d(ShellUtils.execCmd([
+                    "git add -A",
+                    "git commit -m \"see $date log\"",
+                    "git push origin $sCurBranchName"
+            ] as String[]))
+        }
     }
 
     static void addGitPushAndMerge2MasterTask(Project project) {
-        project.task("gitPushAndMerge2Master", new Action() {
-            @Override
-            void execute(Task task) {
-                task.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[]))
-                }
-            }
-        })
+        project.task("gitPushAndMerge2Master").doLast {
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd")
+            String date = simpleDateFormat.format(new Date())
+            GLog.d(ShellUtils.execCmd([
+                    "git add -A",
+                    "git commit -m \"see $date log\"",
+                    "git push origin $sCurBranchName",
+                    "git checkout master",
+                    "git merge $sCurBranchName",
+                    "git push origin master",
+                    "git checkout $sCurBranchName",
+            ] as String[]))
+        }
     }
 
     static void addGitNewBranchTask(Project project) {
-        project.task("gitNewBranch", new Action() {
-            @Override
-            void execute(Task task) {
-                task.doLast {
-                    GLog.d(ShellUtils.execCmd([
-                            "git checkout master",
-                            "git checkout -b ${Config.versionName}",
-                            "git push origin ${Config.versionName}:${Config.versionName}",
-                    ] as String[]))
-                }
-            }
-        })
+        project.task("gitNewBranch").doLast {
+            GLog.d(ShellUtils.execCmd([
+                    "git checkout master",
+                    "git checkout -b ${Config.versionName}",
+                    "git push origin ${Config.versionName}:${Config.versionName}",
+            ] as String[]))
+        }
     }
 }
+// ./gradlew gitPush
+// ./gradlew gitPushAndMerge2Master
+// ./gradlew gitNewBranch

From bfc0a678c16485ea35105ec941fdc00fe3ff413a Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sun, 25 Aug 2019 17:52:45 +0800
Subject: [PATCH 008/138] see 08/25 log

---
 CHANGELOG.md                                  |   4 +
 README-CN.md                                  |   2 +-
 README.md                                     |   2 +-
 buildSrc/src/main/groovy/Config.groovy        |   4 +-
 buildSrc/src/main/groovy/GitUtils.java        |  12 ---
 gradle.properties                             |   3 +-
 gradle/wrapper/gradle-wrapper.properties      |   2 +-
 lib/utilcode/README-CN.md                     |  15 ++-
 lib/utilcode/README.md                        |  17 +++-
 .../constant/PermissionConstants.java         |   2 +-
 .../com/blankj/utilcode/util/AppUtils.java    |   2 +-
 .../blankj/utilcode/util/ConvertUtils.java    |  10 +-
 .../com/blankj/utilcode/util/CrashUtils.java  |   2 +-
 .../com/blankj/utilcode/util/DeviceUtils.java |  37 ++++---
 .../blankj/utilcode/util/EncryptUtils.java    |   2 +-
 .../com/blankj/utilcode/util/FileUtils.java   |   2 +-
 .../com/blankj/utilcode/util/ImageUtils.java  |  93 +++++++++++++-----
 .../blankj/utilcode/util/KeyboardUtils.java   |  10 +-
 .../com/blankj/utilcode/util/LogUtils.java    |  24 ++++-
 .../com/blankj/utilcode/util/PhoneUtils.java  |  13 ++-
 .../com/blankj/utilcode/util/ScreenUtils.java |   4 +-
 .../com/blankj/utilcode/util/SizeUtils.java   |  10 +-
 .../com/blankj/utilcode/util/ViewUtils.java   |  27 ++++-
 .../blankj/utilcode/util/ImageUtilsTest.java  |  26 +++++
 .../com/blankj/utilcode/util/TestConfig.java  |   2 +
 .../src/test/res/image/ic_launcher.bmp        | Bin 0 -> 49208 bytes
 .../src/test/res/image/ic_launcher.gif        | Bin 0 -> 2195 bytes
 .../src/test/res/image/ic_launcher.ico        | Bin 0 -> 1150 bytes
 .../src/test/res/image/ic_launcher.jpg        | Bin 0 -> 14725 bytes
 .../src/test/res/image/ic_launcher.png        | Bin 0 -> 2793 bytes
 .../src/test/res/image/ic_launcher.tif        | Bin 0 -> 80948 bytes
 .../src/test/res/image/ic_launcher.webp       | Bin 0 -> 1484 bytes
 32 files changed, 228 insertions(+), 99 deletions(-)
 delete mode 100644 buildSrc/src/main/groovy/GitUtils.java
 create mode 100644 lib/utilcode/src/test/java/com/blankj/utilcode/util/ImageUtilsTest.java
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.bmp
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.gif
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.ico
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.jpg
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.png
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.tif
 create mode 100644 lib/utilcode/src/test/res/image/ic_launcher.webp

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f48fe84146..99103073e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+* `19/08/25` [upd] ImageUtils#getImageType. [add] LogUtils# Publish v1.25.9.
+* `19/08/24` [fix] PhoneUtils#getIMEI crash on SDK 29.
+* `19/08/23` [add] ViewUtils#isLayoutRtl.
+* `19/08/22` [add] LogUtils#getLogFiles.
 * `19/08/13` [add] MapUtils and MapUtilsTest. Publish v1.25.8.
 * `19/08/12` [add] CollectionUtils and CollectionUtilsTest.
 * `19/08/11` [add] ArrayUtils and ArrayUtilsTest.
diff --git a/README-CN.md b/README-CN.md
index 82d01dc0df..ed00c0f6df 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -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.25.8-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.9-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/README.md b/README.md
index 103970b8f1..9015f9679f 100644
--- a/README.md
+++ b/README.md
@@ -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.25.8-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.9-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 692066d5a5..4335dca9b0 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -14,8 +14,8 @@ class Config {
     static compileSdkVersion = 28
     static minSdkVersion = 14
     static targetSdkVersion = 28
-    static versionCode = 1_025_008
-    static versionName = '1.25.8-alpha1'// E.g. 1.9.72 => 1,009,072
+    static versionCode = 1_025_009
+    static versionName = '1.25.9'// E.g. 1.9.72 => 1,009,072
 
     // lib version
     static kotlin_version = '1.3.10'
diff --git a/buildSrc/src/main/groovy/GitUtils.java b/buildSrc/src/main/groovy/GitUtils.java
deleted file mode 100644
index d36a3c7b71..0000000000
--- a/buildSrc/src/main/groovy/GitUtils.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package PACKAGE_NAME;
-
-/**
- * 
- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/08/16
- *     desc  :
- * 
- */ -public class GitUtils { -} diff --git a/gradle.properties b/gradle.properties index 932a98194f..63f495a02a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,7 @@ org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:-UseGCOverheadLimit -Dfile.encoding=UTF-8 org.gradle.daemon=true #org.gradle.configureondemand=true -#org.gradle.parallel=true +org.gradle.parallel=true +org.gradle.caching=true #-Dorg.gradle.debug=true --no-daemon \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1129dccfd3..e4718dff4d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md index 66b6541990..d638ebbd10 100644 --- a/lib/utilcode/README-CN.md +++ b/lib/utilcode/README-CN.md @@ -2,10 +2,10 @@ Gradle: ```groovy -implementation 'com.blankj:utilcode:1.25.8' +implementation 'com.blankj:utilcode:1.25.9' // if u use AndroidX, use the following -implementation 'com.blankj:utilcodex:1.25.8' +implementation 'com.blankj:utilcodex:1.25.9' ``` @@ -1069,6 +1069,15 @@ vibrate: 震动 cancel : 取消 ``` +* ### 视图相关 -> [ViewUtils.java][view.java] +``` +setViewEnabled : 设置视图是否可用 +runOnUiThread : 在 UI 线程运行 +runOnUiThreadDelayed: 在 UI 线程延迟运行 +isLayoutRtl : 布局是否从右到左 +fixScrollViewTopping: 修复 ScrollView 置顶问题 +``` + * ### 压缩相关 -> [ZipUtils.java][zip.java] -> [Test][zip.test] ``` zipFiles : 批量压缩文件 @@ -1262,5 +1271,7 @@ getComments : 获取压缩文件中的注释链表 [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 +[view.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java + [zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java [zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md index 230bd18b3c..c735e79090 100644 --- a/lib/utilcode/README.md +++ b/lib/utilcode/README.md @@ -2,10 +2,10 @@ Gradle: ```groovy -implementation 'com.blankj:utilcode:1.25.8' +implementation 'com.blankj:utilcode:1.25.9' // if u use AndroidX, use the following -implementation 'com.blankj:utilcodex:1.25.8' +implementation 'com.blankj:utilcodex:1.25.9' ``` @@ -1069,6 +1069,15 @@ vibrate cancel ``` +* ### About View -> [ViewUtils.java][view.java] +``` +setViewEnabled +runOnUiThread +runOnUiThreadDelayed +isLayoutRtl +fixScrollViewTopping +``` + * ### About Zip -> [ZipUtils.java][zip.java] -> [Test][zip.test] ``` zipFiles @@ -1187,7 +1196,7 @@ getComments [log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt [map.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/MapUtils.java -[map.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/MapUtilsTest.java +[map.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/MapUtilsTest.java [metaData.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java [metaData.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt @@ -1262,5 +1271,7 @@ getComments [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 +[view.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java + [zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java [zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java index 76f7e9a217..489de57a8d 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java @@ -64,7 +64,7 @@ public final class PermissionConstants { permission.RECEIVE_WAP_PUSH, permission.RECEIVE_MMS, }; private static final String[] GROUP_STORAGE = { - permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE + permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE, }; @StringDef({CALENDAR, CAMERA, CONTACTS, LOCATION, MICROPHONE, PHONE, SENSORS, SMS, STORAGE,}) diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java index 67c3c62834..cf6efd6bc6 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java @@ -865,7 +865,7 @@ private static boolean isSpace(final String s) { return true; } - private static final char HEX_DIGITS[] = + private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; private static byte[] hashTemplate(final byte[] data, final String algorithm) { diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java index 4abbfb56d3..0c36f1b4c6 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java @@ -35,7 +35,7 @@ private ConvertUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); } - private static final char hexDigits[] = + private static final char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /** @@ -581,7 +581,7 @@ public static Bitmap view2Bitmap(final View view) { * @return value of px */ public static int dp2px(final float dpValue) { - final float scale = Resources.getSystem().getDisplayMetrics().density; + final float scale = Utils.getApp().getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } @@ -592,7 +592,7 @@ public static int dp2px(final float dpValue) { * @return value of dp */ public static int px2dp(final float pxValue) { - final float scale = Resources.getSystem().getDisplayMetrics().density; + final float scale = Utils.getApp().getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } @@ -603,7 +603,7 @@ public static int px2dp(final float pxValue) { * @return value of px */ public static int sp2px(final float spValue) { - final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity; + final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } @@ -614,7 +614,7 @@ public static int sp2px(final float spValue) { * @return value of sp */ public static int px2sp(final float pxValue) { - final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity; + final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java index 18b5f814a3..8f9e2e2bdc 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java @@ -41,7 +41,7 @@ public final class CrashUtils { private static final String FILE_SEP = System.getProperty("file.separator"); @SuppressLint("SimpleDateFormat") - private static final Format FORMAT = new SimpleDateFormat("MM-dd HH-mm-ss"); + private static final Format FORMAT = new SimpleDateFormat("MM-dd_HH-mm-ss"); private static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER; private static final UncaughtExceptionHandler UNCAUGHT_EXCEPTION_HANDLER; diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java index fdfc398dda..0741d4f3c6 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java @@ -22,6 +22,7 @@ import java.util.UUID; import static android.Manifest.permission.ACCESS_WIFI_STATE; +import static android.Manifest.permission.CHANGE_WIFI_STATE; import static android.Manifest.permission.INTERNET; import static android.content.Context.WIFI_SERVICE; @@ -106,11 +107,12 @@ public static String getAndroidID() { /** * Return the MAC address. *

Must hold {@code }, - * {@code }

+ * {@code }, + * {@code }

* * @return the MAC address */ - @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET}) + @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET, CHANGE_WIFI_STATE}) public static String getMacAddress() { String macAddress = getMacAddress((String[]) null); if (!macAddress.equals("") || getWifiEnabled()) return macAddress; @@ -126,10 +128,18 @@ private static boolean getWifiEnabled() { return manager.isWifiEnabled(); } + /** + * Enable or disable wifi. + *

Must hold {@code }

+ * + * @param enabled True to enabled, false otherwise. + */ + @RequiresPermission(CHANGE_WIFI_STATE) private static void setWifiEnabled(final boolean enabled) { @SuppressLint("WifiManagerLeak") WifiManager manager = (WifiManager) Utils.getApp().getSystemService(WIFI_SERVICE); if (manager == null) return; + if (enabled == manager.isWifiEnabled()) return; manager.setWifiEnabled(enabled); } @@ -372,9 +382,8 @@ public static boolean isEmulator() { /** * Return the unique device id. *
{1}{UUID(macAddress)}
- *
{2}{UUID(deviceId  )}
- *
{3}{UUID(androidId )}
- *
{4}{UUID(random    )}
+ *
{2}{UUID(androidId )}
+ *
{9}{UUID(random    )}
* * @return the unique device id */ @@ -386,9 +395,8 @@ public static String getUniqueDeviceId() { /** * Return the unique device id. *
{prefix}{1}{UUID(macAddress)}
- *
{prefix}{2}{UUID(deviceId  )}
- *
{prefix}{3}{UUID(androidId )}
- *
{prefix}{4}{UUID(random    )}
+ *
{prefix}{2}{UUID(androidId )}
+ *
{prefix}{9}{UUID(random    )}
* * @param prefix The prefix of the unique device id. * @return the unique device id @@ -414,13 +422,8 @@ public static String getUniqueDeviceId(String prefix) { return saveUdid(prefix + 2, androidId); } - final String deviceId = ((TelephonyManager) Utils.getApp().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); - if (!TextUtils.isEmpty(deviceId)) { - return saveUdid(prefix + 3, deviceId); - } - } catch (Exception ignore) {/**/} - return saveUdid(prefix + 4, ""); + return saveUdid(prefix + 9, ""); } } } @@ -448,12 +451,6 @@ public static boolean isSameDevice(final String uniqueDeviceId) { return false; } return uniqueDeviceId.substring(st + 1).equals(getUdid("", androidId)); - } else if (type.startsWith("3")) { - final String deviceId = ((TelephonyManager) Utils.getApp().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); - if (TextUtils.isEmpty(deviceId)) { - return false; - } - return uniqueDeviceId.substring(st + 1).equals(getUdid("", deviceId)); } return false; } diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java index d20ee711ad..d5edd2b2d2 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java @@ -1152,7 +1152,7 @@ private static byte[] joins(final byte[] prefix, final byte[] suffix) { return ret; } - private static final char HEX_DIGITS[] = + private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; private static String bytes2HexString(final byte[] bytes) { diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java index 2610a3a390..44f8987f93 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java @@ -1221,7 +1221,7 @@ public interface OnReplaceListener { // other utils methods /////////////////////////////////////////////////////////////////////////// - private static final char HEX_DIGITS[] = + private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; private static String bytes2HexString(final byte[] bytes) { diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java index 83e01eb1ad..ed79e362b7 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java @@ -1562,7 +1562,7 @@ public static boolean isImage(final String filePath) { * @param filePath The path of file. * @return the type of image */ - public static String getImageType(final String filePath) { + public static ImageType getImageType(final String filePath) { return getImageType(getFileByPath(filePath)); } @@ -1572,12 +1572,12 @@ public static String getImageType(final String filePath) { * @param file The file. * @return the type of image */ - public static String getImageType(final File file) { - if (file == null) return ""; + public static ImageType getImageType(final File file) { + if (file == null) return null; InputStream is = null; try { is = new FileInputStream(file); - String type = getImageType(is); + ImageType type = getImageType(is); if (type != null) { return type; } @@ -1592,36 +1592,57 @@ public static String getImageType(final File file) { e.printStackTrace(); } } - return getFileExtension(file.getAbsolutePath()).toUpperCase(); - } - - private static String getFileExtension(final String filePath) { - if (isSpace(filePath)) return filePath; - int lastPoi = filePath.lastIndexOf('.'); - int lastSep = filePath.lastIndexOf(File.separator); - if (lastPoi == -1 || lastSep >= lastPoi) return ""; - return filePath.substring(lastPoi + 1); + return null; } - private static String getImageType(final InputStream is) { + private static ImageType getImageType(final InputStream is) { if (is == null) return null; try { - byte[] bytes = new byte[8]; - return is.read(bytes, 0, 8) != -1 ? getImageType(bytes) : null; + byte[] bytes = new byte[12]; + return is.read(bytes) != -1 ? getImageType(bytes) : null; } catch (IOException e) { e.printStackTrace(); return null; } } - private static String getImageType(final byte[] bytes) { - if (isJPEG(bytes)) return "JPEG"; - if (isGIF(bytes)) return "GIF"; - if (isPNG(bytes)) return "PNG"; - if (isBMP(bytes)) return "BMP"; - return null; + private static ImageType getImageType(final byte[] bytes) { + String type = bytes2HexString(bytes).toUpperCase(); + if (type.contains("FFD8FF")) { + return ImageType.TYPE_JPG; + } else if (type.contains("89504E47")) { + return ImageType.TYPE_PNG; + } else if (type.contains("47494638")) { + return ImageType.TYPE_GIF; + } else if (type.contains("49492A00") || type.contains("4D4D002A")) { + return ImageType.TYPE_TIFF; + } else if (type.contains("424D")) { + return ImageType.TYPE_BMP; + } else if (type.startsWith("52494646") && type.endsWith("57454250")) {//524946461c57000057454250-12个字节 + return ImageType.TYPE_WEBP; + } else if (type.contains("00000100") || type.contains("00000200")) { + return ImageType.TYPE_ICO; + } else { + return ImageType.TYPE_UNKNOWN; + } } + private static final char[] hexDigits = + {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + private static String bytes2HexString(final byte[] bytes) { + if (bytes == null) return ""; + int len = bytes.length; + if (len <= 0) return ""; + char[] ret = new char[len << 1]; + for (int i = 0, j = 0; i < len; i++) { + ret[j++] = hexDigits[bytes[i] >> 4 & 0x0f]; + ret[j++] = hexDigits[bytes[i] & 0x0f]; + } + return new String(ret); + } + + private static boolean isJPEG(final byte[] b) { return b.length >= 2 && (b[0] == (byte) 0xFF) && (b[1] == (byte) 0xD8); @@ -1982,4 +2003,32 @@ private static byte[] input2Byte(final InputStream is) { } } } + + public enum ImageType { + TYPE_JPG("jpg"), + + TYPE_PNG("png"), + + TYPE_GIF("gif"), + + TYPE_TIFF("tiff"), + + TYPE_BMP("bmp"), + + TYPE_WEBP("webp"), + + TYPE_ICO("ico"), + + TYPE_UNKNOWN("unknown"); + + String value; + + ImageType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } } diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java index 28d79d41f8..a0f5c5a809 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java @@ -108,15 +108,7 @@ public static void hideSoftInput(@NonNull final View view) { InputMethodManager imm = (InputMethodManager) Utils.getApp().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm == null) return; - imm.hideSoftInputFromWindow(view.getWindowToken(), 0, new ResultReceiver(new Handler()) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - if (resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN - || resultCode == InputMethodManager.RESULT_SHOWN) { - toggleSoftInput(); - } - } - }); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } /** diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java index dfbf997cb5..e7f15a2a70 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java @@ -36,10 +36,13 @@ import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.Formatter; import java.util.Iterator; +import java.util.List; import java.util.Locale; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -233,6 +236,21 @@ public void run() { } } + public static List getLogFiles() { + String dir = CONFIG.getDir(); + File logDir = new File(dir); + if (!logDir.exists()) return new ArrayList<>(); + File[] files = logDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return isMatchLogFileName(name); + } + }); + List list = new ArrayList<>(); + Collections.addAll(list, files); + return list; + } + private static TagHead processTagAndHead(String tag) { if (!CONFIG.mTagIsSpace && !CONFIG.isLogHeadSwitch()) { tag = CONFIG.getGlobalTag(); @@ -527,7 +545,7 @@ private static void deleteDueLogs(final String filePath, final String date) { File[] files = parentFile.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { - return name.matches("^" + CONFIG.getFilePrefix() + "_[0-9]{4}_[0-9]{2}_[0-9]{2}_.*$"); + return isMatchLogFileName(name); } }); if (files == null || files.length <= 0) return; @@ -555,6 +573,10 @@ public void run() { } } + private static boolean isMatchLogFileName(String name) { + return name.matches("^" + CONFIG.getFilePrefix() + "_[0-9]{4}_[0-9]{2}_[0-9]{2}_.*$"); + } + private static String findDate(String str) { Pattern pattern = Pattern.compile("[0-9]{4}_[0-9]{2}_[0-9]{2}"); Matcher matcher = pattern.matcher(str); diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java index c71cb07460..42cab85931 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java @@ -1,24 +1,20 @@ package com.blankj.utilcode.util; import android.annotation.SuppressLint; -import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.support.annotation.RequiresPermission; -import android.telephony.SmsManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.List; import static android.Manifest.permission.CALL_PHONE; import static android.Manifest.permission.READ_PHONE_STATE; -import static android.Manifest.permission.SEND_SMS; /** *
@@ -46,6 +42,7 @@ public static boolean isPhone() {
 
     /**
      * Return the unique device id.
+     * 

If the version of SDK is greater than 28, it will return an empty string.

*

Must hold {@code }

* * @return the unique device id @@ -53,6 +50,9 @@ public static boolean isPhone() { @SuppressLint("HardwareIds") @RequiresPermission(READ_PHONE_STATE) public static String getDeviceId() { + if (Build.VERSION.SDK_INT >= 29) { + return ""; + } TelephonyManager tm = getTelephonyManager(); String deviceId = tm.getDeviceId(); if (!TextUtils.isEmpty(deviceId)) return deviceId; @@ -78,6 +78,7 @@ public static String getSerial() { /** * Return the IMEI. + *

If the version of SDK is greater than 28, it will return an empty string.

*

Must hold {@code }

* * @return the IMEI @@ -89,6 +90,7 @@ public static String getIMEI() { /** * Return the MEID. + *

If the version of SDK is greater than 28, it will return an empty string.

*

Must hold {@code }

* * @return the MEID @@ -101,6 +103,9 @@ public static String getMEID() { @SuppressLint("HardwareIds") @RequiresPermission(READ_PHONE_STATE) public static String getImeiOrMeid(boolean isImei) { + if (Build.VERSION.SDK_INT >= 29) { + return ""; + } TelephonyManager tm = getTelephonyManager(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (isImei) { diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java index 7390fceed0..a41a6f2b00 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java @@ -100,7 +100,7 @@ public static int getAppScreenHeight() { * @return the density of screen */ public static float getScreenDensity() { - return Resources.getSystem().getDisplayMetrics().density; + return Utils.getApp().getResources().getDisplayMetrics().density; } /** @@ -109,7 +109,7 @@ public static float getScreenDensity() { * @return the screen density expressed as dots-per-inch */ public static int getScreenDensityDpi() { - return Resources.getSystem().getDisplayMetrics().densityDpi; + return Utils.getApp().getResources().getDisplayMetrics().densityDpi; } /** diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java index 5ef9047e4d..f5e0acf853 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java @@ -27,7 +27,7 @@ private SizeUtils() { * @return value of px */ public static int dp2px(final float dpValue) { - final float scale = Resources.getSystem().getDisplayMetrics().density; + final float scale = Utils.getApp().getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } @@ -38,7 +38,7 @@ public static int dp2px(final float dpValue) { * @return value of dp */ public static int px2dp(final float pxValue) { - final float scale = Resources.getSystem().getDisplayMetrics().density; + final float scale = Utils.getApp().getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } @@ -49,7 +49,7 @@ public static int px2dp(final float pxValue) { * @return value of px */ public static int sp2px(final float spValue) { - final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity; + final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } @@ -60,7 +60,7 @@ public static int sp2px(final float spValue) { * @return value of sp */ public static int px2sp(final float pxValue) { - final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity; + final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } @@ -75,7 +75,7 @@ public static int px2sp(final float pxValue) { * metrics depending on its unit. */ public static float applyDimension(final float value, final int unit) { - DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); + DisplayMetrics metrics = Utils.getApp().getResources().getDisplayMetrics(); switch (unit) { case TypedValue.COMPLEX_UNIT_PX: return value; diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java index 77f9421d3a..fa651b4a49 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java @@ -1,8 +1,12 @@ package com.blankj.utilcode.util; +import android.os.Build; +import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; +import java.util.Locale; + /** *
  *     author: Blankj
@@ -63,9 +67,27 @@ public static void runOnUiThreadDelayed(final Runnable runnable, long delayMilli
     }
 
     /**
-     * 用于解决ScrollView嵌套ListView/GridView/WebView/RecyclerView等无法置顶问题
+     * Return whether horizontal layout direction of views are from Right to Left.
      *
-     * @param view ScrollView嵌套的跟视图
+     * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLayoutRtl() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Locale primaryLocale; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + primaryLocale = Utils.getApp().getResources().getConfiguration().getLocales().get(0); + } else { + primaryLocale = Utils.getApp().getResources().getConfiguration().locale; + } + return TextUtils.getLayoutDirectionFromLocale(primaryLocale) == View.LAYOUT_DIRECTION_RTL; + } + return false; + } + + /** + * Fix the problem of topping the ScrollView nested ListView/GridView/WebView/RecyclerView. + * + * @param view The root view inner of ScrollView. */ public static void fixScrollViewTopping(View view) { view.setFocusable(false); @@ -84,5 +106,4 @@ public static void fixScrollViewTopping(View view) { } } } - } \ No newline at end of file diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/ImageUtilsTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/ImageUtilsTest.java new file mode 100644 index 0000000000..486df32d78 --- /dev/null +++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/ImageUtilsTest.java @@ -0,0 +1,26 @@ +package com.blankj.utilcode.util; + +import org.junit.Assert; +import org.junit.Test; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/08/25
+ *     desc  : test ImageUtils
+ * 
+ */ +public class ImageUtilsTest extends BaseTest { + + @Test + public void getImageType() { + Assert.assertEquals(ImageUtils.ImageType.TYPE_JPG, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.jpg")); + Assert.assertEquals(ImageUtils.ImageType.TYPE_PNG, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.png")); + Assert.assertEquals(ImageUtils.ImageType.TYPE_GIF, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.gif")); + Assert.assertEquals(ImageUtils.ImageType.TYPE_TIFF, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.tif")); + Assert.assertEquals(ImageUtils.ImageType.TYPE_BMP, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.bmp")); + Assert.assertEquals(ImageUtils.ImageType.TYPE_WEBP, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.webp")); + Assert.assertEquals(ImageUtils.ImageType.TYPE_ICO, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.ico")); + } +} diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/TestConfig.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/TestConfig.java index 6ea0c4b48c..4075a1473e 100644 --- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/TestConfig.java +++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/TestConfig.java @@ -32,5 +32,7 @@ public class TestConfig { static final String PATH_FILE = TEST_PATH + "file" + FILE_SEP; + static final String PATH_IMAGE = TEST_PATH + "image" + FILE_SEP; + static final String PATH_ZIP = TEST_PATH + "zip" + FILE_SEP; } diff --git a/lib/utilcode/src/test/res/image/ic_launcher.bmp b/lib/utilcode/src/test/res/image/ic_launcher.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2880951dd963b2c42fd932b1f25b3cbcff942c39 GIT binary patch literal 49208 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

9`}>#wvhW`) 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 SrO?mQLhfDq*lSic^A)z>R>_DIp z31SFv0gdUdpt&?$pS$A+*2~vI)i=>EOC*CY#Ir%H#scfDRXR6m&9|bHwac&n$lOeB zRVzXve6pXRgJ%NI#vWy+|4?=|!F(r5a@w$HRCh24Ot8wM5fR{66tiv-fuSy`wl`Hl zM2%?m!owuT;EIic1R|9A_4x?|6H`jCkpYy3hI&!wuqq1eC}RQQI1A)FwJ<^BQE&?L z)V6^~TTVY;y@f5RFek0Ug5$ z(QPSHmLGE36E%!?lDar%7UM`I)!RhEViSh2_y7R@)sVY2nrp2?CVo^2f$yMQ;5mr*42ltNG(-{l&PoJgkHK6*-eKZ^f2pbPi z;SHC43nhKPj7`oAe1RXTdqg;+YRB1?Ds?GpcpX({g=U}J2Kf851i&}`s;;Qw#d*dG zlEFT4fmD_iV>rQ4-Y(l|m(4Py=Nj}r(SRZM;x`5VAmCF{G6Nyzdq+lJteGY@84#PH zcfQ)>#+y~?T9*>}1?V+?R~skFcZf@fpO z6CL-~;}BU+lpGBQo{`wnIzZKF0+(w6hT0pN+C?vavdS@g4%bB3u=IsVt@&RlC?_H$ z{0^b0^$Zzb2oc&Rs8T@3zgu#WjLD!tBXox|!{l+O)ym@>-9>Jcpp<;jAs^8DF=|9)_b0r_a z7_y*l`w0FQ2>>G4H!Uy5MP=!Bgp>OAEM5*8&_=SUfpos~*{q6a*=CsmcfYB+CPP@zCG>8gbH4o+dz;#iOFFQ2;FWG&o&Fy|!|3>Rc)z zA%SWi25X|p6z^|lnF;!^IB)#&*@M#QtJ4}^$^OM5zFLh3uEHrbVH<2l|I4xLy8SIG0$tYoN--O~YoPaAhTe!+V1xvsXbDwJZaRM?g=M^%Z8`-(}usL9faRVlv zIBgmjRIQPv$^}WrAURn$uKQS`^b*afxMCrat5U9F%CtTar(x1-URehZDxN$e<@IY0 zg9$f4@LLB>(qhezg#kF{g#Zvyd*zpCg~qX@^T&W};8O5l0L?1&Edwn)e_gpqUg#Qk zv#D`IFY3WKkhe&^*-~o)@x?nGO?N;TF&CBeuROomJEO$-QK2l63!C}3U4h<2RNb5F zO2Q62aA?{$BtN1W^yM mgN~z(mGV&4s294L0=6Fa7cCGFRO~Bb^UsYvbt0e+&OiWL)WoI$ literal 0 HcmV?d00001 From 71f7ca0f44ae13c42d6bbaacc1b22d47f77be8ed Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Sun, 25 Aug 2019 18:03:59 +0800 Subject: [PATCH 009/138] see 08/25 log --- .../main/java/com/blankj/utilcode/util/ActivityUtils.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java index c2cbf103f0..e0f82eac09 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java @@ -15,7 +15,6 @@ import android.support.annotation.Nullable; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; import android.support.v4.util.Pair; import android.text.TextUtils; import android.util.Log; @@ -2026,7 +2025,7 @@ private static boolean startActivityForResult(final Intent intent, private static Bundle getOptionsBundle(final Fragment fragment, final int enterAnim, final int exitAnim) { - FragmentActivity activity = fragment.getActivity(); + Activity activity = fragment.getActivity(); if (activity == null) return null; return ActivityOptionsCompat.makeCustomAnimation(activity, enterAnim, exitAnim).toBundle(); } @@ -2039,7 +2038,7 @@ private static Bundle getOptionsBundle(final Context context, private static Bundle getOptionsBundle(final Fragment fragment, final View[] sharedElements) { - FragmentActivity activity = fragment.getActivity(); + Activity activity = fragment.getActivity(); if (activity == null) return null; return getOptionsBundle(activity, sharedElements); } From 29d14c8815fc76de38bb223dda201abd0462f751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=83=E5=85=B0=E6=9F=AF=E5=9F=BA?= <625783482@qq.com> Date: Thu, 29 Aug 2019 15:04:06 +0800 Subject: [PATCH 010/138] Update android.yml --- .github/workflows/android.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/android.yml diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000000..3071e5de4e --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,17 @@ +name: Android CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Gradle + run: ./gradlew build From 2ca2c828317dfadc6aea8ff03fc05bc8453194bb Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Fri, 27 Sep 2019 11:36:27 +0800 Subject: [PATCH 011/138] see 09/27 log --- CHANGELOG.md | 4 +- build.gradle | 3 + buildApp.gradle | 2 +- buildSrc/src/main/groovy/Config.groovy | 9 +- .../launcher/app/src/main/AndroidManifest.xml | 1 - feature/main/pkg/src/main/AndroidManifest.xml | 1 - .../utilcode/pkg/src/main/AndroidManifest.xml | 76 +-- .../pkg/feature/activity/ActivityActivity.kt | 11 +- .../feature/activity/SubActivityActivity.kt | 15 +- .../utilcode/pkg/feature/bus/BusActivity.kt | 5 - .../pkg/feature/bus/PusNotifyData.java | 34 - .../pkg/feature/click/ClickActivity.kt | 4 +- .../pkg/feature/image/ImageActivity.kt | 3 - .../feature/permission/PermissionActivity.kt | 4 + .../pkg/feature/reflect/ReflectActivity.kt | 13 +- .../reflect/TestPrivateStaticFinal.java | 13 + .../pkg/feature/spStatic/SPStaticActivity.kt | 2 + .../src/main/res/layout/activity_spstatic.xml | 7 + .../pkg/src/main/res/values/strings.xml | 1 + lib/base/build.gradle | 1 + .../java/com/blankj/base/BaseActivity.java | 2 +- .../java/com/blankj/base/BaseApplication.java | 3 + .../main/res/drawable/base_sel_button_bg.xml | 4 +- .../blankj/subutil/util/ClipboardUtils.java | 6 - .../blankj/subutil/util/DangerousUtils.java | 1 - .../blankj/subutil/util/LocationUtils.java | 3 - .../blankj/subutil/util/http/HttpUtils.java | 2 +- lib/utilcode/README-CN.md | 39 +- lib/utilcode/README.md | 25 +- lib/utilcode/src/main/AndroidManifest.xml | 2 +- .../com/blankj/utilcode/util/AppUtils.java | 29 +- .../com/blankj/utilcode/util/ClickUtils.java | 284 +++++++- .../blankj/utilcode/util/ConvertUtils.java | 34 +- .../com/blankj/utilcode/util/DialogUtils.java | 130 ++++ .../com/blankj/utilcode/util/FileUtils.java | 303 ++++----- .../com/blankj/utilcode/util/ImageUtils.java | 59 +- .../blankj/utilcode/util/MessengerUtils.java | 1 - .../blankj/utilcode/util/PermissionUtils.java | 91 +-- .../blankj/utilcode/util/ProcessUtils.java | 5 - .../blankj/utilcode/util/ReflectUtils.java | 1 + .../blankj/utilcode/util/ResourceUtils.java | 17 +- .../com/blankj/utilcode/util/ScreenUtils.java | 11 + .../blankj/utilcode/util/ServiceUtils.java | 8 +- .../com/blankj/utilcode/util/ShadowUtils.java | 224 +++++++ .../com/blankj/utilcode/util/SizeUtils.java | 16 +- .../com/blankj/utilcode/util/ToastUtils.java | 1 - .../com/blankj/utilcode/util/UriUtils.java | 17 +- .../java/com/blankj/utilcode/util/Utils.java | 206 +++++- .../com/blankj/utilcode/util/BaseTest.java | 5 +- .../util/CacheDiskStaticUtilsTest.java | 4 +- .../utilcode/util/CacheDiskUtilsTest.java | 8 +- .../util/CacheDoubleStaticUtilsTest.java | 2 +- .../utilcode/util/CacheDoubleUtilsTest.java | 2 +- .../blankj/utilcode/util/FileUtilsTest.java | 46 +- lib/utildebug/build.gradle | 2 + lib/utildebug/src/main/AndroidManifest.xml | 6 +- .../java/com/blankj/utildebug/DebugUtils.java | 116 ++++ .../base/drawable/PolygonDrawable.java | 68 ++ .../utildebug/base/drawable/ShadowUtils.java | 614 ++++++++++++++++++ .../blankj/utildebug/base/rv/BaseItem.java | 91 +++ .../utildebug/base/rv/BaseItemAdapter.java | 260 ++++++++ .../utildebug/base/rv/ItemViewHolder.java | 41 ++ .../utildebug/base/rv/RecycleViewDivider.java | 138 ++++ .../base/view/BaseContentFloatView.java | 321 +++++++++ .../utildebug/base/view/BaseContentView.java | 85 +++ .../utildebug/base/view/BaseFloatView.java | 114 ++++ .../base/view/EmptyGoneTextView.java | 40 ++ .../utildebug/base/view/FloatEditText.java | 72 ++ .../utildebug/base/view/FloatToast.java | 134 ++++ .../utildebug/base/view/FloatViewManager.java | 46 ++ .../utildebug/base/view/SearchEditText.java | 75 +++ .../utildebug/base/view/SwipeRightMenu.java | 346 ++++++++++ .../base/view/listener/OnBackListener.java | 13 + .../base/view/listener/OnRefreshListener.java | 15 + .../blankj/utildebug/config/DebugConfig.java | 74 +++ .../com/blankj/utildebug/debug/IDebug.java | 44 ++ .../utildebug/debug/tool/AbsToolDebug.java | 38 ++ .../debug/tool/appInfo/AppInfoDebug.java | 43 ++ .../debug/tool/appInfo/AppInfoFloatView.java | 42 ++ .../debug/tool/appInfo/AppInfoItem.java | 84 +++ .../tool/clearCache/ClearCacheDebug.java | 97 +++ .../tool/clearStorage/ClearStorageDebug.java | 40 ++ .../tool/deviceInfo/DeviceInfoDebug.java | 40 ++ .../tool/deviceInfo/DeviceInfoFloatView.java | 52 ++ .../debug/tool/deviceInfo/DeviceInfoItem.java | 94 +++ .../tool/fileExplorer/FileContentView.java | 90 +++ .../tool/fileExplorer/FileExplorerDebug.java | 40 ++ .../fileExplorer/FileExplorerFloatView.java | 30 + .../debug/tool/fileExplorer/FileItem.java | 191 ++++++ .../tool/fileExplorer/image/ImageViewer.java | 43 ++ .../debug/tool/fileExplorer/sp/SpItem.java | 141 ++++ .../fileExplorer/sp/SpModifyContentView.java | 88 +++ .../fileExplorer/sp/SpViewerContentView.java | 90 +++ .../tool/fileExplorer/text/TextViewer.java | 14 + .../debug/tool/logcat/LogcatDebug.java | 38 ++ .../tool/restartApp/RestartAppDebug.java | 39 ++ .../blankj/utildebug/helper/FileHelper.java | 57 ++ .../blankj/utildebug/helper/ImageLoader.java | 45 ++ .../blankj/utildebug/helper/ShadowHelper.java | 42 ++ .../com/blankj/utildebug/helper/SpHelper.java | 75 +++ .../blankj/utildebug/helper/TouchHelper.java | 220 +++++++ .../blankj/utildebug/helper/WindowHelper.java | 48 ++ .../com/blankj/utildebug/icon/DebugIcon.java | 115 ++++ .../com/blankj/utildebug/menu/DebugItem.java | 77 +++ .../com/blankj/utildebug/menu/DebugMenu.java | 74 +++ .../blankj/utildebug/menu/DebugMenuItem.java | 87 +++ .../blankj/utildebug/menu/ReminderView.java | 43 ++ lib/utildebug/src/main/res/anim/float_in.xml | 18 + lib/utildebug/src/main/res/anim/float_out.xml | 18 + .../du_ic_debug_app_info_default.png | Bin 0 -> 1149 bytes .../du_ic_debug_clear_cache.png | Bin 0 -> 1417 bytes .../du_ic_debug_clear_storage.png | Bin 0 -> 777 bytes .../du_ic_debug_device_info.png | Bin 0 -> 565 bytes .../du_ic_debug_file_explorer.png | Bin 0 -> 649 bytes .../drawable-xxhdpi/du_ic_debug_logcat.png | Bin 0 -> 15726 bytes .../du_ic_debug_restart_app.png | Bin 0 -> 1691 bytes .../drawable-xxhdpi/du_ic_icon_default.png | Bin 0 -> 2793 bytes .../du_ic_item_file_default.png | Bin 0 -> 16747 bytes .../drawable-xxhdpi/du_ic_item_file_sp.png | Bin 0 -> 17026 bytes .../drawable-xxhdpi/du_ic_item_file_utf8.png | Bin 0 -> 16997 bytes .../res/drawable-xxhdpi/du_ic_item_go.png | Bin 0 -> 706 bytes .../res/drawable-xxhdpi/du_ic_reminder.png | Bin 0 -> 3216 bytes .../res/drawable-xxhdpi/du_ic_swipe_back.png | Bin 0 -> 745 bytes .../drawable-xxhdpi/du_ic_swipe_refresh.png | Bin 0 -> 1284 bytes .../du_ic_title_bar_adjustable.png | Bin 0 -> 15258 bytes .../drawable-xxhdpi/du_ic_title_bar_close.png | Bin 0 -> 278 bytes .../res/drawable-xxhdpi/du_ic_toast_error.png | Bin 0 -> 1630 bytes .../drawable-xxhdpi/du_ic_toast_success.png | Bin 0 -> 1362 bytes .../res/drawable-xxhdpi/du_ic_toast_warn.png | Bin 0 -> 1376 bytes .../main/res/drawable/du_rotate_refresh.xml | 8 + .../src/main/res/drawable/du_sel_et_bg.xml | 16 + .../res/drawable/du_shape_base_float_bg.xml | 5 + .../du_shape_base_float_title_adjust_bg.xml | 6 + .../drawable/du_shape_base_float_title_bg.xml | 7 + .../du_shape_base_float_title_close_bg.xml | 6 + .../src/main/res/drawable/du_shape_btn.xml | 6 + .../main/res/drawable/du_shape_divider.xml | 6 + .../res/drawable/du_shape_file_divider.xml | 9 + .../main/res/drawable/du_shape_input_bg.xml | 6 + .../res/drawable/du_shape_item_menu_bg.xml | 5 + .../res/drawable/du_shape_positive_btn.xml | 6 + .../src/main/res/drawable/du_shape_shadow.xml | 7 + .../src/main/res/drawable/du_shape_toast.xml | 6 + .../src/main/res/drawable/du_switch_thumb.xml | 11 + .../src/main/res/drawable/du_switch_track.xml | 17 + .../main/res/layout/du_base_content_float.xml | 80 +++ .../src/main/res/layout/du_debug_app_info.xml | 6 + .../main/res/layout/du_debug_device_info.xml | 6 + .../res/layout/du_debug_file_explorer.xml | 26 + .../layout/du_debug_file_explorer_image.xml | 12 + .../res/layout/du_debug_file_explorer_sp.xml | 39 ++ .../du_debug_file_explorer_sp_modify.xml | 66 ++ .../src/main/res/layout/du_debug_icon.xml | 10 + .../src/main/res/layout/du_debug_menu.xml | 6 + .../src/main/res/layout/du_float_toast.xml | 29 + .../src/main/res/layout/du_item_base_info.xml | 54 ++ .../src/main/res/layout/du_item_empty.xml | 14 + .../src/main/res/layout/du_item_file.xml | 66 ++ .../src/main/res/layout/du_item_menu.xml | 33 + .../src/main/res/layout/du_item_menu_item.xml | 28 + .../src/main/res/layout/du_item_sp.xml | 69 ++ .../src/main/res/layout/du_reminder_view.xml | 34 + .../src/main/res/values-zh-rCN/strings.xml | 57 ++ lib/utildebug/src/main/res/values/colors.xml | 62 ++ lib/utildebug/src/main/res/values/dimens.xml | 9 + lib/utildebug/src/main/res/values/ids.xml | 5 + lib/utildebug/src/main/res/values/strings.xml | 54 ++ lib/utildebug/src/main/res/values/styles.xml | 38 ++ .../src/main/res/values/values-cardview.xml | 54 ++ 169 files changed, 7226 insertions(+), 526 deletions(-) delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/PusNotifyData.java create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java create mode 100644 lib/utilcode/src/main/java/com/blankj/utilcode/util/DialogUtils.java create mode 100644 lib/utilcode/src/main/java/com/blankj/utilcode/util/ShadowUtils.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/DebugUtils.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/drawable/PolygonDrawable.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/drawable/ShadowUtils.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/ItemViewHolder.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/RecycleViewDivider.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/EmptyGoneTextView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatToast.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/SearchEditText.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/SwipeRightMenu.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/listener/OnBackListener.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/base/view/listener/OnRefreshListener.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/IDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/AbsToolDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoFloatView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/clearCache/ClearCacheDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/clearStorage/ClearStorageDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoFloatView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileExplorerDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileExplorerFloatView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/image/ImageViewer.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpModifyContentView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpViewerContentView.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/text/TextViewer.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/logcat/LogcatDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/restartApp/RestartAppDebug.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/helper/ImageLoader.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/helper/SpHelper.java create mode 100755 lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenuItem.java create mode 100644 lib/utildebug/src/main/java/com/blankj/utildebug/menu/ReminderView.java create mode 100755 lib/utildebug/src/main/res/anim/float_in.xml create mode 100755 lib/utildebug/src/main/res/anim/float_out.xml create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_app_info_default.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_clear_cache.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_clear_storage.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_device_info.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_file_explorer.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_logcat.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_debug_restart_app.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_icon_default.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_item_file_default.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_item_file_sp.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_item_file_utf8.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_item_go.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_reminder.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_swipe_back.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_swipe_refresh.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_title_bar_adjustable.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_title_bar_close.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_toast_error.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_toast_success.png create mode 100644 lib/utildebug/src/main/res/drawable-xxhdpi/du_ic_toast_warn.png create mode 100644 lib/utildebug/src/main/res/drawable/du_rotate_refresh.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_sel_et_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_base_float_title_adjust_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_base_float_title_close_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_btn.xml create mode 100755 lib/utildebug/src/main/res/drawable/du_shape_divider.xml create mode 100755 lib/utildebug/src/main/res/drawable/du_shape_file_divider.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_input_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_item_menu_bg.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_positive_btn.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_shadow.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_shape_toast.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_switch_thumb.xml create mode 100644 lib/utildebug/src/main/res/drawable/du_switch_track.xml create mode 100644 lib/utildebug/src/main/res/layout/du_base_content_float.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_app_info.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_device_info.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_file_explorer.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_file_explorer_image.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_file_explorer_sp.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_file_explorer_sp_modify.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_icon.xml create mode 100644 lib/utildebug/src/main/res/layout/du_debug_menu.xml create mode 100644 lib/utildebug/src/main/res/layout/du_float_toast.xml create mode 100644 lib/utildebug/src/main/res/layout/du_item_base_info.xml create mode 100644 lib/utildebug/src/main/res/layout/du_item_empty.xml create mode 100644 lib/utildebug/src/main/res/layout/du_item_file.xml create mode 100644 lib/utildebug/src/main/res/layout/du_item_menu.xml create mode 100644 lib/utildebug/src/main/res/layout/du_item_menu_item.xml create mode 100644 lib/utildebug/src/main/res/layout/du_item_sp.xml create mode 100644 lib/utildebug/src/main/res/layout/du_reminder_view.xml create mode 100644 lib/utildebug/src/main/res/values-zh-rCN/strings.xml create mode 100644 lib/utildebug/src/main/res/values/colors.xml create mode 100644 lib/utildebug/src/main/res/values/dimens.xml create mode 100644 lib/utildebug/src/main/res/values/ids.xml create mode 100644 lib/utildebug/src/main/res/values/styles.xml create mode 100644 lib/utildebug/src/main/res/values/values-cardview.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 99103073e6..fde5dc6305 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ -* `19/08/25` [upd] ImageUtils#getImageType. [add] LogUtils# Publish v1.25.9. +* `19/08/27` [add] DebugUtils. +* `19/08/26` [fix] PermissionUtils NPE. +* `19/08/25` [upd] ImageUtils#getImageType. [add] LogUtils#getLogFiles. Publish v1.25.9. * `19/08/24` [fix] PhoneUtils#getIMEI crash on SDK 29. * `19/08/23` [add] ViewUtils#isLayoutRtl. * `19/08/22` [add] LogUtils#getLogFiles. diff --git a/build.gradle b/build.gradle index f03d8e43b9..1a9f672d5a 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,9 @@ allprojects { url 'https://maven.aliyun.com/repository/google' name 'replace google()' } + maven { + url "https://jitpack.io" + } google() jcenter() } diff --git a/buildApp.gradle b/buildApp.gradle index 9a24f2e23c..beb59b4a42 100644 --- a/buildApp.gradle +++ b/buildApp.gradle @@ -16,7 +16,7 @@ configApkName() android { compileSdkVersion Config.compileSdkVersion defaultConfig { - minSdkVersion 16 + minSdkVersion Config.minSdkVersion versionCode Config.versionCode versionName Config.versionName applicationId Config.applicationId + suffix diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index 4335dca9b0..a190b4f409 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -12,10 +12,10 @@ class Config { static appName = 'Util' static compileSdkVersion = 28 - static minSdkVersion = 14 + static minSdkVersion = 16 static targetSdkVersion = 28 - static versionCode = 1_025_009 - static versionName = '1.25.9'// E.g. 1.9.72 => 1,009,072 + static versionCode = 1_025_010 + static versionName = '1.25.10-alpha3'// E.g. 1.9.72 => 1,009,072 // lib version static kotlin_version = '1.3.10' @@ -94,7 +94,7 @@ class Config { ], free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"), - swipe_panel : new DepConfig("com.blankj:swipe-panel:1.1"), + swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), gson : new DepConfig("com.google.code.gson:gson:2.8.2"), glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"), @@ -104,6 +104,7 @@ class Config { lib : new DepConfig("org.greenrobot:eventbus:3.1.1"), processor: new DepConfig("org.greenrobot:eventbus-annotation-processor:3.0.1") ], + photo_view : new DepConfig("com.github.chrisbanes:PhotoView:2.0.0"), test : [ junit : new DepConfig("junit:junit:4.12"), diff --git a/feature/launcher/app/src/main/AndroidManifest.xml b/feature/launcher/app/src/main/AndroidManifest.xml index 6dcd3ec787..b683051e68 100644 --- a/feature/launcher/app/src/main/AndroidManifest.xml +++ b/feature/launcher/app/src/main/AndroidManifest.xml @@ -12,7 +12,6 @@ diff --git a/feature/main/pkg/src/main/AndroidManifest.xml b/feature/main/pkg/src/main/AndroidManifest.xml index ef0cc7c15a..5edb00cecb 100644 --- a/feature/main/pkg/src/main/AndroidManifest.xml +++ b/feature/main/pkg/src/main/AndroidManifest.xml @@ -5,7 +5,6 @@ diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml index 26f28c9a8f..23a299de22 100644 --- a/feature/utilcode/pkg/src/main/AndroidManifest.xml +++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml @@ -1,6 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt index efec7a0abc..bd7e544ad3 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt @@ -14,6 +14,7 @@ import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.feature.CoreUtilActivity import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.AppUtils +import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.SpanUtils import kotlinx.android.synthetic.main.activity_activity.* import java.util.* @@ -166,7 +167,10 @@ class ActivityActivity : CommonTitleActivity() { R.id.activityStartLauncherActivityBtn -> ActivityUtils.startLauncherActivity() R.id.activityFinishActivityBtn -> ActivityUtils.finishActivity(CoreUtilActivity::class.java) R.id.activityFinishToActivityBtn -> ActivityUtils.finishToActivity(CoreUtilActivity::class.java, false, true) - R.id.activityFinishAllActivitiesBtn -> ActivityUtils.finishAllActivities() + R.id.activityFinishAllActivitiesBtn -> { +// ActivityUtils.finishAllActivities() + ActivityUtils.startActivityForResult(Bundle(), this, SubActivityActivity::class.java, 10) + } } } @@ -197,4 +201,9 @@ class ActivityActivity : CommonTitleActivity() { else -> return null } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + LogUtils.e(requestCode, resultCode, data) + } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt index 0d2bc4bf45..b20ed2e2ac 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt @@ -1,13 +1,16 @@ package com.blankj.utilcode.pkg.feature.activity +import android.app.Activity +import android.content.Intent import android.os.Build import android.os.Bundle import android.support.v4.app.ActivityCompat import android.view.View import android.view.Window import com.blankj.common.CommonTitleActivity -import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.ColorUtils +import kotlinx.android.synthetic.main.activity_activity_sub.* + /** * ``` @@ -25,15 +28,21 @@ class SubActivityActivity : CommonTitleActivity() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) } - return R.layout.activity_activity_sub + return com.blankj.utilcode.pkg.R.layout.activity_activity_sub } override fun bindTitle(): String { - return getString(R.string.demo_activity) + return getString(com.blankj.utilcode.pkg.R.string.demo_activity) } override fun initView(savedInstanceState: Bundle?, contentView: View?) { contentView?.setBackgroundColor(ColorUtils.getRandomColor(false)) + activityViewSharedElement.setOnClickListener(View.OnClickListener { + val result = Intent() + result.putExtra("data", "data") + this@SubActivityActivity.setResult(Activity.RESULT_OK, result) + this@SubActivityActivity.finish() + }) } override fun doBusiness() {} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt index 06623c179d..0c968277db 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt @@ -55,11 +55,6 @@ class BusActivity : CommonTitleActivity() { }) } - @BusUtils.Bus(tag = "_PusNotifyData", sticky = true, threadMode = BusUtils.ThreadMode.MAIN) - fun onPusNotifyData(pusNotifyData: PusNotifyData) { - LogUtils.e("haha") - } - companion object { const val TAG_BASIC_TYPE = "tag_basic_type" const val TAG_BUS = "tag_bus" diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/PusNotifyData.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/PusNotifyData.java deleted file mode 100644 index 5a8fa1692a..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/PusNotifyData.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bus; - -import java.io.Serializable; - -/** - *

- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/08/08
- *     desc  :
- * 
- */ -public class PusNotifyData implements Serializable { - - private String pushType; - private String pushID; - - public String getPushType() { - return pushType; - } - - public void setPushType(String pushType) { - this.pushType = pushType; - } - - public String getPushID() { - return pushID; - } - - public void setPushID(String pushID) { - this.pushID = pushID; - } - -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt index fa9e372df2..ea23ca3758 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt @@ -45,8 +45,8 @@ class ClickActivity : CommonTitleActivity() { clickMultiBtn ) - ClickUtils.applyScale(clickScaleDefaultBtn) - ClickUtils.applyScale(arrayOf(clickScaleCustomBtn), floatArrayOf(-0.5f)) + ClickUtils.applyPressedViewScale(clickScaleDefaultBtn) + ClickUtils.applyPressedViewScale(arrayOf(clickScaleCustomBtn), floatArrayOf(-0.5f)) ClickUtils.applySingleDebouncing(clickSingleDebouncingBtn, 5000) { SnackbarUtils.with(mContentView) .setMessage(StringUtils.getString(R.string.click_single_tip)) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt index 2f2abef58e..9e6995fe48 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt @@ -73,15 +73,12 @@ class ImageActivity : CommonTaskActivity>() { } add(ImageCell(R.string.image_stack_blur, ImageUtils.stackBlur(src, 10))) add(ImageCell(R.string.image_compress_by_scale, ImageUtils.compressByScale(src, 0.5f, 0.5f))) - add(ImageCell(R.string.image_compress_by_quality_half, ImageUtils.compressByQuality(src, 50))) - add(ImageCell(R.string.image_compress_by_quality_max_size, ImageUtils.compressByQuality(src, 10L * 1024)))// 10Kb add(ImageCell(R.string.image_compress_by_sample_size, ImageUtils.compressBySampleSize(src, 2))) } } override fun runOnUiThread(data: List) { val imageAdapter = BaseItemAdapter() - imageAdapter.setHasStableIds(true) imageAdapter.items = data imageRv.adapter = imageAdapter imageRv.layoutManager = LinearLayoutManager(this@ImageActivity) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt index 4c18223701..ff6a42939f 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt @@ -94,6 +94,7 @@ class PermissionActivity : CommonTitleActivity() { return } requestCalendar() + ToastUtils.showLong("Calendar Denied") } }) .theme { activity -> ScreenUtils.setFullScreen(activity) } @@ -117,6 +118,7 @@ class PermissionActivity : CommonTitleActivity() { return } requestRecordAudio() + ToastUtils.showLong("RecordAudio Denied") } }) .request() @@ -139,6 +141,7 @@ class PermissionActivity : CommonTitleActivity() { return } requestCalendarAndRecordAudio() + ToastUtils.showLong("Calendar or RecordAudio Denied") } }) .request() @@ -184,5 +187,6 @@ class PermissionActivity : CommonTitleActivity() { appendLine("DRAW_OVERLAYS: " + PermissionUtils.isGrantedDrawOverlays()) } } + .create() } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt index 72a5cc3ee0..654d6df729 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/ReflectActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.View import com.blankj.common.CommonTitleActivity import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.ReflectUtils import com.blankj.utilcode.util.SpanUtils import kotlinx.android.synthetic.main.activity_reflect.* @@ -38,10 +39,12 @@ class ReflectActivity : CommonTitleActivity() { } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + LogUtils.e(TestPrivateStaticFinal.STR) SpanUtils.with(reflectAboutTv) - .appendLine("before reflect: " + ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("I1").get()) - .append("after reflect: " + ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("I1", 2).field("I1").get()) + .appendLine("before reflect: " + ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("STR").get()) + .append("after reflect: " + ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("STR", "reflect success").field("STR").get()) .create() + LogUtils.e(TestPrivateStaticFinal.STR) } override fun doBusiness() {} @@ -49,11 +52,7 @@ class ReflectActivity : CommonTitleActivity() { override fun onDebouncingClick(view: View) {} override fun onDestroy() { - ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("I1", 1) +// ReflectUtils.reflect(TestPrivateStaticFinal::class.java).field("STR", "str") super.onDestroy() } } - -object TestPrivateStaticFinal { - val I1 = 1 -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java new file mode 100644 index 0000000000..33c921b6bc --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java @@ -0,0 +1,13 @@ +package com.blankj.utilcode.pkg.feature.reflect; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/09/09
+ *     desc  :
+ * 
+ */ +public class TestPrivateStaticFinal { + public static final String STR = "str"; +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt index 85b0f6f7be..2a51965c81 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/spStatic/SPStaticActivity.kt @@ -55,6 +55,7 @@ class SPStaticActivity : CommonTitleActivity() { spStaticPutLongBtn, spPutFloatBtn, spStaticPutBooleanBtn, + spStaticPutStringSetBtn, spStaticClearBtn ) } @@ -70,6 +71,7 @@ class SPStaticActivity : CommonTitleActivity() { R.id.spStaticPutLongBtn -> SPStaticUtils.put("LONG", java.lang.Long.MAX_VALUE) R.id.spPutFloatBtn -> SPStaticUtils.put("FLOAT", Math.PI.toFloat()) R.id.spStaticPutBooleanBtn -> SPStaticUtils.put("BOOLEAN", true) + R.id.spStaticPutStringSetBtn -> SPStaticUtils.put("SET", setOf("1", "2")) R.id.spStaticClearBtn -> SPStaticUtils.clear() } updateAboutSp() diff --git a/feature/utilcode/pkg/src/main/res/layout/activity_spstatic.xml b/feature/utilcode/pkg/src/main/res/layout/activity_spstatic.xml index 52f68eaf27..8272e5b42a 100644 --- a/feature/utilcode/pkg/src/main/res/layout/activity_spstatic.xml +++ b/feature/utilcode/pkg/src/main/res/layout/activity_spstatic.xml @@ -50,6 +50,13 @@ android:layout_height="wrap_content" android:text="@string/sp_put_boolean" /> +
*/ -public abstract class BaseItem> { +public abstract class BaseItem { private static final SparseIntArray LAYOUT_SPARSE_ARRAY = new SparseIntArray(); private static final SparseArray VIEW_SPARSE_ARRAY = new SparseArray<>(); @@ -80,12 +80,12 @@ private int getViewTypeByView(@NonNull View view) { } public void update() { - int index = getIndex(); - if (index == -1) return; - getAdapter().notifyItemChanged(index); + //noinspection unchecked + getAdapter().updateItem((T) this); } public int getIndex() { + //noinspection SuspiciousMethodCalls return getAdapter().getItems().indexOf(this); } } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java index 0a86944237..85d6b62cab 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java @@ -17,9 +17,9 @@ * desc : *
*/ -public class BaseItemAdapter> extends RecyclerView.Adapter { +public class BaseItemAdapter extends RecyclerView.Adapter { - public List mItems; + public List mItems; private RecyclerView mRecyclerView; public BaseItemAdapter() { @@ -150,6 +150,17 @@ public int removeItemById(final long id, boolean notifyRemoved) { // operate /////////////////////////////////////////////////////////////////////////// + public void updateItem(@NonNull final Item item) { + int itemIndex = mItems.indexOf(item); + if (itemIndex != -1) { + notifyItemChanged(itemIndex); + } + } + + public void updateItem(@IntRange(from = 0) final int index) { + notifyItemChanged(index); + } + public void addItem(@NonNull final Item item) { addItem(item, false); } @@ -210,10 +221,10 @@ public boolean replaceItems(@NonNull final List items) { return replaceItems(items, false); } - public boolean replaceItems(@NonNull final List items, boolean notifyDataSetChanged) { + public boolean replaceItems(@NonNull final List items, boolean notifyChanged) { mItems.clear(); boolean added = mItems.addAll(items); - if (notifyDataSetChanged) notifyDataSetChanged(); + if (notifyChanged) notifyDataSetChanged(); return added; } @@ -227,12 +238,12 @@ public Item removeItem(@IntRange(from = 0) final int index, boolean notifyRemove return removedItem; } - public int removeItem(@NonNull final Item object) { - return removeItem(object, false); + public int removeItem(@NonNull final Item item) { + return removeItem(item, false); } - public int removeItem(@NonNull final Item object, boolean notifyRemoved) { - int itemIndex = mItems.indexOf(object); + public int removeItem(@NonNull final Item item, boolean notifyRemoved) { + int itemIndex = mItems.indexOf(item); if (itemIndex != -1) { mItems.remove(itemIndex); if (notifyRemoved) notifyItemRemoved(itemIndex); diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java index bf61920d29..c1d956eb40 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java @@ -1,5 +1,6 @@ package com.blankj.utildebug.base.view; +import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.support.annotation.LayoutRes; import android.support.annotation.StringRes; @@ -9,6 +10,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -16,11 +18,11 @@ import com.blankj.utilcode.util.ClickUtils; import com.blankj.utilcode.util.SizeUtils; import com.blankj.utilcode.util.StringUtils; +import com.blankj.utilcode.util.TouchUtils; import com.blankj.utildebug.R; -import com.blankj.utildebug.base.drawable.ShadowUtils; import com.blankj.utildebug.base.view.listener.OnRefreshListener; import com.blankj.utildebug.config.DebugConfig; -import com.blankj.utildebug.helper.TouchHelper; +import com.blankj.utildebug.helper.ShadowHelper; import com.blankj.utildebug.helper.WindowHelper; import java.util.Stack; @@ -37,6 +39,7 @@ public abstract class BaseContentFloatView> ex private static final int ROTATE_DELAY = 30; + private LinearLayout bcfRootLayout; private RelativeLayout bcfTitleRl; private ImageView bcfCloseIv; private TextView bcfTitleTv; @@ -44,7 +47,6 @@ public abstract class BaseContentFloatView> ex private SwipePanel swipePanel; private BaseContentView mContentView; - private int mTitleBarHeight; private OnRefreshListener mRefreshListener; private Runnable mRotateRunnable = new Runnable() { @Override @@ -74,10 +76,11 @@ public int bindLayout() { } public BaseContentFloatView() { + bcfRootLayout = findViewById(R.id.bcfRootLayout); + ShadowHelper.applyFloatView(bcfRootLayout); + initTitleBar(); initSwipePanel(); - View bcfRootLl = findViewById(R.id.bcfRootLl); - ShadowUtils.apply(bcfRootLl, new ShadowUtils.Builder().setShadowRadius(SizeUtils.dp2px(8))); if (bindContentLayout() != NO_ID) { //noinspection unchecked @@ -92,20 +95,6 @@ public void onAttach() { } }.attach((T) this, true); } - - if (mLayoutParams.height == WindowManager.LayoutParams.WRAP_CONTENT) { - post(new Runnable() { - @Override - public void run() { - int contentHeight = 0; - if (mContentView != null) { - contentHeight = mContentView.getHeight(); - } - mLayoutParams.height = contentHeight + bcfTitleRl.getHeight() + SizeUtils.dp2px(8 + 8 + 4); - WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); - } - }); - } } public void setTitle(CharSequence title) { @@ -165,9 +154,9 @@ public BaseContentView getContentView() { @Override protected void onDetachedFromWindow() { - DebugConfig.saveFloatViewY(this, mLayoutParams.y); - DebugConfig.saveFloatViewHeight(this, mLayoutParams.height); - DebugConfig.saveFloatViewAlpha(this, mLayoutParams.alpha); + DebugConfig.saveViewY(this, mLayoutParams.y); + DebugConfig.saveViewHeight(this, mLayoutParams.height); + DebugConfig.saveViewAlpha(this, mLayoutParams.alpha); super.onDetachedFromWindow(); } @@ -188,23 +177,15 @@ private void initTitleBar() { bcfTitleTv = findViewById(R.id.bcfTitleTv); bcfAdjustIv = findViewById(R.id.bcfAdjustIv); - bcfCloseIv.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - dismiss(); - } - }); - ClickUtils.applyPressedBgDark(bcfTitleRl); - ClickUtils.applyPressedBgDark(bcfCloseIv, 0.8f); - ClickUtils.applyPressedBgDark(bcfAdjustIv, 0.8f); - bcfTitleTv.setText(bindTitle()); + ClickUtils.applyPressedBgDark(bcfTitleRl); bcfTitleRl.setOnClickListener(new ClickUtils.OnMultiClickListener(2) { @Override public void onTriggerClick(View v) { mLayoutParams.alpha = mLayoutParams.alpha == 0.5f ? 1f : 0.5f; WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + DebugConfig.saveViewAlpha(BaseContentFloatView.this, mLayoutParams.alpha); } @Override @@ -214,53 +195,76 @@ public void onBeforeTriggerClick(View v, int count) { } } }); - TouchHelper.applyDrag(bcfTitleRl, new TouchHelper.OnDragListener() { + TouchUtils.setOnTouchListener(bcfTitleRl, new TouchUtils.OnTouchUtilsListener() { @Override - public void onDown(View v, int x, int y, MotionEvent event) { + public boolean onDown(View view, int x, int y, MotionEvent event) { + return true; } @Override - public void onMove(View view, int x, int y, int dx, int dy, MotionEvent event) { -// bcfTitleTv.setText("(" + mLayoutParams.x + ", " + mLayoutParams.y + ")" + mLayoutParams.height); - mLayoutParams.y = Math.min(Math.max(mLayoutParams.y - dy, 0), WindowHelper.getAppWindowHeight() - getWindowHeight()); + public boolean onMove(View view, int direction, int x, int y, int dx, int dy, int totalX, int totalY, MotionEvent event) { + mLayoutParams.y = Math.min(Math.max(mLayoutParams.y + dy, 0), WindowHelper.getAppWindowHeight() - bcfRootLayout.getHeight()); WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + return true; } @Override - public void onStop(View view, int x, int y, MotionEvent event) { + public boolean onStop(View view, int direction, int x, int y, int totalX, int totalY, int vx, int vy, MotionEvent event) { + DebugConfig.saveViewY(BaseContentFloatView.this, mLayoutParams.y); + return true; } }); + ClickUtils.applyPressedBgDark(bcfCloseIv, 0.8f); + bcfCloseIv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + + ClickUtils.applyPressedBgDark(bcfAdjustIv, 0.8f); bcfAdjustIv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FloatToast.showLong(FloatToast.WARNING, StringUtils.getString(R.string.du_adjust_tips)); } }); - TouchHelper.applyDrag(bcfAdjustIv, new TouchHelper.OnDragListener() { + TouchUtils.setOnTouchListener(bcfAdjustIv, new TouchUtils.OnTouchUtilsListener() { + + private int minHeight; @Override - public void onDown(View v, int x, int y, MotionEvent event) { - if (mTitleBarHeight == 0) { - mTitleBarHeight = findViewById(R.id.bcfTitleRl).getHeight(); - } + public boolean onDown(View view, int x, int y, MotionEvent event) { + int[] locations = new int[2]; + getLocationOnScreen(locations); + mLayoutParams.height = WindowHelper.getAppWindowHeight() - locations[1]; + WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + + minHeight = bcfTitleRl.getHeight() + SizeUtils.dp2px(30); + return true; } @Override - public void onMove(View view, int x, int y, int dx, int dy, MotionEvent event) { -// bcfTitleTv.setText("(" + mLayoutParams.x + ", " + mLayoutParams.y + ")" + mLayoutParams.height); - mLayoutParams.height = Math.min(Math.max(getWindowHeight() - dy, mTitleBarHeight + SizeUtils.dp2px(30)), WindowHelper.getAppWindowHeight() - mLayoutParams.y); - WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + public boolean onMove(View view, int direction, int x, int y, int dx, final int dy, int totalX, int totalY, MotionEvent event) { + ViewGroup.LayoutParams layoutParams = bcfRootLayout.getLayoutParams(); + layoutParams.height = Math.min(Math.max(bcfRootLayout.getHeight() + dy, minHeight), mLayoutParams.height); + bcfRootLayout.setLayoutParams(layoutParams); + return true; } @Override - public void onStop(View view, int x, int y, MotionEvent event) { + public boolean onStop(View view, int direction, int x, int y, int totalX, int totalY, int vx, int vy, MotionEvent event) { + mLayoutParams.height = bcfRootLayout.getHeight(); + WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + DebugConfig.saveViewHeight(BaseContentFloatView.this, mLayoutParams.height); + return true; } }); } private void initSwipePanel() { - swipePanel = findViewById(R.id.baseFloatSwipePanel); + swipePanel = findViewById(R.id.bcfSwipePanel); swipePanel.setOnFullSwipeListener(new SwipePanel.OnFullSwipeListener() { @Override public void onFullSwipe(int direction) { @@ -304,18 +308,39 @@ private void stopRotate() { @Override protected void onCreateLayoutParams() { super.onCreateLayoutParams(); - mLayoutParams.gravity = Gravity.CENTER | Gravity.BOTTOM; + mLayoutParams.gravity = Gravity.TOP; mLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; + mLayoutParams.height = DebugConfig.getViewHeight(BaseContentFloatView.this, WindowManager.LayoutParams.WRAP_CONTENT); mLayoutParams.windowAnimations = R.style.FloatAnimation; - mLayoutParams.height = DebugConfig.getFloatViewHeight(this); - mLayoutParams.y = DebugConfig.getFloatViewY(this); - mLayoutParams.alpha = DebugConfig.getFloatViewAlpha(this); + mLayoutParams.alpha = DebugConfig.getViewAlpha(this); + mLayoutParams.y = DebugConfig.getViewY(this); + post(new Runnable() { + @Override + public void run() { + wrapWindow(); + } + }); } - private int getWindowHeight() { - if (mLayoutParams.height == WindowManager.LayoutParams.WRAP_CONTENT) { - return BaseContentFloatView.this.getHeight(); + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + wrapWindow(); + } + + private void wrapWindow() { + int[] locations = new int[2]; + getLocationOnScreen(locations); + int floatViewHeight = DebugConfig.getViewHeight(BaseContentFloatView.this, bcfRootLayout.getHeight()); + if (locations[1] + floatViewHeight > WindowHelper.getAppWindowHeight()) { + floatViewHeight = WindowHelper.getAppWindowHeight() - locations[1]; } - return mLayoutParams.height; + mLayoutParams.height = floatViewHeight; + + WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + + ViewGroup.LayoutParams layoutParams = bcfRootLayout.getLayoutParams(); + layoutParams.height = mLayoutParams.height; + bcfRootLayout.setLayoutParams(layoutParams); } } \ No newline at end of file diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java index 70c21d3a6f..4db1374806 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java @@ -11,7 +11,6 @@ import com.blankj.utilcode.util.ActivityUtils; import com.blankj.utilcode.util.AppUtils; -import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.Utils; import com.blankj.utildebug.DebugUtils; import com.blankj.utildebug.R; @@ -39,10 +38,10 @@ public abstract class BaseFloatView extends RelativeLayout public BaseFloatView() { super(DebugUtils.getApp()); setId(R.id.baseFloatView); - inflate(getContext(), bindLayout(), this); + if (bindLayout() != NO_ID) { + inflate(getContext(), bindLayout(), this); + } onCreateLayoutParams(); - -// ShadowHelper.applyFloatView(this); } void createFloatView() { @@ -60,6 +59,11 @@ protected void onCreateLayoutParams() { } mLayoutParams.format = PixelFormat.TRANSPARENT; mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + try { + int currentFlags = (Integer) mLayoutParams.getClass().getField("privateFlags").get(mLayoutParams); + mLayoutParams.getClass().getField("privateFlags").set(mLayoutParams, currentFlags | 0x00000040); + } catch (Exception ignore) { + } } public void show() { @@ -78,7 +82,7 @@ public WindowManager.LayoutParams getLayoutParams() { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - AppUtils.registerAppStatusChangedListener(this, this); + AppUtils.registerAppStatusChangedListener(this); } @Override @@ -88,12 +92,12 @@ protected void onDetachedFromWindow() { } @Override - public void onForeground() { + public void onForeground(Activity activity) { setVisibility(VISIBLE); } @Override - public void onBackground() { + public void onBackground(Activity activity) { setVisibility(GONE); } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java index f70c31ea8a..9bb78cefd5 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java @@ -56,7 +56,8 @@ public void bindFloatView(final BaseContentFloatView floatView) { public void onFocusChange(View v, boolean hasFocus) { WindowManager.LayoutParams params = floatView.getLayoutParams(); if ((params.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) { - params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + params.flags = params.flags & ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + params.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; WindowHelper.updateViewLayout(floatView, params); KeyboardUtils.showSoftInput(v); } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java index fea236749d..59a3b4c494 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java @@ -2,6 +2,7 @@ import android.view.WindowManager; +import com.blankj.utilcode.util.Utils; import com.blankj.utildebug.helper.WindowHelper; import java.util.ArrayList; @@ -31,16 +32,26 @@ private static final class LazyHolder { private static final FloatViewManager INSTANCE = new FloatViewManager(); } - public void show(BaseFloatView view) { - if (mFloatViews.contains(view)) return; - view.createFloatView(); - mWM.addView(view, view.getLayoutParams()); - mFloatViews.add(view); + public void show(final BaseFloatView view) { + Utils.runOnUiThread(new Runnable() { + @Override + public void run() { + if (mFloatViews.contains(view)) return; + view.createFloatView(); + mWM.addView(view, view.getLayoutParams()); + mFloatViews.add(view); + } + }); } - public void dismiss(BaseFloatView view) { - if (!mFloatViews.contains(view)) return; - mWM.removeView(view); - mFloatViews.remove(view); + public void dismiss(final BaseFloatView view) { + Utils.runOnUiThread(new Runnable() { + @Override + public void run() { + if (!mFloatViews.contains(view)) return; + mWM.removeView(view); + mFloatViews.remove(view); + } + }); } } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java b/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java index 6933dee4a2..6d15b4fc3b 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java @@ -1,10 +1,9 @@ package com.blankj.utildebug.config; -import android.view.WindowManager; +import android.view.View; import com.blankj.utilcode.util.SPUtils; import com.blankj.utilcode.util.ScreenUtils; -import com.blankj.utildebug.base.view.BaseContentFloatView; /** *
@@ -44,28 +43,64 @@ public static boolean isNoMoreReminder() {
         return getSp().getBoolean(NO_MORE_REMINDER, false);
     }
 
-    public static void saveFloatViewY(BaseContentFloatView floatView, int y) {
-        getSp().put(floatView.getClass().getSimpleName() + ".y", y);
+    public static void saveViewY(View view, int y) {
+        if (ScreenUtils.isPortrait()) {
+            getSp().put(view.getClass().getSimpleName() + ".yP", y);
+        } else {
+            getSp().put(view.getClass().getSimpleName() + ".yL", y);
+        }
     }
 
-    public static int getFloatViewY(BaseContentFloatView floatView) {
-        return getSp().getInt(floatView.getClass().getSimpleName() + ".y", 0);
+    public static int getViewY(View view) {
+        return getViewY(view, 0);
     }
 
-    public static void saveFloatViewHeight(BaseContentFloatView floatView, int height) {
-        getSp().put(floatView.getClass().getSimpleName() + ".height", height);
+    public static int getViewY(View view, int defaultVal) {
+        if (ScreenUtils.isPortrait()) {
+            return getSp().getInt(view.getClass().getSimpleName() + ".yP", defaultVal);
+        } else {
+            return getSp().getInt(view.getClass().getSimpleName() + ".yL", defaultVal);
+        }
     }
 
-    public static int getFloatViewHeight(BaseContentFloatView floatView) {
-        return getSp().getInt(floatView.getClass().getSimpleName() + ".height", WindowManager.LayoutParams.WRAP_CONTENT);
+    public static void saveViewX(View view, int x) {
+        if (ScreenUtils.isPortrait()) {
+            getSp().put(view.getClass().getSimpleName() + ".xP", x);
+        } else {
+            getSp().put(view.getClass().getSimpleName() + ".xL", x);
+        }
     }
 
-    public static void saveFloatViewAlpha(BaseContentFloatView floatView, float alpha) {
-        getSp().put(floatView.getClass().getSimpleName() + ".alpha", alpha);
+    public static int getViewX(View view) {
+        if (ScreenUtils.isPortrait()) {
+            return getSp().getInt(view.getClass().getSimpleName() + ".xP");
+        } else {
+            return getSp().getInt(view.getClass().getSimpleName() + ".xL");
+        }
     }
 
-    public static float getFloatViewAlpha(BaseContentFloatView floatView) {
-        return getSp().getFloat(floatView.getClass().getSimpleName() + ".alpha", 1f);
+    public static void saveViewHeight(View view, int height) {
+        if (ScreenUtils.isPortrait()) {
+            getSp().put(view.getClass().getSimpleName() + ".heightP", height);
+        } else {
+            getSp().put(view.getClass().getSimpleName() + ".heightL", height);
+        }
+    }
+
+    public static int getViewHeight(View view, int height) {
+        if (ScreenUtils.isPortrait()) {
+            return getSp().getInt(view.getClass().getSimpleName() + ".heightP", height);
+        } else {
+            return getSp().getInt(view.getClass().getSimpleName() + ".heightL", height);
+        }
+    }
+
+    public static void saveViewAlpha(View view, float alpha) {
+        getSp().put(view.getClass().getSimpleName() + ".alpha", alpha);
+    }
+
+    public static float getViewAlpha(View view) {
+        return getSp().getFloat(view.getClass().getSimpleName() + ".alpha", 1f);
     }
 
     private static SPUtils getSp() {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java
index 91d3f78909..1b2c9a0d94 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java
@@ -54,7 +54,7 @@ public void bind(@NonNull ItemViewHolder holder, int position) {
         titleTv.setText(mTitle);
         contentTv.setText(mContent);
         if (mListener != null) {
-            ClickUtils.applyPressedViewScale(holder.itemView);
+            ClickUtils.applyPressedBgDark(holder.itemView);
             ClickUtils.applyGlobalDebouncing(holder.itemView, mListener);
             holder.findViewById(R.id.baseInfoGoIv).setVisibility(View.VISIBLE);
         } else {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java
index b1346f3157..a6c8396752 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java
@@ -58,7 +58,7 @@ public void bind(@NonNull ItemViewHolder holder, int position) {
         titleTv.setText(mTitle);
         contentTv.setText(mContent);
         if (mListener != null) {
-            ClickUtils.applyPressedViewScale(holder.itemView);
+            ClickUtils.applyPressedBgDark(holder.itemView);
             ClickUtils.applyGlobalDebouncing(holder.itemView, mListener);
             holder.findViewById(R.id.baseInfoGoIv).setVisibility(View.VISIBLE);
         } else {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java
index bce2f3b5b8..bb8ff191bc 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java
@@ -54,6 +54,10 @@ public void onAttach() {
         fileExplorerSearchEt = findViewById(R.id.fileExplorerSearchEt);
         fileExplorerRv = findViewById(R.id.fileExplorerRv);
 
+        if (FileItem.isEmptyItems(mSrcItems)) {
+            fileExplorerSearchEt.setVisibility(GONE);
+        }
+
         mAdapter = new BaseItemAdapter<>();
         mAdapter.setItems(mSrcItems);
         fileExplorerRv.setAdapter(mAdapter);
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java
index 8cc57ac4f9..b8e8c1cb91 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java
@@ -1,20 +1,27 @@
 package com.blankj.utildebug.debug.tool.fileExplorer;
 
+import android.content.Intent;
 import android.support.annotation.NonNull;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import com.blankj.utilcode.constant.PermissionConstants;
+import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.ClickUtils;
 import com.blankj.utilcode.util.CollectionUtils;
 import com.blankj.utilcode.util.FileUtils;
 import com.blankj.utilcode.util.PathUtils;
+import com.blankj.utilcode.util.PermissionUtils;
+import com.blankj.utilcode.util.SDCardUtils;
 import com.blankj.utilcode.util.StringUtils;
 import com.blankj.utilcode.util.TimeUtils;
+import com.blankj.utilcode.util.UriUtils;
 import com.blankj.utildebug.R;
 import com.blankj.utildebug.base.rv.BaseItem;
 import com.blankj.utildebug.base.rv.ItemViewHolder;
+import com.blankj.utildebug.base.view.FloatToast;
 import com.blankj.utildebug.debug.tool.fileExplorer.image.ImageViewer;
 import com.blankj.utildebug.debug.tool.fileExplorer.sp.SpViewerContentView;
 import com.blankj.utildebug.helper.FileHelper;
@@ -36,9 +43,12 @@
  */
 public class FileItem extends BaseItem {
 
+    private static final ArrayList EMPTY = CollectionUtils.newArrayList(new FileItem());
+
     private FileItem mParent;
     private File     mFile;
     private String   mName;
+    private boolean  isSdcard;
 
     private RelativeLayout fileContentRl;
     private ImageView      fileTypeIv;
@@ -46,17 +56,22 @@ public class FileItem extends BaseItem {
     private TextView       fileInfoTv;
     private TextView       fileMenuDeleteTv;
 
-    public FileItem(FileItem parent, File file) {
+    public FileItem(File file, String name) {
+        this(file, name, false);
+    }
+
+    public FileItem(File file, String name, boolean isSdcard) {
         super(R.layout.du_item_file);
-        mParent = parent;
         mFile = file;
-        mName = file.getName();
+        mName = name;
+        this.isSdcard = isSdcard;
     }
 
-    public FileItem(File file, String name) {
+    public FileItem(FileItem parent, File file) {
         super(R.layout.du_item_file);
+        mParent = parent;
         mFile = file;
-        mName = name;
+        mName = file.getName();
     }
 
     public FileItem() {
@@ -80,11 +95,16 @@ public void bind(@NonNull ItemViewHolder holder, int position) {
         fileMenuDeleteTv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                FileUtils.delete(mFile);
-                getAdapter().removeItem(FileItem.this, true);
-                if (getAdapter().getItems().isEmpty()) {
-                    getAdapter().addItem(new FileItem());
-                    getAdapter().notifyDataSetChanged();
+                boolean delete = FileUtils.delete(mFile);
+                if (delete) {
+                    getAdapter().removeItem(FileItem.this, true);
+                    if (getAdapter().getItems().isEmpty()) {
+                        getAdapter().addItem(new FileItem());
+                        getAdapter().notifyDataSetChanged();
+                        v.getRootView().findViewById(R.id.fileExplorerSearchEt).setVisibility(View.GONE);
+                    }
+                } else {
+                    FloatToast.showLong(FloatToast.WARNING, "Delete failed!");
                 }
             }
         });
@@ -92,12 +112,29 @@ public void onClick(View v) {
 
         if (mFile.isDirectory()) {
             fileTypeIv.setImageResource(R.drawable.du_ic_debug_file_explorer);
-            fileInfoTv.setText(String.format("%s  %s", StringUtils.getString(R.string.du_file_item_num, mFile.list().length), TimeUtils.millis2String(mFile.lastModified(), "yyyy.MM.dd")));
+            fileInfoTv.setText(String.format("%s  %s", StringUtils.getString(R.string.du_file_item_num, CollectionUtils.size(mFile.list())), TimeUtils.millis2String(mFile.lastModified(), "yyyy.MM.dd")));
             fileContentRl.setOnClickListener(new View.OnClickListener() {
                 @Override
-                public void onClick(View v) {
-                    FileExplorerFloatView floatView = (FileExplorerFloatView) v.getRootView();
-                    FileContentView.show(floatView, FileItem.this);
+                public void onClick(final View v) {
+                    if (isSdcard) {
+                        PermissionUtils.permission(PermissionConstants.STORAGE)
+                                .callback(new PermissionUtils.SimpleCallback() {
+                                    @Override
+                                    public void onGranted() {
+                                        FileExplorerFloatView floatView = (FileExplorerFloatView) v.getRootView();
+                                        FileContentView.show(floatView, FileItem.this);
+                                    }
+
+                                    @Override
+                                    public void onDenied() {
+                                        FloatToast.showShort("Permission of storage denied!");
+                                    }
+                                })
+                                .request();
+                    } else {
+                        FileExplorerFloatView floatView = (FileExplorerFloatView) v.getRootView();
+                        FileContentView.show(floatView, FileItem.this);
+                    }
                 }
             });
         } else {
@@ -125,7 +162,17 @@ public void onClick(View v) {
                     }
                 });
             } else {
-                fileContentRl.setOnClickListener(null);
+                fileContentRl.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        Intent intent = new Intent(Intent.ACTION_VIEW);
+                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        intent.setData(UriUtils.file2Uri(mFile));
+                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+                        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+                        ActivityUtils.startActivity(intent);
+                    }
+                });
                 fileTypeIv.setImageResource(R.drawable.du_ic_item_file_default);
             }
         }
@@ -137,11 +184,7 @@ public File getFile() {
 
     public static List getFileItems(final FileItem parent) {
         if (parent == null) return getFileItems();
-        List files = FileUtils.listFilesInDir(parent.getFile());
-        if (CollectionUtils.isEmpty(files)) {
-            return CollectionUtils.newArrayList(new FileItem());
-        }
-        Collections.sort(files, new Comparator() {
+        List files = FileUtils.listFilesInDir(parent.getFile(), new Comparator() {
             @Override
             public int compare(File o1, File o2) {
                 if (o1.isDirectory() && o2.isFile()) {
@@ -177,6 +220,16 @@ private static List getFileItems() {
                 fileItems.add(new FileItem(externalDataFile, "external"));
             }
         }
+        List mountedSDCardPath = SDCardUtils.getMountedSDCardPath();
+        if (!mountedSDCardPath.isEmpty()) {
+            for (int i = 0; i < mountedSDCardPath.size(); i++) {
+                String path = mountedSDCardPath.get(i);
+                File sdPath = new File(path);
+                if (sdPath.exists()) {
+                    fileItems.add(new FileItem(sdPath, "sdcard" + i + "_" + sdPath.getName(), true));
+                }
+            }
+        }
         return fileItems;
     }
 
@@ -188,4 +241,8 @@ public boolean evaluate(FileItem item) {
             }
         });
     }
+
+    public static boolean isEmptyItems(List items) {
+        return EMPTY == items;
+    }
 }
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java
index 4e81f35537..184df8e2dd 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java
@@ -105,7 +105,7 @@ public void onClick(View v) {
             goIv.setVisibility(View.GONE);
             contentRl.setOnClickListener(null);
         } else {
-            ClickUtils.applyPressedViewScale(holder.itemView);
+            ClickUtils.applyPressedBgDark(holder.itemView);
             aSwitch.setVisibility(View.GONE);
             goIv.setVisibility(View.VISIBLE);
             contentRl.setOnClickListener(new View.OnClickListener() {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java
index 40ed38df06..7ae20adb6c 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java
@@ -49,7 +49,7 @@ public static int getFileType(File file) {
                 }
             }
         }
-        if (StringUtils.equals(FileUtils.getFileCharsetSimple(file), "UTF-8")) {
+        if (FileUtils.isUtf8(file)) {
             return UTF8;
         }
         return UNKNOWN;
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java
index afffdc39b3..dbeadbc9a8 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java
@@ -17,26 +17,18 @@ public class ShadowHelper {
 
     public static void applyDebugIcon(View view) {
         ShadowUtils.apply(view, new ShadowUtils.Builder()
-                .setDrawableRadius(SizeUtils.getMeasuredWidth(view) / 2)
-                .setShadowRadius(SizeUtils.dp2px(8))
-                .setShadowColor(0xb0_ffffff, 0xb0_000000)
+                .setCircle()
+                .setShadowColor(0xc0_ffffff, 0x60_ffffff)
         );
     }
 
     public static void applyFloatView(View view) {
-        ShadowUtils.apply(view, new ShadowUtils.Builder()
-                .setDrawableRadius(SizeUtils.dp2px(8))
-                .setShadowRadius(SizeUtils.dp2px(8))
-                .setShadowColor(0xb0_000000)
-        );
+        ShadowUtils.apply(view, new ShadowUtils.Builder().setShadowRadius(SizeUtils.dp2px(8)));
     }
 
     public static void applyMenu(View view) {
-        view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-//        ShadowUtils.apply(view, new ShadowUtils.Builder()
-//                .setDrawableRadius(SizeUtils.dp2px(4))
-//                .setShadowRadius(SizeUtils.dp2px(4), SizeUtils.dp2px(4))
-//                .setShadowColor(0xb0_000000)
-//        );
+        ShadowUtils.apply(view, new ShadowUtils.Builder()
+                .setShadowRadius(SizeUtils.dp2px(4))
+        );
     }
 }
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java
deleted file mode 100755
index 3074d86707..0000000000
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.blankj.utildebug.helper;
-
-import android.annotation.SuppressLint;
-import android.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.animation.DecelerateInterpolator;
-
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.ScreenUtils;
-import com.blankj.utilcode.util.SizeUtils;
-
-/**
- * 
- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/08/26
- *     desc  :
- * 
- */ -public class TouchHelper { - - private static final int MIN_DISTANCE_MOVE = SizeUtils.dp2px(4); - private static final int MIN_TAP_TIME = 1000; - - private static final int STATE_MOVE = 0; - private static final int STATE_STOP = 1; - - private static int mState = STATE_STOP; - private static int mLastX = -1; - private static int mLastY = -1; - - private TouchHelper() { - } - - public static void applyDrag(final View v, final OnDragListener listener) { - if (v == null || listener == null) return; - v.setOnTouchListener(new View.OnTouchListener() { - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouch(View v, MotionEvent event) { - return onDragEvent(v, event, listener); - } - }); - } - - private static boolean onDragEvent(View v, MotionEvent event, OnDragListener listener) { - if (listener == null) return false; - int x = (int) event.getRawX(); - int y = (int) event.getRawY(); - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mLastX = x; - mLastY = y; - listener._onDown(v, x, y, event); - return false; - case MotionEvent.ACTION_MOVE: - if (mLastX == -1) { - mLastX = x; - mLastY = y; - } - if (mState != STATE_MOVE - && Math.abs(x - mLastX) < MIN_DISTANCE_MOVE - && Math.abs(y - mLastY) < MIN_DISTANCE_MOVE) { - return true; - } - listener._onMove(v, x, y, mLastX, mLastY, event); - mLastX = x; - mLastY = y; - mState = STATE_MOVE; - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - listener._onStop(v, x, y, event); - if (event.getAction() == MotionEvent.ACTION_UP) { - if (mState != STATE_MOVE - && event.getEventTime() - event.getDownTime() < MIN_TAP_TIME) { - v.performClick(); - } - } - final long now = SystemClock.uptimeMillis(); - final MotionEvent cancelEvent = MotionEvent.obtain(now, now, - MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); - v.onTouchEvent(cancelEvent); - mState = STATE_STOP; - return false; - default: - break; - } - return false; - } - - public static abstract class OnDragListener { - - public static final int DIRECTION_LEFT = 1; - public static final int DIRECTION_TOP = 2; - public static final int DIRECTION_RIGHT = 4; - public static final int DIRECTION_BOTTOM = 8; - public static final int DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; - public static final int DIRECTION_VERTICAL = DIRECTION_TOP | DIRECTION_BOTTOM; - public static final int DIRECTION_ALL = DIRECTION_LEFT | DIRECTION_TOP | DIRECTION_RIGHT | DIRECTION_BOTTOM; - - private boolean isApplyScale; - private boolean isHorizontalSticky; - private int availableDirection; - private boolean isFirstMove; - private boolean isMoveAvailable; - protected int appWidth; - protected int appHeight; - protected int viewWidth; - protected int viewHeight; - protected int statusBarHeight; - - public OnDragListener() { - this(DIRECTION_ALL, false, false); - } - - public OnDragListener(boolean isApplyScale) { - this(DIRECTION_ALL, isApplyScale, false); - } - - public OnDragListener(boolean isApplyScale, boolean isHorizontalSticky) { - this(DIRECTION_ALL, isApplyScale, isHorizontalSticky); - } - - public OnDragListener(int availableDirection, boolean isApplyScale, boolean isHorizontalSticky) { - this.availableDirection = availableDirection; - this.isApplyScale = isApplyScale; - this.isHorizontalSticky = isHorizontalSticky; - } - - public abstract void onDown(View v, int x, int y, MotionEvent event); - - public abstract void onMove(View view, int x, int y, int dx, int dy, MotionEvent event); - - public abstract void onStop(View view, int x, int y, MotionEvent event); - - private void _onDown(View view, int x, int y, MotionEvent event) { - isFirstMove = false; - viewWidth = view.getWidth(); - viewHeight = view.getHeight(); - appWidth = ScreenUtils.getAppScreenWidth(); - appHeight = ScreenUtils.getAppScreenHeight(); - statusBarHeight = BarUtils.getStatusBarHeight(); - if (isApplyScale) { - processScale(view, true); - } - onDown(view, x, y, event); - } - - private void _onMove(View view, int x, int y, int lastX, int lastY, MotionEvent event) { - if (!isFirstMove) { - if (availableDirection == DIRECTION_ALL) { - isMoveAvailable = true; - } else { - if (Math.abs(x - lastX) >= Math.abs(y - lastY)) { - int direction = availableDirection & DIRECTION_HORIZONTAL; - if (direction == DIRECTION_HORIZONTAL) { - isMoveAvailable = true; - } else if (direction == DIRECTION_LEFT && x - lastX < 0) { - isMoveAvailable = true; - } else if (direction == DIRECTION_RIGHT && x - lastX > 0) { - isMoveAvailable = true; - } - } else { - int direction = availableDirection & DIRECTION_VERTICAL; - if (direction == DIRECTION_VERTICAL) { - isMoveAvailable = true; - } else if (direction == DIRECTION_TOP && y - lastY < 0) { - isMoveAvailable = true; - } else if (direction == DIRECTION_BOTTOM && y - lastY > 0) { - isMoveAvailable = true; - } - } - } - isFirstMove = true; - } - if (isMoveAvailable) { - onMove(view, x, y, x - lastX, y - lastY, event); - } - } - - private void _onStop(View view, int x, int y, MotionEvent event) { - if (isHorizontalSticky) { - float middleX = view.getX() + viewWidth / 2f; - if (middleX > appWidth / 2f) { - view.animate() - .setInterpolator(new DecelerateInterpolator()) - .translationX(appWidth - viewWidth) - .setDuration(100) - .start(); - } else { - view.animate() - .setInterpolator(new DecelerateInterpolator()) - .setDuration(100) - .translationX(0) - .start(); - } - } - - if (isApplyScale) { - processScale(view, false); - } - onStop(view, x, y, event); - } - - private void processScale(final View view, boolean isDown) { - float value = isDown ? 1 - 0.1f : 1; - view.animate() - .scaleX(value) - .scaleY(value) - .setDuration(100) - .start(); - } - } - - public interface OnMoveListener { - boolean onMove(int dx, int dy); - } -} diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java index 504f6b610e..e64574363c 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java @@ -6,7 +6,7 @@ import android.view.WindowManager; import com.blankj.utilcode.util.ScreenUtils; -import com.blankj.utildebug.DebugUtils; +import com.blankj.utilcode.util.Utils; /** *
@@ -19,29 +19,21 @@
 public class WindowHelper {
 
     private static WindowManager sWM;
-    private static int           windowHeight;
 
     private WindowHelper() {
     }
 
-    public static void updateViewLayout(View view, ViewGroup.LayoutParams params) {
+    public static void updateViewLayout(final View view, ViewGroup.LayoutParams params) {
         getWindowManager().updateViewLayout(view, params);
     }
 
     public static int getAppWindowHeight() {
-        if (windowHeight == 0) {
-            windowHeight = ScreenUtils.getAppScreenHeight();
-        }
-        return windowHeight;
-    }
-
-    public static void updateWindowHeight() {
-        windowHeight = ScreenUtils.getAppScreenHeight();
+        return ScreenUtils.getAppScreenHeight();
     }
 
     public static WindowManager getWindowManager() {
         if (sWM == null) {
-            sWM = (WindowManager) DebugUtils.getApp().getSystemService(Context.WINDOW_SERVICE);
+            sWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
         }
         return sWM;
     }
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java b/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java
index 27b3dfb936..e5a65d4eac 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java
@@ -1,19 +1,21 @@
 package com.blankj.utildebug.icon;
 
+import android.content.res.Configuration;
 import android.os.Build;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.animation.DecelerateInterpolator;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 
+import com.blankj.utilcode.util.BarUtils;
 import com.blankj.utilcode.util.PermissionUtils;
-import com.blankj.utilcode.util.SizeUtils;
 import com.blankj.utilcode.util.ToastUtils;
+import com.blankj.utilcode.util.TouchUtils;
 import com.blankj.utildebug.DebugUtils;
 import com.blankj.utildebug.R;
 import com.blankj.utildebug.config.DebugConfig;
 import com.blankj.utildebug.helper.ShadowHelper;
-import com.blankj.utildebug.helper.TouchHelper;
 import com.blankj.utildebug.menu.DebugMenu;
 
 /**
@@ -28,9 +30,7 @@ public class DebugIcon extends RelativeLayout {
 
     private static final DebugIcon INSTANCE = new DebugIcon();
 
-    private int   mIconId;
-    private float globalX = DebugConfig.getDebugIconX();
-    private float globalY = DebugConfig.getDebugIconY();
+    private int mIconId;
 
     public static DebugIcon getInstance() {
         return INSTANCE;
@@ -44,24 +44,63 @@ public static void setVisibility(boolean isShow) {
     public DebugIcon() {
         super(DebugUtils.getApp());
         inflate(getContext(), R.layout.du_debug_icon, this);
-        int spacing = SizeUtils.dp2px(8);
-        setPadding(spacing, spacing, spacing, spacing);
-
         ShadowHelper.applyDebugIcon(this);
-        TouchHelper.applyDrag(this, new TouchHelper.OnDragListener(true, true) {
+        TouchUtils.setOnTouchListener(this, new TouchUtils.OnTouchUtilsListener() {
+
+            private int rootViewWidth;
+            private int rootViewHeight;
+            private int viewWidth;
+            private int viewHeight;
+            private int statusBarHeight;
 
             @Override
-            public void onDown(View view, int x, int y, MotionEvent event) {
+            public boolean onDown(View view, int x, int y, MotionEvent event) {
+                viewWidth = view.getWidth();
+                viewHeight = view.getHeight();
+                View contentView = view.getRootView().findViewById(android.R.id.content);
+                rootViewWidth = contentView.getWidth();
+                rootViewHeight = contentView.getHeight();
+                statusBarHeight = BarUtils.getStatusBarHeight();
+
+                processScale(view, true);
+                return true;
             }
 
             @Override
-            public void onMove(View view, int x, int y, int dx, int dy, MotionEvent event) {
-                view.setX(Math.min(Math.max(0, view.getX() + dx), appWidth - viewWidth));
-                view.setY(Math.min(Math.max(statusBarHeight, view.getY() + dy), appHeight - viewHeight));
+            public boolean onMove(View view, int direction, int x, int y, int dx, int dy, int totalX, int totalY, MotionEvent event) {
+                view.setX(Math.min(Math.max(0, view.getX() + dx), rootViewWidth - viewWidth));
+                view.setY(Math.min(Math.max(statusBarHeight, view.getY() + dy), rootViewHeight - viewHeight));
+                return true;
             }
 
             @Override
-            public void onStop(View view, int x, int y, MotionEvent event) {
+            public boolean onStop(View view, int direction, int x, int y, int totalX, int totalY, int vx, int vy, MotionEvent event) {
+                stick2HorizontalSide(view);
+                processScale(view, false);
+                return true;
+            }
+
+            private void stick2HorizontalSide(View view) {
+                view.animate()
+                        .setInterpolator(new DecelerateInterpolator())
+                        .translationX(view.getX() + viewWidth / 2f > rootViewWidth / 2f ? rootViewWidth - viewWidth : 0)
+                        .setDuration(100)
+                        .withEndAction(new Runnable() {
+                            @Override
+                            public void run() {
+                                savePosition();
+                            }
+                        })
+                        .start();
+            }
+
+            private void processScale(final View view, boolean isDown) {
+                float value = isDown ? 1 - 0.1f : 1;
+                view.animate()
+                        .scaleX(value)
+                        .scaleY(value)
+                        .setDuration(100)
+                        .start();
             }
         });
 
@@ -90,22 +129,41 @@ public void onDenied() {
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        setX(globalX);
-        setY(globalY);
+        wrapPosition();
     }
 
     @Override
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        globalX = getX();
-        globalY = getY();
-        DebugConfig.saveDebugIconX(globalX);
-        DebugConfig.saveDebugIconY(globalY);
+        savePosition();
+    }
+
+    private void savePosition() {
+        DebugConfig.saveViewX(this, (int) getX());
+        DebugConfig.saveViewY(this, (int) getY());
+    }
+
+    @Override
+    protected void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        wrapPosition();
+    }
+
+    private void wrapPosition() {
+        post(new Runnable() {
+            @Override
+            public void run() {
+                View contentView = getRootView().findViewById(android.R.id.content);
+                if (contentView == null) return;
+                setX(DebugConfig.getViewX(DebugIcon.this));
+                setY(DebugConfig.getViewY(DebugIcon.this, contentView.getHeight() / 3));
+                setX(getX() + getWidth() / 2f > contentView.getWidth() / 2f ? contentView.getWidth() - getWidth() : 0);
+            }
+        });
     }
 
     public void setIconId(final int iconId) {
         ImageView debugPanelIconIv = findViewById(R.id.debugIconIv);
-        mIconId = iconId == -1 ? R.drawable.du_ic_icon_default : iconId;
         debugPanelIconIv.setImageResource(mIconId);
     }
 
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java b/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java
index 8df4b197b7..1de083a6c9 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java
@@ -26,6 +26,8 @@ public class DebugMenu extends BaseContentFloatView {
 
     private List mDebugs;
 
+    private BaseItemAdapter mAdapter;
+
     private RecyclerView debugMenuRv;
 
     public static DebugMenu getInstance() {
@@ -62,13 +64,20 @@ public void initContentView() {
         setSwipeBackEnabled(false);
 
         debugMenuRv = findViewById(R.id.debugMenuRv);
-        BaseItemAdapter adapter = new BaseItemAdapter<>();
-        adapter.setItems(DebugMenuItem.getDebugMenuItems(mDebugs));
-        debugMenuRv.setAdapter(adapter);
+        mAdapter = new BaseItemAdapter<>();
+        mAdapter.setItems(DebugMenuItem.getDebugMenuItems(mDebugs));
+        debugMenuRv.setAdapter(mAdapter);
         debugMenuRv.setLayoutManager(new LinearLayoutManager(getContext()));
     }
 
     public void setDebugs(List debugs) {
         mDebugs = debugs;
     }
+
+    public void addDebugs(List debugs) {
+        if (debugs == null || debugs.size() == 0) return;
+        mDebugs.addAll(debugs);
+        if (mAdapter == null) return;
+        mAdapter.notifyDataSetChanged();
+    }
 }
diff --git a/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml b/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml
index 1850575379..5943aeceeb 100644
--- a/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml
+++ b/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml
@@ -1,5 +1,5 @@
 
 
-    
+    
     
 
\ No newline at end of file
diff --git a/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml b/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml
index 74770f3764..fc9efdc1da 100644
--- a/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml
+++ b/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml
@@ -1,7 +1,7 @@
 
 
     
+        android:bottomLeftRadius="8dp"
+        android:bottomRightRadius="8dp"/>
     
 
\ No newline at end of file
diff --git a/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml b/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml
index 346ecb3795..3d0415b8e0 100644
--- a/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml
+++ b/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml
@@ -2,6 +2,6 @@
 
     
+        android:endColor="#37000000"
+        android:startColor="#03000000" />
 
\ No newline at end of file
diff --git a/lib/utildebug/src/main/res/layout/du_base_content_float.xml b/lib/utildebug/src/main/res/layout/du_base_content_float.xml
index 73f51dff11..9380648980 100644
--- a/lib/utildebug/src/main/res/layout/du_base_content_float.xml
+++ b/lib/utildebug/src/main/res/layout/du_base_content_float.xml
@@ -4,16 +4,37 @@
     xmlns:tools="http://schemas.android.com/tools">
 
     
 
+        
+
+        
+
+        
+
         
 
-        
-
-        
-
-        
-
     
 
diff --git a/lib/utildebug/src/main/res/layout/du_debug_icon.xml b/lib/utildebug/src/main/res/layout/du_debug_icon.xml
index 8ea7e1e4db..9d3118ef3a 100644
--- a/lib/utildebug/src/main/res/layout/du_debug_icon.xml
+++ b/lib/utildebug/src/main/res/layout/du_debug_icon.xml
@@ -5,6 +5,7 @@
     
+        android:layout_height="40dp"
+        android:src="@drawable/du_ic_icon_default" />
 
 
diff --git a/lib/utildebug/src/main/res/values/values-cardview.xml b/lib/utildebug/src/main/res/values/values-cardview.xml
deleted file mode 100644
index c54222f9eb..0000000000
--- a/lib/utildebug/src/main/res/values/values-cardview.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-    
-    #FF424242
-    #FFFFFFFF
-    #03000000
-    #37000000
-    
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-    
-    0dp
-    
-    
-    
-    
-
\ No newline at end of file
diff --git a/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java b/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java
deleted file mode 100644
index ea1f901d70..0000000000
--- a/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.blankj.utildebug;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see Testing documentation
- */
-public class ExampleUnitTest {
-    @Test
-    public void addition_isCorrect() {
-        assertEquals(4, 2 + 2);
-    }
-}
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/CHANGELOG.md b/plugin/api-gradle-plugin/CHANGELOG.md
index 6dc7341833..4b3fb04315 100644
--- a/plugin/api-gradle-plugin/CHANGELOG.md
+++ b/plugin/api-gradle-plugin/CHANGELOG.md
@@ -1,4 +1,7 @@
 # Change Log
 
+## v1.1(2019/10/30)
+新增 onlyScanLibRegex, jumpScanLibRegex 的 DSL
+
 ## v1.0(2019/07/20)
 发布初版本
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 516145f0af..4c08cb40c7 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -28,7 +28,7 @@
 buildscript {
     dependencies {
         ...
-        classpath 'com.blankj:api-gradle-plugin:1.0'
+        classpath 'com.blankj:api-gradle-plugin:1.1'
     }
 }
 ```
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy
index 05ff41e142..87ec26e571 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy
@@ -4,13 +4,16 @@ class ApiExtension {
 
     boolean abortOnError = true
     String apiUtilsClass = "com.blankj.utilcode.util.ApiUtils";
+    String onlyScanLibRegex = ""
+    String jumpScanLibRegex = ""
 
     @Override
     String toString() {
-        return "BusExtension { " +
+        return "ApiExtension { " +
                 "abortOnError: " + abortOnError +
                 ", apiUtilsClass: " + apiUtilsClass +
+                (onlyScanLibRegex == "" ? "" : ", onlyScanLibRegex: " + onlyScanLibRegex) +
+                (jumpScanLibRegex == "" ? "" : ", jumpScanLibRegex: " + jumpScanLibRegex) +
                 " }";
     }
-
 }
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
index 36b679ff99..ad2525d063 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
@@ -62,10 +62,10 @@ class ApiScan {
             ClassReader cr = new ClassReader(file.bytes);
             ClassWriter cw = new ClassWriter(cr, 0);
             ClassVisitor cv = new ApiClassVisitor(cw, apiImplMap, apiClasses, apiUtilsClass);
-            cr.accept(cv, ClassReader.SKIP_FRAMES);
-
-            if (cv.errorStr != null) {
-                throw new Exception(cv.errorStr)
+            try {
+                cr.accept(cv, ClassReader.SKIP_FRAMES);
+            } catch (Exception ignore) {
+                ignore.printStackTrace()
             }
         }
     }
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy
index c4bdf9dfc7..34ce323c81 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy
@@ -7,6 +7,8 @@ import com.blankj.api.util.LogUtils
 import org.apache.commons.io.FileUtils
 import org.gradle.api.Project
 
+import java.util.regex.Pattern
+
 class ApiTransform extends Transform {
 
     Project mProject;
@@ -88,7 +90,7 @@ class ApiTransform extends Transform {
                 )
                 FileUtils.copyFile(jar, dest)
 
-                if (jumpScan(jarName)) {
+                if (jumpScan(jarName, ext)) {
                     LogUtils.l("jump jar: $jarName -> $dest")
                     return
                 }
@@ -136,14 +138,26 @@ class ApiTransform extends Transform {
         LogUtils.l(getName() + " finished: " + (System.currentTimeMillis() - stTime) + "ms")
     }
 
-    private static jumpScan(String jarName) {
-        boolean isExcept = false
-        for (String except : Config.EXCEPTS) {
-            if (jarName.startsWith(except)) {
-                isExcept = true
-                break
+    private static jumpScan(String jarName, ApiExtension ext) {
+        if (jarName.contains("utilcode")) {
+            return false
+        }
+
+        if (ext.onlyScanLibRegex != null && ext.onlyScanLibRegex.trim().length() > 0) {
+            return !Pattern.matches(ext.onlyScanLibRegex, jarName)
+        }
+
+        if (ext.jumpScanLibRegex != null && ext.jumpScanLibRegex.trim().length() > 0) {
+            if (Pattern.matches(ext.jumpScanLibRegex, jarName)) {
+                return true
             }
         }
-        return isExcept
+
+        for (exclude in Config.EXCLUDE_LIBS_START_WITH) {
+            if (jarName.startsWith(exclude)) {
+                return true
+            }
+        }
+        return false
     }
 }
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy
index d5dfa69c4c..fcf51fec4e 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy
@@ -4,13 +4,15 @@ class Config {
 
     public static final String EXT_NAME = 'api'
 
-    public static final List EXCEPTS = [
-            'com.android.support:',
-            'com.android.support.constraint:',
-            'android.arch.',
-            'org.jetbrains.kotlin:',
-            'org.jetbrains:',
-            'com.squareup.'
+    public static final List EXCLUDE_LIBS_START_WITH = [
+            'com.android.support',
+            'androidx',
+            'com.google',
+            'android.arch',
+            'org.jetbrains',
+            'com.squareup',
+            'org.greenrobot',
+            'com.github.bumptech.glide'
     ]
 
     public static final String FILE_SEP = System.getProperty("file.separator")
diff --git a/plugin/bus-gradle-plugin/CHANGELOG.md b/plugin/bus-gradle-plugin/CHANGELOG.md
index 19885a70c7..d9f4853c03 100644
--- a/plugin/bus-gradle-plugin/CHANGELOG.md
+++ b/plugin/bus-gradle-plugin/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Change Log
 
+## v2.3
+新增 onlyScanLibRegex, jumpScanLibRegex 的 DSL
+
+## v2.2
+修复含有 for 循环的字段导致 out of index 的 bug
+
 ## v2.1
 支持 Tag 一对多,同 Tag 可设置事件优先级
 
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index ed5d87567e..328a783796 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -19,7 +19,7 @@
 buildscript {
     dependencies {
         ...
-        classpath 'com.blankj:bus-gradle-plugin:2.1'
+        classpath 'com.blankj:bus-gradle-plugin:2.3'
     }
 }
 ```
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java
index e72130d14f..581c984af4 100644
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java
@@ -29,6 +29,7 @@ public class BusClassVisitor extends ClassVisitor {
     private String  tag;
     private String  funParamDesc;
     private String  mBusUtilsClass;
+    private boolean isStartVisitParams;
 
     public BusClassVisitor(ClassVisitor classVisitor, Map> busMap, String busUtilsClass) {
         super(Opcodes.ASM5, classVisitor);
@@ -47,6 +48,7 @@ public MethodVisitor visitMethod(int access, String funName, String desc, String
         if (cv == null) return null;
         MethodVisitor mv = cv.visitMethod(access, funName, desc, signature, exceptions);
         busInfo = null;
+        isStartVisitParams = false;
         mv = new AdviceAdapter(Opcodes.ASM5, mv, access, funName, desc) {
             @Override
             public AnnotationVisitor visitAnnotation(String desc1, boolean visible) {
@@ -83,6 +85,10 @@ public void visitEnum(String name, String desc, String value) {
             public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
                 super.visitLocalVariable(name, desc, signature, start, end, index);// 获取方法参数信息
                 if (busInfo != null && !funParamDesc.equals("")) {
+                    if (!isStartVisitParams && index != 0) {
+                        return;
+                    }
+                    isStartVisitParams = true;
                     if ("this".equals(name)) {
                         return;
                     }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
index 87d6060870..14d296b2d7 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
@@ -4,12 +4,16 @@ class BusExtension {
 
     boolean abortOnError = true;
     String busUtilsClass = "com.blankj.utilcode.util.BusUtils";
+    String onlyScanLibRegex = ""
+    String jumpScanLibRegex = ""
 
     @Override
     String toString() {
         return "BusExtension { " +
                 "abortOnError: " + abortOnError +
                 ", busUtilsClass: " + busUtilsClass +
+                (onlyScanLibRegex == "" ? "" : ", onlyScanLibRegex: " + onlyScanLibRegex) +
+                (jumpScanLibRegex == "" ? "" : ", jumpScanLibRegex: " + jumpScanLibRegex) +
                 " }";
     }
 }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
index 5050938d0d..a08d53f202 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
@@ -60,7 +60,11 @@ class BusScan {
             ClassReader cr = new ClassReader(file.bytes);
             ClassWriter cw = new ClassWriter(cr, 0);
             ClassVisitor cv = new BusClassVisitor(cw, busMap, busUtilsClass);
-            cr.accept(cv, ClassReader.SKIP_FRAMES);
+            try {
+                cr.accept(cv, ClassReader.SKIP_FRAMES);
+            } catch (Exception ignore) {
+                ignore.printStackTrace()
+            }
         }
     }
 }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
index cfe7b54313..1581a61fb7 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
@@ -7,6 +7,8 @@ import com.blankj.bus.util.LogUtils
 import org.apache.commons.io.FileUtils
 import org.gradle.api.Project
 
+import java.util.regex.Pattern
+
 class BusTransform extends Transform {
 
     Project mProject;
@@ -87,7 +89,7 @@ class BusTransform extends Transform {
                 )
                 FileUtils.copyFile(jar, dest)
 
-                if (jumpScan(jarName)) {
+                if (jumpScan(jarName, ext)) {
                     LogUtils.l("jump jar: $jarName -> $dest")
                     return
                 }
@@ -153,14 +155,26 @@ class BusTransform extends Transform {
         LogUtils.l(getName() + " finished: " + (System.currentTimeMillis() - stTime) + "ms")
     }
 
-    private static jumpScan(String jarName) {
-        boolean isExcept = false
-        for (String except : Config.EXCEPTS) {
-            if (jarName.startsWith(except)) {
-                isExcept = true
-                break
+    private static jumpScan(String jarName, BusExtension ext) {
+        if (jarName.contains("utilcode")) {
+            return false
+        }
+
+        if (ext.onlyScanLibRegex != null && ext.onlyScanLibRegex.trim().length() > 0) {
+            return !Pattern.matches(ext.onlyScanLibRegex, jarName)
+        }
+
+        if (ext.jumpScanLibRegex != null && ext.jumpScanLibRegex.trim().length() > 0) {
+            if (Pattern.matches(ext.jumpScanLibRegex, jarName)) {
+                return true
             }
         }
-        return isExcept
+
+        for (exclude in Config.EXCLUDE_LIBS_START_WITH) {
+            if (jarName.startsWith(exclude)) {
+                return true
+            }
+        }
+        return false
     }
 }
\ No newline at end of file
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
index d33ad8485b..e52424affa 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
@@ -4,13 +4,15 @@ class Config {
 
     public static final String EXT_NAME = 'bus'
 
-    public static final List EXCEPTS = [
-            'com.android.support:',
-            'com.android.support.constraint:',
-            'android.arch.',
-            'org.jetbrains.kotlin:',
-            'org.jetbrains:',
-            'com.squareup.'
+    public static final List EXCLUDE_LIBS_START_WITH = [
+            'com.android.support',
+            'androidx',
+            'com.google',
+            'android.arch',
+            'org.jetbrains',
+            'com.squareup',
+            'org.greenrobot',
+            'com.github.bumptech.glide'
     ]
 
     public static final String FILE_SEP = System.getProperty("file.separator")
diff --git a/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java b/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
index d253d2a4d4..b3af21cddb 100644
--- a/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
+++ b/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
@@ -29,6 +29,9 @@ public class BusTest {
     private static final String TAG_NO_PARAM_STICKY  = "TagNoParamSticky";
     private static final String TAG_ONE_PARAM_STICKY = "TagOneParamSticky";
 
+    private String[] arr = new String[]{"0", "1"};
+    private String[] arr2 = new String[]{"0", "1"};
+
     @BusUtils.Bus(tag = TAG_NO_PARAM)
     public void noParamFun() {
         System.out.println("noParam");
@@ -61,6 +64,12 @@ public void noParamStickyFun() {
 
     @BusUtils.Bus(tag = TAG_ONE_PARAM_STICKY, sticky = true)
     public void oneParamStickyFun(Callback callback) {
+        for (String str : arr) {
+            System.out.println(str);
+        }
+        for (String str1 : arr2) {
+            System.out.println(str1);
+        }
         if (callback != null) {
             System.out.println(callback.call());
         }
diff --git a/reports/profile/css/base-style.css b/reports/profile/css/base-style.css
new file mode 100644
index 0000000000..4afa73e3dd
--- /dev/null
+++ b/reports/profile/css/base-style.css
@@ -0,0 +1,179 @@
+
+body {
+    margin: 0;
+    padding: 0;
+    font-family: sans-serif;
+    font-size: 12pt;
+}
+
+body, a, a:visited {
+    color: #303030;
+}
+
+#content {
+    padding-left: 50px;
+    padding-right: 50px;
+    padding-top: 30px;
+    padding-bottom: 30px;
+}
+
+#content h1 {
+    font-size: 160%;
+    margin-bottom: 10px;
+}
+
+#footer {
+    margin-top: 100px;
+    font-size: 80%;
+    white-space: nowrap;
+}
+
+#footer, #footer a {
+    color: #a0a0a0;
+}
+
+#line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+#label-for-line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+ul {
+    margin-left: 0;
+}
+
+h1, h2, h3 {
+    white-space: nowrap;
+}
+
+h2 {
+    font-size: 120%;
+}
+
+ul.tabLinks {
+    padding-left: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    overflow: auto;
+    min-width: 800px;
+    width: auto !important;
+    width: 800px;
+}
+
+ul.tabLinks li {
+    float: left;
+    height: 100%;
+    list-style: none;
+    padding-left: 10px;
+    padding-right: 10px;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-bottom: 0;
+    -moz-border-radius: 7px;
+    border-radius: 7px;
+    margin-right: 25px;
+    border: solid 1px #d4d4d4;
+    background-color: #f0f0f0;
+}
+
+ul.tabLinks li:hover {
+    background-color: #fafafa;
+}
+
+ul.tabLinks li.selected {
+    background-color: #c5f0f5;
+    border-color: #c5f0f5;
+}
+
+ul.tabLinks a {
+    font-size: 120%;
+    display: block;
+    outline: none;
+    text-decoration: none;
+    margin: 0;
+    padding: 0;
+}
+
+ul.tabLinks li h2 {
+    margin: 0;
+    padding: 0;
+}
+
+div.tab {
+}
+
+div.selected {
+    display: block;
+}
+
+div.deselected {
+    display: none;
+}
+
+div.tab table {
+    min-width: 350px;
+    width: auto !important;
+    width: 350px;
+    border-collapse: collapse;
+}
+
+div.tab th, div.tab table {
+    border-bottom: solid #d0d0d0 1px;
+}
+
+div.tab th {
+    text-align: left;
+    white-space: nowrap;
+    padding-left: 6em;
+}
+
+div.tab th:first-child {
+    padding-left: 0;
+}
+
+div.tab td {
+    white-space: nowrap;
+    padding-left: 6em;
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+div.tab td:first-child {
+    padding-left: 0;
+}
+
+div.tab td.numeric, div.tab th.numeric {
+    text-align: right;
+}
+
+span.code {
+    display: inline-block;
+    margin-top: 0em;
+    margin-bottom: 1em;
+}
+
+span.code pre {
+    font-size: 11pt;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0;
+    background-color: #f7f7f7;
+    border: solid 1px #d0d0d0;
+    min-width: 700px;
+    width: auto !important;
+    width: 700px;
+}
+
+span.wrapped pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+    word-break: break-all;
+}
+
+label.hidden {
+    display: none;
+}
\ No newline at end of file
diff --git a/reports/profile/css/style.css b/reports/profile/css/style.css
new file mode 100644
index 0000000000..c4a4239337
--- /dev/null
+++ b/reports/profile/css/style.css
@@ -0,0 +1,4 @@
+
+div.tab td.indentPath {
+    padding-left: 3em;
+}
diff --git a/reports/profile/js/report.js b/reports/profile/js/report.js
new file mode 100644
index 0000000000..83bab4a19f
--- /dev/null
+++ b/reports/profile/js/report.js
@@ -0,0 +1,194 @@
+(function (window, document) {
+    "use strict";
+
+    var tabs = {};
+
+    function changeElementClass(element, classValue) {
+        if (element.getAttribute("className")) {
+            element.setAttribute("className", classValue);
+        } else {
+            element.setAttribute("class", classValue);
+        }
+    }
+
+    function getClassAttribute(element) {
+        if (element.getAttribute("className")) {
+            return element.getAttribute("className");
+        } else {
+            return element.getAttribute("class");
+        }
+    }
+
+    function addClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element) + " " + classValue);
+    }
+
+    function removeClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
+    }
+
+    function initTabs() {
+        var container = document.getElementById("tabs");
+
+        tabs.tabs = findTabs(container);
+        tabs.titles = findTitles(tabs.tabs);
+        tabs.headers = findHeaders(container);
+        tabs.select = select;
+        tabs.deselectAll = deselectAll;
+        tabs.select(0);
+
+        return true;
+    }
+
+    function getCheckBox() {
+        return document.getElementById("line-wrapping-toggle");
+    }
+
+    function getLabelForCheckBox() {
+        return document.getElementById("label-for-line-wrapping-toggle");
+    }
+
+    function findCodeBlocks() {
+        var spans = document.getElementById("tabs").getElementsByTagName("span");
+        var codeBlocks = [];
+        for (var i = 0; i < spans.length; ++i) {
+            if (spans[i].className.indexOf("code") >= 0) {
+                codeBlocks.push(spans[i]);
+            }
+        }
+        return codeBlocks;
+    }
+
+    function forAllCodeBlocks(operation) {
+        var codeBlocks = findCodeBlocks();
+
+        for (var i = 0; i < codeBlocks.length; ++i) {
+            operation(codeBlocks[i], "wrapped");
+        }
+    }
+
+    function toggleLineWrapping() {
+        var checkBox = getCheckBox();
+
+        if (checkBox.checked) {
+            forAllCodeBlocks(addClass);
+        } else {
+            forAllCodeBlocks(removeClass);
+        }
+    }
+
+    function initControls() {
+        if (findCodeBlocks().length > 0) {
+            var checkBox = getCheckBox();
+            var label = getLabelForCheckBox();
+
+            checkBox.onclick = toggleLineWrapping;
+            checkBox.checked = false;
+
+            removeClass(label, "hidden");
+         }
+    }
+
+    function switchTab() {
+        var id = this.id.substr(1);
+
+        for (var i = 0; i < tabs.tabs.length; i++) {
+            if (tabs.tabs[i].id === id) {
+                tabs.select(i);
+                break;
+            }
+        }
+
+        return false;
+    }
+
+    function select(i) {
+        this.deselectAll();
+
+        changeElementClass(this.tabs[i], "tab selected");
+        changeElementClass(this.headers[i], "selected");
+
+        while (this.headers[i].firstChild) {
+            this.headers[i].removeChild(this.headers[i].firstChild);
+        }
+
+        var h2 = document.createElement("H2");
+
+        h2.appendChild(document.createTextNode(this.titles[i]));
+        this.headers[i].appendChild(h2);
+    }
+
+    function deselectAll() {
+        for (var i = 0; i < this.tabs.length; i++) {
+            changeElementClass(this.tabs[i], "tab deselected");
+            changeElementClass(this.headers[i], "deselected");
+
+            while (this.headers[i].firstChild) {
+                this.headers[i].removeChild(this.headers[i].firstChild);
+            }
+
+            var a = document.createElement("A");
+
+            a.setAttribute("id", "ltab" + i);
+            a.setAttribute("href", "#tab" + i);
+            a.onclick = switchTab;
+            a.appendChild(document.createTextNode(this.titles[i]));
+
+            this.headers[i].appendChild(a);
+        }
+    }
+
+    function findTabs(container) {
+        return findChildElements(container, "DIV", "tab");
+    }
+
+    function findHeaders(container) {
+        var owner = findChildElements(container, "UL", "tabLinks");
+        return findChildElements(owner[0], "LI", null);
+    }
+
+    function findTitles(tabs) {
+        var titles = [];
+
+        for (var i = 0; i < tabs.length; i++) {
+            var tab = tabs[i];
+            var header = findChildElements(tab, "H2", null)[0];
+
+            header.parentNode.removeChild(header);
+
+            if (header.innerText) {
+                titles.push(header.innerText);
+            } else {
+                titles.push(header.textContent);
+            }
+        }
+
+        return titles;
+    }
+
+    function findChildElements(container, name, targetClass) {
+        var elements = [];
+        var children = container.childNodes;
+
+        for (var i = 0; i < children.length; i++) {
+            var child = children.item(i);
+
+            if (child.nodeType === 1 && child.nodeName === name) {
+                if (targetClass && child.className.indexOf(targetClass) < 0) {
+                    continue;
+                }
+
+                elements.push(child);
+            }
+        }
+
+        return elements;
+    }
+
+    // Entry point.
+
+    window.onload = function() {
+        initTabs();
+        initControls();
+    };
+} (window, window.document));
\ No newline at end of file
diff --git a/reports/profile/profile-2019-10-29-17-10-55.html b/reports/profile/profile-2019-10-29-17-10-55.html
new file mode 100644
index 0000000000..ce4c906a56
--- /dev/null
+++ b/reports/profile/profile-2019-10-29-17-10-55.html
@@ -0,0 +1,317 @@
+
+
+
+
+
+Profile report
+
+
+
+
+
+
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time4.150s
Startup1.202s
Settings and BuildSrc0.325s
Loading Projects0.037s
Configuring Projects-57.727s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-57.727s
:0.176s
:lib:base0.068s
:lib:utilcode0.038s
:plugin:api-gradle-plugin0.038s
:lib:subutil0.033s
:lib:utildebug0.028s
:lib:common0.027s
:lib:utildebug-no-op0.023s
:plugin:bus-gradle-plugin0.021s
:feature:main0.002s
:feature:utilcode0.002s
:lib0.001s
:feature0s
:feature:launcher0s
:feature:subutil0s
:plugin0s
:feature:launcher:app-58.184s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.124s
:classpath0.117s
:plugin:api-gradle-plugin:classpath0.003s
detachedConfiguration10.002s
detachedConfiguration20.002s
:plugin:bus-gradle-plugin:classpath0s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-14-42.html b/reports/profile/profile-2019-10-29-17-14-42.html new file mode 100644 index 0000000000..833ff50147 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-14-42.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time1.580s
Startup0.508s
Settings and BuildSrc0.097s
Loading Projects0.015s
Configuring Projects-42.833s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-42.833s
:0.143s
:lib:utildebug-no-op0.031s
:lib:base0.024s
:lib:subutil0.024s
:plugin:api-gradle-plugin0.023s
:lib:utilcode0.022s
:lib:common0.020s
:lib:utildebug0.019s
:plugin:bus-gradle-plugin0.008s
:feature:launcher0.001s
:feature:main0.001s
:feature0s
:feature:subutil0s
:feature:utilcode0s
:lib0s
:plugin0s
:feature:launcher:app-43.149s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.116s
:classpath0.110s
:plugin:api-gradle-plugin:classpath0.003s
detachedConfiguration10.002s
detachedConfiguration20.001s
:plugin:bus-gradle-plugin:classpath0s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-19-01.html b/reports/profile/profile-2019-10-29-17-19-01.html new file mode 100644 index 0000000000..eedef56720 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-19-01.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time4.828s
Startup0.463s
Settings and BuildSrc0.047s
Loading Projects0.006s
Configuring Projects-3.404s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-3.404s
:lib:base1.334s
:plugin:bus-gradle-plugin0.186s
:lib:subutil0.184s
:plugin:api-gradle-plugin0.140s
:0.116s
:lib:utilcode0.066s
:lib:utildebug0.054s
:lib:utildebug-no-op0.051s
:lib:common0.036s
:feature:subutil0.001s
:lib0.001s
:feature0s
:feature:launcher0s
:feature:main0s
:feature:utilcode0s
:plugin0s
:feature:launcher:app-5.573s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.030s
:classpath0.025s
:plugin:api-gradle-plugin:classpath0.002s
detachedConfiguration10.002s
:plugin:bus-gradle-plugin:classpath0.001s
detachedConfiguration20s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-19-16.html b/reports/profile/profile-2019-10-29-17-19-16.html new file mode 100644 index 0000000000..7d83036398 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-19-16.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time1.354s
Startup0.481s
Settings and BuildSrc0.071s
Loading Projects0.010s
Configuring Projects-17.351s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-17.351s
:0.131s
:lib:utildebug-no-op0.065s
:lib:utilcode0.042s
:lib:utildebug0.038s
:lib:subutil0.026s
:lib:base0.017s
:plugin:api-gradle-plugin0.016s
:lib:common0.015s
:plugin:bus-gradle-plugin0.008s
:lib0.001s
:feature0s
:feature:launcher0s
:feature:main0s
:feature:subutil0s
:feature:utilcode0s
:plugin0s
:feature:launcher:app-17.710s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.101s
:classpath0.098s
:plugin:api-gradle-plugin:classpath0.002s
detachedConfiguration10.001s
:plugin:bus-gradle-plugin:classpath0s
detachedConfiguration20s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-56-45.html b/reports/profile/profile-2019-10-29-17-56-45.html new file mode 100644 index 0000000000..a8f52f6803 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-56-45.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time7.699s
Startup0.511s
Settings and BuildSrc0.434s
Loading Projects0.045s
Configuring Projects-48.490s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-48.490s
:lib:base1.721s
:0.538s
:plugin:api-gradle-plugin0.518s
:lib:subutil0.294s
:plugin:bus-gradle-plugin0.231s
:lib:utildebug0.127s
:lib:utilcode0.108s
:lib:utildebug-no-op0.069s
:lib:common0.059s
:feature:launcher0.004s
:feature:utilcode0.003s
:feature0.002s
:lib0.002s
:feature:main0.001s
:feature:subutil0.001s
:plugin0s
:feature:launcher:app-52.168s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.221s
:classpath0.214s
:plugin:api-gradle-plugin:classpath0.003s
detachedConfiguration10.002s
:plugin:bus-gradle-plugin:classpath0.001s
detachedConfiguration20.001s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + From 4e17cd81c8467fc381f1c2df36fdcf4fb94fd229 Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Sat, 23 Nov 2019 22:01:31 +0800 Subject: [PATCH 013/138] see 11/23 log --- CHANGELOG.md | 1 + build.gradle | 3 +- buildApp.gradle | 25 +- buildLib.gradle | 2 +- buildSrc/src/main/groovy/Config.groovy | 150 ++++------ buildSrc/src/main/groovy/ConfigUtils.groovy | 282 ++++-------------- buildSrc/src/main/groovy/DepConfig.groovy | 42 ++- buildSrc/src/main/groovy/GLog.groovy | 4 +- .../src/main/groovy/TaskDurationUtils.groovy | 86 ++++++ config.json | 27 ++ feature/launcher/app/build.gradle | 2 +- .../launcher/app/src/main/AndroidManifest.xml | 1 + feature/main/app/src/main/AndroidManifest.xml | 1 + feature/main/pkg/src/main/AndroidManifest.xml | 1 + .../java/com/blankj/main/pkg/MainActivity.kt | 5 + .../pkg/feature/pinyin/PinyinActivity.kt | 2 +- .../blankj/subutil/pkg/helper/DialogHelper.kt | 44 +-- .../utilcode/pkg/src/main/AndroidManifest.xml | 18 +- .../utilcode/pkg/feature/CoreUtilActivity.kt | 2 - .../pkg/feature/activity/ActivityActivity.kt | 16 +- .../feature/activity/SubActivityActivity.kt | 5 +- .../feature/adaptScreen/AdaptCloseActivity.kt | 3 +- .../adaptScreen/AdaptHeightActivity.kt | 3 +- .../feature/adaptScreen/AdaptWidthActivity.kt | 5 +- .../utilcode/pkg/feature/bar/BarActivity.kt | 16 +- .../pkg/feature/bar/BarStatusAlphaFragment.kt | 70 ----- .../pkg/feature/bar/BarStatusColorFragment.kt | 58 ---- .../feature/bar/BarStatusCustomFragment.kt | 43 --- .../feature/bar/BarStatusDrawerActivity.kt | 122 -------- .../feature/bar/BarStatusImageViewActivity.kt | 76 ----- .../feature/bar/BarStatusImageViewFragment.kt | 72 ----- .../feature/bar/{ => nav}/BarNavActivity.kt | 2 +- .../BarNotificationActivity.kt | 3 +- .../bar/{ => status}/BarStatusActivity.kt | 2 +- .../BarStatusActivityAlpha.kt} | 12 +- .../BarStatusActivityColor.kt} | 8 +- .../BarStatusActivityCustom.kt} | 11 +- .../bar/status/BarStatusActivityDrawer.kt | 111 +++++++ .../bar/status/BarStatusActivityImageView.kt | 63 ++++ .../fragment}/BarStatusFragmentActivity.kt | 24 +- .../status/fragment/BarStatusFragmentAlpha.kt | 68 +++++ .../status/fragment/BarStatusFragmentColor.kt | 59 ++++ .../fragment/BarStatusFragmentCustom.kt | 38 +++ .../fragment/BarStatusFragmentImageView.kt | 65 ++++ .../pkg/feature/bus/BusCompareActivity.kt | 10 +- .../pkg/feature/click/ClickActivity.kt | 123 +++++--- .../pkg/feature/fragment/ChildFragment.kt | 75 +++-- .../pkg/feature/fragment/ContainerFragment.kt | 208 +++++++------ .../pkg/feature/fragment/FragmentActivity.kt | 9 +- .../pkg/feature/fragment/RootFragment.kt | 11 +- .../pkg/feature/keyboard/KeyboardActivity.kt | 59 ++-- .../utilcode/pkg/feature/mvp/MvpActivity.java | 20 ++ .../pkg/feature/network/NetworkActivity.kt | 1 + .../feature/permission/PermissionActivity.kt | 7 +- .../utilcode/pkg/feature/span/SpanActivity.kt | 19 +- .../utilcode/pkg/helper/DialogHelper.kt | 216 +++++++++----- ...bottom_200.xml => slide_bottom_in_200.xml} | 0 ...ottom_200.xml => slide_bottom_out_200.xml} | 0 ..._left_1000.xml => slide_left_out_1000.xml} | 0 ...right_1000.xml => slide_right_in_1000.xml} | 0 .../main/res/drawable/keyboard_dialog_bg.xml | 10 + .../res/layout/activity_bar_status_alpha.xml | 32 -- .../res/layout/activity_bar_status_drawer.xml | 65 ---- .../layout/activity_bar_status_image_view.xml | 43 --- .../layout/activity_bar_status_swipe_back.xml | 53 ---- .../src/main/res/layout/activity_click.xml | 65 ---- ...activity_item_shared_element_activity.xml} | 0 .../src/main/res/layout/activity_keyboard.xml | 53 ---- ...vity_sub.xml => activity_sub_activity.xml} | 0 .../main/res/layout/activity_util_core.xml | 6 - ...ose.xml => adaptscreen_close_activity.xml} | 0 ...ht.xml => adaptscreen_height_activity.xml} | 0 ...dth.xml => adaptscreen_width_activity.xml} | 0 ...pha1.xml => bar_status_alpha_activity.xml} | 2 +- .../res/layout/bar_status_alpha_fragment.xml | 14 + .../res/layout/bar_status_color_fragment.xml | 14 + ...tom.xml => bar_status_custom_fragment.xml} | 0 .../res/layout/bar_status_drawer_activity.xml | 15 + ...t.xml => bar_status_fragment_activity.xml} | 2 +- .../layout/bar_status_image_view_activity.xml | 14 + .../layout/bar_status_image_view_fragment.xml | 27 ++ .../pkg/src/main/res/layout/dialog_screen.xml | 6 - ...ity_fragment.xml => fragment_activity.xml} | 2 +- .../res/layout/fragment_bar_status_alpha.xml | 44 --- .../res/layout/fragment_bar_status_color.xml | 35 --- .../layout/fragment_bar_status_image_view.xml | 51 ---- .../src/main/res/layout/fragment_child.xml | 36 +-- .../main/res/layout/fragment_container.xml | 80 +---- ...ialog_fragment.xml => fragment_dialog.xml} | 0 .../layout/fragment_item_shared_element.xml | 19 ++ .../pkg/src/main/res/layout/fragment_root.xml | 3 +- .../pkg/src/main/res/layout/item_image.xml | 18 -- .../src/main/res/layout/keyboard_activity.xml | 16 + ...ialog_keyboard.xml => keyboard_dialog.xml} | 7 +- .../pkg/src/main/res/layout/screen_dialog.xml | 15 + .../{activity_span.xml => span_activity.xml} | 0 .../{dialog_toast.xml => toast_dialog.xml} | 2 +- ...vigation_fragment.xml => fragment_nav.xml} | 0 ...tion_status_bar.xml => status_bar_nav.xml} | 0 .../pkg/src/main/res/values/strings.xml | 3 +- .../pkg/src/main/res/values/styles.xml | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- lib/base/build.gradle | 19 +- .../java/com/blankj/base/BaseActivity.java | 12 +- .../java/com/blankj/base/BaseApplication.java | 4 - .../java/com/blankj/base/BaseFragment.java | 100 +++++-- .../com/blankj/base/BaseLazyFragment.java | 38 --- .../main/java/com/blankj/base/IBaseView.java | 2 +- .../com/blankj/base/dialog/BaseDialog.java | 34 ++- .../base/dialog/BaseDialogFragment.java | 150 ++++++++++ .../blankj/base/dialog/DialogCallback.java | 21 ++ .../base/dialog/DialogLayoutCallback.java | 26 ++ .../src/main/res/layout/fragment_lazy.xml | 5 + lib/common/build.gradle | 2 +- .../common/activity/CommonActivity.java | 51 ++-- .../activity/CommonActivityDrawerView.java | 10 +- .../activity/CommonActivityItemsView.java | 8 +- .../activity/CommonActivityTitleView.java | 12 +- .../common/dialog/CommonDialogContent.java | 113 +++++++ .../common/dialog/CommonDialogLoading.java | 60 ++++ .../common/dialog/CommonLoadingDialog.java | 32 -- .../common/fragment/CommonFragment.java | 77 ++++- .../res/drawable/common_content_dialog_bg.xml | 8 + .../drawable/common_content_dialog_btn_bg.xml | 6 +- .../src/main/res/drawable/common_splash.xml | 9 + .../common_activity_title_stub_scroll.xml | 1 + .../main/res/layout/common_dialog_content.xml | 73 +++++ ...mmon_activity_item.xml => common_item.xml} | 0 .../res/layout/common_item_title_click.xml | 3 +- .../res/layout/common_item_title_seekbar.xml | 2 +- .../res/layout/common_item_title_switch.xml | 2 +- lib/common/src/main/res/values/dimens.xml | 1 + lib/common/src/main/res/values/styles.xml | 29 +- lib/subutil/build.gradle | 18 +- lib/utilcode/README-CN.md | 1 + lib/utilcode/build.gradle | 18 +- .../com/blankj/utilcode/util/AppUtils.java | 2 +- .../com/blankj/utilcode/util/BarUtils.java | 48 ++- .../com/blankj/utilcode/util/ClickUtils.java | 23 +- .../blankj/utilcode/util/EncryptUtils.java | 42 +++ .../blankj/utilcode/util/FragmentUtils.java | 4 +- .../com/blankj/utilcode/util/IntentUtils.java | 2 +- .../blankj/utilcode/util/KeyboardUtils.java | 43 ++- .../blankj/utilcode/util/PermissionUtils.java | 2 + .../com/blankj/utilcode/util/ToastUtils.java | 22 +- .../blankj/utilcode/util/UiMessageUtils.java | 1 + .../java/com/blankj/utilcode/util/Utils.java | 3 +- .../src/main/res/values-v21/styles.xml | 2 +- .../utilcode/util/EncryptUtilsTest.java | 8 + lib/utildebug/build.gradle | 12 +- plugin/api-gradle-plugin/build.gradle | 16 +- plugin/bus-gradle-plugin/build.gradle | 16 +- .../profile/profile-2019-11-20-12-52-35.html | 144 +++++++++ .../profile/profile-2019-11-20-13-40-34.html | 144 +++++++++ .../profile/profile-2019-11-20-13-41-25.html | 144 +++++++++ .../profile/profile-2019-11-22-22-09-54.html | 144 +++++++++ .../profile/profile-2019-11-23-13-46-38.html | 220 ++++++++++++++ settings.gradle | 71 ++++- 158 files changed, 3188 insertions(+), 2041 deletions(-) create mode 100644 buildSrc/src/main/groovy/TaskDurationUtils.groovy create mode 100644 config.json delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => nav}/BarNavActivity.kt (98%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => notification}/BarNotificationActivity.kt (92%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => status}/BarStatusActivity.kt (97%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{BarStatusAlphaActivity.kt => status/BarStatusActivityAlpha.kt} (85%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{BarStatusColorActivity.kt => status/BarStatusActivityColor.kt} (90%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{BarStatusCustomActivity.kt => status/BarStatusActivityCustom.kt} (61%) create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => status/fragment}/BarStatusFragmentActivity.kt (82%) create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java rename feature/utilcode/pkg/src/main/res/anim/{slide_in_bottom_200.xml => slide_bottom_in_200.xml} (100%) rename feature/utilcode/pkg/src/main/res/anim/{slide_out_bottom_200.xml => slide_bottom_out_200.xml} (100%) rename feature/utilcode/pkg/src/main/res/anim/{slide_out_left_1000.xml => slide_left_out_1000.xml} (100%) rename feature/utilcode/pkg/src/main/res/anim/{slide_in_right_1000.xml => slide_right_in_1000.xml} (100%) create mode 100644 feature/utilcode/pkg/src/main/res/drawable/keyboard_dialog_bg.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_alpha.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_drawer.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_image_view.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_swipe_back.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_click.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_activity_item_iv.xml => activity_item_shared_element_activity.xml} (100%) delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_keyboard.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_activity_sub.xml => activity_sub_activity.xml} (100%) delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_util_core.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_adaptscreen_close.xml => adaptscreen_close_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{activity_adaptscreen_height.xml => adaptscreen_height_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{activity_adaptscreen_width.xml => adaptscreen_width_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{activity_bar_status_alpha1.xml => bar_status_alpha_activity.xml} (84%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_fragment.xml create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_color_fragment.xml rename feature/utilcode/pkg/src/main/res/layout/{fragment_bar_status_custom.xml => bar_status_custom_fragment.xml} (100%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_drawer_activity.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_bar_status_fragment.xml => bar_status_fragment_activity.xml} (94%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_activity.xml create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_fragment.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/dialog_screen.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_fragment.xml => fragment_activity.xml} (94%) delete mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_bar_status_alpha.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_bar_status_color.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_bar_status_image_view.xml rename feature/utilcode/pkg/src/main/res/layout/{dialog_fragment.xml => fragment_dialog.xml} (100%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_item_shared_element.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/item_image.xml create mode 100644 feature/utilcode/pkg/src/main/res/layout/keyboard_activity.xml rename feature/utilcode/pkg/src/main/res/layout/{dialog_keyboard.xml => keyboard_dialog.xml} (89%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/screen_dialog.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_span.xml => span_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{dialog_toast.xml => toast_dialog.xml} (89%) rename feature/utilcode/pkg/src/main/res/menu/{navigation_fragment.xml => fragment_nav.xml} (100%) rename feature/utilcode/pkg/src/main/res/menu/{navigation_status_bar.xml => status_bar_nav.xml} (100%) delete mode 100644 lib/base/src/main/java/com/blankj/base/BaseLazyFragment.java create mode 100644 lib/base/src/main/java/com/blankj/base/dialog/BaseDialogFragment.java create mode 100644 lib/base/src/main/java/com/blankj/base/dialog/DialogCallback.java create mode 100644 lib/base/src/main/java/com/blankj/base/dialog/DialogLayoutCallback.java create mode 100644 lib/base/src/main/res/layout/fragment_lazy.xml create mode 100644 lib/common/src/main/java/com/blankj/common/dialog/CommonDialogContent.java create mode 100644 lib/common/src/main/java/com/blankj/common/dialog/CommonDialogLoading.java delete mode 100644 lib/common/src/main/java/com/blankj/common/dialog/CommonLoadingDialog.java create mode 100644 lib/common/src/main/res/drawable/common_content_dialog_bg.xml rename feature/utilcode/pkg/src/main/res/drawable/click_shape_round_rect.xml => lib/common/src/main/res/drawable/common_content_dialog_btn_bg.xml (53%) create mode 100644 lib/common/src/main/res/drawable/common_splash.xml create mode 100644 lib/common/src/main/res/layout/common_dialog_content.xml rename lib/common/src/main/res/layout/{common_activity_item.xml => common_item.xml} (100%) create mode 100644 reports/profile/profile-2019-11-20-12-52-35.html create mode 100644 reports/profile/profile-2019-11-20-13-40-34.html create mode 100644 reports/profile/profile-2019-11-20-13-41-25.html create mode 100644 reports/profile/profile-2019-11-22-22-09-54.html create mode 100644 reports/profile/profile-2019-11-23-13-46-38.html diff --git a/CHANGELOG.md b/CHANGELOG.md index c9fa371e30..8b68339099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `19/11/22` [fix] Adapt the project for Gradle version of 6.0. * `19/10/30` [add] Publish bus plugin v2.3. Publish api plugin v1.1. * `19/10/24` [upd] Demo's UI. * `19/10/22` [add] NotificationUtils. diff --git a/build.gradle b/build.gradle index 1a9f672d5a..04628ed39a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ConfigUtils.init(gradle) repositories { // use for debug plugin local - if (Config.depConfig.plugin.bus.useLocal || Config.depConfig.plugin.api.useLocal) { + if (Config.depConfig.plugin_bus.useLocal || Config.depConfig.plugin_api.useLocal) { maven() { url new File("maven") } diff --git a/buildApp.gradle b/buildApp.gradle index c46f1805d1..5a3dfe3f3a 100644 --- a/buildApp.gradle +++ b/buildApp.gradle @@ -2,11 +2,11 @@ apply { plugin "com.android.application" plugin "kotlin-android" plugin "kotlin-android-extensions" - if (Config.depConfig.plugin.bus.isApply) { - plugin "com.blankj.bus" + if (Config.depConfig.plugin_bus.isApply) { + plugin Config.depConfig.plugin_bus.pluginId } - if (Config.depConfig.plugin.api.isApply) { - plugin "com.blankj.api" + if (Config.depConfig.plugin_api.isApply) { + plugin Config.depConfig.plugin_api.pluginId } } @@ -62,23 +62,20 @@ 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.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 - - debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:1.1.8' - releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:1.1.8' + debugImplementation Config.depConfig.lib_utildebug.dep + releaseImplementation Config.depConfig.lib_utildebug_no_op.dep // 根据 Config.pkgConfig 来依赖所有 pkg for (def entrySet : ConfigUtils.getApplyPkgs().entrySet()) { api entrySet.value.dep } - if (Config.depConfig.feature.mock.isApply) { - api Config.depConfig.feature.mock.dep + if (Config.depConfig.feature_mock.isApply) { + api Config.depConfig.feature_mock.dep } } diff --git a/buildLib.gradle b/buildLib.gradle index f6342eea02..6dc9b18b2b 100644 --- a/buildLib.gradle +++ b/buildLib.gradle @@ -38,6 +38,6 @@ dependencies { api entrySet.value.dep } } else if (project.name == 'export') { - api Config.depConfig.lib.common.dep + api Config.depConfig.lib_common.dep } } \ No newline at end of file diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index 2116991668..311b13a1fe 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -18,100 +18,70 @@ class Config { static versionName = '1.25.10-alpha5'// E.g. 1.9.72 => 1,009,072 // lib version - static kotlin_version = '1.3.10' + static kotlin_version = '1.3.50' static support_version = '28.0.0' static leakcanary_version = '1.6.3' - // appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher - static appConfig = ['launcher'] - // pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空 - static pkgConfig = [] - static depConfig = [ - plugin : [ - gradle : new DepConfig("com.android.tools.build:gradle:3.4.2"), - kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"), - maven : new DepConfig("com.github.dcendents:android-maven-gradle-plugin:2.1"),// 上传到 maven - bintray: new DepConfig("com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4"),// 上传到 bintray - traute : new DepConfig("tech.harmonysoft:traute-gradle:1.1.10"),// 注解转非空判断 - - // 本地第一次上传插件新的版本需设置 useLocal = true, isApply = false - // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false - // 发布版本的话把 useLocal = false, isApply = false,更新版本号,发布成功后 isApply = true 即可使用远程库版本 - api : new DepConfig(false/*是否本地调试*/, "com.blankj:api-gradle-plugin:1.1", true/*是否使用插件*/), - bus : new DepConfig(false/*是否本地调试*/, "com.blankj:bus-gradle-plugin:2.3", true/*是否使用插件*/), - ], - - api_gradle_plugin: new DepConfig(":plugin:api-gradle-plugin", false), - bus_gradle_plugin: new DepConfig(":plugin:bus-gradle-plugin", false), - - feature : [ - mock : new DepConfig(":feature:mock"), - - launcher: [ - app: new DepConfig(":feature:launcher:app") - ], - - main : [ - app: new DepConfig(":feature:main:app"), - pkg: new DepConfig(":feature:main:pkg"), - ], - - subutil : [ - app : new DepConfig(":feature:subutil:app"), - pkg : new DepConfig(":feature:subutil:pkg"), - export: new DepConfig(":feature:subutil:export"), - ], - - utilcode: [ - app : new DepConfig(":feature:utilcode:app"), - pkg : new DepConfig(":feature:utilcode:pkg"), - export: new DepConfig(":feature:utilcode:export"), - ], - ], - - lib : [ - base : new DepConfig(":lib:base"), - common : new DepConfig(":lib:common"), - subutil : new DepConfig(":lib:subutil"), - utilcode : new DepConfig(true/*是否本地调试*/, ":lib:utilcode", "com.blankj:utilcode:$versionName"), - - utildebug : new DepConfig(true/*是否本地调试*/, ":lib:utildebug", "com.blankj:utildebug:$versionName"), - utildebug_no_op: new DepConfig(true/*是否本地调试*/, ":lib:utildebug-no-op", "com.blankj:utildebug-no-op:$versionName"), - ], - - support : [ - appcompat_v7: new DepConfig("com.android.support:appcompat-v7:$support_version"), - design : new DepConfig("com.android.support:design:$support_version"), - multidex : new DepConfig("com.android.support:multidex:1.0.2"), - constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"), - ], - - kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"), - - leakcanary : [ - android : new DepConfig("com.squareup.leakcanary:leakcanary-android:$leakcanary_version"), - android_no_op : new DepConfig("com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version"), - support_fragment: new DepConfig("com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version"), - ], - - free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"), - swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), - - gson : new DepConfig("com.google.code.gson:gson:2.8.6"), - glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"), - retrofit : new DepConfig("com.squareup.retrofit2:retrofit:2.4.0"), - commons_io : new DepConfig("commons-io:commons-io:2.6"), - eventbus : [ - lib : new DepConfig("org.greenrobot:eventbus:3.1.1"), - processor: new DepConfig("org.greenrobot:eventbus-annotation-processor:3.0.1") - ], - photo_view : new DepConfig("com.github.chrisbanes:PhotoView:2.0.0"), - - test : [ - junit : new DepConfig("junit:junit:4.12"), - robolectric: new DepConfig("org.robolectric:robolectric:4.2"), - ], + /*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.25.10-alpha5"), + lib_utildebug : new DepConfig(true, true, ":lib:utildebug", "com.blankj:utildebug:1.25.10-alpha5"), + lib_utildebug_no_op : new DepConfig(true, true, ":lib:utildebug-no-op", "com.blankj:utildebug-no-op:1.25.10-alpha5"), + /*Never delete this line*/ + plugin_gradle : new DepConfig(pluginPath: "com.android.tools.build:gradle:3.5.2"), + plugin_kotlin : new DepConfig(pluginPath: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"), + plugin_maven : new DepConfig(pluginPath: "com.github.dcendents:android-maven-gradle-plugin:2.1", pluginId: "com.github.dcendents.android-maven"),// 上传到 maven + plugin_bintray : new DepConfig(pluginPath: "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4", pluginId: "com.jfrog.bintray"),// 上传到 bintray + plugin_traute : new DepConfig(pluginPath: "tech.harmonysoft:traute-gradle:1.1.10", pluginId: "tech.harmonysoft.oss.traute"),// 注解转非空判断 + + // 本地第一次上传插件新的版本需设置 useLocal = true, isApply = false + // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false + // 发布版本的话把 useLocal = false, isApply = false,更新版本号,发布成功后 isApply = true 即可使用远程库版本 + plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.1", pluginId: "com.blankj.api"), + plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.3", pluginId: "com.blankj.bus"), + + support_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$support_version"), + support_design : new DepConfig("com.android.support:design:$support_version"), + support_multidex : new DepConfig("com.android.support:multidex:1.0.2"), + support_constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"), + + kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"), + + 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"), + + free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"), + swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), + + gson : new DepConfig("com.google.code.gson:gson:2.8.6"), + glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"), + retrofit : new DepConfig("com.squareup.retrofit2:retrofit:2.4.0"), + commons_io : new DepConfig("commons-io:commons-io:2.6"), + + eventbus_lib : new DepConfig("org.greenrobot:eventbus:3.1.1"), + eventbus_processor : new DepConfig("org.greenrobot:eventbus-annotation-processor:3.0.1"), + + 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"), ] } //./gradlew clean :lib:utilcode:bintrayUpload \ No newline at end of file diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy index 78c239911e..908f9d72e3 100644 --- a/buildSrc/src/main/groovy/ConfigUtils.groovy +++ b/buildSrc/src/main/groovy/ConfigUtils.groovy @@ -1,16 +1,7 @@ -import org.apache.commons.io.FileUtils -import org.gradle.BuildListener -import org.gradle.BuildResult import org.gradle.api.Project import org.gradle.api.ProjectEvaluationListener import org.gradle.api.ProjectState -import org.gradle.api.Task -import org.gradle.api.execution.TaskExecutionListener -import org.gradle.api.initialization.Settings import org.gradle.api.invocation.Gradle -import org.gradle.api.tasks.TaskState - -import java.text.SimpleDateFormat /** *
@@ -22,235 +13,94 @@ import java.text.SimpleDateFormat
  */
 class ConfigUtils {
 
-    static getApplyPlugins() {
-        def plugins = getDepConfigByFilter(new DepConfigFilter() {
-            @Override
-            boolean accept(String name, DepConfig config) {
-                if (!name.startsWith("plugin.")) return false
-                if (!config.isApply) return false
-                return true
-            }
-        })
-        GLog.d("getApplyPlugins = ${GLog.object2String(plugins)}")
-        return plugins
+    static init(Gradle gradle) {
+        generateDep(gradle)
+        addCommonGradle(gradle)
+        TaskDurationUtils.init(gradle)
+        GitUtils.init(gradle)
     }
 
-    static getApplyPkgs() {
-        def applyPkgs = getDepConfigByFilter(new DepConfigFilter() {
-            @Override
-            boolean accept(String name, DepConfig config) {
-                if (!config.isApply) return false
-                return name.endsWith(".pkg")
+    /**
+     * 根据 depConfig 生成 dep
+     */
+    private static void generateDep(Gradle gradle) {
+        def configs = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            def (name, config) = [entry.key, entry.value]
+            if (name.startsWith("plugin_")) {
+                config.dep = config.pluginPath
+            } else {
+                if (config.useLocal) {
+                    config.dep = gradle.rootProject.findProject(config.localPath)
+                } else {
+                    config.dep = config.remotePath
+                }
             }
-        })
-        GLog.d("getApplyPkgs = ${GLog.object2String(applyPkgs)}")
-        return applyPkgs
+            configs.put(name, config)
+        }
+        GLog.l("generateDep = ${GLog.object2String(configs)}")
     }
 
-    static getApplyExports() {
-        def applyExports = getDepConfigByFilter(new DepConfigFilter() {
+    private static addCommonGradle(Gradle gradle) {
+        gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
             @Override
-            boolean accept(String name, DepConfig config) {
-                if (!config.isApply) return false
-                return name.endsWith(".export")
-            }
-        })
-        GLog.d("getApplyExports = ${GLog.object2String(applyExports)}")
-        return applyExports
-    }
-
-    static addBuildListener(Gradle gradle) {
-        gradle.addBuildListener(new ConfigBuildListener())
-        GitUtils.init(gradle)
-    }
-
-    private static class ConfigBuildListener implements BuildListener {
-
-        private List taskInfoList = []
-        private long startBuildMillis
-
-        @Override
-        void buildStarted(Gradle gradle) {}
-
-        @Override
-        void settingsEvaluated(Settings settings) {
-            startBuildMillis = System.currentTimeMillis()
-            GLog.d("settingsEvaluated")
-            includeModule(settings)
-        }
-
-        @Override
-        void projectsLoaded(Gradle gradle) {
-            GLog.d("projectsLoaded")
-            generateDep(gradle)
-
-            gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
-                @Override
-                void beforeEvaluate(Project project) {
-                    if (project.subprojects.isEmpty()) {
-                        if (project.path.contains(":plugin:")) {
-                            return
+            void beforeEvaluate(Project project) {
+                // 在 project 的 build.gradle 前 do sth.
+                if (project.subprojects.isEmpty()) {
+                    if (project.path.contains(":plugin:")) {
+                        return
+                    }
+                    if (project.name == "app") {
+                        GLog.l(project.toString() + " applies buildApp.gradle")
+                        project.apply {
+                            from "${project.rootDir.path}/buildApp.gradle"
                         }
-                        if (project.name == "app") {
-                            GLog.l(project.toString() + " applies buildApp.gradle")
-                            project.apply {
-                                from "${project.rootDir.path}/buildApp.gradle"
-                            }
-                        } else {
-                            GLog.l(project.toString() + " applies buildLib.gradle")
-                            project.apply {
-                                from "${project.rootDir.path}/buildLib.gradle"
-                            }
+                    } else {
+                        GLog.l(project.toString() + " applies buildLib.gradle")
+                        project.apply {
+                            from "${project.rootDir.path}/buildLib.gradle"
                         }
                     }
                 }
-
-                @Override
-                void afterEvaluate(Project project, ProjectState projectState) {
-                }
-            })
-        }
-
-        @Override
-        void projectsEvaluated(Gradle gradle) {
-            GLog.d("projectsEvaluated")
-
-            gradle.addListener(new TaskExecutionListener() {
-                @Override
-                void beforeExecute(Task task) {
-                    task.ext.startTime = System.currentTimeMillis()
-                }
-
-                @Override
-                void afterExecute(Task task, TaskState state) {
-                    def exeDuration = System.currentTimeMillis() - task.ext.startTime
-                    if (exeDuration >= 100) {
-                        taskInfoList.add(new TaskInfo(task, exeDuration))
-                    }
-                }
-            })
-        }
-
-        @Override
-        void buildFinished(BuildResult result) {
-            GLog.d("buildFinished")
-            if (!taskInfoList.isEmpty()) {
-                Collections.sort(taskInfoList, new Comparator() {
-                    @Override
-                    int compare(TaskInfo t, TaskInfo t1) {
-                        return t1.exeDuration - t.exeDuration
-                    }
-                })
-                StringBuilder sb = new StringBuilder()
-                int buildSec = (System.currentTimeMillis() - startBuildMillis) / 1000;
-                int m = buildSec / 60;
-                int s = buildSec % 60;
-                def timeInfo = (m == 0 ? "${s}s" : "${m}m ${s}s (${buildSec}s)")
-                sb.append("BUILD FINISHED in $timeInfo\n")
-                taskInfoList.each {
-                    sb.append(String.format("%7sms %s\n", it.exeDuration, it.task.path))
-                }
-                def content = sb.toString()
-                GLog.l(content)
-                File file = new File(result.gradle.rootProject.buildDir.getAbsolutePath(),
-                        "build_time_records_" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".txt")
-                FileUtils.write(file, content)
             }
-        }
 
-        /**
-         * 在 settings.gradle 中 根据 appConfig 和 pkgConfig 来 include 本地模块
-         */
-        private static includeModule(Settings settings) {
-            if (Config.pkgConfig.isEmpty()) {
-                Config.depConfig.feature.mock.isApply = false
+            @Override
+            void afterEvaluate(Project project, ProjectState state) {
+                // 在 project 的 build.gradle 末 do sth.
             }
-            def config = getDepConfigByFilter(new DepConfigFilter() {
-                @Override
-                boolean accept(String name, DepConfig config) {
-                    if (name.endsWith('.app')) {
-                        def appName = name.substring('feature.'.length(), name.length() - 4)
-                        if (!Config.appConfig.contains(appName)) {
-                            config.isApply = false
-                        }
-                    }
-                    if (name.endsWith('.pkg')) {
-                        if (!Config.pkgConfig.isEmpty()) {
-                            def pkgName = name.substring('feature.'.length(), name.length() - 4)
-                            if (!Config.pkgConfig.contains(pkgName)) {
-                                config.isApply = false
-                            }
-                        }
-                    }
+        })
+    }
 
-                    if (!config.isApply) return false
-                    if (!config.useLocal) return false
-                    if (config.localPath == "") return false
-                    return true
-                }
-            }).each { _, cfg ->
-                settings.include cfg.localPath
+    static getApplyPlugins() {
+        def plugins = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            if (entry.value.isApply && entry.key.startsWith("plugin_")) {
+                plugins.put(entry.key, entry.value)
             }
-            GLog.l("includeModule = ${GLog.object2String(config)}")
         }
+        GLog.d("getApplyPlugins = ${GLog.object2String(plugins)}")
+        return plugins
+    }
 
-        /**
-         * 根据 depConfig 生成 dep
-         */
-        private static generateDep(Gradle gradle) {
-            def config = getDepConfigByFilter(new DepConfigFilter() {
-                @Override
-                boolean accept(String name, DepConfig config) {
-                    if (name.startsWith("plugin.")) {
-                        config.dep = config.remotePath
-                        return true
-                    }
-                    if (config.useLocal) {
-                        config.dep = gradle.rootProject.findProject(config.localPath)
-                    } else {
-                        config.dep = config.remotePath
-                    }
-                    return true
-                }
-            })
-            GLog.l("generateDep = ${GLog.object2String(config)}")
-        }
-
-        private static class TaskInfo {
-
-            Task task
-            long exeDuration
-
-            TaskInfo(Task task, long exeDuration) {
-                this.task = task
-                this.exeDuration = exeDuration
+    static getApplyPkgs() {
+        def pkgs = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            if (entry.value.isApply && entry.key.endsWith("_pkg")) {
+                pkgs.put(entry.key, entry.value)
             }
         }
+        GLog.d("getApplyPkgs = ${GLog.object2String(pkgs)}")
+        return pkgs
     }
 
-    static Map getDepConfigByFilter(DepConfigFilter filter) {
-        return _getDepConfigByFilter("", Config.depConfig, filter)
-    }
-
-    private static _getDepConfigByFilter(String namePrefix, Map map, DepConfigFilter filter) {
-        def depConfigList = [:]
-        for (Map.Entry entry : map.entrySet()) {
-            def (name, value) = [entry.getKey(), entry.getValue()]
-            if (value instanceof Map) {
-                namePrefix += (name + '.')
-                depConfigList.putAll(_getDepConfigByFilter(namePrefix, value, filter))
-                namePrefix -= (name + '.')
-                continue
-            }
-            def config = value as DepConfig
-            if (filter == null || filter.accept(namePrefix + name, config)) {
-                depConfigList.put(namePrefix + name, config)
+    static getApplyExports() {
+        def exports = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            if (entry.value.isApply && entry.key.endsWith("_export")) {
+                exports.put(entry.key, entry.value)
             }
         }
-        return depConfigList
-    }
-
-    interface DepConfigFilter {
-        boolean accept(String name, DepConfig config);
+        GLog.d("getApplyExports = ${GLog.object2String(exports)}")
+        return exports
     }
 }
diff --git a/buildSrc/src/main/groovy/DepConfig.groovy b/buildSrc/src/main/groovy/DepConfig.groovy
index 86e56578cf..a50596e788 100644
--- a/buildSrc/src/main/groovy/DepConfig.groovy
+++ b/buildSrc/src/main/groovy/DepConfig.groovy
@@ -7,18 +7,23 @@
  * 
*/ class DepConfig { + boolean isApply // 是否应用 boolean useLocal // 是否使用本地的 String localPath // 本地路径 String remotePath// 远程路径 - boolean isApply // 是否应用 - String path // 最后的路径 + String pluginPath// 插件路径 + String pluginId // 插件 ID def dep // 根据条件生成项目最终的依赖项 + DepConfig() { + isApply = true + } + DepConfig(String path) { - this(path, true) + this(true, path) } - DepConfig(String path, boolean isApply) { + DepConfig(boolean isApply, String path) { if (path.startsWith(":")) { this.useLocal = true this.localPath = path @@ -28,23 +33,26 @@ class DepConfig { this.remotePath = path this.isApply = isApply } - this.path = path } - DepConfig(boolean useLocal, String path, boolean isApply) { // 自定义插件的构造函数 - this(useLocal, "", path, isApply) + DepConfig(boolean useLocal, String localPath, String remotePath) { + this(true, useLocal, localPath, remotePath) } - DepConfig(boolean useLocal, String localPath, String remotePath) { - this(useLocal, localPath, remotePath, true) + DepConfig(boolean isApply, boolean useLocal, String localPath) { + this(isApply, useLocal, localPath, null) } - DepConfig(boolean useLocal, String localPath, String remotePath, boolean isApply) { + DepConfig(boolean isApply, boolean useLocal, String localPath, String remotePath) { + this.isApply = isApply this.useLocal = useLocal this.localPath = localPath this.remotePath = remotePath - this.isApply = isApply - this.path = useLocal ? localPath : remotePath + } + + String getPath() { + if (pluginPath != null) return pluginPath + return useLocal ? localPath : remotePath } String getGroupId() { @@ -62,13 +70,15 @@ class DepConfig { return splits.length == 3 ? splits[2] : null } - @Override String toString() { - return "DepConfig { " + - "useLocal = " + useLocal + + return "{ isApply = ${getFlag(isApply)}" + + ", useLocal = ${getFlag(useLocal)}" + (dep == null ? ", path = " + path : (", dep = " + dep)) + - ", isApply = " + isApply + " }" } + + static String getFlag(boolean b) { + return b ? "✅" : "❌" + } } \ No newline at end of file diff --git a/buildSrc/src/main/groovy/GLog.groovy b/buildSrc/src/main/groovy/GLog.groovy index 3a6d835540..6a5554fc46 100644 --- a/buildSrc/src/main/groovy/GLog.groovy +++ b/buildSrc/src/main/groovy/GLog.groovy @@ -1,5 +1,3 @@ -import org.gradle.internal.impldep.org.apache.http.util.EntityUtils - /** *
  *     author: blankj
@@ -93,7 +91,7 @@ class GLog {
             sb.append("[")
             list.each { v ->
                 if (v instanceof Map || v instanceof List) {
-                    sb.append(String.format("$LogConst.LINE_SEP%${deep++ * 8}s${object2String(v)},", "", k))
+                    sb.append(String.format("$LogConst.LINE_SEP%${deep++ * 8}s${object2String(v)},", ""))
                     deep--
                 } else {
                     sb.append(String.format("$LogConst.LINE_SEP%${deep * 8}s$v,", ""))
diff --git a/buildSrc/src/main/groovy/TaskDurationUtils.groovy b/buildSrc/src/main/groovy/TaskDurationUtils.groovy
new file mode 100644
index 0000000000..48b2d2b6cc
--- /dev/null
+++ b/buildSrc/src/main/groovy/TaskDurationUtils.groovy
@@ -0,0 +1,86 @@
+import org.gradle.BuildListener
+import org.gradle.BuildResult
+import org.gradle.api.Task
+import org.gradle.api.execution.TaskExecutionListener
+import org.gradle.api.initialization.Settings
+import org.gradle.api.invocation.Gradle
+import org.gradle.api.tasks.TaskState
+
+import java.text.SimpleDateFormat
+
+/**
+ * 
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/11/22
+ *     desc  :
+ * 
+ */ +class TaskDurationUtils { + + static List taskInfoList = [] + static long startMillis + + static init(Gradle grd) { + startMillis = System.currentTimeMillis() + grd.addListener(new TaskExecutionListener() { + @Override + void beforeExecute(Task task) { + task.ext.startTime = System.currentTimeMillis() + } + + @Override + void afterExecute(Task task, TaskState state) { + def exeDuration = System.currentTimeMillis() - task.ext.startTime + if (exeDuration >= 100) { + taskInfoList.add(new TaskInfo(task: task, exeDuration: exeDuration)) + } + } + }) + grd.addBuildListener(new BuildListener() { + @Override + void buildStarted(Gradle gradle) {} + + @Override + void settingsEvaluated(Settings settings) {} + + @Override + void projectsLoaded(Gradle gradle) {} + + @Override + void projectsEvaluated(Gradle gradle) {} + + @Override + void buildFinished(BuildResult buildResult) { + if (!taskInfoList.isEmpty()) { + Collections.sort(taskInfoList, new Comparator() { + @Override + int compare(TaskInfo t, TaskInfo t1) { + return t1.exeDuration - t.exeDuration + } + }) + StringBuilder sb = new StringBuilder() + int buildSec = (System.currentTimeMillis() - startMillis) / 1000; + int m = buildSec / 60; + int s = buildSec % 60; + def timeInfo = (m == 0 ? "${s}s" : "${m}m ${s}s (${buildSec}s)") + sb.append("BUILD FINISHED in $timeInfo\n") + taskInfoList.each { + sb.append(String.format("%7sms %s\n", it.exeDuration, it.task.path)) + } + def content = sb.toString() + GLog.d(content) + File file = new File(grd.rootProject.buildDir.getAbsolutePath(), + "build_time_records_" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".txt") + file.getParentFile().mkdirs() + file.write(content) + } + } + }) + } + + private static class TaskInfo { + Task task + long exeDuration + } +} diff --git a/config.json b/config.json new file mode 100644 index 0000000000..38f147e8bb --- /dev/null +++ b/config.json @@ -0,0 +1,27 @@ +{ + "appConfigDesc": "appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher", + "appConfig": ["launcher"], + "pkgConfigDesc": "pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空", + "pkgConfig": [], + "proConfigDesc": "proConfig 配置的是使用本地还是仓库,优先级低于 appConfig 和 pkgConfig", + "proConfig": [ + {"isApply": false, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"}, + {"isApply": false, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:mock"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:launcher:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:main:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:main:pkg"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:pkg"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:export"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:pkg"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:export"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:base"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:common"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:subutil"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:utilcode", "remotePath": "com.blankj:utilcode:1.25.10-alpha5"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:utildebug", "remotePath": "com.blankj:utildebug:1.25.10-alpha5"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:utildebug-no-op", "remotePath": "com.blankj:utildebug-no-op:1.25.10-alpha5"} + ] +} diff --git a/feature/launcher/app/build.gradle b/feature/launcher/app/build.gradle index 9320e2df30..408db62a67 100644 --- a/feature/launcher/app/build.gradle +++ b/feature/launcher/app/build.gradle @@ -1,5 +1,5 @@ apply plugin: 'kotlin-kapt' dependencies { - kapt Config.depConfig.eventbus.processor.dep + kapt Config.depConfig.eventbus_processor.dep } \ No newline at end of file diff --git a/feature/launcher/app/src/main/AndroidManifest.xml b/feature/launcher/app/src/main/AndroidManifest.xml index b683051e68..19f6313965 100644 --- a/feature/launcher/app/src/main/AndroidManifest.xml +++ b/feature/launcher/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:name="com.blankj.main.pkg.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="user" + android:theme="@style/SplashTheme" android:windowSoftInputMode="stateHidden"> diff --git a/feature/main/app/src/main/AndroidManifest.xml b/feature/main/app/src/main/AndroidManifest.xml index 5ccc1079c0..bb8c3398d4 100644 --- a/feature/main/app/src/main/AndroidManifest.xml +++ b/feature/main/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:name="com.blankj.main.pkg.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="user" + android:theme="@style/SplashTheme" android:windowSoftInputMode="stateHidden"> diff --git a/feature/main/pkg/src/main/AndroidManifest.xml b/feature/main/pkg/src/main/AndroidManifest.xml index 5edb00cecb..1cfdba8f69 100644 --- a/feature/main/pkg/src/main/AndroidManifest.xml +++ b/feature/main/pkg/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="user" + android:theme="@style/SplashTheme" android:windowSoftInputMode="stateHidden" /> diff --git a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt index 815e861424..228abbf0a5 100644 --- a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt +++ b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt @@ -38,6 +38,11 @@ class MainActivity : CommonActivity() { return R.layout.activity_main } + override fun onCreate(savedInstanceState: Bundle?) { + window.setBackgroundDrawable(null) + super.onCreate(savedInstanceState) + } + override fun initView(savedInstanceState: Bundle?, contentView: View?) { super.initView(savedInstanceState, contentView) setCommonItems(mainRv, CollectionUtils.newArrayList>( diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt index 31287e4ba8..648dcb295d 100644 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt +++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt @@ -40,7 +40,7 @@ class PinyinActivity : CommonActivity() { for (i in 0 until size) { val surname = surnames[i].toString() sb.append(String.format( - "\n%s 正确: %-6s 错误: %-6s", + "\n%s 正确: %-8s 错误: %-8s", surname, PinyinUtils.getSurnamePinyin(surname), PinyinUtils.ccs2Pinyin(surname) diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt index 45e67a4a0d..bb891aeb06 100644 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt +++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt @@ -1,10 +1,14 @@ package com.blankj.subutil.pkg.helper -import android.support.v7.app.AlertDialog +import android.support.v4.app.FragmentActivity +import android.util.Pair +import android.view.View +import com.blankj.common.dialog.CommonDialogContent import com.blankj.subutil.pkg.R import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.PermissionUtils import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest +import com.blankj.utilcode.util.StringUtils /** * ``` @@ -17,29 +21,29 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques object DialogHelper { fun showRationaleDialog(shouldRequest: ShouldRequest) { - val topActivity = ActivityUtils.getTopActivity() - if (topActivity == null || topActivity.isFinishing) return - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_rationale_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> shouldRequest.again(true) } - .setNegativeButton(android.R.string.cancel) { dialog, which -> shouldRequest.again(false) } - .setCancelable(false) - .create() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity?, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_rationale_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + shouldRequest.again(true) + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + shouldRequest.again(false) + })) .show() - } fun showOpenAppSettingDialog() { - val topActivity = ActivityUtils.getTopActivity() - if (topActivity == null || topActivity.isFinishing) return - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_denied_forever_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> PermissionUtils.launchAppDetailsSettings() } - .setNegativeButton(android.R.string.cancel) { dialog, which -> } - .setCancelable(false) - .create() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity?, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_denied_forever_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + PermissionUtils.launchAppDetailsSettings() + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + })) .show() } } diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml index a96d44628c..24d52d5fb8 100644 --- a/feature/utilcode/pkg/src/main/AndroidManifest.xml +++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml @@ -83,39 +83,39 @@ android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTop" /> return ActivityOptionsCompat.makeCustomAnimation(this, - R.anim.slide_in_right_1000, - R.anim.slide_out_left_1000) + R.anim.slide_right_in_1000, + R.anim.slide_left_out_1000) .toBundle() 1 -> return ActivityOptionsCompat.makeScaleUpAnimation(activityItem.element, activityItem.element.width / 2, @@ -185,12 +181,10 @@ class ActivityItem : CommonItem { lateinit var element: ImageView; - constructor() : super(R.layout.activity_activity_item_iv) + constructor() : super(R.layout.activity_item_shared_element_activity) override fun bind(holder: ItemViewHolder, position: Int) { super.bind(holder, position) - if (isViewType(R.layout.activity_activity_item_iv)) { - element = holder.findViewById(R.id.activityViewSharedElement) - } + element = holder.findViewById(R.id.activityViewSharedElement) } } \ No newline at end of file diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt index 7d5812371a..9c972d6234 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt @@ -8,7 +8,7 @@ import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.ColorUtils -import kotlinx.android.synthetic.main.activity_activity_sub.* +import kotlinx.android.synthetic.main.activity_sub_activity.* /** @@ -22,7 +22,7 @@ import kotlinx.android.synthetic.main.activity_activity_sub.* class SubActivityActivity : CommonActivity() { override fun bindLayout(): Int { - return R.layout.activity_activity_sub + return R.layout.activity_sub_activity } override fun bindTitleRes(): Int { @@ -30,6 +30,7 @@ class SubActivityActivity : CommonActivity() { } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) contentView?.setBackgroundColor(ColorUtils.getRandomColor(false)) activityViewSharedElement.setOnClickListener { val result = Intent() diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt index 3e1a92a743..007724289c 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt @@ -20,10 +20,11 @@ class AdaptCloseActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_adaptscreen_close + return R.layout.adaptscreen_close_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt index 7e885f1c46..6f312e4cd9 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt @@ -20,10 +20,11 @@ class AdaptHeightActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_adaptscreen_height + return R.layout.adaptscreen_height_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt index 070f2a772c..6ccd3f45a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt @@ -10,7 +10,7 @@ import android.view.WindowManager import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.AdaptScreenUtils -import kotlinx.android.synthetic.main.activity_adaptscreen_width.* +import kotlinx.android.synthetic.main.adaptscreen_width_activity.* class AdaptWidthActivity : CommonActivity() { @@ -22,10 +22,11 @@ class AdaptWidthActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_adaptscreen_width + return R.layout.adaptscreen_width_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) adaptScreenWidthWebView.setBackgroundColor(Color.parseColor("#f0d26d")) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt index 1a188dc4fc..26801106a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt @@ -3,12 +3,14 @@ package com.blankj.utilcode.pkg.feature.bar 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.CommonItemTitle import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.pkg.feature.bar.nav.BarNavActivity +import com.blankj.utilcode.pkg.feature.bar.notification.BarNotificationActivity +import com.blankj.utilcode.pkg.feature.bar.status.* +import com.blankj.utilcode.pkg.feature.bar.status.fragment.BarStatusFragmentActivity import com.blankj.utilcode.util.CollectionUtils /** @@ -39,22 +41,22 @@ class BarActivity : CommonActivity() { BarStatusActivity.start(this) }, CommonItemClick(R.string.bar_status_set_color, true) { - BarStatusColorActivity.start(this) + BarStatusActivityColor.start(this) }, CommonItemClick(R.string.bar_status_set_alpha, true) { - BarStatusAlphaActivity.start(this) + BarStatusActivityAlpha.start(this) }, CommonItemClick(R.string.bar_status_set_image_view, true) { - BarStatusImageViewActivity.start(this) + BarStatusActivityImageView.start(this) }, CommonItemClick(R.string.bar_status_set_custom, true) { - BarStatusCustomActivity.start(this) + BarStatusActivityCustom.start(this) }, CommonItemClick(R.string.bar_status_set_fragment, true) { BarStatusFragmentActivity.start(this) }, CommonItemClick(R.string.bar_status_set_drawer, true) { - BarStatusDrawerActivity.start(this) + BarStatusActivityDrawer.start(this) }, CommonItemTitle(R.string.bar_about_notification_bar, true), CommonItemClick(R.string.bar_notification_about, true) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt deleted file mode 100644 index a4df4901cf..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.SeekBar -import com.blankj.base.BaseLazyFragment -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_alpha.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusAlphaFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusAlphaFragment { - return BarStatusAlphaFragment() - } - } - - private var mAlpha: Int = 112 - - private val translucentListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - barStatusAlphaFragmentAboutTv.text = mAlpha.toString() - updateFakeStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - override fun initData(bundle: Bundle?) {} - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_alpha - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusAlphaFragmentSetTransparentBtn) - barStatusAlphaFragmentChangeAlphaSb.setOnSeekBarChangeListener(translucentListener) - barStatusAlphaFragmentAboutTv.text = mAlpha.toString() - - updateFakeStatusBar() - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusAlphaSetTransparentBtn -> barStatusAlphaFragmentChangeAlphaSb.progress = 0 - } - } - - fun updateFakeStatusBar() { - BarUtils.setStatusBarColor(barStatusAlphaFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt deleted file mode 100644 index 756109421c..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.os.Bundle -import android.view.View -import com.blankj.base.BaseLazyFragment -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.ColorUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_color.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusColorFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusColorFragment { - return BarStatusColorFragment() - } - } - - private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary) - - override fun initData(bundle: Bundle?) {} - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_color - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusColorFragmentRandomColorBtn) - updateFakeStatusBar() - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusColorFragmentRandomColorBtn -> { - mColor = ColorUtils.getRandomColor() - updateFakeStatusBar() - } - } - } - - private fun updateFakeStatusBar() { - BarUtils.setStatusBarColor(barStatusColorFragmentFakeStatusBar, mColor) - barStatusColorFragmentAboutColorTv.text = String.format(ColorUtils.int2ArgbString(mColor)) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt deleted file mode 100644 index 4a3d38d099..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.os.Bundle -import android.view.View -import com.blankj.base.BaseLazyFragment - -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_custom.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusCustomFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusCustomFragment { - return BarStatusCustomFragment() - } - } - - override fun initData(bundle: Bundle?) {} - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_custom - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - BarUtils.setStatusBarCustom(barStatusCustomFragmentFakeStatusBar) - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) {} -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt deleted file mode 100644 index 8f2fb17bb8..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt +++ /dev/null @@ -1,122 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.content.Context -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.CompoundButton -import android.widget.SeekBar -import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityDrawerView -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.ColorUtils -import kotlinx.android.synthetic.main.activity_bar_status_drawer.* - - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : demo about BarUtils - * ``` - */ -class BarStatusDrawerActivity : CommonActivity() { - - companion object { - fun start(context: Context) { - val starter = Intent(context, BarStatusDrawerActivity::class.java) - context.startActivity(starter) - } - } - - override fun bindDrawer(): Boolean { - return true - } - - private var mColor: Int = 0 - private var mAlpha: Int = 0 - - private val mColorListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - updateStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - private var mAlphaCheckedChangeListener: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { _, isChecked -> - if (isChecked) { - barStatusDrawerChangeAlphaSb.visibility = View.VISIBLE - barStatusDrawerRandomColorBtn.visibility = View.GONE - barStatusDrawerSetTransparentBtn.visibility = View.VISIBLE - - drawerView.mBaseDrawerContainerView.setBackgroundResource(R.drawable.image_lena) - } else { - barStatusDrawerChangeAlphaSb.visibility = View.GONE - barStatusDrawerRandomColorBtn.visibility = View.VISIBLE - barStatusDrawerSetTransparentBtn.visibility = View.GONE - - drawerView.mBaseDrawerContainerView.setBackgroundColor(Color.WHITE) - } - updateStatusBar() - } - - private var mFrontCheckedChangeListener: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { _, _ -> updateStatusBar() } - - override fun isSwipeBack(): Boolean { - return false - } - - override fun initData(bundle: Bundle?) { - mColor = ColorUtils.getColor(R.color.colorPrimary) - mAlpha = 112 - } - - override fun bindLayout(): Int { - return R.layout.activity_bar_status_drawer - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - barStatusDrawerAlphaCb.setOnCheckedChangeListener(mAlphaCheckedChangeListener) - barStatusDrawerFrontCb.setOnCheckedChangeListener(mFrontCheckedChangeListener) - barStatusDrawerChangeAlphaSb.setOnSeekBarChangeListener(mColorListener) - applyDebouncingClickListener( - barStatusDrawerRandomColorBtn, - barStatusDrawerSetTransparentBtn - ) - - barStatusDrawerChangeAlphaSb.visibility = View.GONE - barStatusDrawerSetTransparentBtn.visibility = View.GONE - - updateStatusBar() - } - - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusDrawerRandomColorBtn -> { - mColor = ColorUtils.getRandomColor() - updateStatusBar() - } - R.id.barStatusDrawerSetTransparentBtn -> barStatusDrawerChangeAlphaSb.progress = 0 - } - } - - private fun updateStatusBar() { - if (barStatusDrawerAlphaCb.isChecked) { - BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, Color.argb(mAlpha, 0, 0, 0), barStatusDrawerFrontCb.isChecked) - barStatusDrawerAboutTv.text = mAlpha.toString() - } else { - BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, mColor, barStatusDrawerFrontCb.isChecked) - barStatusDrawerAboutTv.text = ColorUtils.int2ArgbString(mColor) - } - BarUtils.addMarginTopEqualStatusBarHeight(barStatusDrawerAlphaCb)// 其实这个只需要调用一次即可 - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt deleted file mode 100644 index 68d71341c0..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.content.Context -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.SeekBar -import com.blankj.common.activity.CommonActivity -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import kotlinx.android.synthetic.main.activity_bar_status_image_view.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : demo about BarUtils - * ``` - */ -class BarStatusImageViewActivity : CommonActivity() { - - companion object { - fun start(context: Context) { - val starter = Intent(context, BarStatusImageViewActivity::class.java) - context.startActivity(starter) - } - } - - private var mAlpha: Int = 0 - - private val translucentListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - barStatusImageViewAboutTv.text = mAlpha.toString() - updateStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - override fun isSwipeBack(): Boolean { - return true - } - - override fun initData(bundle: Bundle?) { - mAlpha = 112 - } - - override fun bindLayout(): Int { - return R.layout.activity_bar_status_image_view - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusImageViewSetTransparentBtn) - barStatusImageViewChangeAlphaSb.setOnSeekBarChangeListener(translucentListener) - barStatusImageViewAboutTv.text = mAlpha.toString() - - updateStatusBar() - } - - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusImageViewSetTransparentBtn -> barStatusImageViewChangeAlphaSb.progress = 0 - } - } - - private fun updateStatusBar() { - BarUtils.setStatusBarColor(this, Color.argb(mAlpha, 0, 0, 0), true) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt deleted file mode 100644 index 95c0f75268..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt +++ /dev/null @@ -1,72 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.SeekBar -import com.blankj.base.BaseLazyFragment -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_image_view.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusImageViewFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusImageViewFragment { - return BarStatusImageViewFragment() - } - } - - private var mAlpha: Int = 0 - - private val translucentListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - barStatusImageViewFragmentAboutTv.text = mAlpha.toString() - updateFakeStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - override fun initData(bundle: Bundle?) { - mAlpha = 112 - } - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_image_view - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusImageViewFragmentSetTransparentBtn) - barStatusImageViewFragmentChangeAlphaSb.setOnSeekBarChangeListener(translucentListener) - barStatusImageViewFragmentAboutTv.text = mAlpha.toString() - - updateFakeStatusBar() - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusImageViewSetTransparentBtn -> barStatusImageViewFragmentChangeAlphaSb.progress = 0 - } - } - - fun updateFakeStatusBar() { - BarUtils.setStatusBarColor(barStatusImageViewFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNavActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt similarity index 98% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNavActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt index baf68b9e7c..2950c2bf5d 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNavActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.nav import android.content.Context import android.content.Intent diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNotificationActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt similarity index 92% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNotificationActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt index 86cca16aff..5504912ee6 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNotificationActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt @@ -1,10 +1,9 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.notification import android.content.Context import android.content.Intent import android.os.Handler 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.utilcode.pkg.R diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt similarity index 97% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt index 0570fb33c8..5983365f83 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt similarity index 85% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt index d9b3fa0a9b..b7464443bd 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent @@ -22,11 +22,11 @@ import com.blankj.utilcode.util.ColorUtils * desc : demo about BarUtils * ``` */ -class BarStatusAlphaActivity : CommonActivity() { +class BarStatusActivityAlpha : CommonActivity() { companion object { fun start(context: Context) { - val starter = Intent(context, BarStatusAlphaActivity::class.java) + val starter = Intent(context, BarStatusActivityAlpha::class.java) context.startActivity(starter) } } @@ -34,16 +34,16 @@ class BarStatusAlphaActivity : CommonActivity() { private var mAlpha: Int = 112 override fun bindLayout(): Int { - return R.layout.activity_bar_status_alpha1 + return R.layout.bar_status_alpha_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { super.initView(savedInstanceState, contentView) - setCommonItems(findViewById(R.id.commonItemRv), bindItems()) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) updateStatusBar() } - override fun bindItems(): List> { + private fun getItems(): List> { return CollectionUtils.newArrayList>( CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt similarity index 90% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt index 73e7a34363..74b6368e1b 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent @@ -20,11 +20,11 @@ import com.blankj.utilcode.util.ColorUtils * desc : demo about BarUtils * ``` */ -class BarStatusColorActivity : CommonActivity() { +class BarStatusActivityColor : CommonActivity() { companion object { fun start(context: Context) { - val starter = Intent(context, BarStatusColorActivity::class.java) + val starter = Intent(context, BarStatusActivityColor::class.java) context.startActivity(starter) } } @@ -34,8 +34,8 @@ class BarStatusColorActivity : CommonActivity() { override fun bindItems(): List> { return CollectionUtils.newArrayList>( CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener { - updateStatusBar() mColor = ColorUtils.getRandomColor() + updateStatusBar() return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) } ) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt similarity index 61% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt index 72712239f3..0cea718cf9 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt @@ -1,8 +1,10 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle +import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BarUtils @@ -16,16 +18,17 @@ import com.blankj.utilcode.util.BarUtils * desc : demo about BarUtils * ``` */ -class BarStatusCustomActivity : CommonActivity() { +class BarStatusActivityCustom : CommonActivity() { companion object { fun start(context: Context) { - val starter = Intent(context, BarStatusCustomActivity::class.java) + val starter = Intent(context, BarStatusActivityCustom::class.java) context.startActivity(starter) } } - override fun doBusiness() { + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) BarUtils.setStatusBarColor(this, Color.TRANSPARENT).setBackgroundResource(R.drawable.bar_status_custom) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt new file mode 100644 index 0000000000..2ddbc3c13f --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt @@ -0,0 +1,111 @@ +package com.blankj.utilcode.pkg.feature.bar.status + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.common.item.CommonItemSwitch +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ColorUtils +import com.blankj.utilcode.util.Utils +import kotlinx.android.synthetic.main.bar_status_drawer_activity.* + + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/05/27 + * desc : demo about BarUtils + * ``` + */ +class BarStatusActivityDrawer : CommonActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, BarStatusActivityDrawer::class.java) + context.startActivity(starter) + } + } + + private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary) + private var mAlpha: Int = 112 + + private var mAlphaStatus: Boolean = false + private var mFrontStatus: Boolean = false + + override fun isSwipeBack(): Boolean { + return false + } + + override fun bindDrawer(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_drawer_activity + } + + private fun getItems(): MutableList> { + val randomColorItem = CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener { + mColor = ColorUtils.getRandomColor() + updateStatusBar() + return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) + } + + val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + + return CollectionUtils.newArrayList( + CommonItemSwitch(R.string.bar_status_title_alpha, Utils.Func1 { + updateStatusBar() + return@Func1 mAlphaStatus + }, Utils.Func1 { + mAlphaStatus = it + if (mAlphaStatus) { + barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena) + commonItemAdapter.replaceItem(2, alphaItem, true) + } else { + barStatusDrawerRootLl.setBackgroundColor(Color.TRANSPARENT) + commonItemAdapter.replaceItem(2, randomColorItem, true) + } + }), + CommonItemSwitch(R.string.bar_status_is_front, Utils.Func1 { + return@Func1 mFrontStatus + }, Utils.Func1 { + mFrontStatus = it + updateStatusBar() + }), + randomColorItem + ) + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + } + + private fun updateStatusBar() { + if (mAlphaStatus) { + BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, Color.argb(mAlpha, 0, 0, 0), mFrontStatus) + } else { + BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, mColor, mFrontStatus) + } + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt new file mode 100644 index 0000000000..533a40d7f5 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt @@ -0,0 +1,63 @@ +package com.blankj.utilcode.pkg.feature.bar.status + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/05/27 + * desc : demo about BarUtils + * ``` + */ +class BarStatusActivityImageView : CommonActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, BarStatusActivityImageView::class.java) + context.startActivity(starter) + } + } + + private var mAlpha: Int = 112 + + override fun bindLayout(): Int { + return R.layout.bar_status_image_view_activity + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + ) + } + + private fun updateStatusBar() { + BarUtils.setStatusBarColor(this, Color.argb(mAlpha, 0, 0, 0), true) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt similarity index 82% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt index 3ad2ed21f1..d504987c93 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status.fragment import android.content.Context import android.content.Intent @@ -10,7 +10,7 @@ import android.support.v4.view.ViewPager import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R -import kotlinx.android.synthetic.main.activity_bar_status_fragment.* +import kotlinx.android.synthetic.main.bar_status_fragment_activity.* import java.util.* /** @@ -65,19 +65,18 @@ class BarStatusFragmentActivity : CommonActivity() { return false } - override fun initData(bundle: Bundle?) {} - override fun bindLayout(): Int { - return R.layout.activity_bar_status_fragment + return R.layout.bar_status_fragment_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { - mFragmentList.add(BarStatusColorFragment.newInstance()) - mFragmentList.add(BarStatusAlphaFragment.newInstance()) - mFragmentList.add(BarStatusImageViewFragment.newInstance()) - mFragmentList.add(BarStatusCustomFragment.newInstance()) + super.initView(savedInstanceState, contentView) + mFragmentList.add(BarStatusFragmentColor.newInstance()) + mFragmentList.add(BarStatusFragmentAlpha.newInstance()) + mFragmentList.add(BarStatusFragmentImageView.newInstance()) + mFragmentList.add(BarStatusFragmentCustom.newInstance()) - barStatusFragmentVp.offscreenPageLimit = 3 + barStatusFragmentVp.offscreenPageLimit = mFragmentList.size - 1 barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) { override fun getItem(position: Int): Fragment { return mFragmentList[position] @@ -87,7 +86,6 @@ class BarStatusFragmentActivity : CommonActivity() { return mFragmentList.size } } - barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} @@ -100,8 +98,4 @@ class BarStatusFragmentActivity : CommonActivity() { barStatusFragmentNav.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) } - - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) {} } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt new file mode 100644 index 0000000000..15797fc505 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt @@ -0,0 +1,68 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ColorUtils +import kotlinx.android.synthetic.main.bar_status_alpha_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentAlpha : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentAlpha { + return BarStatusFragmentAlpha() + } + } + + override fun isLazy(): Boolean { + return true + } + + private var mAlpha: Int = 112 + + override fun bindLayout(): Int { + return R.layout.bar_status_alpha_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateFakeStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateFakeStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }).apply { + backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f) + } + ) + } + + fun updateFakeStatusBar() { + BarUtils.setStatusBarColor(barStatusAlphaFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt new file mode 100644 index 0000000000..029523e59d --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt @@ -0,0 +1,59 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.os.Bundle +import android.view.View +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ColorUtils +import kotlinx.android.synthetic.main.bar_status_color_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentColor : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentColor { + return BarStatusFragmentColor() + } + } + + private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary) + + override fun isLazy(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_color_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateFakeStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener { + mColor = ColorUtils.getRandomColor() + updateFakeStatusBar() + return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) + } + ) + } + + private fun updateFakeStatusBar() { + BarUtils.setStatusBarColor(barStatusColorFragmentFakeStatusBar, mColor) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt new file mode 100644 index 0000000000..e8dbcd927c --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt @@ -0,0 +1,38 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.os.Bundle +import android.view.View +import com.blankj.common.fragment.CommonFragment +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import kotlinx.android.synthetic.main.bar_status_custom_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentCustom : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentCustom { + return BarStatusFragmentCustom() + } + } + + override fun isLazy(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_custom_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + BarUtils.setStatusBarCustom(barStatusCustomFragmentFakeStatusBar) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt new file mode 100644 index 0000000000..54571b6ddd --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt @@ -0,0 +1,65 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import kotlinx.android.synthetic.main.bar_status_image_view_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentImageView : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentImageView { + return BarStatusFragmentImageView() + } + } + + private var mAlpha: Int = 112 + + override fun isLazy(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_image_view_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateFakeStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateFakeStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + ) + } + + fun updateFakeStatusBar() { + BarUtils.setStatusBarColor(barStatusImageViewFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt index 31c5f86c99..7159b3e5a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt @@ -3,7 +3,6 @@ package com.blankj.utilcode.pkg.feature.bus 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.CommonItemClick import com.blankj.common.item.CommonItemTitle @@ -14,6 +13,7 @@ import com.blankj.utilcode.util.ThreadUtils import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import java.util.* +import java.util.concurrent.CopyOnWriteArrayList /** @@ -66,8 +66,8 @@ class BusCompareActivity : CommonActivity() { * 注册 10000 个订阅者,共执行 10 次取平均值 */ private fun compareRegister10000Times() { - val eventBusTests = java.util.ArrayList() - val busUtilsTests = java.util.ArrayList() + val eventBusTests = CopyOnWriteArrayList() + val busUtilsTests = CopyOnWriteArrayList() compareWithEventBus("Register 10000 times.", 10, 10000, object : CompareCallback { override fun runEventBus() { @@ -203,9 +203,7 @@ class BusCompareActivity : CommonActivity() { */ private fun compareWithEventBus(name: String, sampleSize: Int, times: Int, callback: CompareCallback, onFinishCallback: OnFinishCallback) { - showLoading { - ThreadUtils.cancel(ThreadUtils.getCpuPool()) - } + showLoading() ThreadUtils.executeByCpu(object : ThreadUtils.Task() { override fun doInBackground(): String { val dur = Array(2) { LongArray(sampleSize) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt index 4855a01ff2..79d408c2a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt @@ -2,21 +2,21 @@ package com.blankj.utilcode.pkg.feature.click import android.content.Context import android.content.Intent -import android.os.Bundle +import android.support.annotation.StringRes import android.view.View -import android.widget.Button +import android.widget.TextView +import com.blankj.base.rv.ItemViewHolder import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView +import com.blankj.common.item.CommonItem import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* -import kotlinx.android.synthetic.main.activity_click.* /** * ``` * author: Blankj * blog : http://blankj.com * time : 2016/09/29 - * desc : demo about CleanUtils + * desc : demo about ClickUtils * ``` */ class ClickActivity : CommonActivity() { @@ -32,55 +32,84 @@ class ClickActivity : CommonActivity() { return R.string.demo_click } - override fun bindLayout(): Int { - return R.layout.activity_click - } + override fun bindItems(): MutableList> { + return CollectionUtils.newArrayList( + ClickItem(R.string.click_view_scale_default, Utils.Func1 { + ClickUtils.applyPressedViewScale(it) + }), + ClickItem(R.string.click_view_scale_half, Utils.Func1 { + ClickUtils.applyPressedViewScale(it, -0.5f) + }), + ClickItem(R.string.click_view_alpha_default, Utils.Func1 { + ClickUtils.applyPressedViewAlpha(it) + }), + ClickItem(R.string.click_bg_alpha_default, Utils.Func1 { + ClickUtils.applyPressedBgAlpha(it) + }), + ClickItem(R.string.click_bg_dark_default, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + }), + ClickItem(R.string.click_single_debouncing, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + ClickUtils.applySingleDebouncing(it, 5000) { + SnackbarUtils.with(mContentView) + .setMessage(StringUtils.getString(R.string.click_single_tip)) + .setBgColor(ColorUtils.getRandomColor(false)) + .setDuration(SnackbarUtils.LENGTH_LONG) + .show() + } + }), + ClickItem(R.string.click_global_debouncing, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + ClickUtils.applySingleDebouncing(it, 5000) { + SnackbarUtils.with(mContentView) + .setMessage(StringUtils.getString(R.string.click_global_tip)) + .setBgColor(ColorUtils.getRandomColor(false)) + .setDuration(SnackbarUtils.LENGTH_LONG) + .show() + } + }), + ClickItem(R.string.click_multi, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + it.setOnClickListener(object : ClickUtils.OnMultiClickListener(5) { + override fun onTriggerClick(v: View) { + ToastUtils.showShort("onTriggerClick") + } - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener( - clickViewScaleDefaultBtn, - clickViewScaleCustomBtn, - clickViewAlphaDefaultBtn, - clickBgAlphaDefaultBtn, - clickBgDarkDefaultBtn + override fun onBeforeTriggerClick(v: View, count: Int) { + ToastUtils.showShort(count) + } + }) + }) ) + } - ClickUtils.applyPressedViewScale(clickViewScaleDefaultBtn) - ClickUtils.applyPressedViewScale(clickViewScaleCustomBtn, -0.5f) - ClickUtils.applyPressedViewAlpha(clickViewAlphaDefaultBtn) - ClickUtils.applyPressedBgAlpha(clickBgAlphaDefaultBtn) - ClickUtils.applyPressedBgDark(clickBgDarkDefaultBtn) + override fun onDestroy() { + super.onDestroy() + SnackbarUtils.dismiss() + } +} - ClickUtils.applySingleDebouncing(clickSingleDebouncingBtn, 5000) { - SnackbarUtils.with(mContentView) - .setMessage(StringUtils.getString(R.string.click_single_tip)) - .setBgColor(ColorUtils.getRandomColor(false)) - .setDuration(SnackbarUtils.LENGTH_LONG) - .show() - } - ClickUtils.applyGlobalDebouncing(clickGlobalDebouncingBtn, 5000) { - SnackbarUtils.with(mContentView) - .setMessage(StringUtils.getString(R.string.click_global_tip)) +class ClickItem : CommonItem { + + private val mFunc1: Utils.Func1; + private val mTitle: String + + constructor(@StringRes title: Int, func1: Utils.Func1) : super(R.layout.common_item_title_click) { + mFunc1 = func1 + mTitle = StringUtils.getString(title) + } + + override fun bind(holder: ItemViewHolder, position: Int) { + super.bind(holder, position) + holder.findViewById(R.id.commonItemTitleTv).text = mTitle + holder.itemView.setOnClickListener() { + SnackbarUtils.with(it) + .setMessage(mTitle) .setBgColor(ColorUtils.getRandomColor(false)) .setDuration(SnackbarUtils.LENGTH_LONG) .show() } - clickMultiBtn.setOnClickListener(object : ClickUtils.OnMultiClickListener(5) { - override fun onTriggerClick(v: View) { - ToastUtils.showShort("onTriggerClick") - } - - override fun onBeforeTriggerClick(v: View, count: Int) { - ToastUtils.showShort(count) - } - }) - } - - override fun onDebouncingClick(view: View) { - SnackbarUtils.with(mContentView) - .setMessage((view as Button).text) - .setBgColor(ColorUtils.getRandomColor(false)) - .setDuration(SnackbarUtils.LENGTH_LONG) - .show() + mFunc1.call(holder.itemView) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt index 1dbcfe51ee..c7c2e5fd0a 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt @@ -1,14 +1,17 @@ package com.blankj.utilcode.pkg.feature.fragment import android.os.Bundle +import android.support.v4.app.FragmentManager import android.view.View -import com.blankj.base.BaseLazyFragment +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper +import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.ColorUtils import com.blankj.utilcode.util.FragmentUtils import com.blankj.utilcode.util.SpanUtils -import kotlinx.android.synthetic.main.fragment_child.* /** * ``` @@ -18,7 +21,7 @@ import kotlinx.android.synthetic.main.fragment_child.* * desc : demo about FragmentUtils * ``` */ -class ChildFragment : BaseLazyFragment() { +class ChildFragment : CommonFragment() { companion object { fun newInstance(): ChildFragment { @@ -29,42 +32,50 @@ class ChildFragment : BaseLazyFragment() { } } - override fun initData(bundle: Bundle?) {} + private lateinit var fm: FragmentManager + private val mBgColor = ColorUtils.getRandomColor(false) override fun bindLayout(): Int { return R.layout.fragment_child } override fun initView(savedInstanceState: Bundle?, contentView: View?) { - FragmentUtils.setBackgroundColor(this, ColorUtils.getRandomColor(false)) - applyDebouncingClickListener( - fragmentChildShowStackBtn, - fragmentChildPopBtn, - fragmentChildRemoveBtn - ) + super.initView(savedInstanceState, contentView) + FragmentUtils.setBackgroundColor(this, mBgColor) + fm = fragmentManager!! + setCommonItems(findViewById(R.id.commonItemRv), getItems()) } - override fun doLazyBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.fragmentChildShowStackBtn -> DialogHelper.showFragmentDialog( - SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fragmentManager!!))) - .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fragmentManager!!))) - .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fragmentManager!!))) - .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fragmentManager!!))) - .appendLine() - .appendLine("---all of fragments---") - .appendLine(FragmentUtils.getAllFragments(fragmentManager!!).toString()) - .appendLine("----------------------") - .appendLine() - .appendLine("---stack top---") - .appendLine(FragmentUtils.getAllFragmentsInStack(fragmentManager!!).toString()) - .appendLine("---stack bottom---") - .create() - ) - R.id.fragmentChildPopBtn -> FragmentUtils.pop(fragmentManager!!); - R.id.fragmentChildRemoveBtn -> FragmentUtils.remove(this); + private fun getItems(): MutableList> { + return CollectionUtils.newArrayList>( + CommonItemClick(R.string.fragment_show_stack) { + DialogHelper.showFragmentDialog( + SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fm))) + .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fm))) + .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fm))) + .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fm))) + .appendLine() + .appendLine("---all of fragments---") + .appendLine(FragmentUtils.getAllFragments(fm).toString()) + .appendLine("----------------------") + .appendLine() + .appendLine("---stack top---") + .appendLine(FragmentUtils.getAllFragmentsInStack(fm).toString()) + .appendLine("---stack bottom---") + .create() + ) + }, + CommonItemClick(R.string.fragment_pop) { + FragmentUtils.pop(fm) + }, + CommonItemClick(R.string.fragment_remove) { + FragmentUtils.remove(this) + }, + SharedElementItem() + ).apply { + for (ci: CommonItem<*> in this) { + ci.backgroundColor = mBgColor + } } } -} +} \ No newline at end of file diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt index f474cb9f22..3e57295596 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt @@ -4,16 +4,19 @@ import android.os.Build import android.os.Bundle import android.support.annotation.RequiresApi import android.support.v4.app.Fragment +import android.support.v4.app.FragmentManager import android.transition.* import android.view.View -import com.blankj.base.BaseLazyFragment +import android.widget.ImageView +import com.blankj.base.rv.ItemViewHolder +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper -import com.blankj.utilcode.util.ColorUtils -import com.blankj.utilcode.util.FragmentUtils -import com.blankj.utilcode.util.SpanUtils -import com.blankj.utilcode.util.ToastUtils +import com.blankj.utilcode.util.* import kotlinx.android.synthetic.main.fragment_container.* +import java.util.* /** * ``` @@ -23,7 +26,7 @@ import kotlinx.android.synthetic.main.fragment_container.* * desc : demo about FragmentUtils * ``` */ -class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { +class ContainerFragment : CommonFragment(), FragmentUtils.OnBackClickListener { companion object { fun newInstance(): ContainerFragment { @@ -34,98 +37,111 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener } } - override fun initData(bundle: Bundle?) {} + private lateinit var fm: FragmentManager + private val mBgColor = ColorUtils.getRandomColor(false) override fun bindLayout(): Int { return R.layout.fragment_container } override fun initView(savedInstanceState: Bundle?, contentView: View?) { - FragmentUtils.setBackgroundColor(this, ColorUtils.getRandomColor(false)) - applyDebouncingClickListener( - fragmentRootShowStackBtn, - fragmentRootAddChildBtn, - fragmentRootAddChildStackBtn, - fragmentRootAddHideBtn, - fragmentRootAddHideStackBtn, - fragmentRootAddShowBtn, - fragmentRootPopToRootBtn, - fragmentRootHideShowBtn, - fragmentRootReplaceBtn - ) + super.initView(savedInstanceState, contentView) + mContentView.setBackgroundColor(mBgColor) + fm = fragmentManager!! + setCommonItems(findViewById(R.id.commonItemRv), getItems()) } - override fun doLazyBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.fragmentRootShowStackBtn -> DialogHelper.showFragmentDialog( - SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fragmentManager!!))) - .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fragmentManager!!))) - .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fragmentManager!!))) - .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fragmentManager!!))) - .appendLine() - .appendLine("---all of fragments---") - .appendLine(FragmentUtils.getAllFragments(fragmentManager!!).toString()) - .appendLine("----------------------") - .appendLine() - .appendLine("---stack top---") - .appendLine(FragmentUtils.getAllFragmentsInStack(fragmentManager!!).toString()) - .appendLine("---stack bottom---") - .create() - ) - R.id.fragmentRootAddChildBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id - ) - R.id.fragmentRootAddChildStackBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id, - false, - true - ) - R.id.fragmentRootAddHideBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id, - true - ) - R.id.fragmentRootAddHideStackBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id, - true, - true - ) - R.id.fragmentRootAddShowBtn -> FragmentUtils.add( - fragmentManager!!, - addSharedElement(ChildFragment.newInstance()), - id, - false, - false - ) - R.id.fragmentRootPopToRootBtn -> FragmentUtils.popTo( - fragmentManager!!, - ChildFragment::class.java, - true - ) - R.id.fragmentRootHideShowBtn -> { - val fragment1 = FragmentUtils.findFragment(fragmentManager!!, ChildFragment::class.java) - if (fragment1 != null) { - FragmentUtils.showHide(this, fragment1) - } else { - ToastUtils.showLong("please add demo1 first!") - } + private fun getItems(): ArrayList>? { + val item = SharedElementItem() + return CollectionUtils.newArrayList>( + CommonItemClick(R.string.fragment_show_stack) { + DialogHelper.showFragmentDialog( + SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fm))) + .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fm))) + .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fm))) + .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fm))) + .appendLine() + .appendLine("---all of fragments---") + .appendLine(FragmentUtils.getAllFragments(fm).toString()) + .appendLine("----------------------") + .appendLine() + .appendLine("---stack top---") + .appendLine(FragmentUtils.getAllFragmentsInStack(fm).toString()) + .appendLine("---stack bottom---") + .create() + ) + }, + CommonItemClick(R.string.fragment_add_child) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id + ) + }, + CommonItemClick(R.string.fragment_add_child_stack) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id, + false, + true + ) + }, + CommonItemClick(R.string.fragment_add_hide) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id, + true + ) + }, + CommonItemClick(R.string.fragment_add_hide_stack) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id, + true, + true + ) + }, + CommonItemClick(R.string.fragment_add_demo1_show) { + FragmentUtils.add( + fm, + addSharedElement(ChildFragment.newInstance()), + id, + false, + false + ) + }, + CommonItemClick(R.string.fragment_pop_to_root) { + FragmentUtils.popTo( + fm, + ChildFragment::class.java, + true + ) + }, + CommonItemClick(R.string.fragment_hide_demo0_show_demo1) { + val fragment1 = FragmentUtils.findFragment(fm, ChildFragment::class.java) + if (fragment1 != null) { + FragmentUtils.showHide(this, fragment1) + } else { + ToastUtils.showLong("please add demo1 first!") + } + }, + CommonItemClick(R.string.fragment_replace) { + FragmentUtils.replace( + fm, + addSharedElement(ChildFragment.newInstance()), + id, + true, + item.element + ) + }, + item + ).apply { + for (ci: CommonItem<*> in this) { + ci.backgroundColor = mBgColor } - R.id.fragmentRootReplaceBtn -> FragmentUtils.replace( - fragmentManager!!, - addSharedElement(ChildFragment.newInstance()), - id, - true, - fragmentRootSharedElementIv - ) } } @@ -143,10 +159,22 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener } } +class SharedElementItem : CommonItem { + + lateinit var element: ImageView; + + constructor() : super(R.layout.fragment_item_shared_element) + + override fun bind(holder: ItemViewHolder, position: Int) { + super.bind(holder, position) + element = holder.findViewById(R.id.fragmentRootSharedElementIv) + } +} + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) class DetailTransition() : TransitionSet() { init { - ordering = TransitionSet.ORDERING_TOGETHER + ordering = ORDERING_TOGETHER addTransition(ChangeBounds()).addTransition(ChangeTransform()).addTransition(ChangeImageTransform()) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt index 604501abe1..99b6355629 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt @@ -10,7 +10,7 @@ import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.FragmentUtils -import kotlinx.android.synthetic.main.activity_fragment.* +import kotlinx.android.synthetic.main.fragment_activity.* /** * ``` @@ -51,10 +51,11 @@ class FragmentActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_fragment + return R.layout.fragment_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) if (savedInstanceState != null) { curIndex = savedInstanceState.getInt("curIndex") } @@ -72,10 +73,6 @@ class FragmentActivity : CommonActivity() { ) } - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) {} - override fun onBackPressed() { if (!FragmentUtils.dispatchBackPress(mFragments[curIndex])) { super.onBackPressed() diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt index 4d266527bb..d2a9ac7bab 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt @@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.fragment import android.os.Bundle import android.view.View -import com.blankj.base.BaseLazyFragment +import com.blankj.common.fragment.CommonFragment import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BarUtils import com.blankj.utilcode.util.ColorUtils @@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.fragment_root.* * desc : demo about FragmentUtils * ``` */ -class RootFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { +class RootFragment : CommonFragment(), FragmentUtils.OnBackClickListener { companion object { fun newInstance(): RootFragment { @@ -28,13 +28,12 @@ class RootFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { } } - override fun initData(bundle: Bundle?) {} - override fun bindLayout(): Int { return R.layout.fragment_root } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) BarUtils.setStatusBarColor(rootFragmentFakeStatusBar, ColorUtils.getColor(R.color.colorPrimary)) FragmentUtils.add( childFragmentManager, @@ -43,10 +42,6 @@ class RootFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { ) } - override fun doLazyBusiness() {} - - override fun onDebouncingClick(view: View) {} - override fun onBackClick(): Boolean { if (FragmentUtils.dispatchBackPress(childFragmentManager)) return true return if (childFragmentManager.backStackEntryCount == 0) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt index 0be5c0c738..531c78b9f1 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt @@ -5,12 +5,14 @@ import android.content.Intent import android.os.Bundle import android.view.View 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.pkg.helper.DialogHelper +import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.KeyboardUtils -import com.blankj.utilcode.util.SpanUtils -import kotlinx.android.synthetic.main.activity_keyboard.* +import kotlinx.android.synthetic.main.keyboard_activity.* /** * ``` @@ -29,49 +31,44 @@ class KeyboardActivity : CommonActivity() { } } + private var titleItem: CommonItemTitle = CommonItemTitle("", true) + override fun bindTitleRes(): Int { return R.string.demo_keyboard } override fun bindLayout(): Int { - return R.layout.activity_keyboard + return R.layout.keyboard_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) KeyboardUtils.fixAndroidBug5497(this) - applyDebouncingClickListener( - keyboardHideSoftInputBtn, - keyboardShowSoftInputBtn, - keyboardToggleSoftInputBtn, - keyboardShowDialogBtn - ) - + setCommonItems(findViewById(R.id.commonItemRv), getItems()) KeyboardUtils.registerSoftInputChangedListener(this) { height -> - SpanUtils.with(keyboardAboutTv) - .appendLine("isSoftInputVisible: " + KeyboardUtils.isSoftInputVisible(this@KeyboardActivity)) - .append("height: $height") - .create() + titleItem.title = "isSoftInputVisible: " + KeyboardUtils.isSoftInputVisible(this@KeyboardActivity) + "\nkeyboardHeight: $height" if (height > 0) { keyboardEt.requestFocus() } } } - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.keyboardHideSoftInputBtn -> { - KeyboardUtils.hideSoftInput(this) - } - R.id.keyboardShowSoftInputBtn -> { - KeyboardUtils.showSoftInput(this) - } - R.id.keyboardToggleSoftInputBtn -> { - KeyboardUtils.toggleSoftInput() - } - R.id.keyboardShowDialogBtn -> { - keyboardEt.clearFocus() - DialogHelper.showKeyboardDialog() - } - } + private fun getItems(): MutableList> { + return CollectionUtils.newArrayList( + titleItem, + CommonItemClick(R.string.keyboard_hide_soft_input) { + KeyboardUtils.hideSoftInput(this) + }, + CommonItemClick(R.string.keyboard_show_soft_input) { + KeyboardUtils.showSoftInput(this) + }, + CommonItemClick(R.string.keyboard_toggle_soft_input) { + KeyboardUtils.toggleSoftInput() + }, + CommonItemClick(R.string.keyboard_show_dialog) { + keyboardEt.clearFocus() + DialogHelper.showKeyboardDialog() + } + ) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java new file mode 100644 index 0000000000..772192b999 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java @@ -0,0 +1,20 @@ +package com.blankj.utilcode.pkg.feature.mvp; + +import com.blankj.common.activity.CommonActivity; +import com.blankj.utilcode.pkg.R; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/11/09
+ *     desc  :
+ * 
+ */ +public class MvpActivity extends CommonActivity { + + @Override + public int bindTitleRes() { + return R.string.demo_mvp; + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt index d4771514ce..fc9915cb53 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt @@ -88,6 +88,7 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) NetworkUtils.registerNetworkStatusChangedListener(this) updateItems() } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt index 921d85b32b..b226e4141d 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt @@ -118,10 +118,9 @@ class PermissionActivity : CommonActivity() { permissionsDenied: List) { LogUtils.d(permissionsDeniedForever, permissionsDenied) if (permissionsDeniedForever.isNotEmpty()) { - showSnackbar(true, "Calendar is denied forever") + showSnackbar(false, "Calendar is denied forever") } else { - showSnackbar(true, "Calendar is denied") - requestCalendar() + showSnackbar(false, "Calendar is denied") } itemsView.updateItems(bindItems()) } @@ -147,7 +146,6 @@ class PermissionActivity : CommonActivity() { showSnackbar(false, "Microphone is denied forever") } else { showSnackbar(false, "Microphone is denied") - requestRecordAudio() } itemsView.updateItems(bindItems()) } @@ -174,7 +172,6 @@ class PermissionActivity : CommonActivity() { showSnackbar(false, "Calendar or Microphone is denied forever") } else { showSnackbar(false, "Calendar or Microphone is denied") - requestCalendarAndRecordAudio() } itemsView.updateItems(bindItems()) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt index 72ec62f98f..47ab4e2b9f 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt @@ -18,7 +18,7 @@ import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.SpanUtils import com.blankj.utilcode.util.ToastUtils -import kotlinx.android.synthetic.main.activity_span.* +import kotlinx.android.synthetic.main.span_activity.* /** * ``` @@ -57,7 +57,12 @@ class SpanActivity : CommonActivity() { return R.string.demo_span } + override fun bindLayout(): Int { + return R.layout.span_activity + } + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) val clickableSpan = object : ClickableSpan() { override fun onClick(widget: View) { ToastUtils.showShort("事件触发了") @@ -210,12 +215,12 @@ class SpanActivity : CommonActivity() { override fun onDebouncingClick(view: View) {} - override fun onDestroy() { - if (valueAnimator != null && valueAnimator.isRunning) { - valueAnimator.cancel() - } - super.onDestroy() - } +// override fun onDestroy() { +// if (valueAnimator.isRunning) { +// valueAnimator.cancel() +// } +// super.onDestroy() +// } } class BlurMaskFilterSpan(private var mRadius: Float) : CharacterStyle(), UpdateAppearance { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt index bec099d5cf..91d89a4864 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt @@ -1,14 +1,21 @@ package com.blankj.utilcode.pkg.helper -import android.app.Dialog +import android.content.DialogInterface import android.graphics.Bitmap import android.graphics.drawable.ColorDrawable -import android.support.v7.app.AlertDialog +import android.support.v4.app.FragmentActivity import android.text.method.ScrollingMovementMethod +import android.util.Pair import android.view.Gravity -import android.view.LayoutInflater import android.view.View -import android.widget.* +import android.view.Window +import android.widget.Button +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import com.blankj.base.dialog.BaseDialogFragment +import com.blankj.base.dialog.DialogLayoutCallback +import com.blankj.common.dialog.CommonDialogContent import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest @@ -24,94 +31,153 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques object DialogHelper { fun showRationaleDialog(shouldRequest: ShouldRequest) { - val topActivity = ActivityUtils.getTopActivity() - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_rationale_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> shouldRequest.again(true) } - .setNegativeButton(android.R.string.cancel) { dialog, which -> shouldRequest.again(false) } - .setCancelable(false) - .create() - .show() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_rationale_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + shouldRequest.again(true) + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + shouldRequest.again(false) + })).show() } fun showOpenAppSettingDialog() { - val topActivity = ActivityUtils.getTopActivity() - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_denied_forever_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> PermissionUtils.launchAppDetailsSettings() } - .setNegativeButton(android.R.string.cancel) { dialog, which -> } - .setCancelable(false) - .create() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_denied_forever_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + PermissionUtils.launchAppDetailsSettings() + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + })) .show() } fun showKeyboardDialog() { - val topActivity = ActivityUtils.getTopActivity() - val dialog = Dialog(topActivity) - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_keyboard, null) - - val keyboardDialogEt = dialogView.findViewById(R.id.keyboardDialogEt) - val listener = View.OnClickListener { v -> - when (v.id) { - R.id.keyboardDialogHideSoftInputBtn -> KeyboardUtils.hideSoftInput(keyboardDialogEt) - R.id.keyboardDialogShowSoftInputBtn -> KeyboardUtils.showSoftInput(keyboardDialogEt) - R.id.keyboardDialogToggleSoftInputBtn -> KeyboardUtils.toggleSoftInput() - R.id.keyboardDialogCloseBtn -> { - KeyboardUtils.hideSoftInput(keyboardDialogEt) - dialog.dismiss() + val topActivity = ActivityUtils.getTopActivity() ?: return + BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback { + override fun bindTheme(): Int { + return View.NO_ID + } + + override fun bindLayout(): Int { + return R.layout.keyboard_dialog + } + + override fun initView(dialog: BaseDialogFragment, contentView: View) { + dialog.dialog.setCanceledOnTouchOutside(false) + + val keyboardDialogEt = contentView.findViewById(R.id.keyboardDialogEt) + val listener = View.OnClickListener { v -> + when (v.id) { + R.id.keyboardDialogHideSoftInputBtn -> KeyboardUtils.hideSoftInput(keyboardDialogEt) + R.id.keyboardDialogShowSoftInputBtn -> KeyboardUtils.showSoftInput(keyboardDialogEt) + R.id.keyboardDialogToggleSoftInputBtn -> KeyboardUtils.toggleSoftInput() + R.id.keyboardDialogCloseBtn -> { + KeyboardUtils.hideSoftInput(keyboardDialogEt) + dialog.dismiss() + } + } } + contentView.findViewById(R.id.keyboardDialogHideSoftInputBtn).setOnClickListener(listener) + contentView.findViewById(R.id.keyboardDialogShowSoftInputBtn).setOnClickListener(listener) + contentView.findViewById(R.id.keyboardDialogToggleSoftInputBtn).setOnClickListener(listener) + contentView.findViewById(R.id.keyboardDialogCloseBtn).setOnClickListener(listener) + + dialog.dialog.setOnShowListener(DialogInterface.OnShowListener { + KeyboardUtils.fixAndroidBug5497(dialog.dialog.window) + }) + } + + override fun setWindowStyle(window: Window) { + window.setBackgroundDrawable(ColorDrawable(0)) + val attributes = window.attributes + attributes.gravity = Gravity.BOTTOM + attributes.width = ScreenUtils.getAppScreenWidth() + attributes.height = ScreenUtils.getAppScreenHeight() * 2 / 5 + attributes.windowAnimations = R.style.BottomDialogAnimation + window.attributes = attributes } - } - dialogView.findViewById(R.id.keyboardDialogHideSoftInputBtn).setOnClickListener(listener) - dialogView.findViewById(R.id.keyboardDialogShowSoftInputBtn).setOnClickListener(listener) - dialogView.findViewById(R.id.keyboardDialogToggleSoftInputBtn).setOnClickListener(listener) - dialogView.findViewById(R.id.keyboardDialogCloseBtn).setOnClickListener(listener) - - dialog.setContentView(dialogView) - dialog.setCanceledOnTouchOutside(false) - - val window = dialog.window - dialog.setOnShowListener { KeyboardUtils.fixAndroidBug5497(window) } - - window.setBackgroundDrawable(ColorDrawable(0)) - val attributes = dialog.window.attributes - attributes.gravity = Gravity.BOTTOM - attributes.width = ScreenUtils.getAppScreenWidth() - attributes.height = ScreenUtils.getAppScreenHeight() * 2 / 5 - attributes.windowAnimations = R.style.BottomDialogAnimation - dialog.window.attributes = attributes - - dialog.show() + + override fun onCancel(dialog: BaseDialogFragment) {} + + override fun onDismiss(dialog: BaseDialogFragment) {} + }).show() } fun showFragmentDialog(info: CharSequence) { - val topActivity = ActivityUtils.getTopActivity() - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_fragment, null) - val aboutTv = dialogView.findViewById(R.id.fragmentDialogAboutTv) - aboutTv.movementMethod = ScrollingMovementMethod.getInstance() - aboutTv.text = info - val dialog = AlertDialog.Builder(topActivity).setView(dialogView).create() - dialog.show() + val topActivity = ActivityUtils.getTopActivity() ?: return + BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback { + override fun bindTheme(): Int { + return R.style.CommonContentDialogStyle + } + + override fun bindLayout(): Int { + return R.layout.fragment_dialog + } + + override fun initView(dialog: BaseDialogFragment, contentView: View) { + val aboutTv = contentView.findViewById(R.id.fragmentDialogAboutTv) + aboutTv.movementMethod = ScrollingMovementMethod.getInstance() + aboutTv.text = info + } + + override fun setWindowStyle(window: Window) {} + + override fun onCancel(dialog: BaseDialogFragment) {} + + override fun onDismiss(dialog: BaseDialogFragment) {} + }).show() } fun showScreenshotDialog(screenshot: Bitmap) { - val topActivity = ActivityUtils.getTopActivity() - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_screen, null) - val screenshotIv = dialogView.findViewById(R.id.screenDialogScreenshotIv) - screenshotIv.setImageBitmap(screenshot) - val dialog = AlertDialog.Builder(topActivity).setView(dialogView).create() - dialog.show() + val topActivity = ActivityUtils.getTopActivity() ?: return + BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback { + override fun bindTheme(): Int { + return R.style.CommonContentDialogStyle + } + + override fun bindLayout(): Int { + return R.layout.screen_dialog + } + + override fun initView(dialog: BaseDialogFragment, contentView: View) { + contentView.findViewById(R.id.screenDialogScreenshotIv) + .setImageBitmap(screenshot) + } + + override fun setWindowStyle(window: Window) {} + + override fun onCancel(dialog: BaseDialogFragment) {} + + override fun onDismiss(dialog: BaseDialogFragment) {} + }).show() } fun showToastDialog() { - val topActivity = ActivityUtils.getTopActivity() - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_toast, null) - dialogView.findViewById