From 93c194d6f4db72d5d18e9f59fd0377820b052ac3 Mon Sep 17 00:00:00 2001
From: arnonchen <745735906@qq.com>
Date: Thu, 31 Oct 2024 11:00:58 +0800
Subject: [PATCH] fix(android): fix the use of weak reference in font loader

---
 .../renderer/component/text/FontLoader.java       | 13 +++++++++----
 .../tencent/renderer/node/TextVirtualNode.java    | 15 +++++++++------
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/component/text/FontLoader.java b/renderer/native/android/src/main/java/com/tencent/renderer/component/text/FontLoader.java
index d3d553a2672..51d92fab4de 100644
--- a/renderer/native/android/src/main/java/com/tencent/renderer/component/text/FontLoader.java
+++ b/renderer/native/android/src/main/java/com/tencent/renderer/component/text/FontLoader.java
@@ -136,7 +136,11 @@ public static String getFontPath(String fontFileName) {
     // Convert "hpfile://" to "file://" or "assets://"
     private String convertToLocalPathIfNeeded(String fontUrl) {
         if (fontUrl != null && fontUrl.startsWith("hpfile://")) {
-            String bundlePath = mNativeRenderRef.get().getBundlePath();
+            final NativeRender nativeRender = mNativeRenderRef.get();
+            String bundlePath = null;
+            if (nativeRender != null) {
+                bundlePath = mNativeRenderRef.get().getBundlePath();
+            }
             String relativePath = fontUrl.replace("hpfile://./", "");
             fontUrl = bundlePath == null ? null
                 : bundlePath.subSequence(0, bundlePath.lastIndexOf(File.separator) + 1)
@@ -230,13 +234,14 @@ public void loadAndRefresh(final String fontFamily, final String fontUrl, int ro
         }
         mConcurrentFontLoadStateMap.put(fontFamily, FontLoadState.FONT_LOADING);
         String convertFontUrl = convertToLocalPathIfNeeded(fontUrl);
-        if (mVfsManager.get() == null) {
+        final VfsManager vfsManager = mVfsManager.get();
+        if (vfsManager == null) {
             if (promise != null) {
                 promise.reject("Get vfsManager failed!");
             }
             return;
         }
-        mVfsManager.get().fetchResourceAsync(convertFontUrl, null, null,
+        vfsManager.fetchResourceAsync(convertFontUrl, null, null,
             new FetchResourceCallback() {
                 @Override
                 public void onFetchCompleted(@NonNull final ResourceDataHolder dataHolder) {
@@ -282,7 +287,7 @@ public void onFetchCompleted(@NonNull final ResourceDataHolder dataHolder) {
                         saveMapFile(mUrlFontMapFile, mConcurrentUrlFontMap);
                         saveMapFile(mLocalFontPathMapFile, mConcurrentLocalFontPathMap);
                         TypeFaceUtil.clearFontCache(fontFamily);
-                        NativeRender nativeRender = mNativeRenderRef.get();
+                        final NativeRender nativeRender = mNativeRenderRef.get();
                         if (nativeRender != null && needRefresh) {
                             nativeRender.onFontLoaded(rootId);
                         }
diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/node/TextVirtualNode.java b/renderer/native/android/src/main/java/com/tencent/renderer/node/TextVirtualNode.java
index 91f9ad132f5..afe4298b139 100644
--- a/renderer/native/android/src/main/java/com/tencent/renderer/node/TextVirtualNode.java
+++ b/renderer/native/android/src/main/java/com/tencent/renderer/node/TextVirtualNode.java
@@ -193,7 +193,8 @@ public void setFontFamily(String family) {
         if (!Objects.equals(mFontFamily, family)) {
             mFontFamily = family;
             markDirty();
-            if (mFontLoaderRef.get() != null && !mFontLoaderRef.get().isFontLoaded(mFontFamily)) {
+            final FontLoader fontLoader = mFontLoaderRef.get();
+            if (fontLoader != null && !fontLoader.isFontLoaded(mFontFamily)) {
                 mFontLoadState = FontLoader.FontLoadState.FONT_UNLOAD;
             }
         }
@@ -496,12 +497,14 @@ protected void createSpanOperationImpl(@NonNull List<SpanOperation> ops,
             if (mFontAdapter != null && mEnableScale) {
                 size = (int) (size * mFontAdapter.getFontScale());
             }
-            if (!TextUtils.isEmpty(mFontUrl) && mFontLoaderRef.get() != null) {
-                if (mNativeRenderRef.get() != null) {
-                    Executor executor = mNativeRenderRef.get().getBackgroundExecutor();
+            final FontLoader fontLoader = mFontLoaderRef.get();
+            if (!TextUtils.isEmpty(mFontUrl) && fontLoader != null) {
+                final NativeRender nativeRender = mNativeRenderRef.get();
+                if (nativeRender != null) {
+                    Executor executor = nativeRender.getBackgroundExecutor();
                     if (executor != null) {
                         executor.execute(() -> {
-                            mFontLoaderRef.get().loadIfNeeded(mFontFamily, mFontUrl, getRootId());
+                            fontLoader.loadIfNeeded(mFontFamily, mFontUrl, getRootId());
                         });
                     }
                 }
@@ -572,7 +575,7 @@ protected Layout createLayout() {
 
     @NonNull
     protected Layout createLayout(final float width, final FlexMeasureMode widthMode) {
-        FontLoader fontLoader = mFontLoaderRef.get();
+        final FontLoader fontLoader = mFontLoaderRef.get();
         if (mFontLoadState == FontLoader.FontLoadState.FONT_UNLOAD && fontLoader != null &&
             fontLoader.isFontLoaded(mFontFamily)) {
             mDirty = true;