提交 ed567e11 编写于 作者: B Blankj

see 04/19 log

上级 deb9f5c9
* `20/04/18` [fix] PermissionUtils#callback. Publish v1.28.1.
* `20/04/17` [fix] ImageUtils#view2Bitmap, ImageUtils.getBitmap(InputStream).
* `20/04/16` [add] ConvertUtils#int2HexString, hexString2Int.
* `20/04/15` [add] UiMessageUtils' demo.
* `20/04/13` [add] NumberUtils. Publish v1.28.0.
* `20/04/12` [opt] TimeUtils#SDF_THREAD_LOCAL.
* `20/04/11` [add] SDCardUtils#getXxTotalSize, SDCardUtils#getXxAvailableSize. FileUtils#getFsTotalSize, FileUtils#getFsAvailableSize.
......
......@@ -15,7 +15,7 @@ class Config {
static minSdkVersion = 14
static targetSdkVersion = 29
static versionCode = 1_026_001
static versionName = '1.28.0'// E.g. 1.9.72 => 1,009,072
static versionName = '1.28.1'// E.g. 1.9.72 => 1,009,072
// lib version
static gradlePluginVersion = '3.5.0'
......
......@@ -255,6 +255,10 @@
android:name=".feature.toast.ToastActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
<activity
android:name=".feature.uiMessage.UiMessageActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" />
<activity
android:name=".feature.vibrate.VibrateActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
......
......@@ -44,6 +44,7 @@ import com.blankj.utilcode.pkg.feature.snackbar.SnackbarActivity
import com.blankj.utilcode.pkg.feature.spStatic.SPStaticActivity
import com.blankj.utilcode.pkg.feature.span.SpanActivity
import com.blankj.utilcode.pkg.feature.toast.ToastActivity
import com.blankj.utilcode.pkg.feature.uiMessage.UiMessageActivity
import com.blankj.utilcode.pkg.feature.vibrate.VibrateActivity
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.UtilsTransActivity
......@@ -191,6 +192,9 @@ class CoreUtilActivity : CommonActivity() {
}
})
},
CommonItemClick(R.string.demo_uiMessage, true) {
UiMessageActivity.start(this)
},
CommonItemClick(R.string.demo_vibrate, true) {
VibrateActivity.start(this)
}
......
......@@ -157,39 +157,47 @@ class BusCompareActivity : CommonActivity() {
* 注销 10000 个订阅者,共执行 10 次取平均值
*/
private fun compareUnregister10000Times() {
val tests = ArrayList<BusEvent>()
for (i in 0..9999) {
val test = BusEvent()
EventBus.getDefault().register(test)
BusUtils.register(test)
tests.add(test)
}
compareWithEventBus("Unregister 10000 times.", 10, 1, object : CompareCallback {
override fun runEventBus() {
for (test in tests) {
EventBus.getDefault().unregister(test)
}
}
override fun runBusUtils() {
for (test in tests) {
BusUtils.unregister(test)
}
}
override fun restState() {
for (test in tests) {
showLoading()
ThreadUtils.executeBySingle(object : ThreadUtils.SimpleTask<List<BusEvent>>() {
override fun doInBackground(): List<BusEvent> {
val tests = ArrayList<BusEvent>()
for (i in 0..9999) {
val test = BusEvent()
EventBus.getDefault().register(test)
BusUtils.register(test)
tests.add(test)
}
return tests
}
}, object : OnFinishCallback {
override fun onFinish() {
for (test in tests) {
EventBus.getDefault().unregister(test)
BusUtils.unregister(test)
}
override fun onSuccess(tests: List<BusEvent>) {
compareWithEventBus("Unregister 10000 times.", 10, 1, object : CompareCallback {
override fun runEventBus() {
for (test in tests) {
EventBus.getDefault().unregister(test)
}
}
override fun runBusUtils() {
for (test in tests) {
BusUtils.unregister(test)
}
}
override fun restState() {
for (test in tests) {
EventBus.getDefault().register(test)
BusUtils.register(test)
}
}
}, object : OnFinishCallback {
override fun onFinish() {
for (test in tests) {
EventBus.getDefault().unregister(test)
BusUtils.unregister(test)
}
}
})
}
})
}
......
package com.blankj.utilcode.pkg.feature.uiMessage
import android.content.Context
import android.content.Intent
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.CollectionUtils
import com.blankj.utilcode.util.UiMessageUtils
/**
* ```
* author: Blankj
* blog : http://blankj.com
* time : 2020/04/14
* desc : demo about UiMessageUtils
* ```
*/
class UiMessageActivity : CommonActivity(), UiMessageUtils.UiMessageCallback {
private val titleItem: CommonItemTitle = CommonItemTitle("", true);
private var sendContent: String = ""
companion object {
fun start(context: Context) {
val starter = Intent(context, UiMessageActivity::class.java)
context.startActivity(starter)
}
}
override fun bindTitleRes(): Int {
return R.string.demo_uiMessage
}
override fun bindItems(): List<CommonItem<*>> {
return CollectionUtils.newArrayList(
titleItem,
CommonItemClick(R.string.uiMessage_add_listener_id) {
UiMessageUtils.getInstance().addListener(R.id.utilCodeUiMessageAddListenerId, this)
},
CommonItemClick(R.string.uiMessage_remove_all_id) {
UiMessageUtils.getInstance().removeListeners(R.id.utilCodeUiMessageAddListenerId)
},
CommonItemClick(R.string.uiMessage_add_listener) {
UiMessageUtils.getInstance().addListener(this)
},
CommonItemClick(R.string.uiMessage_remove_listener) {
UiMessageUtils.getInstance().removeListener(this)
},
CommonItemClick(R.string.uiMessage_send) {
sendContent = "send: UiMessageActivity#${UiMessageActivity.hashCode()}"
titleItem.title = ""
UiMessageUtils.getInstance().send(R.id.utilCodeUiMessageAddListenerId, UiMessageActivity)
}
)
}
override fun handleMessage(localMessage: UiMessageUtils.UiMessage) {
if (localMessage.id == R.id.utilCodeUiMessageAddListenerId) {
var content: String = sendContent
content += "\nreceive: UiMessageActivity#${localMessage.getObject().hashCode()}"
titleItem.title = if (titleItem.title.toString().isEmpty()) {
content
} else {
titleItem.title.toString() + "\n" + content
}
}
}
override fun onDestroy() {
super.onDestroy()
UiMessageUtils.getInstance().removeListeners(R.id.utilCodeUiMessageAddListenerId)
UiMessageUtils.getInstance().removeListener(this)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="utilCodeUiMessageAddListenerId" type="id" />
</resources>
\ No newline at end of file
......@@ -37,6 +37,7 @@
<string name="demo_spStatic">SPStaticUtils Demo</string>
<string name="demo_span">SpanUtils Demo</string>
<string name="demo_toast">ToastUtils Demo</string>
<string name="demo_uiMessage">UiMessage Demo</string>
<string name="demo_trans_activity">TransActivity Demo</string>
<string name="demo_vibrate">VibrateUtils Demo</string>
......@@ -337,7 +338,6 @@
<string name="toast_show_middle">Show Middle</string>
<string name="toast_cancel">Cancel</string>
<string name="toast_show_toast_dialog">Show Toast Dialog</string>
<string name="toast_short">Short</string>
<string name="toast_long">Long</string>
<string name="toast_green_font">Green Font</string>
......@@ -346,6 +346,13 @@
<string name="toast_span">Spannable String</string>
<string name="toast_middle">Middle</string>
<!--UiMessage 相关-->
<string name="uiMessage_add_listener_id">Add Listener Id</string>
<string name="uiMessage_remove_all_id">Remove All Id</string>
<string name="uiMessage_add_listener">Add Listener</string>
<string name="uiMessage_remove_listener">Remove Listener</string>
<string name="uiMessage_send">Send</string>
<!--Vibrate 相关-->
<string name="vibrate_1000ms">Vibrate 1000ms</string>
<string name="vibrate_custom">Vibrate Custom</string>
......
......@@ -209,7 +209,7 @@ public abstract class CommonActivity extends BaseActivity {
public void showLoading(Runnable listener) {
if (mDialogLoading != null) {
dismissLoading();
return;
}
mDialogLoading = new CommonDialogLoading().init(this, listener);
mDialogLoading.show();
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.28.0'
implementation 'com.blankj:utilcode:1.28.1'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.28.0'
implementation 'com.blankj:utilcodex:1.28.1'
```
......@@ -346,6 +346,7 @@ getRandomColor : 获取随机色
* ### 转换相关 -> [ConvertUtils.java][convert.java] -> [Test][convert.test]
```
int2HexString, hexString2Int : int 与 hexString 互转
bytes2Bits, bits2Bytes : bytes 与 bits 互转
bytes2Chars, chars2Bytes : bytes 与 chars 互转
bytes2HexString, hexString2Bytes : bytes 与 hexString 互转
......@@ -1147,7 +1148,7 @@ cancel : 取消吐司显示
setOnTouchListener: 设置触摸事件
```
* ### UI 消息相关 -> [UiMessageUtils.java][uiMessage.java]
* ### UI 消息相关 -> [UiMessageUtils.java][uiMessage.java] -> [Demo][uiMessage.demo]
```
send : 发送消息
addListener : 新增消息监听器
......@@ -1388,6 +1389,7 @@ getComments : 获取压缩文件中的注释链表
[touch.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/TouchUtils.java
[uiMessage.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UiMessageUtils.java
[uiMessage.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt
[uri.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.28.0'
implementation 'com.blankj:utilcode:1.28.1'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.28.0'
implementation 'com.blankj:utilcodex:1.28.1'
```
......@@ -346,6 +346,7 @@ getRandomColor
* ### About Convert -> [ConvertUtils.java][convert.java] -> [Test][convert.test]
```
int2HexString, hexString2Int
bytes2Bits, bits2Bytes
bytes2Chars, chars2Bytes
bytes2HexString, hexString2Bytes
......@@ -1147,7 +1148,7 @@ cancel
setOnTouchListener
```
* ### About UiMessage -> [UiMessageUtils.java][uiMessage.java]
* ### About UiMessage -> [UiMessageUtils.java][uiMessage.java] -> [Demo][uiMessage.demo]
```
send
addListener
......@@ -1385,6 +1386,7 @@ getComments
[touch.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/TouchUtils.java
[uiMessage.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UiMessageUtils.java
[uiMessage.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/uiMessage/UiMessageActivity.kt
[uri.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
......
......@@ -14,8 +14,7 @@
android:name="com.blankj.utilcode.util.UtilsFileProvider"
android:authorities="${applicationId}.utilcode.provider"
android:exported="false"
android:grantUriPermissions="true"
android:multiprocess="true">
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/util_code_provider_paths" />
......
......@@ -38,14 +38,36 @@ import java.util.List;
*/
public final class ConvertUtils {
private static final int BUFFER_SIZE = 8192;
private static final char[] hexDigits =
private static final int BUFFER_SIZE = 8192;
private static final char[] HEX_DIGITS_UPPER =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static final char[] HEX_DIGITS_LOWER =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private ConvertUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* Int to hex string.
*
* @param num The int number.
* @return the hex string
*/
public static String int2HexString(int num) {
return Integer.toHexString(num);
}
/**
* Hex string to int.
*
* @param hexString The hex string.
* @return the int
*/
public static int hexString2Int(String hexString) {
return Integer.parseInt(hexString, 16);
}
/**
* Bytes to bits.
*
......@@ -130,7 +152,20 @@ public final class ConvertUtils {
* @return hex string
*/
public static String bytes2HexString(final byte[] bytes) {
return bytes2HexString(bytes, true);
}
/**
* Bytes to hex string.
* <p>e.g. bytes2HexString(new byte[] { 0, (byte) 0xa8 }, true) returns "00A8"</p>
*
* @param bytes The bytes.
* @param isUpperCase True to use upper case, false otherwise.
* @return hex string
*/
public static String bytes2HexString(final byte[] bytes, boolean isUpperCase) {
if (bytes == null) return "";
char[] hexDigits = isUpperCase ? HEX_DIGITS_UPPER : HEX_DIGITS_LOWER;
int len = bytes.length;
if (len <= 0) return "";
char[] ret = new char[len << 1];
......
......@@ -649,7 +649,7 @@ public final class FileUtils {
* @return the files in directory
*/
public static List<File> listFilesInDir(final String dirPath, Comparator<File> comparator) {
return listFilesInDir(getFileByPath(dirPath), false);
return listFilesInDir(getFileByPath(dirPath), false, comparator);
}
/**
......
......@@ -183,14 +183,21 @@ public final class ImageUtils {
boolean willNotCacheDrawing = view.willNotCacheDrawing();
view.setDrawingCacheEnabled(true);
view.setWillNotCacheDrawing(false);
final Bitmap drawingCache = view.getDrawingCache();
Bitmap drawingCache = view.getDrawingCache();
Bitmap bitmap;
if (null == drawingCache) {
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
bitmap = Bitmap.createBitmap(view.getDrawingCache());
drawingCache = view.getDrawingCache();
if (drawingCache != null) {
bitmap = Bitmap.createBitmap(drawingCache);
} else {
bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
}
} else {
bitmap = Bitmap.createBitmap(drawingCache);
}
......@@ -279,8 +286,12 @@ public final class ImageUtils {
*/
public static Bitmap getBitmap(final InputStream is, final int maxWidth, final int maxHeight) {
if (is == null) return null;
byte[] bytes = UtilsBridge.inputStream2Bytes(is);
return getBitmap(bytes, 0, maxWidth, maxHeight);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, options);
options.inSampleSize = calculateInSampleSize(options, maxWidth, maxHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(is, null, options);
}
/**
......
......@@ -197,7 +197,8 @@ public class MessengerUtils {
}
void unbind() {
Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_UNSUBSCRIBE);
int key = UtilsBridge.getCurrentProcessName().hashCode();
Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_UNSUBSCRIBE, key, 0);
msg.replyTo = mClient;
try {
mServer.send(msg);
......
......@@ -428,10 +428,10 @@ public final class PermissionUtils {
int requestCode,
String[] permissions,
int[] grantResults) {
activity.finish();
if (sInstance != null && sInstance.mPermissionsRequest != null) {
sInstance.onRequestPermissionsResult(activity);
}
activity.finish();
}
......@@ -443,6 +443,7 @@ public final class PermissionUtils {
@Override
public void onActivityResult(UtilsTransActivity activity, int requestCode, int resultCode, Intent data) {
activity.finish();
if (requestCode == TYPE_WRITE_SETTINGS) {
if (sSimpleCallback4WriteSettings == null) return;
if (isGrantedWriteSettings()) {
......@@ -465,7 +466,6 @@ public final class PermissionUtils {
}
}, 100);
}
activity.finish();
}
}
......
......@@ -271,10 +271,8 @@ public final class UiMessageUtils implements Handler.Callback {
b.append("{ id=");
b.append(getId());
if (getObject() != null) {
b.append(" obj=");
b.append(getObject());
}
b.append(", obj=");
b.append(getObject());
b.append(" }");
return b.toString();
......
<?xml version="1.0" encoding="utf-8"?>
<paths>
<root-path
name="root"
name="root_path"
path="" />
<files-path
......@@ -23,4 +23,8 @@
<external-cache-path
name="external_cache_path"
path="." />
<external-media-path
name="external_media_path"
path="." />
</paths>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册