From f9a1dbf0dfa8ad5bd20fe4f72bb72a4470b248db Mon Sep 17 00:00:00 2001 From: Absinthe Date: Sat, 11 Dec 2021 11:59:28 +0800 Subject: [PATCH 01/19] Explicitly specify `android:exported` to make compatible with Android 12. --- lib/utilcode/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/utilcode/src/main/AndroidManifest.xml b/lib/utilcode/src/main/AndroidManifest.xml index fc5b75e0e..d45dd5778 100644 --- a/lib/utilcode/src/main/AndroidManifest.xml +++ b/lib/utilcode/src/main/AndroidManifest.xml @@ -5,12 +5,14 @@ Date: Wed, 25 May 2022 11:18:02 +0800 Subject: [PATCH 02/19] fix bug --- lib/utilcode/src/main/res/xml/util_code_provider_paths.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml b/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml index ed731a229..b88716480 100644 --- a/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml +++ b/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml @@ -23,4 +23,9 @@ - \ No newline at end of file + + + From 8dc01389ee5599c44c7ae26a8c26411b63bfa564 Mon Sep 17 00:00:00 2001 From: Justson Date: Wed, 8 Jun 2022 10:55:22 +0800 Subject: [PATCH 03/19] Update README-CN.md --- 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 0e4e93f3a..260cabac2 100644 --- a/lib/utilcode/README-CN.md +++ b/lib/utilcode/README-CN.md @@ -6,7 +6,7 @@ Gradle: implementation 'com.blankj:utilcodex:1.31.0' // Not in maintenance -implementation 'com.blankj:utilcode:1.30.6' +implementation 'com.blankj:utilcode:1.30.7' ``` From ed848ebd638507a492946e6300b057fb621b5dba Mon Sep 17 00:00:00 2001 From: NH002 Date: Thu, 9 Jun 2022 09:06:11 +0200 Subject: [PATCH 04/19] Added uri2FileNoCacheCopy --- .../main/java/com/blankj/utilcode/util/UriUtils.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java index 322b9d119..c22d1bba3 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java @@ -77,6 +77,17 @@ public static File uri2File(final Uri uri) { return copyUri2Cache(uri); } + /** + * Uri to file, without creating the cache copy if the path cannot be resolved. + * + * @param uri The uri. + * @return file + */ + public static File uri2FileNoCacheCopy(final Uri uri) { + if (uri == null) return null; + return uri2FileReal(uri); + } + /** * Uri to file. * From da8b04946981398dfb217825946af55cba3b3444 Mon Sep 17 00:00:00 2001 From: taochen <935612713@qq.com> Date: Mon, 18 Jul 2022 16:12:33 +0800 Subject: [PATCH 05/19] =?UTF-8?q?[M]=20BarUtils=E6=B7=BB=E5=8A=A0transpare?= =?UTF-8?q?ntNavBar=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pkg/feature/bar/nav/BarNavActivity.kt | 42 +++++++++++++------ .../com/blankj/utilcode/util/BarUtils.java | 32 +++++++++++--- 2 files changed, 57 insertions(+), 17 deletions(-) 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 1b3032974..48a738ecd 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 @@ -12,7 +12,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 /** * ``` @@ -41,24 +40,43 @@ class BarNavActivity : CommonActivity() { add(CommonItemTitle("isSupportNavBar", BarUtils.isSupportNavBar().toString())) if (BarUtils.isSupportNavBar()) { add(CommonItemSwitch( - R.string.bar_nav_visibility, - { BarUtils.isNavBarVisible(this@BarNavActivity) }, - { BarUtils.setNavBarVisibility(this@BarNavActivity, it) } + R.string.bar_nav_visibility, + { BarUtils.isNavBarVisible(this@BarNavActivity) }, + { BarUtils.setNavBarVisibility(this@BarNavActivity, it) } )) add(CommonItemSwitch( - R.string.bar_nav_light_mode, - { BarUtils.isNavBarLightMode(this@BarNavActivity) }, - { BarUtils.setNavBarLightMode(this@BarNavActivity, it) } + R.string.bar_nav_light_mode, + { BarUtils.isNavBarLightMode(this@BarNavActivity) }, + { BarUtils.setNavBarLightMode(this@BarNavActivity, it) } )) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - add(CommonItemClick("getNavBarColor: ${ColorUtils.int2ArgbString(BarUtils.getNavBarColor(this@BarNavActivity))}").setOnItemClickListener() { _, item, _ -> - BarUtils.setNavBarColor(this@BarNavActivity, ColorUtils.getRandomColor()) - itemsView.updateItems(bindItems()) - item.title = "getNavBarColor: ${ColorUtils.int2ArgbString(BarUtils.getNavBarColor(this@BarNavActivity))}" - }) + add( + CommonItemClick( + "getNavBarColor: ${ + ColorUtils.int2ArgbString( + BarUtils.getNavBarColor( + this@BarNavActivity + ) + ) + }" + ).setOnItemClickListener() { _, item, _ -> + BarUtils.setNavBarColor( + this@BarNavActivity, + ColorUtils.getRandomColor() + ) + itemsView.updateItems(bindItems()) + item.title = "getNavBarColor: ${ + ColorUtils.int2ArgbString( + BarUtils.getNavBarColor(this@BarNavActivity) + ) + }" + }) } + add(CommonItemClick("transparentNavBar").setOnItemClickListener() { _, item, _ -> + BarUtils.transparentNavBar(this@BarNavActivity) + }) } } } 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 af9dbc4fc..ece4f7fab 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 @@ -1,5 +1,7 @@ package com.blankj.utilcode.util; +import static android.Manifest.permission.EXPAND_STATUS_BAR; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; @@ -19,15 +21,13 @@ import android.view.Window; import android.view.WindowManager; -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; +import java.lang.reflect.Method; /** *
@@ -44,8 +44,8 @@ public final class BarUtils {
     ///////////////////////////////////////////////////////////////////////////
 
     private static final String TAG_STATUS_BAR = "TAG_STATUS_BAR";
-    private static final String TAG_OFFSET     = "TAG_OFFSET";
-    private static final int    KEY_OFFSET     = -123;
+    private static final String TAG_OFFSET = "TAG_OFFSET";
+    private static final int KEY_OFFSET = -123;
 
     private BarUtils() {
         throw new UnsupportedOperationException("u can't instantiate me...");
@@ -715,4 +715,26 @@ public static boolean isNavBarLightMode(@NonNull final Window window) {
         }
         return false;
     }
+
+    public static void transparentNavBar(@NonNull final Activity activity) {
+        transparentNavBar(activity.getWindow());
+    }
+
+    public static void transparentNavBar(@NonNull final Window window) {
+        if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) return;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            window.setNavigationBarContrastEnforced(false);
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            window.setNavigationBarColor(Color.TRANSPARENT);
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            if ((window.getAttributes().flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0) {
+                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+            }
+        }
+        View decorView = window.getDecorView();
+        int vis = decorView.getSystemUiVisibility();
+        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
+        decorView.setSystemUiVisibility(vis | option);
+    }
 }

From 0a1be7ec672053012b2bdae6259037765ff0af14 Mon Sep 17 00:00:00 2001
From: taochen <935612713@qq.com>
Date: Mon, 18 Jul 2022 17:02:24 +0800
Subject: [PATCH 06/19] =?UTF-8?q?[M]=20=E4=BF=AE=E6=94=B9BarUtils=E6=96=B9?=
 =?UTF-8?q?=E6=B3=95=E5=88=97=E8=A1=A8=E5=8F=8A=E6=8F=8F=E8=BF=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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

diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index 0e4e93f3a..f7523783f 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -141,6 +141,7 @@ getNavBarColor                       : 获取导航栏颜色
 isSupportNavBar                      : 判断是否支持导航栏
 setNavBarLightMode                   : 设置导航栏是否为浅色模式
 isNavBarLightMode                    : 判断导航栏是否为浅色模式
+transparentNavBar                    : 透明导航栏
 ```
 
 * ### 亮度相关 -> [BrightnessUtils.java][brightness.java] -> [Demo][brightness.demo]
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index cdabfba45..9d2025ebb 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -140,6 +140,7 @@ getNavBarColor
 isSupportNavBar
 setNavBarLightMode
 isNavBarLightMode
+transparentNavBar
 ```
 
 * ### About Brightness -> [BrightnessUtils.java][brightness.java] -> [Demo][brightness.demo]

From cf983059a82e0306ea1bdaa773f9fec0ed03ad22 Mon Sep 17 00:00:00 2001
From: taochen <935612713@qq.com>
Date: Tue, 19 Jul 2022 12:00:46 +0800
Subject: [PATCH 07/19] =?UTF-8?q?[F]=20TargetSdkVersion=2030=20AppUtils.is?=
 =?UTF-8?q?AppInstalled=E8=BF=94=E5=9B=9E=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 lib/utilcode/src/main/AndroidManifest.xml | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/utilcode/src/main/AndroidManifest.xml b/lib/utilcode/src/main/AndroidManifest.xml
index fc5b75e0e..4d2b38e47 100644
--- a/lib/utilcode/src/main/AndroidManifest.xml
+++ b/lib/utilcode/src/main/AndroidManifest.xml
@@ -1,6 +1,15 @@
 
 
+    
+        
+            
+        
+        
+            
+        
+    
+
     
 
         
Date: Tue, 19 Jul 2022 17:31:46 +0800
Subject: [PATCH 08/19] =?UTF-8?q?[M]=20AppUtils=E5=A2=9E=E5=8A=A0getAppMin?=
 =?UTF-8?q?SdkVersion,=20getAppTargetSdkVersion=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../utilcode/pkg/feature/app/AppActivity.kt   | 108 ++++++++--------
 lib/utilcode/README-CN.md                     |   2 +
 lib/utilcode/README.md                        |   2 +
 .../com/blankj/utilcode/util/AppUtils.java    | 115 ++++++++++++++++--
 .../debug/tool/appInfo/AppInfoItem.java       |  15 ++-
 5 files changed, 173 insertions(+), 69 deletions(-)

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 175fa1bc3..21eb35114 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
@@ -54,7 +54,10 @@ class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
 
     override fun bindItems(): MutableList> {
         return CollectionUtils.newArrayList(
-                CommonItemSwitch("registerAppStatusChangedListener", { isRegisterAppStatusChangedListener }, {
+            CommonItemSwitch(
+                "registerAppStatusChangedListener",
+                { isRegisterAppStatusChangedListener },
+                {
                     isRegisterAppStatusChangedListener = it
                     if (it) {
                         AppUtils.registerAppStatusChangedListener(this)
@@ -62,55 +65,63 @@ class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
                         AppUtils.unregisterAppStatusChangedListener(this)
                     }
                 }),
-                CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
-                CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()),
-                CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()),
-                CommonItemTitle("isAppForeground", AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString()),
-                CommonItemTitle("isAppRunning", AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString()),
-                CommonItemImage("getAppIcon") {
-                    it.setImageDrawable(AppUtils.getAppIcon())
-                },
-                CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()),
-                CommonItemTitle("getAppName", AppUtils.getAppName()),
-                CommonItemTitle("getAppPath", AppUtils.getAppPath()),
-                CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()),
-                CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()),
-                CommonItemTitle("getAppSignaturesSHA1", AppUtils.getAppSignaturesSHA1().toString()),
-                CommonItemTitle("getAppSignaturesSHA256", AppUtils.getAppSignaturesSHA256().toString()),
-                CommonItemTitle("getAppSignaturesMD5", AppUtils.getAppSignaturesMD5().toString()),
-                CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()),
-                CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()),
-
-                CommonItemClick(R.string.app_install) {
-                    if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
-                        ToastUtils.showShort(R.string.app_install_tips)
+            CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
+            CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()),
+            CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()),
+            CommonItemTitle(
+                "isAppForeground",
+                AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString()
+            ),
+            CommonItemTitle(
+                "isAppRunning",
+                AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString()
+            ),
+            CommonItemImage("getAppIcon") {
+                it.setImageDrawable(AppUtils.getAppIcon())
+            },
+            CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()),
+            CommonItemTitle("getAppName", AppUtils.getAppName()),
+            CommonItemTitle("getAppPath", AppUtils.getAppPath()),
+            CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()),
+            CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()),
+            CommonItemTitle("getAppMinSdkVersion", AppUtils.getAppMinSdkVersion().toString()),
+            CommonItemTitle("getAppTargetSdkVersion", AppUtils.getAppTargetSdkVersion().toString()),
+            CommonItemTitle("getAppSignaturesSHA1", AppUtils.getAppSignaturesSHA1().toString()),
+            CommonItemTitle("getAppSignaturesSHA256", AppUtils.getAppSignaturesSHA256().toString()),
+            CommonItemTitle("getAppSignaturesMD5", AppUtils.getAppSignaturesMD5().toString()),
+            CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()),
+            CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()),
+
+            CommonItemClick(R.string.app_install) {
+                if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
+                    ToastUtils.showShort(R.string.app_install_tips)
+                } else {
+                    if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
+                        ReleaseInstallApkTask(listener).execute()
                     } else {
-                        if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
-                            ReleaseInstallApkTask(listener).execute()
-                        } else {
-                            listener.onReleased()
-                        }
+                        listener.onReleased()
                     }
-                },
-                CommonItemClick(R.string.app_uninstall) {
-                    if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
-                        AppUtils.uninstallApp(Config.TEST_PKG)
-                    } else {
-                        ToastUtils.showShort(R.string.app_uninstall_tips)
-                    }
-                },
-                CommonItemClick(R.string.app_launch) {
-                    AppUtils.launchApp(this.packageName)
-                },
-                CommonItemClick(R.string.app_relaunch) {
-                    AppUtils.relaunchApp()
-                },
-                CommonItemClick(R.string.app_launch_details_settings, true) {
-                    AppUtils.launchAppDetailsSettings()
-                },
-                CommonItemClick(R.string.app_exit) {
-                    AppUtils.exitApp()
                 }
+            },
+            CommonItemClick(R.string.app_uninstall) {
+                if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
+                    AppUtils.uninstallApp(Config.TEST_PKG)
+                } else {
+                    ToastUtils.showShort(R.string.app_uninstall_tips)
+                }
+            },
+            CommonItemClick(R.string.app_launch) {
+                AppUtils.launchApp(this.packageName)
+            },
+            CommonItemClick(R.string.app_relaunch) {
+                AppUtils.relaunchApp()
+            },
+            CommonItemClick(R.string.app_launch_details_settings, true) {
+                AppUtils.launchAppDetailsSettings()
+            },
+            CommonItemClick(R.string.app_exit) {
+                AppUtils.exitApp()
+            }
         )
     }
 
@@ -130,7 +141,8 @@ class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
     }
 }
 
-class ReleaseInstallApkTask(private val mListener: OnReleasedListener) : ThreadUtils.SimpleTask() {
+class ReleaseInstallApkTask(private val mListener: OnReleasedListener) :
+    ThreadUtils.SimpleTask() {
 
     override fun doInBackground() {
         ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH)
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index f7523783f..641e96ff1 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -72,6 +72,8 @@ getAppName                        : 获取 App 名称
 getAppPath                        : 获取 App 路径
 getAppVersionName                 : 获取 App 版本号
 getAppVersionCode                 : 获取 App 版本码
+getAppMinSdkVersion               : 获取 App 支持最低系统版本号
+getAppTargetSdkVersion            : 获取 App 目标系统版本号
 getAppSignatures                  : 获取 App 签名
 getAppSignaturesSHA1              : 获取应用签名的的 SHA1 值
 getAppSignaturesSHA256            : 获取应用签名的的 SHA256 值
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index 9d2025ebb..b88bcbcfb 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -72,6 +72,8 @@ getAppName
 getAppPath
 getAppVersionName
 getAppVersionCode
+getAppMinSdkVersion
+getAppTargetSdkVersion
 getAppSignatures
 getAppSignaturesSHA1
 getAppSignaturesSHA256
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 8f03e1cf1..3a07653fb 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
@@ -14,13 +14,13 @@
 import android.os.Build;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 /**
  * 
  *     author: Blankj
@@ -541,6 +541,65 @@ public static int getAppVersionCode(final String packageName) {
         }
     }
 
+    /**
+     * Return the application's minimum sdk version code.
+     *
+     * @return the application's minimum sdk version code
+     */
+    public static int getAppMinSdkVersion() {
+        return getAppMinSdkVersion(Utils.getApp().getPackageName());
+    }
+
+    /**
+     * Return the application's minimum sdk version code.
+     *
+     * @param packageName The name of the package.
+     * @return the application's minimum sdk version code
+     */
+    public static int getAppMinSdkVersion(final String packageName) {
+        if (UtilsBridge.isSpace(packageName)) return -1;
+        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) return -1;
+        try {
+            PackageManager pm = Utils.getApp().getPackageManager();
+            PackageInfo pi = pm.getPackageInfo(packageName, 0);
+            if (null == pi) return -1;
+            ApplicationInfo ai = pi.applicationInfo;
+            return null == ai ? -1 : ai.minSdkVersion;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
+    /**
+     * Return the application's target sdk version code.
+     *
+     * @return the application's target sdk version code
+     */
+    public static int getAppTargetSdkVersion() {
+        return getAppTargetSdkVersion(Utils.getApp().getPackageName());
+    }
+
+    /**
+     * Return the application's target sdk version code.
+     *
+     * @param packageName The name of the package.
+     * @return the application's target sdk version code
+     */
+    public static int getAppTargetSdkVersion(final String packageName) {
+        if (UtilsBridge.isSpace(packageName)) return -1;
+        try {
+            PackageManager pm = Utils.getApp().getPackageManager();
+            PackageInfo pi = pm.getPackageInfo(packageName, 0);
+            if (null == pi) return -1;
+            ApplicationInfo ai = pi.applicationInfo;
+            return null == ai ? -1 : ai.targetSdkVersion;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
     /**
      * Return the application's signature.
      *
@@ -721,6 +780,8 @@ private static List getAppSignaturesHash(final String packageName, final
      * 
  • path of package
  • *
  • version name
  • *
  • version code
  • + *
  • minimum sdk version code
  • + *
  • target sdk version code
  • *
  • is system
  • * * @@ -740,6 +801,8 @@ public static AppInfo getAppInfo() { *
  • path of package
  • *
  • version name
  • *
  • version code
  • + *
  • minimum sdk version code
  • + *
  • target sdk version code
  • *
  • is system
  • * * @@ -829,13 +892,18 @@ private static AppInfo getBean(final PackageManager pm, final PackageInfo pi) { String packageName = pi.packageName; ApplicationInfo ai = pi.applicationInfo; if (ai == null) { - return new AppInfo(packageName, "", null, "", versionName, versionCode, false); + return new AppInfo(packageName, "", null, "", versionName, versionCode, -1, -1, false); } String name = ai.loadLabel(pm).toString(); Drawable icon = ai.loadIcon(pm); String packagePath = ai.sourceDir; + int minSdkVersion = -1; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + minSdkVersion = ai.minSdkVersion; + } + int targetSdkVersion = ai.targetSdkVersion; boolean isSystem = (ApplicationInfo.FLAG_SYSTEM & ai.flags) != 0; - return new AppInfo(packageName, name, icon, packagePath, versionName, versionCode, isSystem); + return new AppInfo(packageName, name, icon, packagePath, versionName, versionCode, minSdkVersion, targetSdkVersion, isSystem); } /** @@ -843,13 +911,15 @@ private static AppInfo getBean(final PackageManager pm, final PackageInfo pi) { */ public static class AppInfo { - private String packageName; - private String name; + private String packageName; + private String name; private Drawable icon; - private String packagePath; - private String versionName; - private int versionCode; - private boolean isSystem; + private String packagePath; + private String versionName; + private int versionCode; + private int minSdkVersion; + private int targetSdkVersion; + private boolean isSystem; public Drawable getIcon() { return icon; @@ -907,14 +977,31 @@ public void setVersionName(final String versionName) { this.versionName = versionName; } - public AppInfo(String packageName, String name, Drawable icon, String packagePath, - String versionName, int versionCode, boolean isSystem) { + public int getMinSdkVersion() { + return minSdkVersion; + } + + public void setMinSdkVersion(int minSdkVersion) { + this.minSdkVersion = minSdkVersion; + } + + public int getTargetSdkVersion() { + return targetSdkVersion; + } + + public void setTargetSdkVersion(int targetSdkVersion) { + this.targetSdkVersion = targetSdkVersion; + } + + public AppInfo(String packageName, String name, Drawable icon, String packagePath, String versionName, int versionCode, int minSdkVersion, int targetSdkVersion, boolean isSystem) { this.setName(name); this.setIcon(icon); this.setPackageName(packageName); this.setPackagePath(packagePath); this.setVersionName(versionName); this.setVersionCode(versionCode); + this.setMinSdkVersion(minSdkVersion); + this.setTargetSdkVersion(targetSdkVersion); this.setSystem(isSystem); } @@ -928,6 +1015,8 @@ public String toString() { "\n app path: " + getPackagePath() + "\n app v name: " + getVersionName() + "\n app v code: " + getVersionCode() + + "\n app v min: " + getMinSdkVersion() + + "\n app v target: " + getTargetSdkVersion() + "\n is system: " + isSystem() + "\n}"; } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java index 76351e4b1..54895ee71 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java @@ -5,10 +5,12 @@ import android.view.View.OnClickListener; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; + import com.blankj.utilcode.util.AppUtils; import com.blankj.utilcode.util.ClickUtils; import com.blankj.utilcode.util.StringUtils; -import com.blankj.utildebug.DebugUtils; import com.blankj.utildebug.R; import com.blankj.utildebug.base.rv.BaseItem; import com.blankj.utildebug.base.rv.ItemViewHolder; @@ -16,9 +18,6 @@ import java.util.ArrayList; import java.util.List; -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; - /** *
      *     author: blankj
    @@ -29,8 +28,8 @@
      */
     public class AppInfoItem extends BaseItem {
     
    -    private String          mTitle;
    -    private String          mContent;
    +    private String mTitle;
    +    private String mContent;
         private OnClickListener mListener;
     
         private TextView titleTv;
    @@ -71,9 +70,9 @@ public static List getAppInfoItems() {
             appInfoItems.add(new AppInfoItem(R.string.du_app_info_version_name, AppUtils.getAppVersionName()));
             appInfoItems.add(new AppInfoItem(R.string.du_app_info_version_code, String.valueOf(AppUtils.getAppVersionCode())));
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    -            appInfoItems.add(new AppInfoItem(R.string.du_app_info_min_sdk_version, String.valueOf(DebugUtils.getApp().getApplicationInfo().minSdkVersion)));
    +            appInfoItems.add(new AppInfoItem(R.string.du_app_info_min_sdk_version, String.valueOf(AppUtils.getAppMinSdkVersion())));
             }
    -        appInfoItems.add(new AppInfoItem(R.string.du_app_info_target_sdk_version, String.valueOf(DebugUtils.getApp().getApplicationInfo().targetSdkVersion)));
    +        appInfoItems.add(new AppInfoItem(R.string.du_app_info_target_sdk_version, String.valueOf(AppUtils.getAppTargetSdkVersion())));
             appInfoItems.add(new AppInfoItem(R.string.du_app_info_open_app_info_page, "", new OnClickListener() {
                 @Override
                 public void onClick(View v) {
    
    From 718f281a3da9d4e4e6c3298faf4da9e4563e7d50 Mon Sep 17 00:00:00 2001
    From: taochen <935612713@qq.com>
    Date: Mon, 18 Jul 2022 16:12:33 +0800
    Subject: [PATCH 09/19] =?UTF-8?q?[M]=20BarUtils=E6=B7=BB=E5=8A=A0transpare?=
     =?UTF-8?q?ntNavBar=E5=AE=9E=E7=8E=B0?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../pkg/feature/bar/nav/BarNavActivity.kt     | 42 +++++++++++++------
     .../com/blankj/utilcode/util/BarUtils.java    | 32 +++++++++++---
     2 files changed, 57 insertions(+), 17 deletions(-)
    
    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 1b3032974..48a738ecd 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
    @@ -12,7 +12,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
     
     /**
      * ```
    @@ -41,24 +40,43 @@ class BarNavActivity : CommonActivity() {
                 add(CommonItemTitle("isSupportNavBar", BarUtils.isSupportNavBar().toString()))
                 if (BarUtils.isSupportNavBar()) {
                     add(CommonItemSwitch(
    -                        R.string.bar_nav_visibility,
    -                        { BarUtils.isNavBarVisible(this@BarNavActivity) },
    -                        { BarUtils.setNavBarVisibility(this@BarNavActivity, it) }
    +                    R.string.bar_nav_visibility,
    +                    { BarUtils.isNavBarVisible(this@BarNavActivity) },
    +                    { BarUtils.setNavBarVisibility(this@BarNavActivity, it) }
                     ))
     
                     add(CommonItemSwitch(
    -                        R.string.bar_nav_light_mode,
    -                        { BarUtils.isNavBarLightMode(this@BarNavActivity) },
    -                        { BarUtils.setNavBarLightMode(this@BarNavActivity, it) }
    +                    R.string.bar_nav_light_mode,
    +                    { BarUtils.isNavBarLightMode(this@BarNavActivity) },
    +                    { BarUtils.setNavBarLightMode(this@BarNavActivity, it) }
                     ))
     
                     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    -                    add(CommonItemClick("getNavBarColor: ${ColorUtils.int2ArgbString(BarUtils.getNavBarColor(this@BarNavActivity))}").setOnItemClickListener() { _, item, _ ->
    -                        BarUtils.setNavBarColor(this@BarNavActivity, ColorUtils.getRandomColor())
    -                        itemsView.updateItems(bindItems())
    -                        item.title = "getNavBarColor: ${ColorUtils.int2ArgbString(BarUtils.getNavBarColor(this@BarNavActivity))}"
    -                    })
    +                    add(
    +                        CommonItemClick(
    +                            "getNavBarColor: ${
    +                                ColorUtils.int2ArgbString(
    +                                    BarUtils.getNavBarColor(
    +                                        this@BarNavActivity
    +                                    )
    +                                )
    +                            }"
    +                        ).setOnItemClickListener() { _, item, _ ->
    +                            BarUtils.setNavBarColor(
    +                                this@BarNavActivity,
    +                                ColorUtils.getRandomColor()
    +                            )
    +                            itemsView.updateItems(bindItems())
    +                            item.title = "getNavBarColor: ${
    +                                ColorUtils.int2ArgbString(
    +                                    BarUtils.getNavBarColor(this@BarNavActivity)
    +                                )
    +                            }"
    +                        })
                     }
    +                add(CommonItemClick("transparentNavBar").setOnItemClickListener() { _, item, _ ->
    +                    BarUtils.transparentNavBar(this@BarNavActivity)
    +                })
                 }
             }
         }
    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 af9dbc4fc..ece4f7fab 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
    @@ -1,5 +1,7 @@
     package com.blankj.utilcode.util;
     
    +import static android.Manifest.permission.EXPAND_STATUS_BAR;
    +
     import android.annotation.SuppressLint;
     import android.app.Activity;
     import android.content.Context;
    @@ -19,15 +21,13 @@
     import android.view.Window;
     import android.view.WindowManager;
     
    -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;
    +import java.lang.reflect.Method;
     
     /**
      * 
    @@ -44,8 +44,8 @@ public final class BarUtils {
         ///////////////////////////////////////////////////////////////////////////
     
         private static final String TAG_STATUS_BAR = "TAG_STATUS_BAR";
    -    private static final String TAG_OFFSET     = "TAG_OFFSET";
    -    private static final int    KEY_OFFSET     = -123;
    +    private static final String TAG_OFFSET = "TAG_OFFSET";
    +    private static final int KEY_OFFSET = -123;
     
         private BarUtils() {
             throw new UnsupportedOperationException("u can't instantiate me...");
    @@ -715,4 +715,26 @@ public static boolean isNavBarLightMode(@NonNull final Window window) {
             }
             return false;
         }
    +
    +    public static void transparentNavBar(@NonNull final Activity activity) {
    +        transparentNavBar(activity.getWindow());
    +    }
    +
    +    public static void transparentNavBar(@NonNull final Window window) {
    +        if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) return;
    +        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    +            window.setNavigationBarContrastEnforced(false);
    +        }
    +        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    +            window.setNavigationBarColor(Color.TRANSPARENT);
    +        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    +            if ((window.getAttributes().flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0) {
    +                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    +            }
    +        }
    +        View decorView = window.getDecorView();
    +        int vis = decorView.getSystemUiVisibility();
    +        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    +        decorView.setSystemUiVisibility(vis | option);
    +    }
     }
    
    From afaea3eb6b29d24c18cfbcb4a103310fd380b16e Mon Sep 17 00:00:00 2001
    From: Justson 
    Date: Wed, 8 Jun 2022 10:55:22 +0800
    Subject: [PATCH 10/19] Update README-CN.md
    
    ---
     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 0e4e93f3a..260cabac2 100644
    --- a/lib/utilcode/README-CN.md
    +++ b/lib/utilcode/README-CN.md
    @@ -6,7 +6,7 @@ Gradle:
     implementation 'com.blankj:utilcodex:1.31.0'
     
     // Not in maintenance
    -implementation 'com.blankj:utilcode:1.30.6'
    +implementation 'com.blankj:utilcode:1.30.7'
     ```
     
     
    
    From 555cca99df44edc2025db0a3cbe9dc1b4b65db31 Mon Sep 17 00:00:00 2001
    From: sth0409 <97033765@qq.com>
    Date: Wed, 25 May 2022 11:18:02 +0800
    Subject: [PATCH 11/19] fix bug
    
    ---
     lib/utilcode/src/main/res/xml/util_code_provider_paths.xml | 7 ++++++-
     1 file changed, 6 insertions(+), 1 deletion(-)
    
    diff --git a/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml b/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml
    index ed731a229..b88716480 100644
    --- a/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml
    +++ b/lib/utilcode/src/main/res/xml/util_code_provider_paths.xml
    @@ -23,4 +23,9 @@
         
    -
    \ No newline at end of file
    +      
    +    
    +
    
    From 862088e4b85a0621f184f6ecea71367d05f9ba72 Mon Sep 17 00:00:00 2001
    From: Absinthe 
    Date: Sat, 11 Dec 2021 11:59:28 +0800
    Subject: [PATCH 12/19] Explicitly specify `android:exported` to make
     compatible with Android 12.
    
    ---
     lib/utilcode/src/main/AndroidManifest.xml | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/lib/utilcode/src/main/AndroidManifest.xml b/lib/utilcode/src/main/AndroidManifest.xml
    index fc5b75e0e..d45dd5778 100644
    --- a/lib/utilcode/src/main/AndroidManifest.xml
    +++ b/lib/utilcode/src/main/AndroidManifest.xml
    @@ -5,12 +5,14 @@
     
             
     
             
    Date: Mon, 18 Jul 2022 17:02:24 +0800
    Subject: [PATCH 13/19] =?UTF-8?q?[M]=20=E4=BF=AE=E6=94=B9BarUtils=E6=96=B9?=
     =?UTF-8?q?=E6=B3=95=E5=88=97=E8=A1=A8=E5=8F=8A=E6=8F=8F=E8=BF=B0?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     lib/utilcode/README-CN.md | 1 +
     lib/utilcode/README.md    | 1 +
     2 files changed, 2 insertions(+)
    
    diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
    index 260cabac2..a6ab4b3d0 100644
    --- a/lib/utilcode/README-CN.md
    +++ b/lib/utilcode/README-CN.md
    @@ -141,6 +141,7 @@ getNavBarColor                       : 获取导航栏颜色
     isSupportNavBar                      : 判断是否支持导航栏
     setNavBarLightMode                   : 设置导航栏是否为浅色模式
     isNavBarLightMode                    : 判断导航栏是否为浅色模式
    +transparentNavBar                    : 透明导航栏
     ```
     
     * ### 亮度相关 -> [BrightnessUtils.java][brightness.java] -> [Demo][brightness.demo]
    diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
    index cdabfba45..9d2025ebb 100644
    --- a/lib/utilcode/README.md
    +++ b/lib/utilcode/README.md
    @@ -140,6 +140,7 @@ getNavBarColor
     isSupportNavBar
     setNavBarLightMode
     isNavBarLightMode
    +transparentNavBar
     ```
     
     * ### About Brightness -> [BrightnessUtils.java][brightness.java] -> [Demo][brightness.demo]
    
    From 62bf1646bf43427de4f30ff0653a3dfe6da90634 Mon Sep 17 00:00:00 2001
    From: taochen <935612713@qq.com>
    Date: Tue, 19 Jul 2022 12:00:46 +0800
    Subject: [PATCH 14/19] =?UTF-8?q?[F]=20TargetSdkVersion=2030=20AppUtils.is?=
     =?UTF-8?q?AppInstalled=E8=BF=94=E5=9B=9E=E9=94=99=E8=AF=AF?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     lib/utilcode/src/main/AndroidManifest.xml | 9 +++++++++
     1 file changed, 9 insertions(+)
    
    diff --git a/lib/utilcode/src/main/AndroidManifest.xml b/lib/utilcode/src/main/AndroidManifest.xml
    index d45dd5778..ab497595d 100644
    --- a/lib/utilcode/src/main/AndroidManifest.xml
    +++ b/lib/utilcode/src/main/AndroidManifest.xml
    @@ -1,6 +1,15 @@
     
     
    +    
    +        
    +            
    +        
    +        
    +            
    +        
    +    
    +
         
     
             
    Date: Tue, 19 Jul 2022 17:31:46 +0800
    Subject: [PATCH 15/19] =?UTF-8?q?[M]=20AppUtils=E5=A2=9E=E5=8A=A0getAppMin?=
     =?UTF-8?q?SdkVersion,=20getAppTargetSdkVersion=E6=94=AF=E6=8C=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../utilcode/pkg/feature/app/AppActivity.kt   | 108 ++++++++--------
     lib/utilcode/README-CN.md                     |   2 +
     lib/utilcode/README.md                        |   2 +
     .../com/blankj/utilcode/util/AppUtils.java    | 115 ++++++++++++++++--
     .../debug/tool/appInfo/AppInfoItem.java       |  15 ++-
     5 files changed, 173 insertions(+), 69 deletions(-)
    
    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 175fa1bc3..21eb35114 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
    @@ -54,7 +54,10 @@ class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
     
         override fun bindItems(): MutableList> {
             return CollectionUtils.newArrayList(
    -                CommonItemSwitch("registerAppStatusChangedListener", { isRegisterAppStatusChangedListener }, {
    +            CommonItemSwitch(
    +                "registerAppStatusChangedListener",
    +                { isRegisterAppStatusChangedListener },
    +                {
                         isRegisterAppStatusChangedListener = it
                         if (it) {
                             AppUtils.registerAppStatusChangedListener(this)
    @@ -62,55 +65,63 @@ class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
                             AppUtils.unregisterAppStatusChangedListener(this)
                         }
                     }),
    -                CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
    -                CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()),
    -                CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()),
    -                CommonItemTitle("isAppForeground", AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString()),
    -                CommonItemTitle("isAppRunning", AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString()),
    -                CommonItemImage("getAppIcon") {
    -                    it.setImageDrawable(AppUtils.getAppIcon())
    -                },
    -                CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()),
    -                CommonItemTitle("getAppName", AppUtils.getAppName()),
    -                CommonItemTitle("getAppPath", AppUtils.getAppPath()),
    -                CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()),
    -                CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()),
    -                CommonItemTitle("getAppSignaturesSHA1", AppUtils.getAppSignaturesSHA1().toString()),
    -                CommonItemTitle("getAppSignaturesSHA256", AppUtils.getAppSignaturesSHA256().toString()),
    -                CommonItemTitle("getAppSignaturesMD5", AppUtils.getAppSignaturesMD5().toString()),
    -                CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()),
    -                CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()),
    -
    -                CommonItemClick(R.string.app_install) {
    -                    if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
    -                        ToastUtils.showShort(R.string.app_install_tips)
    +            CommonItemTitle("isAppRoot", AppUtils.isAppRoot().toString()),
    +            CommonItemTitle("isAppDebug", AppUtils.isAppDebug().toString()),
    +            CommonItemTitle("isAppSystem", AppUtils.isAppSystem().toString()),
    +            CommonItemTitle(
    +                "isAppForeground",
    +                AppUtils.isAppForeground(AppUtils.getAppPackageName()).toString()
    +            ),
    +            CommonItemTitle(
    +                "isAppRunning",
    +                AppUtils.isAppRunning(AppUtils.getAppPackageName()).toString()
    +            ),
    +            CommonItemImage("getAppIcon") {
    +                it.setImageDrawable(AppUtils.getAppIcon())
    +            },
    +            CommonItemTitle("getAppPackageName", AppUtils.getAppPackageName()),
    +            CommonItemTitle("getAppName", AppUtils.getAppName()),
    +            CommonItemTitle("getAppPath", AppUtils.getAppPath()),
    +            CommonItemTitle("getAppVersionName", AppUtils.getAppVersionName()),
    +            CommonItemTitle("getAppVersionCode", AppUtils.getAppVersionCode().toString()),
    +            CommonItemTitle("getAppMinSdkVersion", AppUtils.getAppMinSdkVersion().toString()),
    +            CommonItemTitle("getAppTargetSdkVersion", AppUtils.getAppTargetSdkVersion().toString()),
    +            CommonItemTitle("getAppSignaturesSHA1", AppUtils.getAppSignaturesSHA1().toString()),
    +            CommonItemTitle("getAppSignaturesSHA256", AppUtils.getAppSignaturesSHA256().toString()),
    +            CommonItemTitle("getAppSignaturesMD5", AppUtils.getAppSignaturesMD5().toString()),
    +            CommonItemTitle("getAppUid", AppUtils.getAppUid().toString()),
    +            CommonItemTitle("getApkInfo", AppUtils.getApkInfo(AppUtils.getAppPath()).toString()),
    +
    +            CommonItemClick(R.string.app_install) {
    +                if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
    +                    ToastUtils.showShort(R.string.app_install_tips)
    +                } else {
    +                    if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
    +                        ReleaseInstallApkTask(listener).execute()
                         } else {
    -                        if (!FileUtils.isFileExists(Config.TEST_APK_PATH)) {
    -                            ReleaseInstallApkTask(listener).execute()
    -                        } else {
    -                            listener.onReleased()
    -                        }
    +                        listener.onReleased()
                         }
    -                },
    -                CommonItemClick(R.string.app_uninstall) {
    -                    if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
    -                        AppUtils.uninstallApp(Config.TEST_PKG)
    -                    } else {
    -                        ToastUtils.showShort(R.string.app_uninstall_tips)
    -                    }
    -                },
    -                CommonItemClick(R.string.app_launch) {
    -                    AppUtils.launchApp(this.packageName)
    -                },
    -                CommonItemClick(R.string.app_relaunch) {
    -                    AppUtils.relaunchApp()
    -                },
    -                CommonItemClick(R.string.app_launch_details_settings, true) {
    -                    AppUtils.launchAppDetailsSettings()
    -                },
    -                CommonItemClick(R.string.app_exit) {
    -                    AppUtils.exitApp()
                     }
    +            },
    +            CommonItemClick(R.string.app_uninstall) {
    +                if (AppUtils.isAppInstalled(Config.TEST_PKG)) {
    +                    AppUtils.uninstallApp(Config.TEST_PKG)
    +                } else {
    +                    ToastUtils.showShort(R.string.app_uninstall_tips)
    +                }
    +            },
    +            CommonItemClick(R.string.app_launch) {
    +                AppUtils.launchApp(this.packageName)
    +            },
    +            CommonItemClick(R.string.app_relaunch) {
    +                AppUtils.relaunchApp()
    +            },
    +            CommonItemClick(R.string.app_launch_details_settings, true) {
    +                AppUtils.launchAppDetailsSettings()
    +            },
    +            CommonItemClick(R.string.app_exit) {
    +                AppUtils.exitApp()
    +            }
             )
         }
     
    @@ -130,7 +141,8 @@ class AppActivity : CommonActivity(), Utils.OnAppStatusChangedListener {
         }
     }
     
    -class ReleaseInstallApkTask(private val mListener: OnReleasedListener) : ThreadUtils.SimpleTask() {
    +class ReleaseInstallApkTask(private val mListener: OnReleasedListener) :
    +    ThreadUtils.SimpleTask() {
     
         override fun doInBackground() {
             ResourceUtils.copyFileFromAssets("test_install", Config.TEST_APK_PATH)
    diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
    index a6ab4b3d0..d8b9591fe 100644
    --- a/lib/utilcode/README-CN.md
    +++ b/lib/utilcode/README-CN.md
    @@ -72,6 +72,8 @@ getAppName                        : 获取 App 名称
     getAppPath                        : 获取 App 路径
     getAppVersionName                 : 获取 App 版本号
     getAppVersionCode                 : 获取 App 版本码
    +getAppMinSdkVersion               : 获取 App 支持最低系统版本号
    +getAppTargetSdkVersion            : 获取 App 目标系统版本号
     getAppSignatures                  : 获取 App 签名
     getAppSignaturesSHA1              : 获取应用签名的的 SHA1 值
     getAppSignaturesSHA256            : 获取应用签名的的 SHA256 值
    diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
    index 9d2025ebb..b88bcbcfb 100644
    --- a/lib/utilcode/README.md
    +++ b/lib/utilcode/README.md
    @@ -72,6 +72,8 @@ getAppName
     getAppPath
     getAppVersionName
     getAppVersionCode
    +getAppMinSdkVersion
    +getAppTargetSdkVersion
     getAppSignatures
     getAppSignaturesSHA1
     getAppSignaturesSHA256
    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 8f03e1cf1..3a07653fb 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
    @@ -14,13 +14,13 @@
     import android.os.Build;
     import android.util.Log;
     
    +import androidx.annotation.NonNull;
    +import androidx.annotation.Nullable;
    +
     import java.io.File;
     import java.util.ArrayList;
     import java.util.List;
     
    -import androidx.annotation.NonNull;
    -import androidx.annotation.Nullable;
    -
     /**
      * 
      *     author: Blankj
    @@ -541,6 +541,65 @@ public static int getAppVersionCode(final String packageName) {
             }
         }
     
    +    /**
    +     * Return the application's minimum sdk version code.
    +     *
    +     * @return the application's minimum sdk version code
    +     */
    +    public static int getAppMinSdkVersion() {
    +        return getAppMinSdkVersion(Utils.getApp().getPackageName());
    +    }
    +
    +    /**
    +     * Return the application's minimum sdk version code.
    +     *
    +     * @param packageName The name of the package.
    +     * @return the application's minimum sdk version code
    +     */
    +    public static int getAppMinSdkVersion(final String packageName) {
    +        if (UtilsBridge.isSpace(packageName)) return -1;
    +        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) return -1;
    +        try {
    +            PackageManager pm = Utils.getApp().getPackageManager();
    +            PackageInfo pi = pm.getPackageInfo(packageName, 0);
    +            if (null == pi) return -1;
    +            ApplicationInfo ai = pi.applicationInfo;
    +            return null == ai ? -1 : ai.minSdkVersion;
    +        } catch (PackageManager.NameNotFoundException e) {
    +            e.printStackTrace();
    +            return -1;
    +        }
    +    }
    +
    +    /**
    +     * Return the application's target sdk version code.
    +     *
    +     * @return the application's target sdk version code
    +     */
    +    public static int getAppTargetSdkVersion() {
    +        return getAppTargetSdkVersion(Utils.getApp().getPackageName());
    +    }
    +
    +    /**
    +     * Return the application's target sdk version code.
    +     *
    +     * @param packageName The name of the package.
    +     * @return the application's target sdk version code
    +     */
    +    public static int getAppTargetSdkVersion(final String packageName) {
    +        if (UtilsBridge.isSpace(packageName)) return -1;
    +        try {
    +            PackageManager pm = Utils.getApp().getPackageManager();
    +            PackageInfo pi = pm.getPackageInfo(packageName, 0);
    +            if (null == pi) return -1;
    +            ApplicationInfo ai = pi.applicationInfo;
    +            return null == ai ? -1 : ai.targetSdkVersion;
    +        } catch (PackageManager.NameNotFoundException e) {
    +            e.printStackTrace();
    +            return -1;
    +        }
    +    }
    +
         /**
          * Return the application's signature.
          *
    @@ -721,6 +780,8 @@ private static List getAppSignaturesHash(final String packageName, final
          * 
  • path of package
  • *
  • version name
  • *
  • version code
  • + *
  • minimum sdk version code
  • + *
  • target sdk version code
  • *
  • is system
  • * * @@ -740,6 +801,8 @@ public static AppInfo getAppInfo() { *
  • path of package
  • *
  • version name
  • *
  • version code
  • + *
  • minimum sdk version code
  • + *
  • target sdk version code
  • *
  • is system
  • * * @@ -829,13 +892,18 @@ private static AppInfo getBean(final PackageManager pm, final PackageInfo pi) { String packageName = pi.packageName; ApplicationInfo ai = pi.applicationInfo; if (ai == null) { - return new AppInfo(packageName, "", null, "", versionName, versionCode, false); + return new AppInfo(packageName, "", null, "", versionName, versionCode, -1, -1, false); } String name = ai.loadLabel(pm).toString(); Drawable icon = ai.loadIcon(pm); String packagePath = ai.sourceDir; + int minSdkVersion = -1; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + minSdkVersion = ai.minSdkVersion; + } + int targetSdkVersion = ai.targetSdkVersion; boolean isSystem = (ApplicationInfo.FLAG_SYSTEM & ai.flags) != 0; - return new AppInfo(packageName, name, icon, packagePath, versionName, versionCode, isSystem); + return new AppInfo(packageName, name, icon, packagePath, versionName, versionCode, minSdkVersion, targetSdkVersion, isSystem); } /** @@ -843,13 +911,15 @@ private static AppInfo getBean(final PackageManager pm, final PackageInfo pi) { */ public static class AppInfo { - private String packageName; - private String name; + private String packageName; + private String name; private Drawable icon; - private String packagePath; - private String versionName; - private int versionCode; - private boolean isSystem; + private String packagePath; + private String versionName; + private int versionCode; + private int minSdkVersion; + private int targetSdkVersion; + private boolean isSystem; public Drawable getIcon() { return icon; @@ -907,14 +977,31 @@ public void setVersionName(final String versionName) { this.versionName = versionName; } - public AppInfo(String packageName, String name, Drawable icon, String packagePath, - String versionName, int versionCode, boolean isSystem) { + public int getMinSdkVersion() { + return minSdkVersion; + } + + public void setMinSdkVersion(int minSdkVersion) { + this.minSdkVersion = minSdkVersion; + } + + public int getTargetSdkVersion() { + return targetSdkVersion; + } + + public void setTargetSdkVersion(int targetSdkVersion) { + this.targetSdkVersion = targetSdkVersion; + } + + public AppInfo(String packageName, String name, Drawable icon, String packagePath, String versionName, int versionCode, int minSdkVersion, int targetSdkVersion, boolean isSystem) { this.setName(name); this.setIcon(icon); this.setPackageName(packageName); this.setPackagePath(packagePath); this.setVersionName(versionName); this.setVersionCode(versionCode); + this.setMinSdkVersion(minSdkVersion); + this.setTargetSdkVersion(targetSdkVersion); this.setSystem(isSystem); } @@ -928,6 +1015,8 @@ public String toString() { "\n app path: " + getPackagePath() + "\n app v name: " + getVersionName() + "\n app v code: " + getVersionCode() + + "\n app v min: " + getMinSdkVersion() + + "\n app v target: " + getTargetSdkVersion() + "\n is system: " + isSystem() + "\n}"; } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java index 76351e4b1..54895ee71 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java @@ -5,10 +5,12 @@ import android.view.View.OnClickListener; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; + import com.blankj.utilcode.util.AppUtils; import com.blankj.utilcode.util.ClickUtils; import com.blankj.utilcode.util.StringUtils; -import com.blankj.utildebug.DebugUtils; import com.blankj.utildebug.R; import com.blankj.utildebug.base.rv.BaseItem; import com.blankj.utildebug.base.rv.ItemViewHolder; @@ -16,9 +18,6 @@ import java.util.ArrayList; import java.util.List; -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; - /** *
      *     author: blankj
    @@ -29,8 +28,8 @@
      */
     public class AppInfoItem extends BaseItem {
     
    -    private String          mTitle;
    -    private String          mContent;
    +    private String mTitle;
    +    private String mContent;
         private OnClickListener mListener;
     
         private TextView titleTv;
    @@ -71,9 +70,9 @@ public static List getAppInfoItems() {
             appInfoItems.add(new AppInfoItem(R.string.du_app_info_version_name, AppUtils.getAppVersionName()));
             appInfoItems.add(new AppInfoItem(R.string.du_app_info_version_code, String.valueOf(AppUtils.getAppVersionCode())));
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    -            appInfoItems.add(new AppInfoItem(R.string.du_app_info_min_sdk_version, String.valueOf(DebugUtils.getApp().getApplicationInfo().minSdkVersion)));
    +            appInfoItems.add(new AppInfoItem(R.string.du_app_info_min_sdk_version, String.valueOf(AppUtils.getAppMinSdkVersion())));
             }
    -        appInfoItems.add(new AppInfoItem(R.string.du_app_info_target_sdk_version, String.valueOf(DebugUtils.getApp().getApplicationInfo().targetSdkVersion)));
    +        appInfoItems.add(new AppInfoItem(R.string.du_app_info_target_sdk_version, String.valueOf(AppUtils.getAppTargetSdkVersion())));
             appInfoItems.add(new AppInfoItem(R.string.du_app_info_open_app_info_page, "", new OnClickListener() {
                 @Override
                 public void onClick(View v) {
    
    From 5f739314d9eadeb5cad7f0e6876d2606480fc1f5 Mon Sep 17 00:00:00 2001
    From: Blankj 
    Date: Sat, 15 Oct 2022 00:45:11 +0800
    Subject: [PATCH 16/19] fix: some bugs
    
    ---
     CHANGELOG.md                                  |  1 +
     buildSrc/src/main/groovy/Config.groovy        |  6 +--
     lib/utilcode/README-CN.md                     | 11 +++--
     lib/utilcode/README.md                        |  3 +-
     .../blankj/utilcode/util/ActivityUtils.java   |  9 ++--
     .../com/blankj/utilcode/util/BarUtils.java    |  4 +-
     .../com/blankj/utilcode/util/DeviceUtils.java | 46 +++++++++++++++++--
     module_config.json                            |  2 +-
     8 files changed, 63 insertions(+), 19 deletions(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index c4bcc19c8..73e8145bf 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -1,3 +1,4 @@
    +* `22/10/15` [add] Fix some issue. Publish v1.31.1
     * `21/12/06` [add] Publish v1.31.0
     * `21/05/13` [add] Support publish mavenCentral.
     * `21/02/22` [add] Fix ToastUtils rtl bug. Publish v1.30.6.
    diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
    index 268ec666c..9a8d69d65 100644
    --- a/buildSrc/src/main/groovy/Config.groovy
    +++ b/buildSrc/src/main/groovy/Config.groovy
    @@ -6,8 +6,8 @@ class Config {
         static compileSdkVersion = 29
         static minSdkVersion = 14
         static targetSdkVersion = 29
    -    static versionCode = 1_030_007
    -    static versionName = '1.31.0'// E.g. 1.9.72 => 1,009,072
    +    static versionCode = 1_031_001
    +    static versionName = '1.31.1'// E.g. 1.9.72 => 1,009,072
     
         // lib version
         static gradlePluginVersion = '4.1.0'
    @@ -34,7 +34,7 @@ class Config {
                 lib_base                   : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/base"),
                 lib_common                 : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/common"),
                 lib_subutil                : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/subutil"),
    -            lib_utilcode               : new ModuleConfig(isApply: true , useLocal: false, localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"),
    +            lib_utilcode               : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"),
                 lib_utildebug              : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug"),
                 lib_utildebug_no_op        : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug-no-op"),
                 /*Don't delete this line*/
    diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
    index d8b9591fe..6610b3be9 100644
    --- a/lib/utilcode/README-CN.md
    +++ b/lib/utilcode/README-CN.md
    @@ -3,7 +3,7 @@
     Gradle:
     ```groovy
     // if u use AndroidX, use the following
    -implementation 'com.blankj:utilcodex:1.31.0'
    +implementation 'com.blankj:utilcodex:1.31.1'
     
     // Not in maintenance
     implementation 'com.blankj:utilcode:1.30.7'
    @@ -1210,10 +1210,11 @@ removeListener: 移除消息监听器
     
     * ### URI 相关 -> [UriUtils.java][uri.java]
     ```
    -res2Uri  : res 转 uri
    -file2Uri : file 转 uri
    -uri2File : uri 转 file
    -uri2Bytes: uri 转 bytes
    +res2Uri            : res 转 uri
    +file2Uri           : file 转 uri
    +uri2File           : uri 转 file
    +uri2FileNoCacheCopy: uri 转 file 不拷贝缓存
    +uri2Bytes          : uri 转 bytes
     ```
     
     * ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
    diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
    index b88bcbcfb..570f58fc4 100644
    --- a/lib/utilcode/README.md
    +++ b/lib/utilcode/README.md
    @@ -3,7 +3,7 @@
     Gradle:
     ```groovy
     // if u use AndroidX, use the following
    -implementation 'com.blankj:utilcodex:1.31.0'
    +implementation 'com.blankj:utilcodex:1.31.1'
     
     // Not in maintenance
     implementation 'com.blankj:utilcode:1.30.6'
    @@ -1212,6 +1212,7 @@ removeListener
     res2Uri
     file2Uri
     uri2File
    +uri2FileNoCacheCopy
     uri2Bytes
     ```
     
    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 10858f75f..056668652 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
    @@ -2013,10 +2013,11 @@ private static boolean startActivity(final Intent intent,
         }
     
         private static boolean isIntentAvailable(final Intent intent) {
    -        return Utils.getApp()
    -                .getPackageManager()
    -                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    -                .size() > 0;
    +//        return Utils.getApp()
    +//                .getPackageManager()
    +//                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    +//                .size() > 0;
    +        return true;
         }
     
         private static boolean startActivityForResult(final Activity activity,
    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 ece4f7fab..e8cacc5f0 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
    @@ -57,7 +57,7 @@ private BarUtils() {
          * @return the status bar's height
          */
         public static int getStatusBarHeight() {
    -        Resources resources = Utils.getApp().getResources();
    +        Resources resources = Resources.getSystem();
             int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
             return resources.getDimensionPixelSize(resourceId);
         }
    @@ -483,7 +483,7 @@ private static void invokePanels(final String methodName) {
          * @return the navigation bar's height
          */
         public static int getNavBarHeight() {
    -        Resources res = Utils.getApp().getResources();
    +        Resources res = Resources.getSystem();
             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/DeviceUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
    index e6feb5fda..9cd01108e 100644
    --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
    +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
    @@ -13,16 +13,19 @@
     import android.telephony.TelephonyManager;
     import android.text.TextUtils;
     
    -import androidx.annotation.RequiresApi;
    -import androidx.annotation.RequiresPermission;
    -
    +import java.io.BufferedReader;
     import java.io.File;
    +import java.io.IOException;
    +import java.io.InputStreamReader;
     import java.net.InetAddress;
     import java.net.NetworkInterface;
     import java.net.SocketException;
     import java.util.Enumeration;
     import java.util.UUID;
     
    +import androidx.annotation.RequiresApi;
    +import androidx.annotation.RequiresPermission;
    +
     import static android.Manifest.permission.ACCESS_WIFI_STATE;
     import static android.Manifest.permission.CHANGE_WIFI_STATE;
     import static android.Manifest.permission.INTERNET;
    @@ -382,6 +385,7 @@ public static boolean isEmulator() {
             intent.setAction(Intent.ACTION_DIAL);
             boolean checkDial = intent.resolveActivity(Utils.getApp().getPackageManager()) == null;
             if (checkDial) return true;
    +        if (isEmulatorByCpu()) return true;
     
     //        boolean checkDebuggerConnected = Debug.isDebuggerConnected();
     //        if (checkDebuggerConnected) return true;
    @@ -389,6 +393,42 @@ public static boolean isEmulator() {
             return false;
         }
     
    +    /**
    +     * Returns whether is emulator by check cpu info.
    +     * by function of {@link #readCpuInfo}, obtain the device cpu information.
    +     * then compare whether it is intel or amd (because intel and amd are generally not mobile phone cpu), to determine whether it is a real mobile phone
    +     *
    +     * @return {@code true}: yes
    {@code false}: no + */ + private static boolean isEmulatorByCpu() { + String cpuInfo = readCpuInfo(); + return cpuInfo.contains("intel") || cpuInfo.contains("amd"); + } + + /** + * Return Cpu information + * + * @return Cpu info + */ + private static String readCpuInfo() { + String result = ""; + try { + String[] args = {"/system/bin/cat", "/proc/cpuinfo"}; + ProcessBuilder cmd = new ProcessBuilder(args); + Process process = cmd.start(); + StringBuilder sb = new StringBuilder(); + String readLine; + BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8")); + while ((readLine = responseReader.readLine()) != null) { + sb.append(readLine); + } + responseReader.close(); + result = sb.toString().toLowerCase(); + } catch (IOException ignored) { + } + return result; + } + /** * Whether user has enabled development settings. * diff --git a/module_config.json b/module_config.json index 18f416382..87233122b 100644 --- a/module_config.json +++ b/module_config.json @@ -23,7 +23,7 @@ {"name": "lib_base", "isApply": true, "useLocal": true, "localPath": "./lib/base"}, {"name": "lib_common", "isApply": true, "useLocal": true, "localPath": "./lib/common"}, {"name": "lib_subutil", "isApply": true, "useLocal": true, "localPath": "./lib/subutil"}, - {"name": "lib_utilcode", "isApply": true, "useLocal": false, "localPath": "./lib/utilcode", "remotePath": "com.blankj:utilcodex:$Config.versionName"}, + {"name": "lib_utilcode", "isApply": true, "useLocal": true, "localPath": "./lib/utilcode", "remotePath": "com.blankj:utilcodex:$Config.versionName"}, {"name": "lib_utildebug", "isApply": true, "useLocal": true, "localPath": "./lib/utildebug"}, {"name": "lib_utildebug_no_op", "isApply": true, "useLocal": true, "localPath": "./lib/utildebug-no-op"} ] From 99be3102e1b5dce8bf051721008811eed3dae0a0 Mon Sep 17 00:00:00 2001 From: taochen <935612713@qq.com> Date: Fri, 21 Oct 2022 15:42:20 +0800 Subject: [PATCH 17/19] =?UTF-8?q?[F]=20=E9=83=A8=E5=88=86=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=B8=82=E5=9C=BA=E4=BB=A5=E6=89=80=E8=B0=93ActivityU?= =?UTF-8?q?tils=E9=9A=90=E7=A7=81=E5=90=88=E8=A7=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E5=BA=94=E7=94=A8=E4=B8=8A=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blankj/utilcode/util/ActivityUtils.java | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java index 056668652..d49ce6ff0 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 @@ -1997,29 +1997,22 @@ private static void startActivity(final Context context, private static boolean startActivity(final Intent intent, final Context context, final Bundle options) { - if (!isIntentAvailable(intent)) { - Log.e("ActivityUtils", "intent is unavailable"); - return false; - } if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } - if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - context.startActivity(intent, options); - } else { - context.startActivity(intent); + try { + if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + context.startActivity(intent, options); + } else { + context.startActivity(intent); + } + } catch (Exception e) { + Log.e("ActivityUtils", "An exception occurred in startActivity, error message: " + e.getLocalizedMessage()); + return false; } return true; } - private static boolean isIntentAvailable(final Intent intent) { -// return Utils.getApp() -// .getPackageManager() -// .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) -// .size() > 0; - return true; - } - private static boolean startActivityForResult(final Activity activity, final Bundle extras, final String pkg, @@ -2036,15 +2029,16 @@ private static boolean startActivityForResult(final Intent intent, final Activity activity, final int requestCode, @Nullable final Bundle options) { - if (!isIntentAvailable(intent)) { - Log.e("ActivityUtils", "intent is unavailable"); + try { + if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + activity.startActivityForResult(intent, requestCode, options); + } else { + activity.startActivityForResult(intent, requestCode); + } + } catch (Exception e) { + Log.e("ActivityUtils", "An exception occurred in startActivityForResult, error message: " + e.getLocalizedMessage()); return false; } - if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - activity.startActivityForResult(intent, requestCode, options); - } else { - activity.startActivityForResult(intent, requestCode); - } return true; } @@ -2079,18 +2073,19 @@ private static boolean startActivityForResult(final Intent intent, final Fragment fragment, final int requestCode, @Nullable final Bundle options) { - if (!isIntentAvailable(intent)) { - Log.e("ActivityUtils", "intent is unavailable"); - return false; - } if (fragment.getActivity() == null) { Log.e("ActivityUtils", "Fragment " + fragment + " not attached to Activity"); return false; } - if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - fragment.startActivityForResult(intent, requestCode, options); - } else { - fragment.startActivityForResult(intent, requestCode); + try { + if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + fragment.startActivityForResult(intent, requestCode, options); + } else { + fragment.startActivityForResult(intent, requestCode); + } + } catch (Exception e) { + Log.e("ActivityUtils", "An exception occurred in fragment.startActivityForResult, error message: " + e.getLocalizedMessage()); + return false; } return true; } From 19349b9998224f04385c37f643fc96e69faf33bd Mon Sep 17 00:00:00 2001 From: simple <383559698@qq.com> Date: Wed, 24 Apr 2024 19:22:35 +0800 Subject: [PATCH 18/19] update VibrateUtils --- buildSrc/src/main/groovy/Config.groovy | 2 +- .../pkg/feature/vibrate/VibrateActivity.kt | 22 +++++- .../pkg/src/main/res/values/strings.xml | 1 + .../blankj/utilcode/util/VibrateUtils.java | 79 +++++++++++++++++++ 4 files changed, 101 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index a69b8907c..9a8d69d65 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -34,7 +34,7 @@ class Config { lib_base : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/base"), lib_common : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/common"), lib_subutil : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/subutil"), - lib_utilcode : new ModuleConfig(isApply: true , useLocal: false, localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"), + lib_utilcode : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utilcode", remotePath: "com.blankj:utilcodex:$Config.versionName"), lib_utildebug : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug"), lib_utildebug_no_op : new ModuleConfig(isApply: true , useLocal: true , localPath: "./lib/utildebug-no-op"), /*Don't delete this line*/ diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt index d2cd9bc14..ee88dab0f 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt @@ -32,11 +32,22 @@ class VibrateActivity : CommonActivity() { override fun bindItems(): MutableList> { return CollectionUtils.newArrayList( - CommonItemClick(R.string.vibrate_1000ms) { VibrateUtils.vibrate(1000) }, + CommonItemClick(R.string.vibrate_1000ms) { + VibrateUtils.vibrate(1000) + }, CommonItemClick(R.string.vibrate_custom) { VibrateUtils.vibrate(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1) }, - CommonItemClick(R.string.vibrate_cancel) { VibrateUtils.cancel() } + CommonItemClick(R.string.vibrate_background) { + backHome() + mContentView.postDelayed({ + VibrateUtils.vibrateCompat(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1) +// VibrateUtils.vibrateCompat(1000) + }, 1000) + }, + CommonItemClick(R.string.vibrate_cancel) { + VibrateUtils.cancel() + } ) } @@ -44,4 +55,11 @@ class VibrateActivity : CommonActivity() { super.onDestroy() VibrateUtils.cancel() } + + private fun backHome() { + val intent = Intent(Intent.ACTION_MAIN).apply { + addCategory(Intent.CATEGORY_HOME) + } + startActivity(intent) + } } diff --git a/feature/utilcode/pkg/src/main/res/values/strings.xml b/feature/utilcode/pkg/src/main/res/values/strings.xml index ccec69864..551f9adba 100644 --- a/feature/utilcode/pkg/src/main/res/values/strings.xml +++ b/feature/utilcode/pkg/src/main/res/values/strings.xml @@ -366,5 +366,6 @@ Vibrate 1000ms Vibrate Custom + Vibrate Background Cancel diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java index 622d65781..8d2ab055e 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java @@ -1,7 +1,11 @@ package com.blankj.utilcode.util; import android.content.Context; +import android.media.AudioAttributes; +import android.os.Build; import android.os.Vibrator; + +import androidx.annotation.RequiresApi; import androidx.annotation.RequiresPermission; import static android.Manifest.permission.VIBRATE; @@ -35,6 +39,39 @@ public static void vibrate(final long milliseconds) { vibrator.vibrate(milliseconds); } + /** + * Vibrate. + *

    Must hold {@code }

    + * + * @param milliseconds The number of milliseconds to vibrate. + * @param attributes {@link AudioAttributes} corresponding to the vibration. For example, + * specify {@link AudioAttributes#USAGE_ALARM} for alarm vibrations or + * {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE} for + * vibrations associated with incoming calls. + */ + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @RequiresPermission(VIBRATE) + public static void vibrate(final long milliseconds, AudioAttributes attributes) { + Vibrator vibrator = getVibrator(); + if (vibrator == null) return; + vibrator.vibrate(milliseconds, attributes); + } + + /** + * VibrateCompat + *

    Must hold {@code }

    + * + * @param milliseconds he number of milliseconds to vibrate. + */ + @RequiresPermission(VIBRATE) + public static void vibrateCompat(final long milliseconds) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + vibrate(milliseconds, getAudioAttributes()); + } else { + vibrate(milliseconds); + } + } + /** * Vibrate. *

    Must hold {@code }

    @@ -49,6 +86,41 @@ public static void vibrate(final long[] pattern, final int repeat) { vibrator.vibrate(pattern, repeat); } + /** + * Vibrate. + *

    Must hold {@code }

    + * + * @param pattern An array of longs of times for which to turn the vibrator on or off. + * @param repeat The index into pattern at which to repeat, or -1 if you don't want to repeat. + * @param attributes {@link AudioAttributes} corresponding to the vibration. For example, + * specify {@link AudioAttributes#USAGE_ALARM} for alarm vibrations or + * {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE} for + * vibrations associated with incoming calls. + */ + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @RequiresPermission(VIBRATE) + public static void vibrate(final long[] pattern, final int repeat, AudioAttributes attributes) { + Vibrator vibrator = getVibrator(); + if (vibrator == null) return; + vibrator.vibrate(pattern, repeat, attributes); + } + + /** + * VibrateCompat + *

    Must hold {@code }

    + * + * @param pattern An array of longs of times for which to turn the vibrator on or off. + * @param repeat The index into pattern at which to repeat, or -1 if you don't want to repeat. + */ + @RequiresPermission(VIBRATE) + public static void vibrateCompat(final long[] pattern, final int repeat) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + vibrate(pattern, repeat, getAudioAttributes()); + } else { + vibrate(pattern, repeat); + } + } + /** * Cancel vibrate. *

    Must hold {@code }

    @@ -66,4 +138,11 @@ private static Vibrator getVibrator() { } return vibrator; } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private static AudioAttributes getAudioAttributes() { + return new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .build(); + } } From c7ebceb6675670080389472445d0bcb3c71f8bc9 Mon Sep 17 00:00:00 2001 From: simple <383559698@qq.com> Date: Thu, 25 Apr 2024 10:36:38 +0800 Subject: [PATCH 19/19] add VibrateUtils comment --- .../blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt | 1 + .../src/main/java/com/blankj/utilcode/util/VibrateUtils.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt index ee88dab0f..5dc337bc5 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt @@ -41,6 +41,7 @@ class VibrateActivity : CommonActivity() { CommonItemClick(R.string.vibrate_background) { backHome() mContentView.postDelayed({ +// VibrateUtils.vibrate(1000) -- can not vibrate in background VibrateUtils.vibrateCompat(longArrayOf(0, 1000, 1000, 2000, 2000, 1000), 1) // VibrateUtils.vibrateCompat(1000) }, 1000) diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java index 8d2ab055e..164810381 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java @@ -58,7 +58,7 @@ public static void vibrate(final long milliseconds, AudioAttributes attributes) } /** - * VibrateCompat + * VibrateCompat - Can vibrate in background *

    Must hold {@code }

    * * @param milliseconds he number of milliseconds to vibrate. @@ -106,7 +106,7 @@ public static void vibrate(final long[] pattern, final int repeat, AudioAttribut } /** - * VibrateCompat + * VibrateCompat - Can vibrate in background *

    Must hold {@code }

    * * @param pattern An array of longs of times for which to turn the vibrator on or off.