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/75] 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 @@
-
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/75] 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/75] 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/75] 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 @@ - - + + 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; + /** *- + +- - - - @@ -69,5 +69,5 @@ android:text="@string/sub_util" /> - -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 @@ -- \ 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"> -@@ -94,6 +93,6 @@ android:textSize="30pt" /> - +@@ -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/75] 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/75] 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/75] 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: BlankjDate: Tue, 7 Apr 2020 00:11:37 +0800 Subject: [PATCH 08/75] 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/75] 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 f6367ba8cdafc77de0ed499728cddcce0d401253 Mon Sep 17 00:00:00 2001 From: Blankj*/ -public abstract class BaseViewDate: Sun, 3 May 2020 04:46:55 +0800 Subject: [PATCH 10/75] see 05/03 log --- CHANGELOG.md | 5 + buildSrc/src/main/groovy/Config.groovy | 19 +- buildSrc/src/main/groovy/ConfigUtils.groovy | 2 +- .../src/main/groovy/TaskDurationUtils.groovy | 2 +- config.json | 5 +- .../utilcode/pkg/helper/DialogHelper.kt | 1 + gradle/publish.gradle | 1 + .../java/com/blankj/base/rv/BaseItem.java | 3 + .../com/blankj/base/rv/BaseItemAdapter.java | 42 +- lib/utilcode/README-CN.md | 4 +- lib/utilcode/README.md | 4 +- .../com/blankj/utilcode/util/BarUtils.java | 12 +- .../blankj/utilcode/util/KeyboardUtils.java | 17 +- .../blankj/utilcode/util/LanguageUtils.java | 58 ++- .../blankj/utilcode/util/PermissionUtils.java | 18 +- plugin/api-gradle-plugin/CHANGELOG.md | 5 +- plugin/api-gradle-plugin/build.gradle | 24 +- .../main/java/com/blankj/api/ApiInject.groovy | 2 +- .../main/java/com/blankj/api/ApiPlugin.groovy | 119 ++++- .../main/java/com/blankj/api/ApiScan.groovy | 72 --- .../java/com/blankj/api/ApiTransform.groovy | 163 ------- .../main/java/com/blankj/api/Config.groovy | 4 +- .../java/com/blankj/api/util/JsonUtils.groovy | 21 - .../java/com/blankj/api/util/LogUtils.groovy | 34 -- plugin/bus-gradle-plugin/CHANGELOG.md | 3 + plugin/bus-gradle-plugin/build.gradle | 24 +- .../main/java/com/blankj/bus/BusInject.groovy | 12 +- .../main/java/com/blankj/bus/BusPlugin.groovy | 138 +++++- .../main/java/com/blankj/bus/BusScan.groovy | 70 --- .../java/com/blankj/bus/BusTransform.groovy | 180 ------- .../main/java/com/blankj/bus/Config.groovy | 4 +- .../java/com/blankj/bus/util/LogUtils.groovy | 34 -- .../java/com/blankj/bus/util/ZipUtils.java | 453 ------------------ plugin/lib/base-transform/.gitignore | 2 + plugin/lib/base-transform/CHANGELOG.md | 4 + plugin/lib/base-transform/README.md | 50 ++ plugin/lib/base-transform/build.gradle | 31 ++ .../BaseTransformCallback.groovy | 15 + .../base_transform/BaseTransformConfig.groovy | 5 + .../base_transform/BaseTransformPlugin.groovy | 162 +++++++ .../base_transform}/util/JsonUtils.groovy | 2 +- .../base_transform/util/LogUtils.groovy | 60 +++ .../blankj/base_transform}/util/ZipUtils.java | 2 +- 43 files changed, 728 insertions(+), 1160 deletions(-) delete mode 100755 plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy delete mode 100755 plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy delete mode 100755 plugin/api-gradle-plugin/src/main/java/com/blankj/api/util/JsonUtils.groovy delete mode 100755 plugin/api-gradle-plugin/src/main/java/com/blankj/api/util/LogUtils.groovy delete mode 100755 plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy delete mode 100755 plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy delete mode 100755 plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/util/LogUtils.groovy delete mode 100755 plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/util/ZipUtils.java create mode 100755 plugin/lib/base-transform/.gitignore create mode 100644 plugin/lib/base-transform/CHANGELOG.md create mode 100644 plugin/lib/base-transform/README.md create mode 100755 plugin/lib/base-transform/build.gradle create mode 100644 plugin/lib/base-transform/src/main/java/com/blankj/base_transform/BaseTransformCallback.groovy create mode 100755 plugin/lib/base-transform/src/main/java/com/blankj/base_transform/BaseTransformConfig.groovy create mode 100755 plugin/lib/base-transform/src/main/java/com/blankj/base_transform/BaseTransformPlugin.groovy rename plugin/{bus-gradle-plugin/src/main/java/com/blankj/bus => lib/base-transform/src/main/java/com/blankj/base_transform}/util/JsonUtils.groovy (90%) create mode 100755 plugin/lib/base-transform/src/main/java/com/blankj/base_transform/util/LogUtils.groovy rename plugin/{api-gradle-plugin/src/main/java/com/blankj/api => lib/base-transform/src/main/java/com/blankj/base_transform}/util/ZipUtils.java (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07fad4777f..132d7fad7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +* `20/05/03` [add] Publish bus plugin v2.5. Publish api plugin v1.3. Publish. Publish 1.28.4. +* `20/04/30` [add] BaseItem support partialUpdate. +* `20/04/29` [add] Publish plugin lib com.blankj:base-transform:1.0. +* `20/04/28` [fix] LanguageUtils#applyLanguage. +* `20/04/27` [fix] BarUtils#isNavBarVisible. * `20/04/26` [fix] Utils#init fit tinker. Publish 1.28.3. * `20/04/25` [fix] UriUtils#uri2File Unknown URI. Publish 1.28.2. * `20/04/24` [add] SnackbarUtils support show on the top; UriUtils#uri2InputStream. diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index 9a6e8d1b2a..99a93fb4d8 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -15,7 +15,7 @@ class Config { static minSdkVersion = 14 static targetSdkVersion = 29 static versionCode = 1_028_002 - static versionName = '1.28.3'// E.g. 1.9.72 => 1,009,072 + static versionName = '1.28.4'// E.g. 1.9.72 => 1,009,072 // lib version static gradlePluginVersion = '3.5.0' @@ -25,8 +25,9 @@ class Config { static depConfig = [ /*Never delete this line*/ /*Generated by "config.json"*/ - plugin_api_gradle_plugin : new DepConfig(true , true , ":plugin:api-gradle-plugin"), - plugin_bus_gradle_plugin : new DepConfig(true , true , ":plugin:bus-gradle-plugin"), + plugin_api_gradle_plugin : new DepConfig(false, true , ":plugin:api-gradle-plugin"), + plugin_bus_gradle_plugin : new DepConfig(false, true , ":plugin:bus-gradle-plugin"), + plugin_lib_base_transform : new DepConfig(false, true , ":plugin:lib:base-transform", "com.blankj:base-transform:1.0"), feature_mock : new DepConfig(false, true , ":feature:mock"), feature_launcher_app : new DepConfig(true , true , ":feature:launcher:app"), feature_main_app : new DepConfig(false, true , ":feature:main:app"), @@ -52,12 +53,12 @@ class Config { // 上传新版本插件更新 pluginPath 中的版本号,并设置 isApply = false // 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件 - plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.2", pluginId: "com.blankj.api"), - //./gradlew plugin:plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal - //./gradlew plugin:plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter - plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.4", pluginId: "com.blankj.bus"), - //./gradlew plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal - //./gradlew plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter + plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.3", pluginId: "com.blankj.api"), + //./gradlew clean plugin:plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal + //./gradlew clean plugin:plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter + plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.5", pluginId: "com.blankj.bus"), + //./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal + //./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter support_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$supportVersion"), support_design : new DepConfig("com.android.support:design:$supportVersion"), diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy index e5fa63146c..d60518fac5 100644 --- a/buildSrc/src/main/groovy/ConfigUtils.groovy +++ b/buildSrc/src/main/groovy/ConfigUtils.groovy @@ -47,7 +47,7 @@ class ConfigUtils { void beforeEvaluate(Project project) { // 在 project 的 build.gradle 前 do sth. if (project.subprojects.isEmpty()) { - if (project.name.startsWith("plugin")) { + if (project.path.startsWith(":plugin")) { return } if (project.name.endsWith("_app")) { diff --git a/buildSrc/src/main/groovy/TaskDurationUtils.groovy b/buildSrc/src/main/groovy/TaskDurationUtils.groovy index 48b2d2b6cc..9ff2722345 100644 --- a/buildSrc/src/main/groovy/TaskDurationUtils.groovy +++ b/buildSrc/src/main/groovy/TaskDurationUtils.groovy @@ -32,7 +32,7 @@ class TaskDurationUtils { @Override void afterExecute(Task task, TaskState state) { def exeDuration = System.currentTimeMillis() - task.ext.startTime - if (exeDuration >= 100) { + if (exeDuration >= 500) { taskInfoList.add(new TaskInfo(task: task, exeDuration: exeDuration)) } } diff --git a/config.json b/config.json index 040dc5ce1f..5f5ff16fdd 100644 --- a/config.json +++ b/config.json @@ -5,8 +5,9 @@ "pkgConfig": [], "proConfigDesc": "proConfig 配置的是使用本地还是仓库,优先级低于 appConfig 和 pkgConfig", "proConfig": [ - {"isApply": true, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"}, - {"isApply": true, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"}, + {"isApply": false, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"}, + {"isApply": false, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"}, + {"isApply": false, "useLocal": true, "localPath": ":plugin:lib:base-transform", "remotePath": "com.blankj:base-transform:1.0"}, {"isApply": true, "useLocal": true, "localPath": ":feature:mock"}, {"isApply": true, "useLocal": true, "localPath": ":feature:launcher:app"}, {"isApply": true, "useLocal": true, "localPath": ":feature:main:app"}, diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt index 081ae6f071..623f01c95f 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt @@ -86,6 +86,7 @@ object DialogHelper { dialog.dialog.setOnShowListener(DialogInterface.OnShowListener { KeyboardUtils.fixAndroidBug5497(dialog.dialog.window!!) + KeyboardUtils.showSoftInput() }) } diff --git a/gradle/publish.gradle b/gradle/publish.gradle index 542c0ff516..f6fdfb4dda 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -54,6 +54,7 @@ def configMaven(Project project, PublishExtension ext) { } project.tasks.create("mavenLocal", Upload) { + group("publishing") configuration = project.configurations.archives repositories.mavenDeployer { diff --git a/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java b/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java index c981fe58fc..cb93770b3a 100644 --- a/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java +++ b/lib/base/src/main/java/com/blankj/base/rv/BaseItem.java @@ -38,6 +38,9 @@ static ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType public abstract void bind(@NonNull final ItemViewHolder holder, final int position); + public void partialUpdate(List { +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) { Setbuses = 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 MapKEY_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); - Listinfo = 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 26/75] =?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 27/75] =?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 28/75] 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 @@ publicM 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(MapextraHead) { + 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 staticT 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.Consumerconsumer) { + 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 ListgetPermissions(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 LinkedListmActivityList = 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. + *+ *
+ * @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.- {@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}
+ *
+ * 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. + *+ *
+ * @param volume The volume. + * @param flags The flags. + *- {@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}
+ *+ *
+ */ + 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#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}
+ *+ *
+ * @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 @@- {@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}
+ *- 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 29/75] 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: BlankjDate: Sun, 25 Oct 2020 03:52:23 +0800 Subject: [PATCH 30/75] 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 31/75] 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`*6 h5XkvE@-i9_ z2qyUT3=7UV^py~`A@GIkAg>RHKrS?)|DB0ry+8?p;3-?(x}~OOY42 sgp zt%H-jxs?qJ0&yQo(R9;`L0u6aL%|4jqzBiE6Knz?^b7?!ABglbiT;2 0G*eF AwrEw7ef0KGEPrChkxdY2IK>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#$ AunIML dD}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#NN ACx4sSRY+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&TrsXZ EiS?F$RvdgQikx3acL z7m@wQ9vVR|J{*B3 UZL-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_l c=ygxH@rY3+Q;4OwV1`TEs=1XjTtVpb?bDRX? zm!%1C&+F4T#n{)AZcy%-@{U-rJ?pvLj+1ivF6BPgM O=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-7Tl iCsiI5s&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>qTkQcpvB MwG_G&o5uzVhz;gi_48|>#!@_x?5>_85(D%jeL;McTdOf25Fpe zfkQz~;qDvRirGnB72`hdZ4cX_p;3kM_LU|1r58(f1t|TxB88d I!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=DGZQw03h n8_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(H P_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^EtQ U$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^6 vm`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{Lwzkr i5yS(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)*964QXFnCR bJKho0($@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;=JCyO Rat Pw}W*L4Be(&sjzdk+Pzds@5jUF;uJE< z%C00SnfJ;h@!SB10^L)2+NbjFfnN`3O0DRVlrn*>ldFXXJU yqc?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 4(tEn7v-jO%(}VLxrm=_F0Lp;VbtBJtNIj8i&|lNidM}iV-%y zRvx56yN?c-V!u0{Xl@@l)|IDFACPQCzItL3@t#k)qL9+v-fvhTf->YxtE1?^JXcRX z@zwpQo<5(AN{4*$g&9okVb8k2c9O*w3^8gWL8je&irs_k4T*VF2^%Xj^@xOPoO8Ev zYT;n1j?abRP+yeq$#&l3hx^HX#;TW)IHh)oah;`-?56U%k#xUkv{e6aZZSb_ob$6M zmQx^$);=sI4oOmC+TzVyNf&Q2;YJS8UW{!sE7`!D&*YbXa&X(LcF?XRQMZs|o;uGv zt8Q#xtdY2i1xo7r8m6BrML%z5NY3AWXE|rzuuw{#-1)F*1s{kM+ruxZ-b^mCReWgY z(Vs4nh_97!X28!% WXhW#E8|;k(k(iR}SnIj|9kZ5J<9mX=<&wY3ch!J@;|DKd%#ypn(JfeLWB zKCXn%Wfm86D?YiAC8esWI@*r6_r{hoU$>}beEfcVXyC?+oV>h-0{ypW{w&J!A{On* zd8Pc^sZe`K(6ohskB?8OVh(=)KBTB-hvEh+s~BOZ*q&0}94$qpNk=^U7Czd?|3mM| zOwJ@2w|uooTS>t~o|lF6g}#6Po(&n)^LQ>^WAYY_ubJ#hd5Sn_Fg?C$RmK|6mExlLtth9kK3;)6+zy}9#k`HkC!)|)wfFP^N^oIG_& z@jbEk-F)son`CicUnjmiFqZgBwrVT-WV{o@1S|a{3?O}vc4VC(PYzBLj4T*?>$YBU zLf0poM=Sa~hsz>^@kuA6ZmvpdYQ_xE04D1`8OFSpcCwcSC^riuRV$#RYZwO3J-78Q z)9#pSNhEL>K92S~oEp8m+BWxvW)*1S>kHTZI=mi*oi!x@svPkBp(SE37PpOJVlrSw z1TarLR$_X%GF*;bJBQ!^7H#*?5XG)9@J@g`FWtRcSY9q@KjykR5>{Bqp_;Q;cpSkE zTzw%sHLqTsyH{p|%Z@cTHkPIfcB89jDyc6}s@