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/191] 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/191] 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/191] 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/191] 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: Wed, 26 Jun 2019 13:40:48 +0800
Subject: [PATCH 005/191] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=98=BF=E9=87=8C?=
 =?UTF-8?q?=E4=BA=91=E4=BB=93=E5=BA=93=E5=9C=B0=E5=9D=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build.gradle | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/build.gradle b/build.gradle
index 6a8c9055e5..2a396521c8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,6 +2,18 @@
 buildscript {
     apply from: 'config.gradle'
     repositories {
+        maven {
+            url 'https://maven.aliyun.com/repository/public'
+            name '代替 jcenter()及mavenCentral()'
+        }
+        maven {
+            url 'https://maven.aliyun.com/repository/jcenter'
+            name '代替 jcenter()'
+        }
+        maven {
+            url 'https://maven.aliyun.com/repository/google'
+            name '代替 google()'
+        }
         if (bus.isDebug) {
             maven() {
                 url uri(new File(project.rootDir, "maven"))
@@ -20,6 +32,18 @@ buildscript {
 
 allprojects {
     repositories {
+        maven {
+            url 'https://maven.aliyun.com/repository/public'
+            name '代替 jcenter()及mavenCentral()'
+        }
+        maven {
+            url 'https://maven.aliyun.com/repository/jcenter'
+            name '代替 jcenter()'
+        }
+        maven {
+            url 'https://maven.aliyun.com/repository/google'
+            name '代替 google()'
+        }
         google()
         jcenter()
     }

From 047750f980bd4890a6e939817a0aed30aff2b636 Mon Sep 17 00:00:00 2001
From: liyujiang 
Date: Wed, 26 Jun 2019 17:05:22 +0800
Subject: [PATCH 006/191] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=87=A0=E4=B8=AA?=
 =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=8C=87=E5=AE=9A=E6=97=A5=E6=9C=9F=E6=97=B6?=
 =?UTF-8?q?=E9=97=B4=E6=A0=BC=E5=BC=8F=E6=A8=A1=E6=9D=BF=E8=BF=9B=E8=A1=8C?=
 =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=88=B3=E5=A4=84=E7=90=86=E6=96=B9=E6=B3=95?=
 =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=BA=94=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B?=
 =?UTF-8?q?=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/blankj/utilcode/util/TimeUtils.java   |  60 +-
 .../blankj/utilcode/util/TimeUtilsTest.java   | 552 +++++++++---------
 2 files changed, 336 insertions(+), 276 deletions(-)

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..19a9ad40c4 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
@@ -24,10 +24,17 @@ public final class TimeUtils {
     private static final ThreadLocal SDF_THREAD_LOCAL = new ThreadLocal<>();
 
     private static SimpleDateFormat getDefaultFormat() {
+        return getDateFormat("yyyy-MM-dd HH:mm:ss");
+    }
+
+    @NonNull
+    private static SimpleDateFormat getDateFormat(String pattern) {
         SimpleDateFormat simpleDateFormat = SDF_THREAD_LOCAL.get();
         if (simpleDateFormat == null) {
-            simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
+            simpleDateFormat = new SimpleDateFormat(pattern, Locale.getDefault());
             SDF_THREAD_LOCAL.set(simpleDateFormat);
+        } else {
+            simpleDateFormat.applyPattern(pattern);
         }
         return simpleDateFormat;
     }
@@ -47,6 +54,17 @@ public static String millis2String(final long millis) {
         return millis2String(millis, getDefaultFormat());
     }
 
+    /**
+     * Milliseconds to the formatted time string.
+     *
+     * @param millis  The milliseconds.
+     * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm
+     * @return the formatted time string
+     */
+    public static String millis2String(long millis, @NonNull final String pattern) {
+        return millis2String(millis, getDateFormat(pattern));
+    }
+
     /**
      * Milliseconds to the formatted time string.
      *
@@ -69,6 +87,18 @@ public static long string2Millis(final String time) {
         return string2Millis(time, getDefaultFormat());
     }
 
+    /**
+     * Formatted time string to the milliseconds.
+     * 

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the milliseconds + */ + public static long string2Millis(final String time, @NonNull final String pattern) { + return string2Millis(time, getDateFormat(pattern)); + } + /** * Formatted time string to the milliseconds. * @@ -96,6 +126,18 @@ public static Date string2Date(final String time) { return string2Date(time, getDefaultFormat()); } + /** + * Formatted time string to the date. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the date + */ + public static Date string2Date(final String time, @NonNull final String pattern) { + return string2Date(time, getDateFormat(pattern)); + } + /** * Formatted time string to the date. * @@ -123,6 +165,17 @@ public static String date2String(final Date date) { return date2String(date, getDefaultFormat()); } + /** + * Date to the formatted time string. + * + * @param date The date. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the formatted time string + */ + public static String date2String(final Date date, @NonNull final String pattern) { + return getDateFormat(pattern).format(date); + } + /** * Date to the formatted time string. * @@ -1338,8 +1391,8 @@ public static String getChineseZodiac(final int year) { return CHINESE_ZODIAC[year % 12]; } - private static final int[] ZODIAC_FLAGS = {20, 19, 21, 21, 21, 22, 23, 23, 23, 24, 23, 22}; - private static final String[] ZODIAC = { + private static final int[] ZODIAC_FLAGS = {20, 19, 21, 21, 21, 22, 23, 23, 23, 24, 23, 22}; + private static final String[] ZODIAC = { "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "魔羯座" }; @@ -1431,4 +1484,5 @@ private static String millis2FitTimeSpan(long millis, int precision) { } return sb.toString(); } + } 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 5b82277a0a..7ca86340c3 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 @@ -1,274 +1,280 @@ -package com.blankj.utilcode.util; - -import com.blankj.utilcode.constant.TimeConstants; - -import org.junit.Test; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.Locale; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - - -/** - *
- *     author: Blankj
- *     blog  : http://blankj.com
- *     time  : 2016/08/12
- *     desc  : test TimeUtils
- * 
- */ -public class TimeUtilsTest extends BaseTest { - - private final DateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); - private final DateFormat mFormat = new SimpleDateFormat("yyyy MM dd HH:mm:ss", Locale.getDefault()); - - private final long timeMillis = 1493887049000L;// 2017-05-04 16:37:29 - private final Date timeDate = new Date(timeMillis); - private final String timeString = defaultFormat.format(timeDate); - private final String timeStringFormat = mFormat.format(timeDate); - private final long tomorrowTimeMillis = 1493973449000L; - private final Date tomorrowTimeDate = new Date(tomorrowTimeMillis); - private final String tomorrowTimeString = defaultFormat.format(tomorrowTimeDate); - private final String tomorrowTimeStringFormat = mFormat.format(tomorrowTimeDate); - private final long delta = 10;// 允许误差 10ms - - @Test - public void millis2String() { - assertEquals(timeString, TimeUtils.millis2String(timeMillis)); - assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, mFormat)); - } - - @Test - public void string2Millis() { - assertEquals(timeMillis, TimeUtils.string2Millis(timeString)); - assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, mFormat)); - } - - @Test - public void string2Date() { - assertEquals(timeDate, TimeUtils.string2Date(timeString)); - assertEquals(timeDate, TimeUtils.string2Date(timeStringFormat, mFormat)); - } - - @Test - public void date2String() { - assertEquals(timeString, TimeUtils.date2String(timeDate)); - assertEquals(timeStringFormat, TimeUtils.date2String(timeDate, mFormat)); - } - - @Test - public void date2Millis() { - assertEquals(timeMillis, TimeUtils.date2Millis(timeDate)); - } - - @Test - public void millis2Date() { - assertEquals(timeDate, TimeUtils.millis2Date(timeMillis)); - } - - @Test - public void getTimeSpan() { - long testTimeMillis = timeMillis + 120 * TimeConstants.SEC; - String testTimeString = TimeUtils.millis2String(testTimeMillis); - String testTimeStringFormat = TimeUtils.millis2String(testTimeMillis, mFormat); - Date testTimeDate = TimeUtils.millis2Date(testTimeMillis); - assertEquals(-120, TimeUtils.getTimeSpan(timeString, testTimeString, TimeConstants.SEC)); - assertEquals(2, TimeUtils.getTimeSpan(testTimeStringFormat, timeStringFormat, mFormat, TimeConstants.MIN)); - assertEquals(-2, TimeUtils.getTimeSpan(timeDate, testTimeDate, TimeConstants.MIN)); - assertEquals(120, TimeUtils.getTimeSpan(testTimeMillis, timeMillis, TimeConstants.SEC)); - } - - @Test - public void getFitTimeSpan() { - long testTimeMillis = timeMillis + 10 * TimeConstants.DAY + 10 * TimeConstants.MIN + 10 * TimeConstants.SEC; - String testTimeString = TimeUtils.millis2String(testTimeMillis); - String testTimeStringFormat = TimeUtils.millis2String(testTimeMillis, mFormat); - Date testTimeDate = TimeUtils.millis2Date(testTimeMillis); - assertEquals("-10天10分钟10秒", TimeUtils.getFitTimeSpan(timeString, testTimeString, 5)); - assertEquals("10天10分钟10秒", TimeUtils.getFitTimeSpan(testTimeStringFormat, timeStringFormat, mFormat, 5)); - assertEquals("-10天10分钟10秒", TimeUtils.getFitTimeSpan(timeDate, testTimeDate, 5)); - assertEquals("10天10分钟10秒", TimeUtils.getFitTimeSpan(testTimeMillis, timeMillis, 5)); - } - - @Test - public void getNowMills() { - assertEquals(System.currentTimeMillis(), TimeUtils.getNowMills(), delta); - } - - @Test - public void getNowString() { - assertEquals(System.currentTimeMillis(), TimeUtils.string2Millis(TimeUtils.getNowString()), delta); - assertEquals(System.currentTimeMillis(), TimeUtils.string2Millis(TimeUtils.getNowString(mFormat), mFormat), delta); - } - - @Test - public void getNowDate() { - assertEquals(System.currentTimeMillis(), TimeUtils.date2Millis(TimeUtils.getNowDate()), delta); - } - - @Test - public void getTimeSpanByNow() { - assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowString(), TimeConstants.MSEC), delta); - assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowString(mFormat), mFormat, TimeConstants.MSEC), delta); - assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowDate(), TimeConstants.MSEC), delta); - assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowMills(), TimeConstants.MSEC), delta); - } - - @Test - public void getFitTimeSpanByNow() { -// long spanMillis = 6 * TimeConstants.DAY + 6 * TimeConstants.HOUR + 6 * TimeConstants.MIN + 6 * TimeConstants.SEC; -// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(TimeUtils.millis2String(System.currentTimeMillis() + spanMillis), 4)); -// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(TimeUtils.millis2String(System.currentTimeMillis() + spanMillis, mFormat), mFormat, 4)); -// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(TimeUtils.millis2Date(System.currentTimeMillis() + spanMillis), 4)); -// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(System.currentTimeMillis() + spanMillis, 4)); - } - - @Test - public void getFriendlyTimeSpanByNow() { - assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowString())); - assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowString(mFormat), mFormat)); - assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowDate())); - assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowMills())); - assertEquals("1秒前", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowMills() - TimeConstants.SEC)); - assertEquals("1分钟前", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowMills() - TimeConstants.MIN)); - } - - @Test - public void getMillis() { - assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeMillis, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeString, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeStringFormat, mFormat, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeDate, 1, TimeConstants.DAY)); - } - - @Test - public void getString() { - assertEquals(tomorrowTimeString, TimeUtils.getString(timeMillis, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeStringFormat, TimeUtils.getString(timeMillis, mFormat, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeString, TimeUtils.getString(timeString, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeStringFormat, TimeUtils.getString(timeStringFormat, mFormat, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeString, TimeUtils.getString(timeDate, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeStringFormat, TimeUtils.getString(timeDate, mFormat, 1, TimeConstants.DAY)); - } - - @Test - public void getDate() { - assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeMillis, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeString, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeStringFormat, mFormat, 1, TimeConstants.DAY)); - assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeDate, 1, TimeConstants.DAY)); - } - - @Test - public void getMillisByNow() { - assertEquals(System.currentTimeMillis() + TimeConstants.DAY, TimeUtils.getMillisByNow(1, TimeConstants.DAY), delta); - } - - @Test - public void getStringByNow() { - long tomorrowMillis = TimeUtils.string2Millis(TimeUtils.getStringByNow(1, TimeConstants.DAY)); - assertEquals(System.currentTimeMillis() + TimeConstants.DAY, tomorrowMillis, delta); - tomorrowMillis = TimeUtils.string2Millis(TimeUtils.getStringByNow(1, mFormat, TimeConstants.DAY), mFormat); - assertEquals(System.currentTimeMillis() + TimeConstants.DAY, tomorrowMillis, delta); - } - - @Test - public void getDateByNow() { - long tomorrowMillis = TimeUtils.date2Millis(TimeUtils.getDateByNow(1, TimeConstants.DAY)); - assertEquals(System.currentTimeMillis() + TimeConstants.DAY, TimeUtils.getMillisByNow(1, TimeConstants.DAY), delta); - } - - @Test - public void isToday() { - long todayTimeMillis = System.currentTimeMillis(); - String todayTimeString = TimeUtils.millis2String(todayTimeMillis); - String todayTimeStringFormat = TimeUtils.millis2String(todayTimeMillis, mFormat); - Date todayTimeDate = TimeUtils.millis2Date(todayTimeMillis); - long tomorrowTimeMillis = todayTimeMillis + TimeConstants.DAY; - String tomorrowTimeString = TimeUtils.millis2String(tomorrowTimeMillis); - Date tomorrowTimeDate = TimeUtils.millis2Date(tomorrowTimeMillis); - assertTrue(TimeUtils.isToday(todayTimeString)); - assertTrue(TimeUtils.isToday(todayTimeStringFormat, mFormat)); - assertTrue(TimeUtils.isToday(todayTimeDate)); - assertTrue(TimeUtils.isToday(todayTimeMillis)); - assertFalse(TimeUtils.isToday(tomorrowTimeString)); - assertFalse(TimeUtils.isToday(tomorrowTimeStringFormat, mFormat)); - assertFalse(TimeUtils.isToday(tomorrowTimeDate)); - assertFalse(TimeUtils.isToday(tomorrowTimeMillis)); - } - - @Test - public void isLeapYear() { - assertFalse(TimeUtils.isLeapYear(timeString)); - assertFalse(TimeUtils.isLeapYear(timeStringFormat, mFormat)); - assertFalse(TimeUtils.isLeapYear(timeDate)); - assertFalse(TimeUtils.isLeapYear(timeMillis)); - assertTrue(TimeUtils.isLeapYear(2016)); - assertFalse(TimeUtils.isLeapYear(2017)); - } - - @Test - public void getChineseWeek() { - assertEquals("星期四", TimeUtils.getChineseWeek(timeString)); - assertEquals("星期四", TimeUtils.getChineseWeek(timeStringFormat, mFormat)); - assertEquals("星期四", TimeUtils.getChineseWeek(timeDate)); - assertEquals("星期四", TimeUtils.getChineseWeek(timeMillis)); - } - - @Test - public void getUSWeek() { - assertEquals("Thursday", TimeUtils.getUSWeek(timeString)); - assertEquals("Thursday", TimeUtils.getUSWeek(timeStringFormat, mFormat)); - assertEquals("Thursday", TimeUtils.getUSWeek(timeDate)); - assertEquals("Thursday", TimeUtils.getUSWeek(timeMillis)); - } - - @Test - public void getWeekIndex() { - assertEquals(5, TimeUtils.getValueByCalendarField(timeString, Calendar.DAY_OF_WEEK)); - assertEquals(5, TimeUtils.getValueByCalendarField(timeString, Calendar.DAY_OF_WEEK)); - assertEquals(5, TimeUtils.getValueByCalendarField(timeStringFormat, mFormat, Calendar.DAY_OF_WEEK)); - assertEquals(5, TimeUtils.getValueByCalendarField(timeDate, Calendar.DAY_OF_WEEK)); - assertEquals(5, TimeUtils.getValueByCalendarField(timeMillis, Calendar.DAY_OF_WEEK)); - } - - @Test - public void getWeekOfMonth() { - assertEquals(1, TimeUtils.getValueByCalendarField(timeString, Calendar.WEEK_OF_MONTH)); - assertEquals(1, TimeUtils.getValueByCalendarField(timeStringFormat, mFormat, Calendar.WEEK_OF_MONTH)); - assertEquals(1, TimeUtils.getValueByCalendarField(timeDate, Calendar.WEEK_OF_MONTH)); - assertEquals(1, TimeUtils.getValueByCalendarField(timeMillis, Calendar.WEEK_OF_MONTH)); - } - - @Test - public void getWeekOfYear() { - assertEquals(18, TimeUtils.getValueByCalendarField(timeString, Calendar.WEEK_OF_YEAR)); - assertEquals(18, TimeUtils.getValueByCalendarField(timeStringFormat, mFormat, Calendar.WEEK_OF_YEAR)); - assertEquals(18, TimeUtils.getValueByCalendarField(timeDate, Calendar.WEEK_OF_YEAR)); - assertEquals(18, TimeUtils.getValueByCalendarField(timeMillis, Calendar.WEEK_OF_YEAR)); - } - - @Test - public void getChineseZodiac() { - assertEquals("鸡", TimeUtils.getChineseZodiac(timeString)); - assertEquals("鸡", TimeUtils.getChineseZodiac(timeStringFormat, mFormat)); - assertEquals("鸡", TimeUtils.getChineseZodiac(timeDate)); - assertEquals("鸡", TimeUtils.getChineseZodiac(timeMillis)); - assertEquals("鸡", TimeUtils.getChineseZodiac(2017)); - } - - @Test - public void getZodiac() { - assertEquals("金牛座", TimeUtils.getZodiac(timeString)); - assertEquals("金牛座", TimeUtils.getZodiac(timeStringFormat, mFormat)); - assertEquals("金牛座", TimeUtils.getZodiac(timeDate)); - assertEquals("金牛座", TimeUtils.getZodiac(timeMillis)); - assertEquals("狮子座", TimeUtils.getZodiac(8, 16)); - } +package com.blankj.utilcode.util; + +import com.blankj.utilcode.constant.TimeConstants; + +import org.junit.Test; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/08/12
+ *     desc  : test TimeUtils
+ * 
+ */ +public class TimeUtilsTest { + + private final DateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + private final DateFormat mFormat = new SimpleDateFormat("yyyy MM dd HH:mm:ss", Locale.getDefault()); + + private final long timeMillis = 1493887049000L;// 2017-05-04 16:37:29 + private final Date timeDate = new Date(timeMillis); + private final String timeString = defaultFormat.format(timeDate); + private final String timeStringFormat = mFormat.format(timeDate); + private final long tomorrowTimeMillis = 1493973449000L; + private final Date tomorrowTimeDate = new Date(tomorrowTimeMillis); + private final String tomorrowTimeString = defaultFormat.format(tomorrowTimeDate); + private final String tomorrowTimeStringFormat = mFormat.format(tomorrowTimeDate); + private final long delta = 10;// 允许误差 10ms + + @Test + 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分")); + } + + @Test + public void string2Millis() { + assertEquals(timeMillis, TimeUtils.string2Millis(timeString)); + assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, mFormat)); + assertEquals(TimeUtils.string2Millis("2017-05-04 16:37", "yyyy-MM-dd HH:mm"), + TimeUtils.string2Millis("2017年05月04日16时37分", "yyyy年MM月dd日HH时mm分")); + } + + @Test + public void string2Date() { + assertEquals(timeDate, TimeUtils.string2Date(timeString)); + assertEquals(timeDate, TimeUtils.string2Date(timeStringFormat, mFormat)); + assertEquals(timeDate, TimeUtils.string2Date("2017-05-04 16:37:29", "yyyy-MM-dd HH:mm:ss")); + } + + @Test + public void date2String() { + assertEquals(timeString, TimeUtils.date2String(timeDate)); + assertEquals(timeStringFormat, TimeUtils.date2String(timeDate, mFormat)); + assertEquals("2017-05-04 16:37:29", TimeUtils.date2String(timeDate, "yyyy-MM-dd HH:mm:ss")); + } + + @Test + public void date2Millis() { + assertEquals(timeMillis, TimeUtils.date2Millis(timeDate)); + } + + @Test + public void millis2Date() { + assertEquals(timeDate, TimeUtils.millis2Date(timeMillis)); + } + + @Test + public void getTimeSpan() { + long testTimeMillis = timeMillis + 120 * TimeConstants.SEC; + String testTimeString = TimeUtils.millis2String(testTimeMillis); + String testTimeStringFormat = TimeUtils.millis2String(testTimeMillis, mFormat); + Date testTimeDate = TimeUtils.millis2Date(testTimeMillis); + assertEquals(-120, TimeUtils.getTimeSpan(timeString, testTimeString, TimeConstants.SEC)); + assertEquals(2, TimeUtils.getTimeSpan(testTimeStringFormat, timeStringFormat, mFormat, TimeConstants.MIN)); + assertEquals(-2, TimeUtils.getTimeSpan(timeDate, testTimeDate, TimeConstants.MIN)); + assertEquals(120, TimeUtils.getTimeSpan(testTimeMillis, timeMillis, TimeConstants.SEC)); + } + + @Test + public void getFitTimeSpan() { + long testTimeMillis = timeMillis + 10 * TimeConstants.DAY + 10 * TimeConstants.MIN + 10 * TimeConstants.SEC; + String testTimeString = TimeUtils.millis2String(testTimeMillis); + String testTimeStringFormat = TimeUtils.millis2String(testTimeMillis, mFormat); + Date testTimeDate = TimeUtils.millis2Date(testTimeMillis); + assertEquals("-10天10分钟10秒", TimeUtils.getFitTimeSpan(timeString, testTimeString, 5)); + assertEquals("10天10分钟10秒", TimeUtils.getFitTimeSpan(testTimeStringFormat, timeStringFormat, mFormat, 5)); + assertEquals("-10天10分钟10秒", TimeUtils.getFitTimeSpan(timeDate, testTimeDate, 5)); + assertEquals("10天10分钟10秒", TimeUtils.getFitTimeSpan(testTimeMillis, timeMillis, 5)); + } + + @Test + public void getNowMills() { + assertEquals(System.currentTimeMillis(), TimeUtils.getNowMills(), delta); + } + + @Test + public void getNowString() { + assertEquals(System.currentTimeMillis(), TimeUtils.string2Millis(TimeUtils.getNowString()), delta); + assertEquals(System.currentTimeMillis(), TimeUtils.string2Millis(TimeUtils.getNowString(mFormat), mFormat), delta); + } + + @Test + public void getNowDate() { + assertEquals(System.currentTimeMillis(), TimeUtils.date2Millis(TimeUtils.getNowDate()), delta); + } + + @Test + public void getTimeSpanByNow() { + assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowString(), TimeConstants.MSEC), delta); + assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowString(mFormat), mFormat, TimeConstants.MSEC), delta); + assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowDate(), TimeConstants.MSEC), delta); + assertEquals(0, TimeUtils.getTimeSpanByNow(TimeUtils.getNowMills(), TimeConstants.MSEC), delta); + } + + @Test + public void getFitTimeSpanByNow() { +// long spanMillis = 6 * TimeConstants.DAY + 6 * TimeConstants.HOUR + 6 * TimeConstants.MIN + 6 * TimeConstants.SEC; +// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(TimeUtils.millis2String(System.currentTimeMillis() + spanMillis), 4)); +// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(TimeUtils.millis2String(System.currentTimeMillis() + spanMillis, mFormat), mFormat, 4)); +// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(TimeUtils.millis2Date(System.currentTimeMillis() + spanMillis), 4)); +// assertEquals("6天6小时6分钟6秒", TimeUtils.getFitTimeSpanByNow(System.currentTimeMillis() + spanMillis, 4)); + } + + @Test + public void getFriendlyTimeSpanByNow() { + assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowString())); + assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowString(mFormat), mFormat)); + assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowDate())); + assertEquals("刚刚", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowMills())); + assertEquals("1秒前", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowMills() - TimeConstants.SEC)); + assertEquals("1分钟前", TimeUtils.getFriendlyTimeSpanByNow(TimeUtils.getNowMills() - TimeConstants.MIN)); + } + + @Test + public void getMillis() { + assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeMillis, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeString, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeStringFormat, mFormat, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeMillis, TimeUtils.getMillis(timeDate, 1, TimeConstants.DAY)); + } + + @Test + public void getString() { + assertEquals(tomorrowTimeString, TimeUtils.getString(timeMillis, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeStringFormat, TimeUtils.getString(timeMillis, mFormat, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeString, TimeUtils.getString(timeString, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeStringFormat, TimeUtils.getString(timeStringFormat, mFormat, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeString, TimeUtils.getString(timeDate, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeStringFormat, TimeUtils.getString(timeDate, mFormat, 1, TimeConstants.DAY)); + } + + @Test + public void getDate() { + assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeMillis, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeString, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeStringFormat, mFormat, 1, TimeConstants.DAY)); + assertEquals(tomorrowTimeDate, TimeUtils.getDate(timeDate, 1, TimeConstants.DAY)); + } + + @Test + public void getMillisByNow() { + assertEquals(System.currentTimeMillis() + TimeConstants.DAY, TimeUtils.getMillisByNow(1, TimeConstants.DAY), delta); + } + + @Test + public void getStringByNow() { + long tomorrowMillis = TimeUtils.string2Millis(TimeUtils.getStringByNow(1, TimeConstants.DAY)); + assertEquals(System.currentTimeMillis() + TimeConstants.DAY, tomorrowMillis, delta); + tomorrowMillis = TimeUtils.string2Millis(TimeUtils.getStringByNow(1, mFormat, TimeConstants.DAY), mFormat); + assertEquals(System.currentTimeMillis() + TimeConstants.DAY, tomorrowMillis, delta); + } + + @Test + public void getDateByNow() { + long tomorrowMillis = TimeUtils.date2Millis(TimeUtils.getDateByNow(1, TimeConstants.DAY)); + assertEquals(System.currentTimeMillis() + TimeConstants.DAY, TimeUtils.getMillisByNow(1, TimeConstants.DAY), delta); + } + + @Test + public void isToday() { + long todayTimeMillis = System.currentTimeMillis(); + String todayTimeString = TimeUtils.millis2String(todayTimeMillis); + String todayTimeStringFormat = TimeUtils.millis2String(todayTimeMillis, mFormat); + Date todayTimeDate = TimeUtils.millis2Date(todayTimeMillis); + long tomorrowTimeMillis = todayTimeMillis + TimeConstants.DAY; + String tomorrowTimeString = TimeUtils.millis2String(tomorrowTimeMillis); + Date tomorrowTimeDate = TimeUtils.millis2Date(tomorrowTimeMillis); + assertTrue(TimeUtils.isToday(todayTimeString)); + assertTrue(TimeUtils.isToday(todayTimeStringFormat, mFormat)); + assertTrue(TimeUtils.isToday(todayTimeDate)); + assertTrue(TimeUtils.isToday(todayTimeMillis)); + assertFalse(TimeUtils.isToday(tomorrowTimeString)); + assertFalse(TimeUtils.isToday(tomorrowTimeStringFormat, mFormat)); + assertFalse(TimeUtils.isToday(tomorrowTimeDate)); + assertFalse(TimeUtils.isToday(tomorrowTimeMillis)); + } + + @Test + public void isLeapYear() { + assertFalse(TimeUtils.isLeapYear(timeString)); + assertFalse(TimeUtils.isLeapYear(timeStringFormat, mFormat)); + assertFalse(TimeUtils.isLeapYear(timeDate)); + assertFalse(TimeUtils.isLeapYear(timeMillis)); + assertTrue(TimeUtils.isLeapYear(2016)); + assertFalse(TimeUtils.isLeapYear(2017)); + } + + @Test + public void getChineseWeek() { + assertEquals("星期四", TimeUtils.getChineseWeek(timeString)); + assertEquals("星期四", TimeUtils.getChineseWeek(timeStringFormat, mFormat)); + assertEquals("星期四", TimeUtils.getChineseWeek(timeDate)); + assertEquals("星期四", TimeUtils.getChineseWeek(timeMillis)); + } + + @Test + public void getUSWeek() { + assertEquals("Thursday", TimeUtils.getUSWeek(timeString)); + assertEquals("Thursday", TimeUtils.getUSWeek(timeStringFormat, mFormat)); + assertEquals("Thursday", TimeUtils.getUSWeek(timeDate)); + assertEquals("Thursday", TimeUtils.getUSWeek(timeMillis)); + } + + @Test + public void getWeekIndex() { + assertEquals(5, TimeUtils.getValueByCalendarField(timeString, Calendar.DAY_OF_WEEK)); + assertEquals(5, TimeUtils.getValueByCalendarField(timeString, Calendar.DAY_OF_WEEK)); + assertEquals(5, TimeUtils.getValueByCalendarField(timeStringFormat, mFormat, Calendar.DAY_OF_WEEK)); + assertEquals(5, TimeUtils.getValueByCalendarField(timeDate, Calendar.DAY_OF_WEEK)); + assertEquals(5, TimeUtils.getValueByCalendarField(timeMillis, Calendar.DAY_OF_WEEK)); + } + + @Test + public void getWeekOfMonth() { + assertEquals(1, TimeUtils.getValueByCalendarField(timeString, Calendar.WEEK_OF_MONTH)); + assertEquals(1, TimeUtils.getValueByCalendarField(timeStringFormat, mFormat, Calendar.WEEK_OF_MONTH)); + assertEquals(1, TimeUtils.getValueByCalendarField(timeDate, Calendar.WEEK_OF_MONTH)); + assertEquals(1, TimeUtils.getValueByCalendarField(timeMillis, Calendar.WEEK_OF_MONTH)); + } + + @Test + public void getWeekOfYear() { + assertEquals(18, TimeUtils.getValueByCalendarField(timeString, Calendar.WEEK_OF_YEAR)); + assertEquals(18, TimeUtils.getValueByCalendarField(timeStringFormat, mFormat, Calendar.WEEK_OF_YEAR)); + assertEquals(18, TimeUtils.getValueByCalendarField(timeDate, Calendar.WEEK_OF_YEAR)); + assertEquals(18, TimeUtils.getValueByCalendarField(timeMillis, Calendar.WEEK_OF_YEAR)); + } + + @Test + public void getChineseZodiac() { + assertEquals("鸡", TimeUtils.getChineseZodiac(timeString)); + assertEquals("鸡", TimeUtils.getChineseZodiac(timeStringFormat, mFormat)); + assertEquals("鸡", TimeUtils.getChineseZodiac(timeDate)); + assertEquals("鸡", TimeUtils.getChineseZodiac(timeMillis)); + assertEquals("鸡", TimeUtils.getChineseZodiac(2017)); + } + + @Test + public void getZodiac() { + assertEquals("金牛座", TimeUtils.getZodiac(timeString)); + assertEquals("金牛座", TimeUtils.getZodiac(timeStringFormat, mFormat)); + assertEquals("金牛座", TimeUtils.getZodiac(timeDate)); + assertEquals("金牛座", TimeUtils.getZodiac(timeMillis)); + assertEquals("狮子座", TimeUtils.getZodiac(8, 16)); + } } \ No newline at end of file From 8fa41678ee59c8644293f2b9c00febd8b1e6b96c Mon Sep 17 00:00:00 2001 From: liyujiang Date: Wed, 26 Jun 2019 17:06:46 +0800 Subject: [PATCH 007/191] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=A7=A3=E5=86=B3ScrollView=E5=B5=8C?= =?UTF-8?q?=E5=A5=97ListView/GridView/WebView/RecyclerView=E7=AD=89?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=BD=AE=E9=A1=B6=E9=97=AE=E9=A2=98=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/blankj/utilcode/util/ViewUtils.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java index 16b573fab0..2efce48662 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java @@ -33,4 +33,28 @@ public static void setViewEnabled(View view, boolean enabled, View... excludes) } view.setEnabled(enabled); } + + /** + * 用于解决ScrollView嵌套ListView/GridView/WebView/RecyclerView等无法置顶问题 + * + * @param view ScrollView嵌套的跟视图 + */ + public static void fixScrollViewTopping(View view) { + view.setFocusable(false); + ViewGroup viewGroup = null; + if (view instanceof ViewGroup) { + viewGroup = (ViewGroup) view; + } + if (viewGroup == null) { + return; + } + for (int i = 0, n = viewGroup.getChildCount(); i < n; i++) { + View childAt = viewGroup.getChildAt(i); + childAt.setFocusable(false); + if (childAt instanceof ViewGroup) { + fixScrollViewTopping(childAt); + } + } + } + } \ No newline at end of file From 83735f35b3c67e5026ddcc9cd6c32accb13e1761 Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Fri, 28 Jun 2019 13:20:00 +0800 Subject: [PATCH 008/191] see 06/28 log --- gradle/config/configApp.gradle | 7 +- .../com/blankj/launcher/app/LauncherApp.java | 4 + .../com/blankj/lib/base/BaseFragment.java | 8 +- .../com/blankj/lib/base/rv/BaseAdapter.java | 53 +++++++++--- .../java/com/blankj/lib/base/rv/BaseCell.java | 4 +- .../com/blankj/subutil/util/CountryUtils.java | 3 +- .../com/blankj/subutil/util/BaseTest.java | 2 + .../com/blankj/subutil/util/TestUtils.java | 2 + .../subutil/util/http/nodeServer/app.js | 1 - .../subutil/util/http/nodeServer/index.htm | 18 ---- .../subutil/util/http/nodeServer/package.json | 13 --- .../nodeServer/public/images/image_lena.jpg | Bin 53220 -> 0 bytes .../subutil/util/http/nodeServer/server.js | 79 ------------------ .../subutil/util/http/nodeServer/star.jpg | Bin 13072 -> 0 bytes .../subutil/util/http/nodeServer/users.json | 20 ----- .../blankj/utilcode/util/ActivityUtils.java | 3 +- .../com/blankj/utilcode/util/ClickUtils.java | 44 ++++++++++ .../blankj/utilcode/util/LanguageUtils.java | 38 +++++++++ .../java/com/blankj/utilcode/util/Utils.java | 2 +- .../com/blankj/utilcode/util/ViewUtils.java | 10 +-- utilcode/pkg/src/main/AndroidManifest.xml | 4 + .../utilcode/pkg/feature/CoreUtilActivity.kt | 3 + .../pkg/feature/keyboard/KeyboardActivity.kt | 5 ++ .../pkg/feature/language/LanguageActivity.kt | 59 +++++++++++++ .../src/main/res/layout/activity_language.xml | 23 +++++ .../main/res/layout/activity_util_core.xml | 7 ++ .../src/main/res/values-zh-rCN/strings.xml | 6 ++ utilcode/pkg/src/main/res/values/strings.xml | 6 +- 28 files changed, 263 insertions(+), 161 deletions(-) delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/app.js delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/index.htm delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/package.json delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/public/images/image_lena.jpg delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/server.js delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/star.jpg delete mode 100644 subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/users.json create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/LanguageUtils.java create mode 100644 utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt create mode 100644 utilcode/pkg/src/main/res/layout/activity_language.xml create mode 100644 utilcode/pkg/src/main/res/values-zh-rCN/strings.xml diff --git a/gradle/config/configApp.gradle b/gradle/config/configApp.gradle index dd49160df7..76787bcf32 100644 --- a/gradle/config/configApp.gradle +++ b/gradle/config/configApp.gradle @@ -87,10 +87,13 @@ def configSigning(Project pro) { def configApkName(Project pro) { pro.android.applicationVariants.all { variant -> if (variant.buildType.name != "debug") { - variant.getPackageApplicationProvider().get().outputDirectory = new File("${rootDir.path}/apk") - variant.getPackageApplicationProvider().get().outputScope.apkDatas.forEach { apkData -> + def artifact = variant.getPackageApplicationProvider().get() + artifact.outputDirectory = new File("${rootDir.path}/apk") + artifact.outputScope.apkDatas.forEach { apkData -> apkData.outputFileName = "util" + suffix + + (variant.flavorName == "" ? "" : ("_" + variant.flavorName)) + "_" + variant.versionName.replace(".", "_") + + "_" + variant.buildType.name + ".apk" } } diff --git a/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java b/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java index 990f6d47a5..653b3339f6 100644 --- a/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java +++ b/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java @@ -3,6 +3,9 @@ import android.content.Context; import com.blankj.lib.common.CommonApplication; +import com.blankj.utilcode.util.LanguageUtils; + +import java.util.Locale; /** *
@@ -29,6 +32,7 @@ protected void attachBaseContext(Context base) {
     public void onCreate() {
         super.onCreate();
         sInstance = this;
+        LanguageUtils.applyLanguage(getBaseContext(), Locale.SIMPLIFIED_CHINESE);
     }
 }
 
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 692ad8a213..cd9a005f22 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
@@ -31,10 +31,10 @@ public abstract class BaseFragment extends Fragment
     private static final String TAG                  = "BaseFragment";
     private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";
 
-    private ClickUtils.OnDebouncingClickListener mDebouncingClick = new ClickUtils.OnDebouncingClickListener() {
+    private View.OnClickListener mClickListener = new View.OnClickListener() {
         @Override
-        public void onDebouncingClick(View v) {
-            BaseFragment.this.onDebouncingClick(v);
+        public void onClick(View v) {
+            onDebouncingClick(v);
         }
     };
 
@@ -119,7 +119,7 @@ public void onDestroy() {
     }
 
     public void applyDebouncingClickListener(View... views) {
-        ClickUtils.applyGlobalDebouncing(views, mDebouncingClick);
+        ClickUtils.applyGlobalDebouncing(views, mClickListener);
     }
 
     public  T findViewById(@IdRes int id) {
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 619d84e5ae..cd83ae923e 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
@@ -18,20 +18,19 @@
  */
 public class BaseAdapter extends RecyclerView.Adapter {
 
+    public BaseCell       mEmptyCell;
+    public List mHeaders;
     public List     mData;
+    public List mFooters;
     public Context        mContext;
     public LayoutInflater mInflater;
 
-    public void setData(@NonNull final List data) {
-        mData = data;
-    }
-
-    public List getData() {
-        return mData;
-    }
-
     @Override
     public final int getItemViewType(int position) {
+        int headerSize = getHeaderSize();
+        if (headerSize > position) {
+            return mHeaders.get(position).viewType;
+        }
         return mData.get(position).viewType;
     }
 
@@ -47,16 +46,44 @@ public final void onBindViewHolder(@NonNull BaseViewHolder holder, int position)
         mData.get(position).bind(holder, position);
     }
 
+    @Override
+    public void onViewRecycled(@NonNull BaseViewHolder holder) {
+        super.onViewRecycled(holder);
+        int position = holder.getAdapterPosition();
+        mData.get(position).onViewRecycled(holder, position);
+    }
+
     @Override
     public int getItemCount() {
+        return getHeaderSize() + getDataSize() + getFooterSize();
+    }
+
+    public void setEmptyCell(BaseCell emptyCell) {
+        mEmptyCell = emptyCell;
+    }
+
+    private int getHeaderSize() {
+        if (mHeaders == null) return 0;
+        return mHeaders.size();
+    }
+
+    private int getDataSize() {
         if (mData == null) return 0;
         return mData.size();
     }
 
-    @Override
-    public void onViewRecycled(@NonNull BaseViewHolder holder) {
-        super.onViewRecycled(holder);
-        int position = holder.getAdapterPosition();
-        mData.get(position).onViewRecycled(holder, position);
+    private int getFooterSize() {
+        if (mFooters == null) return 0;
+        return mFooters.size();
+    }
+
+    public void setData(@NonNull final List data) {
+        mData = data;
     }
+
+    public List getData() {
+        return mData;
+    }
+
+
 }
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 a068edc22d..74fb63067a 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
@@ -36,12 +36,12 @@ public void onViewRecycled(@NonNull final BaseViewHolder holder, final int posit
     protected int viewType;
 
     public BaseCell(int layoutId) {
-        viewType = getClass().hashCode();
+        viewType = layoutId + getClass().hashCode();
         LAYOUT_SPARSE_ARRAY.put(viewType, layoutId);
     }
 
     public BaseCell(View view) {
-        viewType = getClass().hashCode();
+        viewType = view.hashCode() + getClass().hashCode();
         VIEW_SPARSE_ARRAY.put(viewType, view);
     }
 
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/CountryUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/CountryUtils.java
index dcb56b065c..4a41e71050 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/CountryUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/CountryUtils.java
@@ -1,6 +1,7 @@
 package com.blankj.subutil.util;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.telephony.TelephonyManager;
 
 import com.blankj.utilcode.util.Utils;
@@ -36,7 +37,7 @@ public static String getCountryCodeByLanguage(String defaultValue) {
     }
 
     public static String getCountryByLanguage() {
-        return Utils.getApp().getResources().getConfiguration().locale.getCountry();
+        return Resources.getSystem().getConfiguration().locale.getCountry();
     }
 
     public static String getCountryBySim() {
diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/BaseTest.java b/subutil/lib/src/test/java/com/blankj/subutil/util/BaseTest.java
index d7dbca0823..7162d4ee6f 100644
--- a/subutil/lib/src/test/java/com/blankj/subutil/util/BaseTest.java
+++ b/subutil/lib/src/test/java/com/blankj/subutil/util/BaseTest.java
@@ -1,6 +1,8 @@
 package com.blankj.subutil.util;
 
 
+import com.blankj.utilcode.util.Utils;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/TestUtils.java b/subutil/lib/src/test/java/com/blankj/subutil/util/TestUtils.java
index 5e09412922..78422556ed 100644
--- a/subutil/lib/src/test/java/com/blankj/subutil/util/TestUtils.java
+++ b/subutil/lib/src/test/java/com/blankj/subutil/util/TestUtils.java
@@ -1,5 +1,7 @@
 package com.blankj.subutil.util;
 
+import com.blankj.utilcode.util.Utils;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/app.js b/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/app.js
deleted file mode 100644
index ae4a9a961c..0000000000
--- a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/app.js
+++ /dev/null
@@ -1 +0,0 @@
-var http = require('http');
\ No newline at end of file
diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/index.htm b/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/index.htm
deleted file mode 100644
index 5d3ea5edde..0000000000
--- a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/index.htm
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-    文件上传表单
-
-
-
-

文件上传:

-选择一个文件上传: -
-
- -
- -
- - - \ No newline at end of file diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/package.json b/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/package.json deleted file mode 100644 index 6ca0b421cf..0000000000 --- a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "nodeserver", - "version": "1.0.0", - "scripts": { - "start": "node server.js" - }, - "dependencies": { - "cookie-parser": "^1.4.4", - "express": "^4.16.4", - "multer": "^1.4.1", - "body-parser": "latest" - } -} diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/public/images/image_lena.jpg b/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/public/images/image_lena.jpg deleted file mode 100644 index ad90c8f96d72141d119ca71bd632b0261f5d7675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53220 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

pEJeYnQ2)~#9+3r{A;=S}?9Z zI)TJ#!o-4NU_*c(LEb@K|EvXHpZg=oI|is4_(~x*4iwBVkPr+g876=QMtN7($EL6Y zqr6j!+|9;0^F7G=S5YeaHFlqfZyYLOh6#^KVaT`Q7q}90$|R_b98is26S$n$@bGD9 zBk!qR%zbInZOl!#KDmJo^bYsEp7cG~`+pJZT}s`|IpD_qC$BzyncL-&)-ZPoyqQ{1 z)iN-@$18Km!Zj!+t+4vz;KKg*pzu&E(45$qxKOCa>Fa>#xb(_c`k=|!brR0)P0k6@*5agbf&6Bn*g8zq7v@M&l{B~p5kO z+&tZr8NU;b0&i+=>D|1&=QKXm?YRQ_iid4u)I`sH87XXQU4ULi^Nv+-6C0!dH;`dm|OkmZ9OEK;`lM;c}j+h-EAy8B{z&#w}kMjkt z-9;F!btlRK81IQexRO{EB6QMZMP<#y3n_Z8n_xexyH4WX^kLeIvqi=fUIJ~*@^Tpy zesIB(S}x%k3E8EBV+OZ`I}^D;u>kI+WJiqbMeBN7#YR5XSa*~1kDc1;#5nne&-24_ zrwYW~v~DP{eZ1vnT^}>)9?8wpdg!cdOmFajVdo)pusw^r`heE3_t~T`QFFm(<|JFz zglrkcnQ$G!J;GJ`!)WWeH5y^u7rY- z;reiw#X|4xg|^qE#P0&K&Su)#p(bMIJ-7_~D=@izl&}lSnY1CTl#Q>N*wk~p`Q*<; z&E^G9pO>)YM(L-WFZi@g?`Xvvg`3CS^eFv_%u?{JJ8t)1Qbxw9bZ0Y_ZO~sSRkGBl z+^<St5K+RQ@r87{pE6TVVs&)y?; zPce_>b|?@3{tHG9oyqynZEZd22II$mE7;C>&7T#ByH_41ixma*fAz#)wb*KlFz#$@ z_Dkb?!Y=q;`J!tAQ5cdf9t@miBMO!E<)q#mL=8*s^(j^z zB39FFe;sgA>U%LcmZts{=DHsDCq;-`;{Bg8Mul&MyBx0r0 zf}7jAC0~XIuDwc_!MVY(gB5et`p_$#>nXQWWYw8(*3Ys=KIG}Vjxinb-hopLe2Tn! zVLv@u+!dRicu}Wjd*_2FFY)V)7G{W^ssw%5S(aOU>qaIJowtwbf>)13?5?V>;?6av zSlr>OldtuedsU{_IYNGLmz~^?a^7ao;rO1tI9H`hN)%0EqPL0c)vlL^NPQ_;9riWr zbJ>;!Pq3O{L-QZ==+x7|XiU@#yhO^|3Zr|J-z-X=1YA+V)?a(R8p)q$Dk;XIVr=lJ zo^ec0tfF9gRmge|Y4xJdeI(h^32TypQM8O@U&x{PJyik2{Jz>lH#*x4xk`%Tm6>k6 zirnlcZ*R$vhHOh;V|<7t#tv8`)#aLMo{gRc<4GoE2G^Cx;KVBTWfY^-Sf7+Do>l1K z%o&m)Ztqb$hp8(x;S`z8#`2*ydFOLQsBNj_ejzjsPywVJh&WN;)N~Y zMhel^jp+MwZ=M7u9IXoG+VdU9<0@jheZgOTutcXHBerf)=TJ_*9(K}6*con?bYK-x z`6;aNabTF*NaGAs>sq$nw_#yfk4l?kE=hUx`qt2~ZY|(^B=tE)3i6I_M>atf>5;HDex~VZd%O`l44BDc&|>L`;3c`R6w5) z60P;H%3F=EWKijR$$$Zm;nh1ApYq1kVP2+YKA2)}6H#r3`36%L5fXZ2WGIxb6fkj| zVST2mump?0d28dmTnF-#CuM}7IoF*I(Po1iA!FI%YYaZSE;7kC-NG5~t&dtOa0b9` zI|M43MaF)k7>UVvBFcWAj2K&MK!hQduj{e8L)`pC%yPgt@+Z4cll1U8-Nlx8&TH=i z>qK>Hjc(+A)8n3D;BH-DDlL>LP>i~eoT_?9sS>IA*1Qhx#U3Z!Yr$UJ!yF+=^HCe6 zCg9?iw`V++C47M+Mdyg(%A7_IDrJ-Y&d^=!Nspaun^X#)-4)L*D&! zA3w`T=Wwjh@3+XcgsPf8q4ZoTW~IET>yWtu&pTfl;Y`z&S1>NSnhZ={xU z{Twez}0`u6}J#aU;gWnW~&4ceDoegtmGqzMylveaDlo>&;gi_CrOo{PSvhvOP14eA(Tp zUZvuG%6MSRRk$mUF5Q(wBxTj}b1_Yh)7|04%QmycN9zUeKfUKP^kl<+!cLt>buEl! zyXvvMOe>zQD6c4=JH@FE%t7UWF>?xOYbh*tIDoA=@tHbgm9a5_#Hjc=2S`+ ze*(ihoZF7t1h7O`YSR?|?oq22fBz@C?CWXatmKj`G$oh|qq z_$?e~NR!#_3>ZX3b~m%Z19%qb&WuzxJ;rlLHh`|0LxxT7$m6cPd1vuhBB(91tOZeM zY=4WJs73b-|AE@OT|)QFD`^3qj+P$ICG+}?cg{CWE?w)2BzkH^k22t4@SkgX#N%N0 zF8o;}!+@F*PZe|A$okxvGD1Q(M2^0_VIz(@(;+HMDAde(-6ib{ea@ zTX`Y0@ph$>L1$}TOJm*D$}Wum%?8!x$#;#CD+%+GE?`yqWlRk z%UV0MSIJSC^0-zgP*L^knY?>iVcm>^k-EYwcxRw8I;~3q^B-CSpR5POeOWG{TATc0 zbG*~$8hPbH&j}!Sm9{Q$&&*jE&P>i~TQND?O(k&xoOD0!<6s9mAbPqMhMt*$?o7T{ zlJ;JAiD0_YiC>Xg{kr<#_`}S6jnhHpop}_gpiWd>kZDMncT$(jak4s@68VPG=2-o# zUA_Gjl9l2C_LMeFPn!4W!`;;+%|t)Jf+WlLpI%>6`uOtk2$62XmG{U;6lPVz#_ZQv zast4;!IkJMk=Gn97-XmzBupeHAExzjO`i+D!w~hR1|Pozeka5LJwvu`BU78{A<)14}b;y64d)3B9VHR?mU7bc)^(;H0fb*g9JfWo=$G5Eax~g;j8cRSV=2|qM|WUzr-S=l^e&$XYP{07pXlK zQup;B&gkhnlf8`c#me>NoXQo{r^_5Y3_2f*4{{y)x5LUr?4p=gzB=5OE1L7Gu+WLv ztmw{pZcZMxG9Q^@j1y`g$y{47)Oe+#JN`1Al!okM`-%1G^w;d(6hLXmzH5G{fHpUl zDz3O~GM-Xvcry6E6M#Yb*KJ7JnK<8hz$=~~zFWWPw;uP{rvA}$PD{KUrs|CF?4#(M zO)gG=&98y z&CuS`T#}{l>3L>XbIa$>MZ7cgam~`TcfN{k-REki*SmYuU+%_WZB2ji@c?#4*HEWyR z&~h`h5yJ?FRO%AWEl1Pw*I)F1^lFV-OIxtds9<2K7AYIX~Z= z+f*A)$*919{A|zUn>e-FIzip@MDFGU&$w*bF>UQqCgMSbLUgLHRjk)3}&gZ)4#@t;AGl8|V#`r!ik%r*JhPDUI$PImK8n6=Kr+xa~I0z-{ z&o(B!=r1Co>iXDPP_sMJIp$NzTY+c#+HTG?C8EPf`0CJX(pxK^?9NOLucj`V06Evj zgfjB3cO>BpqU`RIkX{j`vo}8Or(dTvzJVEcy-?N$+(Yawue%C=!_5-kH==Mu3OkIW~j$sq@63wCA}4hpJ-FZ3$8Sk zz)iW-DQ4{8si)S#=H%_!gKPsz)X7EO`s6PV9N9NKg>7Le$7d15nN6AmLQWzYF| z9quo$IK?nCnLF+(_Xkb6Cl_3lx6$AGbOK1NPG_}^a2`8vKINy_V5LdZ6%1@^m8Y&s zGP<$6bwN))z=4@3tRgBZ*9d;+USV4JE$!&3_N1n~yugSMCd<+ktv=MJsEQucUeB}V ztpug&w}^<}dFa0y%l;f1lZLOV-`ck^`aCOs3l%?j&wQ}JGG0B6t zd-(maBxKEl8KP`wLzHv4xD;HCQHsOvBulUVdX_T+MLHh26ii&$V9D z-Ur6NrIPGdxOayR+aBQCoQby18*MgyvQ*zm9!@@(Ig4_@!bqECssaC0M4>nV;5745gB=zU(+;i-Yhsbl%V719UlIbfl0cR2YxrbD(UmI zHl=Cu>-a_jiVsq3*U93FYHwe^MXPr2ur7G!w#}G&H|sRZ@v&j48q>1+J3m?zt7~W7 zE9TeI2c%R^dU3o;5mry=Jx1>hHpp$@ri`dx$=iFclz^e>c}OlP4q6SFZrDE0QO2$CoZvl9vy!U+V#jXq4BzvcI-A>tq1-iz0-?CyQT-h8&`U_gOPze%X6>Y_>`1sC(Dhch3-(dPAya|wD*HLSrt5l+G;@)hN~H-quF9^fZM6b;wPq0cYAo(uLa_K z_m)lUwC5+s`nWNJjn8jKM~E&aevFi|QSbI1xOuF+wwunr=EHv>Abs?}rLgI_g}`l~ z+v-9^I|efedyJHb8rAEI7vEF^&fXJT56rJ~nP~7Iw&Sx6VjAx^B|^z-(x773CJ^@? zb%)enX4NK(YTz!hkrk4mn~%Z7M6IIi z*6{hQ8z25Z0D3@$zsL7ny3yvL1dha4kn6rq696>IDeQ8_(MWEu673;g5yM31!B3Q^;Yi+1aX(~(TgB)Ne zXKBeW4|D^>xVo6#z<_^WZ}&pdk@h#&1VyeDI$k$>rIIE&OafkQ{CeSs~_`nnDoh% z{4`Tqc>K>w`{lR^;te^CM2Ewd8dk05Pd7)Pd2>s;*LD43qm zxh8-O$pbrmKG^K?eCu61%wjp0=^y;#_x$3nndDto4NuPYmYa|`Xthm0&Q_OJdX1$ORWEGZ zI=EG!us3jZvYtqA$n5;~k7Xb=0q#6JGbHma2sgV+T7j`f*?V-w z1s0a`TuT+LvNYFMY^fTq?Ci#X0po!3yG&qYL`OH;zC`j=UP{p+wGk|yV$~I2QJ8fc zzhb@$I_8H{syQWH1J-CXgHIb3Z~xYN#3fQd*|x9I_I~{G_uVYMOZ?`AipV$`DWP9r ze*E3`N7U*&UN?>6xuhA-mqfC} z!5pBwo12mT^V%&IH1VZrQV&zxwq>7lTnOsR?bzKRh)9sw#+(={hUj@6`*HE5epyta z-^2*nRvVR6j>^i>?~KQqTcdw}EjDHY_CV^)aubO>&djVtdA&o+8WdU-uxh%LaqB)| zyP<~OGCerd^h@xQ4+ibAeYcaIeO+?t+#r!W^`y6`mH2{O{U8qE&X{f-jx1M|11o!n2#>CB}bNJpML1&rPy!RC;_xR+zMeyyH zSZmNkt!`vlEo5-1A08z{hhRt9N}sab4~=ohBGW8EKa)|ivPZkTy^7Z2*aem*qt5ZM zssM}eIB~TpQI~NY) z5md>SQL?s;5pDv|a#tgFJA!$4+ppi5F_VgM+1U$os_6H&I*yO#D+^s;Le`-4Z}i#M zoxJc5w5$(@T8;aIT)r~ek5-97wjAFt`Mb*cZ<6)au+k)XJiDksFEj<2`N_4bOYqe=R>Le5Lt$r(6#t>5}b{0=w=dW8_Sm{Gm-( zcaAjx%^@4Sj(042l1>R(8*CXs0DRWi+a$L};#q{Z6|E{sJMB*lIKaO)6C{_wKlAYo zaUFjs{Ia65#x+e^MXu_E$8M&BdNBul%+m{*@^E!za1S@;n@|cU3_GuL*E5W`oosds zqK}grfc!_<9~EoR3=HbuM1Ds3D8207bk<^|Hie_n;bF0q>}3A{Vm2AB*XE(Z3%TsA z5i;YDeOISjHz_Z!6ZiA~0CF2(s84U6XtGMhb$Tpg)c*kg*EaOkQjGl0`%~$s(VkaN zyVK;)&XNEu0BW|}x@>%V=J&D*w^7>P-Mkx1CxY)lwzeOl+u04nkDallvx}z{p9z7=3U50652K0rL0fR<`>{VA6CrWuW+DnWnju zZnZoHYCBw*;)Hw4lc0wlbH5<*-#KU!wfxr!&LE|WAw$TG--#s90y-SGNt=cMIa;hd zM&5mDBS|DOD3!^mSV#=O1MrH{weiiL)Eog3b=8#G#}tomWgV=S7e*y(Eja++m&MJ3 z{4`GW+t}nP`Lh$Pspz^bpwaEk(Ri*kIhUR7$zZUgVC9NEO*cN8Du}0C`*fG@aSchFtmlwA^InEe;nu4sXIe6EuTgWi#iG@Is&YS8pP8C0aqM$?O%$nB#Zyz3LtadaOVmh0*&?ih9> zW9^b2Yiuk`_vss9WA^I=i!J$rLs=(}O0xdVM=JAn|2E z_M~DC>VWslWt>Dccy@U+%`;1yd2HG%Sf`Ipluc`@>QJi$na3GEtpTqCKqy?3?UiMb z$U!@Kl;Zu^AQnm+OthNr)R(7@~gHcK%o4^<{LjNXm?tb-xe)M?I5iT(=hl!C$&B-mRXn& zG-AeQFD5tT4?kGV^%yTC5bGDm>n6|r+G5>SRv)sgc2IicA)I_yHVQXy%pdv8Up^GB7l=-Lg8hXZ1%2}p+rX#)&@q;+ zO7aW2Vg|&DS3I%zcgjDViTjmqJBB=K-@a~pAf7i-+aKNR@U1C`g++cL(~;Vwbf)>e z%;+#lKUb#^qPu{`yYK$qV$gF*q;wCmd|QA+3UnWUCk=20Z zyL7E6dV7lIHXNV_X((|%bJR48tA8;iv5B8hxsj1A$PuUrdb#PrI`|L6H`sE63v`*V zn9b-~b+xXMZ9f~3brh-8wRu*7cc?+c?1sMxA8Y4;lRizr2n$!XhD}|8yhCZDnS;Y* z!~N-z2t21@*;=Fl@Q$0FjH&{z0Rs;D0T71(<1LKdBeaoa1# z2sTrYjzK@SEpa)p1{;aus@zJzq;LVZrxF^1!kZeObFj+{yPCubW<15B=~9~}^A(Pt zD(`ag&Yq;K1r%HbCAk_?nBT-@k<(6ljhfD*6h`Q~k2c%IG%*W%hl=9Z$kS=?8-;Zg zQy>);4O$*M6PFzk;od=@>Y@+QX%nRDmfm2~VZZX!-maWpNJZ@E#%QL3N=pcY(U)*X z88!!SGZJu=IhOe3jP{7#GKT8Kt{q@?lIHsp?Ea=Xj@R!F9S4| z*1cU#Lr4MH3`{7*><3-2*9PUsCXU;(-7CwI-hh{}MX%i1DJcNtG`nU(YM!8>xiqN& zd;{#%&@jdPGoJ>GC0+U(7eKs+jpwC?EiB9B8x(qoovm_+t~zqH+Z@6KWUe z1=1`KZ&)Ee00VKjr)~2jL{pC`T4`&hh`)Mc9LoY&ZP%qfS!W74CU&;QM>0DO5!Kj} z@TgttTc88E?UoISz5YR@GTVR#7PX zDuPlz0oZ0nEL-wx%ajr1{Is6x?)rO+`{`PH``P5WzL|vsO*5G!WAkP`^LGf;KzWJC z&P0~uQV_Tx1~mkA@%%h8L!B@qaQiFrd&?i7{It5f@bT3(&^-v-elYbPBHeRG+8MZ{ zA`ZdpJ1a@y#L7dP+^wQE@gU%Nw#;dCPyz>B6wJy0(K?cq zEExOtrg>xT@0CA1R4t`J8l!5Bgr8 zuW9CG*djrjYBB+y=EzSXx1<3X;$L8wxJm%qmGsIV`bmfVYzA^LR()Xv-11%0X(nf z8`*6f`GOm@TYFf&BMfO6V(lWKsf;rbP_(blGoz!&nl&d|9dw~P<`;Q`&RX83tKVH| znmksIcOwaJ(Viy-iP<5ybuC^!2<5itE;zBmJUliUr>e;*nFCByQ2f^OtoD4`6G z?FgK+KohTM}&cW%=G6zs#g+gz4~F~{{Sne z)nT^RUVRSA=Gp>~(Nj^@B~%0JSM0U)%#_*{*mtSUcP2q8Z_l~t#l{pjr>MNv_LlEs zYKvoLtgH2S%W$nIC@a>Ta>)Cfb0a<5GAxV;AwVAzsQ7^d0CK@5sV8>#2%w-Lc+iGD z$?Oz&IWky-yU%|xzdF2;`DJAS>vv78>nu!g`FBbpX^f|-m8-@TALW|+WbS8^V8?u< z1LH3>{{YTS{$zRKrO-UJVHcKk+n~zUcD$}`olf7ql7p{8DNKRKE_0OzaFj)e#>!jd zf5|;_%(rv-qtBX<(sa8Rq`K9wujU@I+r+$?iDN`S2k;x@PGB~OwT>Cc+_n!j{Q3O& z(|<8EUoL)I{$E<$=|7i#SCyx^^}vYgw`1Xsc0hg@qgs?!H6)ffu+wQ}^-E__uGK=0 zI2(MxQ1VFEepI0z9w+CU2UihMrg7v?F1MOI*QRMAGS+tNC)6LXhCR(sx!Wn!Wbol_ z`YcB-P%D$~y(-jPOc@i6t(Xx*82clS^cl>|?q1Li5CG(!zlkcspJ;SG!@f~Q*&yWF zp<08)?_S$wfFPIu(l(GWC0DI|iO(#3-SYnc=XyWXWTJ|z1ITvkOx$)x*+Z)BZ|)1` z%_)dPB#Katx{vFf25|G5c2*<-ciaK-^4M+SM}G{#HtZv?MnI&vLsG!}akkVx0-drG zZO0eC{{YT5`Kli${%zV=>bHq!p?UVwPcL81D5O!{$V9qpvwqDkR3{=uIq#VI{601s z9O*HigOdE;R(@>xWv-2djr7vkYhmPy(qO7YevstrR@kuU6R97|wsTrBDCHpZ4(}w! zNCSM|8u^( z68?_T2#y`g4D$(ukfZJhrQ}Nd^$u zJm&8H;6j%Oi)n3eStB5qmS#W$JILFbR)(8bVVN_xSu@;I`%O)BO*Gou#FJ}x;htNP z2=o<55k>*)+@E@QVKSk!AgNpgPI zu*{G)rnygrl>T3SU&rTGzPQzO8E-Vpomp({taRlj`&at0_>)f*;~ZhyjVp>O?g4Do zYcu$9*k9xCb2M6C8eYAhr2a|#w6gN9m8aZl+GUh?I#s0I}%!ArK=GRLJDNk!F(mY8jjr^|qo=)NXs>ghV|2(U&2gl8v^d zHSEx}SH4-T zhwi;R!su(p^_`39%S{)`{#ViNwX2V)c|*$<5wqXxQbZz9q;yuNDIA}&qNcgXLUYJ? zNhFf>`6G)EG5`Tw-xL0LetVD1AihxYT3zWMmo_pilPu?j-m`GMCc6Ob8XxZC>D{-^ zt3lcR5E78x;`>Xq&QfCov*$%pqNG%f*mm*Wz8SUaZkD!R8Df1<15^b~%`07p%Ow$I z2I=(&v`)%)YI%wH9`9+l|-` zP7hXdyB`kurIfgfya#3SA{GS!Ax#2-$L{Tck_uE{2;<72@m~AnkVF5|JtCoiZ-9ae z54E<`Cp@wDcg#PYY6hKh6mg;Wm>PWooz8AMCv2n1)^@P{!F<1@pMZ`=hJes~JN`BK zXG53G=Cs>}TB;I(gE%xGYy~~3*V`~jb^uUJtj9TM!;$Mv_u8b_dgW!mA3~d5*`>|2 zv9eM=8-Y+rJM4QmhWQ+RqeZhWKCjb1%lq5!KYmPk3(me~oL_2ox_q|!+_P~eWYZ>i zmgtkZ$;A}N-OXFM%?7$27E)u?%F#@b!e0dH_wq}3d2yxQ9bS1aE(z476l=+4ke8K( z1pQ#{mHI8m)BaBNE5;hyo<`7UdrMENQMZIK^#!Vijl<` z3RsmN7$d_py`iWXa!(lK3%b!_B0ePcCzI2)e=uAmvFYzWt1N%sxE0#J7Q?6U&1_&p znRYiq+)T!3>>f9{lHeI5wv9;~X}3T1zIbIIHY}lt&*|OhS_hV{Cbn5M7fKla0MV?V zBB22T<8TE}vhDAXIl2x`WOQ}8WM@Z)D_LSoaIr99BE~33ZMq+9u0+$7v`FFT{Hy%y z)0fF!a@8cWwOMTLoIS>!AOK4n6Y%pR;AAx@;8Y*-Ng12j+04Bq)^^UA0ml)|1NmjH zev-L@&PiJ7^rnh!I_iVfHgYjvN<{!y({sme#Af3xE(CRSdU@R9dN5DVA31rC%${nO zOxAVFokGh*{ms6Y%Y~#4H~riTLC69sO-*wPv-FUJOo-mwduLlIWZ)9ooB1vV2 z2PD7`wfw22M{TLwaSED#fQpDuLm&Wl>*7vm^%J{#Z9Hn8+!-!c)IhIMQAXO8+M~lY ze7UpBi@6ZW{NBBX(^>0E@Hv4&2uB%Y~?IXT!ukOU;HUN)n(pKaa=3^Ie^Uk0PzJI>8eN?h4kWh_4uHuq-;) zrffvPs%!A&_N5+j*1tj9Lbe)>zMRmHRiKhN7_Y=sAS%Oyh{ja){- z?u^ltm`K%zhu|ED-nH+r88RFjS4)YO0}QStiXb2|H-rAc9ZIi{Y>}7AkSzZINw$b< zjb&x3#cwZ}tgf`_(sE;Dm80bkrpZ-u9x$Nw-jv@m-~>sop@hn9`B(XQbLS00+h5o0 zjrN-J81$_sPk`!oFzoFy+l{0L`_}!V@DBOU>vdxkcq7lRlez5f&hg}OPiT%_Z_xb{ z$u`<tV-hQRASPdz z(g=K-nu}h@wpxCj9j%nC;MLLF;Enr=ictNLnfl2IOrBQjG|(}Kji45JB)N`TC{kO! zoLso9VcUA}{iDBqvsaTakJ5K{I5aYz^5pa{E9uI!{{W>*@=G`#t;?FbyLTtp<{6on zH*O*!8i;#dpA>3?;tRn_mY@|KNEvKJIN2|~ky^r!8n04zVB3REokwi4+6(iS{&O43 zA}Q^46}B9ujiYBB0AsZW&%RltmxqxWxcImad*S~8%6(wy{&&#C(|R`Y+>0xzDak}P zEy1}C;bh=<&Xz{S`8-A|6A|tzKbtl}$MYY}G5P`%CG$w=#-&N>2_7eUWqMzu;?J}p z``hwhuq^`;D!Y!GY`RiKi+OeY0oTdt`Oprw`m0%DO!m zA!Q|gbw1|3eY2v}a(TTsCTfn#J{2dB1BHA?L6}9_M{t^H?O9YKdQ7eMyMj7>*-VRm zHf3o7%EWqo`oc!cVwi!t8WMgkgl1kS#~-2*x%Kk*9;`EG zGaPa}Fdu8>k2K$%S*~>|&m-!Sn|&HNot@GpCzBpq)wTkiGkuE%L|-?K*5)}TXzYOV z1-y3J?cIxxMkTlP$ZkcL!x?T3y;s2HxoAsg8X!!I=7YYyS6HIAf>@Pk^GhoRl4e84 z<0JJ9pq{DX17ua5v1EtTj5Vy#-Lfz>5=qrkt6DH1R=ecm9;cHa$-JTEiM-RQTH3I= zIxm*JCe<#iqonfBa_V8Uwqa7!Pc0TP`zi}|%za*?!WGw}nWNHvW_&k5Zcpfbjrl9c zvuK(f)&8qLJNtW1TD{3D>Dk7Fn6&G500vZTnDuw5Im_jo@{&#YpXWVZJ{&+s`Eni4 zN6>B{)BLGEwXI$zm#4)mN%e`FY8{d_?pgaN6*-rRvBT8k=A5$6h9ce%sQJfUMp!hT z%lo+eon&5HeoltwVs+E*Ne@un+2hv0juYvwkD{#g8vwTVT6N4fHnN418KICe zy?PWNowEjVr!pJv9*1wL2C{;7b!H3;07Ymv6&Yk?;?5j0O=RrrO2{ zxR&Zs8j1?_C-r5%FAX%D7WilWa!2#8$sTmlr_lVe&97ft$|V;Ts?LD)6=0`hPT7$R zQ=Gv&2OlPQ!yKUz#Uef*H|F=&rm@rw(tBd(l-XaxX%DzOi=lpx)BL-lM!(&n+}@r&3l2md9rHn}%VeI9 zQKG}c2*<13C6uS`$Pz7fZnPBbntQWu)WVb&?8aC(7FrObjsAHtyHcI+36K*QAdill z&<&}RiKe+i*z}rgGB@u278E9?fDZfSL~^uC6_@|klq6&-4k1XP*!|h%MBDEB2hE?J z1D=<78;LZh3R8W-`DV|u&kkREgW5E3N%D4%D7`q3v+$3IS2}G+DtVnRCT1uWg^Am7 zN)DX??V9olgH5fBUG&Q5#c)l$xe9T7TUJA0>^I^wSx^6nxpq_Rwy_r>mjM-PKLR#$r>D8&JEKZ ziN8s`igHh_+v(ndkwDV=P`Qhy<&{BG^kzI|#>OI!=zTG4FKndJ?=II&l`CJq6j zl1Il3rE1EoH&Qwtxd@oo4^X1{EwYDJ7cpsiY$opKSeh7Z?5*FNcQZQy0ajnK!Kgvl zuYI=4%#JvccMX6OL%sSZ`7QZ*Z{(aE z%xiL-v!StjO&%P0afp8i^~w2G6qky>70u$&&{tn`O8Gme6^}uLFNm#n@`h)<17#}PYH7zjDFE7 zl~GQkY@hOGBjy^vmb1!0jfhR6K4{W>*K_3W&Ce>_CG18vlTb0K^wwHO1gy(dcnRpp ze$n4C^;&NZHwkj+=IFJu&okpgpL6KXB3|3+HqEB#_YAsxPQoZTR3RpZkA`S-8A#lZ zC#}Hy8Y2HV^^FFb3x_*(Qz|(3M^LAMG6(@63umi4Ljt7SO+$}~y8GE0W z{{Wf4p4Z=)`ux_qK9y~2q_fJ}dDNR?t5Rj5JOLqU0q?h5-RZkFfHLayI_}vrmjpiD zo^R%x??3rNRGUWDZ~m@sk~#QVaZ72Tka~#9P$>X|(=xmaay8uGOIx220)Pjr&F-f+ zS4}Hbxg?d}atgO1YvM`Fr~wyOn=#9icfWpfp}eyEzq|@r?mV@oTq}z8Se7QGd}u37 zs|M39eyi00@C$|pLaS9(W3cH{)8&~()t#Ad<^GP^@0_$t5Chx6FV-(Z(|F_fn{RVW zuRdQ21oycbOnxR%A9;Cx)m5&w1G#oFK%{~=ftVFQZCB<@!{>By@Ax$D2S zV*#^~DGO4nma2{`+Jot+_reO8id*Vb@>*3#!bsfjmIjgv7D3<9KBGbIbOs z=myr#7c;r^%|x9p$x{)9uxajBZ1fW-1t}{3H`jr!nw; z@^np8cCR7Rz-`3Me3|8$^et0O^G}?-RXGD(NV7bKq7d^Rs~Nzp<%79=Ao>4vg-3z*DND} zkv#^UB_#q|GfY5@l%T9(0TlR-ba?cG2s>=^8FSAuxydN7wTABAdz*!K_10^PgbW?o zVh#o>*`)}J8##Hd9NP0J8S>rMBl%OS0lM(tTUDja-4 znf_JUd1Lb1%ty^I{$A>Omc3-Wbdhm-CreLRc)MC53KWHI1)P>pXtWuZ9@3RnIA^jk zgT=c#{LgDoJ<6VHzO=Zuy|lLUzeh_5Ed{iL_mC{A#1&#eHL2t_%pCa)w{|!%!UJIQ zy#m&Xcmg+Qq9n+QaBV7g5~yv9CH&zr9#d0R`?A->i8v3agMN7cL2qiF2(`R){sEhHrJ z3j9HJR^m=Y{Fc^<+w?o> z*A(mfwybAy{z%F(pWYDcvPSU&`LzeFGx7Tb^E>ok55F?V-P2u~eF6C?qqH$<-eff| zc14Yvbpe3|so~UStF&?u0C#C!q1@MoWiwMq44KxCjd=JwwbMW}ePcx?Rqt6c)Cu{{XckMhSNn=|GE2-QvZM9DN}CUQ=DFo>|{U z38LvMsND%K1eY&;B6?`6SCTX(rep)a00jqKhF^mh5!|}nqHR6%9;bVvS;eG5s?EUL zta@&T48EjRQPhbVM+K_qrvTJm{uyq3h7sWhns{P&A&>cgP=YsD#nsJ~{{X2RnsxL_ zk|M}gb$+4#PkC=h(6kGmGi!3k<((BQKCq8;c*9|!SSc_QUZkip9_=Fx=ZLviGI_mp zrXdl-$UbM+{{S?vzdJnib#oM!K1=fGHoivk^MDK%=VNs;uEu+ca%1}|RwUfmChB-~jE{x4+LdGnp?_5x>3dx=oFxHM=c_1T({(AF09GqK`+0BBV>{4O|UN{&CC76CnQp zNb>h9sT+yfDDF%$0Bf}ismy!f%tM2T4~g*UPvc} zZmn+>F0JN~V^p?vG`JzRWDm1(tvikLtuW)Ddc2+~h=U~S&JU$oXIYKqLZ~say#q>XJ|1)PE7-4!|hD+%@8>N^Nn}(eTt+KG&;5Fxcw<( z1Z81MwWwP-pLX=41bT+GcH7@JbYyMNZ#?sEkJAbm$z4fDDJFgj`2dNUrDJG zTEc>XK#{;!Q`JeSre)#9a;FC@wqd?!(|<;4zJs!?a~GS?s`5$E%vUkL9*5LIene&# zrZp;O5=dikM>Wjr8nUk@0LV`j3(%9bb{%sP>ylzPjXftu^1aJ>iq1Qmn}4WjHz_6V zruCB2Au9p{&r&F>@z%AaXfqypz>KVKPTLlY_@IuA{{ZuL%SO{=^B0u0+o-Sn!{s>P zz4BL_EM<+?QnSC4)RNZYfn|^O6o@4m){|+%4L^>pyt`xI0h_I$OiJ{^k4bQf6cu% z=0yCM@??wpFGsmaJokSS@>#ARptjRh*Q#4mvQuKzAG3o;h#SdFHM*Y+3~@hKH;sN= zE7@M%z)^k~3Z7fn!2bZXn7yO)`<>@u)FZ*ra(zdoPN~6xs0ui?vD*b{_8v7loUmT>9ZJaEz^>msbRd|k7LU$yQ_a2x*X)yzv%ly@TQ;Fn& zsXs+WT%2s8F?q$!<2A*+?9AwC!Kp<%aXmWkl9s}liC)3?Z~WuLqh0dPnEbHr!Sx+B zSwgVcc&Si8@u?Nfr)SFX$|t$g_Nb{weFNnEZf;SuY!5hjMI~CGJY=EY<_>F4+j+Ur z+kWTEKbqR2TWKz#fs$s~Yuh$j2ysk0j@iq>gpT*m7EAk^$ytv!wv|hCJez;loB5iR zJa!|+0$)z~1D?D2AvTm8ztrDXv}lwDVkA|#Kr8OMW-en{ZP;llT4EnJc|%W=T-UT6 zE{y*GSh-U;`&3%6&H5ST+hmLD7k-#jE-m6c00=iZ%4Lyz zI7fu0Q@WNXhyk171nftThtrUcCQ~6UoKy!41sH=*e+;$_Qr#z+sY0f#J9iz8Yu7Ff zK-nyh^83p#=C3kB9zJ$Dc@j#%bz#sN?eCa+{Kpd4@TA%DzN~o9VuE0 z9OLJ6HeQDq;D7(plG{qWBVJV6hv+@Vd1T*v;x7~Y=8YuM?v;n7Slx?|cH6_hwq|yI z*#Yix^_$^7Z;~_%t0-Vpva)$^c~$jGmIg%!ZZM+!DdEV~v#iZC6Bm%uz*McTH%~nC z=(a_qlG{yTG^;r+SCXW0LVhMtqzdNKL~PkEueB?X*^b{s^_^2f(X^|moZLYhHR2N| z)s>XI_Y$3|(Sue!zQ{SUMv-DEn%^SZ3&pL5yz(7B9~>a!|G6$ zuKU+7#VK(f=9!JDANif5K)3q#uC*`CjLxKFRa;spL<}4Gu3b`F`SC%|py~tz)8jYR2i{w4T^*WoULkSB;nU7y^DB z^GAvk%qa7>qSWP%nmcj>XXnK8OLud5eLn@B?sl4P1BfppmSgvt=KOs%%AQtI;*mY& z^jDYd8Vz>xMoN-Ux>kUCh#QyF;hGN6HeT1f=Oft z;sASiWWa0puzQVD%uPMyad~RWZ5|kbis$QGE_p7-krblStx3snL=JXZ=bCXmg?+E5 zeN?b#CEbOu)m-WKmr;ns&mgBC@|4qlJ7w?^#bk0J#MT&RhY9Cz5Ay`( z53QDeQSKy?S8yl`%Eie5`?1JCSZ%Sp;xEjdbn80&wlPSrX{IqlC3bmf@gMd*Go{dA z;Dw%V6Wf~8JiG&tVz8u%VJ6<~vt0l;}I11}cDi{*$MX{*^2455u%um#8YBnaBm!LkjtycKy@rRV`<-fZ0QdPH#6?yJ%+P<6? z@fyi1k=aMmPQ$Kt6NepJ$KaO@+P9z5E8Ty~Kca07tWnvYN?9L_^Q?|SO>?|7+0ob`f|sIscNnhXOjrMU4KK;59Q?^=IhMOZGU&==$J_& zT-2m-y#Xrhs2F$YQ@(SPhCdgIK*WQ~z1_sh7`zzzxVPKxdjA0A&*c zyRo>5Be7<WQwltjyC$;1M7-sizuL@~#ZoYK7Hq*`?B)e^A`AUom-u%X*)f9NUG5 z@@w+aAvU1ujS;>K}sFKJ}8d~TYEL9fTZkuj6+uB=$w-~_O{?k>v=EDq3FTLmW86}%@$Z}#=5b(E- zUNsT}zeCA)rE8YiA*|2>pG#;LFutK}a9Fe6z=e%R+KPyF?@_*JJ3vt{b=gxKp3h+% zf4e5ET!GZmmFrK}nrEkhJ3kVAovmKw-d27->79CO&zz^%n^qCM|T@l;(#b@%KX7KhMVM=^wzz%T~kc8lj{~gSXpF_IGmLujaH?50#05} zr-z${G34UnF(5t_{KfN3dN-Hu^<*5UW%P9L&0cpB{hCv+5xsKU7;Zo@*Xl-}372?$ zNEM`V&nGD)Zc@m^ay2Bg9};)Yo*+gv`Pq@lE+fpcPfz_04}{fK%{qOj2XDKkQ`OGr z8hU@^Mbks)4>4)XP>oMQx>trukj-w(GX30o!5l;? z#JrZ96G2Sk^AnRXdLTp~JenrM>e+ zS6Unri%mAhIW*{*gRuIrE$Yu*jXu!_zGvw{5cKqPy{jwBZ#zy}h0Wam0Noj7j!7kq zQ5H!gKN7Encc+GA4^ye;Y3Q+OmNuSH^1h|0M@e;i+v`4LAAz8qf|oR)_<;&WY(yjB zgH14*kv>Wujh2$|O@DPi_e{DDsRET~%=KSRStC4Vw&hlEJ|*z&l;n>9xbt!`fj)0t z@@9!Ppf#U3YxWvy>XKW*ZDXlhB%fRK0Sd+$(ZVar$-!KPWm7@1%@?#9x!^G1j~5=^ zcJ!Xk=?0=XB{N(j@lUEhJN(yw<`{He$`8xv?qj`|PqVxH#eG1nyp|BW3o7aQh01_X zLLRcQHR37XHJYr^l)#q4x%Z#u``pY}ClX9|A9M5b^Fz$KP2Bc=MDnHSyz+;YXOc_3 zV0kK$gsBs-4h!0BLdnH?|X3GQ#^&VXvA82X>=fMr*)c5&3)vg|ETSS^>f2neg zFh|*mk0Hb#1HNC%M7UyP#=DVMAH1=aGAi)V(YxzKpQd5?gpzm|`kx(x1|v`OeM;$a`FQMFwT3-NP#+ zQp#x{{op-G>_Hteq6l*1AX1Mp=vQ|VuAyhIURZIA1h=;lv|Dv7j=vE(DCGlU8fOA| z6rRe*Rl2MJ0!p6kqdq8Q05*`@gFzTIa#mlV|ozRC^>D^k>92@>5=kdV9GxC>EDucpQw3rPmlpwVp6OgLPAx(_O~6T{tAPBj?Y8;jHO*0FmP#b(kq zd$&Vi6dQOPl?!l=YB@WB@PS4YEm{nujsw2!k(rb(CcDGYv>kr?O~2ASz2+I=)BL}6 zuKKoeIAIC5idY5A(KKPCN;oWI;qdSqm3ohJ;340>(g~AK6Ua$j}3zd3Xxt$o=b-5)`h-;w1YG z=zfd_EWzfOLc&BT+18Y%{xteBCAty`jiuYi3@^-whk*yBRZkWb`5dPpu;k*+!fZW* zK=TlD=t*;ibjF@V8lQ9v`UNR*`8{M|?!AOz6BvhZ5_Eu}X z{pIv)@ktv@;Z>Au7z$Knk=}p}GMWByc$eoNnPl?*g$;$1`d6ClqRP%V=mb!v^0*)B z><@{}mX8mKDwjt|+M2He9Rs<1T|+eNSAS91t!vPdetQf7)*310=|G?Wa+}C%3^(s(XK!$$-SkkKIkigLemdv7pO<+L{dM zj!N@Otmv@9D$?Iu#)v0`Rn-FR)lnF>1??O(-G=>Bu2+KMWcUF*An{}l!SG6_BQ`mKFFZ7R=JfY@m z35BHgwwA+JM3v!^FIhMwpD$86Rd(Ne+D8TguvYr+=(PrVCAGR=w5b zfu@4d*-B6Ku>kc}Za^uKejYWbI~>5)Xrsl)$X6$4hhI74@aMRX)8rpNdHc)0V)Fi{ z9qz9*+Rl}&f28Ohab|0XHAR_283oC&sUQQ30&DQ*4}@V2w+%XpN?AAMOj^c1YjX7z zNX={4VYLUnGQ5&(!yid1F7$@gf~t_ON_A>ADr??{C418w^xt~u*hWtiP&VRD-Xenq zEK>-|m3}3-$fWKK2O&Z|hE+EsAJS8cTT87pC$?V!x{$#g*PWmk| z0Tg3zJIEM($WjQ*0~j7f+($NA^#`u$8kF$EAFnEUOnFHWW;{;8NZZ46m6(R(KJ-o8 z+J)?Q5b09c+#7?&8(wBHL)Vj#K*>UZak5B0Rs8S#pZwaMT{m8b$+ueOn`3Puy13F9 zUivlY33$cY+|uxoKnth>}CMa>8M9C8}RBjlWM;>i)_`ZLY`aJ{nECWg&O zip3%qE)K_#|RoWGf zZ%K((9Ji@G$nA&2EDV$`Z=-eP1IH)?p2nSPur)bkA!l}($OPl^r%FC${L=EhgvOA; za&Kl+uwf6y)4ur)ap1yAbc4jq2XpmrRn<_K^z@@gYZw&q+o$o{IEhZk0qEg~i;-gY z`u_mbqGIJ^Pzb5nPSv0%B~lFI7?=OoIJTLMyc`tNC?mgZiRsfkzE8W;2mHj<&V!~M zQ%tjp^InD$bj!QQgz?&31MtglZ@S4M{?9N#JJ9BShEeeV9b8RRLB>qFJ_hrpweFRt z-RoXx)aKWG{pV?};JQn>UQ4?#PDtA7?(K=I%Q#^Y1G1=ZU^@&EiT&Juk@I~209!d@ zyplIF%lbbC2j$x${8@U_nR*gNS%r06v zL|}gP8i9RYEnkRnb*hoeV`OnhCdHNT8%ApSmXD$NM^4aFOifG5`f!pTKly%3r#w>n zLeT1VO2GY8D>AZ3n%}O=n z9p#=v@~oZiMjgX5@>HfBS)h^?V2-4w_2vyJ^V*q< zsHtP(4$DC<42B1xeL-O>%@~c*f}pFlO#mGLrpA=sxz9>NojtBObLh+TqvoMG_1cIiUZMT1Om6>eVMVF{~KFJ}K8e#)68!-U* zpKZ<#D{-d~`U1-C2*OdoR85^)j2QF^-z<29LxNy=Fz-A5MSfO(YQ)dx&n&|>r7Hg8 z%$j-nmZ=L7)LceBJ^M(k4}8wk_J&M*Ud{%mvoYp8w|;5h{Lk|B7*^UV+qOMHSgn~VK4qzx+PQGzE@qNES>hi? zwwDyF_o5V)?ONe!f!;`GVOp5ek=Tv8S8U3R?WR$rqffWjCDpC$p5yB9%1CKJttcoC!)o~BmSY?& zwd2HcN}l`w066hyuMf{FJ6mRXtTg)xp7P+(@vRg9$Ha`*cAla#(wgQ=u+r&{EkpF) zRrJ2Mbv(SJBC)*>K}yv4p4rM`hy&d2ry_kXiofR~zdvm}iwk*r(gS^~-NqWzf!PV} z$LY=AW%hjaQofEBvsn!^P4j>M&_A+_Hl1$9K*d0BNX zHLIHy)Zx-5YpSa>n+9Hle^D7yPt_;ZcFf*(W^}EwDcph=6$D^i!Gm%7`C`;C6eyh=dqZ# zqiuZz%#MV7M2;j90qac228)9NBfTeQQ`S7fmr~wpGtRnAud1SXno_{9SD}8Kx{@-% zWE0%JAwV1LM(W;MPB64q6GeKOZMp?pvZsR=W%!(h@$FhuB@=W{L|v5j`gheeXVqav zBU3+H2@zmz833v+Yx}kPDckmQB%9r7=^j+oqO-YJ?&fPqZfz%f{WODEAmb}jFkxt+s)NS+xybB{YKZXmH$dXEFloP>|6(E?5}Yb|~+T`Tc%YHhG1y?YOQ zB+@bUWZqJ@T|-pUtxHj!uiMwHvzAWCWIdS%L1G7zmh zQ@HoRZ8L+>bnEFDfUJ1Zq#l&|d@+{o1{C!j4(FPw0VHaG)U64wM|P=z&!e)mzqh!t zzqE?>%KjF&y|TEBNeuAHrDTdkYKB%*xFa?ic^I1xvr~vZ+k423()fJEJH z_isAtX{6{{h0D6ck;Kkino!gA<}l|&nQO%oO`cE1FFb2EesS}Lp|9SjI4l{XvQ{F7 zhJb_9eD1V3{2TyvE{9lrT*tZp(UV!mKS$dtg5-*ZC+$V4E~^Zx+MNCm~J z!S#o-`op4&*uZCnswpIOG$nQ-r!UcOnk9yN@T6au{%^ZYSIpYo=rWaSmX2xVV)8tZ z*VU27VTSRhNP6u!#VMRT_J+mYc3{-iP#8Vb~hLYgwcKoepj6zVyMGGp5 zKMuQ4WdoXy^xnf%cf3jDwu%&%9t1+3noOwNo0^LC1f9AX5tqVrcStPbQ@AZ}qiQQ7 zTrQ;(~NrlF($L_d{oB+_(kM^c`DGHSwmpGtZ3 z+j-S&EUhh_M2#%+NbaJ51zMAsI*ei*EuvB}kQ=-u3Z;~Ag{-n$D;n%j`i1HT`l5!p zfK8Vq3V?}0pfSZVlgP-RZ_{(gpL~_uTsG$Qugg6K?($39y?vRw@6xXXCsvZj{&tt z)Eo8tvKEF_VKb74m>dS`D0&{5CbIM$HsY@z#KN0|JxK08ScaJgu6cTOsFJ*@D8O_E zyVLdL#BIWu-RqVPjHyCfmdEev24`U#?%-xU&mR8(oSOW+Pt706A3JD}TdmKSG&^S3 zys&%yZ%;!bAn^5}4u{^Eu)~*vcI$N*xZ-cC@-s1KyGs8I^kEHG&fppqJ8;foHyM8&Zt1iMa0VKI+W+uN1k_A9Lwyj3M zWZ)^UA+|emWl_gzu8OEsEyxS4YXt)DlR1PyYZpMdx`^ z#k{?y%0O2L-X%V)63qN*%yRBvQ%;2wIqEWBRdJ? zt*z8X7rj6K(ve!#^!R-l+A>rVKq}Q6eIq=!WCHuKU>z;v*V8nU8RjiF< zkSS%gT2n|C=Zt665>=6F{_Jiv>C_JSV?;qs2Bh~EdX#rkNp&^k$s^p#Ya=qJ6+Dmf zj)SE#ayA(Wb4rz~6GErpfO@3TgttdOATkVN$v4pg8;e(#sST=2b0nW>P*BFKBx<#9Qh>qr*uA@I3w*LSX5&5_ysRVJM1RS178E?syO#`#eb>GZ= zSIiey^7*gJ`X`xn2v#())UT}Mhf%gNAPpJ2iPh-ngF zG+gy$Z;TfHRUHSh83x5mc>oF|e%yAcKQV!eCa{=-g+(htBXnwf{BYX>8K#>tTD3q8 z(v<`OjkL@?bIVtRh}GCHra%k!X-~6Sc;)ae4p8=uCgc?W$;h413Vq)Bn->CH*+ed? z@wA{z8QI}9_@i&Mq;%hLmsO9)Mv0I=9q-6HUn9r)Tjw9m-z&0dK_0@C{A-d5Qd#0Nzru`v%irI(U^--^Xd*tNLG=Fs)22 zBsU$HQk3>1!#RG@jO1=2-iuF;JR$XzSBY=r=hPKjjncEk?XW9Kf`0tKvlw}@G2@-T zCx0`1#M-Zz^_!_>6cRLatrv*fYWL0lg9(fQ3^kGz@mAFZoL4s`Dl5j>e`=k*>EoNY zW8yBL<`5SD0RPi9(xok@+bstWn}Of@XO>PT?e|+^-g%YnETg_cs`ieT30;To$YL9| z;1F`nEVy$;jzPnYMfr{AI!UZ*5-eskxxcx1Q@HgcG62=~VZM4k81RUP%KJ}zgpRCr z?rtWfsxb7b0>cOjtZUTMa(;Phg~n=|B@!fwD8RV|`h!ojLGQl96kgQ1+`}y+j2P45 ziT4{a(~A!K9q~cfqV0oEZnn}(4Vtym8Ly@^SlP!2)bXo&eQQ8z)a{nQ+6&Y#bgg?& z)Bga(9#+4*wY!1{?0nR=bF;{?Kt~B>R27;4$|^u5eiP8L{nr6{VqSNa7 zWuG}#&fn_mJ^bJat|lE?QmTq;u&2YeV&=)>A9F4d4on4QG*u#|F-9Y$PgXfe7qXcW zDd?U=(ImaTj_t?p`YU*lcRwIAS=u>-MLic}X-uWYUiql&7M@$t?)3|rB3h^JkPo*Z z*%3#2oY2P^%a922FISsW9Xv^wD%lVDOQTM@bqE zMlsQ&u{83R7HJL1d!?%eRaPtrAkcL7BQH&5!1>#5{hvEiS%?zMK;hlJv zHRINRbnxwh&_Zu%b3i!nzTh3jef%(?mf6mgQ&MTZ^)&GqLrmU@p!P zT2`f`UwJ#sT3GZgeAfh;X0I{=IbCVsJ-A{!n4HqT%a>ur8Ds?X6yj>Kk&J=V+u;je zG;7*hmps`Nw-P#2z<2MNq7WlzU*gCzJ73Nlh)7G-0*LhEwo?xh%|RD5ACAn`R!jPdGyQIeHyVIZnF0?$gOy-NwJ5+v*m}1(vBY z8+%t?6MA6Pi!}%ao71jy63zfLUWy=x(;uH6a zLmY>b<{H^nT4JI2P(mAtP?9;IV^g@>pxY+l+M-Am!qbtBn886%81|>R-xLK&RI*CZ zF_qz?NW>Zipaj>(xTZnY@bghD$jxmGp&Dw}({}xqJ-PL-Y)$l7i+Wd*eA%e^ep&4= zE#ChCOC@azh6{BBhNdQo>J3jCEl>G1p{8bO^T-N3nB;)wpLxNwBL|qS;rhkhti$TE zSzLv;zp%PsJv5rvkWm`4*VItLhmXQ=YNQCT-X-ZE_dGN)F{s<%BCq0m<^=jM;!O0N zI$c8QIAaVGtc;_g*Y%vMH27lW=32+=I5+o{QV(iw~m!vPPo;)L;iAy$}i_H$zL`_1O{zS%H}^Y zX`PwAqJMm=?$I-R>6sY)Bo`YzL5UB@sG8RL#aR4ADB@^(9)x}Qk-=NK=*S(IKB=U7 zgOFMiTCYMWw%L^lmlrG(@5)Uw>cjIh$$FDpCDc~hv@#eZ9}59mmIq@_pk+O!JJU!f zvv859iRk@u^X|K$`6m9y&z@kvjx@Km5!u;QLW=HPM~SZa=J+v6b1@vt-h&!4JcIK~ z^W*c^Sp3)4j20?wv+)YD6;yGsOe5~_y@D>wG?L~Plm8TT9fK!t7Vm7Jq#7C=a^47zf|Jhx)@q7RP diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/server.js b/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/server.js deleted file mode 100644 index c1e11b8bf4..0000000000 --- a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/server.js +++ /dev/null @@ -1,79 +0,0 @@ -let express = require('express'); -let fs = require("fs"); -let multer = require('multer'); -let bodyParser = require('body-parser'); -let cookieParser = require('cookie-parser') -let util = require('util'); - -let app = express(); -app.use(express.static('public')); -app.use(bodyParser.urlencoded({extended: false})); -app.use(multer({dest: '/tmp/'}).array('image')); -app.use(cookieParser()); - -// 创建 application/x-www-form-urlencoded 编码解析 -let urlencodedParser = bodyParser.urlencoded({extended: false}) - -app.post('/process_post', urlencodedParser, function (req, res) { - - let response = { - "first_name": req.body.first_name, - "last_name": req.body.last_name - }; - console.log(response); - res.end(JSON.stringify(response)); -}); - -app.post('/file_upload', function (req, res) { - console.log(req.files[0]); // 上传的文件信息 - - var des_file = __dirname + "/" + req.files[0].originalname; - fs.readFile(req.files[0].path, function (err, data) { - fs.writeFile(des_file, data, function (err) { - if (err) { - console.log(err); - } else { - response = { - message: 'File uploaded successfully', - filename: req.files[0].originalname - }; - } - console.log(response); - res.end(JSON.stringify(response)); - }); - }); -}); - -app.get('/', function (req, res) { - console.log("Cookies: " + util.inspect(req.cookies)); -}); - -app.get('/index.htm', function (req, res) { - res.sendFile(__dirname + "/" + "index.htm"); -}); - -app.get('/process_get', function (req, res) { - - let response = { - "first_name": req.query.first_name, - "last_name": req.query.last_name - }; - console.log(response); - res.end(JSON.stringify(response)); -}); - -// json -app.get('/listUsers', function (req, res) { - fs.readFile(__dirname + "/" + "users.json", 'utf8', function (err, data) { - console.log(data); - res.end(data); - }); -}); - - -let server = app.listen(8081, "127.0.0.1", function () { - let host = server.address().address; - let port = server.address().port; - - console.log("应用实例,访问地址为 http://%s:%s", host, port) -}); \ No newline at end of file diff --git a/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/star.jpg b/subutil/lib/src/test/java/com/blankj/subutil/util/http/nodeServer/star.jpg deleted file mode 100644 index aeeefa81b5181add7150f2abdbc7e0d635426087..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13072 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

VeBJh3XNK2=^GQ1ev*H*`Fh(}) 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 COUNT_CONTINUOUS_TAP - 1) { + mClickCount = 0; + onMultiClick(v); + } + } else { + mClickCount = 0; + } + } + } + + private static class LazyHolder { private static final OnUtilsTouchListener INSTANCE = new OnUtilsTouchListener(); } diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LanguageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LanguageUtils.java new file mode 100644 index 0000000000..9282c55110 --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LanguageUtils.java @@ -0,0 +1,38 @@ +package com.blankj.utilcode.util; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; +import android.util.DisplayMetrics; + +import java.util.Locale; + +/** + *

+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/06/20
+ *     desc  :
+ * 
+ */ +public class LanguageUtils { + + private LanguageUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + public static Context applyLanguage(Context context, Locale locale) { + Resources resources = context.getResources(); + Configuration configuration = resources.getConfiguration(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + configuration.setLocale(locale); + return context.createConfigurationContext(configuration); + } else { + configuration.locale = locale; + DisplayMetrics dm = resources.getDisplayMetrics(); + resources.updateConfiguration(configuration, dm); + } + return context; + } +} 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 1972e95332..35d4b1ba5a 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 @@ -301,7 +301,7 @@ public void onActivityStarted(Activity activity) { } if (mConfigCount < 0) { ++mConfigCount; - updateAppConfig(activity); +// updateAppConfig(activity); } else { ++mForegroundCount; } diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java index 2efce48662..19d69858b9 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ViewUtils.java @@ -19,6 +19,11 @@ public static void setViewEnabled(View view, boolean enabled) { public static void setViewEnabled(View view, boolean enabled, View... excludes) { if (view == null) return; + if (excludes != null) { + for (View exclude : excludes) { + if (view == exclude) return; + } + } if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; int childCount = viewGroup.getChildCount(); @@ -26,11 +31,6 @@ public static void setViewEnabled(View view, boolean enabled, View... excludes) setViewEnabled(viewGroup.getChildAt(i), enabled, excludes); } } - if (excludes != null) { - for (View exclude : excludes) { - if (view == exclude) return; - } - } view.setEnabled(enabled); } diff --git a/utilcode/pkg/src/main/AndroidManifest.xml b/utilcode/pkg/src/main/AndroidManifest.xml index 37a1617bb8..8d60393621 100644 --- a/utilcode/pkg/src/main/AndroidManifest.xml +++ b/utilcode/pkg/src/main/AndroidManifest.xml @@ -162,6 +162,10 @@ android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTop" android:windowSoftInputMode="stateHidden" /> + FragmentActivity.start(this) R.id.coreUtilImageBtn -> ImageActivity.start(this) R.id.coreUtilKeyboardBtn -> KeyboardActivity.start(this) + R.id.coreUtilLanguageBtn -> LanguageActivity.start(this) R.id.coreUtilLogBtn -> LogActivity.start(this) R.id.coreUtilMetaDataBtn -> MetaDataActivity.start(this) R.id.coreUtilNetworkBtn -> NetworkActivity.start(this) diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt index e43bcc1585..7e2a17761a 100644 --- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt +++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt @@ -69,6 +69,11 @@ class KeyboardActivity : CommonTitleActivity() { } } + override fun onPause() { + super.onPause() + KeyboardUtils.hideSoftInput(this) + } + // override fun dispatchTouchEvent(ev: MotionEvent): Boolean { // if (ev.action == MotionEvent.ACTION_DOWN) { // val v = currentFocus diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt new file mode 100644 index 0000000000..e8b3f25154 --- /dev/null +++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt @@ -0,0 +1,59 @@ +package com.blankj.utilcode.pkg.feature.language + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import com.blankj.lib.common.CommonTitleActivity +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.ToastUtils +import kotlinx.android.synthetic.main.activity_language.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2018/12/29 + * desc : demo about VibrateUtils + * ``` + */ +class LanguageActivity : CommonTitleActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, LanguageActivity::class.java) + context.startActivity(starter) + } + } + + override fun bindTitle(): CharSequence { + return getString(R.string.demo_language) + } + + override fun initData(bundle: Bundle?) {} + + override fun bindLayout(): Int { + return R.layout.activity_language + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + applyDebouncingClickListener(languageApp, languageActivity) + } + + override fun doBusiness() {} + + override fun onDebouncingClick(view: View) { + when (view.id) { + R.id.languageApp -> { + ToastUtils.showLong(R.string.language) + } + R.id.languageActivity -> { + ToastUtils.showLong(getString(R.string.language)) + } + } + } + + override fun onDestroy() { + super.onDestroy() + } +} diff --git a/utilcode/pkg/src/main/res/layout/activity_language.xml b/utilcode/pkg/src/main/res/layout/activity_language.xml new file mode 100644 index 0000000000..87a6d4d81a --- /dev/null +++ b/utilcode/pkg/src/main/res/layout/activity_language.xml @@ -0,0 +1,23 @@ + + + +

*/ -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 066/191] 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