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 01/68] 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 02/68] 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 03/68] 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 04/68] see 06/03 log
---
.gitignore | 2 +-
CHANGELOG.md | 1 +
gradle.properties | 8 +++++-
gradle/config/config.gradle | 10 ++++----
gradle/config/configApp.gradle | 5 +++-
launcher/app/build.gradle | 6 ++---
launcher/pkg/build.gradle | 2 +-
.../com/blankj/launcher/pkg/MainActivity.kt | 2 +-
.../pkg/src/main/res/layout/activity_main.xml | 18 ++++++-------
lib/base/build.gradle | 2 +-
.../com/blankj/lib/base/BaseActivity.java | 5 ++--
.../com/blankj/lib/base/BaseApplication.java | 3 ++-
.../blankj/lib/base/BaseDrawerActivity.java | 11 ++++----
.../com/blankj/lib/base/BaseFragment.java | 13 +++++-----
.../blankj/lib/base/BaseTitleActivity.java | 9 ++++---
.../java/com/blankj/lib/base/IBaseView.java | 5 ++--
.../com/blankj/lib/base/rv/BaseAdapter.java | 5 ++--
.../java/com/blankj/lib/base/rv/BaseCell.java | 3 ++-
.../blankj/lib/base/rv/BaseViewHolder.java | 4 +--
.../lib/base/rv/RecycleViewDivider.java | 10 ++++----
.../main/res/layout/activity_base_title.xml | 11 ++++----
.../activity_base_title_stub_scroll.xml | 4 +--
.../src/main/res/layout/activity_drawer.xml | 6 ++---
subutil/app/build.gradle | 2 +-
subutil/lib/build.gradle | 2 +-
.../blankj/subutil/util/LocationUtils.java | 2 +-
.../com/blankj/subutil/util/PinyinUtils.java | 2 +-
.../java/com/blankj/subutil/util/Utils.java | 4 +--
.../subutil/util/http/ExecutorFactory.java | 3 ++-
.../blankj/subutil/util/http/HttpUtils.java | 3 ++-
.../com/blankj/subutil/util/http/Request.java | 3 ++-
.../blankj/subutil/util/http/SSLConfig.java | 3 ++-
subutil/pkg/build.gradle | 2 +-
.../blankj/subutil/pkg/helper/DialogHelper.kt | 2 +-
utilcode/README-CN.md | 2 +-
utilcode/README.md | 2 +-
utilcode/app/build.gradle | 2 +-
utilcode/lib/build.gradle | 2 +-
utilcode/lib/project.properties | 6 ++---
.../utilcode/constant/MemoryConstants.java | 2 +-
.../constant/PermissionConstants.java | 2 +-
.../utilcode/constant/TimeConstants.java | 2 +-
.../blankj/utilcode/util/ActivityUtils.java | 11 ++++----
.../blankj/utilcode/util/AntiShakeUtils.java | 5 ++--
.../com/blankj/utilcode/util/AppUtils.java | 5 ++--
.../com/blankj/utilcode/util/BarUtils.java | 11 ++++----
.../blankj/utilcode/util/BrightnessUtils.java | 5 ++--
.../com/blankj/utilcode/util/BusUtils.java | 5 ++--
.../utilcode/util/CacheDiskStaticUtils.java | 3 ++-
.../blankj/utilcode/util/CacheDiskUtils.java | 3 ++-
.../utilcode/util/CacheDoubleStaticUtils.java | 3 ++-
.../utilcode/util/CacheDoubleUtils.java | 2 +-
.../utilcode/util/CacheMemoryStaticUtils.java | 2 +-
.../utilcode/util/CacheMemoryUtils.java | 4 +--
.../com/blankj/utilcode/util/ColorUtils.java | 12 ++++-----
.../com/blankj/utilcode/util/CrashUtils.java | 4 +--
.../com/blankj/utilcode/util/DeviceUtils.java | 5 ++--
.../blankj/utilcode/util/FragmentUtils.java | 21 ++++++++--------
.../com/blankj/utilcode/util/ImageUtils.java | 14 +++++------
.../com/blankj/utilcode/util/IntentUtils.java | 4 +--
.../blankj/utilcode/util/KeyboardUtils.java | 3 ++-
.../com/blankj/utilcode/util/LogUtils.java | 8 +++---
.../blankj/utilcode/util/MetaDataUtils.java | 2 +-
.../blankj/utilcode/util/NetworkUtils.java | 5 ++--
.../utilcode/util/NotificationUtils.java | 6 ++---
.../com/blankj/utilcode/util/ObjectUtils.java | 6 ++---
.../blankj/utilcode/util/PermissionUtils.java | 8 +++---
.../com/blankj/utilcode/util/PhoneUtils.java | 2 +-
.../blankj/utilcode/util/ProcessUtils.java | 4 +--
.../com/blankj/utilcode/util/RegexUtils.java | 2 +-
.../blankj/utilcode/util/ResourceUtils.java | 2 +-
.../blankj/utilcode/util/SPStaticUtils.java | 2 +-
.../com/blankj/utilcode/util/SPUtils.java | 2 +-
.../com/blankj/utilcode/util/ScreenUtils.java | 4 +--
.../com/blankj/utilcode/util/ShellUtils.java | 2 +-
.../blankj/utilcode/util/SnackbarUtils.java | 14 +++++------
.../com/blankj/utilcode/util/SpanUtils.java | 16 ++++++------
.../com/blankj/utilcode/util/StringUtils.java | 4 +--
.../com/blankj/utilcode/util/ThreadUtils.java | 5 ++--
.../com/blankj/utilcode/util/TimeUtils.java | 2 +-
.../com/blankj/utilcode/util/ToastUtils.java | 10 ++++----
.../com/blankj/utilcode/util/UriUtils.java | 25 +++++++++++++------
.../java/com/blankj/utilcode/util/Utils.java | 3 ++-
.../blankj/utilcode/util/VibrateUtils.java | 2 +-
.../com/blankj/utilcode/util/BaseTest.java | 11 +++-----
.../blankj/utilcode/util/ObjectUtilsTest.java | 5 ++--
utilcode/pkg/build.gradle | 2 +-
.../pkg/feature/activity/ActivityActivity.kt | 2 +-
.../feature/activity/SubActivityActivity.kt | 2 +-
.../feature/bar/BarStatusFragmentActivity.kt | 16 ++++++------
.../pkg/feature/fragment/ContainerFragment.kt | 6 ++---
.../pkg/feature/fragment/FragmentActivity.kt | 6 ++---
.../pkg/feature/image/ImageActivity.kt | 4 +--
.../pkg/feature/snackbar/SnackbarActivity.kt | 2 +-
.../utilcode/pkg/feature/span/SpanActivity.kt | 2 +-
.../utilcode/pkg/feature/toast/CustomToast.kt | 2 +-
.../pkg/feature/toast/ToastActivity.kt | 2 +-
.../utilcode/pkg/helper/DialogHelper.kt | 5 ++--
.../main/res/layout/activity_adaptscreen.xml | 4 +--
.../res/layout/activity_adaptscreen_close.xml | 4 +--
.../layout/activity_adaptscreen_height.xml | 7 +++---
.../res/layout/activity_adaptscreen_width.xml | 4 +--
.../layout/activity_bar_status_fragment.xml | 4 +--
.../src/main/res/layout/activity_fragment.xml | 2 +-
.../src/main/res/layout/activity_image.xml | 3 +--
105 files changed, 293 insertions(+), 253 deletions(-)
diff --git a/.gitignore b/.gitignore
index 201b88771a..193619553c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,4 @@
.externalNativeBuild
/apk
*.phrof
-/maven
+/busMaven
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 95dfb60cc3..9c48786e89 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
* `19/04/24` [upd] The swipe panel.
* `19/03/17` [fix] The ugly UI.
* `19/03/14` [fix] AdaptScreenUtils didn't work on some HaWei tablet.
+* `19/03/09` [fix] UriUtils#uri2File.
* `19/03/08` [add] LogUtils support multi process. Publish v1.23.7.
* `19/03/02` [fix] LogUtils#file.
* `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6.
diff --git a/gradle.properties b/gradle.properties
index 110f0cb7ef..c209c08b84 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -19,4 +19,10 @@
#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
-org.gradle.jvmargs=-XX:MaxHeapSize=1024m -Xmx1024m
\ No newline at end of file
+org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+org.gradle.daemon=true
+org.gradle.configureondemand=true
+org.gradle.parallel=true
+
+android.enableJetifier=true
+android.useAndroidX=true
\ No newline at end of file
diff --git a/gradle/config/config.gradle b/gradle/config/config.gradle
index e455c4dba6..e8c793b6b3 100644
--- a/gradle/config/config.gradle
+++ b/gradle/config/config.gradle
@@ -5,7 +5,7 @@ gradle.ext {
applicationId = 'com.blankj.androidutilcode'
appName = 'Util'
- compileSdkVersion = 27
+ compileSdkVersion = 28
minSdkVersion = 14
targetSdkVersion = 27
versionCode = 1_024_000
@@ -13,8 +13,8 @@ gradle.ext {
// lib version
kotlin_version = '1.3.10'
- support_version = '27.1.1'
leakcanary_version = '1.6.3'
+ androidx_version = '1.0.0'
dep = [:]
@@ -36,11 +36,11 @@ gradle.ext {
subutil_lib : new DepConfig(":subutil:lib"),
subutil_pkg : new DepConfig(":subutil:pkg"),
utilcode_app : new DepConfig(":utilcode:app"),
- utilcode_lib : new DepConfig(false, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
+ utilcode_lib : new DepConfig(true, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
utilcode_pkg : new DepConfig(":utilcode:pkg"),
- support_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$support_version"),
- support_design : new DepConfig("com.android.support:design:$support_version"),
+ support_appcompat_v7 : new DepConfig("androidx.appcompat:appcompat:$androidx_version"),
+ support_material : new DepConfig("com.google.android.material:material:$androidx_version"),
support_multidex : new DepConfig("com.android.support:multidex:1.0.2"),
constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"),
diff --git a/gradle/config/configApp.gradle b/gradle/config/configApp.gradle
index cb8d5a290a..809cb07cd4 100644
--- a/gradle/config/configApp.gradle
+++ b/gradle/config/configApp.gradle
@@ -42,8 +42,11 @@ android {
}
dexOptions {
+ preDexLibraries true
javaMaxHeapSize "8g"
maxProcessCount 8
+ incremental true
+ dexInProcess = true
}
}
@@ -57,7 +60,7 @@ dependencies {
private String getSuffix() {
if (project.path == ":launcher:app") return ""
- return project.path.replace(":" , "_").substring(0, project.path.length() - 4)
+ return project.path.replace(":", "_").substring(0, project.path.length() - 4)
}
def configSigning(Project pro) {
diff --git a/launcher/app/build.gradle b/launcher/app/build.gradle
index eb9f8d906f..bf68fb45ff 100644
--- a/launcher/app/build.gradle
+++ b/launcher/app/build.gradle
@@ -4,7 +4,7 @@ apply {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation project(':launcher:pkg')
- implementation project(':subutil:pkg')
- implementation project(':utilcode:pkg')
+ implementation gradle.ext.dep.launcher_pkg
+ implementation gradle.ext.dep.subutil_pkg
+ implementation gradle.ext.dep.utilcode_pkg
}
\ No newline at end of file
diff --git a/launcher/pkg/build.gradle b/launcher/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/launcher/pkg/build.gradle
+++ b/launcher/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- api project(':lib:base')
+ api gradle.ext.dep.lib_base
}
\ No newline at end of file
diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
index 02491cd88d..0e9f0a8477 100644
--- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
+++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.launcher.pkg
import android.graphics.Color
import android.os.Bundle
-import android.support.v7.app.ActionBarDrawerToggle
+import androidx.appcompat.app.ActionBarDrawerToggle
import android.view.View
import android.widget.ImageView
import com.blankj.lib.base.BaseDrawerActivity
diff --git a/launcher/pkg/src/main/res/layout/activity_main.xml b/launcher/pkg/src/main/res/layout/activity_main.xml
index 3b31dafe32..ee8b62a6fa 100644
--- a/launcher/pkg/src/main/res/layout/activity_main.xml
+++ b/launcher/pkg/src/main/res/layout/activity_main.xml
@@ -1,17 +1,17 @@
-
-
-
-
-
-
+
+
-
@@ -69,5 +69,5 @@
android:text="@string/sub_util" />
-
-
+
+
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
index 370036c062..67f9762d82 100644
--- a/lib/base/build.gradle
+++ b/lib/base/build.gradle
@@ -8,7 +8,7 @@ dependencies {
api gradle.ext.dep.subutil_lib
api gradle.ext.dep.support_appcompat_v7
- api gradle.ext.dep.support_design
+ api gradle.ext.dep.support_material
api gradle.ext.dep.support_multidex
api gradle.ext.dep.constraint
api gradle.ext.dep.kotlin
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
index caae1d45cf..0c9d8fa419 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
@@ -3,11 +3,12 @@
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.AppCompatActivity;
+
import com.blankj.swipepanel.SwipePanel;
import com.blankj.utilcode.util.AntiShakeUtils;
import com.blankj.utilcode.util.AppUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
index 1e0ddc0b27..5d2eba8260 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
@@ -2,7 +2,8 @@
import android.app.Application;
import android.content.Context;
-import android.support.multidex.MultiDex;
+
+import androidx.multidex.MultiDex;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.CrashUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
index c7f7f1daea..ec3c895f6e 100755
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
@@ -3,17 +3,18 @@
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.StringRes;
-import android.support.design.widget.NavigationView;
-import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.widget.FrameLayout;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.drawerlayout.widget.DrawerLayout;
+
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.StringUtils;
+import com.google.android.material.navigation.NavigationView;
/**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
index 5667f3f02c..0e4e7ba5cc 100755
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
@@ -4,17 +4,18 @@
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.IdRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
+
import com.blankj.utilcode.util.AntiShakeUtils;
/**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
index a40230420d..e0ed3ed10a 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
@@ -1,16 +1,17 @@
package com.blankj.lib.base;
import android.annotation.SuppressLint;
-import android.support.annotation.LayoutRes;
-import android.support.design.widget.CoordinatorLayout;
-import android.support.v7.app.ActionBar;
-import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewStub;
import android.widget.FrameLayout;
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.Toolbar;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
+
import com.blankj.utilcode.util.BarUtils;
import com.blankj.utilcode.util.ColorUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java b/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
index 29e8553899..b0550f126c 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
@@ -1,10 +1,11 @@
package com.blankj.lib.base;
import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.Nullable;
import android.view.View;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+
/**
*
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
index 11aa94e015..e69be6c6df 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
@@ -1,12 +1,13 @@
package com.blankj.lib.base.rv;
import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
import java.util.List;
/**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
index cdf42c7882..332c4caee0 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
@@ -1,10 +1,11 @@
package com.blankj.lib.base.rv;
-import android.support.annotation.NonNull;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.View;
+import androidx.annotation.NonNull;
+
/**
*
* author: blankj
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
index ceb1c46eac..0bd892f317 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
@@ -1,7 +1,7 @@
package com.blankj.lib.base.rv;
-import android.support.annotation.IdRes;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.IdRes;
+import androidx.recyclerview.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
index 3d2b90f302..dd20894e10 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
@@ -5,11 +5,11 @@
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.LinearLayout;
diff --git a/lib/base/src/main/res/layout/activity_base_title.xml b/lib/base/src/main/res/layout/activity_base_title.xml
index b11ecf7341..986d3669b6 100644
--- a/lib/base/src/main/res/layout/activity_base_title.xml
+++ b/lib/base/src/main/res/layout/activity_base_title.xml
@@ -1,24 +1,23 @@
-
-
-
-
+
-
+
diff --git a/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml b/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
index 96f5e09d49..bd031cfb67 100644
--- a/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
+++ b/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
@@ -1,5 +1,5 @@
-
-
+
diff --git a/lib/base/src/main/res/layout/activity_drawer.xml b/lib/base/src/main/res/layout/activity_drawer.xml
index 72f70ed969..be44cd718c 100644
--- a/lib/base/src/main/res/layout/activity_drawer.xml
+++ b/lib/base/src/main/res/layout/activity_drawer.xml
@@ -1,5 +1,5 @@
-
-
-
+
diff --git a/subutil/app/build.gradle b/subutil/app/build.gradle
index a2e0172413..a7027c15ef 100644
--- a/subutil/app/build.gradle
+++ b/subutil/app/build.gradle
@@ -4,5 +4,5 @@ apply {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation project(':subutil:pkg')
+ implementation gradle.ext.dep.subutil_pkg
}
\ No newline at end of file
diff --git a/subutil/lib/build.gradle b/subutil/lib/build.gradle
index 9dcbe0b542..f3140b4f0b 100644
--- a/subutil/lib/build.gradle
+++ b/subutil/lib/build.gradle
@@ -14,7 +14,7 @@ readme {
dependencies {
compileOnly gradle.ext.dep.support_appcompat_v7
- compileOnly gradle.ext.dep.support_design
+ compileOnly gradle.ext.dep.support_material
api(gradle.ext.dep.glide) {
exclude group: "com.android.support"
}
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
index 7ee8747902..0c177b534c 100755
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
@@ -11,7 +11,7 @@
import android.location.LocationProvider;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
import android.util.Log;
import java.io.IOException;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
index 22486b3a91..934408c65e 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
@@ -1,6 +1,6 @@
package com.blankj.subutil.util;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
/**
*
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
index 9cbf4e06fd..91b336abcf 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
@@ -7,8 +7,8 @@
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
index f5583397d9..2f26fb9c24 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
@@ -2,7 +2,8 @@
import android.os.Handler;
import android.os.Looper;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
index b952f318cb..bdd4174486 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
@@ -1,7 +1,8 @@
package com.blankj.subutil.util.http;
import android.accounts.NetworkErrorException;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
index fe39b1299c..c6eddf9b96 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
@@ -1,6 +1,7 @@
package com.blankj.subutil.util.http;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
index b8624af490..0cf43662f2 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
@@ -2,7 +2,8 @@
import android.annotation.SuppressLint;
import android.os.Build;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
import java.io.IOException;
import java.net.InetAddress;
diff --git a/subutil/pkg/build.gradle b/subutil/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/subutil/pkg/build.gradle
+++ b/subutil/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- api project(':lib:base')
+ api gradle.ext.dep.lib_base
}
\ No newline at end of file
diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
index 45e67a4a0d..9eba25c622 100644
--- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
+++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
package com.blankj.subutil.pkg.helper
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
import com.blankj.subutil.pkg.R
import com.blankj.utilcode.util.ActivityUtils
import com.blankj.utilcode.util.PermissionUtils
diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index 445f206121..0bdb622940 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -5,7 +5,7 @@ Gradle:
implementation 'com.blankj:utilcode:1.24.0'
// if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.23.7'
+implementation 'com.blankj:utilcodex:1.24.0'
```
diff --git a/utilcode/README.md b/utilcode/README.md
index f449736061..5a6a295b4c 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -5,7 +5,7 @@ Gradle:
implementation 'com.blankj:utilcode:1.24.0'
// if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.23.7'
+implementation 'com.blankj:utilcodex:1.24.0'
```
diff --git a/utilcode/app/build.gradle b/utilcode/app/build.gradle
index 5616386892..ea5c172cd7 100644
--- a/utilcode/app/build.gradle
+++ b/utilcode/app/build.gradle
@@ -4,5 +4,5 @@ apply {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation project(':utilcode:pkg')
+ implementation gradle.ext.dep.utilcode_pkg
}
\ No newline at end of file
diff --git a/utilcode/lib/build.gradle b/utilcode/lib/build.gradle
index e4dd3a6716..6d6c599298 100644
--- a/utilcode/lib/build.gradle
+++ b/utilcode/lib/build.gradle
@@ -18,7 +18,7 @@ dependencies {
compile gradle.ext.dep.gson
compileOnly gradle.ext.dep.support_appcompat_v7
- compileOnly gradle.ext.dep.support_design
+ compileOnly gradle.ext.dep.support_material
testImplementation gradle.ext.dep.junit
testImplementation gradle.ext.dep.robolectric
diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index 22ae3b8603..d238eda740 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,9 +1,9 @@
#project
-project.name=UtilCode
+project.name=UtilCodeX
project.groupId=com.blankj
-project.artifactId=utilcode
+project.artifactId=utilcodex
project.packaging=aar
project.siteUrl=https://github.com/Blankj/AndroidUtilCode
project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
#javadoc
-javadoc.name=UtilCode
\ No newline at end of file
+javadoc.name=UtilCodeX
\ No newline at end of file
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
index b68bfcb113..5c05c0163e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.constant;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index 76f7e9a217..6db826e4ab 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -4,7 +4,7 @@
import android.Manifest.permission;
import android.annotation.SuppressLint;
import android.os.Build;
-import android.support.annotation.StringDef;
+import androidx.annotation.StringDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
index 9932037bf8..45090576e3 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.constant;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index d6a671e4fe..de1bfeb005 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -10,14 +10,15 @@
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.util.Pair;
import android.util.Log;
import android.view.View;
+import androidx.annotation.AnimRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.util.Pair;
+
import java.util.List;
/**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
index 7e87e73474..ca9036225e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
@@ -1,9 +1,10 @@
package com.blankj.utilcode.util;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
import android.view.View;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
/**
*
* author: blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index a9368be59f..5a9194ce66 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -17,8 +17,6 @@
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
import android.util.Log;
import java.io.File;
@@ -27,6 +25,9 @@
import java.util.ArrayList;
import java.util.List;
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
/**
*
* author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..22178a5c20 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -8,11 +8,6 @@
import android.graphics.Color;
import android.graphics.Point;
import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
@@ -27,6 +22,12 @@
import java.lang.reflect.Method;
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+import androidx.drawerlayout.widget.DrawerLayout;
+
import static android.Manifest.permission.EXPAND_STATUS_BAR;
/**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
index f9344b0a59..bacc519540 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
@@ -2,11 +2,12 @@
import android.content.ContentResolver;
import android.provider.Settings;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
import android.view.Window;
import android.view.WindowManager;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
/**
*
* author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
index f04202043e..d272c99b98 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
@@ -16,11 +16,12 @@
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
index bb48a4b5cf..c5a9a17a6d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
@@ -3,13 +3,14 @@
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
-import android.support.annotation.NonNull;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.Serializable;
+import androidx.annotation.NonNull;
+
/**
*
* author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
index 67e6b3fb0e..a8ae8afa5b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
@@ -8,9 +8,10 @@
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
-import android.support.annotation.NonNull;
import android.util.Log;
+import androidx.annotation.NonNull;
+
import com.blankj.utilcode.constant.CacheConstants;
import org.json.JSONArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
index 2ef267bd01..6dbb9f7475 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
@@ -3,13 +3,14 @@
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
-import android.support.annotation.NonNull;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.Serializable;
+import androidx.annotation.NonNull;
+
/**
*
* author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
index c800423c78..aca1c25837 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
@@ -3,7 +3,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import com.blankj.utilcode.constant.CacheConstants;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
index 56abfba117..aedcfa7fc4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.util;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
/**
*
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
index d0e06e394d..ddaa2baed9 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
@@ -1,7 +1,7 @@
package com.blankj.utilcode.util;
-import android.support.annotation.NonNull;
-import android.support.v4.util.LruCache;
+import androidx.annotation.NonNull;
+import androidx.collection.LruCache;
import com.blankj.utilcode.constant.CacheConstants;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 4c0c22232b..a6603cfc44 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -1,12 +1,12 @@
package com.blankj.utilcode.util;
import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
/**
*
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index 18b5f814a3..081dd09761 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -5,8 +5,8 @@
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
import android.util.Log;
import java.io.BufferedWriter;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index e6b1910cfc..c641c9bdae 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -11,11 +11,12 @@
import android.os.Debug;
import android.os.PowerManager;
import android.provider.Settings;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+
import java.io.File;
import java.net.InetAddress;
import java.net.NetworkInterface;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
index 43b8537e75..9e8ae14ef1 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
@@ -3,16 +3,6 @@
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.AnimatorRes;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
@@ -20,6 +10,17 @@
import java.util.Collections;
import java.util.List;
+import androidx.annotation.AnimRes;
+import androidx.annotation.AnimatorRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
/**
*
* author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 83e01eb1ad..cbee7dd4bd 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -27,13 +27,13 @@
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
import android.view.View;
import java.io.BufferedOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 6faa37d043..1e26dc8a9a 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,8 +8,8 @@
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.content.FileProvider;
+import androidx.annotation.RequiresPermission;
+import androidx.core.content.FileProvider;
import java.io.File;
import java.util.ArrayList;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
index cfa568fa7c..de3eb285cc 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
@@ -7,7 +7,6 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
-import android.support.annotation.NonNull;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@@ -16,6 +15,8 @@
import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout;
+import androidx.annotation.NonNull;
+
import java.lang.reflect.Field;
/**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
index 1372ecd40b..9a7e11cbf5 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -10,10 +10,10 @@
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.RequiresApi;
+import androidx.collection.SimpleArrayMap;
import android.util.Log;
import com.google.gson.Gson;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
index 6f6cf85b80..bd4b8da935 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
@@ -8,7 +8,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
/**
*
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index d59eb28240..24a05a26b7 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -7,13 +7,14 @@
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
+
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.InterfaceAddress;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
index b8163d2e66..73a900b465 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
@@ -5,9 +5,9 @@
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
/**
*
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
index be5491ece0..3c0c087a39 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
@@ -1,9 +1,9 @@
package com.blankj.utilcode.util;
import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.RequiresApi;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index d35cbcc620..602efcb5db 100755
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -9,10 +9,10 @@
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
index 99068781a4..f407f81b5f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
@@ -7,7 +7,7 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
index adcd265f72..619b175549 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
@@ -10,8 +10,8 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
import android.util.Log;
import java.util.Arrays;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index ba57fab956..817a94149f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.util;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
import com.blankj.utilcode.constant.RegexConstants;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
index 81d10f08cf..3fb515c06b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.util;
-import android.support.annotation.RawRes;
+import androidx.annotation.RawRes;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
index d3e21fb873..21274c3023 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
@@ -1,7 +1,7 @@
package com.blankj.utilcode.util;
import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.util.Map;
import java.util.Set;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
index 554a2ed586..a9d18a1a55 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
@@ -3,7 +3,7 @@
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.util.Collections;
import java.util.HashMap;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index 7390fceed0..3245eb115c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -10,8 +10,8 @@
import android.graphics.Point;
import android.os.Build;
import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
import android.util.DisplayMetrics;
import android.view.Surface;
import android.view.View;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
index b7ad2fa9d2..fc10a601ae 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.util;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.io.BufferedReader;
import java.io.DataOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
index b164e6154e..eab1990d29 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
@@ -1,12 +1,12 @@
package com.blankj.utilcode.util;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.Snackbar;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.snackbar.Snackbar;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
index b8d9d53aed..4d49451ec0 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
@@ -14,14 +14,14 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
import android.text.Layout;
import android.text.Layout.Alignment;
import android.text.SpannableStringBuilder;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..70f0defe50 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -1,8 +1,8 @@
package com.blankj.utilcode.util;
import android.content.res.Resources;
-import android.support.annotation.ArrayRes;
-import android.support.annotation.StringRes;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.StringRes;
/**
*
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index 0545a27fa0..19de94ca33 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -2,10 +2,11 @@
import android.os.Handler;
import android.os.Looper;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
import android.util.Log;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
index adaa920474..a5286b0fbe 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.util;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import com.blankj.utilcode.constant.TimeConstants;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index 150425cdba..0dd47cfa3e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -12,11 +12,11 @@
import android.os.Build;
import android.os.Handler;
import android.os.Message;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.core.app.NotificationManagerCompat;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 9ad408912a..20fdc39b81 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -8,12 +8,14 @@
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
import android.util.Log;
import java.io.File;
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
/**
*
* author: Blankj
@@ -75,12 +77,19 @@ public static File uri2File(@NonNull final Uri uri) {
Log.d("UriUtils", uri.toString() + " parse failed. -> 1");
return null;
} else if ("com.android.providers.downloads.documents".equals(authority)) {
- final String id = DocumentsContract.getDocumentId(uri);
- final Uri contentUri = ContentUris.withAppendedId(
- Uri.parse("content://downloads/public_downloads"),
- Long.valueOf(id)
- );
- return getFileFromUri(contentUri, 2);
+ String id = DocumentsContract.getDocumentId(uri);
+ if (!TextUtils.isEmpty(id)) {
+ if (id.startsWith("raw:")) {
+ return new File(id.substring(4));
+ }
+ final Uri contentUri = ContentUris.withAppendedId(
+ Uri.parse(Environment.DIRECTORY_DOWNLOADS),
+ Long.valueOf(id)
+ );
+ return getFileFromUri(contentUri, 2);
+ }
+ Log.d("UriUtils", uri.toString() + " parse failed. -> 3");
+ return null;
} else if ("com.android.providers.media.documents".equals(authority)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
index d0c98afc96..1992a2c902 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
@@ -13,13 +13,14 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.support.v4.content.FileProvider;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
+import androidx.core.content.FileProvider;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
index a57bbb8241..622d657817 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
@@ -2,7 +2,7 @@
import android.content.Context;
import android.os.Vibrator;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
import static android.Manifest.permission.VIBRATE;
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
index 85bc9d8ac2..2dadedff8c 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
@@ -1,8 +1,5 @@
package com.blankj.utilcode.util;
-
-import android.support.annotation.NonNull;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -29,7 +26,7 @@ public BaseTest() {
ShadowLog.stream = System.out;
ThreadUtils.setDeliver(new Executor() {
@Override
- public void execute(@NonNull Runnable command) {
+ public void execute(Runnable command) {
command.run();
}
});
@@ -201,8 +198,8 @@ public void onFail(Throwable t) {
static class Person implements Comparable {
String name;
- int age;
- int time;
+ int age;
+ int time;
public Person(String name) {
this.name = name;
@@ -220,7 +217,7 @@ public String toString() {
}
@Override
- public int compareTo(@NonNull Person o) {
+ public int compareTo(Person o) {
int res = o.age - age;
if (res != 0) {
return res;
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
index a0203f78fc..ed12c24d8d 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
@@ -1,7 +1,5 @@
package com.blankj.utilcode.util;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@@ -12,6 +10,9 @@
import java.util.HashMap;
import java.util.LinkedList;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
diff --git a/utilcode/pkg/build.gradle b/utilcode/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/utilcode/pkg/build.gradle
+++ b/utilcode/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- api project(':lib:base')
+ api gradle.ext.dep.lib_base
}
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index e784f98401..9982c948b7 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -6,7 +6,7 @@ import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.os.Build
import android.os.Bundle
-import android.support.v4.app.ActivityOptionsCompat
+import androidx.core.app.ActivityOptionsCompat
import android.view.View
import android.view.Window
import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
index 0c63773639..abf0151bbc 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.activity
import android.os.Build
import android.os.Bundle
-import android.support.v4.app.ActivityCompat
+import androidx.core.app.ActivityCompat
import android.view.View
import android.view.Window
import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
index d4f0d60530..fc8020b3e5 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.bar
import android.content.Context
import android.content.Intent
import android.os.Bundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentPagerAdapter
-import android.support.v4.view.ViewPager
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
import android.view.View
import com.blankj.lib.base.BaseActivity
import com.blankj.utilcode.pkg.R
@@ -37,7 +37,7 @@ class BarStatusFragmentActivity : BaseActivity() {
R.id.barStatusFragmentNavigationCustom
)
- private val mFragmentList = ArrayList()
+ private val mFragmentList = ArrayList()
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
when (item.itemId) {
@@ -78,8 +78,8 @@ class BarStatusFragmentActivity : BaseActivity() {
mFragmentList.add(BarStatusCustomFragment.newInstance())
barStatusFragmentVp.offscreenPageLimit = 3
- barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
- override fun getItem(position: Int): Fragment {
+ barStatusFragmentVp.adapter = object : androidx.fragment.app.FragmentPagerAdapter(supportFragmentManager) {
+ override fun getItem(position: Int): androidx.fragment.app.Fragment {
return mFragmentList[position]
}
@@ -88,7 +88,7 @@ class BarStatusFragmentActivity : BaseActivity() {
}
}
- barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ barStatusFragmentVp.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
index ada9dd0d10..86972c449d 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -2,8 +2,8 @@ package com.blankj.utilcode.pkg.feature.fragment
import android.os.Build
import android.os.Bundle
-import android.support.annotation.RequiresApi
-import android.support.v4.app.Fragment
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
import android.transition.*
import android.view.View
import com.blankj.lib.base.BaseLazyFragment
@@ -128,7 +128,7 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener
}
}
- private fun addSharedElement(fragment: Fragment): Fragment {
+ private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fragment.sharedElementEnterTransition = DetailTransition()
fragment.enterTransition = Fade()
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
index 446271b366..b18a2e236b 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -4,8 +4,8 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
import android.view.View
import com.blankj.lib.base.BaseActivity
import com.blankj.utilcode.pkg.R
@@ -29,7 +29,7 @@ class FragmentActivity : BaseActivity() {
}
}
- private val mFragments = arrayListOf()
+ private val mFragments = arrayListOf()
private var curIndex: Int = 0
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 0e092e0062..2c6656f220 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -6,12 +6,12 @@ import android.graphics.Bitmap
import android.graphics.Color
import android.os.Build
import android.os.Bundle
-import android.support.annotation.StringRes
-import android.support.v7.widget.LinearLayoutManager
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.LinearLayoutManager
import com.blankj.lib.base.BaseTaskActivity
import com.blankj.lib.base.rv.BaseAdapter
import com.blankj.lib.base.rv.BaseCell
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index a0ea36d528..cd1c1b0d99 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
import android.text.SpannableStringBuilder
import android.view.View
import android.view.ViewGroup
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index d84ced168c..202069ed61 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,7 @@ import android.content.Context
import android.content.Intent
import android.graphics.*
import android.os.Bundle
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
import android.text.Layout
import android.text.SpannableStringBuilder
import android.text.TextPaint
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..458ecbb3fb 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.toast
import android.os.Handler
import android.os.Looper
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
import android.widget.TextView
import android.widget.Toast
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index 51c9e53774..47f91e826e 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
-import android.support.v4.content.ContextCompat
+import androidx.core.content.ContextCompat
import android.view.Gravity
import android.view.View
import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 344a69e448..a495a13013 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -3,7 +3,6 @@ package com.blankj.utilcode.pkg.helper
import android.app.Dialog
import android.graphics.Bitmap
import android.graphics.drawable.ColorDrawable
-import android.support.v7.app.AlertDialog
import android.text.method.ScrollingMovementMethod
import android.view.Gravity
import android.view.LayoutInflater
@@ -12,9 +11,9 @@ import android.widget.Button
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
+import androidx.appcompat.app.AlertDialog
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.*
-import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest
/**
* ```
@@ -26,7 +25,7 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques
*/
object DialogHelper {
- fun showRationaleDialog(shouldRequest: ShouldRequest) {
+ fun showRationaleDialog(shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
val topActivity = ActivityUtils.getTopActivity()
AlertDialog.Builder(topActivity)
.setTitle(android.R.string.dialog_alert_title)
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
index 792ae5672e..9be8749952 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -1,5 +1,5 @@
-
-
+
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
index ccc88dddb6..1522b0741b 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
@@ -8,7 +8,7 @@
android:fillViewport="true"
tools:context=".feature.adaptScreen.AdaptCloseActivity">
-
@@ -43,6 +43,6 @@
android:textSize="30pt"
app:layout_constraintTop_toBottomOf="@id/adaptScreenCloseAdaptDpTv" />
-
+
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
index 350921b04d..75fa87e8e5 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
@@ -1,13 +1,12 @@
-
-
@@ -94,6 +93,6 @@
android:textSize="30pt" />
-
+
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
index 121415e1b6..dd9f9f40c7 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
@@ -8,7 +8,7 @@
android:fillViewport="true"
tools:context=".feature.adaptScreen.AdaptWidthActivity">
-
@@ -149,6 +149,6 @@
-
+
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
index 3ce196004b..bd6e43e7a7 100644
--- a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
-
-
-
Date: Sat, 29 Jun 2019 19:59:42 +0800
Subject: [PATCH 05/68] see 06/29 log
---
.../test/java/com/blankj/utilcode/util/TimeUtilsTest.java | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
index 2ba0a41586..5ab8ee17eb 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
@@ -42,15 +42,14 @@ public class TimeUtilsTest {
public void millis2String() {
assertEquals(timeString, TimeUtils.millis2String(timeMillis));
assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, mFormat));
- assertEquals("2017年05月04日", TimeUtils.millis2String(timeMillis, "yyyy年MM月dd日"));
- assertEquals("16时37分", TimeUtils.millis2String(timeMillis, "HH时mm分"));
+ assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, "yyyy MM dd HH:mm:ss"));
}
@Test
public void string2Millis() {
assertEquals(timeMillis, TimeUtils.string2Millis(timeString));
assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, mFormat));
- assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, "yyyy年MM月dd日HH时mm分"));
+ assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, "yyyy MM dd HH:mm:ss"));
}
@Test
From 40c0e36fbb1dc33ebce09a6fa162e07380271cf9 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Thu, 15 Aug 2019 01:36:03 +0800
Subject: [PATCH 06/68] see 08/15 log
---
lib/utilcode/README-CN.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index d610595e3c..cce78181fc 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -1185,7 +1185,7 @@ getComments : 获取压缩文件中的注释链表
[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
[map.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/MapUtils.java
-[map.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/MapUtilsTest.java
+[map.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/MapUtilsTest.java
[metaData.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
[metaData.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt
From 73dc60c4cdfa10a2b296df3e28ce9af2784be582 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sat, 30 Nov 2019 13:03:30 +0800
Subject: [PATCH 07/68] see 11/30 log
---
buildSrc/src/main/groovy/Config.groovy | 2 +-
config.json | 2 +-
.../pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt | 2 +-
.../utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java | 2 +-
lib/base/build.gradle | 2 +-
lib/subutil/build.gradle | 4 ++--
lib/utildebug/build.gradle | 2 +-
7 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 03181d7927..cc279262a8 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -41,7 +41,7 @@ class Config {
lib_base : new DepConfig(true, true, ":lib:base"),
lib_common : new DepConfig(true, true, ":lib:common"),
lib_subutil : new DepConfig(true, true, ":lib:subutil"),
- lib_utilcode : new DepConfig(true, true, ":lib:utilcode", "com.blankj:utilcode:1.26.0"),
+ lib_utilcodex : new DepConfig(true, true, ":lib:utilcodex", "com.blankj:utilcodex:1.26.0"),
lib_utildebug : new DepConfig(true, true, ":lib:utildebug", "com.blankj:utildebug:1.25.10-alpha5"),
lib_utildebug_no_op : new DepConfig(true, true, ":lib:utildebug-no-op", "com.blankj:utildebug-no-op:1.25.10-alpha5"),
/*Never delete this line*/
diff --git a/config.json b/config.json
index 188e2ff509..630e76de6a 100644
--- a/config.json
+++ b/config.json
@@ -20,7 +20,7 @@
{"isApply": true, "useLocal": true, "localPath": ":lib:base"},
{"isApply": true, "useLocal": true, "localPath": ":lib:common"},
{"isApply": true, "useLocal": true, "localPath": ":lib:subutil"},
- {"isApply": true, "useLocal": true, "localPath": ":lib:utilcode", "remotePath": "com.blankj:utilcode:1.26.0"},
+ {"isApply": true, "useLocal": true, "localPath": ":lib:utilcodex", "remotePath": "com.blankj:utilcodex:1.26.0"},
{"isApply": true, "useLocal": true, "localPath": ":lib:utildebug", "remotePath": "com.blankj:utildebug:1.25.10-alpha5"},
{"isApply": true, "useLocal": true, "localPath": ":lib:utildebug-no-op", "remotePath": "com.blankj:utildebug-no-op:1.25.10-alpha5"}
]
diff --git a/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 fb45369c5b..ccce008ded 100644
--- a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt
+++ b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt
@@ -2,8 +2,8 @@ package com.blankj.main.pkg
import android.graphics.Color
import android.os.Bundle
-import androidx.appcompat.app.ActionBarDrawerToggle
import android.view.View
+import androidx.appcompat.app.ActionBarDrawerToggle
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java
index e62c518699..b7efb5f4d7 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/reflect/TestPrivateStaticFinal.java
@@ -1,6 +1,6 @@
package com.blankj.utilcode.pkg.feature.reflect;
-import android.support.annotation.Keep;
+import androidx.annotation.Keep;
/**
*
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
index 2285071b5e..6fffd3af61 100644
--- a/lib/base/build.gradle
+++ b/lib/base/build.gradle
@@ -1,7 +1,7 @@
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
api Config.depConfig.lib_subutil.dep
- api Config.depConfig.lib_utilcode.dep
+ api Config.depConfig.lib_utilcodex.dep
api Config.depConfig.support_appcompat.dep
api Config.depConfig.support_material.dep
diff --git a/lib/subutil/build.gradle b/lib/subutil/build.gradle
index 662f2a4ec7..e7eaf45da1 100644
--- a/lib/subutil/build.gradle
+++ b/lib/subutil/build.gradle
@@ -13,14 +13,14 @@ readme {
dependencies {
compileOnly Config.depConfig.support_appcompat.dep
compileOnly Config.depConfig.support_material.dep
- compileOnly Config.depConfig.lib_utilcode.dep
+ compileOnly Config.depConfig.lib_utilcodex.dep
api(Config.depConfig.glide.dep) {
exclude group: "com.android.support"
}
api Config.depConfig.retrofit.dep
api Config.depConfig.gson.dep
- testImplementation Config.depConfig.lib_utilcode.dep
+ testImplementation Config.depConfig.lib_utilcodex.dep
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
}
\ No newline at end of file
diff --git a/lib/utildebug/build.gradle b/lib/utildebug/build.gradle
index b6380100bb..558735162a 100644
--- a/lib/utildebug/build.gradle
+++ b/lib/utildebug/build.gradle
@@ -5,7 +5,7 @@ apply {
}
dependencies {
- implementation Config.depConfig.lib_utilcode.dep
+ implementation Config.depConfig.lib_utilcodex.dep
implementation Config.depConfig.swipe_panel.dep
implementation Config.depConfig.photo_view.dep
compileOnly Config.depConfig.support_appcompat.dep
From 3fd7a91e0e3bbd2ddbaf2b79163527b02dcc87d9 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 7 Apr 2020 00:11:37 +0800
Subject: [PATCH 08/68] see 04/07 log
---
lib/utildebug/build.gradle | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/utildebug/build.gradle b/lib/utildebug/build.gradle
index b733473cf1..6e1157ef0b 100644
--- a/lib/utildebug/build.gradle
+++ b/lib/utildebug/build.gradle
@@ -9,4 +9,8 @@ dependencies {
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
testImplementation Config.depConfig.support_appcompat.dep
+}
+
+afterEvaluate {
+ verifyReleaseResources.enabled(false)
}
\ No newline at end of file
From 96c45acb8eb47a58c84bb467e6b126500765f5b2 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 7 Apr 2020 17:21:35 +0800
Subject: [PATCH 09/68] see 04/07 log
---
.../src/test/java/com/blankj/utilcode/util/BaseTest.java | 8 +++++---
.../java/com/blankj/utilcode/util/UiMessageUtilsTest.java | 3 ++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java
index 6e097938bf..ebaa83564d 100644
--- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java
+++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java
@@ -1,7 +1,5 @@
package com.blankj.utilcode.util;
-import android.support.annotation.NonNull;
-import java.util.concurrent.Executor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -9,6 +7,10 @@
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLog;
+import java.util.concurrent.Executor;
+
+import androidx.annotation.NonNull;
+
/**
*
* author: Blankj
@@ -18,7 +20,7 @@
*
*/
@RunWith(RobolectricTestRunner.class)
-@Config(manifest = Config.NONE,shadows = { ShadowLog.class })
+@Config(manifest = Config.NONE, shadows = {ShadowLog.class})
public class BaseTest {
@BusUtils.Bus(tag = "base")
diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java
index 1ef00ee586..140dd77683 100644
--- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java
+++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java
@@ -1,9 +1,10 @@
package com.blankj.utilcode.util;
-import android.support.annotation.NonNull;
import org.junit.Test;
+import androidx.annotation.NonNull;
+
/**
*
* author: blankj
From 7145da0408a6f5ed8f0bbd531245750eb1a1c75d Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 5 May 2020 02:24:34 +0800
Subject: [PATCH 10/68] see 05/05 log
---
buildSrc/src/main/groovy/Config.groovy | 8 ++++----
lib/base/build.gradle | 8 ++++----
lib/subutil/build.gradle | 4 ++--
lib/utilcode/build.gradle | 8 ++++----
lib/utildebug/build.gradle | 6 +++---
5 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index d8e41b3ca2..88b8eb9a5a 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -60,10 +60,10 @@ class Config {
//./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
- support_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"),
- support_material : new DepConfig("com.google.android.material:material:$androidxVersion"),
- support_multidex : new DepConfig("com.android.support:multidex:1.0.2"),
- support_constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"),
+ androidx_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"),
+ androidx_material : new DepConfig("com.google.android.material:material:$androidxVersion"),
+ androidx_multidex : new DepConfig("androidx.multidex:multidex:2.0.0"),
+ androidx_constraint : new DepConfig("androidx.constraintlayout:constraintlayout:1.1.3"),
kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"),
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
index 9a1ac7b329..bb7fa31573 100644
--- a/lib/base/build.gradle
+++ b/lib/base/build.gradle
@@ -3,10 +3,10 @@ dependencies {
api Config.depConfig.lib_subutil.dep
api Config.depConfig.lib_utilcode.dep
- api Config.depConfig.support_appcompat.dep
- api Config.depConfig.support_material.dep
- api Config.depConfig.support_multidex.dep
- api Config.depConfig.support_constraint.dep
+ api Config.depConfig.androidx_appcompat.dep
+ api Config.depConfig.androidx_material.dep
+ api Config.depConfig.androidx_multidex.dep
+ api Config.depConfig.androidx_constraint.dep
api Config.depConfig.kotlin.dep
api Config.depConfig.free_proguard.dep
api Config.depConfig.swipe_panel.dep
diff --git a/lib/subutil/build.gradle b/lib/subutil/build.gradle
index a8798fea1b..a561916f3e 100644
--- a/lib/subutil/build.gradle
+++ b/lib/subutil/build.gradle
@@ -9,8 +9,8 @@ readme {
}
dependencies {
- compileOnly Config.depConfig.support_appcompat.dep
- compileOnly Config.depConfig.support_material.dep
+ compileOnly Config.depConfig.androidx_appcompat.dep
+ compileOnly Config.depConfig.androidx_material.dep
compileOnly Config.depConfig.lib_utilcode.dep
api(Config.depConfig.glide.dep) {
exclude group: "com.android.support"
diff --git a/lib/utilcode/build.gradle b/lib/utilcode/build.gradle
index a3ed94861c..891f7dbf40 100644
--- a/lib/utilcode/build.gradle
+++ b/lib/utilcode/build.gradle
@@ -29,13 +29,13 @@ android {
dependencies {
implementation Config.depConfig.gson.dep
- compileOnly Config.depConfig.support_appcompat.dep
- compileOnly Config.depConfig.support_material.dep
+ compileOnly Config.depConfig.androidx_appcompat.dep
+ compileOnly Config.depConfig.androidx_material.dep
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
- testImplementation Config.depConfig.support_appcompat.dep
- testImplementation Config.depConfig.support_material.dep
+ testImplementation Config.depConfig.androidx_appcompat.dep
+ testImplementation Config.depConfig.androidx_material.dep
testImplementation Config.depConfig.eventbus_lib.dep
}
diff --git a/lib/utildebug/build.gradle b/lib/utildebug/build.gradle
index 6e1157ef0b..82b55495b0 100644
--- a/lib/utildebug/build.gradle
+++ b/lib/utildebug/build.gradle
@@ -1,6 +1,6 @@
dependencies {
- compileOnly Config.depConfig.support_appcompat.dep
- compileOnly Config.depConfig.support_material.dep
+ compileOnly Config.depConfig.androidx_appcompat.dep
+ compileOnly Config.depConfig.androidx_material.dep
implementation Config.depConfig.lib_utilcode.dep
implementation Config.depConfig.swipe_panel.dep
@@ -8,7 +8,7 @@ dependencies {
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
- testImplementation Config.depConfig.support_appcompat.dep
+ testImplementation Config.depConfig.androidx_appcompat.dep
}
afterEvaluate {
From c7190639ec44b9ff4b5b35f5580458b77abd79c7 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 5 May 2020 02:26:00 +0800
Subject: [PATCH 11/68] see 05/05 log
---
buildApp.gradle | 2 +-
buildSrc/src/main/groovy/Config.groovy | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/buildApp.gradle b/buildApp.gradle
index 2220ed6947..8cb7de95fe 100644
--- a/buildApp.gradle
+++ b/buildApp.gradle
@@ -68,7 +68,7 @@ android {
dependencies {
// LeakCanary
- debugImplementation Config.depConfig.leakcanary_android.dep
+ debugImplementation Config.depConfig.leakcanary.dep
debugImplementation Config.depConfig.lib_utildebug.dep
releaseImplementation Config.depConfig.lib_utildebug_no_op.dep
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 88b8eb9a5a..6074cf4d2e 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -20,7 +20,7 @@ class Config {
// lib version
static gradlePluginVersion = '3.5.2'
static kotlinVersion = '1.3.50'
- static androidxVersion = '1.0.0'
+ static androidxVersion = '1.1.0'
static depConfig = [
/*Never delete this line*/
@@ -60,14 +60,14 @@ class Config {
//./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter
- androidx_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"),
- androidx_material : new DepConfig("com.google.android.material:material:$androidxVersion"),
- androidx_multidex : new DepConfig("androidx.multidex:multidex:2.0.0"),
- androidx_constraint : new DepConfig("androidx.constraintlayout:constraintlayout:1.1.3"),
+ androidx_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"),
+ androidx_material : new DepConfig("com.google.android.material:material:$androidxVersion"),
+ androidx_multidex : new DepConfig("androidx.multidex:multidex:2.0.0"),
+ androidx_constraint : new DepConfig("androidx.constraintlayout:constraintlayout:1.1.3"),
kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"),
- leakcanary_android : new DepConfig("com.squareup.leakcanary:leakcanary-android:2.1"),
+ leakcanary : new DepConfig("com.squareup.leakcanary:leakcanary-android:2.1"),
free_proguard : new DepConfig("com.blankj:free-proguard:1.0.2"),
swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"),
From 940900d02f97b56c97202926e4a52d7ff93dede3 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 11 Aug 2020 11:08:58 +0800
Subject: [PATCH 12/68] see 08/11 log
---
README-CN.md | 2 ++
README.md | 2 ++
2 files changed, 4 insertions(+)
diff --git a/README-CN.md b/README-CN.md
index 32a5a0ac17..2c83da1237 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,5 +1,7 @@
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
+
+
[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
diff --git a/README.md b/README.md
index e0df3165eb..16b93e5be4 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
+
+
[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
From 01ca01aa44fc03016865e7369cee7547b05858c2 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 11 Aug 2020 11:30:06 +0800
Subject: [PATCH 13/68] see 08/11 log
---
README-CN.md | 2 +-
README.md | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README-CN.md b/README-CN.md
index 2c83da1237..4fb7144487 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,6 +1,6 @@
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-
+
[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
diff --git a/README.md b/README.md
index 16b93e5be4..6a4aff0546 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-
+
[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
From 3befa9bc8fadb42db37f3b992ef3a63988d30847 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Wed, 12 Aug 2020 16:56:04 +0800
Subject: [PATCH 14/68] see 08/12 log
---
lib/utilcode/README-CN.md | 19 ++++++++++++++-----
lib/utilcode/README.md | 11 ++++++++++-
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index 87836384ea..532800614d 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -8,6 +8,8 @@ implementation 'com.blankj:utilcode:1.29.0'
implementation 'com.blankj:utilcodex:1.29.0'
```
+
+
## APIs
@@ -1157,15 +1159,20 @@ removeListener: 移除消息监听器
* ### URI 相关 -> [UriUtils.java][uri.java]
```
-res2Uri : res 转 uri
-file2Uri : file 转 uri
-uri2File : uri 转 file
-uri2Bytes : uri 转 bytes
+res2Uri : res 转 uri
+file2Uri : file 转 uri
+uri2File : uri 转 file
+uri2Bytes: uri 转 bytes
```
* ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
```
-start: 启动透明 Activity
+start: 启动随当前线程的透明 Activity
+```
+
+* ### UtilsTransActivity4MainProcess -> [UtilsTransActivity4MainProcess.java][trans4Main.java]
+```
+start: 启动主线程的透明 Activity
```
* ### 震动相关 -> [VibrateUtils.java][vibrate.java] -> [Demo][vibrate.demo]
@@ -1396,6 +1403,8 @@ getComments : 获取压缩文件中的注释链表
[trans.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
+[trans4Main.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity4MainProcess.java
+
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index c2552ed43c..754d0bd027 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -8,6 +8,8 @@ implementation 'com.blankj:utilcode:1.29.0'
implementation 'com.blankj:utilcodex:1.29.0'
```
+
+
## APIs
@@ -1160,7 +1162,7 @@ removeListener
res2Uri
file2Uri
uri2File
-uri2InputStream
+uri2Bytes
```
* ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
@@ -1168,6 +1170,11 @@ uri2InputStream
start
```
+* ### UtilsTransActivity4MainProcess -> [UtilsTransActivity4MainProcess.java][trans4Main.java]
+```
+start
+```
+
* ### About Vibrate -> [VibrateUtils.java][vibrate.java] -> [Demo][vibrate.demo]
```
vibrate
@@ -1393,6 +1400,8 @@ getComments
[trans.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
+[trans4Main.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity4MainProcess.java
+
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
From c664cc558c590dc985b30a7fd370c3e2d5a501cf Mon Sep 17 00:00:00 2001
From: yummylau
Date: Mon, 17 Aug 2020 17:32:07 +0800
Subject: [PATCH 15/68] =?UTF-8?q?#=E4=BF=AE=E5=A4=8DOneUI2=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F=E7=89=88=E6=9C=AC=E5=89=8D=E4=B8=89=E6=98=9Fs8/note8?=
=?UTF-8?q?=E7=AD=89=E8=AE=BE=E5=A4=87=E5=AF=BC=E8=88=AA=E6=A0=8F=E5=8F=AF?=
=?UTF-8?q?=E8=A7=81=E6=80=A7=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF=E7=9A=84?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/blankj/utilcode/util/BarUtils.java | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 37596cd9eb..4fcd4e1ecf 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -7,11 +7,13 @@
import android.graphics.Color;
import android.graphics.Point;
import android.os.Build;
+import android.provider.Settings;
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.text.TextUtils;
import android.util.TypedValue;
import android.view.Display;
import android.view.KeyCharacterMap;
@@ -565,9 +567,26 @@ public static boolean isNavBarVisible(@NonNull final Window window) {
}
}
if (isVisible) {
+
+ // 对于三星手机,android10以下非OneUI2的版本,比如 s8,note8 等设备上,导航栏显示存在bug:"当用户隐藏导航栏时显示输入法的时候导航栏会跟随显示",会导致隐藏输入法之后判断错误
+ // 这个问题在 OneUI 2 & android 10 版本已修复
+ String manufacturer = "";
+ if (!TextUtils.isEmpty(Build.MANUFACTURER )){
+ manufacturer = Build.MANUFACTURER.trim();
+ }
+ if (manufacturer.toLowerCase().contains("samsung")
+ && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+ try {
+ return Settings.Global.getInt(window.getContext().getContentResolver(), "navigationbar_hide_bar_enabled") == 0;
+ } catch (Exception e) {
+ //nothing to do
+ }
+ }
+
int visibility = decorView.getSystemUiVisibility();
isVisible = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
}
+
return isVisible;
}
From f9dc1ec6088073cc248fc35f9c62cff1a57e2e77 Mon Sep 17 00:00:00 2001
From: caoshen
Date: Tue, 1 Sep 2020 20:06:46 +0800
Subject: [PATCH 16/68] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=8ESAF=E9=80=89?=
=?UTF-8?q?=E6=8B=A9=E6=96=87=E4=BB=B6=E6=97=B6id=E8=A7=A3=E6=9E=90?=
=?UTF-8?q?=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/java/com/blankj/utilcode/util/UriUtils.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 424c548b21..f589c42a09 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -177,13 +177,15 @@ else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
return null;
}// end 1_0
else if ("com.android.providers.downloads.documents".equals(authority)) {
- final String id = DocumentsContract.getDocumentId(uri);
+ String id = DocumentsContract.getDocumentId(uri);
if (TextUtils.isEmpty(id)) {
Log.d("UriUtils", uri.toString() + " parse failed(id is null). -> 1_1");
return null;
}
if (id.startsWith("raw:")) {
return new File(id.substring(4));
+ } else if (id.startsWith("msf:")) {
+ id = id.split(":")[1];
}
String[] contentUriPrefixesToTry = new String[]{
From 2d4fec4b60a5f88a342615d4f6972738f8f51e63 Mon Sep 17 00:00:00 2001
From: FaramarzAf
Date: Sat, 5 Sep 2020 14:50:25 +0430
Subject: [PATCH 17/68] TemperatureUtils class added to the lib-subutil
---
.../blankj/subutil/util/TemperatureUtils.java | 41 +++++++++++++++
.../subutil/util/TestTempConversion.java | 51 +++++++++++++++++++
2 files changed, 92 insertions(+)
create mode 100644 lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
create mode 100644 lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java
diff --git a/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java b/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
new file mode 100644
index 0000000000..44bd62a4af
--- /dev/null
+++ b/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
@@ -0,0 +1,41 @@
+package com.blankj.subutil.util;
+
+/**
+ * Create by Faramarz Afzali on 2020/9/5
+ *
+ * This class is intended for converting temperatures into different units.
+ * C refers to the Celsius unit
+ * F refers to the Fahrenheit unit
+ * K refers to the Kelvin unit
+ */
+
+public final class TemperatureUtils {
+
+
+ public static float cToF(float temp) {
+ return (temp * 9) / 5 + 32;
+ }
+
+ public static float cToK(float temp) {
+ return temp + 273.15f;
+ }
+
+
+ public static float fToC(float temp) {
+ return (temp - 32) * 5 / 9;
+ }
+
+ public static float fToK(float temp) {
+ return temp + 255.3722222222f;
+ }
+
+
+ public static float kToC(float temp) {
+ return temp - 273.15f;
+ }
+
+ public static float kToF(float temp) {
+ return temp - 459.67f;
+ }
+
+}
diff --git a/lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java b/lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java
new file mode 100644
index 0000000000..daa61ea0d3
--- /dev/null
+++ b/lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java
@@ -0,0 +1,51 @@
+package com.blankj.subutil.util;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Create by Faramarz Afzali on 2020/9/5
+ */
+
+
+@RunWith(JUnit4.class)
+public class TestTempConversion {
+
+ private float delta = 1e-15f;
+
+ @Test
+ public void testCToF() {
+ Assert.assertEquals(32f, TemperatureUtils.cToF(0f), delta);
+ }
+
+ @Test
+ public void testCToK() {
+ Assert.assertEquals(273.15f, TemperatureUtils.cToK(0f), delta);
+ }
+
+
+ @Test
+ public void testFToC() {
+ Assert.assertEquals(-17.777779f, TemperatureUtils.fToC(0f), delta);
+ }
+
+ @Test
+ public void testFToK() {
+ Assert.assertEquals(255.3722222222f, TemperatureUtils.fToK(0f), delta);
+ }
+
+
+ @Test
+ public void testKToC() {
+ Assert.assertEquals(-273.15f, TemperatureUtils.kToC(0f), delta);
+ }
+
+ @Test
+ public void testKToF() {
+ Assert.assertEquals(-459.67f, TemperatureUtils.kToF(0f), delta);
+ }
+
+}
From 6a266afaae1f2471d3bc57fd5e2b156a7bc85213 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Tue, 8 Sep 2020 15:52:50 +0800
Subject: [PATCH 18/68] see 09/08 log
---
CHANGELOG.md | 2 +
README-CN.md | 2 -
README.md | 2 -
build.gradle | 5 +-
buildApp.gradle | 7 +-
buildCommon.gradle | 41 +++
buildLib.gradle | 33 +--
buildSrc/src/main/groovy/Config.groovy | 4 +-
config.json | 2 +-
feature/utilcode/export/build.gradle | 10 +
.../utilcode/pkg/src/main/AndroidManifest.xml | 4 +
.../utilcode/pkg/feature/CoreUtilActivity.kt | 4 +
.../utilcode/pkg/feature/file/FileActivity.kt | 2 +-
.../pkg/feature/intent/IntentActivity.kt | 77 ++++++
.../utilcode/pkg/feature/mvp/MvpActivity.java | 2 +
.../utilcode/pkg/feature/mvp/MvpModel.java | 16 +-
.../pkg/feature/mvp/MvpPresenter.java | 11 +-
.../utilcode/pkg/feature/mvp/MvpView.java | 5 -
.../utilcode/pkg/feature/span/SpanActivity.kt | 1 +
.../pkg/src/main/res/values/strings.xml | 1 +
gradle/publish.gradle | 35 ++-
.../java/com/blankj/base/mvp/BaseModel.java | 31 +--
.../com/blankj/base/mvp/BasePresenter.java | 55 ++--
.../java/com/blankj/base/mvp/BaseView.java | 85 +++++--
.../blankj/subutil/util/TemperatureUtils.java | 17 +-
...version.java => TemperatureUtilsTest.java} | 23 +-
lib/utilcode/README-CN.md | 11 +-
lib/utilcode/README.md | 2 -
lib/utilcode/build.gradle | 4 -
.../utilcode/constant/RegexConstants.java | 8 +-
.../com/blankj/utilcode/util/AppUtils.java | 27 +-
.../com/blankj/utilcode/util/BarUtils.java | 19 +-
.../com/blankj/utilcode/util/BusUtils.java | 126 +++++++---
.../com/blankj/utilcode/util/ClickUtils.java | 72 ++----
.../blankj/utilcode/util/CollectionUtils.java | 4 +-
.../com/blankj/utilcode/util/ColorUtils.java | 10 +
.../blankj/utilcode/util/ConvertUtils.java | 2 +-
.../blankj/utilcode/util/DebouncingUtils.java | 88 +++++++
.../com/blankj/utilcode/util/DeviceUtils.java | 19 +-
.../blankj/utilcode/util/EncryptUtils.java | 15 +-
.../com/blankj/utilcode/util/FileUtils.java | 2 +-
.../com/blankj/utilcode/util/IntentUtils.java | 133 ++++++++--
.../blankj/utilcode/util/KeyboardUtils.java | 6 +-
.../blankj/utilcode/util/MessengerUtils.java | 27 +-
.../blankj/utilcode/util/PermissionUtils.java | 51 ++--
.../com/blankj/utilcode/util/RegexUtils.java | 3 +-
.../com/blankj/utilcode/util/ScreenUtils.java | 4 +-
.../blankj/utilcode/util/ServiceUtils.java | 30 ++-
.../com/blankj/utilcode/util/ToastUtils.java | 238 ++++++++----------
.../com/blankj/utilcode/util/UriUtils.java | 19 +-
.../util/UtilsActivityLifecycleImpl.java | 18 +-
.../com/blankj/utilcode/util/UtilsBridge.java | 14 ++
.../src/main/res/drawable/toast_frame.xml | 8 +
.../src/main/res/layout/toast_layout.xml | 23 ++
.../blankj/utilcode/util/BusUtilsTest.java | 52 +++-
lib/utildebug/build.gradle | 4 -
plugin/api-gradle-plugin/README.md | 2 +-
plugin/bus-gradle-plugin/README.md | 2 +-
58 files changed, 1003 insertions(+), 517 deletions(-)
create mode 100644 buildCommon.gradle
create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/intent/IntentActivity.kt
rename lib/subutil/src/test/java/com/blankj/subutil/util/{TestTempConversion.java => TemperatureUtilsTest.java} (69%)
create mode 100644 lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
create mode 100644 lib/utilcode/src/main/res/drawable/toast_frame.xml
create mode 100644 lib/utilcode/src/main/res/layout/toast_layout.xml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cec04c84f9..a20bd884ef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+* `20/09/06` [add] DebouncingUtils.
+* `20/09/04` [fix] ToastUtils adapt SDK 30.
* `20/05/28` [fix] IntentUtils#getInstallAppIntent file exist wrong. Publish v1.29.0.
* `20/05/23` [fix] BusUtils#postSticky times not right. Publish v1.28.6.
* `20/05/22` [add] IntentUtils#getInstallAppIntent support Uri param.
diff --git a/README-CN.md b/README-CN.md
index 4fb7144487..32a5a0ac17 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,7 +1,5 @@
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-
-
[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
diff --git a/README.md b/README.md
index 6a4aff0546..e0df3165eb 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
-
-
[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
[![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
diff --git a/build.gradle b/build.gradle
index 24c3b741e7..dd27b98617 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,9 +4,7 @@ buildscript {
repositories {
// use for debug plugin local
if (Config.depConfig.plugin_bus.useLocal || Config.depConfig.plugin_api.useLocal) {
- maven() {
- url new File("mavenLocal")
- }
+ maven() { url uri("${project.rootDir.path}/mavenLocal") }
}
google()
jcenter()
@@ -21,6 +19,7 @@ buildscript {
allprojects {
repositories {
+ maven() { url uri("${project.rootDir.path}/mavenLocal") }
maven { url "https://jitpack.io/" }
google()
jcenter()
diff --git a/buildApp.gradle b/buildApp.gradle
index 2fc65a6999..0af2639065 100644
--- a/buildApp.gradle
+++ b/buildApp.gradle
@@ -1,7 +1,6 @@
apply {
plugin "com.android.application"
- plugin "kotlin-android"
- plugin "kotlin-android-extensions"
+ from "${rootDir.path}/buildCommon.gradle"
if (Config.depConfig.plugin_api.isApply) {
plugin Config.depConfig.plugin_api.pluginId
}
@@ -26,11 +25,7 @@ if (Config.depConfig.plugin_api.isApply) {
}
android {
- compileSdkVersion Config.compileSdkVersion
defaultConfig {
- minSdkVersion Config.minSdkVersion
- versionCode Config.versionCode
- versionName Config.versionName
applicationId Config.applicationId + suffix
targetSdkVersion Config.targetSdkVersion
multiDexEnabled true
diff --git a/buildCommon.gradle b/buildCommon.gradle
new file mode 100644
index 0000000000..f83f74f52d
--- /dev/null
+++ b/buildCommon.gradle
@@ -0,0 +1,41 @@
+apply {
+ plugin "kotlin-android"
+ plugin "kotlin-android-extensions"
+}
+
+android {
+ compileSdkVersion Config.compileSdkVersion
+ defaultConfig {
+ minSdkVersion Config.minSdkVersion
+ versionCode Config.versionCode
+ versionName Config.versionName
+ consumerProguardFiles 'proguard-rules.pro'
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+// viewBinding {
+// enabled = true
+// }
+
+// flavorDimensions "region"
+//
+// productFlavors {
+// china {
+// dimension "region"
+// }
+//
+// oversea {
+// dimension "region"
+// }
+// }
+}
\ No newline at end of file
diff --git a/buildLib.gradle b/buildLib.gradle
index e2ad034683..ac9c42ac1c 100644
--- a/buildLib.gradle
+++ b/buildLib.gradle
@@ -1,34 +1,5 @@
-apply {
- plugin "com.android.library"
- plugin "kotlin-android"
- plugin "kotlin-android-extensions"
-}
-
-android {
- compileSdkVersion Config.compileSdkVersion
- defaultConfig {
- minSdkVersion Config.minSdkVersion
- versionCode Config.versionCode
- versionName Config.versionName
- consumerProguardFiles 'proguard-rules.pro'
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- consumerProguardFiles 'proguard-rules.pro'
- }
- }
-
- lintOptions {
- abortOnError false
- }
-
-// viewBinding {
-// enabled = true
-// }
-}
+apply plugin: "com.android.library"
+apply from: "${rootDir.path}/buildCommon.gradle"
dependencies {
if (project.name.endsWith("_pkg") || project.name.endsWith("_mock")) {
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index d73098c38e..2c85babdf5 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -19,7 +19,7 @@ class Config {
// lib version
static gradlePluginVersion = '3.5.0'
- static kotlinVersion = '1.3.50'
+ static kotlinVersion = '1.3.72'
static supportVersion = '28.0.0'
static depConfig = [
@@ -37,7 +37,7 @@ class Config {
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"),
+ feature_utilcode_export : new DepConfig(true , true , ":feature:utilcode:export", "com.blankj:utilcode-export:1.1"),
lib_base : new DepConfig(true , true , ":lib:base"),
lib_common : new DepConfig(true , true , ":lib:common"),
lib_subutil : new DepConfig(true , true , ":lib:subutil"),
diff --git a/config.json b/config.json
index 1ed59b5d2f..aa55557a6a 100644
--- a/config.json
+++ b/config.json
@@ -17,7 +17,7 @@
{"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": ":feature:utilcode:export", "remotePath": "com.blankj:utilcode-export:1.1"},
{"isApply": true, "useLocal": true, "localPath": ":lib:base"},
{"isApply": true, "useLocal": true, "localPath": ":lib:common"},
{"isApply": true, "useLocal": true, "localPath": ":lib:subutil"},
diff --git a/feature/utilcode/export/build.gradle b/feature/utilcode/export/build.gradle
index e69de29bb2..cecc254461 100644
--- a/feature/utilcode/export/build.gradle
+++ b/feature/utilcode/export/build.gradle
@@ -0,0 +1,10 @@
+apply from: "${rootDir.path}/gradle/publish.gradle"
+publish {
+ def depConfig = Config.depConfig.feature_utilcode_export
+ name = "UtilCodeExport"
+ groupId = depConfig.groupId
+ artifactId = depConfig.artifactId
+ version = depConfig.version
+ website = "https://github.com/Blankj/UtilCodeExport"
+}
+//./gradlew :feature_utilcode_export:mavenLocal // 上传到本地 mavenLocal
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml
index 3a2c50225e..fde82401a1 100644
--- a/feature/utilcode/pkg/src/main/AndroidManifest.xml
+++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml
@@ -159,6 +159,10 @@
android:name=".feature.image.ImageActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
+
> {
+ return CollectionUtils.newArrayList(
+ CommonItemClick("LaunchApp") {
+ startActivity(IntentUtils.getLaunchAppIntent(packageName))
+ },
+ CommonItemClick("LaunchAppDetailsSettings") {
+ startActivityForResult(IntentUtils.getLaunchAppDetailsSettingsIntent(packageName), 1)
+ },
+ CommonItemClick("ShareText") {
+ startActivity(IntentUtils.getShareTextIntent("share content"))
+ },
+ CommonItemClick("ShareImage") {
+ startActivity(IntentUtils.getShareImageIntent(getShareImagePath()[0]));
+ },
+ CommonItemClick("ShareTextImage") {
+ startActivity(IntentUtils.getShareTextImageIntent("share content", getShareImagePath()[0]));
+ },
+ CommonItemClick("ShareImages") {
+ startActivity(IntentUtils.getShareImageIntent(getShareImagePath()));
+ },
+ CommonItemClick("ShareTextImages") {
+ startActivity(IntentUtils.getShareTextImageIntent("share content", getShareImagePath()));
+ }
+ )
+ }
+
+ private fun getShareImagePath(): LinkedList {
+ val shareImagePath0 = Config.CACHE_PATH + "share.jpg"
+ if (!FileUtils.isFile(shareImagePath0)) {
+ ImageUtils.save(ImageUtils.getBitmap(R.drawable.image_lena), shareImagePath0, Bitmap.CompressFormat.JPEG)
+ }
+ val shareImagePath1 = Config.CACHE_PATH + "cheetah.jpg"
+ if (!FileUtils.isFile(shareImagePath1)) {
+ ImageUtils.save(ImageUtils.getBitmap(R.drawable.span_cheetah), shareImagePath1, Bitmap.CompressFormat.JPEG)
+ }
+ return CollectionUtils.newLinkedList(shareImagePath0, shareImagePath1)
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ LogUtils.d("onActivityResult() called with: requestCode = $requestCode, resultCode = $resultCode, data = $data")
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
index 7aa5fe26b1..813431f6f8 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
@@ -1,5 +1,7 @@
package com.blankj.utilcode.pkg.feature.mvp;
+import android.arch.lifecycle.ViewModel;
+import android.arch.lifecycle.ViewModelProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
index 023c3a919b..8697f11c1d 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpModel.java
@@ -17,18 +17,13 @@ public class MvpModel extends BaseModel implements IMvp.Model {
private int index;
@Override
- public void onCreateModel() {
+ public void onCreate() {
index = 0;
}
- @Override
- public void onDestroyModel() {
-
- }
-
@Override
public void requestUpdateMsg(final Utils.Consumer consumer) {
- ThreadUtils.executeByCached(addAutoDestroyTask(new ThreadUtils.SimpleTask() {
+ ThreadUtils.executeByCached(new ThreadUtils.SimpleTask() {
@Override
public String doInBackground() throws Throwable {
Thread.sleep(2000);
@@ -39,6 +34,11 @@ public String doInBackground() throws Throwable {
public void onSuccess(String result) {
consumer.accept(result);
}
- }));
+ });
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
}
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java
index 8b78e2cd20..01990aa3af 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpPresenter.java
@@ -1,6 +1,7 @@
package com.blankj.utilcode.pkg.feature.mvp;
import com.blankj.base.mvp.BasePresenter;
+import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.Utils;
/**
@@ -15,7 +16,7 @@ public class MvpPresenter extends BasePresenter
implements IMvp.Presenter {
@Override
- public void onAttachView() {
+ public void onBindView() {
}
@Override
@@ -24,8 +25,12 @@ public void updateMsg() {
getModel(MvpModel.class).requestUpdateMsg(new Utils.Consumer() {
@Override
public void accept(String s) {
- getView().showMsg(s);
- getView().setLoadingVisible(false);
+ if (isAlive()) {
+ getView().showMsg(s);
+ getView().setLoadingVisible(false);
+ } else {
+ LogUtils.iTag(MvpView.TAG, "destroyed");
+ }
}
});
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
index b74c23ae62..59ab715ac0 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
@@ -53,9 +53,4 @@ public void run() {
public void showMsg(CharSequence msg) {
ToastUtils.showLong(msg);
}
-
- @Override
- public void onDestroyView() {
-
- }
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index bf5d46b154..d43afd850f 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
@@ -81,6 +81,7 @@ class SpanActivity : CommonActivity() {
SpanUtils.with(spanAboutTv)
.appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setHorizontalAlign(Layout.Alignment.ALIGN_CENTER)
.appendLine("前景色").setForegroundColor(Color.GREEN)
+// .appendLine("测试哈哈").setForegroundColor(Color.RED).setBackgroundColor(Color.LTGRAY).setFontSize(10).setLineHeight(280, SpanUtils.ALIGN_BOTTOM)
.appendLine("背景色").setBackgroundColor(Color.LTGRAY)
.appendLine("行高居中对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY)
.appendLine("行高底部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN)
diff --git a/feature/utilcode/pkg/src/main/res/values/strings.xml b/feature/utilcode/pkg/src/main/res/values/strings.xml
index 02f2622ab2..5bea803e40 100644
--- a/feature/utilcode/pkg/src/main/res/values/strings.xml
+++ b/feature/utilcode/pkg/src/main/res/values/strings.xml
@@ -15,6 +15,7 @@
FlashlightUtils Demo
FragmentUtils Demo
ImageUtils Demo
+ IntentUtils Demo
KeyboardUtils Demo
Language Demo
LogUtils Demo
diff --git a/gradle/publish.gradle b/gradle/publish.gradle
index f6fdfb4dda..76bb5fea66 100644
--- a/gradle/publish.gradle
+++ b/gradle/publish.gradle
@@ -58,17 +58,17 @@ def configMaven(Project project, PublishExtension ext) {
configuration = project.configurations.archives
repositories.mavenDeployer {
- repository(url: uri(new File(project.rootDir.getPath() + "/mavenLocal")))
+ repository(url: uri("${project.rootDir.path}/mavenLocal"))
configPom(pom, ext)
}
doFirst {
- checkExt(project, ext)
+ ext.check(false)
}
}
project.tasks.findByName("bintrayUpload").doFirst {
- checkExt(project, ext)
+ ext.check(true)
}
}
@@ -102,13 +102,23 @@ def configPom(pom, PublishExtension ext) {
}
}
}
-}
-static def checkExt(Project project, PublishExtension ext) {
- if (ext.isBintrayEmpty()) {
- throw new NullPointerException("U should set bintrayUser and bintrayKey in local.properties")
+ pom.whenConfigured {
+ // 检测 module 中的 dependencies 是否有源码依赖
+ // 如果是源码依赖,而且没有在 config 中配置 remotePath,那么发布到仓库,其他地方依赖该库时会找不到源码的那个库
+ it.dependencies.findAll { dep -> dep.version == "unspecified" }.collect { dep ->
+ DepConfig config = Config.depConfig.get(dep.artifactId)
+ if (config == null || config.version == null) {
+ // 源码依赖而且没有在 config 中配置 remotePath,直接报错
+ System.err.println("The module of <" + dep.artifactId + "> should publish to maven first.")
+ throw new RuntimeException()
+ }
+ dep.groupId = config.groupId
+ dep.version = config.version
+ // 源码依赖,但配置了 remotePath,让 pom 中写入 remotePath
+ GLog.l("Please check <${dep.groupId}:${dep.artifactId}:${dep.version}> is published.")
+ }
}
- ext.check()
}
def configBintray(Project project, PublishExtension ext) {
@@ -197,15 +207,18 @@ class PublishExtension {
String bintrayUser
String bintrayKey
- void check() {
+ void check(boolean isBintray) {
checkField(name, "name")
checkField(groupId, "groupId")
checkField(artifactId, "artifactId")
checkField(version, "version")
checkField(website, "website")
- checkField(bintrayUser, "bintrayUser")
- checkField(bintrayKey, "bintrayKey")
+ if (isBintray) {
+ if (isBintrayEmpty()) {
+ throw new NullPointerException("U should set bintrayUser and bintrayKey in local.properties")
+ }
+ }
}
boolean isBintrayEmpty() {
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java b/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
index cbdd94c2be..84c930fd74 100644
--- a/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
@@ -1,10 +1,9 @@
package com.blankj.base.mvp;
-import com.blankj.utilcode.util.ThreadUtils;
-import com.blankj.utilcode.util.ToastUtils;
-
-import java.util.ArrayList;
-import java.util.List;
+import android.arch.lifecycle.LiveData;
+import android.arch.lifecycle.MutableLiveData;
+import android.support.annotation.CallSuper;
+import android.util.Log;
/**
*
@@ -16,24 +15,14 @@
*/
public abstract class BaseModel {
- private List mTasks = new ArrayList<>();
-
- public abstract void onCreateModel();
+ LiveData mData = new MutableLiveData<>();
- public abstract void onDestroyModel();
+ private static final String TAG = BaseView.TAG;
- public ThreadUtils.Task addAutoDestroyTask(ThreadUtils.Task task) {
- if (task == null) return null;
- mTasks.add(task);
- return task;
- }
+ public abstract void onCreate();
- void destroy() {
- onDestroyModel();
- for (ThreadUtils.Task task : mTasks) {
- if (task == null) continue;
- task.cancel();
- ToastUtils.showLong("Mvp Task Canceled.");
- }
+ @CallSuper
+ public void onDestroy() {
+ Log.i(TAG, "destroy model: " + getClass().getSimpleName());
}
}
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java b/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
index 7365c3490a..a067e2aff5 100644
--- a/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
@@ -1,12 +1,9 @@
package com.blankj.base.mvp;
-import android.app.Activity;
-import android.arch.lifecycle.Lifecycle;
-import android.support.annotation.NonNull;
-
-import com.blankj.utilcode.util.ActivityUtils;
-import com.blankj.utilcode.util.LogUtils;
-import com.blankj.utilcode.util.Utils;
+import android.arch.lifecycle.ViewModel;
+import android.arch.lifecycle.ViewModelProvider;
+import android.support.annotation.CallSuper;
+import android.util.Log;
import java.util.HashMap;
import java.util.Map;
@@ -19,17 +16,19 @@
* desc :
*
*/
-public abstract class BasePresenter extends Utils.ActivityLifecycleCallbacks {
+public abstract class BasePresenter {
+
+ private static final String TAG = BaseView.TAG;
- private V mView;
- private Map mModelMap = new HashMap<>();
+ private V mView;
+ private Map, BaseModel> mModelMap = new HashMap<>();
+ private boolean isAlive = true;
- public abstract void onAttachView();
+ public abstract void onBindView();
void bindView(V view) {
this.mView = view;
- onAttachView();
- ActivityUtils.addActivityLifecycleCallbacks(mView.getActivity(), this);
+ onBindView();
}
public V getView() {
@@ -45,7 +44,7 @@ public M getModel(Class modelClass) {
try {
M model = modelClass.newInstance();
mModelMap.put(modelClass, model);
- model.onCreateModel();
+ model.onCreate();
return model;
} catch (IllegalAccessException e) {
e.printStackTrace();
@@ -55,25 +54,23 @@ public M getModel(Class modelClass) {
return null;
}
- @Override
- public void onLifecycleChanged(@NonNull Activity activity, Lifecycle.Event event) {
- super.onLifecycleChanged(activity, event);
- if (event == Lifecycle.Event.ON_DESTROY) {
- destroyPresenter();
- }
- LogUtils.i("onLifecycleChanged: " + event);
- }
-
- private void destroyPresenter() {
- if (mView != null) {
- mView.mPresenterMap.remove(this.getClass());
- mView.onDestroyView();
- }
+ @CallSuper
+ public void onDestroy() {
+ Log.i(TAG, "destroy presenter: " + getClass().getSimpleName());
+ isAlive = false;
for (BaseModel model : mModelMap.values()) {
if (model != null) {
- model.destroy();
+ model.onDestroy();
}
}
mModelMap.clear();
}
+
+ public boolean isAlive() {
+ return isAlive;
+ }
+
+ public void getSafeData() {
+ new ViewModelProvider(getView().getActivity(), new ViewModelProvider.NewInstanceFactory()).get(ViewModel.class);
+ }
}
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java b/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
index a870e06d82..f13cc350dd 100644
--- a/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
@@ -1,13 +1,12 @@
package com.blankj.base.mvp;
-import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
-import android.support.annotation.NonNull;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.OnLifecycleEvent;
+import android.support.annotation.CallSuper;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
-
-import com.blankj.utilcode.util.ActivityUtils;
-import com.blankj.utilcode.util.Utils;
+import android.util.Log;
import java.util.HashMap;
import java.util.Map;
@@ -20,45 +19,95 @@
* desc :
*
*/
-public abstract class BaseView {
+public class BaseView implements LifecycleObserver {
+
+ public static final String TAG = "UtilsMVP";
- private FragmentActivity mActivity;
- private Fragment mFragment;
- Map> mPresenterMap = new HashMap<>();
+ private FragmentActivity mActivity;
+ private Fragment mFragment;
+ private Lifecycle mLifecycle;
+ private Map, BasePresenter> mPresenterMap = new HashMap<>();
- public abstract void onDestroyView();
+ public BaseView(Fragment fragment) {
+ mFragment = fragment;
+ mActivity = fragment.getActivity();
+ mLifecycle = mFragment.getLifecycle();
+ addLifecycle(this);
+ }
public BaseView(FragmentActivity activity) {
mActivity = activity;
+ mLifecycle = mActivity.getLifecycle();
+ addLifecycle(this);
}
- public BaseView(Fragment fragment) {
- mFragment = fragment;
- mActivity = fragment.getActivity();
+ public BaseView(Lifecycle lifecycle) {
+ mLifecycle = lifecycle;
+ addLifecycle(this);
}
public T getActivity() {
+ if (mActivity == null) {
+ return null;
+ }
//noinspection unchecked
return (T) mActivity;
}
public T getFragment() {
+ if (mFragment == null) {
+ return null;
+ }
//noinspection unchecked
return (T) mFragment;
}
- public void addPresenter(BasePresenter presenter) {
+ public V addPresenter(BasePresenter presenter) {
+ if (presenter == null) return (V) this;
mPresenterMap.put(presenter.getClass(), presenter);
//noinspection unchecked
presenter.bindView((V) this);
+ return (V) this;
}
public > P getPresenter(Class
presenterClass) {
+ if (presenterClass == null) {
+ throw new IllegalArgumentException("presenterClass is null!");
+ }
BasePresenter basePresenter = mPresenterMap.get(presenterClass);
- if (basePresenter != null) {
- //noinspection unchecked
- return (P) basePresenter;
+ if (basePresenter == null) {
+ throw new IllegalArgumentException("presenter of <" + presenterClass.getSimpleName() + "> is not added!");
+ }
+ //noinspection unchecked
+ return (P) basePresenter;
+ }
+
+ @CallSuper
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ public void onDestroy() {
+ Log.i(TAG, "destroy view: " + getClass().getSimpleName());
+ removeLifecycle(this);
+ for (BasePresenter presenter : mPresenterMap.values()) {
+ if (presenter != null) {
+ presenter.onDestroy();
+ }
+ }
+ mPresenterMap.clear();
+ }
+
+ private void addLifecycle(LifecycleObserver observer) {
+ if (mLifecycle == null) {
+ Log.w(TAG, "addLifecycle: mLifecycle is null");
+ return;
+ }
+ mLifecycle.addObserver(observer);
+ }
+
+ private void removeLifecycle(LifecycleObserver observer) {
+ if (mLifecycle == null) {
+ Log.w(TAG, "removeLifecycle: mLifecycle is null");
+ return;
}
- return null;
+ mLifecycle.removeObserver(observer);
}
}
diff --git a/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java b/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
index 44bd62a4af..f50687ab59 100644
--- a/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
+++ b/lib/subutil/src/main/java/com/blankj/subutil/util/TemperatureUtils.java
@@ -1,17 +1,17 @@
package com.blankj.subutil.util;
/**
- * Create by Faramarz Afzali on 2020/9/5
- *
- * This class is intended for converting temperatures into different units.
- * C refers to the Celsius unit
- * F refers to the Fahrenheit unit
- * K refers to the Kelvin unit
+ *
+ * author: Faramarz Afzali
+ * time : 2020/09/05
+ * desc : This class is intended for converting temperatures into different units.
+ * C refers to the Celsius unit
+ * F refers to the Fahrenheit unit
+ * K refers to the Kelvin unit
+ *
*/
-
public final class TemperatureUtils {
-
public static float cToF(float temp) {
return (temp * 9) / 5 + 32;
}
@@ -37,5 +37,4 @@ public static float kToC(float temp) {
public static float kToF(float temp) {
return temp - 459.67f;
}
-
}
diff --git a/lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java b/lib/subutil/src/test/java/com/blankj/subutil/util/TemperatureUtilsTest.java
similarity index 69%
rename from lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java
rename to lib/subutil/src/test/java/com/blankj/subutil/util/TemperatureUtilsTest.java
index daa61ea0d3..84ee329851 100644
--- a/lib/subutil/src/test/java/com/blankj/subutil/util/TestTempConversion.java
+++ b/lib/subutil/src/test/java/com/blankj/subutil/util/TemperatureUtilsTest.java
@@ -7,44 +7,47 @@
import org.junit.runners.JUnit4;
/**
- * Create by Faramarz Afzali on 2020/9/5
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/03/22
+ * desc : TemperatureUtils 单元测试
+ *
*/
-
-
@RunWith(JUnit4.class)
-public class TestTempConversion {
+public class TemperatureUtilsTest {
private float delta = 1e-15f;
@Test
- public void testCToF() {
+ public void cToF() {
Assert.assertEquals(32f, TemperatureUtils.cToF(0f), delta);
}
@Test
- public void testCToK() {
+ public void cToK() {
Assert.assertEquals(273.15f, TemperatureUtils.cToK(0f), delta);
}
@Test
- public void testFToC() {
+ public void fToC() {
Assert.assertEquals(-17.777779f, TemperatureUtils.fToC(0f), delta);
}
@Test
- public void testFToK() {
+ public void fToK() {
Assert.assertEquals(255.3722222222f, TemperatureUtils.fToK(0f), delta);
}
@Test
- public void testKToC() {
+ public void kToC() {
Assert.assertEquals(-273.15f, TemperatureUtils.kToC(0f), delta);
}
@Test
- public void testKToF() {
+ public void kToF() {
Assert.assertEquals(-459.67f, TemperatureUtils.kToF(0f), delta);
}
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index 532800614d..3f5cd01a41 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -8,8 +8,6 @@ implementation 'com.blankj:utilcode:1.29.0'
implementation 'com.blankj:utilcodex:1.29.0'
```
-
-
## APIs
@@ -344,6 +342,7 @@ string2Int : 颜色串转颜色值
int2RgbString : 颜色值转 RGB 串
int2ArgbString : 颜色值转 ARGB 串
getRandomColor : 获取随机色
+isLightColor : 判断是否亮色
```
* ### 转换相关 -> [ConvertUtils.java][convert.java] -> [Test][convert.test]
@@ -380,6 +379,11 @@ sp2px, px2sp : sp 与 px 互转
init: 初始化
```
+* ### 防抖相关 -> [DebouncingUtils.java][debouncing.java]
+```
+isValid: 是否有效
+```
+
* ### 设备相关 -> [DeviceUtils.java][device.java] -> [Demo][device.demo]
```
isDeviceRooted : 判断设备是否 rooted
@@ -578,6 +582,7 @@ getLaunchAppIntent : 获取打开 App 的意图
getLaunchAppDetailsSettingsIntent: 获取 App 具体设置的意图
getShareTextIntent : 获取分享文本的意图
getShareImageIntent : 获取分享图片的意图
+getShareTextImageIntent : 获取分享图文的意图
getComponentIntent : 获取其他应用组件的意图
getShutdownIntent : 获取关机的意图
getCaptureIntent : 获取拍照的意图
@@ -1273,6 +1278,8 @@ getComments : 获取压缩文件中的注释链表
[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+[debouncing.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
+
[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index 754d0bd027..e29bf3dae1 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -8,8 +8,6 @@ implementation 'com.blankj:utilcode:1.29.0'
implementation 'com.blankj:utilcodex:1.29.0'
```
-
-
## APIs
diff --git a/lib/utilcode/build.gradle b/lib/utilcode/build.gradle
index 283e55936b..dd2df94746 100644
--- a/lib/utilcode/build.gradle
+++ b/lib/utilcode/build.gradle
@@ -40,10 +40,6 @@ dependencies {
testImplementation Config.depConfig.eventbus_lib.dep
}
-afterEvaluate {
- verifyReleaseResources.enabled(false)
-}
-
apply from: "${rootDir.path}/gradle/publish.gradle"
publish {
name = "UtilCode"
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/constant/RegexConstants.java b/lib/utilcode/src/main/java/com/blankj/utilcode/constant/RegexConstants.java
index 2bf982c8c4..2c85bf835f 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/constant/RegexConstants.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/constant/RegexConstants.java
@@ -16,13 +16,13 @@ public final class RegexConstants {
public static final String REGEX_MOBILE_SIMPLE = "^[1]\\d{10}$";
/**
* Regex of exact mobile.
- * china mobile: 134(0-8), 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188, 198
- * china unicom: 130, 131, 132, 145, 155, 156, 166, 171, 175, 176, 185, 186
- * china telecom: 133, 153, 173, 177, 180, 181, 189, 199, 191
+ * china mobile: 134(0-8), 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 165, 172, 178, 182, 183, 184, 187, 188, 198
+ * china unicom: 130, 131, 132, 145, 155, 156, 166, 167, 171, 175, 176, 185, 186
+ * china telecom: 133, 153, 162, 173, 177, 180, 181, 189, 199, 191
* global star: 1349
* virtual operator: 170
*/
- public static final String REGEX_MOBILE_EXACT = "^((13[0-9])|(14[57])|(15[0-35-9])|(16[6])|(17[0135-8])|(18[0-9])|(19[189]))\\d{8}$";
+ public static final String REGEX_MOBILE_EXACT = "^((13[0-9])|(14[57])|(15[0-35-9])|(16[2567])|(17[01235-8])|(18[0-9])|(19[189]))\\d{8}$";
/**
* Regex of telephone number.
*/
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
index 55923524dc..f1a33238ab 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -11,6 +11,7 @@
import android.content.pm.Signature;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Build;
import android.support.annotation.NonNull;
import android.util.Log;
@@ -523,8 +524,12 @@ public static Signature[] getAppSignature(final String packageName) {
if (UtilsBridge.isSpace(packageName)) return null;
try {
PackageManager pm = Utils.getApp().getPackageManager();
- @SuppressLint("PackageManagerGetSignatures")
- PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
+ PackageInfo pi;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES);
+ } else {
+ pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
+ }
return pi == null ? null : pi.signatures;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
@@ -532,6 +537,24 @@ public static Signature[] getAppSignature(final String packageName) {
}
}
+ /**
+ * Return the application's signature.
+ *
+ * @param file The file.
+ * @return the application's signature
+ */
+ public static Signature[] getAppSignature(final File file) {
+ if (file == null) return null;
+ PackageManager pm = Utils.getApp().getPackageManager();
+ PackageInfo pi;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ pi = pm.getPackageArchiveInfo(file.getAbsolutePath(), PackageManager.GET_SIGNING_CERTIFICATES);
+ } else {
+ pi = pm.getPackageArchiveInfo(file.getAbsolutePath(), PackageManager.GET_SIGNATURES);
+ }
+ return pi == null ? null : pi.signatures;
+ }
+
/**
* Return the application's signature for SHA1 value.
*
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 4fcd4e1ecf..7f96cce7dd 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -13,7 +13,6 @@
import android.support.annotation.RequiresApi;
import android.support.annotation.RequiresPermission;
import android.support.v4.widget.DrawerLayout;
-import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Display;
import android.view.KeyCharacterMap;
@@ -567,19 +566,15 @@ public static boolean isNavBarVisible(@NonNull final Window window) {
}
}
if (isVisible) {
-
- // 对于三星手机,android10以下非OneUI2的版本,比如 s8,note8 等设备上,导航栏显示存在bug:"当用户隐藏导航栏时显示输入法的时候导航栏会跟随显示",会导致隐藏输入法之后判断错误
+ // 对于三星手机,android10以下非OneUI2的版本,比如 s8,note8 等设备上,
+ // 导航栏显示存在bug:"当用户隐藏导航栏时显示输入法的时候导航栏会跟随显示",会导致隐藏输入法之后判断错误
// 这个问题在 OneUI 2 & android 10 版本已修复
- String manufacturer = "";
- if (!TextUtils.isEmpty(Build.MANUFACTURER )){
- manufacturer = Build.MANUFACTURER.trim();
- }
- if (manufacturer.toLowerCase().contains("samsung")
- && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+ if (UtilsBridge.isSamsung()
+ && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
+ && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
try {
- return Settings.Global.getInt(window.getContext().getContentResolver(), "navigationbar_hide_bar_enabled") == 0;
- } catch (Exception e) {
- //nothing to do
+ return Settings.Global.getInt(Utils.getApp().getContentResolver(), "navigationbar_hide_bar_enabled") == 0;
+ } catch (Exception ignore) {
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
index 860d369b39..87138eada4 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
@@ -61,7 +61,7 @@ private void registerBus(String tag,
busInfoList = new ArrayList<>();
mTag_BusInfoListMap.put(tag, busInfoList);
}
- busInfoList.add(new BusInfo(className, funName, paramType, paramName, sticky, threadMode, priority));
+ busInfoList.add(new BusInfo(tag, className, funName, paramType, paramName, sticky, threadMode, priority));
}
public static void register(final Object bus) {
@@ -107,16 +107,30 @@ private static BusUtils getInstance() {
private void registerInner(final Object bus) {
if (bus == null) return;
- Class aClass = bus.getClass();
+ Class> aClass = bus.getClass();
String className = aClass.getName();
+ boolean isNeedRecordTags = false;
synchronized (mClassName_BusesMap) {
Set buses = mClassName_BusesMap.get(className);
if (buses == null) {
buses = new CopyOnWriteArraySet<>();
mClassName_BusesMap.put(className, buses);
+ isNeedRecordTags = true;
}
- buses.add(bus);
+ if (buses.contains(bus)) {
+ Log.w(TAG, "The bus of <" + bus + "> already registered.");
+ return;
+ } else {
+ buses.add(bus);
+ }
+ }
+ if (isNeedRecordTags) {
+ recordTags(aClass, className);
}
+ consumeStickyIfExist(bus);
+ }
+
+ private void recordTags(Class> aClass, String className) {
List tags = mClassName_TagsMap.get(className);
if (tags == null) {
synchronized (mClassName_TagsMap) {
@@ -139,15 +153,38 @@ private void registerInner(final Object bus) {
}
}
}
- processSticky(bus);
}
- private void processSticky(final Object bus) {
+ private void consumeStickyIfExist(final Object bus) {
Map tagArgMap = mClassName_Tag_Arg4StickyMap.get(bus.getClass().getName());
if (tagArgMap == null) return;
synchronized (mClassName_Tag_Arg4StickyMap) {
for (Map.Entry tagArgEntry : tagArgMap.entrySet()) {
- postStickyInner(tagArgEntry.getKey(), tagArgEntry.getValue(), true);
+ consumeSticky(bus, tagArgEntry.getKey(), tagArgEntry.getValue());
+ }
+ }
+ }
+
+ private void consumeSticky(final Object bus, final String tag, final Object arg) {
+ List busInfoList = mTag_BusInfoListMap.get(tag);
+ if (busInfoList == null) {
+ Log.e(TAG, "The bus of tag <" + tag + "> is not exists.");
+ return;
+ }
+ for (BusInfo busInfo : busInfoList) {
+ if (!busInfo.subClassNames.contains(bus.getClass().getName())) {
+ continue;
+ }
+ if (!busInfo.sticky) {
+ continue;
+ }
+
+ synchronized (mClassName_Tag_Arg4StickyMap) {
+ Map tagArgMap = mClassName_Tag_Arg4StickyMap.get(busInfo.className);
+ if (tagArgMap == null || !tagArgMap.containsKey(tag)) {
+ continue;
+ }
+ invokeBus(bus, arg, busInfo, true);
}
}
}
@@ -173,14 +210,21 @@ private void postInner(final String tag, final Object arg, final boolean sticky)
List busInfoList = mTag_BusInfoListMap.get(tag);
if (busInfoList == null) {
Log.e(TAG, "The bus of tag <" + tag + "> is not exists.");
+ if (mTag_BusInfoListMap.isEmpty()) {
+ Log.e(TAG, "Please check whether the bus plugin is applied.");
+ }
return;
}
for (BusInfo busInfo : busInfoList) {
- invokeBus(tag, arg, busInfo, sticky);
+ invokeBus(arg, busInfo, sticky);
}
}
- private void invokeBus(String tag, Object arg, BusInfo busInfo, boolean sticky) {
+ private void invokeBus(Object arg, BusInfo busInfo, boolean sticky) {
+ invokeBus(null, arg, busInfo, sticky);
+ }
+
+ private void invokeBus(Object bus, Object arg, BusInfo busInfo, boolean sticky) {
if (busInfo.method == null) {
Method method = getMethodByBusInfo(busInfo);
if (method == null) {
@@ -188,7 +232,7 @@ private void invokeBus(String tag, Object arg, BusInfo busInfo, boolean sticky)
}
busInfo.method = method;
}
- invokeMethod(tag, arg, busInfo, sticky);
+ invokeMethod(bus, arg, busInfo, sticky);
}
private Method getMethodByBusInfo(BusInfo busInfo) {
@@ -229,11 +273,15 @@ private Class getClassName(String paramType) throws ClassNotFoundException {
}
}
- private void invokeMethod(final String tag, final Object arg, final BusInfo busInfo, final boolean sticky) {
+ private void invokeMethod(final Object arg, final BusInfo busInfo, final boolean sticky) {
+ invokeMethod(null, arg, busInfo, sticky);
+ }
+
+ private void invokeMethod(final Object bus, final Object arg, final BusInfo busInfo, final boolean sticky) {
Runnable runnable = new Runnable() {
@Override
public void run() {
- realInvokeMethod(tag, arg, busInfo, sticky);
+ realInvokeMethod(bus, arg, busInfo, sticky);
}
};
switch (busInfo.threadMode) {
@@ -257,22 +305,28 @@ public void run() {
}
}
- private void realInvokeMethod(final String tag, Object arg, BusInfo busInfo, boolean sticky) {
+ private void realInvokeMethod(Object bus, Object arg, BusInfo busInfo, boolean sticky) {
Set buses = new HashSet<>();
- for (String subClassName : busInfo.subClassNames) {
- Set subBuses = mClassName_BusesMap.get(subClassName);
- if (subBuses != null && !subBuses.isEmpty()) {
- buses.addAll(subBuses);
+ if (bus == null) {
+ for (String subClassName : busInfo.subClassNames) {
+ Set subBuses = mClassName_BusesMap.get(subClassName);
+ if (subBuses != null && !subBuses.isEmpty()) {
+ buses.addAll(subBuses);
+ }
}
- }
- if (buses.size() == 0) {
- if (!sticky) {
- Log.e(TAG, "The bus of tag <" + tag + "> was not registered before.");
- return;
- } else {
+ if (buses.size() == 0) {
+ if (!sticky) {
+ Log.e(TAG, "The " + busInfo + " was not registered before.");
+ }
return;
}
+ } else {
+ buses.add(bus);
}
+ invokeBuses(arg, busInfo, buses);
+ }
+
+ private void invokeBuses(Object arg, BusInfo busInfo, Set buses) {
try {
if (arg == NULL) {
for (Object bus : buses) {
@@ -291,20 +345,15 @@ private void realInvokeMethod(final String tag, Object arg, BusInfo busInfo, boo
}
private void postStickyInner(final String tag, final Object arg) {
- postStickyInner(tag, arg, false);
- }
-
- private void postStickyInner(final String tag, final Object arg, boolean isInvokeOnlySticky) {
List busInfoList = mTag_BusInfoListMap.get(tag);
if (busInfoList == null) {
Log.e(TAG, "The bus of tag <" + tag + "> is not exists.");
return;
}
+ // 获取多对象,然后消费各个 busInfoList
for (BusInfo busInfo : busInfoList) {
if (!busInfo.sticky) { // not sticky bus will post directly.
- if (!isInvokeOnlySticky) {
- invokeBus(tag, arg, busInfo, false);
- }
+ invokeBus(arg, busInfo, false);
continue;
}
synchronized (mClassName_Tag_Arg4StickyMap) {
@@ -315,7 +364,7 @@ private void postStickyInner(final String tag, final Object arg, boolean isInvok
}
tagArgMap.put(tag, arg);
}
- invokeBus(tag, arg, busInfo, true);
+ invokeBus(arg, busInfo, true);
}
}
@@ -327,13 +376,11 @@ private void removeStickyInner(final String tag) {
}
for (BusInfo busInfo : busInfoList) {
if (!busInfo.sticky) {
- Log.e(TAG, "The bus of tag <" + tag + "> is not sticky.");
- return;
+ continue;
}
synchronized (mClassName_Tag_Arg4StickyMap) {
Map tagArgMap = mClassName_Tag_Arg4StickyMap.get(busInfo.className);
if (tagArgMap == null || !tagArgMap.containsKey(tag)) {
- Log.e(TAG, "The sticky bus of tag <" + tag + "> didn't post.");
return;
}
tagArgMap.remove(tag);
@@ -349,6 +396,7 @@ static void registerBus4Test(String tag,
private static final class BusInfo {
+ String tag;
String className;
String funName;
String paramType;
@@ -359,8 +407,9 @@ private static final class BusInfo {
Method method;
List subClassNames;
- BusInfo(String className, String funName, String paramType, String paramName,
+ BusInfo(String tag, String className, String funName, String paramType, String paramName,
boolean sticky, String threadMode, int priority) {
+ this.tag = tag;
this.className = className;
this.funName = funName;
this.paramType = paramType;
@@ -373,14 +422,19 @@ private static final class BusInfo {
@Override
public String toString() {
- return "BusInfo { desc: " + className + "#" + funName +
- ("".equals(paramType) ? "()" : ("(" + paramType + " " + paramName + ")")) +
+ return "BusInfo { tag : " + tag +
+ ", desc: " + getDesc() +
", sticky: " + sticky +
", threadMode: " + threadMode +
", method: " + method +
", priority: " + priority +
" }";
}
+
+ private String getDesc() {
+ return className + "#" + funName +
+ ("".equals(paramType) ? "()" : ("(" + paramType + " " + paramName + ")"));
+ }
}
public enum ThreadMode {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java
index 6fd8f11963..f6b3b2206c 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java
@@ -13,6 +13,7 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Build;
+import android.os.SystemClock;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.v4.view.ViewCompat;
@@ -45,8 +46,7 @@ public class ClickUtils {
private static final int PRESSED_BG_DARK_STYLE = 5;
private static final float PRESSED_BG_DARK_DEFAULT_VALUE = 0.9f;
- private static final int DEBOUNCING_TAG = -7;
- private static final long DEBOUNCING_DEFAULT_VALUE = 200;
+ private static final long DEBOUNCING_DEFAULT_VALUE = 1000;
private ClickUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
@@ -213,23 +213,15 @@ private static Drawable createStyleDrawable(Drawable src, int style, float value
}
private static Drawable createAlphaDrawable(Drawable drawable, float alpha) {
-// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
- DrawableWrapperBefore21 drawableWrapper = new DrawableWrapperBefore21(drawable);
- drawableWrapper.setAlphaFix((int) (alpha * 255));
- return drawableWrapper;
-// }
-// drawable.setAlpha((int) (alpha * 255));
-// return drawable;
+ ClickDrawableWrapper drawableWrapper = new ClickDrawableWrapper(drawable);
+ drawableWrapper.setAlpha((int) (alpha * 255));
+ return drawableWrapper;
}
private static Drawable createDarkDrawable(Drawable drawable, float alpha) {
-// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
- DrawableWrapperBefore21 drawableWrapper = new DrawableWrapperBefore21(drawable);
- drawableWrapper.setColorFilterFix(getDarkColorFilter(alpha));
- return drawableWrapper;
-// }
-// drawable.setColorFilter(getDarkColorFilter(alpha));
-// return drawable;
+ ClickDrawableWrapper drawableWrapper = new ClickDrawableWrapper(drawable);
+ drawableWrapper.setColorFilter(getDarkColorFilter(alpha));
+ return drawableWrapper;
}
private static ColorMatrixColorFilter getDarkColorFilter(float darkAlpha) {
@@ -393,8 +385,8 @@ public static void back2HomeFriendly(final CharSequence tip) {
public static void back2HomeFriendly(@NonNull final CharSequence tip,
final long duration,
@NonNull Back2HomeFriendlyListener listener) {
- long nowMillis = System.currentTimeMillis();
- if (nowMillis - sLastClickMillis < duration) {
+ long nowMillis = SystemClock.elapsedRealtime();
+ if (Math.abs(nowMillis - sLastClickMillis) < duration) {
sClickCount++;
if (sClickCount == 2) {
UtilsBridge.startHomeActivity();
@@ -438,21 +430,7 @@ public void run() {
};
private static boolean isValid(@NonNull final View view, final long duration) {
- long curTime = System.currentTimeMillis();
- Object tag = view.getTag(DEBOUNCING_TAG);
- if (!(tag instanceof Long)) {
- view.setTag(DEBOUNCING_TAG, curTime);
- return true;
- }
- long preTime = (Long) tag;
- if (curTime - preTime < 0) {
- view.setTag(DEBOUNCING_TAG, curTime);
- return false;
- } else if (curTime - preTime <= duration) {
- return false;
- }
- view.setTag(DEBOUNCING_TAG, curTime);
- return true;
+ return UtilsBridge.isValid(view, duration);
}
private long mDuration;
@@ -586,14 +564,14 @@ private static class LazyHolder {
}
}
- static class DrawableWrapperBefore21 extends ShadowUtils.DrawableWrapper {
+ static class ClickDrawableWrapper extends ShadowUtils.DrawableWrapper {
private BitmapDrawable mBitmapDrawable = null;
- //低版本ColorDrawable.setColorFilter无效,这里直接用画笔画上
+ // 低版本ColorDrawable.setColorFilter无效,这里直接用画笔画上
private Paint mColorPaint = null;
- public DrawableWrapperBefore21(Drawable drawable) {
+ public ClickDrawableWrapper(Drawable drawable) {
super(drawable);
if (drawable instanceof ColorDrawable) {
mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
@@ -603,25 +581,23 @@ public DrawableWrapperBefore21(Drawable drawable) {
@Override
public void setColorFilter(ColorFilter cf) {
- //低版本StateListDrawable.selectDrawable会重置ColorFilter
- }
-
- public void setColorFilterFix(ColorFilter cf) {
super.setColorFilter(cf);
- if (mColorPaint != null) {
- mColorPaint.setColorFilter(cf);
+ // 低版本 StateListDrawable.selectDrawable 会重置 ColorFilter
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ if (mColorPaint != null) {
+ mColorPaint.setColorFilter(cf);
+ }
}
}
@Override
public void setAlpha(int alpha) {
- //低版本StateListDrawable.selectDrawable会重置Alpha
- }
-
- public void setAlphaFix(int alpha) {
super.setAlpha(alpha);
- if (mColorPaint != null) {
- mColorPaint.setColor(((ColorDrawable) getWrappedDrawable()).getColor());
+ // 低版本 StateListDrawable.selectDrawable 会重置 Alpha
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ if (mColorPaint != null) {
+ mColorPaint.setColor(((ColorDrawable) getWrappedDrawable()).getColor());
+ }
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/CollectionUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/CollectionUtils.java
index 31517d741d..2fcdbd18ed 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/CollectionUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/CollectionUtils.java
@@ -79,7 +79,7 @@ public static ArrayList newArrayListNotNull(E... array) {
}
@SafeVarargs
- public static List newLinkedList(E... array) {
+ public static LinkedList newLinkedList(E... array) {
LinkedList list = new LinkedList<>();
if (array == null || array.length == 0) return list;
for (E e : array) {
@@ -89,7 +89,7 @@ public static List newLinkedList(E... array) {
}
@SafeVarargs
- public static List newLinkedListNotNull(E... array) {
+ public static LinkedList newLinkedListNotNull(E... array) {
LinkedList list = new LinkedList<>();
if (array == null || array.length == 0) return list;
for (E e : array) {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 93763b470b..d894de475b 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -204,4 +204,14 @@ public static int getRandomColor(final boolean supportAlpha) {
int high = supportAlpha ? (int) (Math.random() * 0x100) << 24 : 0xFF000000;
return high | (int) (Math.random() * 0x1000000);
}
+
+ /**
+ * Return whether the color is light.
+ *
+ * @param color The color.
+ * @return {@code true}: yes {@code false}: no
+ */
+ public boolean isLightColor(@ColorInt int color) {
+ return 0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color) >= 127.5;
+ }
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
index 26e59fd330..d6f9eaafaf 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
@@ -566,7 +566,7 @@ public static ByteArrayOutputStream input2OutputStream(final InputStream is) {
/**
* Output stream to input stream.
*/
- public ByteArrayInputStream output2InputStream(final OutputStream out) {
+ public static ByteArrayInputStream output2InputStream(final OutputStream out) {
if (out == null) return null;
return new ByteArrayInputStream(((ByteArrayOutputStream) out).toByteArray());
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
new file mode 100644
index 0000000000..faac477b22
--- /dev/null
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
@@ -0,0 +1,88 @@
+package com.blankj.utilcode.util;
+
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+import android.view.View;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2020/09/01
+ * desc : utils about debouncing
+ *
+ */
+class DebouncingUtils {
+
+ private static final int CACHE_SIZE = 64;
+ private static final Map KEY_MILLIS_MAP = new ConcurrentHashMap<>(CACHE_SIZE);
+ private static final long DEBOUNCING_DEFAULT_VALUE = 1000;
+
+ private DebouncingUtils() {
+ throw new UnsupportedOperationException("u can't instantiate me...");
+ }
+
+ /**
+ * Return whether the view is not in a jitter state.
+ *
+ * @param view The view.
+ * @return {@code true}: yes {@code false}: no
+ */
+ public static boolean isValid(@NonNull final View view) {
+ return isValid(view, DEBOUNCING_DEFAULT_VALUE);
+ }
+
+ /**
+ * Return whether the view is not in a jitter state.
+ *
+ * @param view The view.
+ * @param duration The duration.
+ * @return {@code true}: yes {@code false}: no
+ */
+ public static boolean isValid(@NonNull final View view, final long duration) {
+ if (view == null) {
+ throw new IllegalArgumentException("The view is null.");
+ }
+ return isValid(String.valueOf(view.hashCode()), duration);
+ }
+
+ /**
+ * Return whether the key is not in a jitter state.
+ *
+ * @param key The key.
+ * @param duration The duration.
+ * @return {@code true}: yes {@code false}: no
+ */
+ public static boolean isValid(@NonNull String key, final long duration) {
+ if (TextUtils.isEmpty(key)) {
+ throw new IllegalArgumentException("The key is null.");
+ }
+ if (duration < 0) {
+ throw new IllegalArgumentException("The duration is less than 0.");
+ }
+ long curTime = SystemClock.elapsedRealtime();
+ clearIfNecessary(curTime);
+ Long validTime = KEY_MILLIS_MAP.get(key);
+ if (validTime == null || curTime >= validTime) {
+ KEY_MILLIS_MAP.put(key, curTime + duration);
+ return true;
+ }
+ return false;
+ }
+
+ private static void clearIfNecessary(long curTime) {
+ if (KEY_MILLIS_MAP.size() < CACHE_SIZE) return;
+ for (Iterator> it = KEY_MILLIS_MAP.entrySet().iterator(); it.hasNext(); ) {
+ Map.Entry entry = it.next();
+ Long validTime = entry.getValue();
+ if (curTime >= validTime) {
+ it.remove();
+ }
+ }
+ }
+}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index 266734aa03..3fe852bf70 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -116,7 +116,7 @@ public static String getAndroidID() {
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET, CHANGE_WIFI_STATE})
public static String getMacAddress() {
String macAddress = getMacAddress((String[]) null);
- if (!macAddress.equals("") || getWifiEnabled()) return macAddress;
+ if (!TextUtils.isEmpty(macAddress) || getWifiEnabled()) return macAddress;
setWifiEnabled(true);
setWifiEnabled(false);
return getMacAddress((String[]) null);
@@ -173,11 +173,17 @@ public static String getMacAddress(final String... excepts) {
}
private static boolean isAddressNotInExcepts(final String address, final String... excepts) {
+ if (TextUtils.isEmpty(address)) {
+ return false;
+ }
+ if ("02:00:00:00:00:00".equals(address)) {
+ return false;
+ }
if (excepts == null || excepts.length == 0) {
- return !"02:00:00:00:00:00".equals(address);
+ return true;
}
for (String filter : excepts) {
- if (address.equals(filter)) {
+ if (filter != null && filter.equals(address)) {
return false;
}
}
@@ -191,7 +197,12 @@ private static String getMacAddressByWifiInfo() {
.getApplicationContext().getSystemService(WIFI_SERVICE);
if (wifi != null) {
final WifiInfo info = wifi.getConnectionInfo();
- if (info != null) return info.getMacAddress();
+ if (info != null) {
+ String macAddress = info.getMacAddress();
+ if (!TextUtils.isEmpty(macAddress)) {
+ return macAddress;
+ }
+ }
}
} catch (Exception e) {
e.printStackTrace();
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
index 14d8d0f377..40de5ef5bb 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
@@ -1,5 +1,7 @@
package com.blankj.utilcode.util;
+import android.os.Build;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -9,6 +11,7 @@
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
@@ -1085,12 +1088,18 @@ private static byte[] rsaTemplate(final byte[] data,
}
try {
Key rsaKey;
+ KeyFactory keyFactory;
+ if (Build.VERSION.SDK_INT < 28) {
+ keyFactory = KeyFactory.getInstance("RSA", "BC");
+ } else {
+ keyFactory = KeyFactory.getInstance("RSA");
+ }
if (isEncrypt) {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key);
- rsaKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);
+ rsaKey = keyFactory.generatePublic(keySpec);
} else {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key);
- rsaKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
+ rsaKey = keyFactory.generatePrivate(keySpec);
}
if (rsaKey == null) return null;
Cipher cipher = Cipher.getInstance(transformation);
@@ -1135,6 +1144,8 @@ private static byte[] rsaTemplate(final byte[] data,
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
+ } catch (NoSuchProviderException e) {
+ e.printStackTrace();
}
return null;
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
index 90b0ef6d74..1acca1e050 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
@@ -1168,7 +1168,7 @@ public static long getLength(final File file) {
* @return the length of directory
*/
private static long getDirLength(final File dir) {
- if (!isDir(dir)) return -1;
+ if (!isDir(dir)) return 0;
long len = 0;
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 08807c350d..2364db719c 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,6 +8,7 @@
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
+import android.support.annotation.Nullable;
import android.support.annotation.RequiresPermission;
import android.support.v4.content.FileProvider;
@@ -153,14 +154,44 @@ public static Intent getLaunchAppDetailsSettingsIntent(final String pkgName, fin
* @param content The content.
* @return the intent of share text
*/
-
public static Intent getShareTextIntent(final String content) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, content);
+ intent = Intent.createChooser(intent, "");
return getIntent(intent, true);
}
+ /**
+ * Return the intent of share image.
+ *
+ * @param imagePath The path of image.
+ * @return the intent of share image
+ */
+ public static Intent getShareImageIntent(final String imagePath) {
+ return getShareTextImageIntent("", imagePath);
+ }
+
+ /**
+ * Return the intent of share image.
+ *
+ * @param imageFile The file of image.
+ * @return the intent of share image
+ */
+ public static Intent getShareImageIntent(final File imageFile) {
+ return getShareTextImageIntent("", imageFile);
+ }
+
+ /**
+ * Return the intent of share image.
+ *
+ * @param imageUri The uri of image.
+ * @return the intent of share image
+ */
+ public static Intent getShareImageIntent(final Uri imageUri) {
+ return getShareTextImageIntent("", imageUri);
+ }
+
/**
* Return the intent of share image.
*
@@ -168,38 +199,67 @@ public static Intent getShareTextIntent(final String content) {
* @param imagePath The path of image.
* @return the intent of share image
*/
- public static Intent getShareImageIntent(final String content, final String imagePath) {
- if (UtilsBridge.isSpace(imagePath)) return null;
- return getShareImageIntent(content, new File(imagePath));
+ public static Intent getShareTextImageIntent(@Nullable final String content, final String imagePath) {
+ return getShareTextImageIntent(content, UtilsBridge.getFileByPath(imagePath));
}
/**
* Return the intent of share image.
*
- * @param content The content.
- * @param image The file of image.
+ * @param content The content.
+ * @param imageFile The file of image.
* @return the intent of share image
*/
- public static Intent getShareImageIntent(final String content, final File image) {
- if (image == null || !image.isFile()) return null;
- return getShareImageIntent(content, UtilsBridge.file2Uri(image));
+ public static Intent getShareTextImageIntent(@Nullable final String content, final File imageFile) {
+ return getShareTextImageIntent(content, UtilsBridge.file2Uri(imageFile));
}
/**
* Return the intent of share image.
*
- * @param content The content.
- * @param uri The uri of image.
+ * @param content The content.
+ * @param imageUri The uri of image.
* @return the intent of share image
*/
- public static Intent getShareImageIntent(final String content, final Uri uri) {
+ public static Intent getShareTextImageIntent(@Nullable final String content, final Uri imageUri) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, content);
- intent.putExtra(Intent.EXTRA_STREAM, uri);
+ intent.putExtra(Intent.EXTRA_STREAM, imageUri);
intent.setType("image/*");
+ intent = Intent.createChooser(intent, "");
return getIntent(intent, true);
}
+ /**
+ * Return the intent of share images.
+ *
+ * @param imagePaths The paths of images.
+ * @return the intent of share images
+ */
+ public static Intent getShareImageIntent(final LinkedList imagePaths) {
+ return getShareTextImageIntent("", imagePaths);
+ }
+
+ /**
+ * Return the intent of share images.
+ *
+ * @param images The files of images.
+ * @return the intent of share images
+ */
+ public static Intent getShareImageIntent(final List images) {
+ return getShareTextImageIntent("", images);
+ }
+
+ /**
+ * Return the intent of share images.
+ *
+ * @param uris The uris of image.
+ * @return the intent of share image
+ */
+ public static Intent getShareImageIntent(final ArrayList uris) {
+ return getShareTextImageIntent("", uris);
+ }
+
/**
* Return the intent of share images.
*
@@ -207,14 +267,18 @@ public static Intent getShareImageIntent(final String content, final Uri uri) {
* @param imagePaths The paths of images.
* @return the intent of share images
*/
- public static Intent getShareImageIntent(final String content,
- final LinkedList imagePaths) {
- if (imagePaths == null || imagePaths.isEmpty()) return null;
+ public static Intent getShareTextImageIntent(@Nullable final String content,
+ final LinkedList imagePaths) {
List files = new ArrayList<>();
- for (String imagePath : imagePaths) {
- files.add(new File(imagePath));
+ if (imagePaths != null) {
+ for (String imagePath : imagePaths) {
+ File file = UtilsBridge.getFileByPath(imagePath);
+ if (file != null) {
+ files.add(file);
+ }
+ }
}
- return getShareImageIntent(content, files);
+ return getShareTextImageIntent(content, files);
}
/**
@@ -224,14 +288,17 @@ public static Intent getShareImageIntent(final String content,
* @param images The files of images.
* @return the intent of share images
*/
- public static Intent getShareImageIntent(final String content, final List images) {
- if (images == null || images.isEmpty()) return null;
+ public static Intent getShareTextImageIntent(@Nullable final String content, final List images) {
ArrayList uris = new ArrayList<>();
- for (File image : images) {
- if (!image.isFile()) continue;
- uris.add(UtilsBridge.file2Uri(image));
+ if (images != null) {
+ for (File image : images) {
+ Uri uri = UtilsBridge.file2Uri(image);
+ if (uri != null) {
+ uris.add(uri);
+ }
+ }
}
- return getShareImageIntent(content, uris);
+ return getShareTextImageIntent(content, uris);
}
/**
@@ -241,11 +308,12 @@ public static Intent getShareImageIntent(final String content, final List
* @param uris The uris of image.
* @return the intent of share image
*/
- public static Intent getShareImageIntent(final String content, final ArrayList uris) {
+ public static Intent getShareTextImageIntent(@Nullable final String content, final ArrayList uris) {
Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.putExtra(Intent.EXTRA_TEXT, content);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
intent.setType("image/*");
+ intent = Intent.createChooser(intent, "");
return getIntent(intent, true);
}
@@ -373,10 +441,21 @@ public static Intent getSendSmsIntent(final String phoneNumber, final String con
* @return the intent of capture
*/
public static Intent getCaptureIntent(final Uri outUri) {
+ return getCaptureIntent(outUri, false);
+ }
+
+ /**
+ * Return the intent of capture.
+ *
+ * @param outUri The uri of output.
+ * @param isNewTask True to add flag of new task, false otherwise.
+ * @return the intent of capture
+ */
+ public static Intent getCaptureIntent(final Uri outUri, final boolean isNewTask) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- return getIntent(intent, true);
+ return getIntent(intent, isNewTask);
}
private static Intent getIntent(final Intent intent, final boolean isNewTask) {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
index 9f7791923d..38d08eff2d 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
@@ -7,6 +7,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
+import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.View;
@@ -142,7 +143,7 @@ public static void hideSoftInput(@NonNull final View view) {
* @param activity The activity.
*/
public static void hideSoftInputByToggle(final Activity activity) {
- long nowMillis = System.currentTimeMillis();
+ long nowMillis = SystemClock.uptimeMillis();
long delta = nowMillis - millis;
if (Math.abs(delta) > 500 && KeyboardUtils.isSoftInputVisible(activity)) {
KeyboardUtils.toggleSoftInput();
@@ -231,7 +232,8 @@ public void onGlobalLayout() {
* @param window The window.
*/
public static void unregisterSoftInputChangedListener(@NonNull final Window window) {
- final FrameLayout contentView = window.findViewById(android.R.id.content);
+ final View contentView = window.findViewById(android.R.id.content);
+ if (contentView == null) return;
Object tag = contentView.getTag(TAG_ON_GLOBAL_LAYOUT_LISTENER);
if (tag instanceof OnGlobalLayoutListener) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
index d172079785..2ea696a6a3 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
@@ -92,12 +92,14 @@ public static void register(final String pkgName) {
}
public static void unregister(final String pkgName) {
- if (sClientMap.containsKey(pkgName)) {
- Client client = sClientMap.get(pkgName);
- sClientMap.remove(pkgName);
- client.unbind();
- } else {
+ if (!sClientMap.containsKey(pkgName)) {
Log.i("MessengerUtils", "unregister: client didn't register: " + pkgName);
+ return;
+ }
+ Client client = sClientMap.get(pkgName);
+ sClientMap.remove(pkgName);
+ if (client != null) {
+ client.unbind();
}
}
@@ -133,13 +135,12 @@ static class Client {
@Override
public void handleMessage(Message msg) {
Bundle data = msg.getData();
- if (data != null) {
- String key = data.getString(KEY_STRING);
- if (key != null) {
- MessageCallback callback = subscribers.get(key);
- if (callback != null) {
- callback.messageCall(data);
- }
+ data.setClassLoader(MessengerUtils.class.getClassLoader());
+ String key = data.getString(KEY_STRING);
+ if (key != null) {
+ MessageCallback callback = subscribers.get(key);
+ if (callback != null) {
+ callback.messageCall(data);
}
}
}
@@ -153,6 +154,7 @@ public void onServiceConnected(ComponentName name, IBinder service) {
mServer = new Messenger(service);
int key = UtilsBridge.getCurrentProcessName().hashCode();
Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_SUBSCRIBE, key, 0);
+ msg.getData().setClassLoader(MessengerUtils.class.getClassLoader());
msg.replyTo = mClient;
try {
mServer.send(msg);
@@ -233,6 +235,7 @@ private void sendCachedMsg2Server() {
private boolean send2Server(Bundle bundle) {
Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_SEND);
+ bundle.setClassLoader(MessengerUtils.class.getClassLoader());
msg.setData(bundle);
msg.replyTo = mClient;
try {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index 73a7e2347f..a550bf2820 100755
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -13,6 +13,7 @@
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import android.util.Log;
+import android.util.Pair;
import android.view.MotionEvent;
import android.view.WindowManager;
@@ -88,8 +89,14 @@ public static List getPermissions(final String packageName) {
* @param permissions The permissions.
* @return {@code true}: yes {@code false}: no
*/
- public static boolean isGranted(final String... permissions) {
- for (String permission : permissions) {
+ public static boolean isGranted(@Permission final String... permissions) {
+ Pair, List> requestAndDeniedPermissions = getRequestAndDeniedPermissions(permissions);
+ List deniedPermissions = requestAndDeniedPermissions.second;
+ if (!deniedPermissions.isEmpty()) {
+ return false;
+ }
+ List requestPermissions = requestAndDeniedPermissions.first;
+ for (String permission : requestPermissions) {
if (!isGranted(permission)) {
return false;
}
@@ -97,6 +104,27 @@ public static boolean isGranted(final String... permissions) {
return true;
}
+ private static Pair, List> getRequestAndDeniedPermissions(final String... permissionsParam) {
+ List requestPermissions = new ArrayList<>();
+ List deniedPermissions = new ArrayList<>();
+ List appPermissions = getPermissions();
+ for (String param : permissionsParam) {
+ boolean isIncludeInManifest = false;
+ String[] permissions = PermissionConstants.getPermissions(param);
+ for (String permission : permissions) {
+ if (appPermissions.contains(permission)) {
+ requestPermissions.add(permission);
+ isIncludeInManifest = true;
+ }
+ }
+ if (!isIncludeInManifest) {
+ deniedPermissions.add(param);
+ Log.e("PermissionUtils", "U should add the permission of " + param + " in manifest.");
+ }
+ }
+ return Pair.create(requestPermissions, deniedPermissions);
+ }
+
private static boolean isGranted(final String permission) {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M
|| PackageManager.PERMISSION_GRANTED
@@ -259,21 +287,10 @@ public void request() {
mPermissionsDenied = new ArrayList<>();
mPermissionsDeniedForever = new ArrayList<>();
- List appPermissions = getPermissions();
- for (String param : mPermissionsParam) {
- boolean isIncludeInManifest = false;
- String[] permissions = PermissionConstants.getPermissions(param);
- for (String permission : permissions) {
- if (appPermissions.contains(permission)) {
- mPermissions.add(permission);
- isIncludeInManifest = true;
- }
- }
- if (!isIncludeInManifest) {
- mPermissionsDenied.add(param);
- Log.e("PermissionUtils", "U should add the permission of " + param + " in manifest.");
- }
- }
+ Pair, List> requestAndDeniedPermissions = getRequestAndDeniedPermissions(mPermissionsParam);
+ mPermissions.addAll(requestAndDeniedPermissions.first);
+ mPermissionsDenied.addAll(requestAndDeniedPermissions.second);
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
mPermissionsGranted.addAll(mPermissions);
requestCallback();
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index 40334ff414..ae90e4ea5e 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -154,9 +154,10 @@ public static boolean isIDCard18Exact(final CharSequence input) {
CITY_MAP.put("64", "宁夏");
CITY_MAP.put("65", "新疆");
- CITY_MAP.put("71", "台湾");
+ CITY_MAP.put("71", "台湾老");
CITY_MAP.put("81", "香港");
CITY_MAP.put("82", "澳门");
+ CITY_MAP.put("83", "台湾新");
CITY_MAP.put("91", "国外");
}
if (CITY_MAP.get(input.subSequence(0, 2).toString()) != null) {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index b01e18658a..079d138eea 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -242,14 +242,14 @@ public static Bitmap screenShot(@NonNull final Activity activity, boolean isDele
decorView.setDrawingCacheEnabled(true);
decorView.setWillNotCacheDrawing(false);
Bitmap bmp = decorView.getDrawingCache();
- if (bmp == null) {
+ if (bmp == null || bmp.isRecycled()) {
decorView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
decorView.layout(0, 0, decorView.getMeasuredWidth(), decorView.getMeasuredHeight());
decorView.buildDrawingCache();
bmp = Bitmap.createBitmap(decorView.getDrawingCache());
}
- if (bmp == null) return null;
+ if (bmp == null || bmp.isRecycled()) return null;
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
Bitmap ret;
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
index 2cd6890242..6a1087f8ff 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
@@ -5,6 +5,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.os.Build;
import android.support.annotation.NonNull;
import java.util.HashSet;
@@ -60,8 +61,17 @@ public static void startService(@NonNull final String className) {
* @param cls The service class.
*/
public static void startService(@NonNull final Class> cls) {
- Intent intent = new Intent(Utils.getApp(), cls);
- Utils.getApp().startService(intent);
+ try {
+ Intent intent = new Intent(Utils.getApp(), cls);
+ intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ Utils.getApp().startForegroundService(intent);
+ } else {
+ Utils.getApp().startService(intent);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
/**
@@ -165,12 +175,16 @@ public static boolean isServiceRunning(@NonNull final Class> cls) {
* @return {@code true}: yes {@code false}: no
*/
public static boolean isServiceRunning(@NonNull final String className) {
- ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
- List info = am.getRunningServices(0x7FFFFFFF);
- if (info == null || info.size() == 0) return false;
- for (RunningServiceInfo aInfo : info) {
- if (className.equals(aInfo.service.getClassName())) return true;
+ try {
+ ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
+ List info = am.getRunningServices(0x7FFFFFFF);
+ if (info == null || info.size() == 0) return false;
+ for (RunningServiceInfo aInfo : info) {
+ if (className.equals(aInfo.service.getClassName())) return true;
+ }
+ return false;
+ } catch (Exception ignore) {
+ return false;
}
- return false;
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index 82c4a37e30..3abb3b35ab 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -1,21 +1,21 @@
package com.blankj.utilcode.util;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
+import android.support.annotation.CallSuper;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.NotificationManagerCompat;
import android.util.Log;
@@ -26,6 +26,8 @@
import android.widget.TextView;
import android.widget.Toast;
+import com.blankj.utilcode.R;
+
import java.lang.reflect.Field;
/**
@@ -255,88 +257,43 @@ private static void show(final String format, final int duration, final Object..
}
private static void show(final CharSequence text, final int duration) {
- UtilsBridge.runOnUiThread(new Runnable() {
- @SuppressLint("ShowToast")
- @Override
- public void run() {
- cancel();
- iToast = ToastFactory.makeToast(Utils.getApp(), text, duration);
- final View toastView = iToast.getView();
- if (toastView == null) return;
- final TextView tvMessage = toastView.findViewById(android.R.id.message);
- if (sMsgColor != COLOR_DEFAULT) {
- tvMessage.setTextColor(sMsgColor);
- }
- if (sMsgTextSize != -1) {
- tvMessage.setTextSize(sMsgTextSize);
- }
- if (sGravity != -1 || sXOffset != -1 || sYOffset != -1) {
- iToast.setGravity(sGravity, sXOffset, sYOffset);
- }
- setBg(tvMessage);
- iToast.show();
- }
- });
+ show(null, text, duration);
}
private static void show(final View view, final int duration) {
+ show(view, null, duration);
+ }
+
+ private static void show(@Nullable final View view, final CharSequence text, final int duration) {
UtilsBridge.runOnUiThread(new Runnable() {
@Override
public void run() {
cancel();
- iToast = ToastFactory.newToast(Utils.getApp());
- iToast.setView(view);
+ iToast = newToast();
+ if (view != null) {
+ iToast.setView(view);
+ } else {
+ iToast.setMsgView(text);
+ }
iToast.setDuration(duration);
if (sGravity != -1 || sXOffset != -1 || sYOffset != -1) {
iToast.setGravity(sGravity, sXOffset, sYOffset);
}
- setBg();
iToast.show();
}
});
}
- private static void setBg() {
- if (sBgResource != -1) {
- final View toastView = iToast.getView();
- toastView.setBackgroundResource(sBgResource);
- } else if (sBgColor != COLOR_DEFAULT) {
- final View toastView = iToast.getView();
- Drawable background = toastView.getBackground();
- if (background != null) {
- background.setColorFilter(
- new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN)
- );
- } else {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- toastView.setBackground(new ColorDrawable(sBgColor));
- } else {
- toastView.setBackgroundDrawable(new ColorDrawable(sBgColor));
- }
- }
- }
- }
- private static void setBg(final TextView tvMsg) {
- if (sBgResource != -1) {
- final View toastView = iToast.getView();
- toastView.setBackgroundResource(sBgResource);
- tvMsg.setBackgroundColor(Color.TRANSPARENT);
- } else if (sBgColor != COLOR_DEFAULT) {
- final View toastView = iToast.getView();
- Drawable tvBg = toastView.getBackground();
- Drawable msgBg = tvMsg.getBackground();
- if (tvBg != null && msgBg != null) {
- tvBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
- tvMsg.setBackgroundColor(Color.TRANSPARENT);
- } else if (tvBg != null) {
- tvBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
- } else if (msgBg != null) {
- msgBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
- } else {
- toastView.setBackgroundColor(sBgColor);
+ private static IToast newToast() {
+ if (NotificationManagerCompat.from(Utils.getApp()).areNotificationsEnabled()) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if (!UtilsBridge.isGrantedDrawOverlays()) {
+ return new SystemToast(new Toast(Utils.getApp()));
+ }
}
}
+ return new ToastWithoutNotification(new Toast(Utils.getApp()));
}
private static View getView(@LayoutRes final int layoutId) {
@@ -345,38 +302,6 @@ private static View getView(@LayoutRes final int layoutId) {
return inflate.inflate(layoutId, null);
}
- static class ToastFactory {
-
- static IToast makeToast(Context context, CharSequence text, int duration) {
- if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- if (!UtilsBridge.isGrantedDrawOverlays()) {
- return new SystemToast(makeNormalToast(context, text, duration));
- }
- }
- }
- return new ToastWithoutNotification(makeNormalToast(context, text, duration));
- }
-
- static IToast newToast(Context context) {
- if (NotificationManagerCompat.from(context).areNotificationsEnabled()) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- if (!UtilsBridge.isGrantedDrawOverlays()) {
- return new SystemToast(new Toast(context));
- }
- }
- }
- return new ToastWithoutNotification(new Toast(context));
- }
-
- private static Toast makeNormalToast(Context context, CharSequence text, int duration) {
- @SuppressLint("ShowToast")
- Toast toast = Toast.makeText(context, "", duration);
- toast.setText(text);
- return toast;
- }
- }
-
static class SystemToast extends AbsToast {
SystemToast(Toast toast) {
@@ -403,6 +328,7 @@ public void show() {
@Override
public void cancel() {
mToast.cancel();
+ super.cancel();
}
static class SafeHandler extends Handler {
@@ -430,7 +356,6 @@ public void dispatchMessage(Message msg) {
static class ToastWithoutNotification extends AbsToast {
- private View mView;
private WindowManager mWM;
private WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
@@ -441,24 +366,13 @@ static class ToastWithoutNotification extends AbsToast {
@Override
public void show() {
- UtilsBridge.runOnUiThreadDelayed(new Runnable() {
- @Override
- public void run() {
- realShow();
- }
- }, 300);
- }
-
- private void realShow() {
if (mToast == null) return;
- mView = mToast.getView();
- if (mView == null) return;
- final Context context = mToast.getView().getContext();
+ boolean isActivityContext = false;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
- mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ mWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
} else if (UtilsBridge.isGrantedDrawOverlays()) {
- mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ mWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
@@ -479,6 +393,7 @@ private void realShow() {
new SystemToast(mToast).show();
return;
}
+ isActivityContext = true;
mWM = topActivity.getWindowManager();
mParams.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
UtilsBridge.addActivityLifecycleCallbacks(topActivity, getActivityLifecycleCallbacks());
@@ -486,18 +401,17 @@ private void realShow() {
setToastParams();
- try {
- if (mWM != null) {
- mWM.addView(mView, mParams);
- }
- } catch (Exception ignored) {/**/}
-
- UtilsBridge.runOnUiThreadDelayed(new Runnable() {
- @Override
- public void run() {
- cancel();
- }
- }, mToast.getDuration() == Toast.LENGTH_SHORT ? 2000 : 3500);
+ final long duration = mToast.getDuration() == Toast.LENGTH_SHORT ? 2000 : 3500;
+ if (isActivityContext) {
+ UtilsBridge.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ setToast(duration);
+ }
+ }, 300);
+ } else {
+ setToast(duration);
+ }
}
private void setToastParams() {
@@ -525,6 +439,21 @@ private void setToastParams() {
mParams.verticalMargin = mToast.getVerticalMargin();
}
+ private void setToast(long duration) {
+ try {
+ if (mWM != null) {
+ mWM.addView(mToastView, mParams);
+ }
+ } catch (Exception ignored) {/**/}
+
+ UtilsBridge.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ cancel();
+ }
+ }, duration);
+ }
+
private Utils.ActivityLifecycleCallbacks getActivityLifecycleCallbacks() {
return new Utils.ActivityLifecycleCallbacks() {
@Override
@@ -540,18 +469,18 @@ public void onActivityDestroyed(@NonNull Activity activity) {
public void cancel() {
try {
if (mWM != null) {
- mWM.removeViewImmediate(mView);
+ mWM.removeViewImmediate(mToastView);
}
} catch (Exception ignored) {/**/}
- mView = null;
mWM = null;
- mToast = null;
+ super.cancel();
}
}
static abstract class AbsToast implements IToast {
- Toast mToast;
+ protected Toast mToast;
+ protected View mToastView;
AbsToast(Toast toast) {
mToast = toast;
@@ -559,12 +488,52 @@ static abstract class AbsToast implements IToast {
@Override
public void setView(View view) {
- mToast.setView(view);
+ mToastView = view;
+ mToast.setView(mToastView);
+ }
+
+ @Override
+ public void setMsgView(CharSequence text) {
+ mToastView = mToast.getView();
+ if (mToastView == null || mToastView.findViewById(android.R.id.message) == null) {
+ mToastView = ToastUtils.getView(R.layout.toast_layout);
+ mToast.setView(mToastView);
+ }
+
+ TextView tvMessage = mToastView.findViewById(android.R.id.message);
+ tvMessage.setText(text);
+ if (sMsgColor != COLOR_DEFAULT) {
+ tvMessage.setTextColor(sMsgColor);
+ }
+ if (sMsgTextSize != -1) {
+ tvMessage.setTextSize(sMsgTextSize);
+ }
+ setBg(tvMessage);
+ }
+
+ private void setBg(final TextView tvMsg) {
+ if (sBgResource != -1) {
+ mToastView.setBackgroundResource(sBgResource);
+ tvMsg.setBackgroundColor(Color.TRANSPARENT);
+ } else if (sBgColor != COLOR_DEFAULT) {
+ Drawable tvBg = mToastView.getBackground();
+ Drawable msgBg = tvMsg.getBackground();
+ if (tvBg != null && msgBg != null) {
+ tvBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
+ tvMsg.setBackgroundColor(Color.TRANSPARENT);
+ } else if (tvBg != null) {
+ tvBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
+ } else if (msgBg != null) {
+ msgBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
+ } else {
+ mToastView.setBackgroundColor(sBgColor);
+ }
+ }
}
@Override
public View getView() {
- return mToast.getView();
+ return mToastView;
}
@Override
@@ -586,6 +555,13 @@ public void setText(int resId) {
public void setText(CharSequence s) {
mToast.setText(s);
}
+
+ @Override
+ @CallSuper
+ public void cancel() {
+ mToast = null;
+ mToastView = null;
+ }
}
interface IToast {
@@ -596,6 +572,8 @@ interface IToast {
void setView(View view);
+ void setMsgView(CharSequence text);
+
View getView();
void setDuration(int duration);
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
index f589c42a09..ec67e45088 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -10,7 +10,6 @@
import android.os.storage.StorageManager;
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;
@@ -54,7 +53,8 @@ public static Uri res2Uri(String resPath) {
* @param file The file.
* @return uri
*/
- public static Uri file2Uri(@NonNull final File file) {
+ public static Uri file2Uri(final File file) {
+ if (!UtilsBridge.isFileExists(file)) return null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
String authority = Utils.getApp().getPackageName() + ".utilcode.provider";
return FileProvider.getUriForFile(Utils.getApp(), authority, file);
@@ -69,7 +69,8 @@ public static Uri file2Uri(@NonNull final File file) {
* @param uri The uri.
* @return file
*/
- public static File uri2File(@NonNull final Uri uri) {
+ public static File uri2File(final Uri uri) {
+ if (uri == null) return null;
File file = uri2FileReal(uri);
if (file != null) return file;
return copyUri2Cache(uri);
@@ -81,7 +82,7 @@ public static File uri2File(@NonNull final Uri uri) {
* @param uri The uri.
* @return file
*/
- private static File uri2FileReal(@NonNull final Uri uri) {
+ private static File uri2FileReal(final Uri uri) {
Log.d("UriUtils", uri.toString());
String authority = uri.getAuthority();
String scheme = uri.getScheme();
@@ -188,6 +189,13 @@ else if ("com.android.providers.downloads.documents".equals(authority)) {
id = id.split(":")[1];
}
+ long availableId = 0;
+ try {
+ availableId = Long.parseLong(id);
+ } catch (Exception e) {
+ return null;
+ }
+
String[] contentUriPrefixesToTry = new String[]{
"content://downloads/public_downloads",
"content://downloads/all_downloads",
@@ -195,7 +203,7 @@ else if ("com.android.providers.downloads.documents".equals(authority)) {
};
for (String contentUriPrefix : contentUriPrefixesToTry) {
- Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
+ Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), availableId);
try {
File file = getFileFromUri(contentUri, "1_1");
if (file != null) {
@@ -325,6 +333,7 @@ private static File copyUri2Cache(Uri uri) {
* @return the input stream
*/
public static byte[] uri2Bytes(Uri uri) {
+ if (uri == null) return null;
InputStream is = null;
try {
is = Utils.getApp().getContentResolver().openInputStream(uri);
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java
index eed6d88747..0123ab96c1 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java
@@ -335,9 +335,7 @@ private List getActivitiesByReflect() {
private Object getActivityThread() {
Object activityThread = getActivityThreadInActivityThreadStaticField();
if (activityThread != null) return activityThread;
- activityThread = getActivityThreadInActivityThreadStaticMethod();
- if (activityThread != null) return activityThread;
- return getActivityThreadInLoadedApkField();
+ return getActivityThreadInActivityThreadStaticMethod();
}
private Object getActivityThreadInActivityThreadStaticField() {
@@ -362,20 +360,6 @@ private Object getActivityThreadInActivityThreadStaticMethod() {
}
}
- private Object getActivityThreadInLoadedApkField() {
- try {
- Field mLoadedApkField = Application.class.getDeclaredField("mLoadedApk");
- mLoadedApkField.setAccessible(true);
- Object mLoadedApk = mLoadedApkField.get(Utils.getApp());
- Field mActivityThreadField = mLoadedApk.getClass().getDeclaredField("mActivityThread");
- mActivityThreadField.setAccessible(true);
- return mActivityThreadField.get(mLoadedApk);
- } catch (Exception e) {
- Log.e("UtilsActivityLifecycle", "getActivityThreadInLoadedApkField: " + e.getMessage());
- return null;
- }
- }
-
/**
* Set animators enabled.
*/
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java
index 88335a7a26..97ec53579d 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java
@@ -225,6 +225,13 @@ static List inputStream2Lines(final InputStream is, final String charset
return ConvertUtils.inputStream2Lines(is, charsetName);
}
+ ///////////////////////////////////////////////////////////////////////////
+ // DebouncingUtils
+ ///////////////////////////////////////////////////////////////////////////
+ static boolean isValid(@NonNull final View view, final long duration) {
+ return DebouncingUtils.isValid(view, duration);
+ }
+
///////////////////////////////////////////////////////////////////////////
// EncodeUtils
///////////////////////////////////////////////////////////////////////////
@@ -445,6 +452,13 @@ static String getCurrentProcessName() {
return ProcessUtils.getCurrentProcessName();
}
+ ///////////////////////////////////////////////////////////////////////////
+ // RomUtils
+ ///////////////////////////////////////////////////////////////////////////
+ static boolean isSamsung() {
+ return RomUtils.isSamsung();
+ }
+
///////////////////////////////////////////////////////////////////////////
// SDCardUtils
///////////////////////////////////////////////////////////////////////////
diff --git a/lib/utilcode/src/main/res/drawable/toast_frame.xml b/lib/utilcode/src/main/res/drawable/toast_frame.xml
new file mode 100644
index 0000000000..24e3922412
--- /dev/null
+++ b/lib/utilcode/src/main/res/drawable/toast_frame.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/lib/utilcode/src/main/res/layout/toast_layout.xml b/lib/utilcode/src/main/res/layout/toast_layout.xml
new file mode 100644
index 0000000000..d66836ea8f
--- /dev/null
+++ b/lib/utilcode/src/main/res/layout/toast_layout.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsTest.java
index 15894fe7d9..9e69a2fbae 100644
--- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsTest.java
+++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsTest.java
@@ -1,5 +1,7 @@
package com.blankj.utilcode.util;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
import org.junit.Before;
import org.junit.Test;
@@ -41,11 +43,6 @@ public void oneParamFun(String param) {
}
@BusUtils.Bus(tag = TAG_NO_PARAM_STICKY, sticky = true)
- public void noParamStickyFun() {
- System.out.println("noParamSticky");
- }
-
- @BusUtils.Bus(tag = TAG_NO_PARAM_STICKY)
public void foo() {
System.out.println("foo");
}
@@ -86,7 +83,7 @@ public void setUp() throws Exception {
BusUtils.registerBus4Test(TAG_NO_PARAM, BusUtilsTest.class.getName(), "noParamFun", "", "", false, "POSTING", 0);
BusUtils.registerBus4Test(TAG_ONE_PARAM, BusUtilsTest.class.getName(), "oneParamFun", String.class.getName(), "param", false, "POSTING", 0);
BusUtils.registerBus4Test(TAG_NO_PARAM_STICKY, BusUtilsTest.class.getName(), "noParamStickyFun", "", "", true, "POSTING", 0);
- BusUtils.registerBus4Test(TAG_NO_PARAM_STICKY, BusUtilsTest.class.getName(), "foo", "", "", false, "POSTING", 0);
+ BusUtils.registerBus4Test(TAG_NO_PARAM_STICKY, BusUtilsTest.class.getName(), "foo", "", "", true, "POSTING", 0);
BusUtils.registerBus4Test(TAG_ONE_PARAM_STICKY, BusUtilsTest.class.getName(), "oneParamStickyFun", Callback.class.getName(), "callback", true, "POSTING", 0);
BusUtils.registerBus4Test(TAG_IO, BusUtilsTest.class.getName(), "ioFun", CountDownLatch.class.getName(), "latch", false, "IO", 0);
@@ -95,13 +92,52 @@ public void setUp() throws Exception {
BusUtils.registerBus4Test(TAG_SINGLE, BusUtilsTest.class.getName(), "singleFun", CountDownLatch.class.getName(), "latch", false, "SINGLE", 0);
}
+ @BusUtils.Bus(tag = TAG_NO_PARAM_STICKY, sticky = true)
+ public void noParamStickyFun() {
+// BusUtils.removeSticky(TAG_NO_PARAM_STICKY);
+ System.out.println("noParamSticky");
+ }
+
+ @Subscribe(sticky = true)
+ public void eventBusFun(String param) {
+ System.out.println(param);
+ }
+
+ @Subscribe(sticky = true)
+ public void eventBusFun1(String param) {
+ System.out.println("foo");
+ }
+
+ @Test
+ public void testEventBusSticky() {
+ EventBus.getDefault().postSticky("test");
+ System.out.println("----");
+
+ BusUtilsTest test = new BusUtilsTest();
+ EventBus.getDefault().register(new BusUtilsTest());
+ EventBus.getDefault().register(new BusUtilsTest());
+ EventBus.getDefault().register(new BusUtilsTest());
+
+ System.out.println("----");
+
+ EventBus.getDefault().postSticky("test");
+ EventBus.getDefault().postSticky("test");
+ }
+
@Test
public void testSticky() {
BusUtils.postSticky(TAG_NO_PARAM_STICKY);
+ System.out.println("----");
+
BusUtilsTest test = new BusUtilsTest();
- BusUtils.register(test);
+ BusUtils.register(new BusUtilsTest());
+ BusUtils.register(new BusUtilsTest());
+ BusUtils.register(new BusUtilsTest());
- BusUtils.postSticky(TAG_NO_PARAM_STICKY);
+ System.out.println("----");
+
+ BusUtils.post(TAG_NO_PARAM_STICKY);
+// BusUtils.post(TAG_NO_PARAM_STICKY);
}
@Test
diff --git a/lib/utildebug/build.gradle b/lib/utildebug/build.gradle
index 11a345f42d..8a06562880 100644
--- a/lib/utildebug/build.gradle
+++ b/lib/utildebug/build.gradle
@@ -8,8 +8,4 @@ dependencies {
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
testImplementation Config.depConfig.support_appcompat_v7.dep
-}
-
-afterEvaluate {
- verifyReleaseResources.enabled(false)
}
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 1d7e39dee7..ed673a5070 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -44,7 +44,7 @@ apply plugin: "com.blankj.api"
给你的项目添加 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 依赖:
```groovy
-api "com.blankj:utilcode:latest_version"
+api "com.blankj:utilcode:latest.release"
```
如果你单纯只想引入 `ApiUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,然后在 app 下的 `build.gradle` 中 配置 api 的 DSL 域如下所示:
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index 85c3eaf6f1..ec039ca8fd 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -33,7 +33,7 @@ apply plugin: "com.blankj.bus"
给你的项目添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
```groovy
-api "com.blankj:utilcode:latest_version
+api "com.blankj:utilcode:latest.release
```
如果你单纯只想引入 `BusUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,记得还要拷贝 `ThreadUtils` 哦,然后在 app 下的 `build.gradle` 中 配置 bus 的 DSL 域如下所示:
From e84d6294fdd2a9462072c3564f387fdb51de9e78 Mon Sep 17 00:00:00 2001
From: limuyang
Date: Mon, 12 Oct 2020 11:57:27 +0800
Subject: [PATCH 19/68] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BF=9D?=
=?UTF-8?q?=E5=AD=98=E5=9B=BE=E7=89=87=E6=97=B6=E7=9A=84=E5=AE=89=E5=85=A8?=
=?UTF-8?q?=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/java/com/blankj/utilcode/util/ImageUtils.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index f3222ad8f3..7b50da20d6 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -1709,6 +1709,7 @@ public static File save2Album(final Bitmap src,
contentUri = MediaStore.Images.Media.INTERNAL_CONTENT_URI;
}
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/" + Utils.getApp().getPackageName());
+ contentValues.put(MediaStore.Video.Media.IS_PENDING, 1);
Uri uri = Utils.getApp().getContentResolver().insert(contentUri, contentValues);
if (uri == null) {
return null;
@@ -1717,8 +1718,14 @@ public static File save2Album(final Bitmap src,
try {
os = Utils.getApp().getContentResolver().openOutputStream(uri);
src.compress(format, quality, os);
+
+ contentValues.clear();
+ contentValues.put(MediaStore.Video.Media.IS_PENDING, 0);
+ Utils.getApp().getContentResolver().update(uri, contentValues, null, null);
+
return UtilsBridge.uri2File(uri);
} catch (Exception e) {
+ Utils.getApp().getContentResolver().delete(uri, null, null);
e.printStackTrace();
return null;
} finally {
From 42982c4cb36f353c91fe822d0cbc562dd74a3c52 Mon Sep 17 00:00:00 2001
From: limuyang
Date: Mon, 12 Oct 2020 12:47:11 +0800
Subject: [PATCH 20/68] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BF=9D?=
=?UTF-8?q?=E5=AD=98=E5=9B=BE=E7=89=87=E6=97=B6=E7=9A=84=E5=AE=89=E5=85=A8?=
=?UTF-8?q?=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/java/com/blankj/utilcode/util/ImageUtils.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 7b50da20d6..9e27fbde73 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -1709,7 +1709,7 @@ public static File save2Album(final Bitmap src,
contentUri = MediaStore.Images.Media.INTERNAL_CONTENT_URI;
}
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/" + Utils.getApp().getPackageName());
- contentValues.put(MediaStore.Video.Media.IS_PENDING, 1);
+ contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
Uri uri = Utils.getApp().getContentResolver().insert(contentUri, contentValues);
if (uri == null) {
return null;
@@ -1720,7 +1720,7 @@ public static File save2Album(final Bitmap src,
src.compress(format, quality, os);
contentValues.clear();
- contentValues.put(MediaStore.Video.Media.IS_PENDING, 0);
+ contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0);
Utils.getApp().getContentResolver().update(uri, contentValues, null, null);
return UtilsBridge.uri2File(uri);
From 538d76c9c8b1753f4114276bc0a04e60ed08c5ac Mon Sep 17 00:00:00 2001
From: Blankj
Date: Sun, 25 Oct 2020 02:33:15 +0800
Subject: [PATCH 21/68] see 10/25 log
---
CHANGELOG.md | 9 +-
buildSrc/src/main/groovy/Config.groovy | 4 +-
.../com/blankj/launcher/app/LauncherApp.java | 8 -
.../feature/dangerous/DangerousActivity.kt | 16 +-
.../pkg/feature/location/LocationActivity.kt | 43 +-
.../utilcode/pkg/src/main/AndroidManifest.xml | 13 +-
.../utilcode/pkg/feature/CoreUtilActivity.kt | 13 +
.../utilcode/pkg/feature/api/ApiActivity.kt | 4 +-
.../utilcode/pkg/feature/app/AppActivity.kt | 2 +-
.../pkg/feature/bar/nav/BarNavActivity.kt | 16 +-
.../feature/bar/status/BarStatusActivity.kt | 16 +-
.../bar/status/BarStatusActivityAlpha.kt | 10 +-
.../bar/status/BarStatusActivityDrawer.kt | 55 +-
.../bar/status/BarStatusActivityImageView.kt | 10 +-
.../status/fragment/BarStatusFragmentAlpha.kt | 10 +-
.../fragment/BarStatusFragmentImageView.kt | 10 +-
.../feature/brightness/BrightnessActivity.kt | 28 +-
.../feature/clipboard/ClipboardActivity.kt | 76 ++
.../feature/flashlight/FlashlightActivity.kt | 8 +-
.../pkg/feature/image/ImageActivity.kt | 94 ++-
.../pkg/feature/language/LanguageActivity.kt | 39 +-
.../utilcode/pkg/feature/log/LogActivity.kt | 70 +-
.../pkg/feature/metaData/MetaDataActivity.kt | 4 +-
.../utilcode/pkg/feature/mvp/MvpView.java | 27 +-
.../pkg/feature/network/NetworkActivity.kt | 6 +-
.../feature/permission/PermissionActivity.kt | 79 +-
.../pkg/feature/screen/ScreenActivity.kt | 24 +-
.../utilcode/pkg/feature/toast/CustomToast.kt | 51 +-
.../pkg/feature/toast/ToastActivity.kt | 66 +-
.../pkg/feature/volume/VolumeActivity.kt | 63 ++
.../pkg/src/main/res/layout/mvp_activity.xml | 13 +
.../src/main/res/values-en-rUS/strings.xml | 4 +-
.../src/main/res/values-zh-rCN/strings.xml | 10 +-
.../pkg/src/main/res/values/strings.xml | 18 +-
.../java/com/blankj/base/BaseApplication.java | 7 +-
.../com/blankj/base/mvp/BasePresenter.java | 4 +-
.../common/activity/CommonActivity.java | 7 +
.../blankj/common/helper/PermissionHelper.kt | 16 +-
.../blankj/common/item/CommonItemSeekBar.java | 47 +-
lib/subutil/README-CN.md | 13 -
lib/subutil/README.md | 13 -
.../blankj/subutil/util/AppStoreUtils.java | 36 +-
.../blankj/subutil/util/ClipboardUtils.java | 96 ---
.../blankj/subutil/util/DangerousUtils.java | 2 +-
.../com/blankj/subutil/util/HttpsUtil.java | 6 +-
.../subutil/util/ClipboardUtilsTest.java | 50 --
.../com/blankj/subutil/util/TestUtils.java | 31 -
lib/utilcode/README-CN.md | 171 ++--
lib/utilcode/README.md | 92 ++-
.../constant/PermissionConstants.java | 48 +-
.../blankj/utilcode/util/ActivityUtils.java | 18 +
.../utilcode/util/AdaptScreenUtils.java | 3 +-
.../com/blankj/utilcode/util/AppUtils.java | 3 +-
.../com/blankj/utilcode/util/BarUtils.java | 7 +-
.../com/blankj/utilcode/util/BusUtils.java | 6 +-
.../blankj/utilcode/util/ClipboardUtils.java | 109 +++
.../com/blankj/utilcode/util/CrashUtils.java | 53 +-
.../blankj/utilcode/util/DebouncingUtils.java | 3 -
.../blankj/utilcode/util/EncryptUtils.java | 19 +-
.../blankj/utilcode/util/FlashlightUtils.java | 2 +-
.../com/blankj/utilcode/util/ImageUtils.java | 174 +++-
.../com/blankj/utilcode/util/JsonUtils.java | 6 +-
.../blankj/utilcode/util/KeyboardUtils.java | 2 +-
.../blankj/utilcode/util/LanguageUtils.java | 319 ++++---
.../com/blankj/utilcode/util/LogUtils.java | 173 ++--
.../blankj/utilcode/util/MessengerUtils.java | 6 +-
.../blankj/utilcode/util/NetworkUtils.java | 5 +-
.../blankj/utilcode/util/PermissionUtils.java | 100 ++-
.../com/blankj/utilcode/util/ScreenUtils.java | 27 +-
.../com/blankj/utilcode/util/StringUtils.java | 43 +-
.../com/blankj/utilcode/util/ToastUtils.java | 777 ++++++++++++------
.../util/UtilsActivityLifecycleImpl.java | 164 ++--
.../com/blankj/utilcode/util/UtilsBridge.java | 145 +++-
.../utilcode/util/UtilsTransActivity.java | 4 +-
.../com/blankj/utilcode/util/ViewUtils.java | 9 +
.../com/blankj/utilcode/util/VolumeUtils.java | 120 +++
.../{toast_frame.xml => utils_toast_bg.xml} | 1 -
.../src/main/res/layout/toast_layout.xml | 23 -
.../src/main/res/layout/utils_toast_view.xml | 72 ++
.../java/com/blankj/utildebug/DebugUtils.java | 5 +
.../utildebug/base/view/SwipeRightMenu.java | 4 +-
81 files changed, 2500 insertions(+), 1460 deletions(-)
create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
delete mode 100644 lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
delete mode 100644 lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
delete mode 100644 lib/subutil/src/test/java/com/blankj/subutil/util/TestUtils.java
create mode 100644 lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
create mode 100644 lib/utilcode/src/main/java/com/blankj/utilcode/util/VolumeUtils.java
rename lib/utilcode/src/main/res/drawable/{toast_frame.xml => utils_toast_bg.xml} (79%)
delete mode 100644 lib/utilcode/src/main/res/layout/toast_layout.xml
create mode 100644 lib/utilcode/src/main/res/layout/utils_toast_view.xml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a20bd884ef..f418e68ab7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,11 @@
-* `20/09/06` [add] DebouncingUtils.
+* `20/10/24` [add] Publish v1.30.0.
+* `20/10/23` [fix] LanguageUtils crash on some device.
+* `20/10/21` [add] LogUtils.Config#setOnConsoleOutputListener, setOnFileOutputListener, addFileExtraHead. LogUtils.getCurrentLogFilePath.
+* `20/10/20` [opt] ToastUtils.
+* `20/10/12` [add] PermissionUtils#explain.
+* `20/10/10` [add] ClipboardUtils.
+* `20/10/08` [add] VolumeUtils.
+* `20/09/06` [add] DebouncingUtils#isValid.
* `20/09/04` [fix] ToastUtils adapt SDK 30.
* `20/05/28` [fix] IntentUtils#getInstallAppIntent file exist wrong. Publish v1.29.0.
* `20/05/23` [fix] BusUtils#postSticky times not right. Publish v1.28.6.
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 2c85babdf5..d292b40954 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -14,8 +14,8 @@ class Config {
static compileSdkVersion = 29
static minSdkVersion = 14
static targetSdkVersion = 29
- static versionCode = 1_029_000
- static versionName = '1.29.0'// E.g. 1.9.72 => 1,009,072
+ static versionCode = 1_030_000
+ static versionName = '1.30.0'// E.g. 1.9.72 => 1,009,072
// lib version
static gradlePluginVersion = '3.5.0'
diff --git a/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java b/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
index 0aa8be0786..7dc22cee69 100644
--- a/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
+++ b/feature/launcher/app/src/main/java/com/blankj/launcher/app/LauncherApp.java
@@ -1,9 +1,6 @@
package com.blankj.launcher.app;
-import android.content.Context;
-
import com.blankj.common.CommonApplication;
-import com.blankj.utilcode.util.ResourceUtils;
/**
*
@@ -21,11 +18,6 @@ public static LauncherApp getInstance() {
return sInstance;
}
- @Override
- protected void attachBaseContext(Context base) {
- super.attachBaseContext(base);
- }
-
@Override
public void onCreate() {
super.onCreate();
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
index 8e0183c991..cc5c60f470 100644
--- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/dangerous/DangerousActivity.kt
@@ -87,13 +87,15 @@ class DangerousActivity : CommonActivity() {
CommonItemClick(R.string.dangerous_reboot_to_bootloader) {
ToastUtils.showShort(DangerousUtils.reboot2Bootloader().toString())
},
- CommonItemSwitch(R.string.dangerous_data_enabled, Utils.Supplier {
- NetworkUtils.getMobileDataEnabled()
- }, Utils.Consumer {
- if (AppUtils.isAppSystem()) {
- DangerousUtils.setMobileDataEnabled(it)
- }
- }),
+ CommonItemSwitch(
+ R.string.dangerous_data_enabled,
+ { NetworkUtils.getMobileDataEnabled() },
+ {
+ if (AppUtils.isAppSystem()) {
+ DangerousUtils.setMobileDataEnabled(it)
+ }
+ }
+ ),
CommonItemClick(R.string.dangerous_send_sms_silent) {
DangerousUtils.sendSmsSilent("10000", "sendSmsSilent")
}
diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
index 88e55b23f2..8f4217c96c 100755
--- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
+++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/location/LocationActivity.kt
@@ -24,6 +24,14 @@ import com.blankj.utilcode.util.PermissionUtils
*/
class LocationActivity : CommonActivity() {
+ private var lastLatitude: String = "unknown"
+ private var lastLongitude: String = "unknown"
+ private var latitude: String = "unknown"
+ private var longitude: String = "unknown"
+ private var country: String = "unknown"
+ private var locality: String = "unknown"
+ private var street: String = "unknown"
+
companion object {
fun start(context: Context) {
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
@@ -48,18 +56,17 @@ class LocationActivity : CommonActivity() {
mLocationService.setOnGetLocationListener(object : LocationService.OnGetLocationListener {
override fun getLocation(lastLatitude: String, lastLongitude: String, latitude: String,
longitude: String, country: String, locality: String, street: String) {
+ this@LocationActivity.apply {
+ this.lastLatitude = lastLatitude
+ this.lastLongitude = lastLongitude
+ this.latitude = latitude
+ this.longitude = longitude
+ this.country = country
+ this.locality = locality
+ this.street = street
+ }
runOnUiThread {
- itemsView.updateItems(
- CollectionUtils.newArrayList>(
- CommonItemTitle("lastLatitude", lastLatitude),
- CommonItemTitle("lastLongitude", lastLongitude),
- CommonItemTitle("latitude", latitude),
- CommonItemTitle("longitude", longitude),
- CommonItemTitle("getCountryName", country),
- CommonItemTitle("getLocality", locality),
- CommonItemTitle("getStreet", street)
- )
- )
+ itemsView.updateItems(bindItems())
}
}
})
@@ -72,13 +79,13 @@ class LocationActivity : CommonActivity() {
override fun bindItems(): MutableList> {
return CollectionUtils.newArrayList(
- CommonItemTitle("lastLatitude", "unknown"),
- CommonItemTitle("lastLongitude", "unknown"),
- CommonItemTitle("latitude", "unknown"),
- CommonItemTitle("longitude", "unknown"),
- CommonItemTitle("getCountryName", "unknown"),
- CommonItemTitle("getLocality", "unknown"),
- CommonItemTitle("getStreet", "unknown")
+ CommonItemTitle("lastLatitude", lastLatitude),
+ CommonItemTitle("lastLongitude", lastLongitude),
+ CommonItemTitle("latitude", latitude),
+ CommonItemTitle("longitude", longitude),
+ CommonItemTitle("getCountryName", country),
+ CommonItemTitle("getLocality", locality),
+ CommonItemTitle("getStreet", street)
)
}
diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml
index fde82401a1..f77ad3d953 100644
--- a/feature/utilcode/pkg/src/main/AndroidManifest.xml
+++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml
@@ -139,6 +139,10 @@
android:name=".feature.click.ClickActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
+
+ android:value="D1234567890123456789012345678901234567890" />
+ android:configChanges="orientation|keyboardHidden|screenSize" />
+
> {
+ override fun bindItems(): MutableList> {
return CollectionUtils.newArrayList(
CommonItemClick(R.string.api_invoke_with_params) {
ApiUtils.getApi(OtherModuleApi::class.java).invokeWithParams(OtherModuleApi.ApiBean("params"))
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
index f835845e6f..7e6f10785a 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
@@ -52,7 +52,7 @@ class AppActivity : CommonActivity() {
LogUtils.e(requestCode, resultCode)
}
- override fun bindItems(): List> {
+ override fun bindItems(): MutableList> {
return CollectionUtils.newArrayList(
CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()),
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt
index 997f83f78a..1b3032974f 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt
@@ -42,22 +42,14 @@ class BarNavActivity : CommonActivity() {
if (BarUtils.isSupportNavBar()) {
add(CommonItemSwitch(
R.string.bar_nav_visibility,
- Utils.Supplier {
- BarUtils.isNavBarVisible(this@BarNavActivity)
- },
- Utils.Consumer {
- BarUtils.setNavBarVisibility(this@BarNavActivity, it)
- }
+ { BarUtils.isNavBarVisible(this@BarNavActivity) },
+ { BarUtils.setNavBarVisibility(this@BarNavActivity, it) }
))
add(CommonItemSwitch(
R.string.bar_nav_light_mode,
- Utils.Supplier {
- BarUtils.isNavBarLightMode(this@BarNavActivity)
- },
- Utils.Consumer {
- BarUtils.setNavBarLightMode(this@BarNavActivity, it)
- }
+ { BarUtils.isNavBarLightMode(this@BarNavActivity) },
+ { BarUtils.setNavBarLightMode(this@BarNavActivity, it) }
))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt
index 557de0a65a..da20870e79 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt
@@ -37,21 +37,13 @@ class BarStatusActivity : CommonActivity() {
CommonItemTitle("getStatusBarHeight", BarUtils.getStatusBarHeight().toString()),
CommonItemSwitch(
R.string.bar_status_visibility,
- Utils.Supplier {
- BarUtils.isStatusBarVisible(this)
- },
- Utils.Consumer {
- BarUtils.setStatusBarVisibility(this, it)
- }
+ { BarUtils.isStatusBarVisible(this) },
+ { BarUtils.setStatusBarVisibility(this, it) }
),
CommonItemSwitch(
R.string.bar_status_light_mode,
- Utils.Supplier {
- BarUtils.isStatusBarLightMode(this)
- },
- Utils.Consumer {
- BarUtils.setStatusBarLightMode(this, it)
- }
+ { BarUtils.isStatusBarLightMode(this) },
+ { BarUtils.setStatusBarLightMode(this, it) }
)
)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt
index b7464443bd..fa886e5be5 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt
@@ -45,15 +45,15 @@ class BarStatusActivityAlpha : CommonActivity() {
private fun getItems(): List> {
return CollectionUtils.newArrayList>(
- CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener {
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mAlpha = progress
updateStatusBar()
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
}).apply {
backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt
index 348d349991..d8e092d466 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt
@@ -15,7 +15,6 @@ import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.ColorUtils
-import com.blankj.utilcode.util.Utils
import kotlinx.android.synthetic.main.bar_status_drawer_activity.*
@@ -61,37 +60,43 @@ class BarStatusActivityDrawer : CommonActivity() {
return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor)
}
- val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener {
+ val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mAlpha = progress
updateStatusBar()
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
return CollectionUtils.newArrayList(
- CommonItemSwitch(R.string.bar_status_title_alpha, Utils.Supplier {
- updateStatusBar()
- return@Supplier mAlphaStatus
- }, Utils.Consumer {
- 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.Supplier {
- return@Supplier mFrontStatus
- }, Utils.Consumer {
- mFrontStatus = it
- updateStatusBar()
- }),
+ CommonItemSwitch(
+ R.string.bar_status_title_alpha,
+ {
+ updateStatusBar()
+ mAlphaStatus
+ },
+ {
+ mAlphaStatus = it
+ if (mAlphaStatus) {
+ barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena)
+ commonItemAdapter.replaceItem(2, alphaItem, true)
+ } else {
+ barStatusDrawerRootLl.setBackgroundColor(Color.TRANSPARENT)
+ commonItemAdapter.replaceItem(2, randomColorItem, true)
+ }
+ }
+ ),
+ CommonItemSwitch(
+ R.string.bar_status_is_front,
+ { mFrontStatus },
+ {
+ mFrontStatus = it
+ updateStatusBar()
+ }
+ ),
randomColorItem
)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt
index 533a40d7f5..86542caec5 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt
@@ -44,15 +44,15 @@ class BarStatusActivityImageView : CommonActivity() {
private fun getItems(): List> {
return CollectionUtils.newArrayList>(
- CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener {
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mAlpha = progress
updateStatusBar()
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt
index 15797fc505..ab368c0295 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt
@@ -47,15 +47,15 @@ class BarStatusFragmentAlpha : CommonFragment() {
private fun getItems(): List> {
return CollectionUtils.newArrayList>(
- CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener {
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mAlpha = progress
updateFakeStatusBar()
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
}).apply {
backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt
index 54571b6ddd..686e50995c 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt
@@ -46,15 +46,15 @@ class BarStatusFragmentImageView : CommonFragment() {
private fun getItems(): List> {
return CollectionUtils.newArrayList>(
- CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener {
+ CommonItemSeekBar("Status Bar Alpha", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return mAlpha
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mAlpha = progress
updateFakeStatusBar()
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
index 639742c60b..435a1ecbed 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
@@ -48,32 +48,28 @@ class BrightnessActivity : CommonActivity() {
override fun bindItems(): MutableList> {
return CollectionUtils.newArrayList(
- CommonItemSeekBar("getBrightness", 255, BrightnessUtils.getBrightness(), object : SeekBar.OnSeekBarChangeListener {
+ CommonItemSeekBar("getBrightness", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return BrightnessUtils.getBrightness()
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
BrightnessUtils.setBrightness(progress)
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
}),
- CommonItemSeekBar("getWindowBrightness", 255, BrightnessUtils.getWindowBrightness(window), object : SeekBar.OnSeekBarChangeListener {
+ CommonItemSeekBar("getWindowBrightness", 255, object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return BrightnessUtils.getWindowBrightness(window)
+ }
+
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
BrightnessUtils.setWindowBrightness(window, progress)
}
-
- override fun onStartTrackingTouch(seekBar: SeekBar?) {}
-
- override fun onStopTrackingTouch(seekBar: SeekBar?) {}
}),
CommonItemSwitch(
R.string.brightness_auto_brightness,
- Utils.Supplier {
- BrightnessUtils.isAutoBrightnessEnabled()
- },
- Utils.Consumer {
- BrightnessUtils.setAutoBrightnessEnabled(it)
- }
+ { BrightnessUtils.isAutoBrightnessEnabled() },
+ { BrightnessUtils.setAutoBrightnessEnabled(it) }
)
)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
new file mode 100644
index 0000000000..824fdf02ca
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
@@ -0,0 +1,76 @@
+package com.blankj.utilcode.pkg.feature.clipboard
+
+import android.content.Context
+import android.content.Intent
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.ClipboardUtils
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ToastUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2020/09/11
+ * desc : demo about ClipboardUtils
+ * ```
+ */
+class ClipboardActivity : CommonActivity() {
+
+ private var index: Int = 0
+ private var isAddListener: Boolean = false
+ private var listener = {
+ ToastUtils.showShort(ClipboardUtils.getText())
+ }
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, ClipboardActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_clipboard
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ CommonItemTitle("getText", ClipboardUtils.getText()),
+ CommonItemTitle("getLabel", ClipboardUtils.getLabel()),
+ CommonItemClick("copyText: value{$index}").setOnItemClickListener { _, _, _ ->
+ ClipboardUtils.copyText("value{${index++}}")
+ itemsView.updateItems(bindItems())
+ },
+ CommonItemClick("clear").setOnItemClickListener { _, _, _ ->
+ ClipboardUtils.clear()
+ itemsView.updateItems(bindItems())
+ },
+ CommonItemSwitch("clipChangeListener", { isAddListener }, {
+ isAddListener = it
+ if (isAddListener) {
+ ClipboardUtils.addChangedListener(listener)
+ } else {
+ ClipboardUtils.removeChangedListener(listener)
+ }
+ })
+ )
+ }
+
+ override fun onResume() {
+ super.onResume()
+ itemsView.updateItems(bindItems())
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ if (isAddListener) {
+ ClipboardUtils.removeChangedListener(listener)
+ }
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt
index dbfa38083c..c5f602b9e3 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/flashlight/FlashlightActivity.kt
@@ -50,12 +50,8 @@ class FlashlightActivity : CommonActivity() {
if (FlashlightUtils.isFlashlightEnable()) {
add(CommonItemSwitch(
R.string.flashlight_status,
- Utils.Supplier {
- FlashlightUtils.isFlashlightOn()
- },
- Utils.Consumer {
- FlashlightUtils.setFlashlightStatus(it)
- }
+ { FlashlightUtils.isFlashlightOn() },
+ { FlashlightUtils.setFlashlightStatus(it) }
))
}
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 5035274ad9..995bbb22c1 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -119,71 +119,77 @@ class ImageActivity : CommonActivity() {
}
})
})
- add(CommonItemImage(R.string.image_src, Utils.Consumer {
+ add(CommonItemImage(R.string.image_src) {
it.setImageBitmap(src)
- }))
- add(CommonItemImage(R.string.image_add_color, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_add_color) {
it.setImageBitmap(ImageUtils.drawColor(src, Color.parseColor("#8000FF00")))
- }))
- add(CommonItemImage(R.string.image_scale, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_scale) {
it.setImageBitmap(ImageUtils.scale(src, width / 2, height / 2))
- }))
- add(CommonItemImage(R.string.image_clip, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_clip) {
it.setImageBitmap(ImageUtils.clip(src, 0, 0, width / 2, height / 2))
- }))
- add(CommonItemImage(R.string.image_skew, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_skew) {
it.setImageBitmap(ImageUtils.skew(src, 0.2f, 0.1f))
- }))
- add(CommonItemImage(R.string.image_rotate, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_rotate) {
it.setImageBitmap(ImageUtils.rotate(src, 90, (width / 2).toFloat(), (height / 2).toFloat()))
- }))
- add(CommonItemImage(R.string.image_to_round) { it ->
+ })
+ add(CommonItemImage(R.string.image_to_round) {
it.setImageBitmap(ImageUtils.toRound(src))
})
- add(CommonItemImage(R.string.image_to_round_border, Utils.Consumer {
+ add(CommonItemImage(R.string.image_to_round_border) {
it.setImageBitmap(ImageUtils.toRound(src, 16, Color.GREEN))
- }))
- add(CommonItemImage(R.string.image_to_round_corner, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_to_round_corner) {
it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f))
- }))
- add(CommonItemImage(R.string.image_to_round_corner_border, Utils.Consumer {
- it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f, 16, Color.GREEN))
- }))
- add(CommonItemImage(R.string.image_add_corner_border, Utils.Consumer {
- it.setImageBitmap(ImageUtils.addCornerBorder(src, 16, Color.GREEN, 0f))
- }))
- add(CommonItemImage(R.string.image_add_circle_border, Utils.Consumer {
- it.setImageBitmap(ImageUtils.addCircleBorder(round, 16, Color.GREEN))
- }))
- add(CommonItemImage(R.string.image_add_reflection, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_to_round_corner_border) {
+ it.setImageBitmap(ImageUtils.toRoundCorner(src, 80f, 16f, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_to_round_corner_border) {
+ it.setImageBitmap(ImageUtils.toRoundCorner(src, floatArrayOf(0f, 0f, 80f, 80f, 0f, 0f, 80f, 80f), 16f, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_add_corner_border) {
+ it.setImageBitmap(ImageUtils.addCornerBorder(src, 16f, Color.GREEN, 80f))
+ })
+ add(CommonItemImage(R.string.image_add_corner_border) {
+ it.setImageBitmap(ImageUtils.addCornerBorder(src, 16f, Color.GREEN, floatArrayOf(0f, 0f, 80f, 80f, 0f, 0f, 80f, 80f)))
+ })
+ add(CommonItemImage(R.string.image_add_circle_border) {
+ it.setImageBitmap(ImageUtils.addCircleBorder(src, 16f, Color.GREEN))
+ })
+ add(CommonItemImage(R.string.image_add_reflection) {
it.setImageBitmap(ImageUtils.addReflection(src, 80))
- }))
- add(CommonItemImage(R.string.image_add_text_watermark, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_add_text_watermark) {
it.setImageBitmap(ImageUtils.addTextWatermark(src, "blankj", 40, Color.GREEN, 0f, 0f))
- }))
- add(CommonItemImage(R.string.image_add_image_watermark, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_add_image_watermark) {
it.setImageBitmap(ImageUtils.addImageWatermark(src, watermark, 0, 0, 0x88))
- }))
- add(CommonItemImage(R.string.image_to_gray, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_to_gray) {
it.setImageBitmap(ImageUtils.toGray(src))
- }))
- add(CommonItemImage(R.string.image_fast_blur, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_fast_blur) {
it.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5f))
- }))
+ })
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- add(CommonItemImage(R.string.image_render_script_blur, Utils.Consumer {
+ add(CommonItemImage(R.string.image_render_script_blur) {
it.setImageBitmap(ImageUtils.renderScriptBlur(src, 10f))
- }))
+ })
}
- add(CommonItemImage(R.string.image_stack_blur, Utils.Consumer {
+ add(CommonItemImage(R.string.image_stack_blur) {
it.setImageBitmap(ImageUtils.stackBlur(src, 10))
- }))
- add(CommonItemImage(R.string.image_compress_by_scale, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_compress_by_scale) {
it.setImageBitmap(ImageUtils.compressByScale(src, 0.5f, 0.5f))
- }))
- add(CommonItemImage(R.string.image_compress_by_sample_size, Utils.Consumer {
+ })
+ add(CommonItemImage(R.string.image_compress_by_sample_size) {
it.setImageBitmap(ImageUtils.compressBySampleSize(src, 2))
- }))
+ })
}
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
index 5d088ba01c..0e14482b91 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
@@ -3,15 +3,15 @@ package com.blankj.utilcode.pkg.feature.language
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
-import com.blankj.common.activity.CommonActivityItemsView
-import com.blankj.common.activity.CommonActivityTitleView
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
+import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.pkg.R
-import com.blankj.utilcode.pkg.feature.CoreUtilActivity
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.LanguageUtils
-import com.blankj.utilcode.util.ToastUtils
+import com.blankj.utilcode.util.SPStaticUtils
+import com.blankj.utilcode.util.StringUtils
import java.util.*
/**
@@ -25,6 +25,9 @@ import java.util.*
class LanguageActivity : CommonActivity() {
companion object {
+
+ const val SP_KEY_IS_RELAUNCH_APP = "SP_KEY_IS_RELAUNCH_APP"
+
fun start(context: Context) {
val starter = Intent(context, LanguageActivity::class.java)
context.startActivity(starter)
@@ -37,21 +40,31 @@ class LanguageActivity : CommonActivity() {
override fun bindItems(): List> {
return CollectionUtils.newArrayList(
- CommonItemClick(R.string.language_app_context) {
- ToastUtils.showLong(R.string.language)
- },
- CommonItemClick(R.string.language_activity_context) {
- ToastUtils.showLong(getString(R.string.language))
- },
+ CommonItemTitle("isAppliedLanguage", LanguageUtils.isAppliedLanguage().toString()),
+ CommonItemTitle("isAppliedLanguage(SIMPLIFIED_CHINESE)", LanguageUtils.isAppliedLanguage(Locale.SIMPLIFIED_CHINESE).toString()),
+ CommonItemTitle("getAppliedLanguage", (LanguageUtils.getAppliedLanguage() ?: "null").toString()),
+ CommonItemTitle("getActivityContextLanguage", LanguageUtils.getContextLanguage(this).toString()),
+ CommonItemTitle("getAppContextLanguage", LanguageUtils.getAppContextLanguage().toString()),
+ CommonItemTitle("getSystemLanguage", LanguageUtils.getSystemLanguage().toString()),
+ CommonItemSwitch(
+ StringUtils.getString(R.string.language_relaunch_app),
+ { isRelaunchApp() },
+ { SPStaticUtils.put(SP_KEY_IS_RELAUNCH_APP, it) }
+ ),
CommonItemClick(R.string.language_apply_simple_chinese) {
- LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, CoreUtilActivity::class.java)
+ LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, isRelaunchApp())
},
CommonItemClick(R.string.language_apply_american) {
- LanguageUtils.applyLanguage(Locale.US, "")
+ LanguageUtils.applyLanguage(Locale.US, isRelaunchApp())
+ },
+ CommonItemClick(R.string.language_apply_english) {
+ LanguageUtils.applyLanguage(Locale.ENGLISH, isRelaunchApp())
},
CommonItemClick(R.string.language_apply_system) {
- LanguageUtils.applySystemLanguage("")
+ LanguageUtils.applySystemLanguage(isRelaunchApp())
}
)
}
+
+ private fun isRelaunchApp() = SPStaticUtils.getBoolean(SP_KEY_IS_RELAUNCH_APP)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
index b26bd9644c..096df003e4 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/log/LogActivity.kt
@@ -5,11 +5,13 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
+import android.util.Log
import com.blankj.base.BaseApplication
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemSwitch
+import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.*
import java.io.File
@@ -112,23 +114,21 @@ class LogActivity : CommonActivity() {
override fun bindItems(): List> {
return CollectionUtils.newArrayList(
+ CommonItemTitle("getLogFiles", LogUtils.getLogFiles().toString()),
CommonItemSwitch(
R.string.log_switch,
- Utils.Supplier {
- mConfig.isLogSwitch
- },
- Utils.Consumer {
- mConfig.isLogSwitch = it
- }
+ { mConfig.isLogSwitch },
+ { mConfig.isLogSwitch = it }
),
CommonItemSwitch(
- R.string.log_console_console,
- Utils.Supplier {
- mConfig.isLog2ConsoleSwitch
- },
- Utils.Consumer {
- mConfig.setConsoleSwitch(it)
- }
+ R.string.log_console_switch,
+ { mConfig.isLog2ConsoleSwitch },
+ { mConfig.setConsoleSwitch(it) }
+ ),
+ CommonItemSwitch(
+ R.string.log_console_listener_switch,
+ { mConfig.haveSetOnConsoleOutputListener() },
+ { mConfig.setOnConsoleOutputListener { type, tag, content -> Log.println(type, tag, content) } }
),
CommonItemClick("Global Tag", if (mConfig.globalTag == "") "null" else mConfig.globalTag).setOnClickUpdateContentListener {
if (StringUtils.isSpace(mConfig.globalTag)) {
@@ -140,47 +140,41 @@ class LogActivity : CommonActivity() {
},
CommonItemSwitch(
R.string.log_head_switch,
- Utils.Supplier {
- mConfig.isLogHeadSwitch
- },
- Utils.Consumer {
- mConfig.isLogHeadSwitch = it
- }
+ { mConfig.isLogHeadSwitch },
+ { mConfig.isLogHeadSwitch = it }
),
CommonItemSwitch(
R.string.log_file_switch,
- Utils.Supplier {
- mConfig.isLog2FileSwitch
- },
- Utils.Consumer {
- mConfig.isLog2FileSwitch = it
- }
+ { mConfig.isLog2FileSwitch },
+ { mConfig.isLog2FileSwitch = it }
+ ),
+ CommonItemSwitch(
+ R.string.log_file_listener_switch,
+ { mConfig.haveSetOnFileOutputListener() },
+ { mConfig.setOnFileOutputListener { filePath, content -> Log.d("LogActivity", filePath + "\n" + content) } }
),
CommonItemClick("Dir", mConfig.dir).setOnClickUpdateContentListener {
if (mConfig.dir != mConfig.defaultDir) {
mConfig.dir = mConfig.defaultDir
} else {
- mConfig.setDir(File(PathUtils.getInternalAppFilesPath(), "log"))
+ mConfig.setDir(File(PathUtils.getExternalAppFilesPath(), "log"))
}
return@setOnClickUpdateContentListener mConfig.dir
},
CommonItemSwitch(
R.string.log_border_switch,
- Utils.Supplier {
- mConfig.isLogBorderSwitch
- },
- Utils.Consumer {
- mConfig.setBorderSwitch(it)
- }
+ { mConfig.isLogBorderSwitch },
+ { mConfig.setBorderSwitch(it) }
+ ),
+ CommonItemSwitch(
+ R.string.log_single_tag_switch,
+ { mConfig.isSingleTagSwitch },
+ { mConfig.setSingleTagSwitch(it) }
),
CommonItemSwitch(
R.string.log_single_tag_switch,
- Utils.Supplier {
- mConfig.isSingleTagSwitch
- },
- Utils.Consumer {
- mConfig.setSingleTagSwitch(it)
- }
+ { mConfig.isSingleTagSwitch },
+ { mConfig.setSingleTagSwitch(it) }
),
CommonItemClick("ConsoleFilter", mConfig.consoleFilter.toString()).setOnClickUpdateContentListener {
mConfig.setConsoleFilter(if (mConfig.consoleFilter == 'V') LogUtils.W else LogUtils.V)
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt
index f45304d353..77bb5f8e82 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/metaData/MetaDataActivity.kt
@@ -3,8 +3,6 @@ package com.blankj.utilcode.pkg.feature.metaData
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
-import com.blankj.common.activity.CommonActivityItemsView
-import com.blankj.common.activity.CommonActivityTitleView
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.pkg.R
@@ -35,7 +33,7 @@ class MetaDataActivity : CommonActivity() {
override fun bindItems(): List> {
return CollectionUtils.newArrayList(
CommonItemTitle("getMetaDataInApp", MetaDataUtils.getMetaDataInApp("app_meta_data")),
- CommonItemTitle("getMetaDataInActivity", MetaDataUtils.getMetaDataInActivity(this, "activity_meta_data"))
+ CommonItemTitle("getMetaDataInActivity", MetaDataUtils.getMetaDataInActivity(this, "activity_meta_data").substring(1))
)
}
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
index 59ab715ac0..054cd7ade9 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpView.java
@@ -1,12 +1,16 @@
package com.blankj.utilcode.pkg.feature.mvp;
-import android.support.v4.app.FragmentActivity;
+import android.text.Layout;
import android.view.View;
import android.widget.TextView;
import com.blankj.base.mvp.BaseView;
import com.blankj.utilcode.pkg.R;
+import com.blankj.utilcode.pkg.feature.fragment.FragmentActivity;
import com.blankj.utilcode.util.ClickUtils;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.SizeUtils;
+import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.ToastUtils;
/**
@@ -21,8 +25,10 @@ public class MvpView extends BaseView
implements IMvp.View {
private TextView mvpTv;
+ private TextView mvpMeasureWidthTv;
+ private int i = 0;
- public MvpView(FragmentActivity activity) {
+ public MvpView(MvpActivity activity) {
super(activity);
mvpTv = activity.findViewById(R.id.mvpUpdateTv);
ClickUtils.applyPressedBgDark(mvpTv);
@@ -32,6 +38,23 @@ public void onClick(View v) {
getPresenter(MvpPresenter.class).updateMsg();
}
});
+
+ mvpMeasureWidthTv = activity.findViewById(R.id.mvpMeasureWidthTv);
+
+ measure();
+ }
+
+ private void measure() {
+ ThreadUtils.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ float textWidth = Layout.getDesiredWidth(mvpMeasureWidthTv.getText(), mvpMeasureWidthTv.getPaint()) + SizeUtils.dp2px(16);
+ float textWidth2 = mvpMeasureWidthTv.getPaint().measureText(mvpMeasureWidthTv.getText().toString()) + SizeUtils.dp2px(16);
+ LogUtils.i(mvpMeasureWidthTv.getWidth(), textWidth, textWidth2);
+ mvpMeasureWidthTv.setText(mvpMeasureWidthTv.getText().toString() + i);
+ measure();
+ }
+ }, 1000);
}
@Override
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 2d39faf102..f0c9962b2d 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
@@ -75,10 +75,8 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
CommonItemSwitch(
R.string.network_wifi_enabled,
- Utils.Supplier {
- NetworkUtils.getWifiEnabled()
- },
- Utils.Consumer {
+ { NetworkUtils.getWifiEnabled() },
+ {
NetworkUtils.setWifiEnabled(it)
ThreadUtils.executeByIo(getItemsTask())
}
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 6f69405355..c55d9c945b 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt
@@ -1,6 +1,6 @@
package com.blankj.utilcode.pkg.feature.permission
-import android.Manifest
+import android.Manifest.permission
import android.content.Context
import android.content.Intent
import android.os.Build
@@ -56,56 +56,36 @@ class PermissionActivity : CommonActivity() {
add(CommonItemClick(R.string.permission_open_app_settings, true) { PermissionUtils.launchAppDetailsSettings() })
add(CommonItemSwitch(
R.string.permission_calendar_status,
- Utils.Supplier {
- return@Supplier PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR)
- },
- Utils.Consumer {
- requestCalendar()
- }
+ { PermissionUtils.isGranted(PermissionConstants.CALENDAR) },
+ { requestCalendar() }
))
add(CommonItemSwitch(
R.string.permission_record_audio_status,
- Utils.Supplier {
- return@Supplier PermissionUtils.isGranted(Manifest.permission.RECORD_AUDIO)
- },
- Utils.Consumer {
- requestRecordAudio()
- }
+ { PermissionUtils.isGranted(PermissionConstants.MICROPHONE) },
+ { requestRecordAudio() }
))
add(CommonItemSwitch(
R.string.permission_calendar_and_record_audio_status,
- Utils.Supplier {
- return@Supplier PermissionUtils.isGranted(Manifest.permission.READ_CALENDAR, Manifest.permission.RECORD_AUDIO)
- },
- Utils.Consumer {
- requestCalendarAndRecordAudio()
- }
+ { PermissionUtils.isGranted(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE) },
+ { requestCalendarAndRecordAudio() }
))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
add(CommonItemSwitch(
R.string.permission_write_settings_status,
- Utils.Supplier {
- return@Supplier PermissionUtils.isGrantedWriteSettings()
- },
- Utils.Consumer {
- requestWriteSettings()
- }
+ { PermissionUtils.isGrantedWriteSettings() },
+ { requestWriteSettings() }
))
add(CommonItemSwitch(
R.string.permission_write_settings_status,
- Utils.Supplier {
- return@Supplier PermissionUtils.isGrantedDrawOverlays()
- },
- Utils.Consumer {
- requestDrawOverlays()
- }
+ { PermissionUtils.isGrantedDrawOverlays() },
+ { requestDrawOverlays() }
))
}
}
}
private fun requestCalendar() {
- PermissionUtils.permission(PermissionConstants.CALENDAR)
+ PermissionUtils.permissionGroup(PermissionConstants.CALENDAR)
.rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List) {
@@ -130,7 +110,7 @@ class PermissionActivity : CommonActivity() {
}
private fun requestRecordAudio() {
- PermissionUtils.permission(PermissionConstants.MICROPHONE)
+ PermissionUtils.permissionGroup(PermissionConstants.MICROPHONE)
.rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.FullCallback {
override fun onGranted(permissionsGranted: List) {
@@ -154,28 +134,21 @@ class PermissionActivity : CommonActivity() {
}
private fun requestCalendarAndRecordAudio() {
- PermissionUtils.permission(PermissionConstants.CALENDAR, PermissionConstants.MICROPHONE)
- .rationale { activity, shouldRequest -> PermissionHelper.showRationaleDialog(activity, shouldRequest) }
- .callback(object : PermissionUtils.FullCallback {
- override fun onGranted(permissionsGranted: List) {
- LogUtils.d(permissionsGranted)
- if (permissionsGranted.size == 2) {
- showSnackbar(true, "Calendar or Microphone is granted")
- }
- itemsView.updateItems(bindItems())
+ PermissionUtils.permission(permission.READ_CALENDAR, permission.RECORD_AUDIO)
+ .explain { activity, denied, shouldRequest -> PermissionHelper.showExplainDialog(activity, denied, shouldRequest) }
+ .callback { isAllGranted, granted, deniedForever, denied ->
+ LogUtils.d(granted, deniedForever, denied)
+ itemsView.updateItems(bindItems())
+ if (isAllGranted) {
+ showSnackbar(true, "Calendar and Microphone are granted")
+ return@callback
}
-
- override fun onDenied(permissionsDeniedForever: List,
- permissionsDenied: List) {
- LogUtils.d(permissionsDeniedForever, permissionsDenied)
- if (permissionsDeniedForever.isNotEmpty()) {
- showSnackbar(false, "Calendar or Microphone is denied forever")
- } else {
- showSnackbar(false, "Calendar or Microphone is denied")
- }
- itemsView.updateItems(bindItems())
+ if (deniedForever.isNotEmpty()) {
+ showSnackbar(false, "Calendar or Microphone is denied forever")
+ } else {
+ showSnackbar(false, "Calendar or Microphone is denied")
}
- })
+ }
.request()
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
index 246cb0dc8e..88286c4df5 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/screen/ScreenActivity.kt
@@ -3,6 +3,8 @@ package com.blankj.utilcode.pkg.feature.screen
import android.content.Context
import android.content.Intent
import android.os.Build
+import android.widget.ImageView
+import android.widget.TextView
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
@@ -61,10 +63,8 @@ class ScreenActivity : CommonActivity() {
CommonItemSwitch(
"isFullScreen",
- Utils.Supplier {
- ScreenUtils.isFullScreen(this)
- },
- Utils.Consumer {
+ { ScreenUtils.isFullScreen(this) },
+ {
if (it) {
ScreenUtils.setFullScreen(this)
BarUtils.setStatusBarVisibility(this, false)
@@ -76,10 +76,8 @@ class ScreenActivity : CommonActivity() {
),
CommonItemSwitch(
"isLandscape",
- Utils.Supplier {
- ScreenUtils.isLandscape()
- },
- Utils.Consumer {
+ { ScreenUtils.isLandscape() },
+ {
if (it) {
ScreenUtils.setLandscape(this)
} else {
@@ -88,7 +86,15 @@ class ScreenActivity : CommonActivity() {
}
),
CommonItemClick(R.string.screen_screenshot) {
- DialogHelper.showScreenshotDialog(ScreenUtils.screenShot(this))
+ val iv :ImageView = ImageView(this)
+ iv.setImageResource(R.mipmap.ic_launcher)
+
+ val tv: TextView = TextView(this)
+ tv.setText("wowowowwowo")
+
+ DialogHelper.showScreenshotDialog(ImageUtils.view2Bitmap(tv))
+
+// DialogHelper.showScreenshotDialog(ScreenUtils.screenShot(this))
}
)
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..384b1877ea 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -1,14 +1,11 @@
package com.blankj.utilcode.pkg.feature.toast
-import android.os.Handler
-import android.os.Looper
import android.support.annotation.StringRes
import android.widget.TextView
-import android.widget.Toast
-
import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.StringUtils
import com.blankj.utilcode.util.ToastUtils
-import com.blankj.utilcode.util.Utils
+import com.blankj.utilcode.util.ViewUtils
/**
* ```
@@ -20,62 +17,42 @@ import com.blankj.utilcode.util.Utils
*/
object CustomToast {
- private val HANDLER = Handler(Looper.getMainLooper())
-
fun showShort(text: CharSequence) {
- showReal(text, Toast.LENGTH_SHORT)
+ show(text, false)
}
fun showShort(@StringRes resId: Int) {
- show(resId, Toast.LENGTH_SHORT)
+ show(StringUtils.getString(resId), false)
}
fun showShort(@StringRes resId: Int, vararg args: Any) {
- show(resId, Toast.LENGTH_SHORT, *args)
+ show(StringUtils.getString(resId, args), false)
}
fun showShort(format: String, vararg args: Any) {
- show(format, Toast.LENGTH_SHORT, *args)
+ show(StringUtils.format(format, args), false)
}
fun showLong(text: CharSequence) {
- showReal(text, Toast.LENGTH_LONG)
+ show(text, true)
}
fun showLong(@StringRes resId: Int) {
- show(resId, Toast.LENGTH_LONG)
+ show(StringUtils.getString(resId), true)
}
fun showLong(@StringRes resId: Int, vararg args: Any) {
- show(resId, Toast.LENGTH_LONG, *args)
+ show(StringUtils.getString(resId, args), true)
}
fun showLong(format: String, vararg args: Any) {
- show(format, Toast.LENGTH_LONG, *args)
- }
-
- private fun show(@StringRes resId: Int, duration: Int) {
- show(Utils.getApp().resources.getString(resId), duration)
- }
-
- private fun show(@StringRes resId: Int, duration: Int, vararg args: Any) {
- show(String.format(Utils.getApp().resources.getString(resId), *args), duration)
- }
-
- private fun show(format: String, duration: Int, vararg args: Any) {
- showReal(String.format(format, *args), duration)
+ show(StringUtils.format(format, args), true)
}
- private fun showReal(text: CharSequence, duration: Int) {
- HANDLER.post {
- val toastView: TextView
- if (duration == Toast.LENGTH_SHORT) {
- toastView = ToastUtils.showCustomShort(R.layout.toast_custom) as TextView
- } else {
- toastView = ToastUtils.showCustomLong(R.layout.toast_custom) as TextView
- }
- toastView.text = text
- }
+ private fun show(text: CharSequence, isLong: Boolean) {
+ val textView = ViewUtils.layoutId2View(R.layout.toast_custom) as TextView
+ textView.text = text
+ ToastUtils.make().setDurationIsLong(isLong).show(textView)
}
fun cancel() {
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index b62d9b33f8..5d55e3c754 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -3,7 +3,6 @@ package com.blankj.utilcode.pkg.feature.toast
import android.content.Context
import android.content.Intent
import android.graphics.Color
-import android.support.v4.content.ContextCompat
import android.view.Gravity
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
@@ -11,6 +10,7 @@ import com.blankj.common.item.CommonItemClick
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.pkg.helper.DialogHelper
import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.ColorUtils
import com.blankj.utilcode.util.SpanUtils
import com.blankj.utilcode.util.ToastUtils
@@ -38,30 +38,18 @@ class ToastActivity : CommonActivity() {
override fun bindItems(): MutableList> {
return CollectionUtils.newArrayList(
CommonItemClick(R.string.toast_show_short) {
- resetToast()
Thread(Runnable { ToastUtils.showShort(R.string.toast_short) }).start()
},
CommonItemClick(R.string.toast_show_long) {
- resetToast()
Thread(Runnable { ToastUtils.showLong(R.string.toast_long) }).start()
},
- CommonItemClick(R.string.toast_show_green_font) {
- resetToast()
- ToastUtils.setMsgColor(Color.GREEN)
- ToastUtils.showLong(R.string.toast_green_font)
- },
- CommonItemClick(R.string.toast_show_bg_color) {
- resetToast()
- ToastUtils.setBgColor(ContextCompat.getColor(this, R.color.colorAccent))
- ToastUtils.showLong(R.string.toast_bg_color)
+ CommonItemClick(R.string.toast_show_null) {
+ ToastUtils.showLong(null)
},
- CommonItemClick(R.string.toast_show_bg_resource) {
- resetToast()
- ToastUtils.setBgResource(R.drawable.toast_round_rect)
- ToastUtils.showLong(R.string.toast_custom_bg)
+ CommonItemClick(R.string.toast_show_empty) {
+ ToastUtils.showLong("")
},
CommonItemClick(R.string.toast_show_span) {
- resetToast()
ToastUtils.showLong(
SpanUtils()
.appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
@@ -70,34 +58,40 @@ class ToastActivity : CommonActivity() {
.create()
)
},
- CommonItemClick(R.string.toast_show_custom_view) {
- resetToast()
- Thread(Runnable { CustomToast.showLong(R.string.toast_custom_view) }).start()
+ CommonItemClick(R.string.toast_show_long_string) {
+ ToastUtils.showLong(R.string.toast_long_string)
+ },
+ CommonItemClick(R.string.toast_show_green_font) {
+ ToastUtils.make().setTextColor(Color.GREEN).setDurationIsLong(true).show(R.string.toast_green_font)
+ },
+ CommonItemClick(R.string.toast_show_bg_color) {
+ ToastUtils.make().setBgColor(ColorUtils.getColor(R.color.colorAccent)).show(R.string.toast_bg_color)
+ },
+ CommonItemClick(R.string.toast_show_bg_resource) {
+ ToastUtils.make().setBgResource(R.drawable.toast_round_rect).show(R.string.toast_custom_bg)
+ },
+ CommonItemClick(R.string.toast_show_left_icon) {
+ ToastUtils.make().setLeftIcon(R.mipmap.ic_launcher).show(R.string.toast_show_left_icon)
+ },
+ CommonItemClick(R.string.toast_show_dark_mode) {
+ ToastUtils.make().setTopIcon(R.mipmap.ic_launcher).setMode(ToastUtils.MODE.DARK).show(R.string.toast_show_dark_mode)
},
CommonItemClick(R.string.toast_show_middle) {
- resetToast()
- ToastUtils.setGravity(Gravity.CENTER, 0, 0)
- ToastUtils.showLong(R.string.toast_middle)
+ ToastUtils.make().setGravity(Gravity.CENTER, 0, 0).show(R.string.toast_middle)
+ },
+ CommonItemClick(R.string.toast_show_custom_view) {
+ Thread(Runnable { CustomToast.showLong(R.string.toast_custom_view) }).start()
},
CommonItemClick(R.string.toast_cancel) {
ToastUtils.cancel()
},
CommonItemClick(R.string.toast_show_toast_dialog) {
- resetToast()
DialogHelper.showToastDialog()
+ },
+ CommonItemClick(R.string.toast_show_toast_when_start_activity) {
+ ToastUtils.showLong(R.string.toast_show_toast_when_start_activity)
+ start(this)
}
)
}
-
- override fun onDestroy() {
- resetToast()
- super.onDestroy()
- }
-
- private fun resetToast() {
- ToastUtils.setMsgColor(-0x1000001)
- ToastUtils.setBgColor(-0x1000001)
- ToastUtils.setBgResource(-1)
- ToastUtils.setGravity(-1, -1, -1)
- }
}
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
new file mode 100644
index 0000000000..26d67dda07
--- /dev/null
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
@@ -0,0 +1,63 @@
+package com.blankj.utilcode.pkg.feature.volume
+
+import android.content.Context
+import android.content.Intent
+import android.media.AudioManager
+import android.widget.SeekBar
+import com.blankj.common.activity.CommonActivity
+import com.blankj.common.item.CommonItem
+import com.blankj.common.item.CommonItemSeekBar
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.CollectionUtils
+import com.blankj.utilcode.util.VolumeUtils
+
+/**
+ * ```
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2018/12/29
+ * desc : demo about VibrateUtils
+ * ```
+ */
+class VolumeActivity : CommonActivity() {
+
+ companion object {
+ fun start(context: Context) {
+ val starter = Intent(context, VolumeActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ override fun bindTitleRes(): Int {
+ return R.string.demo_volume
+ }
+
+ override fun bindItems(): MutableList> {
+ return CollectionUtils.newArrayList(
+ getItemSeekBar("Voice Call", AudioManager.STREAM_VOICE_CALL),
+ getItemSeekBar("System", AudioManager.STREAM_SYSTEM),
+ getItemSeekBar("Music", AudioManager.STREAM_MUSIC),
+ getItemSeekBar("Ring", AudioManager.STREAM_RING),
+ getItemSeekBar("Alarm", AudioManager.STREAM_ALARM),
+ getItemSeekBar("Notification", AudioManager.STREAM_NOTIFICATION),
+ getItemSeekBar("Dtmf", AudioManager.STREAM_DTMF)
+ )
+ }
+
+ private fun getItemSeekBar(title: CharSequence, streamType: Int): CommonItemSeekBar {
+ return CommonItemSeekBar(title, VolumeUtils.getMaxVolume(streamType), object : CommonItemSeekBar.ProgressListener() {
+ override fun getCurValue(): Int {
+ return VolumeUtils.getVolume(streamType)
+ }
+
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ VolumeUtils.setVolume(streamType, progress, AudioManager.FLAG_SHOW_UI)
+ }
+ })
+ }
+
+ override fun onResume() {
+ super.onResume()
+ itemsView.updateItems(bindItems())
+ }
+}
diff --git a/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml b/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml
index 807c158b67..d594eb654d 100644
--- a/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml
+++ b/feature/utilcode/pkg/src/main/res/layout/mvp_activity.xml
@@ -14,4 +14,17 @@
android:text="Get Update Msg"
app:layout_constraintTop_toTopOf="parent" />
+
+
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml b/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml
index 84ac729412..414fa48424 100644
--- a/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml
+++ b/feature/utilcode/pkg/src/main/res/values-en-rUS/strings.xml
@@ -3,11 +3,9 @@
Language Demo
- Language
- Language App Context
- Language Activity Context
Apply Simple Chinese
Apply American
+ Apply English
Apply System
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml b/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml
index d1ba24cff1..5cab96988f 100644
--- a/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml
+++ b/feature/utilcode/pkg/src/main/res/values-zh-rCN/strings.xml
@@ -3,11 +3,9 @@
语言例子
- 语言
- App 上下文语言
- Activity 上下文语言
- 应用简体中文
- 应用英语
- 应用系统语言
+ 设置简体中文
+ 设置美语
+ 设置英语
+ 设置系统语言
\ No newline at end of file
diff --git a/feature/utilcode/pkg/src/main/res/values/strings.xml b/feature/utilcode/pkg/src/main/res/values/strings.xml
index 5bea803e40..ed7e15412f 100644
--- a/feature/utilcode/pkg/src/main/res/values/strings.xml
+++ b/feature/utilcode/pkg/src/main/res/values/strings.xml
@@ -9,6 +9,7 @@
BusUtils Demo
CleanUtils Demo
ClickUtils Demo
+ ClipboardUtils Demo
CrashUtils Demo
DeviceUtils Demo
FileUtils Demo
@@ -41,6 +42,7 @@
UiMessage Demo
TransActivity Demo
VibrateUtils Demo
+ VolumeUtils Demo
Shared Element
@@ -227,18 +229,19 @@
Close Dialog
- Language
- Language App Context
- Language Activity Context
+ Relaunch App
Apply Simple Chinese
Apply American
+ Apply English
Apply System
Log Switch
- Console Switch
+ Console Switch
+ Console Listener Switch
Head Switch
File Switch
+ File Listener Switch
Border Switch
Single Tag Switch
Log With No Tag
@@ -325,15 +328,22 @@
Show Short
Show Long
+ Show Null
+ Show Empty
Show Green Font
Show Bg Color
Show Bg Resource
Show Span
+ Show Left Icon
+ Show Dark Mode
+ Show Long String
+ A toast is a view containing a quick little message for the user. The ToastUtils class helps you create and show those.
Show Custom View
Custom View
Show Middle
Cancel
Show Toast Dialog
+ Show Toast When Start Activity
Short
Long
Green Font
diff --git a/lib/base/src/main/java/com/blankj/base/BaseApplication.java b/lib/base/src/main/java/com/blankj/base/BaseApplication.java
index aedea57cb4..da049b589c 100644
--- a/lib/base/src/main/java/com/blankj/base/BaseApplication.java
+++ b/lib/base/src/main/java/com/blankj/base/BaseApplication.java
@@ -74,15 +74,16 @@ public String format(ArrayList arrayList) {
return "LogUtils Formatter ArrayList { " + arrayList.toString() + " }";
}
})
- .setFileWriter(null);
+ .addFileExtraHead("ExtraKey", "ExtraValue");
LogUtils.i(config.toString());
}
private void initCrash() {
CrashUtils.init(new CrashUtils.OnCrashListener() {
@Override
- public void onCrash(String crashInfo, Throwable e) {
- LogUtils.e(crashInfo);
+ public void onCrash(CrashUtils.CrashInfo crashInfo) {
+ crashInfo.addExtraHead("extraKey", "extraValue");
+ LogUtils.e(crashInfo.toString());
AppUtils.relaunchApp();
}
});
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java b/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
index a067e2aff5..2c6806708a 100644
--- a/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BasePresenter.java
@@ -47,9 +47,9 @@ public M getModel(Class modelClass) {
model.onCreate();
return model;
} catch (IllegalAccessException e) {
- e.printStackTrace();
+ Log.e("BasePresenter", "getModel", e);
} catch (InstantiationException e) {
- e.printStackTrace();
+ Log.e("BasePresenter", "getModel", e);
}
return null;
}
diff --git a/lib/common/src/main/java/com/blankj/common/activity/CommonActivity.java b/lib/common/src/main/java/com/blankj/common/activity/CommonActivity.java
index e7e4c0475d..6a58dfea04 100644
--- a/lib/common/src/main/java/com/blankj/common/activity/CommonActivity.java
+++ b/lib/common/src/main/java/com/blankj/common/activity/CommonActivity.java
@@ -1,5 +1,6 @@
package com.blankj.common.activity;
+import android.content.Context;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
@@ -20,6 +21,7 @@
import com.blankj.common.dialog.CommonDialogLoading;
import com.blankj.common.item.CommonItem;
import com.blankj.swipepanel.SwipePanel;
+import com.blankj.utilcode.util.LanguageUtils;
import com.blankj.utilcode.util.SizeUtils;
import java.util.List;
@@ -42,6 +44,11 @@ public abstract class CommonActivity extends BaseActivity {
public View commonContentView;
+// @Override
+// protected void attachBaseContext(Context newBase) {
+// super.attachBaseContext(LanguageUtils.attachBaseContext(newBase));
+// }
+
///////////////////////////////////////////////////////////////////////////
// title view
///////////////////////////////////////////////////////////////////////////
diff --git a/lib/common/src/main/java/com/blankj/common/helper/PermissionHelper.kt b/lib/common/src/main/java/com/blankj/common/helper/PermissionHelper.kt
index 00ac76df68..1df23cb1a4 100644
--- a/lib/common/src/main/java/com/blankj/common/helper/PermissionHelper.kt
+++ b/lib/common/src/main/java/com/blankj/common/helper/PermissionHelper.kt
@@ -19,7 +19,7 @@ import com.blankj.utilcode.util.*
object PermissionHelper {
fun request(context: Context, callback: PermissionUtils.SimpleCallback,
- @PermissionConstants.Permission vararg permissions: String) {
+ @PermissionConstants.PermissionGroup vararg permissions: String) {
PermissionUtils.permission(*permissions)
.rationale { activity, shouldRequest -> showRationaleDialog(activity, shouldRequest) }
.callback(object : PermissionUtils.SingleCallback {
@@ -68,6 +68,20 @@ object PermissionHelper {
.show()
}
+ fun showExplainDialog(context: Context, denied: List, shouldRequest: PermissionUtils.OnExplainListener.ShouldRequest) {
+ CommonDialogContent().init(context,
+ StringUtils.getString(android.R.string.dialog_alert_title),
+ "We needs the permissions of $denied to test the utils of permission.",
+ Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener {
+ shouldRequest.start(true)
+ }),
+ Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener {
+ ToastUtils.showShort("request failed.")
+ shouldRequest.start(false)
+ }))
+ .show()
+ }
+
fun showOpenAppSettingDialog(context: Context) {
CommonDialogContent().init(context,
StringUtils.getString(android.R.string.dialog_alert_title),
diff --git a/lib/common/src/main/java/com/blankj/common/item/CommonItemSeekBar.java b/lib/common/src/main/java/com/blankj/common/item/CommonItemSeekBar.java
index 2629e3d2d5..c68db9dc9f 100644
--- a/lib/common/src/main/java/com/blankj/common/item/CommonItemSeekBar.java
+++ b/lib/common/src/main/java/com/blankj/common/item/CommonItemSeekBar.java
@@ -21,22 +21,22 @@
*/
public class CommonItemSeekBar extends CommonItem {
- private CharSequence mTitle;
- private CharSequence mContent;
- private int mMaxProgress;
- private int mCurProgress;
- private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener;
-
- public CommonItemSeekBar(@StringRes int title, int maxProgress, int curProgress, @NonNull SeekBar.OnSeekBarChangeListener itemClickListener) {
- this(StringUtils.getString(title), maxProgress, curProgress, itemClickListener);
+ private CharSequence mTitle;
+ private CharSequence mContent;
+ private int mMaxProgress;
+ private int mCurProgress;
+ private ProgressListener mProgressListener;
+
+ public CommonItemSeekBar(@StringRes int title, int maxProgress, @NonNull ProgressListener listener) {
+ this(StringUtils.getString(title), maxProgress, listener);
}
- public CommonItemSeekBar(@NonNull CharSequence title, int maxProgress, int curProgress, @NonNull SeekBar.OnSeekBarChangeListener itemClickListener) {
+ public CommonItemSeekBar(@NonNull CharSequence title, int maxProgress, @NonNull ProgressListener listener) {
super(R.layout.common_item_title_seekbar);
mTitle = title;
mMaxProgress = maxProgress;
- mCurProgress = curProgress;
- mOnSeekBarChangeListener = itemClickListener;
+ mCurProgress = listener.getCurValue();
+ mProgressListener = listener;
mContent = String.valueOf(mCurProgress);
}
@@ -62,19 +62,21 @@ public boolean onTouch(View v, MotionEvent event) {
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);
- mCurProgress = progress;
- contentTv.setText(String.valueOf(progress));
+ mProgressListener.onProgressChanged(seekBar, progress, fromUser);
+ int curValue = mProgressListener.getCurValue();
+ mCurProgress = curValue;
+ contentTv.setText(String.valueOf(curValue));
+ seekBar.setProgress(curValue);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
- mOnSeekBarChangeListener.onStartTrackingTouch(seekBar);
+ mProgressListener.onStartTrackingTouch(seekBar);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
- mOnSeekBarChangeListener.onStartTrackingTouch(seekBar);
+ mProgressListener.onStopTrackingTouch(seekBar);
}
});
}
@@ -87,4 +89,17 @@ public void setTitle(CharSequence title) {
public CharSequence getTitle() {
return mTitle;
}
+
+ public static abstract class ProgressListener implements SeekBar.OnSeekBarChangeListener {
+
+ public abstract int getCurValue();
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+ }
}
diff --git a/lib/subutil/README-CN.md b/lib/subutil/README-CN.md
index 2a8b920cf8..a712609087 100644
--- a/lib/subutil/README-CN.md
+++ b/lib/subutil/README-CN.md
@@ -18,16 +18,6 @@ isRegisteredBatteryStatusChangedListener: 判断是否注册电池状态改变
unregisterBatteryStatusChangedListener : 注销电池状态改变监听器
```
-* ### 剪贴板相关 -> [ClipboardUtils.java][clipboard.java] -> [Test][clipboard.test]
-```
-copyText : 复制文本到剪贴板
-getText : 获取剪贴板的文本
-copyUri : 复制 uri 到剪贴板
-getUri : 获取剪贴板的 uri
-copyIntent: 复制意图到剪贴板
-getIntent : 获取剪贴板的意图
-```
-
* ### 坐标转换相关 -> [CoordinateUtils.java][coordinate.java] -> [Test][coordinate.test]
```
bd09ToGcj02 : BD09 坐标转 GCJ02 坐标
@@ -91,9 +81,6 @@ getSurnameFirstLetter: 根据名字获取姓氏的首字母
[battery.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
[battery.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
-[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
-[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
-
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
diff --git a/lib/subutil/README.md b/lib/subutil/README.md
index 0ebcf92e8b..f25b631c1b 100644
--- a/lib/subutil/README.md
+++ b/lib/subutil/README.md
@@ -18,16 +18,6 @@ isRegisteredBatteryStatusChangedListener
unregisterBatteryStatusChangedListener
```
-* ### About Clipboard -> [ClipboardUtils.java][clipboard.java] -> [Test][clipboard.test]
-```
-copyText
-getText
-copyUri
-getUri
-copyIntent
-getIntent
-```
-
* ### About Coordinate -> [CoordinateUtils.java][coordinate.java] -> [Test][coordinate.test]
```
bd09ToGcj02
@@ -91,9 +81,6 @@ getSurnameFirstLetter
[battery.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/BatteryUtils.java
[battery.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/battery/BatteryActivity.kt
-[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
-[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
-
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
diff --git a/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java b/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
index 61b497a462..92aa89be0b 100644
--- a/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
+++ b/lib/subutil/src/main/java/com/blankj/subutil/util/AppStoreUtils.java
@@ -1,13 +1,12 @@
package com.blankj.subutil.util;
import android.content.Intent;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
-import android.text.TextUtils;
import android.util.Log;
+import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.RomUtils;
import com.blankj.utilcode.util.Utils;
@@ -88,7 +87,7 @@ public static Intent getAppStoreIntent(final String packageName, boolean isInclu
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.packageName;
if (!GOOGLE_PLAY_APP_STORE_PACKAGE_NAME.equals(pkgName)) {
- if (isAppSystem(pkgName)) {
+ if (AppUtils.isAppSystem(pkgName)) {
intent.setPackage(pkgName);
return intent;
}
@@ -105,25 +104,6 @@ public static Intent getAppStoreIntent(final String packageName, boolean isInclu
return intent;
}
- private static boolean go2NormalAppStore(String packageName) {
- Intent intent = getNormalAppStoreIntent();
- if (intent == null) return false;
- intent.setData(Uri.parse("market://details?id=" + packageName));
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- Utils.getApp().startActivity(intent);
- return true;
- }
-
- private static Intent getNormalAppStoreIntent() {
- Intent intent = new Intent();
- Uri uri = Uri.parse("market://details?id=" + Utils.getApp().getPackageName());
- intent.setData(uri);
- if (getAvailableIntentSize(intent) > 0) {
- return intent;
- }
- return null;
- }
-
private static Intent getSamsungAppStoreIntent(final String packageName) {
Intent intent = new Intent();
intent.setClassName("com.sec.android.app.samsungapps", "com.sec.android.app.samsungapps.Main");
@@ -152,16 +132,4 @@ private static int getAvailableIntentSize(final Intent intent) {
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
.size();
}
-
- private static boolean isAppSystem(final String packageName) {
- if (TextUtils.isEmpty(packageName)) return false;
- try {
- PackageManager pm = Utils.getApp().getPackageManager();
- ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
- return ai != null && (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- return false;
- }
- }
}
diff --git a/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java b/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
deleted file mode 100644
index 13f1061d7e..0000000000
--- a/lib/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.blankj.subutil.util;
-
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-
-import com.blankj.utilcode.util.Utils;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/25
- * desc : 剪贴板相关工具类
- *
- */
-public final class ClipboardUtils {
-
- private ClipboardUtils() {
- throw new UnsupportedOperationException("u can't instantiate me...");
- }
-
- /**
- * 复制文本到剪贴板
- *
- * @param text 文本
- */
- public static void copyText(final CharSequence text) {
- ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
- cm.setPrimaryClip(ClipData.newPlainText("text", text));
- }
-
- /**
- * 获取剪贴板的文本
- *
- * @return 剪贴板的文本
- */
- public static CharSequence getText() {
- ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = cm.getPrimaryClip();
- if (clip != null && clip.getItemCount() > 0) {
- return clip.getItemAt(0).coerceToText(Utils.getApp());
- }
- return null;
- }
-
- /**
- * 复制uri到剪贴板
- *
- * @param uri uri
- */
- public static void copyUri(final Uri uri) {
- ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
- cm.setPrimaryClip(ClipData.newUri(Utils.getApp().getContentResolver(), "uri", uri));
- }
-
- /**
- * 获取剪贴板的uri
- *
- * @return 剪贴板的uri
- */
- public static Uri getUri() {
- ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = cm.getPrimaryClip();
- if (clip != null && clip.getItemCount() > 0) {
- return clip.getItemAt(0).getUri();
- }
- return null;
- }
-
- /**
- * 复制意图到剪贴板
- *
- * @param intent 意图
- */
- public static void copyIntent(final Intent intent) {
- ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
- cm.setPrimaryClip(ClipData.newIntent("intent", intent));
- }
-
- /**
- * 获取剪贴板的意图
- *
- * @return 剪贴板的意图
- */
- public static Intent getIntent() {
- ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = cm.getPrimaryClip();
- if (clip != null && clip.getItemCount() > 0) {
- return clip.getItemAt(0).getIntent();
- }
- return null;
- }
-}
diff --git a/lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java b/lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
index 8469d47a14..a2670674b4 100644
--- a/lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
+++ b/lib/subutil/src/main/java/com/blankj/subutil/util/DangerousUtils.java
@@ -325,7 +325,7 @@ public static boolean setMobileDataEnabled(final boolean enabled) {
setDataEnabledMethod.invoke(tm, enabled);
return true;
} catch (Exception e) {
- Log.e("NetworkUtils", "setMobileDataEnabled: ", e);
+ e.printStackTrace();
}
return false;
}
diff --git a/lib/subutil/src/main/java/com/blankj/subutil/util/HttpsUtil.java b/lib/subutil/src/main/java/com/blankj/subutil/util/HttpsUtil.java
index 24356f5187..e0acb09850 100644
--- a/lib/subutil/src/main/java/com/blankj/subutil/util/HttpsUtil.java
+++ b/lib/subutil/src/main/java/com/blankj/subutil/util/HttpsUtil.java
@@ -8,7 +8,11 @@
import java.util.Scanner;
/**
- * Create by MilkZS on 2019/1/9 13:36
+ *
+ * author: MilkZS
+ * time : 2019/01/09
+ * desc : https 工具类
+ *
*/
public final class HttpsUtil {
diff --git a/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java b/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
deleted file mode 100644
index e1d550fb5c..0000000000
--- a/lib/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.blankj.subutil.util;
-
-import android.content.Intent;
-import android.net.Uri;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
-import static org.junit.Assert.assertEquals;
-
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/09/26
- * desc : ClipboardUtils 单元测试
- *
- */
-@RunWith(RobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class ClipboardUtilsTest {
-
- static {
- TestUtils.init();
- }
-
- @Test
- public void testText() throws Exception {
- ClipboardUtils.copyText("test");
- assertEquals("test", ClipboardUtils.getText());
- }
-
- @Test
- public void testUri() throws Exception {
- ClipboardUtils.copyUri(Uri.parse("http://www.blankj.com/"));
- System.out.println((ClipboardUtils.getUri()));
- }
-
- @Test
- public void testIntent() throws Exception {
- Intent intent = new Intent();
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setAction(Intent.ACTION_DIAL);
- ClipboardUtils.copyIntent(intent);
- System.out.println(ClipboardUtils.getText());
- }
-}
\ No newline at end of file
diff --git a/lib/subutil/src/test/java/com/blankj/subutil/util/TestUtils.java b/lib/subutil/src/test/java/com/blankj/subutil/util/TestUtils.java
deleted file mode 100644
index 78422556ed..0000000000
--- a/lib/subutil/src/test/java/com/blankj/subutil/util/TestUtils.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.blankj.subutil.util;
-
-import com.blankj.utilcode.util.Utils;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-/**
- *
- * author: Blankj
- * blog : http://blankj.com
- * time : 2016/08/21
- * desc : utils about test
- *
- */
-@RunWith(RobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class TestUtils {
-
- public static void init() {
- Utils.init(RuntimeEnvironment.application);
- }
-
- @Test
- public void test() throws Exception {
-
- }
-}
\ No newline at end of file
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index 3f5cd01a41..45928eec20 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -2,10 +2,10 @@
Gradle:
```groovy
-implementation 'com.blankj:utilcode:1.29.0'
+implementation 'com.blankj:utilcode:1.30.0'
// if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.29.0'
+implementation 'com.blankj:utilcodex:1.30.0'
```
@@ -13,7 +13,7 @@ implementation 'com.blankj:utilcodex:1.29.0'
* ### Activity 相关 -> [ActivityUtils.java][activity.java] -> [Demo][activity.demo]
```
-addActivityLifecycleCallbacks : 新增 Activity 生命周期监听
+addActivityLifecycleCallbacks : 增加 Activity 生命周期监听
removeActivityLifecycleCallbacks: 移除 Activity 生命周期监听
getAliveActivityByContext : 根据上下文获取存活的 Activity
getActivityByContext : 根据上下文获取 Activity
@@ -280,6 +280,18 @@ ClickUtils#OnDebouncingClickListener: 防抖点击监听器
ClickUtils#OnMultiClickListener : 连续点击监听器
```
+* ### 剪贴板相关 -> [ClipboardUtils.java][clipboard.java] -> [Demo][clipboard.demo]
+```
+copyText : 复制文本到剪贴板
+getText : 获取剪贴板的文本
+copyUri : 复制 uri 到剪贴板
+getUri : 获取剪贴板的 uri
+copyIntent : 复制意图到剪贴板
+getIntent : 获取剪贴板的意图
+addChangedListener : 增加剪贴板监听器
+removeChangedListener: 移除剪贴板监听器
+```
+
* ### 克隆相关 -> [CloneUtils.java][clone.java] -> [Test][clone.test]
```
deepClone: 深度克隆
@@ -319,8 +331,8 @@ transform : 对原集合进行转变
collect : 转变为新的集合
countMatches : 查找到匹配的元素个数
exists : 判断集合是否存在符合条件的元素
-addIgnoreNull : 新增元素如果不为空
-addAll : 新增多个元素
+addIgnoreNull : 增加元素如果不为空
+addAll : 增加多个元素
get : 获取集合元素
size : 获取集合个数
sizeIsEmpty : 判断个数是否为零
@@ -376,7 +388,10 @@ sp2px, px2sp : sp 与 px 互转
* ### 崩溃相关 -> [CrashUtils.java][crash.java]
```
-init: 初始化
+init : 初始化
+CrashInfo.addExtraHead: 增加额外头部
+CrashInfo.getThrowable: 获取崩溃异常
+CrashInfo.toString : 获取崩溃信息
```
* ### 防抖相关 -> [DebouncingUtils.java][debouncing.java]
@@ -500,7 +515,7 @@ getFsAvailableSize : 获取文件系统可用大小
* ### Fragment 相关 -> [FragmentUtils.java][fragment.java] -> [Demo][fragment.demo]
```
-add : 新增 fragment
+add : 增加 fragment
show : 显示 fragment
hide : 隐藏 fragment
showHide : 先显示后隐藏 fragment
@@ -565,6 +580,7 @@ fastBlur : 快速模糊
renderScriptBlur : renderScript 模糊图片
stackBlur : stack 模糊图片
save : 保存图片
+save2Album : 保存图片到相册
isImage : 根据文件名判断文件是否为图片
getImageType : 获取图片类型
compressByScale : 按缩放压缩
@@ -603,47 +619,57 @@ clickBlankArea2HideSoftInput : 点击屏幕空白区域隐藏软键盘
* ### 语言相关 -> [LanguageUtils.java][language.java] -> [Demo][language.demo]
```
-applySystemLanguage : 应用系统语言
-applyLanguage : 应用语言
-isAppliedSystemLanguage: 判断是否使用系统语言
-isAppliedLanguage : 判断是否使用某语言
-getCurrentLocale : 获取当前语言
+applySystemLanguage : 设置系统语言
+applyLanguage : 设置语言
+isAppliedLanguage : 是否设置了语言
+getAppliedLanguage : 获取设置的语言
+getContextLanguage : 获取上下文的语言
+getAppContextLanguage : 获取应用上下文的语言
+getSystemLanguage : 获取系统的语言
+updateAppContextLanguage: 更新应用上下文语言
+attachBaseContext : 如果设置语言无效则在 Activity#attachBaseContext 调用它
```
* ### 日志相关 -> [LogUtils.java][log.java] -> [Demo][log.demo]
```
-getConfig : 获取 log 配置
-Config.setLogSwitch : 设置 log 总开关
-Config.setConsoleSwitch : 设置 log 控制台开关
-Config.setGlobalTag : 设置 log 全局 tag
-Config.setLogHeadSwitch : 设置 log 头部信息开关
-Config.setLog2FileSwitch : 设置 log 文件开关
-Config.setDir : 设置 log 文件存储目录
-Config.setFilePrefix : 设置 log 文件前缀
-Config.setBorderSwitch : 设置 log 边框开关
-Config.setSingleTagSwitch: 设置 log 单一 tag 开关(为美化 AS 3.1 的 Logcat)
-Config.setConsoleFilter : 设置 log 控制台过滤器
-Config.setFileFilter : 设置 log 文件过滤器
-Config.setStackDeep : 设置 log 栈深度
-Config.setStackOffset : 设置 log 栈偏移
-Config.setSaveDays : 设置 log 可保留天数
-Config.addFormatter : 新增 log 格式化器
-log : 自定义 tag 的 type 日志
-v : tag 为类名的 Verbose 日志
-vTag : 自定义 tag 的 Verbose 日志
-d : tag 为类名的 Debug 日志
-dTag : 自定义 tag 的 Debug 日志
-i : tag 为类名的 Info 日志
-iTag : 自定义 tag 的 Info 日志
-w : tag 为类名的 Warn 日志
-wTag : 自定义 tag 的 Warn 日志
-e : tag 为类名的 Error 日志
-eTag : 自定义 tag 的 Error 日志
-a : tag 为类名的 Assert 日志
-aTag : 自定义 tag 的 Assert 日志
-file : log 到文件
-json : log 字符串之 json
-xml : log 字符串之 xml
+getConfig : 获取 log 配置
+Config.setLogSwitch : 设置 log 总开关
+Config.setConsoleSwitch : 设置 log 控制台开关
+Config.setGlobalTag : 设置 log 全局 tag
+Config.setLogHeadSwitch : 设置 log 头部信息开关
+Config.setLog2FileSwitch : 设置 log 文件开关
+Config.setDir : 设置 log 文件存储目录
+Config.setFilePrefix : 设置 log 文件前缀
+Config.setBorderSwitch : 设置 log 边框开关
+Config.setSingleTagSwitch : 设置 log 单一 tag 开关(为美化 AS 3.1 的 Logcat)
+Config.setConsoleFilter : 设置 log 控制台过滤器
+Config.setFileFilter : 设置 log 文件过滤器
+Config.setStackDeep : 设置 log 栈深度
+Config.setStackOffset : 设置 log 栈偏移
+Config.setSaveDays : 设置 log 可保留天数
+Config.addFormatter : 增加 log 格式化器
+Config.setFileWriter : 设置文件写入器
+Config.setOnConsoleOutputListener: 设置控制台输出监听器
+Config.setOnFileOutputListener : 设置文件输出监听器
+Config.addFileExtraHead : 增加 log 文件头部
+log : 自定义 tag 的 type 日志
+v : tag 为类名的 Verbose 日志
+vTag : 自定义 tag 的 Verbose 日志
+d : tag 为类名的 Debug 日志
+dTag : 自定义 tag 的 Debug 日志
+i : tag 为类名的 Info 日志
+iTag : 自定义 tag 的 Info 日志
+w : tag 为类名的 Warn 日志
+wTag : 自定义 tag 的 Warn 日志
+e : tag 为类名的 Error 日志
+eTag : 自定义 tag 的 Error 日志
+a : tag 为类名的 Assert 日志
+aTag : 自定义 tag 的 Assert 日志
+file : log 到文件
+json : log 字符串之 json
+xml : log 字符串之 xml
+getCurrentLogFilePath : 获取当前日志文件路径
+getLogFiles : 获取所有日志
```
* ### Map 相关 -> [MapUtils.java][map.java] -> [Test][map.test]
@@ -770,6 +796,13 @@ getCachePathExternalFirst : 优先获取外部缓存路径
* ### 权限相关 -> [PermissionUtils.java][permission.java] -> [Demo][permission.demo]
```
+permission : 设置请求权限
+permissionGroup : 设置请求权限组
+permission.explain : 设置权限请求前的解释
+permission.rationale : 设置拒绝权限后再次请求的回调接口
+permission.callback : 设置回调
+permission.theme : 设置主题
+permission.request : 开始请求
getPermissions : 获取应用权限
isGranted : 判断权限是否被授予
isGrantedWriteSettings : 判断修改系统权限是否被授予
@@ -777,11 +810,6 @@ requestWriteSettings : 申请修改系统权限
isGrantedDrawOverlays : 判断悬浮窗权限是否被授予
requestDrawOverlays : 申请悬浮窗权限
launchAppDetailsSettings: 打开应用具体设置
-permission : 设置请求权限
-rationale : 设置拒绝权限后再次请求的回调接口
-callback : 设置回调
-theme : 设置主题
-request : 开始请求
```
* ### 手机相关 -> [PhoneUtils.java][phone.java] -> [Demo][phone.demo]
@@ -1067,6 +1095,7 @@ toDBC : 转化为半角字符
toSBC : 转化为全角字符
getString : 获取字符资源
getStringArray : 获取字符数组资源
+format : 格式化字符串
```
* ### 线程相关 -> [ThreadUtils.java][thread.java] -> [Test][thread.test]
@@ -1138,16 +1167,23 @@ getZodiac : 获取星座
* ### 吐司相关 -> [ToastUtils.java][toast.java] -> [Demo][toast.demo]
```
-setGravity : 设置吐司位置
-setBgColor : 设置背景颜色
-setBgResource : 设置背景资源
-setMsgColor : 设置消息颜色
-setMsgTextSize : 设置消息字体大小
-showShort : 显示短时吐司
-showLong : 显示长时吐司
-showCustomShort: 显示短时自定义吐司
-showCustomLong : 显示长时自定义吐司
-cancel : 取消吐司显示
+make : 制作吐司
+make.setMode : 设置模式
+make.setGravity : 设置位置
+make.setBgColor : 设置背景颜色
+make.setBgResource : 设置背景资源
+make.setTextColor : 设置字体颜色
+make.setTextSize : 设置字体大小
+make.setDurationIsLong : 设置是否长时间显示
+make.setLeftIcon : 设置左侧图标
+make.setTopIcon : 设置顶部图标
+make.setRightIcon : 设置右侧图标
+make.setBottomIcon : 设置底部图标
+make.setNotUseSystemToast: 设置不使用系统吐司
+make.show : 显示吐司
+showShort : 显示短时吐司
+showLong : 显示长时吐司
+cancel : 取消吐司显示
```
* ### 触摸相关 -> [TouchUtils.java][touch.java]
@@ -1158,7 +1194,7 @@ setOnTouchListener: 设置触摸事件
* ### UI 消息相关 -> [UiMessageUtils.java][uiMessage.java] -> [Demo][uiMessage.demo]
```
send : 发送消息
-addListener : 新增消息监听器
+addListener : 增加消息监听器
removeListener: 移除消息监听器
```
@@ -1193,6 +1229,15 @@ runOnUiThread : 在 UI 线程运行
runOnUiThreadDelayed: 在 UI 线程延迟运行
isLayoutRtl : 布局是否从右到左
fixScrollViewTopping: 修复 ScrollView 置顶问题
+layoutId2View : layoutId 转为 view
+```
+
+* ### 音量相关 -> [VolumeUtils.java][volume.java]
+```
+getVolume : 获取音量
+setVolume : 设置音量
+getMaxVolume: 获取最大音量
+getMinVolume: 获取最小音量
```
* ### 压缩相关 -> [ZipUtils.java][zip.java] -> [Test][zip.test]
@@ -1262,6 +1307,9 @@ getComments : 获取压缩文件中的注释链表
[click.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java
[click.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt
+[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
+[clipboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
+
[clone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/CloneUtils.java
[clone.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/CloneUtilsTest.java
@@ -1417,5 +1465,8 @@ getComments : 获取压缩文件中的注释链表
[view.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
+[volume.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VolumeUtils.java
+[volume.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
+
[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index e29bf3dae1..27bb7c4990 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -2,10 +2,10 @@
Gradle:
```groovy
-implementation 'com.blankj:utilcode:1.29.0'
+implementation 'com.blankj:utilcode:1.30.0'
// if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.29.0'
+implementation 'com.blankj:utilcodex:1.30.0'
```
@@ -280,6 +280,18 @@ ClickUtils#OnDebouncingClickListener
ClickUtils#OnMultiClickListener
```
+* ### About Clipboard -> [ClipboardUtils.java][clipboard.java] -> [Demo][clipboard.demo]
+```
+copyText
+getText
+copyUri
+getUri
+copyIntent
+getIntent
+addChangedListener
+removeChangedListener
+```
+
* ### About Clone -> [CloneUtils.java][clone.java] -> [Test][clone.test]
```
deepClone
@@ -342,6 +354,7 @@ string2Int
int2RgbString
int2ArgbString
getRandomColor
+isLightColor
```
* ### About Convert -> [ConvertUtils.java][convert.java] -> [Test][convert.test]
@@ -376,6 +389,14 @@ sp2px, px2sp
* ### About Crash -> [CrashUtils.java][crash.java]
```
init
+CrashInfo.addExtraHead
+CrashInfo.getThrowable
+CrashInfo.toString
+```
+
+* ### About Debouncing -> [DebouncingUtils.java][debouncing.java]
+```
+isValid
```
* ### About Device -> [DeviceUtils.java][device.java] -> [Demo][device.demo]
@@ -559,6 +580,7 @@ fastBlur
renderScriptBlur
stackBlur
save
+save2Album
isImage
getImageType
compressByScale
@@ -576,6 +598,7 @@ getLaunchAppIntent
getLaunchAppDetailsSettingsIntent
getShareTextIntent
getShareImageIntent
+getShareTextImageIntent
getComponentIntent
getShutdownIntent
getCaptureIntent
@@ -598,9 +621,13 @@ clickBlankArea2HideSoftInput
```
applySystemLanguage
applyLanguage
-isAppliedSystemLanguage
isAppliedLanguage
-getCurrentLocale
+getAppliedLanguage
+getContextLanguage
+getAppContextLanguage
+getSystemLanguage
+updateAppContextLanguage
+attachBaseContext
```
* ### About Log -> [LogUtils.java][log.java] -> [Demo][log.demo]
@@ -621,6 +648,10 @@ Config.setStackDeep
Config.setStackOffset
Config.setSaveDays
Config.addFormatter
+Config.setFileWriter
+Config.setOnConsoleOutputListener
+Config.setOnFileOutputListener
+Config.addFileExtraHead
log
v
vTag
@@ -637,6 +668,8 @@ aTag
file
json
xml
+getCurrentLogFilePath
+getLogFiles
```
* ### About Map -> [MapUtils.java][map.java] -> [Test][map.test]
@@ -763,6 +796,13 @@ getCachePathExternalFirst
* ### About Permission -> [PermissionUtils.java][permission.java] -> [Demo][permission.demo]
```
+permission
+permissionGroup
+permission.explain
+permission.rationale
+permission.callback
+permission.theme
+permission.request
getPermissions
isGranted
isGrantedWriteSettings
@@ -770,11 +810,6 @@ requestWriteSettings
isGrantedDrawOverlays
requestDrawOverlays
launchAppDetailsSettings
-permission
-rationale
-callback
-theme
-request
```
* ### About Phone -> [PhoneUtils.java][phone.java] -> [Demo][phone.demo]
@@ -1060,6 +1095,7 @@ toDBC
toSBC
getString
getStringArray
+format
```
* ### About Thread -> [ThreadUtils.java][thread.java] -> [Test][thread.test]
@@ -1131,15 +1167,22 @@ getZodiac
* ### About Toast -> [ToastUtils.java][toast.java] -> [Demo][toast.demo]
```
-setGravity
-setBgColor
-setBgResource
-setMsgColor
-setMsgTextSize
+make
+make.setMode
+make.setGravity
+make.setBgColor
+make.setBgResource
+make.setTextColor
+make.setTextSize
+make.setDurationIsLong
+make.setLeftIcon
+make.setTopIcon
+make.setRightIcon
+make.setBottomIcon
+make.setNotUseSystemToast
+make.show
showShort
showLong
-showCustomShort
-showCustomLong
cancel
```
@@ -1186,6 +1229,15 @@ runOnUiThread
runOnUiThreadDelayed
isLayoutRtl
fixScrollViewTopping
+layoutId2View
+```
+
+* ### About Volume -> [VolumeUtils.java][volume.java]
+```
+getVolume
+setVolume
+getMaxVolume
+getMinVolume
```
* ### About Zip -> [ZipUtils.java][zip.java] -> [Test][zip.test]
@@ -1252,6 +1304,9 @@ getComments
[click.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClickUtils.java
[click.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt
+[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
+[clipboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/clipboard/ClipboardActivity.kt
+
[clone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/CloneUtils.java
[clone.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/CloneUtilsTest.java
@@ -1268,6 +1323,8 @@ getComments
[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+[debouncing.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
+
[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/device/DeviceActivity.kt
@@ -1405,5 +1462,8 @@ getComments
[view.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
+[volume.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VolumeUtils.java
+[volume.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/volume/VolumeActivity.kt
+
[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index ed92d88f0f..671b654bd9 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -20,58 +20,62 @@
@SuppressLint("InlinedApi")
public final class PermissionConstants {
- public static final String CALENDAR = "CALENDAR";
- public static final String CAMERA = "CAMERA";
- public static final String CONTACTS = "CONTACTS";
- public static final String LOCATION = "LOCATION";
- public static final String MICROPHONE = "MICROPHONE";
- public static final String PHONE = "PHONE";
- public static final String SENSORS = "SENSORS";
- public static final String SMS = "SMS";
- public static final String STORAGE = "STORAGE";
+ public static final String CALENDAR = "CALENDAR";
+ public static final String CAMERA = "CAMERA";
+ public static final String CONTACTS = "CONTACTS";
+ public static final String LOCATION = "LOCATION";
+ public static final String MICROPHONE = "MICROPHONE";
+ public static final String PHONE = "PHONE";
+ public static final String SENSORS = "SENSORS";
+ public static final String SMS = "SMS";
+ public static final String STORAGE = "STORAGE";
+ public static final String ACTIVITY_RECOGNITION = "ACTIVITY_RECOGNITION";
- private static final String[] GROUP_CALENDAR = {
+ private static final String[] GROUP_CALENDAR = {
permission.READ_CALENDAR, permission.WRITE_CALENDAR
};
- private static final String[] GROUP_CAMERA = {
+ private static final String[] GROUP_CAMERA = {
permission.CAMERA
};
- private static final String[] GROUP_CONTACTS = {
+ private static final String[] GROUP_CONTACTS = {
permission.READ_CONTACTS, permission.WRITE_CONTACTS, permission.GET_ACCOUNTS
};
- private static final String[] GROUP_LOCATION = {
+ private static final String[] GROUP_LOCATION = {
permission.ACCESS_FINE_LOCATION, permission.ACCESS_COARSE_LOCATION
};
- private static final String[] GROUP_MICROPHONE = {
+ private static final String[] GROUP_MICROPHONE = {
permission.RECORD_AUDIO
};
- private static final String[] GROUP_PHONE = {
+ private static final String[] GROUP_PHONE = {
permission.READ_PHONE_STATE, permission.READ_PHONE_NUMBERS, permission.CALL_PHONE,
permission.READ_CALL_LOG, permission.WRITE_CALL_LOG, permission.ADD_VOICEMAIL,
permission.USE_SIP, permission.PROCESS_OUTGOING_CALLS, permission.ANSWER_PHONE_CALLS
};
- private static final String[] GROUP_PHONE_BELOW_O = {
+ private static final String[] GROUP_PHONE_BELOW_O = {
permission.READ_PHONE_STATE, permission.READ_PHONE_NUMBERS, permission.CALL_PHONE,
permission.READ_CALL_LOG, permission.WRITE_CALL_LOG, permission.ADD_VOICEMAIL,
permission.USE_SIP, permission.PROCESS_OUTGOING_CALLS
};
- private static final String[] GROUP_SENSORS = {
+ private static final String[] GROUP_SENSORS = {
permission.BODY_SENSORS
};
- private static final String[] GROUP_SMS = {
+ private static final String[] GROUP_SMS = {
permission.SEND_SMS, permission.RECEIVE_SMS, permission.READ_SMS,
permission.RECEIVE_WAP_PUSH, permission.RECEIVE_MMS,
};
- private static final String[] GROUP_STORAGE = {
+ private static final String[] GROUP_STORAGE = {
permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE,
};
+ private static final String[] GROUP_ACTIVITY_RECOGNITION = {
+ permission.ACTIVITY_RECOGNITION,
+ };
@StringDef({CALENDAR, CAMERA, CONTACTS, LOCATION, MICROPHONE, PHONE, SENSORS, SMS, STORAGE,})
@Retention(RetentionPolicy.SOURCE)
- public @interface Permission {
+ public @interface PermissionGroup {
}
- public static String[] getPermissions(@Permission final String permission) {
+ public static String[] getPermissions(@PermissionGroup final String permission) {
if (permission == null) return new String[0];
switch (permission) {
case CALENDAR:
@@ -96,6 +100,8 @@ public static String[] getPermissions(@Permission final String permission) {
return GROUP_SMS;
case STORAGE:
return GROUP_STORAGE;
+ case ACTIVITY_RECOGNITION:
+ return GROUP_ACTIVITY_RECOGNITION;
}
return new String[]{permission};
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index 2a5cc80f3c..c4c2e0a8a5 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -39,6 +39,15 @@ private ActivityUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
+ /**
+ * Add callbacks of activity lifecycle.
+ *
+ * @param callbacks The callbacks.
+ */
+ public static void addActivityLifecycleCallbacks(final Utils.ActivityLifecycleCallbacks callbacks) {
+ UtilsBridge.addActivityLifecycleCallbacks(callbacks);
+ }
+
/**
* Add callbacks of activity lifecycle.
*
@@ -50,6 +59,15 @@ public static void addActivityLifecycleCallbacks(final Activity activity,
UtilsBridge.addActivityLifecycleCallbacks(activity, callbacks);
}
+ /**
+ * Remove callbacks of activity lifecycle.
+ *
+ * @param callbacks The callbacks.
+ */
+ public static void removeActivityLifecycleCallbacks(final Utils.ActivityLifecycleCallbacks callbacks) {
+ UtilsBridge.removeActivityLifecycleCallbacks(callbacks);
+ }
+
/**
* Remove callbacks of activity lifecycle.
*
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java
index 5a47ecc9d8..3a5ec1f12b 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java
@@ -2,7 +2,6 @@
import android.content.res.Resources;
import android.util.DisplayMetrics;
-import android.util.Log;
import java.lang.reflect.Field;
import java.util.ArrayList;
@@ -145,7 +144,7 @@ private static void applyMetricsFields(final Resources resources, final float ne
DisplayMetrics dm = (DisplayMetrics) metricsField.get(resources);
if (dm != null) dm.xdpi = newXdpi;
} catch (Exception e) {
- Log.e("AdaptScreenUtils", "applyMetricsFields: " + e);
+ e.printStackTrace();
}
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
index f1a33238ab..9ba8830644 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -1,6 +1,5 @@
package com.blankj.utilcode.util;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
@@ -633,8 +632,8 @@ public static int getAppUid(String pkgName) {
return Utils.getApp().getPackageManager().getApplicationInfo(pkgName, 0).uid;
} catch (Exception e) {
e.printStackTrace();
+ return -1;
}
- return -1;
}
private static String getAppSignatureHash(final String packageName, final String algorithm) {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7f96cce7dd..0092763b12 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -13,6 +13,7 @@
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;
import android.view.KeyCharacterMap;
@@ -56,7 +57,7 @@ private BarUtils() {
* @return the status bar's height
*/
public static int getStatusBarHeight() {
- Resources resources = Resources.getSystem();
+ Resources resources = Utils.getApp().getResources();
int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId);
}
@@ -432,7 +433,7 @@ public static int getActionBarHeight() {
TypedValue tv = new TypedValue();
if (Utils.getApp().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
return TypedValue.complexToDimensionPixelSize(
- tv.data, Resources.getSystem().getDisplayMetrics()
+ tv.data, Utils.getApp().getResources().getDisplayMetrics()
);
}
return 0;
@@ -482,7 +483,7 @@ private static void invokePanels(final String methodName) {
* @return the navigation bar's height
*/
public static int getNavBarHeight() {
- Resources res = Resources.getSystem();
+ Resources res = Utils.getApp().getResources();
int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId != 0) {
return res.getDimensionPixelSize(resourceId);
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
index 87138eada4..adb88cc697 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
@@ -8,7 +8,6 @@
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -31,8 +30,7 @@ public final class BusUtils {
private static final Object NULL = "nULl";
private static final String TAG = "BusUtils";
- private final Map> mTag_BusInfoListMap = new HashMap<>();
-
+ private final Map> mTag_BusInfoListMap = new ConcurrentHashMap<>();
private final Map> mClassName_BusesMap = new ConcurrentHashMap<>();
private final Map> mClassName_TagsMap = new ConcurrentHashMap<>();
private final Map> mClassName_Tag_Arg4StickyMap = new ConcurrentHashMap<>();
@@ -58,7 +56,7 @@ private void registerBus(String tag,
boolean sticky, String threadMode, int priority) {
List busInfoList = mTag_BusInfoListMap.get(tag);
if (busInfoList == null) {
- busInfoList = new ArrayList<>();
+ busInfoList = new CopyOnWriteArrayList<>();
mTag_BusInfoListMap.put(tag, busInfoList);
}
busInfoList.add(new BusInfo(tag, className, funName, paramType, paramName, sticky, threadMode, priority));
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
new file mode 100644
index 0000000000..82127b4847
--- /dev/null
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
@@ -0,0 +1,109 @@
+package com.blankj.utilcode.util;
+
+import android.content.ClipData;
+import android.content.ClipDescription;
+import android.content.ClipboardManager;
+import android.content.Context;
+
+/**
+ *
+ * author: Blankj
+ * blog : http://blankj.com
+ * time : 2016/09/25
+ * desc : utils about clipboard
+ *
+ */
+public final class ClipboardUtils {
+
+ private ClipboardUtils() {
+ throw new UnsupportedOperationException("u can't instantiate me...");
+ }
+
+ /**
+ * Copy the text to clipboard.
+ * The label equals name of package.
+ *
+ * @param text The text.
+ */
+ public static void copyText(final CharSequence text) {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ cm.setPrimaryClip(ClipData.newPlainText(Utils.getApp().getPackageName(), text));
+ }
+
+ /**
+ * Copy the text to clipboard.
+ *
+ * @param label The label.
+ * @param text The text.
+ */
+ public static void copyText(final CharSequence label, final CharSequence text) {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ cm.setPrimaryClip(ClipData.newPlainText(label, text));
+ }
+
+ /**
+ * Clear the clipboard.
+ */
+ public static void clear() {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ cm.setPrimaryClip(ClipData.newPlainText(null, ""));
+ }
+
+ /**
+ * Return the label for clipboard.
+ *
+ * @return the label for clipboard
+ */
+ public static CharSequence getLabel() {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ ClipDescription des = cm.getPrimaryClipDescription();
+ if (des == null) {
+ return "";
+ }
+ CharSequence label = des.getLabel();
+ if (label == null) {
+ return "";
+ }
+ return label;
+ }
+
+ /**
+ * Return the text for clipboard.
+ *
+ * @return the text for clipboard
+ */
+ public static CharSequence getText() {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ ClipData clip = cm.getPrimaryClip();
+ if (clip != null && clip.getItemCount() > 0) {
+ CharSequence text = clip.getItemAt(0).coerceToText(Utils.getApp());
+ if (text != null) {
+ return text;
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Add the clipboard changed listener.
+ */
+ public static void addChangedListener(final ClipboardManager.OnPrimaryClipChangedListener listener) {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ cm.addPrimaryClipChangedListener(listener);
+ }
+
+ /**
+ * Remove the clipboard changed listener.
+ */
+ public static void removeChangedListener(final ClipboardManager.OnPrimaryClipChangedListener listener) {
+ ClipboardManager cm = (ClipboardManager) Utils.getApp().getSystemService(Context.CLIPBOARD_SERVICE);
+ //noinspection ConstantConditions
+ cm.removePrimaryClipChangedListener(listener);
+ }
+}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index dd049e7e77..8154d9e069 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -1,13 +1,13 @@
package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
-import android.os.Build;
import android.support.annotation.NonNull;
import java.io.File;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.Map;
/**
*
@@ -99,24 +99,12 @@ private static UncaughtExceptionHandler getUncaughtExceptionHandler(final String
@Override
public void uncaughtException(@NonNull final Thread t, @NonNull final Throwable e) {
final String time = new SimpleDateFormat("yyyy_MM_dd-HH_mm_ss").format(new Date());
- final StringBuilder sb = new StringBuilder();
- final String head = "************* Log Head ****************" +
- "\nTime Of Crash : " + time +
- "\nDevice Manufacturer: " + Build.MANUFACTURER +
- "\nDevice Model : " + Build.MODEL +
- "\nAndroid Version : " + Build.VERSION.RELEASE +
- "\nAndroid SDK : " + Build.VERSION.SDK_INT +
- "\nApp VersionName : " + UtilsBridge.getAppVersionName() +
- "\nApp VersionCode : " + UtilsBridge.getAppVersionCode() +
- "\n************* Log Head ****************\n\n";
- sb.append(head).append(UtilsBridge.getFullStackTrace(e));
- final String crashInfo = sb.toString();
- final String crashFile = dirPath + time + ".txt";
- UtilsBridge.writeFileFromString(crashFile, crashInfo, true);
-
+ CrashInfo info = new CrashInfo(time, e);
if (onCrashListener != null) {
- onCrashListener.onCrash(crashInfo, e);
+ onCrashListener.onCrash(info);
}
+ final String crashFile = dirPath + time + ".txt";
+ UtilsBridge.writeFileFromString(crashFile, info.toString(), true);
if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null) {
DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(t, e);
@@ -130,6 +118,35 @@ public void uncaughtException(@NonNull final Thread t, @NonNull final Throwable
///////////////////////////////////////////////////////////////////////////
public interface OnCrashListener {
- void onCrash(String crashInfo, Throwable e);
+ void onCrash(CrashInfo crashInfo);
+ }
+
+ public static final class CrashInfo {
+ private UtilsBridge.FileHead mFileHeadProvider;
+ private Throwable mThrowable;
+
+ private CrashInfo(String time, Throwable throwable) {
+ mThrowable = throwable;
+ mFileHeadProvider = new UtilsBridge.FileHead("Crash");
+ mFileHeadProvider.addFirst("Time Of Crash", time);
+ }
+
+ public final void addExtraHead(Map extraHead) {
+ mFileHeadProvider.append(extraHead);
+ }
+
+ public final void addExtraHead(String key, String value) {
+ mFileHeadProvider.append(key, value);
+ }
+
+ public final Throwable getThrowable() {
+ return mThrowable;
+ }
+
+ @Override
+ public String toString() {
+ return mFileHeadProvider.toString() +
+ UtilsBridge.getFullStackTrace(mThrowable);
+ }
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
index faac477b22..c9f2c8ff79 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
@@ -45,9 +45,6 @@ public static boolean isValid(@NonNull final View view) {
* @return {@code true}: yes {@code false}: no
*/
public static boolean isValid(@NonNull final View view, final long duration) {
- if (view == null) {
- throw new IllegalArgumentException("The view is null.");
- }
return isValid(String.valueOf(view.hashCode()), duration);
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
index 40de5ef5bb..933f8e4953 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
@@ -11,17 +11,12 @@
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
-import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
import javax.crypto.Mac;
-import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
@@ -1132,19 +1127,7 @@ private static byte[] rsaTemplate(final byte[] data,
} else {
return cipher.doFinal(data);
}
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
- } catch (BadPaddingException e) {
- e.printStackTrace();
- } catch (IllegalBlockSizeException e) {
- e.printStackTrace();
- } catch (InvalidKeySpecException e) {
- e.printStackTrace();
- } catch (NoSuchProviderException e) {
+ } catch (Exception e) {
e.printStackTrace();
}
return null;
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/FlashlightUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/FlashlightUtils.java
index 1b864f6ef5..e74996d4e4 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/FlashlightUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/FlashlightUtils.java
@@ -65,7 +65,7 @@ public static void setFlashlightStatus(final boolean isOn) {
parameters.setFlashMode(FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
} catch (IOException e) {
- Log.e("FlashlightUtils", "setFlashlightStatusOn: ", e);
+ e.printStackTrace();
}
}
} else {
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 9e27fbde73..242b9dcfd5 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -14,6 +14,7 @@
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
+import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
@@ -39,7 +40,6 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.View;
@@ -191,23 +191,22 @@ public static Bitmap view2Bitmap(final View view) {
view.setWillNotCacheDrawing(false);
Bitmap drawingCache = view.getDrawingCache();
Bitmap bitmap;
- if (null == drawingCache) {
+ if (null == drawingCache || drawingCache.isRecycled()) {
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
drawingCache = view.getDrawingCache();
- if (drawingCache != null) {
- bitmap = Bitmap.createBitmap(drawingCache);
- } else {
- bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
+ if (null == drawingCache || drawingCache.isRecycled()) {
+ bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
+ } else {
+ bitmap = Bitmap.createBitmap(drawingCache);
}
} else {
bitmap = Bitmap.createBitmap(drawingCache);
}
- view.destroyDrawingCache();
view.setWillNotCacheDrawing(willNotCacheDrawing);
view.setDrawingCacheEnabled(drawingCacheEnabled);
return bitmap;
@@ -341,15 +340,7 @@ public static Bitmap getBitmap(final byte[] data,
* @return bitmap
*/
public static Bitmap getBitmap(@DrawableRes final int resId) {
- Drawable drawable = ContextCompat.getDrawable(Utils.getApp(), resId);
- Canvas canvas = new Canvas();
- Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
- drawable.getIntrinsicHeight(),
- Bitmap.Config.ARGB_8888);
- canvas.setBitmap(bitmap);
- drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
- drawable.draw(canvas);
- return bitmap;
+ return BitmapFactory.decodeResource(Utils.getApp().getResources(), resId);
}
/**
@@ -792,11 +783,27 @@ public static Bitmap toRoundCorner(final Bitmap src,
*/
public static Bitmap toRoundCorner(final Bitmap src,
final float radius,
- @IntRange(from = 0) int borderSize,
+ @FloatRange(from = 0) float borderSize,
@ColorInt int borderColor) {
return toRoundCorner(src, radius, borderSize, borderColor, false);
}
+ /**
+ * Return the round corner bitmap.
+ *
+ * @param src The source of bitmap.
+ * @param radii Array of 8 values, 4 pairs of [X,Y] radii
+ * @param borderSize The size of border.
+ * @param borderColor The color of border.
+ * @return the round corner bitmap
+ */
+ public static Bitmap toRoundCorner(final Bitmap src,
+ final float[] radii,
+ @FloatRange(from = 0) float borderSize,
+ @ColorInt int borderColor) {
+ return toRoundCorner(src, radii, borderSize, borderColor, false);
+ }
+
/**
* Return the round corner bitmap.
*
@@ -809,7 +816,26 @@ public static Bitmap toRoundCorner(final Bitmap src,
*/
public static Bitmap toRoundCorner(final Bitmap src,
final float radius,
- @IntRange(from = 0) int borderSize,
+ @FloatRange(from = 0) float borderSize,
+ @ColorInt int borderColor,
+ final boolean recycle) {
+ float[] radii = {radius, radius, radius, radius, radius, radius, radius, radius};
+ return toRoundCorner(src, radii, borderSize, borderColor, recycle);
+ }
+
+ /**
+ * Return the round corner bitmap.
+ *
+ * @param src The source of bitmap.
+ * @param radii Array of 8 values, 4 pairs of [X,Y] radii
+ * @param borderSize The size of border.
+ * @param borderColor The color of border.
+ * @param recycle True to recycle the source of bitmap, false otherwise.
+ * @return the round corner bitmap
+ */
+ public static Bitmap toRoundCorner(final Bitmap src,
+ final float[] radii,
+ @FloatRange(from = 0) float borderSize,
@ColorInt int borderColor,
final boolean recycle) {
if (isEmptyBitmap(src)) return null;
@@ -823,14 +849,16 @@ public static Bitmap toRoundCorner(final Bitmap src,
RectF rectF = new RectF(0, 0, width, height);
float halfBorderSize = borderSize / 2f;
rectF.inset(halfBorderSize, halfBorderSize);
- canvas.drawRoundRect(rectF, radius, radius, paint);
+ Path path = new Path();
+ path.addRoundRect(rectF, radii, Path.Direction.CW);
+ canvas.drawPath(path, paint);
if (borderSize > 0) {
paint.setShader(null);
paint.setColor(borderColor);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(borderSize);
paint.setStrokeCap(Paint.Cap.ROUND);
- canvas.drawRoundRect(rectF, radius, radius, paint);
+ canvas.drawPath(path, paint);
}
if (recycle && !src.isRecycled() && ret != src) src.recycle();
return ret;
@@ -846,12 +874,46 @@ public static Bitmap toRoundCorner(final Bitmap src,
* @return the round corner bitmap with border
*/
public static Bitmap addCornerBorder(final Bitmap src,
- @IntRange(from = 1) final int borderSize,
+ @FloatRange(from = 1) final float borderSize,
@ColorInt final int color,
@FloatRange(from = 0) final float cornerRadius) {
return addBorder(src, borderSize, color, false, cornerRadius, false);
}
+ /**
+ * Return the round corner bitmap with border.
+ *
+ * @param src The source of bitmap.
+ * @param borderSize The size of border.
+ * @param color The color of border.
+ * @param radii Array of 8 values, 4 pairs of [X,Y] radii
+ * @return the round corner bitmap with border
+ */
+ public static Bitmap addCornerBorder(final Bitmap src,
+ @FloatRange(from = 1) final float borderSize,
+ @ColorInt final int color,
+ final float[] radii) {
+ return addBorder(src, borderSize, color, false, radii, false);
+ }
+
+ /**
+ * Return the round corner bitmap with border.
+ *
+ * @param src The source of bitmap.
+ * @param borderSize The size of border.
+ * @param color The color of border.
+ * @param radii Array of 8 values, 4 pairs of [X,Y] radii
+ * @param recycle True to recycle the source of bitmap, false otherwise.
+ * @return the round corner bitmap with border
+ */
+ public static Bitmap addCornerBorder(final Bitmap src,
+ @FloatRange(from = 1) final float borderSize,
+ @ColorInt final int color,
+ final float[] radii,
+ final boolean recycle) {
+ return addBorder(src, borderSize, color, false, radii, recycle);
+ }
+
/**
* Return the round corner bitmap with border.
*
@@ -863,7 +925,7 @@ public static Bitmap addCornerBorder(final Bitmap src,
* @return the round corner bitmap with border
*/
public static Bitmap addCornerBorder(final Bitmap src,
- @IntRange(from = 1) final int borderSize,
+ @FloatRange(from = 1) final float borderSize,
@ColorInt final int color,
@FloatRange(from = 0) final float cornerRadius,
final boolean recycle) {
@@ -879,7 +941,7 @@ public static Bitmap addCornerBorder(final Bitmap src,
* @return the round bitmap with border
*/
public static Bitmap addCircleBorder(final Bitmap src,
- @IntRange(from = 1) final int borderSize,
+ @FloatRange(from = 1) final float borderSize,
@ColorInt final int color) {
return addBorder(src, borderSize, color, true, 0, false);
}
@@ -894,7 +956,7 @@ public static Bitmap addCircleBorder(final Bitmap src,
* @return the round bitmap with border
*/
public static Bitmap addCircleBorder(final Bitmap src,
- @IntRange(from = 1) final int borderSize,
+ @FloatRange(from = 1) final float borderSize,
@ColorInt final int color,
final boolean recycle) {
return addBorder(src, borderSize, color, true, 0, recycle);
@@ -912,11 +974,33 @@ public static Bitmap addCircleBorder(final Bitmap src,
* @return the bitmap with border
*/
private static Bitmap addBorder(final Bitmap src,
- @IntRange(from = 1) final int borderSize,
+ @FloatRange(from = 1) final float borderSize,
@ColorInt final int color,
final boolean isCircle,
final float cornerRadius,
final boolean recycle) {
+ float[] radii = {cornerRadius, cornerRadius, cornerRadius, cornerRadius,
+ cornerRadius, cornerRadius, cornerRadius, cornerRadius};
+ return addBorder(src, borderSize, color, isCircle, radii, recycle);
+ }
+
+ /**
+ * Return the bitmap with border.
+ *
+ * @param src The source of bitmap.
+ * @param borderSize The size of border.
+ * @param color The color of border.
+ * @param isCircle True to draw circle, false to draw corner.
+ * @param radii Array of 8 values, 4 pairs of [X,Y] radii
+ * @param recycle True to recycle the source of bitmap, false otherwise.
+ * @return the bitmap with border
+ */
+ private static Bitmap addBorder(final Bitmap src,
+ @FloatRange(from = 1) final float borderSize,
+ @ColorInt final int color,
+ final boolean isCircle,
+ final float[] radii,
+ final boolean recycle) {
if (isEmptyBitmap(src)) return null;
Bitmap ret = recycle ? src : src.copy(src.getConfig(), true);
int width = ret.getWidth();
@@ -930,10 +1014,12 @@ private static Bitmap addBorder(final Bitmap src,
float radius = Math.min(width, height) / 2f - borderSize / 2f;
canvas.drawCircle(width / 2f, height / 2f, radius, paint);
} else {
- int halfBorderSize = borderSize >> 1;
- RectF rectF = new RectF(halfBorderSize, halfBorderSize,
- width - halfBorderSize, height - halfBorderSize);
- canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint);
+ RectF rectF = new RectF(0, 0, width, height);
+ float halfBorderSize = borderSize / 2f;
+ rectF.inset(halfBorderSize, halfBorderSize);
+ Path path = new Path();
+ path.addRoundRect(rectF, radii, Path.Direction.CW);
+ canvas.drawPath(path, paint);
}
return ret;
}
@@ -1659,12 +1745,23 @@ public static boolean save(final Bitmap src,
return ret;
}
+ /**
+ * @param src The source of bitmap.
+ * @param format The format of the image.
+ * @return the file if save success, otherwise return null.
+ */
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format) {
return save2Album(src, format, 100, false);
}
+ /**
+ * @param src The source of bitmap.
+ * @param format The format of the image.
+ * @param recycle True to recycle the source of bitmap, false otherwise.
+ * @return the file if save success, otherwise return null.
+ */
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format,
@@ -1672,6 +1769,15 @@ public static File save2Album(final Bitmap src,
return save2Album(src, format, 100, recycle);
}
+ /**
+ * @param src The source of bitmap.
+ * @param format The format of the image.
+ * @param quality Hint to the compressor, 0-100. 0 meaning compress for
+ * small size, 100 meaning compress for max quality. Some
+ * formats, like PNG which is lossless, will ignore the
+ * quality setting
+ * @return the file if save success, otherwise return null.
+ */
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format,
@@ -1679,6 +1785,16 @@ public static File save2Album(final Bitmap src,
return save2Album(src, format, quality, false);
}
+ /**
+ * @param src The source of bitmap.
+ * @param format The format of the image.
+ * @param quality Hint to the compressor, 0-100. 0 meaning compress for
+ * small size, 100 meaning compress for max quality. Some
+ * formats, like PNG which is lossless, will ignore the
+ * quality setting
+ * @param recycle True to recycle the source of bitmap, false otherwise.
+ * @return the file if save success, otherwise return null.
+ */
@Nullable
public static File save2Album(final Bitmap src,
final CompressFormat format,
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/JsonUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/JsonUtils.java
index 5945b05807..ea40ac3162 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/JsonUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/JsonUtils.java
@@ -1,7 +1,5 @@
package com.blankj.utilcode.util;
-import android.util.Log;
-
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -191,7 +189,7 @@ private static T getValueByType(final JSONObject jsonObject,
//noinspection unchecked
return (T) ret;
} catch (JSONException e) {
- Log.e("JsonUtils", "getValueByType: ", e);
+ e.printStackTrace();
return defaultValue;
}
}
@@ -207,7 +205,7 @@ private static T getValueByType(final String json,
try {
return getValueByType(new JSONObject(json), key, defaultValue, type);
} catch (JSONException e) {
- Log.e("JsonUtils", "getValueByType: ", e);
+ e.printStackTrace();
return defaultValue;
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
index 38d08eff2d..7f95fdee75 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
@@ -143,7 +143,7 @@ public static void hideSoftInput(@NonNull final View view) {
* @param activity The activity.
*/
public static void hideSoftInputByToggle(final Activity activity) {
- long nowMillis = SystemClock.uptimeMillis();
+ long nowMillis = SystemClock.elapsedRealtime();
long delta = nowMillis - millis;
if (Math.abs(delta) > 500 && KeyboardUtils.isSoftInputVisible(activity)) {
KeyboardUtils.toggleSoftInput();
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/LanguageUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/LanguageUtils.java
index d0ba85d243..dae5c97bfe 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/LanguageUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/LanguageUtils.java
@@ -1,21 +1,15 @@
package com.blankj.utilcode.util;
import android.app.Activity;
-import android.app.Application;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
-import android.os.Bundle;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.text.TextUtils;
-import android.util.DisplayMetrics;
import android.util.Log;
-import java.lang.reflect.Field;
import java.util.Locale;
/**
@@ -37,206 +31,287 @@ private LanguageUtils() {
/**
* Apply the system language.
- * It will not restart Activity. u can put it in ur {@link Activity#onCreate(Bundle)}.
*/
public static void applySystemLanguage() {
- if (isAppliedSystemLanguage()) return;
- applyLanguage(Resources.getSystem().getConfiguration().locale, "", true, false);
+ applySystemLanguage(false);
}
/**
* Apply the system language.
*
- * @param activityClz The class of activity will be started after apply system language.
+ * @param isRelaunchApp True to relaunch app, false to recreate all activities.
*/
- public static void applySystemLanguage(final Class extends Activity> activityClz) {
- applyLanguage(Resources.getSystem().getConfiguration().locale, activityClz, true, true);
- }
-
- /**
- * Apply the system language.
- *
- * @param activityClassName The full class name of activity will be started after apply system language.
- */
- public static void applySystemLanguage(final String activityClassName) {
- applyLanguage(Resources.getSystem().getConfiguration().locale, activityClassName, true, true);
+ public static void applySystemLanguage(final boolean isRelaunchApp) {
+ applyLanguageReal(null, isRelaunchApp);
}
/**
* Apply the language.
- * It will not restart Activity. u can put it in ur {@link Activity#onCreate(Bundle)}.
*
* @param locale The language of locale.
*/
public static void applyLanguage(@NonNull final Locale locale) {
- if (isAppliedLanguage(locale)) return;
- applyLanguage(locale, "", false, false);
+ applyLanguage(locale, false);
}
/**
* Apply the language.
*
- * @param locale The language of locale.
- * @param activityClz The class of activity will be started after apply system language.
- * It will start the launcher activity if the class is null.
+ * @param locale The language of locale.
+ * @param isRelaunchApp True to relaunch app, false to recreate all activities.
*/
public static void applyLanguage(@NonNull final Locale locale,
- final Class extends Activity> activityClz) {
- applyLanguage(locale, activityClz, false, true);
+ final boolean isRelaunchApp) {
+ applyLanguageReal(locale, isRelaunchApp);
+ }
+
+ private static void applyLanguageReal(final Locale locale,
+ final boolean isRelaunchApp) {
+ if (locale == null) {
+ UtilsBridge.getSpUtils4Utils().put(KEY_LOCALE, VALUE_FOLLOW_SYSTEM, true);
+ } else {
+ UtilsBridge.getSpUtils4Utils().put(KEY_LOCALE, locale2String(locale), true);
+ }
+
+ Locale destLocal = locale == null ? getLocal(Resources.getSystem().getConfiguration()) : locale;
+ updateAppContextLanguage(destLocal, new Utils.Consumer() {
+ @Override
+ public void accept(Boolean success) {
+ if (success) {
+ restart(isRelaunchApp);
+ } else {
+ // use relaunch app
+ UtilsBridge.relaunchApp();
+ }
+ }
+ });
+ }
+
+ private static void restart(final boolean isRelaunchApp) {
+ if (isRelaunchApp) {
+ UtilsBridge.relaunchApp();
+ } else {
+ for (Activity activity : UtilsBridge.getActivityList()) {
+ activity.recreate();
+ }
+ }
}
/**
- * Apply the language.
+ * Return whether applied the language by {@link LanguageUtils}.
*
- * @param locale The language of locale.
- * @param activityClassName The class of activity will be started after apply system language.
- * It will start the launcher activity if the class name is null.
+ * @return {@code true}: yes {@code false}: no
*/
- public static void applyLanguage(@NonNull final Locale locale,
- final String activityClassName) {
- applyLanguage(locale, activityClassName, false, true);
+ public static boolean isAppliedLanguage() {
+ return getAppliedLanguage() != null;
}
- private static void applyLanguage(@NonNull final Locale locale,
- final Class extends Activity> activityClz,
- final boolean isFollowSystem,
- final boolean isNeedStartActivity) {
- if (activityClz == null) {
- applyLanguage(locale, "", isFollowSystem, isNeedStartActivity);
- return;
+ /**
+ * Return whether applied the language by {@link LanguageUtils}.
+ *
+ * @param locale The locale.
+ * @return {@code true}: yes {@code false}: no
+ */
+ public static boolean isAppliedLanguage(@NonNull Locale locale) {
+ Locale appliedLocale = getAppliedLanguage();
+ if (appliedLocale == null) {
+ return false;
}
- applyLanguage(locale, activityClz.getName(), isFollowSystem, isNeedStartActivity);
+ return isSameLocale(locale, appliedLocale);
}
- private static void applyLanguage(@NonNull final Locale locale,
- final String activityClassName,
- final boolean isFollowSystem,
- final boolean isNeedStartActivity) {
- if (isFollowSystem) {
- UtilsBridge.getSpUtils4Utils().put(KEY_LOCALE, VALUE_FOLLOW_SYSTEM);
- } else {
- UtilsBridge.getSpUtils4Utils().put(KEY_LOCALE, locale2String(locale));
+ /**
+ * Return the applied locale.
+ *
+ * @return the applied locale
+ */
+ public static Locale getAppliedLanguage() {
+ final String spLocaleStr = UtilsBridge.getSpUtils4Utils().getString(KEY_LOCALE);
+ if (TextUtils.isEmpty(spLocaleStr) || VALUE_FOLLOW_SYSTEM.equals(spLocaleStr)) {
+ return null;
}
+ return string2Locale(spLocaleStr);
+ }
- updateLanguage(Utils.getApp(), locale);
-
- if (isNeedStartActivity) {
- Intent intent = new Intent();
- String realActivityClassName = TextUtils.isEmpty(activityClassName) ? UtilsBridge.getLauncherActivity() : activityClassName;
- intent.setComponent(new ComponentName(Utils.getApp(), realActivityClassName));
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- Utils.getApp().startActivity(intent);
- }
+ /**
+ * Return the locale of context.
+ *
+ * @return the locale of context
+ */
+ public static Locale getContextLanguage(Context context) {
+ return getLocal(context.getResources().getConfiguration());
}
/**
- * Return whether applied the system language by {@link LanguageUtils}.
+ * Return the locale of applicationContext.
*
- * @return {@code true}: yes {@code false}: no
+ * @return the locale of applicationContext
*/
- public static boolean isAppliedSystemLanguage() {
- return VALUE_FOLLOW_SYSTEM.equals(UtilsBridge.getSpUtils4Utils().getString(KEY_LOCALE));
+ public static Locale getAppContextLanguage() {
+ return getContextLanguage(Utils.getApp());
}
/**
- * Return whether applied the language by {@link LanguageUtils}.
+ * Return the locale of system
*
- * @return {@code true}: yes {@code false}: no
+ * @return the locale of system
*/
- public static boolean isAppliedLanguage() {
- return !TextUtils.isEmpty(UtilsBridge.getSpUtils4Utils().getString(KEY_LOCALE));
+ public static Locale getSystemLanguage() {
+ return getLocal(Resources.getSystem().getConfiguration());
}
/**
- * Return whether applied the language by {@link LanguageUtils}.
+ * Update the locale of applicationContext.
*
- * @param locale The locale.
- * @return {@code true}: yes {@code false}: no
+ * @param destLocale The dest locale.
+ * @param consumer The consumer.
*/
- public static boolean isAppliedLanguage(Locale locale) {
- final String spLocale = UtilsBridge.getSpUtils4Utils().getString(KEY_LOCALE);
- if (TextUtils.isEmpty(spLocale)) {
- return false;
- }
- if (VALUE_FOLLOW_SYSTEM.equals(spLocale)) {
- return false;
+ public static void updateAppContextLanguage(@NonNull Locale destLocale, @Nullable Utils.Consumer consumer) {
+ pollCheckAppContextLocal(destLocale, 0, consumer);
+ }
+
+ static void pollCheckAppContextLocal(final Locale destLocale, final int index, final Utils.Consumer consumer) {
+ Resources appResources = Utils.getApp().getResources();
+ Configuration appConfig = appResources.getConfiguration();
+ Locale appLocal = getLocal(appConfig);
+
+ setLocal(appConfig, destLocale);
+
+ Utils.getApp().getResources().updateConfiguration(appConfig, appResources.getDisplayMetrics());
+
+ if (consumer == null) return;
+
+ if (isSameLocale(appLocal, destLocale)) {
+ consumer.accept(true);
+ } else {
+ if (index < 20) {
+ UtilsBridge.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ pollCheckAppContextLocal(destLocale, index + 1, consumer);
+ }
+ }, 16);
+ return;
+ }
+ Log.e("LanguageUtils", "appLocal didn't update.");
+ consumer.accept(false);
}
- Locale settingLocale = string2Locale(spLocale);
- if (settingLocale == null) return false;
- return isSameLocale(settingLocale, locale);
}
/**
- * Return the locale.
+ * If applyLanguage not work, try to call it in {@link Activity#attachBaseContext(Context)}.
*
- * @return the locale
+ * @param context The baseContext.
+ * @return the context with language
*/
- public static Locale getCurrentLocale() {
- return Utils.getApp().getResources().getConfiguration().locale;
+ public static Context attachBaseContext(Context context) {
+ String spLocaleStr = UtilsBridge.getSpUtils4Utils().getString(KEY_LOCALE);
+ if (TextUtils.isEmpty(spLocaleStr) || VALUE_FOLLOW_SYSTEM.equals(spLocaleStr)) {
+ return context;
+ }
+
+ Locale settingsLocale = string2Locale(spLocaleStr);
+ if (settingsLocale == null) return context;
+
+ Resources resources = context.getResources();
+ Configuration config = resources.getConfiguration();
+
+ setLocal(config, settingsLocale);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ return context.createConfigurationContext(config);
+ } else {
+ resources.updateConfiguration(config, resources.getDisplayMetrics());
+ return context;
+ }
}
- static void applyLanguage(@NonNull final Activity activity) {
+ static void applyLanguage(final Activity activity) {
String spLocale = UtilsBridge.getSpUtils4Utils().getString(KEY_LOCALE);
if (TextUtils.isEmpty(spLocale)) {
return;
}
+ Locale destLocal;
if (VALUE_FOLLOW_SYSTEM.equals(spLocale)) {
- Locale sysLocale = Resources.getSystem().getConfiguration().locale;
- updateLanguage(Utils.getApp(), sysLocale);
- updateLanguage(activity, sysLocale);
- return;
+ destLocal = getLocal(Resources.getSystem().getConfiguration());
+ } else {
+ destLocal = string2Locale(spLocale);
}
- Locale settingLocale = string2Locale(spLocale);
- if (settingLocale == null) return;
- updateLanguage(Utils.getApp(), settingLocale);
- updateLanguage(activity, settingLocale);
+ if (destLocal == null) return;
+
+ updateConfiguration(activity, destLocal);
+ updateConfiguration(Utils.getApp(), destLocal);
+ }
+
+ private static void updateConfiguration(Context context, Locale destLocal) {
+ Resources resources = context.getResources();
+ Configuration config = resources.getConfiguration();
+ setLocal(config, destLocal);
+ resources.updateConfiguration(config, resources.getDisplayMetrics());
}
private static String locale2String(Locale locale) {
- String localLanguage = locale.getLanguage();
- String localCountry = locale.getCountry();
+ String localLanguage = locale.getLanguage(); // this may be empty
+ String localCountry = locale.getCountry(); // this may be empty
return localLanguage + "$" + localCountry;
}
private static Locale string2Locale(String str) {
- String[] language_country = str.split("\\$");
- if (language_country.length != 2) {
+ Locale locale = string2LocaleReal(str);
+ if (locale == null) {
Log.e("LanguageUtils", "The string of " + str + " is not in the correct format.");
- return null;
+ UtilsBridge.getSpUtils4Utils().remove(KEY_LOCALE);
}
- return new Locale(language_country[0], language_country[1]);
+ return locale;
}
+ private static Locale string2LocaleReal(String str) {
+ if (!isRightFormatLocalStr(str)) {
+ return null;
+ }
- private static void updateLanguage(final Context context, Locale locale) {
- Resources resources = context.getResources();
- Configuration config = resources.getConfiguration();
- Locale contextLocale = config.locale;
- if (isSameLocale(contextLocale, locale)) {
- return;
+ try {
+ int splitIndex = str.indexOf("$");
+ return new Locale(str.substring(0, splitIndex), str.substring(splitIndex + 1));
+ } catch (Exception ignore) {
+ return null;
}
- DisplayMetrics dm = resources.getDisplayMetrics();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- config.setLocale(locale);
- if (context instanceof Application) {
- Context newContext = context.createConfigurationContext(config);
- try {
- //noinspection JavaReflectionMemberAccess
- Field mBaseField = ContextWrapper.class.getDeclaredField("mBase");
- mBaseField.setAccessible(true);
- mBaseField.set(context, newContext);
- } catch (Exception ignored) {/**/}
+ }
+
+ private static boolean isRightFormatLocalStr(String localStr) {
+ char[] chars = localStr.toCharArray();
+ int count = 0;
+ for (char c : chars) {
+ if (c == '$') {
+ if (count >= 1) {
+ return false;
+ }
+ ++count;
}
- } else {
- config.locale = locale;
}
- resources.updateConfiguration(config, dm);
+ return count == 1;
}
private static boolean isSameLocale(Locale l0, Locale l1) {
return UtilsBridge.equals(l1.getLanguage(), l0.getLanguage())
&& UtilsBridge.equals(l1.getCountry(), l0.getCountry());
}
+
+ private static Locale getLocal(Configuration configuration) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ return configuration.getLocales().get(0);
+ } else {
+ return configuration.locale;
+ }
+ }
+
+ private static void setLocal(Configuration configuration, Locale locale) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ configuration.setLocale(locale);
+ } else {
+ configuration.locale = locale;
+ }
+ }
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
index 040a3545d0..ad254474db 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -36,6 +36,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -228,6 +229,10 @@ public void run() {
}
}
+ public static String getCurrentLogFilePath() {
+ return getCurrentLogFilePath(new Date());
+ }
+
public static List getLogFiles() {
String dir = CONFIG.getDir();
File logDir = new File(dir);
@@ -379,16 +384,16 @@ private static void print2Console(final int type,
private static void printBorder(final int type, final String tag, boolean isTop) {
if (CONFIG.isLogBorderSwitch()) {
- Log.println(type, tag, isTop ? TOP_BORDER : BOTTOM_BORDER);
+ print2Console(type, tag, isTop ? TOP_BORDER : BOTTOM_BORDER);
}
}
private static void printHead(final int type, final String tag, final String[] head) {
if (head != null) {
for (String aHead : head) {
- Log.println(type, tag, CONFIG.isLogBorderSwitch() ? LEFT_BORDER + aHead : aHead);
+ print2Console(type, tag, CONFIG.isLogBorderSwitch() ? LEFT_BORDER + aHead : aHead);
}
- if (CONFIG.isLogBorderSwitch()) Log.println(type, tag, MIDDLE_BORDER);
+ if (CONFIG.isLogBorderSwitch()) print2Console(type, tag, MIDDLE_BORDER);
}
}
@@ -411,13 +416,13 @@ private static void printMsg(final int type, final String tag, final String msg)
private static void printSubMsg(final int type, final String tag, final String msg) {
if (!CONFIG.isLogBorderSwitch()) {
- Log.println(type, tag, msg);
+ print2Console(type, tag, msg);
return;
}
StringBuilder sb = new StringBuilder();
String[] lines = msg.split(LINE_SEP);
for (String line : lines) {
- Log.println(type, tag, LEFT_BORDER + line);
+ print2Console(type, tag, LEFT_BORDER + line);
}
}
@@ -456,56 +461,70 @@ private static void printSingleTagMsg(final int type, final String tag, final St
int countOfSub = CONFIG.isLogBorderSwitch() ? (len - BOTTOM_BORDER.length()) / MAX_LEN : len / MAX_LEN;
if (countOfSub > 0) {
if (CONFIG.isLogBorderSwitch()) {
- Log.println(type, tag, msg.substring(0, MAX_LEN) + LINE_SEP + BOTTOM_BORDER);
+ print2Console(type, tag, msg.substring(0, MAX_LEN) + LINE_SEP + BOTTOM_BORDER);
int index = MAX_LEN;
for (int i = 1; i < countOfSub; i++) {
- Log.println(type, tag, PLACEHOLDER + LINE_SEP + TOP_BORDER + LINE_SEP
+ print2Console(type, tag, PLACEHOLDER + LINE_SEP + TOP_BORDER + LINE_SEP
+ LEFT_BORDER + msg.substring(index, index + MAX_LEN)
+ LINE_SEP + BOTTOM_BORDER);
index += MAX_LEN;
}
if (index != len - BOTTOM_BORDER.length()) {
- Log.println(type, tag, PLACEHOLDER + LINE_SEP + TOP_BORDER + LINE_SEP
+ print2Console(type, tag, PLACEHOLDER + LINE_SEP + TOP_BORDER + LINE_SEP
+ LEFT_BORDER + msg.substring(index, len));
}
} else {
- Log.println(type, tag, msg.substring(0, MAX_LEN));
+ print2Console(type, tag, msg.substring(0, MAX_LEN));
int index = MAX_LEN;
for (int i = 1; i < countOfSub; i++) {
- Log.println(type, tag,
+ print2Console(type, tag,
PLACEHOLDER + LINE_SEP + msg.substring(index, index + MAX_LEN));
index += MAX_LEN;
}
if (index != len) {
- Log.println(type, tag, PLACEHOLDER + LINE_SEP + msg.substring(index, len));
+ print2Console(type, tag, PLACEHOLDER + LINE_SEP + msg.substring(index, len));
}
}
} else {
- Log.println(type, tag, msg);
+ print2Console(type, tag, msg);
+ }
+ }
+
+ private static void print2Console(int type, String tag, String msg) {
+ Log.println(type, tag, msg);
+ if (CONFIG.mOnConsoleOutputListener != null) {
+ CONFIG.mOnConsoleOutputListener.onConsoleOutput(type, tag, msg);
}
}
private static void print2File(final int type, final String tag, final String msg) {
- String format = getSdf().format(new Date());
+ Date d = new Date();
+ String format = getSdf().format(d);
String date = format.substring(0, 10);
- String time = format.substring(11);
- final String fullPath =
- CONFIG.getDir() + CONFIG.getFilePrefix() + "_"
- + date + "_" +
- CONFIG.getProcessName() + CONFIG.getFileExtension();
- if (!createOrExistsFile(fullPath, date)) {
- Log.e("LogUtils", "create " + fullPath + " failed!");
+ String currentLogFilePath = getCurrentLogFilePath(d);
+ if (!createOrExistsFile(currentLogFilePath, date)) {
+ Log.e("LogUtils", "create " + currentLogFilePath + " failed!");
return;
}
+ String time = format.substring(11);
final String content = time +
T[type - V] +
"/" +
tag +
msg +
LINE_SEP;
- input2File(fullPath, content);
+ input2File(currentLogFilePath, content);
+ }
+
+ private static String getCurrentLogFilePath(Date d) {
+ String format = getSdf().format(d);
+ String date = format.substring(0, 10);
+ return CONFIG.getDir() + CONFIG.getFilePrefix() + "_"
+ + date + "_" +
+ CONFIG.getProcessName() + CONFIG.getFileExtension();
}
+
private static SimpleDateFormat getSdf() {
if (simpleDateFormat == null) {
simpleDateFormat = new SimpleDateFormat("yyyy_MM_dd HH:mm:ss.SSS ", Locale.getDefault());
@@ -579,16 +598,8 @@ private static String findDate(String str) {
}
private static void printDeviceInfo(final String filePath, final String date) {
- final String head = "************* Log Head ****************" +
- "\nDate of Log : " + date +
- "\nDevice Manufacturer: " + Build.MANUFACTURER +
- "\nDevice Model : " + Build.MODEL +
- "\nAndroid Version : " + Build.VERSION.RELEASE +
- "\nAndroid SDK : " + Build.VERSION.SDK_INT +
- "\nApp VersionName : " + UtilsBridge.getAppVersionName() +
- "\nApp VersionCode : " + UtilsBridge.getAppVersionCode() +
- "\n************* Log Head ****************\n\n";
- input2File(filePath, head);
+ CONFIG.mFileHead.addFirst("Date of Log", date);
+ input2File(filePath, CONFIG.mFileHead.toString());
}
private static void input2File(final String filePath, final String input) {
@@ -597,28 +608,34 @@ private static void input2File(final String filePath, final String input) {
} else {
CONFIG.mFileWriter.write(filePath, input);
}
+ if (CONFIG.mOnFileOutputListener != null) {
+ CONFIG.mOnFileOutputListener.onFileOutput(filePath, input);
+ }
}
public static final class Config {
- private String mDefaultDir;// The default storage directory of log.
- private String mDir; // The storage directory of log.
- private String mFilePrefix = "util";// The file prefix of log.
- private String mFileExtension = ".txt";// The file extension of log.
- private boolean mLogSwitch = true; // The switch of log.
- private boolean mLog2ConsoleSwitch = true; // The logcat's switch of log.
- private String mGlobalTag = ""; // The global tag of log.
- private boolean mTagIsSpace = true; // The global tag is space.
- private boolean mLogHeadSwitch = true; // The head's switch of log.
- private boolean mLog2FileSwitch = false; // The file's switch of log.
- private boolean mLogBorderSwitch = true; // The border's switch of log.
- private boolean mSingleTagSwitch = true; // The single tag of log.
- private int mConsoleFilter = V; // The console's filter of log.
- private int mFileFilter = V; // The file's filter of log.
- private int mStackDeep = 1; // The stack's deep of log.
- private int mStackOffset = 0; // The stack's offset of log.
- private int mSaveDays = -1; // The save days of log.
- private String mProcessName = UtilsBridge.getCurrentProcessName();
- private IFileWriter mFileWriter;
+ private String mDefaultDir; // The default storage directory of log.
+ private String mDir; // The storage directory of log.
+ private String mFilePrefix = "util";// The file prefix of log.
+ private String mFileExtension = ".txt";// The file extension of log.
+ private boolean mLogSwitch = true; // The switch of log.
+ private boolean mLog2ConsoleSwitch = true; // The logcat's switch of log.
+ private String mGlobalTag = ""; // The global tag of log.
+ private boolean mTagIsSpace = true; // The global tag is space.
+ private boolean mLogHeadSwitch = true; // The head's switch of log.
+ private boolean mLog2FileSwitch = false; // The file's switch of log.
+ private boolean mLogBorderSwitch = true; // The border's switch of log.
+ private boolean mSingleTagSwitch = true; // The single tag of log.
+ private int mConsoleFilter = V; // The console's filter of log.
+ private int mFileFilter = V; // The file's filter of log.
+ private int mStackDeep = 1; // The stack's deep of log.
+ private int mStackOffset = 0; // The stack's offset of log.
+ private int mSaveDays = -1; // The save days of log.
+ private String mProcessName = UtilsBridge.getCurrentProcessName();
+ private IFileWriter mFileWriter;
+ private OnConsoleOutputListener mOnConsoleOutputListener;
+ private OnFileOutputListener mOnFileOutputListener;
+ private UtilsBridge.FileHead mFileHead = new UtilsBridge.FileHead("Log");
private Config() {
if (UtilsBridge.isSDCardEnableByEnvironment()
@@ -743,6 +760,26 @@ public final Config setFileWriter(final IFileWriter fileWriter) {
return this;
}
+ public final Config setOnConsoleOutputListener(final OnConsoleOutputListener listener) {
+ mOnConsoleOutputListener = listener;
+ return this;
+ }
+
+ public final Config setOnFileOutputListener(final OnFileOutputListener listener) {
+ mOnFileOutputListener = listener;
+ return this;
+ }
+
+ public final Config addFileExtraHead(final Map fileExtraHead) {
+ mFileHead.append(fileExtraHead);
+ return this;
+ }
+
+ public final Config addFileExtraHead(final String key, final String value) {
+ mFileHead.append(key, value);
+ return this;
+ }
+
public final String getProcessName() {
if (mProcessName == null) return "";
return mProcessName.replace(":", "_");
@@ -813,24 +850,36 @@ public final int getSaveDays() {
return mSaveDays;
}
+ public final boolean haveSetOnConsoleOutputListener() {
+ return mOnConsoleOutputListener != null;
+ }
+
+ public final boolean haveSetOnFileOutputListener() {
+ return mOnFileOutputListener != null;
+ }
+
@Override
public String toString() {
return "process: " + getProcessName()
- + LINE_SEP + "switch: " + isLogSwitch()
- + LINE_SEP + "console: " + isLog2ConsoleSwitch()
- + LINE_SEP + "tag: " + getGlobalTag()
- + LINE_SEP + "head: " + isLogHeadSwitch()
- + LINE_SEP + "file: " + isLog2FileSwitch()
+ + LINE_SEP + "logSwitch: " + isLogSwitch()
+ + LINE_SEP + "consoleSwitch: " + isLog2ConsoleSwitch()
+ + LINE_SEP + "tag: " + (getGlobalTag().equals("") ? "null" : getGlobalTag())
+ + LINE_SEP + "headSwitch: " + isLogHeadSwitch()
+ + LINE_SEP + "fileSwitch: " + isLog2FileSwitch()
+ LINE_SEP + "dir: " + getDir()
+ LINE_SEP + "filePrefix: " + getFilePrefix()
- + LINE_SEP + "border: " + isLogBorderSwitch()
- + LINE_SEP + "singleTag: " + isSingleTagSwitch()
+ + LINE_SEP + "borderSwitch: " + isLogBorderSwitch()
+ + LINE_SEP + "singleTagSwitch: " + isSingleTagSwitch()
+ LINE_SEP + "consoleFilter: " + getConsoleFilter()
+ LINE_SEP + "fileFilter: " + getFileFilter()
+ LINE_SEP + "stackDeep: " + getStackDeep()
+ LINE_SEP + "stackOffset: " + getStackOffset()
+ LINE_SEP + "saveDays: " + getSaveDays()
- + LINE_SEP + "formatter: " + I_FORMATTER_MAP;
+ + LINE_SEP + "formatter: " + I_FORMATTER_MAP
+ + LINE_SEP + "fileWriter: " + mFileWriter
+ + LINE_SEP + "onConsoleOutputListener: " + mOnConsoleOutputListener
+ + LINE_SEP + "onFileOutputListener: " + mOnFileOutputListener
+ + LINE_SEP + "fileExtraHeader: " + mFileHead.getAppended();
}
}
@@ -842,6 +891,14 @@ public interface IFileWriter {
void write(String file, String content);
}
+ public interface OnConsoleOutputListener {
+ void onConsoleOutput(@TYPE int type, String tag, String content);
+ }
+
+ public interface OnFileOutputListener {
+ void onFileOutput(String filePath, String content);
+ }
+
private final static class TagHead {
String tag;
String[] consoleHead;
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
index 2ea696a6a3..e6ec4eec2a 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
@@ -159,7 +159,7 @@ public void onServiceConnected(ComponentName name, IBinder service) {
try {
mServer.send(msg);
} catch (RemoteException e) {
- Log.e("MessengerUtils", "onServiceConnected: ", e);
+ e.printStackTrace();
}
sendCachedMsg2Server();
}
@@ -205,7 +205,7 @@ void unbind() {
try {
mServer.send(msg);
} catch (RemoteException e) {
- Log.e("MessengerUtils", "unbind: ", e);
+ e.printStackTrace();
}
try {
Utils.getApp().unbindService(mConn);
@@ -242,7 +242,7 @@ private boolean send2Server(Bundle bundle) {
mServer.send(msg);
return true;
} catch (RemoteException e) {
- Log.e("MessengerUtils", "send2Server: ", e);
+ e.printStackTrace();
return false;
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index 9b6f36a1a8..f9ba566cc9 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -15,7 +15,6 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.Formatter;
-import android.util.Log;
import java.lang.reflect.Method;
import java.net.InetAddress;
@@ -227,8 +226,8 @@ public static boolean isAvailableByDns(final String domain) {
return inetAddress != null;
} catch (UnknownHostException e) {
e.printStackTrace();
+ return false;
}
- return false;
}
/**
@@ -251,7 +250,7 @@ public static boolean getMobileDataEnabled() {
return (boolean) getMobileDataEnabledMethod.invoke(tm);
}
} catch (Exception e) {
- Log.e("NetworkUtils", "getMobileDataEnabled: ", e);
+ e.printStackTrace();
}
return false;
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index a550bf2820..2e3a985124 100755
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -27,7 +27,7 @@
import java.util.List;
import java.util.Set;
-import static com.blankj.utilcode.constant.PermissionConstants.Permission;
+import static com.blankj.utilcode.constant.PermissionConstants.PermissionGroup;
/**
*
@@ -42,6 +42,7 @@ public final class PermissionUtils {
private static PermissionUtils sInstance;
private String[] mPermissionsParam;
+ private OnExplainListener mOnExplainListener;
private OnRationaleListener mOnRationaleListener;
private SingleCallback mSingleCallback;
private SimpleCallback mSimpleCallback;
@@ -89,7 +90,7 @@ public static List getPermissions(final String packageName) {
* @param permissions The permissions.
* @return {@code true}: yes {@code false}: no
*/
- public static boolean isGranted(@Permission final String... permissions) {
+ public static boolean isGranted(final String... permissions) {
Pair, List> requestAndDeniedPermissions = getRequestAndDeniedPermissions(permissions);
List deniedPermissions = requestAndDeniedPermissions.second;
if (!deniedPermissions.isEmpty()) {
@@ -208,7 +209,17 @@ public static void launchAppDetailsSettings() {
* @param permissions The permissions.
* @return the single {@link PermissionUtils} instance
*/
- public static PermissionUtils permission(@Permission final String... permissions) {
+ public static PermissionUtils permissionGroup(@PermissionGroup final String... permissions) {
+ return new PermissionUtils(permissions);
+ }
+
+ /**
+ * Set the permissions.
+ *
+ * @param permissions The permissions.
+ * @return the single {@link PermissionUtils} instance
+ */
+ public static PermissionUtils permission(final String... permissions) {
return new PermissionUtils(permissions);
}
@@ -217,6 +228,17 @@ private PermissionUtils(final String... permissions) {
sInstance = this;
}
+ /**
+ * Set explain listener.
+ *
+ * @param listener The explain listener.
+ * @return the single {@link PermissionUtils} instance
+ */
+ public PermissionUtils explain(final OnExplainListener listener) {
+ mOnExplainListener = listener;
+ return this;
+ }
+
/**
* Set rationale listener.
*
@@ -416,25 +438,41 @@ public void accept(Intent data) {
}
@Override
- public void onCreated(final UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {
+ public void onCreated(@NonNull final UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
int type = activity.getIntent().getIntExtra(TYPE, -1);
if (type == TYPE_RUNTIME) {
if (sInstance == null) {
- Log.e("PermissionUtils", "request permissions failed");
+ Log.e("PermissionUtils", "sInstance is null.");
+ activity.finish();
+ return;
+ }
+ if (sInstance.mPermissionsRequest == null) {
+ Log.e("PermissionUtils", "mPermissionsRequest is null.");
+ activity.finish();
+ return;
+ }
+ if (sInstance.mPermissionsRequest.size() <= 0) {
+ Log.e("PermissionUtils", "mPermissionsRequest's size is no more than 0.");
activity.finish();
return;
}
if (sInstance.mThemeCallback != null) {
sInstance.mThemeCallback.onActivityCreate(activity);
}
- if (sInstance.shouldRationale(activity, new Runnable() {
- @Override
- public void run() {
- requestPermissions(activity);
- }
- })) {
+ if (sInstance.mOnExplainListener != null) {
+ sInstance.mOnExplainListener.explain(activity, sInstance.mPermissionsRequest, new OnExplainListener.ShouldRequest() {
+ @Override
+ public void start(boolean start) {
+ if (!start) {
+ activity.finish();
+ } else {
+ requestPermissions(activity);
+ }
+ }
+ });
+ sInstance.mOnExplainListener = null;
return;
}
requestPermissions(activity);
@@ -450,22 +488,23 @@ public void run() {
}
}
- private void requestPermissions(Activity activity) {
- if (sInstance.mPermissionsRequest != null) {
- int size = sInstance.mPermissionsRequest.size();
- if (size <= 0) {
- activity.finish();
- return;
+ private void requestPermissions(final UtilsTransActivity activity) {
+ if (sInstance.shouldRationale(activity, new Runnable() {
+ @Override
+ public void run() {
+ activity.requestPermissions(sInstance.mPermissionsRequest.toArray(new String[0]), 1);
}
- activity.requestPermissions(sInstance.mPermissionsRequest.toArray(new String[size]), 1);
+ })) {
+ return;
}
+ activity.requestPermissions(sInstance.mPermissionsRequest.toArray(new String[0]), 1);
}
@Override
- public void onRequestPermissionsResult(UtilsTransActivity activity,
+ public void onRequestPermissionsResult(@NonNull UtilsTransActivity activity,
int requestCode,
- String[] permissions,
- int[] grantResults) {
+ @NonNull String[] permissions,
+ @NonNull int[] grantResults) {
activity.finish();
if (sInstance != null && sInstance.mPermissionsRequest != null) {
sInstance.onRequestPermissionsResult(activity);
@@ -474,13 +513,13 @@ public void onRequestPermissionsResult(UtilsTransActivity activity,
@Override
- public boolean dispatchTouchEvent(UtilsTransActivity activity, MotionEvent ev) {
+ public boolean dispatchTouchEvent(@NonNull UtilsTransActivity activity, MotionEvent ev) {
activity.finish();
return true;
}
@Override
- public void onDestroy(final UtilsTransActivity activity) {
+ public void onDestroy(@NonNull final UtilsTransActivity activity) {
if (currentRequestCode != -1) {
checkRequestCallback(currentRequestCode);
currentRequestCode = -1;
@@ -489,7 +528,7 @@ public void onDestroy(final UtilsTransActivity activity) {
}
@Override
- public void onActivityResult(UtilsTransActivity activity, int requestCode, int resultCode, Intent data) {
+ public void onActivityResult(@NonNull UtilsTransActivity activity, int requestCode, int resultCode, Intent data) {
activity.finish();
}
@@ -518,9 +557,18 @@ private void checkRequestCallback(int requestCode) {
// interface
///////////////////////////////////////////////////////////////////////////
+ public interface OnExplainListener {
+
+ void explain(@NonNull UtilsTransActivity activity, @NonNull List denied, @NonNull ShouldRequest shouldRequest);
+
+ interface ShouldRequest {
+ void start(boolean start);
+ }
+ }
+
public interface OnRationaleListener {
- void rationale(UtilsTransActivity activity, ShouldRequest shouldRequest);
+ void rationale(@NonNull UtilsTransActivity activity, @NonNull ShouldRequest shouldRequest);
interface ShouldRequest {
void again(boolean again);
@@ -546,6 +594,6 @@ public interface FullCallback {
}
public interface ThemeCallback {
- void onActivityCreate(Activity activity);
+ void onActivityCreate(@NonNull Activity activity);
}
}
\ No newline at end of file
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index 079d138eea..b5cad7ef99 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -237,27 +237,12 @@ public static Bitmap screenShot(@NonNull final Activity activity) {
*/
public static Bitmap screenShot(@NonNull final Activity activity, boolean isDeleteStatusBar) {
View decorView = activity.getWindow().getDecorView();
- boolean drawingCacheEnabled = decorView.isDrawingCacheEnabled();
- boolean willNotCacheDrawing = decorView.willNotCacheDrawing();
- decorView.setDrawingCacheEnabled(true);
- decorView.setWillNotCacheDrawing(false);
- Bitmap bmp = decorView.getDrawingCache();
- if (bmp == null || bmp.isRecycled()) {
- decorView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
- View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
- decorView.layout(0, 0, decorView.getMeasuredWidth(), decorView.getMeasuredHeight());
- decorView.buildDrawingCache();
- bmp = Bitmap.createBitmap(decorView.getDrawingCache());
- }
- if (bmp == null || bmp.isRecycled()) return null;
+ Bitmap bmp = UtilsBridge.view2Bitmap(decorView);
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
- Bitmap ret;
if (isDeleteStatusBar) {
- Resources resources = activity.getResources();
- int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
- int statusBarHeight = resources.getDimensionPixelSize(resourceId);
- ret = Bitmap.createBitmap(
+ int statusBarHeight = UtilsBridge.getStatusBarHeight();
+ return Bitmap.createBitmap(
bmp,
0,
statusBarHeight,
@@ -265,12 +250,8 @@ public static Bitmap screenShot(@NonNull final Activity activity, boolean isDele
dm.heightPixels - statusBarHeight
);
} else {
- ret = Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, dm.heightPixels);
+ return Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, dm.heightPixels);
}
- decorView.destroyDrawingCache();
- decorView.setWillNotCacheDrawing(willNotCacheDrawing);
- decorView.setDrawingCacheEnabled(drawingCacheEnabled);
- return ret;
}
/**
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..28efede8d4 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -4,6 +4,8 @@
import android.support.annotation.ArrayRes;
import android.support.annotation.StringRes;
+import java.util.IllegalFormatException;
+
/**
*
* author: Blankj
@@ -117,7 +119,7 @@ public static int length(final CharSequence s) {
public static String upperFirstLetter(final String s) {
if (s == null || s.length() == 0) return "";
if (!Character.isLowerCase(s.charAt(0))) return s;
- return String.valueOf((char) (s.charAt(0) - 32)) + s.substring(1);
+ return (char) (s.charAt(0) - 32) + s.substring(1);
}
/**
@@ -202,11 +204,7 @@ public static String toSBC(final String s) {
* @return the string value associated with a particular resource ID.
*/
public static String getString(@StringRes int id) {
- try {
- return Utils.getApp().getResources().getString(id);
- } catch (Resources.NotFoundException ignore) {
- return "";
- }
+ return getString(id, (Object[]) null);
}
/**
@@ -218,9 +216,10 @@ public static String getString(@StringRes int id) {
*/
public static String getString(@StringRes int id, Object... formatArgs) {
try {
- return Utils.getApp().getString(id, formatArgs);
- } catch (Resources.NotFoundException ignore) {
- return "";
+ return format(Utils.getApp().getString(id), formatArgs);
+ } catch (Resources.NotFoundException e) {
+ e.printStackTrace();
+ return String.valueOf(id);
}
}
@@ -233,8 +232,30 @@ public static String getString(@StringRes int id, Object... formatArgs) {
public static String[] getStringArray(@ArrayRes int id) {
try {
return Utils.getApp().getResources().getStringArray(id);
- } catch (Resources.NotFoundException ignore) {
- return new String[0];
+ } catch (Resources.NotFoundException e) {
+ e.printStackTrace();
+ return new String[]{String.valueOf(id)};
+ }
+ }
+
+ /**
+ * Format the string.
+ *
+ * @param str The string.
+ * @param args The args.
+ * @return a formatted string.
+ */
+ public static String format(String str, Object... args) {
+ String text = str;
+ if (text != null) {
+ if (args != null && args.length > 0) {
+ try {
+ text = String.format(str, args);
+ } catch (IllegalFormatException e) {
+ e.printStackTrace();
+ }
+ }
}
+ return text;
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index 3abb3b35ab..0bdd221a29 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -2,32 +2,42 @@
import android.app.Activity;
import android.content.Context;
+import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.CallSuper;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.annotation.StringDef;
import android.support.annotation.StringRes;
import android.support.v4.app.NotificationManagerCompat;
-import android.util.Log;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
import android.view.Gravity;
-import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.blankj.utilcode.R;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;
/**
@@ -40,20 +50,49 @@
*/
public final class ToastUtils {
- private static final int COLOR_DEFAULT = 0xFEFFFFFF;
- private static final String NULL = "null";
+ @StringDef({MODE.LIGHT, MODE.DARK})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface MODE {
+ String LIGHT = "light";
+ String DARK = "dark";
+ }
+
+ private static final String TAG_TOAST = "TAG_TOAST";
+ private static final int COLOR_DEFAULT = 0xFEFFFFFF;
+ private static final String NULL = "toast null";
+ private static final String NOTHING = "toast nothing";
+ private static final ToastUtils DEFAULT_TOAST_UTILS = make();
private static IToast iToast;
- private static int sGravity = -1;
- private static int sXOffset = -1;
- private static int sYOffset = -1;
- private static int sBgColor = COLOR_DEFAULT;
- private static int sBgResource = -1;
- private static int sMsgColor = COLOR_DEFAULT;
- private static int sMsgTextSize = -1;
- private ToastUtils() {
- throw new UnsupportedOperationException("u can't instantiate me...");
+ private String mMode;
+ private int mGravity = -1;
+ private int mXOffset = -1;
+ private int mYOffset = -1;
+ private int mBgColor = COLOR_DEFAULT;
+ private int mBgResource = -1;
+ private int mTextColor = COLOR_DEFAULT;
+ private int mTextSize = -1;
+ private boolean isLong = false;
+ private Drawable[] mIcons = new Drawable[4];
+ private boolean isNotUseSystemToast = false;
+
+ /**
+ * Make a toast.
+ *
+ * @return the single {@link ToastUtils} instance
+ */
+ public static ToastUtils make() {
+ return new ToastUtils();
+ }
+
+ /**
+ * @param mode The mode.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setMode(@MODE String mode) {
+ mMode = mode;
+ return this;
}
/**
@@ -62,47 +101,161 @@ private ToastUtils() {
* @param gravity The gravity.
* @param xOffset X-axis offset, in pixel.
* @param yOffset Y-axis offset, in pixel.
+ * @return the single {@link ToastUtils} instance
*/
- public static void setGravity(final int gravity, final int xOffset, final int yOffset) {
- sGravity = gravity;
- sXOffset = xOffset;
- sYOffset = yOffset;
+ public final ToastUtils setGravity(final int gravity, final int xOffset, final int yOffset) {
+ mGravity = gravity;
+ mXOffset = xOffset;
+ mYOffset = yOffset;
+ return this;
}
/**
* Set the color of background.
*
* @param backgroundColor The color of background.
+ * @return the single {@link ToastUtils} instance
*/
- public static void setBgColor(@ColorInt final int backgroundColor) {
- sBgColor = backgroundColor;
+ public final ToastUtils setBgColor(@ColorInt final int backgroundColor) {
+ mBgColor = backgroundColor;
+ return this;
}
/**
* Set the resource of background.
*
* @param bgResource The resource of background.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setBgResource(@DrawableRes final int bgResource) {
+ mBgResource = bgResource;
+ return this;
+ }
+
+ /**
+ * Set the text color of toast.
+ *
+ * @param msgColor The text color of toast.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setTextColor(@ColorInt final int msgColor) {
+ mTextColor = msgColor;
+ return this;
+ }
+
+ /**
+ * Set the text size of toast.
+ *
+ * @param textSize The text size of toast.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setTextSize(final int textSize) {
+ mTextSize = textSize;
+ return this;
+ }
+
+ /**
+ * Set the toast for a long period of time.
+ *
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setDurationIsLong(boolean isLong) {
+ this.isLong = isLong;
+ return this;
+ }
+
+ /**
+ * Set the left icon of toast.
+ *
+ * @param resId The left icon resource identifier.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setLeftIcon(@DrawableRes int resId) {
+ return setLeftIcon(ContextCompat.getDrawable(Utils.getApp(), resId));
+ }
+
+ /**
+ * Set the left icon of toast.
+ *
+ * @param drawable The left icon drawable.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setLeftIcon(Drawable drawable) {
+ mIcons[0] = drawable;
+ return this;
+ }
+
+ /**
+ * Set the top icon of toast.
+ *
+ * @param resId The top icon resource identifier.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setTopIcon(@DrawableRes int resId) {
+ return setTopIcon(ContextCompat.getDrawable(Utils.getApp(), resId));
+ }
+
+ /**
+ * Set the top icon of toast.
+ *
+ * @param drawable The top icon drawable.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setTopIcon(Drawable drawable) {
+ mIcons[1] = drawable;
+ return this;
+ }
+
+ /**
+ * Set the right icon of toast.
+ *
+ * @param resId The right icon resource identifier.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setRightIcon(@DrawableRes int resId) {
+ return setRightIcon(ContextCompat.getDrawable(Utils.getApp(), resId));
+ }
+
+ /**
+ * Set the right icon of toast.
+ *
+ * @param drawable The right icon drawable.
+ * @return the single {@link ToastUtils} instance
+ */
+ public final ToastUtils setRightIcon(Drawable drawable) {
+ mIcons[2] = drawable;
+ return this;
+ }
+
+ /**
+ * Set the left bottom of toast.
+ *
+ * @param resId The bottom icon resource identifier.
+ * @return the single {@link ToastUtils} instance
*/
- public static void setBgResource(@DrawableRes final int bgResource) {
- sBgResource = bgResource;
+ public final ToastUtils setBottomIcon(int resId) {
+ return setBottomIcon(ContextCompat.getDrawable(Utils.getApp(), resId));
}
/**
- * Set the color of message.
+ * Set the bottom icon of toast.
*
- * @param msgColor The color of message.
+ * @param drawable The bottom icon drawable.
+ * @return the single {@link ToastUtils} instance
*/
- public static void setMsgColor(@ColorInt final int msgColor) {
- sMsgColor = msgColor;
+ public final ToastUtils setBottomIcon(Drawable drawable) {
+ mIcons[3] = drawable;
+ return this;
}
/**
- * Set the text size of message.
+ * Set not use system toast.
*
- * @param textSize The text size of message.
+ * @return the single {@link ToastUtils} instance
*/
- public static void setMsgTextSize(final int textSize) {
- sMsgTextSize = textSize;
+ public final ToastUtils setNotUseSystemToast() {
+ isNotUseSystemToast = true;
+ return this;
}
/**
@@ -110,8 +263,8 @@ public static void setMsgTextSize(final int textSize) {
*
* @param text The text.
*/
- public static void showShort(final CharSequence text) {
- show(text == null ? NULL : text, Toast.LENGTH_SHORT);
+ public final void show(final CharSequence text) {
+ show(text, getDuration(), this);
}
/**
@@ -119,8 +272,8 @@ public static void showShort(final CharSequence text) {
*
* @param resId The resource id for text.
*/
- public static void showShort(@StringRes final int resId) {
- show(resId, Toast.LENGTH_SHORT);
+ public final void show(@StringRes final int resId) {
+ show(UtilsBridge.getString(resId), getDuration(), this);
}
/**
@@ -129,8 +282,8 @@ public static void showShort(@StringRes final int resId) {
* @param resId The resource id for text.
* @param args The args.
*/
- public static void showShort(@StringRes final int resId, final Object... args) {
- show(resId, Toast.LENGTH_SHORT, args);
+ public final void show(@StringRes final int resId, final Object... args) {
+ show(UtilsBridge.getString(resId, args), getDuration(), this);
}
/**
@@ -139,84 +292,133 @@ public static void showShort(@StringRes final int resId, final Object... args) {
* @param format The format.
* @param args The args.
*/
- public static void showShort(final String format, final Object... args) {
- show(format, Toast.LENGTH_SHORT, args);
+ public final void show(final String format, final Object... args) {
+ show(UtilsBridge.format(format, args), getDuration(), this);
}
/**
- * Show the toast for a long period of time.
+ * Show custom toast.
+ */
+ public final void show(final View view) {
+ show(view, getDuration(), this);
+ }
+
+ private int getDuration() {
+ return isLong ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT;
+ }
+
+ private View tryApplyUtilsToastView(final CharSequence text) {
+ if (!MODE.DARK.equals(mMode) && !MODE.LIGHT.equals(mMode)
+ && mIcons[0] == null && mIcons[1] == null && mIcons[2] == null && mIcons[3] == null) {
+ return null;
+ }
+
+ View toastView = UtilsBridge.layoutId2View(R.layout.utils_toast_view);
+ TextView messageTv = toastView.findViewById(android.R.id.message);
+ if (MODE.DARK.equals(mMode)) {
+ GradientDrawable bg = (GradientDrawable) toastView.getBackground().mutate();
+ bg.setColor(Color.parseColor("#BB000000"));
+ messageTv.setTextColor(Color.WHITE);
+ }
+ messageTv.setText(text);
+ if (mIcons[0] != null) {
+ View leftIconView = toastView.findViewById(R.id.utvLeftIconView);
+ ViewCompat.setBackground(leftIconView, mIcons[0]);
+ leftIconView.setVisibility(View.VISIBLE);
+ }
+ if (mIcons[1] != null) {
+ View topIconView = toastView.findViewById(R.id.utvTopIconView);
+ ViewCompat.setBackground(topIconView, mIcons[1]);
+ topIconView.setVisibility(View.VISIBLE);
+ }
+ if (mIcons[2] != null) {
+ View rightIconView = toastView.findViewById(R.id.utvRightIconView);
+ ViewCompat.setBackground(rightIconView, mIcons[2]);
+ rightIconView.setVisibility(View.VISIBLE);
+ }
+ if (mIcons[3] != null) {
+ View bottomIconView = toastView.findViewById(R.id.utvBottomIconView);
+ ViewCompat.setBackground(bottomIconView, mIcons[3]);
+ bottomIconView.setVisibility(View.VISIBLE);
+ }
+ return toastView;
+ }
+
+
+ /**
+ * Show the toast for a short period of time.
*
* @param text The text.
*/
- public static void showLong(final CharSequence text) {
- show(text == null ? NULL : text, Toast.LENGTH_LONG);
+ public static void showShort(final CharSequence text) {
+ show(text, Toast.LENGTH_SHORT, DEFAULT_TOAST_UTILS);
}
/**
- * Show the toast for a long period of time.
+ * Show the toast for a short period of time.
*
* @param resId The resource id for text.
*/
- public static void showLong(@StringRes final int resId) {
- show(resId, Toast.LENGTH_LONG);
+ public static void showShort(@StringRes final int resId) {
+ show(UtilsBridge.getString(resId), Toast.LENGTH_SHORT, DEFAULT_TOAST_UTILS);
}
/**
- * Show the toast for a long period of time.
+ * Show the toast for a short period of time.
*
* @param resId The resource id for text.
* @param args The args.
*/
- public static void showLong(@StringRes final int resId, final Object... args) {
- show(resId, Toast.LENGTH_LONG, args);
+ public static void showShort(@StringRes final int resId, final Object... args) {
+ show(UtilsBridge.getString(resId, args), Toast.LENGTH_SHORT, DEFAULT_TOAST_UTILS);
}
/**
- * Show the toast for a long period of time.
+ * Show the toast for a short period of time.
*
* @param format The format.
* @param args The args.
*/
- public static void showLong(final String format, final Object... args) {
- show(format, Toast.LENGTH_LONG, args);
+ public static void showShort(final String format, final Object... args) {
+ show(UtilsBridge.format(format, args), Toast.LENGTH_SHORT, DEFAULT_TOAST_UTILS);
}
/**
- * Show custom toast for a short period of time.
+ * Show the toast for a long period of time.
*
- * @param layoutId ID for an XML layout resource to load.
+ * @param text The text.
*/
- public static View showCustomShort(@LayoutRes final int layoutId) {
- return showCustomShort(getView(layoutId));
+ public static void showLong(final CharSequence text) {
+ show(text, Toast.LENGTH_LONG, DEFAULT_TOAST_UTILS);
}
/**
- * Show custom toast for a short period of time.
+ * Show the toast for a long period of time.
*
- * @param view The view of toast.
+ * @param resId The resource id for text.
*/
- public static View showCustomShort(final View view) {
- show(view, Toast.LENGTH_SHORT);
- return view;
+ public static void showLong(@StringRes final int resId) {
+ show(UtilsBridge.getString(resId), Toast.LENGTH_LONG, DEFAULT_TOAST_UTILS);
}
/**
- * Show custom toast for a long period of time.
+ * Show the toast for a long period of time.
*
- * @param layoutId ID for an XML layout resource to load.
+ * @param resId The resource id for text.
+ * @param args The args.
*/
- public static View showCustomLong(@LayoutRes final int layoutId) {
- return showCustomLong(getView(layoutId));
+ public static void showLong(@StringRes final int resId, final Object... args) {
+ show(UtilsBridge.getString(resId), Toast.LENGTH_LONG, DEFAULT_TOAST_UTILS);
}
/**
- * Show custom toast for a long period of time.
+ * Show the toast for a long period of time.
*
- * @param view The view of toast.
+ * @param format The format.
+ * @param args The args.
*/
- public static View showCustomLong(final View view) {
- show(view, Toast.LENGTH_LONG);
- return view;
+ public static void showLong(final String format, final Object... args) {
+ show(UtilsBridge.format(format, args), Toast.LENGTH_LONG, DEFAULT_TOAST_UTILS);
}
/**
@@ -225,93 +427,79 @@ public static View showCustomLong(final View view) {
public static void cancel() {
if (iToast != null) {
iToast.cancel();
+ iToast = null;
}
}
- private static void show(final int resId, final int duration) {
- show(resId, duration, (Object) null);
- }
-
- private static void show(final int resId, final int duration, final Object... args) {
- try {
- CharSequence text = Utils.getApp().getResources().getText(resId);
- if (args != null && args.length > 0) {
- text = String.format(text.toString(), args);
- }
- show(text, duration);
- } catch (Exception ignore) {
- show(String.valueOf(resId), duration);
- }
+ private static void show(final CharSequence text, final int duration, final ToastUtils utils) {
+ show(null, getToastFriendlyText(text), duration, utils);
}
- private static void show(final String format, final int duration, final Object... args) {
- String text = format;
- if (text == null) {
- text = NULL;
- } else {
- if (args != null && args.length > 0) {
- text = String.format(format, args);
- }
- }
- show(text, duration);
+ private static void show(final View view, final int duration, final ToastUtils utils) {
+ show(view, null, duration, utils);
}
- private static void show(final CharSequence text, final int duration) {
- show(null, text, duration);
- }
-
- private static void show(final View view, final int duration) {
- show(view, null, duration);
- }
-
- private static void show(@Nullable final View view, final CharSequence text, final int duration) {
+ private static void show(@Nullable final View view, final CharSequence text, final int duration, final ToastUtils utils) {
UtilsBridge.runOnUiThread(new Runnable() {
@Override
public void run() {
cancel();
- iToast = newToast();
+ iToast = newToast(utils);
if (view != null) {
- iToast.setView(view);
+ iToast.setToastView(view);
} else {
- iToast.setMsgView(text);
+ iToast.setToastView(text);
}
- iToast.setDuration(duration);
- if (sGravity != -1 || sXOffset != -1 || sYOffset != -1) {
- iToast.setGravity(sGravity, sXOffset, sYOffset);
- }
- iToast.show();
+ iToast.show(duration);
}
});
}
+ private static CharSequence getToastFriendlyText(CharSequence src) {
+ CharSequence text = src;
+ if (text == null) {
+ text = NULL;
+ } else if (text.length() == 0) {
+ text = NOTHING;
+ }
+ return text;
+ }
- private static IToast newToast() {
- if (NotificationManagerCompat.from(Utils.getApp()).areNotificationsEnabled()) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ private static IToast newToast(ToastUtils toastUtils) {
+ if (!toastUtils.isNotUseSystemToast) {
+ if (NotificationManagerCompat.from(Utils.getApp()).areNotificationsEnabled()) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return new SystemToast(toastUtils);
+ }
if (!UtilsBridge.isGrantedDrawOverlays()) {
- return new SystemToast(new Toast(Utils.getApp()));
+ return new SystemToast(toastUtils);
}
}
}
- return new ToastWithoutNotification(new Toast(Utils.getApp()));
- }
- private static View getView(@LayoutRes final int layoutId) {
- LayoutInflater inflate =
- (LayoutInflater) Utils.getApp().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- return inflate.inflate(layoutId, null);
+ // no notification
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
+ return new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_TOAST);
+ } else if (UtilsBridge.isGrantedDrawOverlays()) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
+ } else {
+ new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_PHONE);
+ }
+ }
+ return new ActivityToast(toastUtils);
}
- static class SystemToast extends AbsToast {
+ static final class SystemToast extends AbsToast {
- SystemToast(Toast toast) {
- super(toast);
+ SystemToast(ToastUtils toastUtils) {
+ super(toastUtils);
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) {
try {
//noinspection JavaReflectionMemberAccess
Field mTNField = Toast.class.getDeclaredField("mTN");
mTNField.setAccessible(true);
- Object mTN = mTNField.get(toast);
+ Object mTN = mTNField.get(mToast);
Field mTNmHandlerField = mTNField.getType().getDeclaredField("mHandler");
mTNmHandlerField.setAccessible(true);
Handler tnHandler = (Handler) mTNmHandlerField.get(mTN);
@@ -321,16 +509,12 @@ static class SystemToast extends AbsToast {
}
@Override
- public void show() {
+ public void show(int duration) {
+ if (mToast == null) return;
+ mToast.setDuration(duration);
mToast.show();
}
- @Override
- public void cancel() {
- mToast.cancel();
- super.cancel();
- }
-
static class SafeHandler extends Handler {
private Handler impl;
@@ -339,82 +523,38 @@ static class SafeHandler extends Handler {
}
@Override
- public void handleMessage(Message msg) {
+ public void handleMessage(@NonNull Message msg) {
impl.handleMessage(msg);
}
@Override
- public void dispatchMessage(Message msg) {
+ public void dispatchMessage(@NonNull Message msg) {
try {
impl.dispatchMessage(msg);
} catch (Exception e) {
- Log.e("ToastUtils", e.toString());
+ e.printStackTrace();
}
}
}
}
- static class ToastWithoutNotification extends AbsToast {
+ static final class WindowManagerToast extends AbsToast {
private WindowManager mWM;
- private WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+ private WindowManager.LayoutParams mParams;
- ToastWithoutNotification(Toast toast) {
- super(toast);
+ private Utils.ActivityLifecycleCallbacks mActivityLifecycleCallbacks;
+
+ WindowManagerToast(ToastUtils toastUtils, int type) {
+ super(toastUtils);
+ mParams = new WindowManager.LayoutParams();
+ mParams.type = type;
}
@Override
- public void show() {
+ public void show(final int duration) {
if (mToast == null) return;
- boolean isActivityContext = false;
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
- mWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
- mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
- } else if (UtilsBridge.isGrantedDrawOverlays()) {
- mWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
- } else {
- mParams.type = WindowManager.LayoutParams.TYPE_PHONE;
- }
- } else {
- Context topActivityOrApp = UtilsBridge.getTopActivityOrApp();
- if (!(topActivityOrApp instanceof Activity)) {
- Log.w("ToastUtils", "Couldn't get top Activity.");
- // try to use system toast
- new SystemToast(mToast).show();
- return;
- }
- Activity topActivity = (Activity) topActivityOrApp;
- if (topActivity.isFinishing() || topActivity.isDestroyed()) {
- Log.w("ToastUtils", topActivity + " is useless");
- // try to use system toast
- new SystemToast(mToast).show();
- return;
- }
- isActivityContext = true;
- mWM = topActivity.getWindowManager();
- mParams.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
- UtilsBridge.addActivityLifecycleCallbacks(topActivity, getActivityLifecycleCallbacks());
- }
-
- setToastParams();
-
- final long duration = mToast.getDuration() == Toast.LENGTH_SHORT ? 2000 : 3500;
- if (isActivityContext) {
- UtilsBridge.runOnUiThreadDelayed(new Runnable() {
- @Override
- public void run() {
- setToast(duration);
- }
- }, 300);
- } else {
- setToast(duration);
- }
- }
-
- private void setToastParams() {
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.format = PixelFormat.TRANSLUCENT;
@@ -437,9 +577,8 @@ private void setToastParams() {
mParams.y = mToast.getYOffset();
mParams.horizontalMargin = mToast.getHorizontalMargin();
mParams.verticalMargin = mToast.getVerticalMargin();
- }
- private void setToast(long duration) {
+ mWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
try {
if (mWM != null) {
mWM.addView(mToastView, mParams);
@@ -451,18 +590,7 @@ private void setToast(long duration) {
public void run() {
cancel();
}
- }, duration);
- }
-
- private Utils.ActivityLifecycleCallbacks getActivityLifecycleCallbacks() {
- return new Utils.ActivityLifecycleCallbacks() {
- @Override
- public void onActivityDestroyed(@NonNull Activity activity) {
- if (iToast == null) return;
- activity.getWindow().getDecorView().setVisibility(View.GONE);
- iToast.cancel();
- }
- };
+ }, duration == Toast.LENGTH_SHORT ? 2000 : 3500);
}
@Override
@@ -470,95 +598,205 @@ public void cancel() {
try {
if (mWM != null) {
mWM.removeViewImmediate(mToastView);
+ mWM = null;
}
} catch (Exception ignored) {/**/}
- mWM = null;
super.cancel();
}
}
- static abstract class AbsToast implements IToast {
+ static final class ActivityToast extends AbsToast {
- protected Toast mToast;
- protected View mToastView;
+ private static int sShowingIndex = 0;
- AbsToast(Toast toast) {
- mToast = toast;
- }
+ private Utils.ActivityLifecycleCallbacks mActivityLifecycleCallbacks;
- @Override
- public void setView(View view) {
- mToastView = view;
- mToast.setView(mToastView);
+ ActivityToast(ToastUtils toastUtils) {
+ super(toastUtils);
}
@Override
- public void setMsgView(CharSequence text) {
- mToastView = mToast.getView();
- if (mToastView == null || mToastView.findViewById(android.R.id.message) == null) {
- mToastView = ToastUtils.getView(R.layout.toast_layout);
- mToast.setView(mToastView);
+ public void show(int duration) {
+ if (mToast == null) return;
+ if (!UtilsBridge.isAppForeground()) {
+ // try to use system toast
+ showSystemToast(duration);
+ return;
}
+ boolean hasAliveActivity = false;
+ for (final Activity activity : UtilsBridge.getActivityList()) {
+ if (!UtilsBridge.isActivityAlive(activity)) {
+ continue;
+ }
+ hasAliveActivity = true;
+ showWithActivity(activity, sShowingIndex, true);
+ }
+ if (hasAliveActivity) {
+ registerLifecycleCallback();
+ UtilsBridge.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ cancel();
+ }
+ }, duration == Toast.LENGTH_SHORT ? 2000 : 3500);
- TextView tvMessage = mToastView.findViewById(android.R.id.message);
- tvMessage.setText(text);
- if (sMsgColor != COLOR_DEFAULT) {
- tvMessage.setTextColor(sMsgColor);
+ ++sShowingIndex;
+ } else {
+ // try to use system toast
+ showSystemToast(duration);
}
- if (sMsgTextSize != -1) {
- tvMessage.setTextSize(sMsgTextSize);
+ }
+
+ @Override
+ public void cancel() {
+ if (isShowing()) {
+ unregisterLifecycleCallback();
+ for (Activity activity : UtilsBridge.getActivityList()) {
+ if (!UtilsBridge.isActivityAlive(activity)) {
+ continue;
+ }
+ final Window window = activity.getWindow();
+ if (window != null) {
+ ViewGroup decorView = (ViewGroup) window.getDecorView();
+ View toastView = decorView.findViewWithTag(TAG_TOAST + (sShowingIndex - 1));
+ if (toastView != null) {
+ try {
+ decorView.removeView(toastView);
+ } catch (Exception ignored) {/**/}
+ }
+ }
+ }
}
- setBg(tvMessage);
- }
-
- private void setBg(final TextView tvMsg) {
- if (sBgResource != -1) {
- mToastView.setBackgroundResource(sBgResource);
- tvMsg.setBackgroundColor(Color.TRANSPARENT);
- } else if (sBgColor != COLOR_DEFAULT) {
- Drawable tvBg = mToastView.getBackground();
- Drawable msgBg = tvMsg.getBackground();
- if (tvBg != null && msgBg != null) {
- tvBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
- tvMsg.setBackgroundColor(Color.TRANSPARENT);
- } else if (tvBg != null) {
- tvBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
- } else if (msgBg != null) {
- msgBg.setColorFilter(new PorterDuffColorFilter(sBgColor, PorterDuff.Mode.SRC_IN));
- } else {
- mToastView.setBackgroundColor(sBgColor);
+ super.cancel();
+ }
+
+ private void showSystemToast(int duration) {
+ SystemToast systemToast = new SystemToast(mToastUtils);
+ systemToast.mToast = mToast;
+ systemToast.show(duration);
+ }
+
+ private void showWithActivity(final Activity activity, final int index, boolean useAnim) {
+ final Window window = activity.getWindow();
+ if (window != null) {
+ final ViewGroup decorView = (ViewGroup) window.getDecorView();
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
+ );
+ lp.gravity = mToast.getGravity();
+ lp.bottomMargin = mToast.getYOffset() + UtilsBridge.getNavBarHeight();
+ lp.leftMargin = mToast.getXOffset();
+ View toastViewSnapshot = getToastViewSnapshot(index);
+ if (useAnim) {
+ toastViewSnapshot.setAlpha(0);
+ toastViewSnapshot.animate().alpha(1).setDuration(200).start();
}
+ decorView.addView(toastViewSnapshot, lp);
}
}
- @Override
- public View getView() {
- return mToastView;
+ private View getToastViewSnapshot(final int index) {
+ Bitmap bitmap = UtilsBridge.view2Bitmap(mToastView);
+ ImageView toastIv = new ImageView(Utils.getApp());
+ toastIv.setTag(TAG_TOAST + index);
+ toastIv.setImageBitmap(bitmap);
+ return toastIv;
}
- @Override
- public void setDuration(int duration) {
- mToast.setDuration(duration);
+ private void registerLifecycleCallback() {
+ final int index = sShowingIndex;
+ mActivityLifecycleCallbacks = new Utils.ActivityLifecycleCallbacks() {
+ @Override
+ public void onActivityCreated(@NonNull Activity activity) {
+ if (isShowing()) {
+ showWithActivity(activity, index, false);
+ }
+ }
+ };
+ UtilsBridge.addActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
}
- @Override
- public void setGravity(int gravity, int xOffset, int yOffset) {
- mToast.setGravity(gravity, xOffset, yOffset);
+ private void unregisterLifecycleCallback() {
+ UtilsBridge.removeActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
+ mActivityLifecycleCallbacks = null;
+ }
+
+ private boolean isShowing() {
+ return mActivityLifecycleCallbacks != null;
+ }
+ }
+
+ static abstract class AbsToast implements IToast {
+
+ protected Toast mToast;
+ protected ToastUtils mToastUtils;
+ protected View mToastView;
+
+ AbsToast(ToastUtils toastUtils) {
+ mToast = new Toast(Utils.getApp());
+ mToastUtils = toastUtils;
+
+ if (mToastUtils.mGravity != -1 || mToastUtils.mXOffset != -1 || mToastUtils.mYOffset != -1) {
+ mToast.setGravity(mToastUtils.mGravity, mToastUtils.mXOffset, mToastUtils.mYOffset);
+ }
}
@Override
- public void setText(int resId) {
- mToast.setText(resId);
+ public void setToastView(View view) {
+ mToastView = view;
+ mToast.setView(mToastView);
}
@Override
- public void setText(CharSequence s) {
- mToast.setText(s);
+ public void setToastView(CharSequence text) {
+ View utilsToastView = mToastUtils.tryApplyUtilsToastView(text);
+ if (utilsToastView != null) {
+ setToastView(utilsToastView);
+ return;
+ }
+
+ mToastView = mToast.getView();
+ if (mToastView == null || mToastView.findViewById(android.R.id.message) == null) {
+ setToastView(UtilsBridge.layoutId2View(R.layout.utils_toast_view));
+ }
+
+ TextView messageTv = mToastView.findViewById(android.R.id.message);
+ messageTv.setText(text);
+ if (mToastUtils.mTextColor != COLOR_DEFAULT) {
+ messageTv.setTextColor(mToastUtils.mTextColor);
+ }
+ if (mToastUtils.mTextSize != -1) {
+ messageTv.setTextSize(mToastUtils.mTextSize);
+ }
+ setBg(messageTv);
+ }
+
+ protected void setBg(final TextView msgTv) {
+ if (mToastUtils.mBgResource != -1) {
+ mToastView.setBackgroundResource(mToastUtils.mBgResource);
+ msgTv.setBackgroundColor(Color.TRANSPARENT);
+ } else if (mToastUtils.mBgColor != COLOR_DEFAULT) {
+ Drawable toastBg = mToastView.getBackground();
+ Drawable msgBg = msgTv.getBackground();
+ if (toastBg != null && msgBg != null) {
+ toastBg.mutate().setColorFilter(new PorterDuffColorFilter(mToastUtils.mBgColor, PorterDuff.Mode.SRC_IN));
+ msgTv.setBackgroundColor(Color.TRANSPARENT);
+ } else if (toastBg != null) {
+ toastBg.mutate().setColorFilter(new PorterDuffColorFilter(mToastUtils.mBgColor, PorterDuff.Mode.SRC_IN));
+ } else if (msgBg != null) {
+ msgBg.mutate().setColorFilter(new PorterDuffColorFilter(mToastUtils.mBgColor, PorterDuff.Mode.SRC_IN));
+ } else {
+ mToastView.setBackgroundColor(mToastUtils.mBgColor);
+ }
+ }
}
@Override
@CallSuper
public void cancel() {
+ if (mToast != null) {
+ mToast.cancel();
+ }
mToast = null;
mToastView = null;
}
@@ -566,22 +804,35 @@ public void cancel() {
interface IToast {
- void show();
+ void setToastView(View view);
- void cancel();
+ void setToastView(CharSequence text);
+
+ void show(int duration);
- void setView(View view);
+ void cancel();
+ }
- void setMsgView(CharSequence text);
+ public static final class UtilsMaxWidthRelativeLayout extends RelativeLayout {
- View getView();
+ private static final int SPACING = UtilsBridge.dp2px(80);
- void setDuration(int duration);
+ public UtilsMaxWidthRelativeLayout(Context context) {
+ super(context);
+ }
- void setGravity(int gravity, int xOffset, int yOffset);
+ public UtilsMaxWidthRelativeLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
- void setText(@StringRes int resId);
+ public UtilsMaxWidthRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
- void setText(CharSequence s);
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int widthMaxSpec = MeasureSpec.makeMeasureSpec(UtilsBridge.getAppScreenWidth() - SPACING, MeasureSpec.AT_MOST);
+ super.onMeasure(widthMaxSpec, heightMeasureSpec);
+ }
}
}
\ No newline at end of file
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java
index 0123ab96c1..5fa5ae3043 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsActivityLifecycleImpl.java
@@ -13,11 +13,11 @@
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
*
@@ -33,9 +33,11 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
private final LinkedList mActivityList = new LinkedList<>();
- private final List mStatusListeners = new ArrayList<>();
+ private final List mStatusListeners = new CopyOnWriteArrayList<>();
private final Map> mActivityLifecycleCallbacksMap = new ConcurrentHashMap<>();
+ private static final Activity STUB = new Activity();
+
private int mForegroundCount = 0;
private int mConfigCount = 0;
private boolean mIsBackground = false;
@@ -62,11 +64,11 @@ Activity getTopActivity() {
List getActivityList() {
if (!mActivityList.isEmpty()) {
- return mActivityList;
+ return new LinkedList<>(mActivityList);
}
List reflectActivities = getActivitiesByReflect();
mActivityList.addAll(reflectActivities);
- return mActivityList;
+ return new LinkedList<>(mActivityList);
}
void addOnAppStatusChangedListener(final Utils.OnAppStatusChangedListener listener) {
@@ -77,6 +79,10 @@ void removeOnAppStatusChangedListener(final Utils.OnAppStatusChangedListener lis
mStatusListeners.remove(listener);
}
+ void addActivityLifecycleCallbacks(final Utils.ActivityLifecycleCallbacks listener) {
+ addActivityLifecycleCallbacks(STUB, listener);
+ }
+
void addActivityLifecycleCallbacks(final Activity activity,
final Utils.ActivityLifecycleCallbacks listener) {
if (activity == null || listener == null) return;
@@ -88,37 +94,20 @@ public void run() {
});
}
- Application getApplicationByReflect() {
- try {
- Class activityThreadClass = Class.forName("android.app.ActivityThread");
- Object thread = getActivityThread();
- Object app = activityThreadClass.getMethod("getApplication").invoke(thread);
- if (app == null) {
- return null;
- }
- return (Application) app;
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- return null;
- }
-
private void addActivityLifecycleCallbacksInner(final Activity activity,
- final Utils.ActivityLifecycleCallbacks lifecycleCallbacks) {
- List callbacks = mActivityLifecycleCallbacksMap.get(activity);
- if (callbacks == null) {
- callbacks = new ArrayList<>();
- mActivityLifecycleCallbacksMap.put(activity, callbacks);
+ final Utils.ActivityLifecycleCallbacks callbacks) {
+ List callbacksList = mActivityLifecycleCallbacksMap.get(activity);
+ if (callbacksList == null) {
+ callbacksList = new CopyOnWriteArrayList<>();
+ mActivityLifecycleCallbacksMap.put(activity, callbacksList);
} else {
- if (callbacks.contains(lifecycleCallbacks)) return;
+ if (callbacksList.contains(callbacks)) return;
}
- callbacks.add(lifecycleCallbacks);
+ callbacksList.add(callbacks);
+ }
+
+ void removeActivityLifecycleCallbacks(final Utils.ActivityLifecycleCallbacks callbacks) {
+ removeActivityLifecycleCallbacks(STUB, callbacks);
}
void removeActivityLifecycleCallbacks(final Activity activity) {
@@ -143,36 +132,60 @@ public void run() {
}
private void removeActivityLifecycleCallbacksInner(final Activity activity,
- final Utils.ActivityLifecycleCallbacks lifecycleCallbacks) {
- List callbacks = mActivityLifecycleCallbacksMap.get(activity);
- if (callbacks != null && !callbacks.isEmpty()) {
- callbacks.remove(lifecycleCallbacks);
+ final Utils.ActivityLifecycleCallbacks callbacks) {
+ List callbacksList = mActivityLifecycleCallbacksMap.get(activity);
+ if (callbacksList != null && !callbacksList.isEmpty()) {
+ callbacksList.remove(callbacks);
}
}
private void consumeActivityLifecycleCallbacks(Activity activity, Lifecycle.Event event) {
- List listeners = mActivityLifecycleCallbacksMap.get(activity);
- if (listeners != null) {
- for (Utils.ActivityLifecycleCallbacks listener : listeners) {
- listener.onLifecycleChanged(activity, event);
- if (event.equals(Lifecycle.Event.ON_CREATE)) {
- listener.onActivityCreated(activity);
- } else if (event.equals(Lifecycle.Event.ON_START)) {
- listener.onActivityStarted(activity);
- } else if (event.equals(Lifecycle.Event.ON_RESUME)) {
- listener.onActivityResumed(activity);
- } else if (event.equals(Lifecycle.Event.ON_PAUSE)) {
- listener.onActivityPaused(activity);
- } else if (event.equals(Lifecycle.Event.ON_STOP)) {
- listener.onActivityStopped(activity);
- } else if (event.equals(Lifecycle.Event.ON_DESTROY)) {
- listener.onActivityDestroyed(activity);
- }
+ consumeLifecycle(activity, event, mActivityLifecycleCallbacksMap.get(activity));
+ consumeLifecycle(activity, event, mActivityLifecycleCallbacksMap.get(STUB));
+ }
+
+ private void consumeLifecycle(Activity activity, Lifecycle.Event event, List listeners) {
+ if (listeners == null) return;
+ for (Utils.ActivityLifecycleCallbacks listener : listeners) {
+ listener.onLifecycleChanged(activity, event);
+ if (event.equals(Lifecycle.Event.ON_CREATE)) {
+ listener.onActivityCreated(activity);
+ } else if (event.equals(Lifecycle.Event.ON_START)) {
+ listener.onActivityStarted(activity);
+ } else if (event.equals(Lifecycle.Event.ON_RESUME)) {
+ listener.onActivityResumed(activity);
+ } else if (event.equals(Lifecycle.Event.ON_PAUSE)) {
+ listener.onActivityPaused(activity);
+ } else if (event.equals(Lifecycle.Event.ON_STOP)) {
+ listener.onActivityStopped(activity);
+ } else if (event.equals(Lifecycle.Event.ON_DESTROY)) {
+ listener.onActivityDestroyed(activity);
}
- if (event.equals(Lifecycle.Event.ON_DESTROY)) {
- mActivityLifecycleCallbacksMap.remove(activity);
+ }
+ if (event.equals(Lifecycle.Event.ON_DESTROY)) {
+ mActivityLifecycleCallbacksMap.remove(activity);
+ }
+ }
+
+ Application getApplicationByReflect() {
+ try {
+ Class activityThreadClass = Class.forName("android.app.ActivityThread");
+ Object thread = getActivityThread();
+ Object app = activityThreadClass.getMethod("getApplication").invoke(thread);
+ if (app == null) {
+ return null;
}
+ return (Application) app;
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
}
+ return null;
}
///////////////////////////////////////////////////////////////////////////
@@ -180,7 +193,7 @@ private void consumeActivityLifecycleCallbacks(Activity activity, Lifecycle.Even
///////////////////////////////////////////////////////////////////////////
@Override
public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {
- UtilsBridge.applyLanguage(activity);
+ LanguageUtils.applyLanguage(activity);
setAnimatorsEnabled();
setTopActivity(activity);
consumeActivityLifecycleCallbacks(activity, Lifecycle.Event.ON_CREATE);
@@ -249,23 +262,30 @@ public void onActivityDestroyed(@NonNull Activity activity) {
* the keyboard from closing when curActivity onDestroy.
*/
private void processHideSoftInputOnActivityDestroy(final Activity activity, boolean isSave) {
- if (isSave) {
- final WindowManager.LayoutParams attrs = activity.getWindow().getAttributes();
- final int softInputMode = attrs.softInputMode;
- activity.getWindow().getDecorView().setTag(-123, softInputMode);
- activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
- } else {
- final Object tag = activity.getWindow().getDecorView().getTag(-123);
- if (!(tag instanceof Integer)) return;
- UtilsBridge.runOnUiThreadDelayed(new Runnable() {
- @Override
- public void run() {
- Window window = activity.getWindow();
- if (window != null) {
- window.setSoftInputMode(((Integer) tag));
+ try {
+ if (isSave) {
+ Window window = activity.getWindow();
+ final WindowManager.LayoutParams attrs = window.getAttributes();
+ final int softInputMode = attrs.softInputMode;
+ window.getDecorView().setTag(-123, softInputMode);
+ window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
+ } else {
+ final Object tag = activity.getWindow().getDecorView().getTag(-123);
+ if (!(tag instanceof Integer)) return;
+ UtilsBridge.runOnUiThreadDelayed(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Window window = activity.getWindow();
+ if (window != null) {
+ window.setSoftInputMode(((Integer) tag));
+ }
+ } catch (Exception ignore) {
+ }
}
- }
- }, 100);
+ }, 100);
+ }
+ } catch (Exception ignore) {
}
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java
index 97ec53579d..4c36704595 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsBridge.java
@@ -9,9 +9,12 @@
import android.net.Uri;
import android.os.Build;
import android.os.Parcelable;
+import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.annotation.RequiresPermission;
+import android.support.annotation.StringRes;
+import android.text.TextUtils;
import android.view.View;
import com.google.gson.Gson;
@@ -24,7 +27,9 @@
import java.io.InputStream;
import java.io.Serializable;
import java.lang.reflect.Type;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import static android.Manifest.permission.CALL_PHONE;
@@ -65,6 +70,14 @@ static void removeOnAppStatusChangedListener(final Utils.OnAppStatusChangedListe
UtilsActivityLifecycleImpl.INSTANCE.removeOnAppStatusChangedListener(listener);
}
+ static void addActivityLifecycleCallbacks(final Utils.ActivityLifecycleCallbacks callbacks) {
+ UtilsActivityLifecycleImpl.INSTANCE.addActivityLifecycleCallbacks(callbacks);
+ }
+
+ static void removeActivityLifecycleCallbacks(final Utils.ActivityLifecycleCallbacks callbacks) {
+ UtilsActivityLifecycleImpl.INSTANCE.removeActivityLifecycleCallbacks(callbacks);
+ }
+
static void addActivityLifecycleCallbacks(final Activity activity,
final Utils.ActivityLifecycleCallbacks callbacks) {
UtilsActivityLifecycleImpl.INSTANCE.addActivityLifecycleCallbacks(activity, callbacks);
@@ -94,10 +107,6 @@ static boolean isActivityAlive(final Activity activity) {
return ActivityUtils.isActivityAlive(activity);
}
- static String getLauncherActivity() {
- return ActivityUtils.getLauncherActivity();
- }
-
static String getLauncherActivity(final String pkg) {
return ActivityUtils.getLauncherActivity(pkg);
}
@@ -126,6 +135,10 @@ static Context getTopActivityOrApp() {
}
}
+ static boolean isAppForeground() {
+ return AppUtils.isAppForeground();
+ }
+
static boolean isAppRunning(@NonNull final String pkgName) {
return AppUtils.isAppRunning(pkgName);
}
@@ -134,18 +147,14 @@ static boolean isAppInstalled(final String pkgName) {
return AppUtils.isAppInstalled(pkgName);
}
- static String getAppVersionName() {
- return AppUtils.getAppVersionName();
- }
-
- static int getAppVersionCode() {
- return AppUtils.getAppVersionCode();
- }
-
static boolean isAppDebug() {
return AppUtils.isAppDebug();
}
+ static void relaunchApp() {
+ AppUtils.relaunchApp();
+ }
+
///////////////////////////////////////////////////////////////////////////
// BarUtils
///////////////////////////////////////////////////////////////////////////
@@ -418,13 +427,6 @@ static void fixSoftInputLeaks(final Activity activity) {
KeyboardUtils.fixSoftInputLeaks(activity);
}
- ///////////////////////////////////////////////////////////////////////////
- // LanguageUtils
- ///////////////////////////////////////////////////////////////////////////
- static void applyLanguage(final Activity activity) {
- LanguageUtils.applyLanguage(activity);
- }
-
///////////////////////////////////////////////////////////////////////////
// PermissionUtils
///////////////////////////////////////////////////////////////////////////
@@ -460,12 +462,15 @@ static boolean isSamsung() {
}
///////////////////////////////////////////////////////////////////////////
- // SDCardUtils
+ // ScreenUtils
///////////////////////////////////////////////////////////////////////////
- static String getSDCardPathByEnvironment() {
- return SDCardUtils.getSDCardPathByEnvironment();
+ static int getAppScreenWidth() {
+ return ScreenUtils.getAppScreenWidth();
}
+ ///////////////////////////////////////////////////////////////////////////
+ // SDCardUtils
+ ///////////////////////////////////////////////////////////////////////////
static boolean isSDCardEnableByEnvironment() {
return SDCardUtils.isSDCardEnableByEnvironment();
}
@@ -521,6 +526,18 @@ static boolean equals(final CharSequence s1, final CharSequence s2) {
return StringUtils.equals(s1, s2);
}
+ static String getString(@StringRes int id) {
+ return StringUtils.getString(id);
+ }
+
+ static String getString(@StringRes int id, Object... formatArgs) {
+ return StringUtils.getString(id, formatArgs);
+ }
+
+ static String format(String str, Object... args) {
+ return StringUtils.format(str, args);
+ }
+
///////////////////////////////////////////////////////////////////////////
// ThreadUtils
@@ -579,4 +596,88 @@ static Uri file2Uri(final File file) {
static File uri2File(final Uri uri) {
return UriUtils.uri2File(uri);
}
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // ViewUtils
+ ///////////////////////////////////////////////////////////////////////////
+ static View layoutId2View(@LayoutRes final int layoutId) {
+ return ViewUtils.layoutId2View(layoutId);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Common
+ ///////////////////////////////////////////////////////////////////////////
+ static final class FileHead {
+
+ private String mName;
+ private LinkedHashMap mFirst = new LinkedHashMap<>();
+ private LinkedHashMap mLast = new LinkedHashMap<>();
+
+ FileHead(String name) {
+ mName = name;
+ }
+
+ void addFirst(String key, String value) {
+ append2Host(mFirst, key, value);
+ }
+
+ void append(Map extra) {
+ append2Host(mLast, extra);
+ }
+
+ void append(String key, String value) {
+ append2Host(mLast, key, value);
+ }
+
+ private void append2Host(Map host, Map extra) {
+ if (extra == null || extra.isEmpty()) {
+ return;
+ }
+ for (Map.Entry entry : extra.entrySet()) {
+ append2Host(host, entry.getKey(), entry.getValue());
+ }
+ }
+
+ private void append2Host(Map host, String key, String value) {
+ if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
+ return;
+ }
+ int delta = 19 - key.length(); // 19 is length of "Device Manufacturer"
+ if (delta > 0) {
+ key = key + " ".substring(0, delta);
+ }
+ host.put(key, value);
+ }
+
+ public String getAppended() {
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry entry : mLast.entrySet()) {
+ sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ String border = "************* " + mName + " Head ****************\n";
+ sb.append(border);
+ for (Map.Entry entry : mFirst.entrySet()) {
+ sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
+ }
+
+ sb.append("Rom Info : ").append(RomUtils.getRomInfo()).append("\n");
+ sb.append("Device Manufacturer: ").append(Build.MANUFACTURER).append("\n");
+ sb.append("Device Model : ").append(Build.MODEL).append("\n");
+ sb.append("Android Version : ").append(Build.VERSION.RELEASE).append("\n");
+ sb.append("Android SDK : ").append(Build.VERSION.SDK_INT).append("\n");
+ sb.append("App VersionName : ").append(AppUtils.getAppVersionName()).append("\n");
+ sb.append("App VersionCode : ").append(AppUtils.getAppVersionCode()).append("\n");
+
+ sb.append(getAppended());
+ return sb.append(border).append("\n").toString();
+ }
+ }
}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
index 1b87d3687f..1d6e1dc7e0 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
@@ -131,7 +131,7 @@ protected void onDestroy() {
}
@Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
TransActivityDelegate callback = CALLBACK_MAP.get(this);
if (callback == null) return;
@@ -173,7 +173,7 @@ public void onStopped(@NonNull UtilsTransActivity activity) {/**/}
public void onSaveInstanceState(@NonNull UtilsTransActivity activity, Bundle outState) {/**/}
- public void onRequestPermissionsResult(@NonNull UtilsTransActivity activity, int requestCode, String[] permissions, int[] grantResults) {/**/}
+ public void onRequestPermissionsResult(@NonNull UtilsTransActivity activity, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {/**/}
public void onActivityResult(@NonNull UtilsTransActivity activity, int requestCode, int resultCode, Intent data) {/**/}
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
index 44ef6dc2cf..a06e3503bf 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
@@ -1,7 +1,10 @@
package com.blankj.utilcode.util;
+import android.content.Context;
import android.os.Build;
+import android.support.annotation.LayoutRes;
import android.text.TextUtils;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -106,4 +109,10 @@ public static void fixScrollViewTopping(View view) {
}
}
}
+
+ public static View layoutId2View(@LayoutRes final int layoutId) {
+ LayoutInflater inflate =
+ (LayoutInflater) Utils.getApp().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ return inflate.inflate(layoutId, null);
+ }
}
\ No newline at end of file
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/VolumeUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/VolumeUtils.java
new file mode 100644
index 0000000000..ed3b62ae76
--- /dev/null
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/VolumeUtils.java
@@ -0,0 +1,120 @@
+package com.blankj.utilcode.util;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.os.Build;
+
+/**
+ *
+ * author: blankj
+ * blog : http://blankj.com
+ * time : 2020/09/08
+ * desc : utils about volume
+ *
+ */
+public class VolumeUtils {
+
+ /**
+ * Return the volume.
+ *
+ * @param streamType The stream type.
+ *
+ * {@link AudioManager#STREAM_VOICE_CALL}
+ * {@link AudioManager#STREAM_SYSTEM}
+ * {@link AudioManager#STREAM_RING}
+ * {@link AudioManager#STREAM_MUSIC}
+ * {@link AudioManager#STREAM_ALARM}
+ * {@link AudioManager#STREAM_NOTIFICATION}
+ * {@link AudioManager#STREAM_DTMF}
+ * {@link AudioManager#STREAM_ACCESSIBILITY}
+ *
+ * @return the volume
+ */
+ public static int getVolume(int streamType) {
+ AudioManager am = (AudioManager) Utils.getApp().getSystemService(Context.AUDIO_SERVICE);
+ //noinspection ConstantConditions
+ return am.getStreamVolume(streamType);
+ }
+
+ /**
+ * Sets media volume.
+ * When setting the value of parameter 'volume' greater than the maximum value of the media volume will not either cause error or throw exception but maximize the media volume.
+ * Setting the value of volume lower than 0 will minimize the media volume.
+ *
+ * @param streamType The stream type.
+ *
+ * {@link AudioManager#STREAM_VOICE_CALL}
+ * {@link AudioManager#STREAM_SYSTEM}
+ * {@link AudioManager#STREAM_RING}
+ * {@link AudioManager#STREAM_MUSIC}
+ * {@link AudioManager#STREAM_ALARM}
+ * {@link AudioManager#STREAM_NOTIFICATION}
+ * {@link AudioManager#STREAM_DTMF}
+ * {@link AudioManager#STREAM_ACCESSIBILITY}
+ *
+ * @param volume The volume.
+ * @param flags The flags.
+ *
+ * {@link AudioManager#FLAG_SHOW_UI}
+ * {@link AudioManager#FLAG_ALLOW_RINGER_MODES}
+ * {@link AudioManager#FLAG_PLAY_SOUND}
+ * {@link AudioManager#FLAG_REMOVE_SOUND_AND_VIBRATE}
+ * {@link AudioManager#FLAG_VIBRATE}
+ *
+ */
+ public static void setVolume(int streamType, int volume, int flags) {
+ AudioManager am = (AudioManager) Utils.getApp().getSystemService(Context.AUDIO_SERVICE);
+ try {
+ //noinspection ConstantConditions
+ am.setStreamVolume(streamType, volume, flags);
+ } catch (SecurityException ignore) {
+ }
+ }
+
+ /**
+ * Return the maximum volume.
+ *
+ * @param streamType The stream type.
+ *
+ * {@link AudioManager#STREAM_VOICE_CALL}
+ * {@link AudioManager#STREAM_SYSTEM}
+ * {@link AudioManager#STREAM_RING}
+ * {@link AudioManager#STREAM_MUSIC}
+ * {@link AudioManager#STREAM_ALARM}
+ * {@link AudioManager#STREAM_NOTIFICATION}
+ * {@link AudioManager#STREAM_DTMF}
+ * {@link AudioManager#STREAM_ACCESSIBILITY}
+ *
+ * @return the maximum volume
+ */
+ public static int getMaxVolume(int streamType) {
+ AudioManager am = (AudioManager) Utils.getApp().getSystemService(Context.AUDIO_SERVICE);
+ //noinspection ConstantConditions
+ return am.getStreamMaxVolume(streamType);
+ }
+
+ /**
+ * Return the minimum volume.
+ *
+ * @param streamType The stream type.
+ *
+ * {@link AudioManager#STREAM_VOICE_CALL}
+ * {@link AudioManager#STREAM_SYSTEM}
+ * {@link AudioManager#STREAM_RING}
+ * {@link AudioManager#STREAM_MUSIC}
+ * {@link AudioManager#STREAM_ALARM}
+ * {@link AudioManager#STREAM_NOTIFICATION}
+ * {@link AudioManager#STREAM_DTMF}
+ * {@link AudioManager#STREAM_ACCESSIBILITY}
+ *
+ * @return the minimum volume
+ */
+ public static int getMinVolume(int streamType) {
+ AudioManager am = (AudioManager) Utils.getApp().getSystemService(Context.AUDIO_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ //noinspection ConstantConditions
+ return am.getStreamMinVolume(streamType);
+ }
+ return 0;
+ }
+}
diff --git a/lib/utilcode/src/main/res/drawable/toast_frame.xml b/lib/utilcode/src/main/res/drawable/utils_toast_bg.xml
similarity index 79%
rename from lib/utilcode/src/main/res/drawable/toast_frame.xml
rename to lib/utilcode/src/main/res/drawable/utils_toast_bg.xml
index 24e3922412..5e6370b319 100644
--- a/lib/utilcode/src/main/res/drawable/toast_frame.xml
+++ b/lib/utilcode/src/main/res/drawable/utils_toast_bg.xml
@@ -1,7 +1,6 @@
-
diff --git a/lib/utilcode/src/main/res/layout/toast_layout.xml b/lib/utilcode/src/main/res/layout/toast_layout.xml
deleted file mode 100644
index d66836ea8f..0000000000
--- a/lib/utilcode/src/main/res/layout/toast_layout.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/lib/utilcode/src/main/res/layout/utils_toast_view.xml b/lib/utilcode/src/main/res/layout/utils_toast_view.xml
new file mode 100644
index 0000000000..59af74b6bb
--- /dev/null
+++ b/lib/utilcode/src/main/res/layout/utils_toast_view.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/DebugUtils.java b/lib/utildebug/src/main/java/com/blankj/utildebug/DebugUtils.java
index 4a5d48fb8b..9855aa9b57 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/DebugUtils.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/DebugUtils.java
@@ -5,6 +5,7 @@
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.view.ViewGroup;
+import android.view.ViewParent;
import com.blankj.utilcode.util.Utils;
import com.blankj.utildebug.debug.IDebug;
@@ -71,6 +72,10 @@ public void onActivityStarted(Activity activity) {
@Override
public void onActivityResumed(Activity activity) {
+ ViewParent parent = DebugIcon.getInstance().getParent();
+ if (parent != null) {
+ ((ViewGroup) parent).removeView(DebugIcon.getInstance());
+ }
((ViewGroup) activity.findViewById(android.R.id.content)).addView(DebugIcon.getInstance(), mParams);
}
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/SwipeRightMenu.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/SwipeRightMenu.java
index 39ff5d7ada..2ab3325121 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/SwipeRightMenu.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/SwipeRightMenu.java
@@ -167,7 +167,7 @@ public boolean dispatchTouchEvent(MotionEvent event) {
if (isOpen()) {
if (isTouchPointInView(mContentView, x, y)) {
close(true);
- final long now = SystemClock.uptimeMillis();
+ final long now = SystemClock.elapsedRealtime();
final MotionEvent cancelEvent = MotionEvent.obtain(now, now,
MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
super.dispatchTouchEvent(cancelEvent);
@@ -292,7 +292,7 @@ public void close(SwipeRightMenu exclude) {
}
private void cancelChildViewTouch() {
- final long now = SystemClock.uptimeMillis();
+ final long now = SystemClock.elapsedRealtime();
final MotionEvent cancelEvent = MotionEvent.obtain(now, now,
MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
final int childCount = getChildCount();
From c351507a082875429db451bef2a818aead420077 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Sun, 25 Oct 2020 02:53:58 +0800
Subject: [PATCH 22/68] see 10/25 log
---
.../com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java | 2 --
lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java | 7 ++++---
lib/base/src/main/java/com/blankj/base/mvp/BaseView.java | 2 ++
.../java/com/blankj/utilcode/util/DebouncingUtils.java | 3 ++-
.../src/main/java/com/blankj/utilcode/util/ViewUtils.java | 3 ++-
5 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
index 05ae20c92d..7fff29f4a7 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java
@@ -1,7 +1,5 @@
package com.blankj.utilcode.pkg.feature.mvp;
-import android.arch.lifecycle.ViewModel;
-import android.arch.lifecycle.ViewModelProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java b/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
index 84c930fd74..2f2b81d6e0 100644
--- a/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BaseModel.java
@@ -1,10 +1,11 @@
package com.blankj.base.mvp;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.support.annotation.CallSuper;
import android.util.Log;
+import androidx.annotation.CallSuper;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
/**
*
* author: blankj
diff --git a/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java b/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
index 94f36bcdaa..a68909d01f 100644
--- a/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
+++ b/lib/base/src/main/java/com/blankj/base/mvp/BaseView.java
@@ -5,10 +5,12 @@
import java.util.HashMap;
import java.util.Map;
+import androidx.annotation.CallSuper;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
/**
*
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
index c9f2c8ff79..889ac86090 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DebouncingUtils.java
@@ -1,7 +1,6 @@
package com.blankj.utilcode.util;
import android.os.SystemClock;
-import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.View;
@@ -9,6 +8,8 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import androidx.annotation.NonNull;
+
/**
*
* author: Blankj
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
index a06e3503bf..f0ef043322 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
@@ -2,7 +2,6 @@
import android.content.Context;
import android.os.Build;
-import android.support.annotation.LayoutRes;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -10,6 +9,8 @@
import java.util.Locale;
+import androidx.annotation.LayoutRes;
+
/**
*
* author: Blankj
From d1ff4e3cd680473dc63b491a9795bd790a464949 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Sun, 25 Oct 2020 03:52:23 +0800
Subject: [PATCH 23/68] see 10/25 log
---
lib/utilcode/build.gradle | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/utilcode/build.gradle b/lib/utilcode/build.gradle
index dd2df94746..283e55936b 100644
--- a/lib/utilcode/build.gradle
+++ b/lib/utilcode/build.gradle
@@ -40,6 +40,10 @@ dependencies {
testImplementation Config.depConfig.eventbus_lib.dep
}
+afterEvaluate {
+ verifyReleaseResources.enabled(false)
+}
+
apply from: "${rootDir.path}/gradle/publish.gradle"
publish {
name = "UtilCode"
From c7f9b2df4ef9a3d1a240464600a7e691b2f9ae68 Mon Sep 17 00:00:00 2001
From: Blankj
Date: Mon, 26 Oct 2020 01:28:55 +0800
Subject: [PATCH 24/68] see 10/26 log
---
README-CN.md | 4 +---
README.md | 4 +---
art/wechat.png | Bin 72567 -> 0 bytes
.../plugin/readme/ReadmeCorePlugin.groovy | 2 +-
lib/utilcode/README-CN.md | 4 +---
lib/utilcode/README.md | 1 -
.../com/blankj/utilcode/util/ToastUtils.java | 2 +-
7 files changed, 5 insertions(+), 12 deletions(-)
delete mode 100644 art/wechat.png
diff --git a/README-CN.md b/README-CN.md
index 32a5a0ac17..5c85dca1fe 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -42,9 +42,7 @@
## 打个小广告
-欢迎加入我的知识星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」,我会在星球中分享 [AucFrame](https://blankj.com/2019/07/22/auc-frame/) 框架、大厂面经、[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 更详尽的说明...一切我所了解的知识,你可以通过支付进入我的星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;**如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美+你的星球昵称)加我个人微信,方便我后续拉你进群(PS:进得越早价格越便宜)。**
-
-
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
diff --git a/README.md b/README.md
index e0df3165eb..9ae668e26e 100644
--- a/README.md
+++ b/README.md
@@ -42,9 +42,7 @@ If this project helps you a lot and you want to support the project's developmen
## 打个小广告
-欢迎加入我的知识星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」,我会在星球中分享 [AucFrame](https://blankj.com/2019/07/22/auc-frame/) 框架、大厂面经、[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 更详尽的说明...一切我所了解的知识,你可以通过支付进入我的星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;**如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美)加我个人微信,发送给我你的星球 ID,方便我后续拉你进群(PS:进得越早价格越便宜)。**
-
-
+欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。
[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
diff --git a/art/wechat.png b/art/wechat.png
deleted file mode 100644
index e166a4783fdc3f25c63ec2417f8717dc74bdfcec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 72567
zcmeFZby$_l8aKQYkW>&
zwdh6j&eFZN`*6h5XkvE@-i9_
z2qyUT3=7UV^py~`A@GIkAg>RHKrS?)|DB0ry+8?p;3-?(x}~OOY42sgp
zt%H-jxs?qJ0&yQo(R9;`L0u6aL%|4jqzBiE6Knz?^b7?!ABglbiT;20G*eFAwrEw7ef0KGEPrChkxdY2IK>W)`v@w4`h%xns3eUAh8gLjfb~1JtXfu
zWO?h3I2L3uH)ezsGMGt~ivx)~14+6rckQfX7398lfCk&y`UXgPfh0W#W_{rqfBiBZ
zxwHN?SP<7Jy(ff{_aXjC(rh0gv_fYgx2Q=zVbCgJq;q|)8_zX%2(FMn1F7$b`;?&g
znfFpfTsMW=#@hHK-DHDJu{4yFg~%Ltnm#$AunIMLdD}1tF^SDrMNE9X9p8t7p!JU(oyP3X$~PWRIZ0e+nV8;N$T?K_D@8
zd(o1tXCR*vUQ9tC)$?QqIkBWlEjSQ}OnShLH&WOH?=Kb9Ur2s`wYr}4EcBd=B*C?M
zQ6lMc)BaR=8D#NNACx4sSRY+A-I@Q
zA8<&ZbRv%~nnVrKcjAyHMPbrI<@x^be?hzO=#n~p^9QFFXLF?=JT;VO*kE_MBphiV
zx&LJN11-A>KMIeT_h`WXeb`Hq{Dlh`3MdD<1?*$DBe+v`Ilv8_bAT0
zI756MN16Kfa9=Qw_zE?M2)%tjOpk)8^@{0?9=}dBzv)#yLD$Qa^{G%K&b71Q{v^vd
zMnOakHi1u`$muER-O6EHW_U-8z|qBh7{uMcOdpe@`i{|)c(2LbM5OqMo@@crDjhXl
zDx(qe1rp;J`D+*2{+L$5qhox+a|i#9wfwL=`wPt%;-87El9ia2p4hgHPUDpL7tkg=
zEq_AzMD>q@w#Mo5OCrsWCY5kAuW7u9C05{vNz7orOyiMGO3zdOl$+X%llMp@?d~1h
zbXPS_&CpyDK9^^VpPpa2)$xKotFQZ+m4y|`l5@csf&1+t_3ec2gwNLV*b8$D54YS1
z&WD_T*eY*wo!pw-i#(gGoSZXB=@r(OgrpBzTmw9mNfwEOiT2uhH+F7#Uw+z7948W|
z6XzQ@m#3u-*Out>$ivsl*Cxz2((!pEtNm7ODi^o+N`7DNRqd)=fx=D=H;rhuE_LIq
zTH~X@ebe(LA;GfgA@W&TrsXZEiS?F$RvdgQikx3acL
z7m@wQ9vVR|J{*B3UZL-Yjxs%0Q!L%A`F~#pr
zDsEn2Pi0cTHwqiE7KNHv@eIFcdeJ;x%knAK`k6VR=iL|Qj~_p_wwN~-tx2Mb1T9-&>hAd+nuhfAE}71
z_TO~A>Fwm~^3m1Cp?c}X1YcurQ*Pset_7t<20UexpY)aDlMdnp*91~c+w8~Lc4?j+
zaWfRFh|i^8wzHmBJs)}f)wcKBN3mv~`~zi<=ag-Rjbccttu>V1q~ph_lc=ygxH@rY3+Q;4OwV1`TEs=1XjTtVpb?bDRX?
zm!%1C&+F4T#n{)AZcy%-@{U-rJ?pvLj+1ivF6BPgMO=m}E6kC76wElrbP1JgHZbaqH;Rj_-t`-Fk
zY&2|4m!DVoSL9U$xQFiEUQZx)Cb@>Y5;om5*d!J<1wT7y^Ncrn`k7X|vuWYXNM_TTps+*`jzy1?%q2NT~gc6CFhqTgaoMfsq*>=iTNj8F>2dmz$&5X=cFD|c85dC8|
zMJH}Y=-W-7TliCsiI5s&pIZNZbRs1{F
z0j~1v<*MeatTE@OJ!Wm&DPuz0QPT{2@Xg`NHo;0gS?@Fo)h=97;>=-nzeje@y+Xc5
z{%$YtnECPI9s_>h74MoSZ`3N@ydA7?*Iyr}ue)7!g&|y%)QyANPy=D+ZngH=r^B+N
zB>qTkQcpvBMwG_G&o5uzVhz;gi_48|>#!@_x?5>_85(D%jeL;McTdOf25Fpe
zfkQz~;qDvRirGnB72`hdZ4cX_p;3kM_LU|1r58(f1t|TxB88dI!CYb%WJ#jUPX2~y`(rE+6b+vez8wBcH{!xlZtWSFsB@wHf?
zn4GV}(S&@_J^LjXs$)f0w9t7=dFf^k@{8a8gZe)B!0rHtVVXw`vSpdF+>YrRRRtqr
zd)IYmh13miRcXY~GuplAuy*KZ5qqC-(eK@HF|6KpeD{9+{jNrRLgWS9(A4ADlP{qY
zpXENv^)bjYL`J93&`_SIsM#>i}pd1R^To?f^BlhB?!kz$~on
z#ORS#b@a4WW@7ZZ{K{O)4!2;IR`Q-sFilStEmKcxQ(-fD32{78cM;HmEzB88>uzgf
z2N!V{qyOHo2>2a+nUkLO`z_AaV)Rnz0crJ=)o5?oJHcrAIRw~Exp{?X1%)}d`Gtje
z_}FN9xVQy4xr8~n`PjL*MYx1TxVUNm{Gk`e1HXwnnVE}d$jJUV94Lv=TRJ;Ch;VYc
zxw&z;@p9NZS#WX-3k!2{@o@6+u!B3;;U0F*P-F5|2Vfat8ceXPBxj6sQ6T0TVK0D0a>c2EY*ZgSqeJlJ}
zAyF__ky}nMsI$G3mc6}=_>W!o(|Q8N6WCRPwAYoPrdD=nlZr)@^K_%1EB>=Tm<-ez
zCJx#PvvcvW^9XBk^NH{Yi12f>atVoWas8u{A9tSWL)qTU%G~20eF(9038DMo<`v=N
z`)42jxbt)$K!VJm&d~p-kABQdMa=D;Y@yELR<=+J7^j1sg(&CGi~qRu?|mh5
z%ihM`2|N}|oL7|dKVANht$>}X_QOmShik}5)84s#OMqKgK!BZxgZrP|{NuiV^z(hs
zirle-J45YEVRvN2!37R0D>D%;0TUQ6FONC985AbO&Sxsf&o0a(#KX=DGZQw03hn8_NJiwpVQ;!;Su07;S*#xhw}2Ub8`!tvYVI-
zL)lGCgkk(VP^c-t3C~{x{iCyg8%Wg&uy{MD%|Grz&&3Q3#?NQY4dv(IW*6o&=VIp*
z7UpAzLZRmDCVbo`!rTHTTxNVGe+}^;y7{-E@0Ncyv-(f>c1|MxN6EMa!P64M`DeZT9!cLKLJcXoq1!K5s}4*B17$d7*iwc+UjL^;vt
zijCF(2TK8my8gdgi2qHl{+}(xf7EsVe=fw&oos3ewX=YkiF5w7iT}FrzpdSm75!J~
z`b%Q}T^dEvN1X_eWU#BC-z5lW!hgH=bL1cQ>!Bsm#^w9{!UA02hm#xq|DR3&S$(>x
z{;!+aa3pm>If4DQ#*a>^xbM!?l2oY87rWN
z;b?ur&Bep_XRFgy|FNn5&!#-Wg8yv!kD5PQ{#dDhaJ=tA_~R;Ikbt~${>@(hO+Not
zWdApR`8lQko4uau>-Qk10Qq(CH(bBQ=Tz-)xK07`>*8;?evQwm+TU=U0_4}l-*EjJ
zpHsEJ;W`D#uZzFo`ZYeMYJbCZ3XoqHf5Y`_d`{K=hU*j{zb^iU>(}_4s{IYuDL{T*
z{0-Ny@i|rd8?IA;{JQuXu3zJGs`fWrrvUkN@i$z*#^+S+Z@5kY^6TPnxPFb#soLLg
zodV?7#ouuK8lO|Ozu`Is$ghjP;rcZ`r)q!0bqbJQ7k|U`YkW@C{)X!mAipmDhU?e(
zoT~i|*C{}LUHlE#ukkrm`x~xPfc(1n8?ImDbE@_?T&Do}b@4Y`zsBcO?QghF0rKnO
zZ@7MqBtqaGe6=*Tvs({TiQBwZGvy1<0?9zl00#=lh^AJMa>y8+hB3;%*E0ixLo8
zQ+W+#2*i^S0`Y$cf$W`t?*$0Ng$n{%yboS7O@u&5?f)=tmW4q2jqk`vX}J$A*SIAc
zYFD0|=vyOw+P6}Z%sw**1*LY!M)^OYz5O)5m-Pmow_l)VkwcyD<%`=xHy@L#t37rm
zy8Vpwi8&4tEgfA=0{B}8X=Ny*B~+`K?Z8(HP_ln
z6@~aMWI;sTVrQB1-26Gz`VtT6v&aHojai7!Nh>V84%;94k|T~o=cJNlIIunI&R5O$
zB9@E5v{$C&t{fd^5D}L$Z+_9<>^++DA;raGgj>KdTkew57plIaWkEJ2XXMrGn{pmP
zIWFrbzVu+w4-iQrOsR+sn#nVM{;GP;>p9`o8m%p4!wmF_$hSl$GA8ct)X(Z6zgT|i
z(et=B&wLOMo7qa>4w1h$iR<1%W-##St6cksj6zgVIPu$8R#9ztYM^8X1~~puG6yP)
zG)mIHr&lusc>|wQ5nZdtm|t1h#_W_qK^zQ8`}+EXkky;rqoYP8*Qb)FN(YP@HC4s<
z3z^q76b8#88KOmrvr|16jrhwo6ojH4VpF?ASal17pkz-p=!wJJCo4w|@=6cJu_Yd1
z;a`c!+toFJxBbEBzR|`EC6kTHenfOOJIxm{P$t1fo1`?U>bFl)X7>%Rvr^EtQU$BL;^~;koq8OcSlmYg{ehtsj4+-^qbqt@mE-wp^Cgq(8<5NjW)ek27FN
zmDGfk&w!oT#D}vSbE1i-%A>Qj?e&0tr=LH`((5*A6z5)-Nz0|Ogsp9g{L*3Fw5}S)
zRxGes>f+O9(0iiAzb3G!vqju!lczsvT2Axbp5cNV!YE6u3))8W(1;V(c@%cG6<#yH
zcMa^L9i|T${mcymfbulHD1PF^6vm`H15Jf#!jLXC*TAhv`3(&3dBY8EB!Jg_*R3aG=V5VeLYfz4&B_UZKy6
zRGOAJY`WrpJ|5nJGlle{OvB0TyQmN-?Uis?T)k#mvF-4I;KyyzG%~H1dkXA#vRfvF
zqEI!X0&`StX2c=T`Vuz1__#j%?L8$X5)sl@R$%K*e@uuamVTtpnWbAWj|~|vn-Gc;
zJUQm^@3FiT4})oUtI7K7vBj4XZaG#IF0J%&aW8YS>piyAS;{~b)ktkoh6E@vVGNfo
zBwPp6|DglI{9}pnudvm-3>ae51u-Y0u1VvlavjYI*1acD6;*di6PnX2Ho>ahOhMjv
zaNv@2$D`x2=%gC)m`f3+PlI3R6!tydOq;5lOMM8_zfCTyMJ~p|INOyLy;M|39Ri(p
zr$~GiHq((XMUu8F(-w#GBG%Hzrs=%kh<|^7e@W1ABcVjZO=R^Kl0{$ftqj76FKNfl
z@e{YnuL{@>1yR~pU%ctI`ca>Rg)vHG@wx&06Th&uHaX@OgdmQj!iX_8q0{J
zfW=x$Bi=nZMxI1*`Yb34r$VH0_yh##DI(8Nhzrf_0x<{~wyR>dNXzvy@R*4cT5lrh
z@D!f|k9x8jeIf~iy)3WW*+LSukWH=&tyWB37;zi(nZ`nI&2td2@FtmD@L8o~c&D%z
zY%JAhM_&~5z=(edGQYaoa)cU-mZ876TiNBa3f~=U6~E${)=KR~&?SbVG8kZ2a9+q>
zWM^lu7!Smk#yXDn-C{tiCD^Asii-G!H9JEk;BP;@abD06-T1%|fFutI=<=TB7259A
z#26cU1I6&&%A$eJb*2O$Ri6v6Ba>Hgi}OTzuCU(?x*dK6%eOEu56}2`BVm)`y3KGW
z&y|I9A#tp_lR&W$)a*3U9KW%kz0o(%>#<>G;P4(R+;PXV9d(10SV)2D`N;N4lnWwD#5j-B|L9cvr_KEHzT)K8A+x~AYUlyD@tIx$X
zZlc)7NV%5Hja8I9yDJ{9rgROzFI%ZcZGUmPJT#uxrO|j*_6sC^WK(-LRNNJ|`#~_f
z{ZV@Lt;57u+^Z-?^7kWb)ywgD0RU^B`r>Z8qWX<
z#mWq<=5ZmF`@ZMVGy6db#Dhe%M~Y3c_YV%_j)F#A414?gGhe=hML!B(U9~H?TY5uL
zYr%*R9Dwul^J~OS3-pRO0k*?sP)o}kv-K9TTei0B=3S{N3|p5C4GqCzbKZN*k*dI;
zl2{tYj3=qUOOZugT|J<`U#Dp7Wx?|$#9)OZLw|vOj3)6P+#$-(1)%#|3y)f-gqa(n
zrf8|7P4_lt7zYqEEb%a?g98zK_G24Q#C6Vdox%tN;*Iq{VZnClqe)|w-4l(>{Cs>d
zF)^5j_cSk8P7Qc)fz_ouK=huR0a`wA5Q8iv;O1%tM)`;nK3fMx-?VX((m9%w-PZMQ
zNME;+)@HKCsc4C)=5SJrNI8j&x}72G^|&JM=8gwN1dtHu{nn_f6|F;!|G;1`$7M}QG6zJLArpzh>mZzA6xbDOc6
zD({Q@j+Ss&xPhMj6N2k!x3N!lR)&jxkM_B(Ooz*Cy_5{Lwzkri5yS(An6~?XHe?K_JQsNVLdXrK_l6B$L&0XW
zTDS-THoT;wqT=|$$>E$tvC~YuScx%77$(>ZSNDB=e2&D|mGTDt7_bC);HJC2Q>;3)C3?hVQ}e@s)}QW80%AW
z_wsXxXJ^qTJzn)d3&k~uR${-e5`K4X9=RM@+v`sif0U=;^F0xb9H3ZO;v3COB;L3P
z7{SyTkMGRj;8GR~Mc+b!gojaX=2uQ8R8!lMWr7dutPvt0iwr6;6cYUu$ANen%|w12
z!9IaLEUqH*huC4(ewF+Z@v!%f$pzNiBRD{au7t-iUO3;lW>WNUas(gOxYdy;QWid>
zGj;&SoJZ}<(XN%pw3!iw$v8z^@f_=`4*KM#2E!1m@}XmprhE9PPSx``q?iYD`Z@2>
zQ4e21L_z`m6IK
zhGJY0qRl^~FeNBl%B-v;M}2ckLm6?ybC}PJR5)fae{i{lVM-7e7l)Q8HGTagZ4tG&
zMr(Wf)*964QXFnCRbJKho0($@Ak
z(m)9kU_2MFZD^G^b{s5AfeERHEylCy2Wsc*U`2@$hm9wiMoF2Pns$0We-#Fln&`>l
z<_9w#ugL4#n}8`8Bzvt^3d>&P_k;Fblbzb5>ZnY2_d~Dc_qAyXl2Zr+T>rAf(Sj-*
zGlf_TE$fAK$DT!^sl;CkmrUAYS#~$mP9ngJA%#okDLiuY7ex=2-|l{p6Q9JLFsZ)o
z9E~yH0#_)?ZSr<;aoHV3)rRhE&Uy9WY?Y;X%#tVj9q-A%)X+!u-MSRG|KbJ?nqmvB
zy!$dP6vaGgI1mga)2s31?-ZIMuo-&SwyB|pa-+gdJDg?)K)bn5sR4tmqhu|Z)B6lC
zItZNSigI%51#8#OSDzdqQ8&)#@Q2CJyB}>2tiLDpC0cOyEaHab@C)xv$2fkz!wgKk
zXV*WM*(Sca!@T(S4#P1~eN_JD4-d~8m*Fyalhcj3K&xk51Q;PuGjeRLE55CcPuk4d
z7Zb)@j7j(E-%v`-QT15%da2@iwUBA#Ui!S?Jbt9@w|$V$o$r<7$kHpC+l@Wog7LO1
zpXf~82kimU$0@o~pOG0Y7W(~(VRKKXN$y9$f^TDH>)aDMC*CdyMIuG&w6H|>sVD56AWrXUvGs6)9JNZ;@EW+x<@)w>J#{j
z@co3mblR6eQ$p8{(Od`@apZgOk{P;
z2WE(owCFeaC!EXy;@OLEDelcYW7B{fgin#4ZMP;(oRhx1(zb!64;N$0qg*81j`(rF-{>aUcw0zW)HPvfX
zxF|4yxGWx)@%Al=kB^W3z@n+|O6kB_Uy(0=2Uq%7-OHC)Cr4u^R}-g+AjkUyb(39w
z$8S-oh&rohgJrhQb-&(!Hzyp^Hf|wtKt41)T=T_~an*LXW%=t{$2P`<^pX-D=7~(8
zEhd6V*XFaLLl7rvK%(?2945pU_|e+=hvuhcx~4D!X!2&~O~SbpH>1(6RmJSe2yS4%
z0}YTpK6l8t-@DY2z}X6n3lh(jPl96+;7K+EkS{e@k{udw_1;;kzb}*f0;wmvC6dyD
zwrjh)*bFL&(srAeo!WWx(u{$9>Wq^}+nj}X}R+*e%)MmtKDT(ulg;=JCyORatPw}W*L4Be(&sjzdk+Pzds@5jUF;uJE<
z%C00SnfJ;h@!SB10^L)2+NbjFfnN`3O0DRVlrn*>ldFXXJUyqc?rbY?Q#F|s*Q0=AiU6Znj{tn0%3pI(`MkhqGd#MKrszYH=R*$5C97AleaHd=U2{u=RayKZeDFs)S+$$UD6gNTGsBXGwLbfFQRb%q1C
z;qbS*mmmH;ui|J*ND$GWecch4+v*6nwFR3>O!&nwO9Mr%``b&mB;Y-_NoUB;T>{Pu
z&g!+ZI