From 151a0603ff6f83e62e7e90f8a67ded989125b97a Mon Sep 17 00:00:00 2001 From: siguangli Date: Tue, 15 Oct 2024 16:43:13 +0800 Subject: [PATCH] fix(android): image module get size support return bitmap --- .../image/ImageLoaderModule.java | 53 ++++++++++++++----- .../component/drawable/ContentDrawable.java | 2 +- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/framework/android/src/main/java/com/tencent/mtt/hippy/modules/nativemodules/image/ImageLoaderModule.java b/framework/android/src/main/java/com/tencent/mtt/hippy/modules/nativemodules/image/ImageLoaderModule.java index 74022f7eb10..0f7282ec50c 100644 --- a/framework/android/src/main/java/com/tencent/mtt/hippy/modules/nativemodules/image/ImageLoaderModule.java +++ b/framework/android/src/main/java/com/tencent/mtt/hippy/modules/nativemodules/image/ImageLoaderModule.java @@ -16,6 +16,7 @@ package com.tencent.mtt.hippy.modules.nativemodules.image; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -25,6 +26,7 @@ import com.tencent.mtt.hippy.modules.Promise; import com.tencent.mtt.hippy.modules.nativemodules.HippyNativeModuleBase; import com.tencent.mtt.hippy.runtime.builtins.JSObject; +import com.tencent.mtt.hippy.utils.LogUtils; import com.tencent.vfs.ResourceDataHolder; import com.tencent.vfs.VfsManager; import com.tencent.vfs.VfsManager.FetchResourceCallback; @@ -33,6 +35,7 @@ @HippyNativeModule(name = "ImageLoaderModule") public class ImageLoaderModule extends HippyNativeModuleBase { + private final String TAG = "ImageLoaderModule"; private final VfsManager mVfsManager; private static final String ERROR_KEY_MESSAGE = "message"; @@ -64,6 +67,41 @@ private HashMap generateRequestParams() { return requestParams; } + private void onFetchFailed(final String url, final Promise promise, @NonNull final ResourceDataHolder dataHolder) { + String message = + dataHolder.errorMessage != null ? dataHolder.errorMessage : ""; + String errorMsg = "Fetch image failed, url=" + url + ", msg=" + message; + JSObject jsObject = new JSObject(); + jsObject.set(ERROR_KEY_MESSAGE, errorMsg); + promise.reject(jsObject); + } + + private void handleFetchResult(final String url, final Promise promise, @NonNull final ResourceDataHolder dataHolder) { + byte[] bytes = dataHolder.getBytes(); + Bitmap bitmap = dataHolder.bitmap; + LogUtils.d(TAG, "handleFetchResult: url " + url + ", result " + dataHolder.resultCode); + if (dataHolder.resultCode == ResourceDataHolder.RESOURCE_LOAD_SUCCESS_CODE) { + if (bitmap != null && !bitmap.isRecycled()) { + LogUtils.d(TAG, "handleFetchResult: url " + url + + ", bitmap width " + bitmap.getWidth() + ", bitmap height " + bitmap.getHeight()); + JSObject jsObject = new JSObject(); + jsObject.set("width", bitmap.getWidth()); + jsObject.set("height", bitmap.getHeight()); + promise.resolve(jsObject); + } else if (bytes != null && bytes.length > 0) { + decodeImageData(url, bytes, promise); + } else { + if (TextUtils.isEmpty(dataHolder.errorMessage)) { + dataHolder.errorMessage = "Invalid image data or bitmap!"; + } + onFetchFailed(url, promise, dataHolder); + } + } else { + onFetchFailed(url, promise, dataHolder); + } + dataHolder.recycle(); + } + @HippyMethod(name = "getSize") public void getSize(final String url, final Promise promise) { if (TextUtils.isEmpty(url)) { @@ -76,20 +114,7 @@ public void getSize(final String url, final Promise promise) { new FetchResourceCallback() { @Override public void onFetchCompleted(@NonNull final ResourceDataHolder dataHolder) { - byte[] bytes = dataHolder.getBytes(); - if (dataHolder.resultCode - != ResourceDataHolder.RESOURCE_LOAD_SUCCESS_CODE || bytes == null - || bytes.length <= 0) { - String message = - dataHolder.errorMessage != null ? dataHolder.errorMessage : ""; - String errorMsg = "Fetch image failed, url=" + url + ", msg=" + message; - JSObject jsObject = new JSObject(); - jsObject.set(ERROR_KEY_MESSAGE, errorMsg); - promise.reject(jsObject); - } else { - decodeImageData(url, bytes, promise); - } - dataHolder.recycle(); + handleFetchResult(url, promise, dataHolder); } @Override diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/component/drawable/ContentDrawable.java b/renderer/native/android/src/main/java/com/tencent/renderer/component/drawable/ContentDrawable.java index ca25a7857ab..90614a82ba0 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/component/drawable/ContentDrawable.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/component/drawable/ContentDrawable.java @@ -162,7 +162,7 @@ public void draw(@NonNull Canvas canvas) { drawGif(canvas, mImageHolder.getGifMovie()); } else { Bitmap bitmap = mImageHolder.getBitmap(); - if (bitmap != null) { + if (bitmap != null && !bitmap.isRecycled()) { drawBitmap(canvas, bitmap); } }