diff --git a/qmui/src/main/java/com/qmuiteam/qmui/util/OnceReadValue.java b/qmui/src/main/java/com/qmuiteam/qmui/util/OnceReadValue.java
new file mode 100644
index 00000000..b844b949
--- /dev/null
+++ b/qmui/src/main/java/com/qmuiteam/qmui/util/OnceReadValue.java
@@ -0,0 +1,17 @@
+package com.qmuiteam.qmui.util;
+
+public abstract class OnceReadValue
{
+
+ private boolean isRead = false;
+ private T cacheValue;
+
+ public T get(P param){
+ if(!isRead){
+ isRead = true;
+ cacheValue = read(param);
+ }
+ return cacheValue;
+ }
+
+ protected abstract T read(P param);
+}
diff --git a/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIDeviceHelper.java b/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIDeviceHelper.java
index a5c9816c..327c7140 100644
--- a/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIDeviceHelper.java
+++ b/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIDeviceHelper.java
@@ -57,7 +57,6 @@ public class QMUIDeviceHelper {
private final static String FLYME = "flyme";
private final static String ZTEC2016 = "zte c2016";
private final static String ZUKZ1 = "zuk z1";
- private final static String ESSENTIAL = "essential";
private final static String MEIZUBOARD[] = {"m9", "M9", "mx", "MX"};
private final static String POWER_PROFILE_CLASS = "com.android.internal.os.PowerProfile";
private final static String CPU_FILE_PATH_0 = "/sys/devices/system/cpu/";
@@ -81,9 +80,13 @@ public class QMUIDeviceHelper {
private static long sExtraStorageSize = -1;
private static double sBatteryCapacity = -1;
private static int sCpuCoreCount = -1;
+ private static boolean isInfoReaded = false;
-
- static {
+ private static void checkReadInfo(){
+ if(isInfoReaded){
+ return;
+ }
+ isInfoReaded = true;
Properties properties = new Properties();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
@@ -132,34 +135,47 @@ public class QMUIDeviceHelper {
/**
* 判断是否是flyme系统
*/
+ private static OnceReadValue isFlymeValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ checkReadInfo();
+ return !TextUtils.isEmpty(sFlymeVersionName) && sFlymeVersionName.contains(FLYME);
+ }
+ };
public static boolean isFlyme() {
- return !TextUtils.isEmpty(sFlymeVersionName) && sFlymeVersionName.contains(FLYME);
+ return isFlymeValue.get(null);
}
/**
* 判断是否是MIUI系统
*/
public static boolean isMIUI() {
+ checkReadInfo();
return !TextUtils.isEmpty(sMiuiVersionName);
}
public static boolean isMIUIV5() {
+ checkReadInfo();
return "v5".equals(sMiuiVersionName);
}
public static boolean isMIUIV6() {
+ checkReadInfo();
return "v6".equals(sMiuiVersionName);
}
public static boolean isMIUIV7() {
+ checkReadInfo();
return "v7".equals(sMiuiVersionName);
}
public static boolean isMIUIV8() {
+ checkReadInfo();
return "v8".equals(sMiuiVersionName);
}
public static boolean isMIUIV9() {
+ checkReadInfo();
return "v9".equals(sMiuiVersionName);
}
@@ -168,6 +184,7 @@ public class QMUIDeviceHelper {
}
public static boolean isFlymeLowerThan(int majorVersion, int minorVersion, int patchVersion) {
+ checkReadInfo();
boolean isLower = false;
if (sFlymeVersionName != null && !sFlymeVersionName.equals("")) {
try {
@@ -204,53 +221,109 @@ public class QMUIDeviceHelper {
}
+ private static OnceReadValue isMeizuValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ checkReadInfo();
+ return isPhone(MEIZUBOARD) || isFlyme();
+ }
+ };
public static boolean isMeizu() {
- return isPhone(MEIZUBOARD) || isFlyme();
+ return isMeizuValue.get(null);
}
/**
* 判断是否为小米
* https://dev.mi.com/doc/?p=254
*/
+ private static OnceReadValue isXiaomiValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ return Build.MANUFACTURER.toLowerCase().equals("xiaomi");
+ }
+ };
public static boolean isXiaomi() {
- return Build.MANUFACTURER.toLowerCase().equals("xiaomi");
+ return isXiaomiValue.get(null);
}
+ private static OnceReadValue isVivoValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ return BRAND.contains("vivo") || BRAND.contains("bbk");
+ }
+ };
public static boolean isVivo() {
- return BRAND.contains("vivo") || BRAND.contains("bbk");
+ return isVivoValue.get(null);
}
+ private static OnceReadValue isOppoValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ return BRAND.contains("oppo");
+ }
+ };
public static boolean isOppo() {
- return BRAND.contains("oppo");
+ return isOppoValue.get(null);
}
+ private static OnceReadValue isHuaweiValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ return BRAND.contains("huawei") || BRAND.contains("honor");
+ }
+ };
public static boolean isHuawei() {
- return BRAND.contains("huawei") || BRAND.contains("honor");
+ return isHuaweiValue.get(null);
}
+ private static OnceReadValue isEssentialPhoneValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ return BRAND.contains("essential");
+ }
+ };
public static boolean isEssentialPhone() {
- return BRAND.contains("essential");
+ return isEssentialPhoneValue.get(null);
}
+ private static OnceReadValue isMiuiFullDisplayValue = new OnceReadValue() {
+ @Override
+ protected Boolean read(Context param) {
+ return isMIUI() && Settings.Global.getInt(param.getContentResolver(), "force_fsg_nav_bar", 0) != 0;
+ }
+ };
public static boolean isMiuiFullDisplay(Context context){
- return isMIUI() && Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) != 0;
+ return isMiuiFullDisplayValue.get(context);
}
/**
* 判断是否为 ZUK Z1 和 ZTK C2016。
* 两台设备的系统虽然为 android 6.0,但不支持状态栏icon颜色改变,因此经常需要对它们进行额外判断。
*/
+ private static OnceReadValue isZUKZ1Value = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ final String board = android.os.Build.MODEL;
+ return board != null && board.toLowerCase().contains(ZUKZ1);
+ }
+ };
public static boolean isZUKZ1() {
- final String board = android.os.Build.MODEL;
- return board != null && board.toLowerCase().contains(ZUKZ1);
+ return isZUKZ1Value.get(null);
}
+ private static OnceReadValue isZTKC2016Value = new OnceReadValue() {
+ @Override
+ protected Boolean read(Void param) {
+ final String board = android.os.Build.MODEL;
+ return board != null && board.toLowerCase().contains(ZTEC2016);
+ }
+ };
public static boolean isZTKC2016() {
- final String board = android.os.Build.MODEL;
- return board != null && board.toLowerCase().contains(ZTEC2016);
+ return isZTKC2016Value.get(null);
}
private static boolean isPhone(String[] boards) {
+ checkReadInfo();
final String board = android.os.Build.BOARD;
if (board == null) {
return false;
diff --git a/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIStatusBarHelper.java b/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIStatusBarHelper.java
index e149b733..ffddc3bf 100644
--- a/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIStatusBarHelper.java
+++ b/qmui/src/main/java/com/qmuiteam/qmui/util/QMUIStatusBarHelper.java
@@ -90,12 +90,13 @@ public class QMUIStatusBarHelper {
handleDisplayCutoutMode(window);
}
- // 小米和魅族4.4 以上版本支持沉浸式
- // 小米 Android 6.0 ,开发版 7.7.13 及以后版本设置黑色字体又需要 clear FLAG_TRANSLUCENT_STATUS, 因此还原为官方模式
- if (QMUIDeviceHelper.isFlymeLowerThan(8) || (QMUIDeviceHelper.isMIUI() && Build.VERSION.SDK_INT < Build.VERSION_CODES.M)) {
- window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
- WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- return;
+ if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
+ // 小米 Android 6.0 ,开发版 7.7.13 及以后版本设置黑色字体又需要 clear FLAG_TRANSLUCENT_STATUS, 因此还原为官方模式
+ if (QMUIDeviceHelper.isFlymeLowerThan(8) || (QMUIDeviceHelper.isMIUI() && Build.VERSION.SDK_INT < Build.VERSION_CODES.M)) {
+ window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
+ WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ return;
+ }
}
int systemUiVisibility = window.getDecorView().getSystemUiVisibility();