提交 bfc0a678 编写于 作者: B Blankj

see 08/25 log

上级 c80cdc9c
* `19/08/25` [upd] ImageUtils#getImageType. [add] LogUtils# Publish v1.25.9.
* `19/08/24` [fix] PhoneUtils#getIMEI crash on SDK 29.
* `19/08/23` [add] ViewUtils#isLayoutRtl.
* `19/08/22` [add] LogUtils#getLogFiles.
* `19/08/13` [add] MapUtils and MapUtilsTest. Publish v1.25.8.
* `19/08/12` [add] CollectionUtils and CollectionUtilsTest.
* `19/08/11` [add] ArrayUtils and ArrayUtilsTest.
......
......@@ -51,7 +51,7 @@
[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame_cn.png
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.8-brightgreen.svg
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.9-brightgreen.svg
[auc]: https://github.com/Blankj/AndroidUtilCode
[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
......
......@@ -51,7 +51,7 @@ If this project helps you a lot and you want to support the project's developmen
[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.8-brightgreen.svg
[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.9-brightgreen.svg
[auc]: https://github.com/Blankj/AndroidUtilCode
[apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
......
......@@ -14,8 +14,8 @@ class Config {
static compileSdkVersion = 28
static minSdkVersion = 14
static targetSdkVersion = 28
static versionCode = 1_025_008
static versionName = '1.25.8-alpha1'// E.g. 1.9.72 => 1,009,072
static versionCode = 1_025_009
static versionName = '1.25.9'// E.g. 1.9.72 => 1,009,072
// lib version
static kotlin_version = '1.3.10'
......
package PACKAGE_NAME;
/**
* <pre>
* author: blankj
* blog : http://blankj.com
* time : 2019/08/16
* desc :
* </pre>
*/
public class GitUtils {
}
......@@ -16,6 +16,7 @@
org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:-UseGCOverheadLimit -Dfile.encoding=UTF-8
org.gradle.daemon=true
#org.gradle.configureondemand=true
#org.gradle.parallel=true
org.gradle.parallel=true
org.gradle.caching=true
#-Dorg.gradle.debug=true --no-daemon
\ No newline at end of file
......@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.25.8'
implementation 'com.blankj:utilcode:1.25.9'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.25.8'
implementation 'com.blankj:utilcodex:1.25.9'
```
......@@ -1069,6 +1069,15 @@ vibrate: 震动
cancel : 取消
```
* ### 视图相关 -> [ViewUtils.java][view.java]
```
setViewEnabled : 设置视图是否可用
runOnUiThread : 在 UI 线程运行
runOnUiThreadDelayed: 在 UI 线程延迟运行
isLayoutRtl : 布局是否从右到左
fixScrollViewTopping: 修复 ScrollView 置顶问题
```
* ### 压缩相关 -> [ZipUtils.java][zip.java] -> [Test][zip.test]
```
zipFiles : 批量压缩文件
......@@ -1262,5 +1271,7 @@ getComments : 获取压缩文件中的注释链表
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
[view.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
[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
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.25.8'
implementation 'com.blankj:utilcode:1.25.9'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.25.8'
implementation 'com.blankj:utilcodex:1.25.9'
```
......@@ -1069,6 +1069,15 @@ vibrate
cancel
```
* ### About View -> [ViewUtils.java][view.java]
```
setViewEnabled
runOnUiThread
runOnUiThreadDelayed
isLayoutRtl
fixScrollViewTopping
```
* ### About Zip -> [ZipUtils.java][zip.java] -> [Test][zip.test]
```
zipFiles
......@@ -1187,7 +1196,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
......@@ -1262,5 +1271,7 @@ getComments
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
[view.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ViewUtils.java
[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
......@@ -64,7 +64,7 @@ public final class PermissionConstants {
permission.RECEIVE_WAP_PUSH, permission.RECEIVE_MMS,
};
private static final String[] GROUP_STORAGE = {
permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE
permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE,
};
@StringDef({CALENDAR, CAMERA, CONTACTS, LOCATION, MICROPHONE, PHONE, SENSORS, SMS, STORAGE,})
......
......@@ -865,7 +865,7 @@ public final class AppUtils {
return true;
}
private static final char HEX_DIGITS[] =
private static final char[] HEX_DIGITS =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static byte[] hashTemplate(final byte[] data, final String algorithm) {
......
......@@ -35,7 +35,7 @@ public final class ConvertUtils {
throw new UnsupportedOperationException("u can't instantiate me...");
}
private static final char hexDigits[] =
private static final char[] hexDigits =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
/**
......@@ -581,7 +581,7 @@ public final class ConvertUtils {
* @return value of px
*/
public static int dp2px(final float dpValue) {
final float scale = Resources.getSystem().getDisplayMetrics().density;
final float scale = Utils.getApp().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
......@@ -592,7 +592,7 @@ public final class ConvertUtils {
* @return value of dp
*/
public static int px2dp(final float pxValue) {
final float scale = Resources.getSystem().getDisplayMetrics().density;
final float scale = Utils.getApp().getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
......@@ -603,7 +603,7 @@ public final class ConvertUtils {
* @return value of px
*/
public static int sp2px(final float spValue) {
final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity;
final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
......@@ -614,7 +614,7 @@ public final class ConvertUtils {
* @return value of sp
*/
public static int px2sp(final float pxValue) {
final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity;
final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
......
......@@ -41,7 +41,7 @@ public final class CrashUtils {
private static final String FILE_SEP = System.getProperty("file.separator");
@SuppressLint("SimpleDateFormat")
private static final Format FORMAT = new SimpleDateFormat("MM-dd HH-mm-ss");
private static final Format FORMAT = new SimpleDateFormat("MM-dd_HH-mm-ss");
private static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER;
private static final UncaughtExceptionHandler UNCAUGHT_EXCEPTION_HANDLER;
......
......@@ -22,6 +22,7 @@ import java.util.Enumeration;
import java.util.UUID;
import static android.Manifest.permission.ACCESS_WIFI_STATE;
import static android.Manifest.permission.CHANGE_WIFI_STATE;
import static android.Manifest.permission.INTERNET;
import static android.content.Context.WIFI_SERVICE;
......@@ -106,11 +107,12 @@ public final class DeviceUtils {
/**
* Return the MAC address.
* <p>Must hold {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />},
* {@code <uses-permission android:name="android.permission.INTERNET" />}</p>
* {@code <uses-permission android:name="android.permission.INTERNET" />},
* {@code <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />}</p>
*
* @return the MAC address
*/
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET})
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET, CHANGE_WIFI_STATE})
public static String getMacAddress() {
String macAddress = getMacAddress((String[]) null);
if (!macAddress.equals("") || getWifiEnabled()) return macAddress;
......@@ -126,10 +128,18 @@ public final class DeviceUtils {
return manager.isWifiEnabled();
}
/**
* Enable or disable wifi.
* <p>Must hold {@code <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />}</p>
*
* @param enabled True to enabled, false otherwise.
*/
@RequiresPermission(CHANGE_WIFI_STATE)
private static void setWifiEnabled(final boolean enabled) {
@SuppressLint("WifiManagerLeak")
WifiManager manager = (WifiManager) Utils.getApp().getSystemService(WIFI_SERVICE);
if (manager == null) return;
if (enabled == manager.isWifiEnabled()) return;
manager.setWifiEnabled(enabled);
}
......@@ -372,9 +382,8 @@ public final class DeviceUtils {
/**
* Return the unique device id.
* <pre>{1}{UUID(macAddress)}</pre>
* <pre>{2}{UUID(deviceId )}</pre>
* <pre>{3}{UUID(androidId )}</pre>
* <pre>{4}{UUID(random )}</pre>
* <pre>{2}{UUID(androidId )}</pre>
* <pre>{9}{UUID(random )}</pre>
*
* @return the unique device id
*/
......@@ -386,9 +395,8 @@ public final class DeviceUtils {
/**
* Return the unique device id.
* <pre>{prefix}{1}{UUID(macAddress)}</pre>
* <pre>{prefix}{2}{UUID(deviceId )}</pre>
* <pre>{prefix}{3}{UUID(androidId )}</pre>
* <pre>{prefix}{4}{UUID(random )}</pre>
* <pre>{prefix}{2}{UUID(androidId )}</pre>
* <pre>{prefix}{9}{UUID(random )}</pre>
*
* @param prefix The prefix of the unique device id.
* @return the unique device id
......@@ -414,13 +422,8 @@ public final class DeviceUtils {
return saveUdid(prefix + 2, androidId);
}
final String deviceId = ((TelephonyManager) Utils.getApp().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
if (!TextUtils.isEmpty(deviceId)) {
return saveUdid(prefix + 3, deviceId);
}
} catch (Exception ignore) {/**/}
return saveUdid(prefix + 4, "");
return saveUdid(prefix + 9, "");
}
}
}
......@@ -448,12 +451,6 @@ public final class DeviceUtils {
return false;
}
return uniqueDeviceId.substring(st + 1).equals(getUdid("", androidId));
} else if (type.startsWith("3")) {
final String deviceId = ((TelephonyManager) Utils.getApp().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
if (TextUtils.isEmpty(deviceId)) {
return false;
}
return uniqueDeviceId.substring(st + 1).equals(getUdid("", deviceId));
}
return false;
}
......
......@@ -1152,7 +1152,7 @@ public final class EncryptUtils {
return ret;
}
private static final char HEX_DIGITS[] =
private static final char[] HEX_DIGITS =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static String bytes2HexString(final byte[] bytes) {
......
......@@ -1221,7 +1221,7 @@ public final class FileUtils {
// other utils methods
///////////////////////////////////////////////////////////////////////////
private static final char HEX_DIGITS[] =
private static final char[] HEX_DIGITS =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static String bytes2HexString(final byte[] bytes) {
......
......@@ -1562,7 +1562,7 @@ public final class ImageUtils {
* @param filePath The path of file.
* @return the type of image
*/
public static String getImageType(final String filePath) {
public static ImageType getImageType(final String filePath) {
return getImageType(getFileByPath(filePath));
}
......@@ -1572,12 +1572,12 @@ public final class ImageUtils {
* @param file The file.
* @return the type of image
*/
public static String getImageType(final File file) {
if (file == null) return "";
public static ImageType getImageType(final File file) {
if (file == null) return null;
InputStream is = null;
try {
is = new FileInputStream(file);
String type = getImageType(is);
ImageType type = getImageType(is);
if (type != null) {
return type;
}
......@@ -1592,36 +1592,57 @@ public final class ImageUtils {
e.printStackTrace();
}
}
return getFileExtension(file.getAbsolutePath()).toUpperCase();
}
private static String getFileExtension(final String filePath) {
if (isSpace(filePath)) return filePath;
int lastPoi = filePath.lastIndexOf('.');
int lastSep = filePath.lastIndexOf(File.separator);
if (lastPoi == -1 || lastSep >= lastPoi) return "";
return filePath.substring(lastPoi + 1);
return null;
}
private static String getImageType(final InputStream is) {
private static ImageType getImageType(final InputStream is) {
if (is == null) return null;
try {
byte[] bytes = new byte[8];
return is.read(bytes, 0, 8) != -1 ? getImageType(bytes) : null;
byte[] bytes = new byte[12];
return is.read(bytes) != -1 ? getImageType(bytes) : null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private static String getImageType(final byte[] bytes) {
if (isJPEG(bytes)) return "JPEG";
if (isGIF(bytes)) return "GIF";
if (isPNG(bytes)) return "PNG";
if (isBMP(bytes)) return "BMP";
return null;
private static ImageType getImageType(final byte[] bytes) {
String type = bytes2HexString(bytes).toUpperCase();
if (type.contains("FFD8FF")) {
return ImageType.TYPE_JPG;
} else if (type.contains("89504E47")) {
return ImageType.TYPE_PNG;
} else if (type.contains("47494638")) {
return ImageType.TYPE_GIF;
} else if (type.contains("49492A00") || type.contains("4D4D002A")) {
return ImageType.TYPE_TIFF;
} else if (type.contains("424D")) {
return ImageType.TYPE_BMP;
} else if (type.startsWith("52494646") && type.endsWith("57454250")) {//524946461c57000057454250-12个字节
return ImageType.TYPE_WEBP;
} else if (type.contains("00000100") || type.contains("00000200")) {
return ImageType.TYPE_ICO;
} else {
return ImageType.TYPE_UNKNOWN;
}
}
private static final char[] hexDigits =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static String bytes2HexString(final byte[] bytes) {
if (bytes == null) return "";
int len = bytes.length;
if (len <= 0) return "";
char[] ret = new char[len << 1];
for (int i = 0, j = 0; i < len; i++) {
ret[j++] = hexDigits[bytes[i] >> 4 & 0x0f];
ret[j++] = hexDigits[bytes[i] & 0x0f];
}
return new String(ret);
}
private static boolean isJPEG(final byte[] b) {
return b.length >= 2
&& (b[0] == (byte) 0xFF) && (b[1] == (byte) 0xD8);
......@@ -1982,4 +2003,32 @@ public final class ImageUtils {
}
}
}
public enum ImageType {
TYPE_JPG("jpg"),
TYPE_PNG("png"),
TYPE_GIF("gif"),
TYPE_TIFF("tiff"),
TYPE_BMP("bmp"),
TYPE_WEBP("webp"),
TYPE_ICO("ico"),
TYPE_UNKNOWN("unknown");
String value;
ImageType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
}
......@@ -108,15 +108,7 @@ public final class KeyboardUtils {
InputMethodManager imm =
(InputMethodManager) Utils.getApp().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm == null) return;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0, new ResultReceiver(new Handler()) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN
|| resultCode == InputMethodManager.RESULT_SHOWN) {
toggleSoftInput();
}
}
});
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
/**
......
......@@ -36,10 +36,13 @@ import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.Formatter;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.ExecutorService;
......@@ -233,6 +236,21 @@ public final class LogUtils {
}
}
public static List<File> getLogFiles() {
String dir = CONFIG.getDir();
File logDir = new File(dir);
if (!logDir.exists()) return new ArrayList<>();
File[] files = logDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return isMatchLogFileName(name);
}
});
List<File> list = new ArrayList<>();
Collections.addAll(list, files);
return list;
}
private static TagHead processTagAndHead(String tag) {
if (!CONFIG.mTagIsSpace && !CONFIG.isLogHeadSwitch()) {
tag = CONFIG.getGlobalTag();
......@@ -527,7 +545,7 @@ public final class LogUtils {
File[] files = parentFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches("^" + CONFIG.getFilePrefix() + "_[0-9]{4}_[0-9]{2}_[0-9]{2}_.*$");
return isMatchLogFileName(name);
}
});
if (files == null || files.length <= 0) return;
......@@ -555,6 +573,10 @@ public final class LogUtils {
}
}
private static boolean isMatchLogFileName(String name) {
return name.matches("^" + CONFIG.getFilePrefix() + "_[0-9]{4}_[0-9]{2}_[0-9]{2}_.*$");
}
private static String findDate(String str) {
Pattern pattern = Pattern.compile("[0-9]{4}_[0-9]{2}_[0-9]{2}");
Matcher matcher = pattern.matcher(str);
......
package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresPermission;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import static android.Manifest.permission.CALL_PHONE;
import static android.Manifest.permission.READ_PHONE_STATE;
import static android.Manifest.permission.SEND_SMS;
/**
* <pre>
......@@ -46,6 +42,7 @@ public final class PhoneUtils {
/**
* Return the unique device id.
* <p>If the version of SDK is greater than 28, it will return an empty string.</p>
* <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
*
* @return the unique device id
......@@ -53,6 +50,9 @@ public final class PhoneUtils {
@SuppressLint("HardwareIds")
@RequiresPermission(READ_PHONE_STATE)
public static String getDeviceId() {
if (Build.VERSION.SDK_INT >= 29) {
return "";
}
TelephonyManager tm = getTelephonyManager();
String deviceId = tm.getDeviceId();
if (!TextUtils.isEmpty(deviceId)) return deviceId;
......@@ -78,6 +78,7 @@ public final class PhoneUtils {
/**
* Return the IMEI.
* <p>If the version of SDK is greater than 28, it will return an empty string.</p>
* <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
*
* @return the IMEI
......@@ -89,6 +90,7 @@ public final class PhoneUtils {
/**
* Return the MEID.
* <p>If the version of SDK is greater than 28, it will return an empty string.</p>
* <p>Must hold {@code <uses-permission android:name="android.permission.READ_PHONE_STATE" />}</p>
*
* @return the MEID
......@@ -101,6 +103,9 @@ public final class PhoneUtils {
@SuppressLint("HardwareIds")
@RequiresPermission(READ_PHONE_STATE)
public static String getImeiOrMeid(boolean isImei) {
if (Build.VERSION.SDK_INT >= 29) {
return "";
}
TelephonyManager tm = getTelephonyManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (isImei) {
......
......@@ -100,7 +100,7 @@ public final class ScreenUtils {
* @return the density of screen
*/
public static float getScreenDensity() {
return Resources.getSystem().getDisplayMetrics().density;
return Utils.getApp().getResources().getDisplayMetrics().density;
}
/**
......@@ -109,7 +109,7 @@ public final class ScreenUtils {
* @return the screen density expressed as dots-per-inch
*/
public static int getScreenDensityDpi() {
return Resources.getSystem().getDisplayMetrics().densityDpi;
return Utils.getApp().getResources().getDisplayMetrics().densityDpi;
}
/**
......
......@@ -27,7 +27,7 @@ public final class SizeUtils {
* @return value of px
*/
public static int dp2px(final float dpValue) {
final float scale = Resources.getSystem().getDisplayMetrics().density;
final float scale = Utils.getApp().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
......@@ -38,7 +38,7 @@ public final class SizeUtils {
* @return value of dp
*/
public static int px2dp(final float pxValue) {
final float scale = Resources.getSystem().getDisplayMetrics().density;
final float scale = Utils.getApp().getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
......@@ -49,7 +49,7 @@ public final class SizeUtils {
* @return value of px
*/
public static int sp2px(final float spValue) {
final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity;
final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
......@@ -60,7 +60,7 @@ public final class SizeUtils {
* @return value of sp
*/
public static int px2sp(final float pxValue) {
final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity;
final float fontScale = Utils.getApp().getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
......@@ -75,7 +75,7 @@ public final class SizeUtils {
* metrics depending on its unit.
*/
public static float applyDimension(final float value, final int unit) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
DisplayMetrics metrics = Utils.getApp().getResources().getDisplayMetrics();
switch (unit) {
case TypedValue.COMPLEX_UNIT_PX:
return value;
......
package com.blankj.utilcode.util;
import android.os.Build;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import java.util.Locale;
/**
* <pre>
* author: Blankj
......@@ -63,9 +67,27 @@ public class ViewUtils {
}
/**
* 用于解决ScrollView嵌套ListView/GridView/WebView/RecyclerView等无法置顶问题
* Return whether horizontal layout direction of views are from Right to Left.
*
* @param view ScrollView嵌套的跟视图
* @return {@code true}: yes<br>{@code false}: no
*/
public static boolean isLayoutRtl() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Locale primaryLocale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
primaryLocale = Utils.getApp().getResources().getConfiguration().getLocales().get(0);
} else {
primaryLocale = Utils.getApp().getResources().getConfiguration().locale;
}
return TextUtils.getLayoutDirectionFromLocale(primaryLocale) == View.LAYOUT_DIRECTION_RTL;
}
return false;
}
/**
* Fix the problem of topping the ScrollView nested ListView/GridView/WebView/RecyclerView.
*
* @param view The root view inner of ScrollView.
*/
public static void fixScrollViewTopping(View view) {
view.setFocusable(false);
......@@ -84,5 +106,4 @@ public class ViewUtils {
}
}
}
}
\ No newline at end of file
package com.blankj.utilcode.util;
import org.junit.Assert;
import org.junit.Test;
/**
* <pre>
* author: blankj
* blog : http://blankj.com
* time : 2019/08/25
* desc : test ImageUtils
* </pre>
*/
public class ImageUtilsTest extends BaseTest {
@Test
public void getImageType() {
Assert.assertEquals(ImageUtils.ImageType.TYPE_JPG, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.jpg"));
Assert.assertEquals(ImageUtils.ImageType.TYPE_PNG, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.png"));
Assert.assertEquals(ImageUtils.ImageType.TYPE_GIF, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.gif"));
Assert.assertEquals(ImageUtils.ImageType.TYPE_TIFF, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.tif"));
Assert.assertEquals(ImageUtils.ImageType.TYPE_BMP, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.bmp"));
Assert.assertEquals(ImageUtils.ImageType.TYPE_WEBP, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.webp"));
Assert.assertEquals(ImageUtils.ImageType.TYPE_ICO, ImageUtils.getImageType(TestConfig.PATH_IMAGE + "ic_launcher.ico"));
}
}
......@@ -32,5 +32,7 @@ public class TestConfig {
static final String PATH_FILE = TEST_PATH + "file" + FILE_SEP;
static final String PATH_IMAGE = TEST_PATH + "image" + FILE_SEP;
static final String PATH_ZIP = TEST_PATH + "zip" + FILE_SEP;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册