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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] 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/61] see 04/07 log --- .../src/test/java/com/blankj/utilcode/util/BaseTest.java | 8 +++++--- .../java/com/blankj/utilcode/util/UiMessageUtilsTest.java | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java index 6e097938bf..ebaa83564d 100644 --- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java +++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java @@ -1,7 +1,5 @@ package com.blankj.utilcode.util; -import android.support.annotation.NonNull; -import java.util.concurrent.Executor; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -9,6 +7,10 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; +import java.util.concurrent.Executor; + +import androidx.annotation.NonNull; + /** * * author: Blankj @@ -18,7 +20,7 @@ **/ @RunWith(RobolectricTestRunner.class) -@Config(manifest = Config.NONE,shadows = { ShadowLog.class }) +@Config(manifest = Config.NONE, shadows = {ShadowLog.class}) public class BaseTest { @BusUtils.Bus(tag = "base") diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java index 1ef00ee586..140dd77683 100644 --- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java +++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/UiMessageUtilsTest.java @@ -1,9 +1,10 @@ package com.blankj.utilcode.util; -import android.support.annotation.NonNull; import org.junit.Test; +import androidx.annotation.NonNull; + /** ** author: blankj From 7145da0408a6f5ed8f0bbd531245750eb1a1c75d Mon Sep 17 00:00:00 2001 From: BlankjDate: Tue, 5 May 2020 02:24:34 +0800 Subject: [PATCH 10/61] see 05/05 log --- buildSrc/src/main/groovy/Config.groovy | 8 ++++---- lib/base/build.gradle | 8 ++++---- lib/subutil/build.gradle | 4 ++-- lib/utilcode/build.gradle | 8 ++++---- lib/utildebug/build.gradle | 6 +++--- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index d8e41b3ca2..88b8eb9a5a 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -60,10 +60,10 @@ class Config { //./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal //./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter - support_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"), - support_material : new DepConfig("com.google.android.material:material:$androidxVersion"), - support_multidex : new DepConfig("com.android.support:multidex:1.0.2"), - support_constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"), + androidx_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"), + androidx_material : new DepConfig("com.google.android.material:material:$androidxVersion"), + androidx_multidex : new DepConfig("androidx.multidex:multidex:2.0.0"), + androidx_constraint : new DepConfig("androidx.constraintlayout:constraintlayout:1.1.3"), kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"), diff --git a/lib/base/build.gradle b/lib/base/build.gradle index 9a1ac7b329..bb7fa31573 100644 --- a/lib/base/build.gradle +++ b/lib/base/build.gradle @@ -3,10 +3,10 @@ dependencies { api Config.depConfig.lib_subutil.dep api Config.depConfig.lib_utilcode.dep - api Config.depConfig.support_appcompat.dep - api Config.depConfig.support_material.dep - api Config.depConfig.support_multidex.dep - api Config.depConfig.support_constraint.dep + api Config.depConfig.androidx_appcompat.dep + api Config.depConfig.androidx_material.dep + api Config.depConfig.androidx_multidex.dep + api Config.depConfig.androidx_constraint.dep api Config.depConfig.kotlin.dep api Config.depConfig.free_proguard.dep api Config.depConfig.swipe_panel.dep diff --git a/lib/subutil/build.gradle b/lib/subutil/build.gradle index a8798fea1b..a561916f3e 100644 --- a/lib/subutil/build.gradle +++ b/lib/subutil/build.gradle @@ -9,8 +9,8 @@ readme { } dependencies { - compileOnly Config.depConfig.support_appcompat.dep - compileOnly Config.depConfig.support_material.dep + compileOnly Config.depConfig.androidx_appcompat.dep + compileOnly Config.depConfig.androidx_material.dep compileOnly Config.depConfig.lib_utilcode.dep api(Config.depConfig.glide.dep) { exclude group: "com.android.support" diff --git a/lib/utilcode/build.gradle b/lib/utilcode/build.gradle index a3ed94861c..891f7dbf40 100644 --- a/lib/utilcode/build.gradle +++ b/lib/utilcode/build.gradle @@ -29,13 +29,13 @@ android { dependencies { implementation Config.depConfig.gson.dep - compileOnly Config.depConfig.support_appcompat.dep - compileOnly Config.depConfig.support_material.dep + compileOnly Config.depConfig.androidx_appcompat.dep + compileOnly Config.depConfig.androidx_material.dep testImplementation Config.depConfig.test_junit.dep testImplementation Config.depConfig.test_robolectric.dep - testImplementation Config.depConfig.support_appcompat.dep - testImplementation Config.depConfig.support_material.dep + testImplementation Config.depConfig.androidx_appcompat.dep + testImplementation Config.depConfig.androidx_material.dep testImplementation Config.depConfig.eventbus_lib.dep } diff --git a/lib/utildebug/build.gradle b/lib/utildebug/build.gradle index 6e1157ef0b..82b55495b0 100644 --- a/lib/utildebug/build.gradle +++ b/lib/utildebug/build.gradle @@ -1,6 +1,6 @@ dependencies { - compileOnly Config.depConfig.support_appcompat.dep - compileOnly Config.depConfig.support_material.dep + compileOnly Config.depConfig.androidx_appcompat.dep + compileOnly Config.depConfig.androidx_material.dep implementation Config.depConfig.lib_utilcode.dep implementation Config.depConfig.swipe_panel.dep @@ -8,7 +8,7 @@ dependencies { testImplementation Config.depConfig.test_junit.dep testImplementation Config.depConfig.test_robolectric.dep - testImplementation Config.depConfig.support_appcompat.dep + testImplementation Config.depConfig.androidx_appcompat.dep } afterEvaluate { From c7190639ec44b9ff4b5b35f5580458b77abd79c7 Mon Sep 17 00:00:00 2001 From: Blankj Date: Tue, 5 May 2020 02:26:00 +0800 Subject: [PATCH 11/61] see 05/05 log --- buildApp.gradle | 2 +- buildSrc/src/main/groovy/Config.groovy | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/buildApp.gradle b/buildApp.gradle index 2220ed6947..8cb7de95fe 100644 --- a/buildApp.gradle +++ b/buildApp.gradle @@ -68,7 +68,7 @@ android { dependencies { // LeakCanary - debugImplementation Config.depConfig.leakcanary_android.dep + debugImplementation Config.depConfig.leakcanary.dep debugImplementation Config.depConfig.lib_utildebug.dep releaseImplementation Config.depConfig.lib_utildebug_no_op.dep diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index 88b8eb9a5a..6074cf4d2e 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -20,7 +20,7 @@ class Config { // lib version static gradlePluginVersion = '3.5.2' static kotlinVersion = '1.3.50' - static androidxVersion = '1.0.0' + static androidxVersion = '1.1.0' static depConfig = [ /*Never delete this line*/ @@ -60,14 +60,14 @@ class Config { //./gradlew clean plugin:plugin_bus-gradle-plugin:mavenLocal // 上传到本地 mavenLocal //./gradlew clean plugin:plugin_bus-gradle-plugin:bintrayUpload // 上传到 jcenter - androidx_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"), - androidx_material : new DepConfig("com.google.android.material:material:$androidxVersion"), - androidx_multidex : new DepConfig("androidx.multidex:multidex:2.0.0"), - androidx_constraint : new DepConfig("androidx.constraintlayout:constraintlayout:1.1.3"), + androidx_appcompat : new DepConfig("androidx.appcompat:appcompat:$androidxVersion"), + androidx_material : new DepConfig("com.google.android.material:material:$androidxVersion"), + androidx_multidex : new DepConfig("androidx.multidex:multidex:2.0.0"), + androidx_constraint : new DepConfig("androidx.constraintlayout:constraintlayout:1.1.3"), kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"), - leakcanary_android : new DepConfig("com.squareup.leakcanary:leakcanary-android:2.1"), + leakcanary : new DepConfig("com.squareup.leakcanary:leakcanary-android:2.1"), free_proguard : new DepConfig("com.blankj:free-proguard:1.0.2"), swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), From e84d6294fdd2a9462072c3564f387fdb51de9e78 Mon Sep 17 00:00:00 2001 From: limuyang Date: Mon, 12 Oct 2020 11:57:27 +0800 Subject: [PATCH 12/61] =?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 13/61] =?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 14/61] 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 15/61] 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 16/61] 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 17/61] 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@ wD!Pvy>2jXOXK2qxM9;r@$%QER>Bh6>TRX{#&?YF9O0(+_z%YlC@K@`nkZbNT%G^ z$&M@pMGh)_`{z^`ukb1Jt~Kf4sH+L(YTCFEGCBdK57QqNJF@$lXZ%ziGioZfuguf< zD1TPE^tG3C&U!8p Dlf;TBvs=LrazM z{?Iae$anwM_nn4`SM>=Q3Hy9V-g %~d%PV7Z#P-p zeCzaX^a}cwh}Vtdix}!2Y10q7eCu{!Pv`N-v-jMP6kDq1*gwi%JNAmBS8H5-NpKl@ z=OnOXKc9aCnbLDzQ7Ha0Pv9To=Yp#-U(dOVmqVdHnCTDYNt9*&?z*=7Wv?Mh9R%mt zLGWre{+D8&0?cm%Y4yb;U-Z9qt6Lr(lPo&T78qPyOq*I44Zgr59~u0C T{GGcpin>B5uuM~`xoM0?}@ zvXF|7vgZlQ8=|vl JJf9PV|O zn!Zxc*%L0eW3GqtbdE(%SV6~6i*JqvAkriPGHr+TU!H6sw=415y~YLSFFhxe?BYz{ zAi*@uzi~T4MsIF7#_R0|j+yV_iXWgwtkcZ#^Ya6SDIPF7I*OZCdXH2AT(GpV!o7@) zVNz~jOfU$1|6Ynyz^H~f2*?@9F*xw+9h2+7%&=&_8vm@wdEPlYy4hqG(32>@2hxO# zdqSY;<>jOahOYWLS3PS^&=O>ukIYtn9-_!md5u{xU -uQF~mQ{q#J6AqX&ZpeCK# z=@$>sL7#fyb5Aa9jmxNaG5q*kkkk6ABDtxB1+y=zYAgeR5V07|?70pCQZGy93Q9_d z=Tf~mE{M#hSIdTk1rePEr@+uVt1ZPuu=HmeKcs|%Z|O(VhLFWRq)ps;UpB?X$nuKu z &yFt=Ns#RvP#x`YveY3vSRNS9?n@y2AE^VauM+iaATgQIUL7c z@4Sh0&s2WeX666_a#KBWG`GQ7lLT+%T8l|L#2hg4vel{Eei7g{>cK32ydLdEZ-lGE zD85~==Bp*4?SlPH60ldh>UG)g`nG+e2;ZuP<`@qfKG)g&MO7klXJ>~hi@=ls#0CU8 zYIi4-gIqi%0{@^FiF!CRboUTYr1xm%$kzCXqoU8}aFjYvAwYqeOslWKm`?IU$=;q* zMQmG(&8S+)A}uG6@PXaKyo)*O`;i!VuR${u+DQrD(999Xp1GVjFAMP*^$uyJhMfN% z`!zv^ib4Q`VG21zdyr6W6;G94BbXJAS4UaFvHY0ZeHvb=GtgqfZBKpFpr(*?**x8% zTabX^opVa6wnPqRo~=vG>SOA6EysJ%h|60$IFw%9$yYMTP$#q*l-DvJ&Wc#tABZtG zY|sX6x7t(TA#^@Hy=#4ckdp3^6K2)j>@bd rZr_IN+9(U|D`V>SG zNWI)?U$IV1+&U=;vR13Cr=?r0t2_RhzKtUipgXW=BAU}K$zn}3y_0HRBdb_3^L*}& zW5Qjm%#p_zp_`=6&y43sXFlpa$!-|ks=mxytC4s6C&6jyhH!nRn3wX~3hkq(L27<9 z!HN;_;n)dszb0*7pn5aB@ E(|JLd|7jFeRb?8j$OPn7#+2z!|9yeu2eJuhnPI)uD@=ezP$^L@RR=DDcmG@wq zZ(_Osi3Nz@j!A`KE0VuGCO;X9_0o7<_5NT^hfrNDZM$4wUJHBs?V!)oA~VxsFCRX| zb618{5(m5H=y--;jEYIdC!RTC+!|99KgkneR#nXsbM!GLOltLW^QduidjbRX !z46oj6uFY6{n78@o ;k|n%Gtn06PNXVLmfah*%Q)@ap7SfAVK;rm8y^fORHY_wmMBOqPU<0JRt+;0 z_HgN{ebftZE{J^H!QUuuurKIt#FZ669>;9Hk$JR7Ji9mNp^9gBA~Zjp24tJ& 0<0QA?pW+4=Jw{i)B*Bje+=$G}^iRaJGfJMyH7M70SW0RZt&UQP`K zKuIw{bU?x>5A(YH<4?~8v+C;VuCE*9xqAWMnPTC+qW+qUj58J~E?4sM^Wh_h3{P=% z3iJZ%fR{}_X~U&wH%!(0EOUyp#(gHA0T;BDMsWT-jGU-NWYtgsx1)s1c8ITOYMuMy z;JtFY=0d|NClJ8Bu(-6ezSreP{pFSN=ByUY!NyF7V+VUVP~c+wip|C<+#n$UL AqNc{5+`8}{8hZ80e$r-_1PyA;?<6s* zMoVaJerc(3rF<;a?c*ye^I+xqG%<8sBdN=q>AQVK=sk|%4s?Hu52u!{?i66L&4F0> zEz`%~sK7;^K$x`ypFanxdQXxh3fSIFFE$12w_+y#-V=qFJBYE1fPbfckJJ2VL%%-{ zQRrsrndgkQcxJBhdS64$2n%taiZHfYgZb0(3oi|YE}`@WTIcnG*4YFTh+67}8%>fZ zh#E&<)RY-xALZ+5XYiaeJZov=q>JSg)_S`^;(o^iy%oJ}e%%&4NlH4S!98T~VpC1) z*E>z}1dLK4SNN$rN=gV+G!$g$pH{Er9_Jo$rFPxv*6XF1!{0=k!9R{*C9cElr&3?H zw5#1JbF5qM_0CHVa=z)aR(OQH{d#23+s~vb-3IBY(bN;Mr_=Cu a#8T2}?CJ7#*?$YpRUfuL&JdYpuUaKqA&*0_9 z4!tNKu7CSM UUhnUaF$&nPLCgi^cOgCpYH*CCMAiJxp ztCH#&K?WdFlo)4D$tpFC-~i@QF|6YX=X$Edt2*Gb0a3?{z;fUoR904g)NG>Ppo+T$ zQgDE|R=< -a+kn;FpTYXV#|@eSO66#1-&YO@)YkU)3=VwT2Us*O?!-6|h)d%r zJ>$cza$RWvo(w02qucZsZN_TFxGaJ_N4IMDsJp@zZ!yJ40UP7!EaTrGJau1qnXu*u z45DqGjHR}2VB!Gbh(t&9 =| zqKU}fOu|$kJ_pXFDzE%AAh82PV)1~9=BU#D!@ $gZP$BI=C+~1nuSs*Y zl-xMu&{^zr;EGOr(5v(H8E;z$A^ixNqj|Z}JJlR`>>UljqN6M-FlBK>Diol#q1?TD z_oDP7WwUlc(DLzfI|NI&raw12@!`B5@G?o)$fD!5Q{U1fsL{qBa4Eridwb1R1Y5}1 zIvTzke;|W`8f9=c87>NR#BNWtZ!B+i`z{ L| zJO?%k2qf!kQ)%6l#zDtcD;D$eTRz>BMXg!_%G37n(cc@ZIP@zBQG?WlOZ&%lN5gf{ ziH2aT<_zNsNMq?YW8Xa((wR?5at|wnH~|EVSq67T<$-?|P4(_RKvqmeb%5jdXrvO( z4cu7u);Dk76e|j+rJ$f#t3}mta#cehsoooHC9T>ZP@NSmP63iG0+2=eZ_h
X3Y7#tbB?T zmJA1(IDOuza4$NUC_x#PU92*i0T-|-oFXt4$PQFj70I)ljxKnr)|J=Edb7k)Z_My_ z5ATGMV+IpOkV@H|c+zY;B^+BcJ5nJ_y*Ej&%+)csDgzC%JgjyZot5(E$DL4;`g>xa z(H%Y4EwQg@VbAEq(&S|6w(u^PM%G0>eRs9YsJURmGJ-!1`;*@4N)JxL;BcxKy7> ?af~F339BZGUK%s*<<)i83|l$vQ5!VTxb^f z!x!&P2>d6q*N7X4zg}jQ(IW6IMy-c)i0v50F|)lIt$Hwg@@&60S;+f{`o 6L_4zI+Z;%-JjHHN;Gbn_=_LA}OW)$HkY28l@ahjy?KLKJ8Dn z^KI_1vt?w8bIwp)IXtMQ!hn#U0h9mJlh-)U99m{;y72iW$XdXf6J>2ng6Zp3I=y68 zQxJ~SZ7>0u2=436qyYGm_QpL$>>G4h$Cstk3kxq`Q#n8~do0Jv%51&{@>};$kH~#9 zT^*?eHd)(^aJ>(D>EfEYx}lmX!dPu)JQmd;@8IgytFW$0n7+{dd{$3?|GAEm>H+Pr z_rN=1?m>6ynf(zQ_(Q=_Eal@PM%CKZE^a?8@a*~X^>)@GFd_#tOUjL<-2g)G`&y9@ z4TXxr@LbL8$-TKWITsiHAfi;qQ0@>*zQv2&U9Uggu@E_^| zsS xhSfd JzUm61gS)TBuqBK!~!+l^r;<=g5tn86HE) zgyz#9c6WD6*6{(e{m*mMnamUfUU!EEYC{r?JaJ!HHGmA6SOeVP<73}0AvLze&GK)q zl*fRBc?L@Ni4Z#7>o+d9rEH~w6Rg%A*rA>DwP-7@(eG%$4~qf<8BeG?WbBkU@mA%U z4gb=A!2Yu7_y8F_Y+v_{#KV`4CcL@2^2Ti()~N=NQmNTBo=!>ATjy)4RE&-p4;cH2 z0bl&37hkNnTB`RqBe;RRdJfpc uWHrEx%(*$D8 Eo!9)yB_(i$7Qs9v7^f{AWR742k66n03Y9pM0+1Xk3Z>D*KU|vA|OMzp0 ze2$ QZus|JX=URtp0k;=S_jJ6#HvA3f6?t>N5_2kWhM5m)( ze)((XaJ?D(w~LpI@LrP1ZpGLc7A(>cdQu|Zu fp`c09%{0z}<$?eWLwuk^XRLw-IyY1pAO?uQ1Iibio`0>p=b1GOAZ z#0S>f_xGFMdMXPV dN&zz$~rC@?oHMmO?@h_HH{ Ua&v}l)ppZ0ll4`xS^x6u4`eUwqj8 C4|~Qe&ua{vj@pcr0(Z zR7kjY=2+b _ge7R>4TNrC*<6aN7}ojWrP4cr8cI3F?8BIGY9_-4-qs2%8ybsZm` z4c;*;?h2Gpl7xNbeEA@V=TWR@q C_h))gagiue6W}*bMrEp02k_X08GUd|~D6 zvt+OQYyN;SGTWa4OYmn7bep_M$wSN;kixqh=I@<`zj({qnzi {dC<#bboWh4~z3|@P1)Z9IN5F z-^F0-MW1GH gPE@>G=@0(n6`O7Cnl5 zg2pu`viS`0De}*^{-$l$X>S~^w>QVKQJ$xJ${98+kBKmjxN@)db*z)KX9!B8)j+9b z+o_eJOdP@0*YV}@^AvGQs^*VH$4O!{EEz5O^IJ8s?q0z>$(W2Xy#t6r7Y znByKUh21ntAI`nVYkLuj&Kp2GaIa@TIM7)wz}lab_c69HcdnT>9MsLFFByrEK5>CE zwmBc__lH-uj9JiDAp(5U-t4Kt3yP$2zs@(VYAT)d;j(ir=ZW`ED$< 7do4U z@?Zwx_IUejA!EGBk=oDqd36fun*0niwskgNcU9s^k%bE#NE^{!+W@p>$M#29;H-vx zb#!l}Uf5IG3F2NmmP{#9eqVL!S*Akctnhc<*$YyP9~(wKH4f=EuzmDbe|)`HwKPtO z)@F1|!$oS7?^%v;cjP66Je7U sFA+@=-botgn!R{>uVi5Rp;c zc8o@6Wy0;cOOCJh|4_-EK-j4exOXSIT(o+|L>wkF&(H8p7sSwwebrZlqI6vyMHg$A zGLzsJ23%@ Wk)8#n8rcz-LqdUcPeZmcpJu zEEV2D$Cg!_@!l98PLjGG@6EkkT@jST47<_D^#<7Es+Xc?!$eI9K&X0mQMc}Ke0)4r z&jNzul}gH@Pm#qZ8vH}%1CagChIXAzn{DYf?7wNefPbkCIH$7IM;sc@50+Z%_E+aE zQBqJ;ixnXKN(a(>_pJ`Wyw7j*RPHb4JA%lnr d7vLfpasHwV%>Noe3xt&Q=NET& zL68BrkxSGx2~iHyuRx7@If9JLXhhF#g)ns9qT7h0T&HKAhdW4&0_pyw)9+Y=K)}5j zo#hNNoSyiyfINmDrW=`cZ|;6~HxaeZmO6-*p7RA+E1meS@r`i?T-MPq4go(OzO&*g zc<%^(T6y{a3#AaTm`A1l0 !8y}japFszMl6cXPl22ZQemn5nz-|Zc zkOZJZC2NSzP8Ia)NuzDfx$u1u$C?0^_toMvmhVI%v6P-L7-Odx%HZ9*cR{}WWh;)3 z*aNIo@+>_)JpsUIxm0jz!mUr&WE*5gw+$OH#o+SWq0`a{#dq(|mx2SqJYFtj6fo|3 z-Y(IH ?9I)9wC4sd3k*!$kseO;eh`znb7Xz*0UD_w N&KX25OsO8?2z{|YiaJk4wPFLW~tS7S!>&AgbP zlTHYpQ4;F_U$;T))!=(qHiNHC#5i(@zNy!KQxRFQeQCQ`+qUi9#GBi@IlkxY<@i?^ z`rhGr(9nTY%uJ0TQi-24sI>1rKSycY{lJY_3LYkkSK&eWWu0p}$;(NzRCjO6-Fr1_ z3JwM$&0z}U*K?H#Q$8vsf95C+^m>=Q`KRAj%*0YQLgI&%1aK(M Jw cZy=V(+aR>)iU z_pgwLOM?oD`U{I~N2UXrgb4~O@=A6LP%HeO0z}m$)a(b0nD)6<>+5v?H;1d}?YuPd zk;RhH=8|xep}jNb^&t2U>49kckFjgQS3)qNJ5NOH&4}ka4v!a)L*~Cnf#z{X)S4aL zXaF+uf&jN6d7$y6a #f@b!NWkWxxGO;=-MBe42<-MI*td-T%IBwfbC-s1Br7;=j@ zK0Y1|0y=r%bfm5UOkSCp%)r(1!+>44vJaGREki@PiE}pbR=_L+ fWoxa~ z4?xt<-$t*sGNm>{%#PH4AS=dLNU}r?l$%fpp&>its#l5B@|p9W+l5*!bzW=0Z};$s zCtMLYmFG@J{Wiuc5#UqF>{uZQ35ke415H0MF)`~3P!`_4rFe7at#V*sV_JodYkhUK zWYN`-x~~$q*1_)pxxwN~pS5a(CJdRN*4U`8y?zQB!_dkJ40xq$K!^l|?_=#Em2y@T zs=a=*DXzD-w{%&R>9yHd2k>@!Jk M~Kylq`zmZF;Ek||^#g;%<8y|r{m=vY`&1?1v*ON=l z_}V1mmb2Q> )ZneNFc}r?Kh07ph{^?H&7Rfo#dAjc4;4n}Ff}79+1^xAIKb@Fh zkbB#EV>$2Bd~7}t^HHojU|Dvy1x|!Y=2076J&mOo+ L)gBB1Rgi7*dsvfXF0lWtvrz64jdH2Nh>^q-A3-rUNwuriOAXh7oJput! zC{^~1Ha4g16tWLM5!3we$NHMU?gQHQbA6U)V!-p1`E*MJNFAUi?mP!=q<>cVe|#gN z508$HfJTsJlng~cO8s4Dn^?ihs02>b0nJra;y3g8x6ARr0Ntn3eX(;W=;OzaHl6WI zujKi%JhWb3dz4g41QL-J#I5cq=c$?tlOJ8F0)p4RzRfMzAIWl^c+bBz;d?D{X~|wI zTV8JK6zD*urXMN6CCFV{mAbp4unC@|=Tff1P8L86Yt*Fr5$**^@SX!Fop|R?Dk>__ z+hP%>S9?5!CWmq b((rr-YhBV7qWp zgkFk4EvE4s#Z|4Eh*W7I`)dUOK@xrR8wopii}B}GQE3VWVN)mnTdBAhK6#c%ODYH3 zhF+fiK$FAcuam}d; NYl9TEqRd-XP5-(sT$Ssj4?N{*=(o=3S2) z0;17Vly>Tb?9bv?L*wJ=dv*7VfcUta9V{Oi8F@_yf3#Xa_Fzbb>Ibp0*D266Atx>2 zGYco+O#xQmF$>+L s&*)nSVOS50 zkkE+oVDp8Y;MP}DSF9)rA*Blv9Z&2$Nw`eTyNHQb(Zr!YS-HYUj2YA|E!m)=ksDOn zszFcrbUML#m3+*rDxU6s(48_f8D5VzWE)s3K^~LJ_QRX62_A`sg}hJ`Lxu#OEXI}t z|L)zpTU%{ZM9gpy!QR~L0%6zZdoP2|!K#B`k#q)<*L4M(`)1JJo{wUq1T}B3T?u|f z63AwMoe^1@0r@lVnjk@wqVn;7R~TOuj)}MWoOiwEa3L;^fwwNY474Ml4h*ffG`#wO z1IYtWZQAzGWO;oxG2wh=Jdc1XJ0hs2^v#$vJO?W)Xl+5aC=V!P^#fk!I!Iu!odZ{7 z? ?JsBYFl3)z*Wi139ppmyQ`87v5VUp58Vt2M)`5u*h|QH5=qk zBD)9`NkeRT!>C>yDP7wdQb8vWliRB(W8ulIAy&pKt22pL`lL9RUn^ZrRpS&5-!QL- zQsG`Kvn_>h-=HN@!XG%y)#1@#du|b{Tko%b^F7(_`aCnU@hGTR1_W1XfE8$~M<<8| zbbw8j-X`?^R=CS~```$8wV|HB1t`R_&?I*6|9l$^igXP=p42EBzMfX?fg%DPI+5lR zF-RW tX z#t3R^We`eSBvLqp%O8DCYDLFCS-SHnVNu$|f`^XbKdZ1cTc?+K`F9KcqG()&U;sBw z$i2*$(Yl<2Xma3Ve?pK=!wc;@zh0cNL_YpO0$Sh=*`VME9H`~{{k!(XWHsw}bu0K; z&I>wbtAyBXH60BgqM*9ARi$CbDMdrWE6kauaAYzDOADX;^} 1!pH>^r z4qN3+)dGGlmYxxIZ_j<}$wZ4%^Ll1ip+^)q)0!d@K*-V&J^#TWlUJy(*PYEM@Mh7l z4Bu$b=WERKv}Ygm2`>d|kG!N-#-YjG1}?;P#Lhguf9^H__U6Z0ydKJTM-Coq )b!qe=jVmQGaFaizK{TVD~>=GSo8s<1Uxb^e@wt?a8IiN@$)jvH|xRpPU5^1ih> z#+9J$w^0x1xLVu3n$8|8osyQ|bW5H$1)rT*(1Wnk+Z(U_wGWOyQ@9=>ciyrvk^iT- zXz6mbXp|2xj;Q}!`o$<4afGzTbu(tOdDFaQAq EDEnA*pKFnOE|xBw7OqYnZ!#CnN%LCO?m9(@ zfR==mA#f$r8(tZ8yq_6|SQ_jg(!R>XB3z3EaTRsY9nV1<@~tcFh~H5b)yP^B{AMKZ zr&n9R-7LN@;PpkApV-awi@Pi$YVX+8e@`WO&5%J$%0KnL^x0#}*sZaSIY$zNS8ImO z6g^jHFNM;OP5;doUDgfo6J>2p#Z&2%#_$v@wQ&B_F9MtldDtST7FzYx*&@UTPl&-< z2ZJGcB(8pZ+qGY|H(qB$U*}(K)4kfJTgX-|M{J*eA%TK#Crp$$Mk1Ux;zdmBjGb~F zLtb=VZ;6_r9pb(KpVdUlsp#u_0+~N2LDs;m|K;?2% 1)z10x3*$^AT`}xWXJQ@%Zeng1g&3ON)qPN% z+xQFCpIJ$Ln@>mG@cI>@FqK%kbk7!JdKessr5 ~Tl1Znu)?%E9{wvO}+0W}lru68uP>^YXR|)iUw#01l)7Wf}ct z>d@d=nyWk^5~=w>g`_ZN_)Ctedj}Hfd4csSpE){JMfb#8*8<)=WTf!MHtMLxt4%#Q z* @&LD^6afE zCzp3#U5lF2t2oCG2p3IaE|M*B?oC2pDkL{DNlAlD8I2w$l;Y-mOwO6gYi89(Pvdn9 z`#6?!cr3xwlI>ZUX^f9lQ{w9F{jQU5WN81RYwfQ@(HG%3_6WE=Oka#x{cTL n0M~x}9TTH8Xjp X-8IlzWyQ ^%*IM!pbDhFK>bmYEgNn}>Y3X+conGN1* zA%dj2%6x?d!*|U {A0}UD#9R^1ED_WjyBpQSI=Qtp z(N+1Viy0O8oj+Z4N73N=Ppf){B{nn_5ehBhsXbP18O3PfduD0Fn(OZL9=yagr~8wY zwmnZ8BJp^#)St%2k_JGP3~;%SC3;D;H)|Uj(nEy~IEBe a=}zk`vr zNRDogc(AV`KVBnJPq({6rgTuhH|y!SewQRo%DDc D2!8mi~C&ryMi?u#M!sWJ@F~EFYKBbK8B|=!`7;wEss%9;)82dLgxAaDLA)>D6nw zn8MX*MNgja3sEUg*;y$~$wO?2`?VC6abCl78f|m*bN%5dl1Mh#c%l_oNGT$WB$_xs zI*g3$iECK$8eAeQ;{rN=4#UFEBqT#Zxfv#LO#Q}Vh$bf2L!HecaM=}!TInK6I^(|U zG{Ip`(ut36Q~#Ek{O8