diff --git a/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java b/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java
index e7a6e8219da..8a90535223f 100644
--- a/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java
+++ b/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterActivity.java
@@ -8,7 +8,6 @@
package com.facebook.react.uiapp;
-import android.app.Activity;
import android.os.Bundle;
import com.facebook.react.ReactActivity;
diff --git a/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java
index 3e58370518a..b003fb1d3a2 100644
--- a/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java
+++ b/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java
@@ -15,12 +15,11 @@ import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
+import com.facebook.react.views.text.ReactFontManager;
import java.util.Arrays;
import java.util.List;
-import javax.annotation.Nullable;
-
public class RNTesterApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
@@ -29,7 +28,7 @@ public class RNTesterApplication extends Application implements ReactApplication
}
@Override
- public @Nullable String getBundleAssetName() {
+ public String getBundleAssetName() {
return "RNTesterApp.android.bundle";
}
@@ -46,6 +45,12 @@ public class RNTesterApplication extends Application implements ReactApplication
}
};
+ @Override
+ public void onCreate() {
+ ReactFontManager.getInstance().addCustomFont(this, "Srisakdi", R.font.srisakdi);
+ super.onCreate();
+ }
+
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
diff --git a/RNTester/android/app/src/main/res/font/srisakdi.xml b/RNTester/android/app/src/main/res/font/srisakdi.xml
new file mode 100644
index 00000000000..c38d8f34a0e
--- /dev/null
+++ b/RNTester/android/app/src/main/res/font/srisakdi.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/RNTester/android/app/src/main/res/font/srisakdi_bold.ttf b/RNTester/android/app/src/main/res/font/srisakdi_bold.ttf
new file mode 100755
index 00000000000..01a5bcb5d30
Binary files /dev/null and b/RNTester/android/app/src/main/res/font/srisakdi_bold.ttf differ
diff --git a/RNTester/android/app/src/main/res/font/srisakdi_regular.ttf b/RNTester/android/app/src/main/res/font/srisakdi_regular.ttf
new file mode 100755
index 00000000000..4db47aaad38
Binary files /dev/null and b/RNTester/android/app/src/main/res/font/srisakdi_regular.ttf differ
diff --git a/RNTester/js/TextExample.android.js b/RNTester/js/TextExample.android.js
index a29fc01cb88..82d77d34272 100644
--- a/RNTester/js/TextExample.android.js
+++ b/RNTester/js/TextExample.android.js
@@ -182,6 +182,14 @@ class TextExample extends React.Component<{}> {
NotoSerif Italic (Missing Font file)
+ Srisakdi Regular
+
+ Srisakdi Bold
+
diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java
index 7b5f33cc32b..c3cc40afea4 100644
--- a/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java
+++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java
@@ -7,14 +7,15 @@
package com.facebook.react.views.text;
-import javax.annotation.Nullable;
-
import android.content.res.AssetManager;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan {
/**
@@ -39,7 +40,7 @@ public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan {
int fontStyle,
int fontWeight,
@Nullable String fontFamily,
- AssetManager assetManager) {
+ @NonNull AssetManager assetManager) {
mStyle = fontStyle;
mWeight = fontWeight;
mFontFamily = fontFamily;
@@ -52,7 +53,7 @@ public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan {
}
@Override
- public void updateMeasureState(TextPaint paint) {
+ public void updateMeasureState(@NonNull TextPaint paint) {
apply(paint, mStyle, mWeight, mFontFamily, mAssetManager);
}
@@ -116,5 +117,4 @@ public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan {
}
paint.setSubpixelText(true);
}
-
}
diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java
index 41faa061a91..66017625138 100644
--- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java
+++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java
@@ -7,15 +7,18 @@
package com.facebook.react.views.text;
-import javax.annotation.Nullable;
-
import java.util.HashMap;
import java.util.Map;
+import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.util.SparseArray;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.res.ResourcesCompat;
+
/**
* Class responsible to load and cache Typeface objects. It will first try to load typefaces inside
* the assets/fonts folder and if it doesn't find the right Typeface in that folder will fall back
@@ -36,10 +39,12 @@ public class ReactFontManager {
private static ReactFontManager sReactFontManagerInstance;
- private Map mFontCache;
+ final private Map mFontCache;
+ final private Map mCustomTypefaceCache;
private ReactFontManager() {
mFontCache = new HashMap<>();
+ mCustomTypefaceCache = new HashMap<>();
}
public static ReactFontManager getInstance() {
@@ -49,8 +54,7 @@ public class ReactFontManager {
return sReactFontManagerInstance;
}
- public
- @Nullable Typeface getTypeface(
+ public @Nullable Typeface getTypeface(
String fontFamilyName,
int style,
AssetManager assetManager) {
@@ -60,6 +64,13 @@ public class ReactFontManager {
mFontCache.put(fontFamilyName, fontFamily);
}
+ if(mCustomTypefaceCache.containsKey(fontFamilyName)) {
+ return Typeface.create(
+ mCustomTypefaceCache.get(fontFamilyName),
+ style
+ );
+ }
+
Typeface typeface = fontFamily.getTypeface(style);
if (typeface == null) {
typeface = createTypeface(fontFamilyName, style, assetManager);
@@ -71,6 +82,20 @@ public class ReactFontManager {
return typeface;
}
+ /*
+ * This method allows you to load custom fonts from res/font folder as provided font family name.
+ * Fonts may be one of .ttf, .otf or XML (https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml).
+ * To support multiple font styles or weights, you must provide a font in XML format.
+ *
+ * ReactFontManager.getInstance().addCustomFont(this, "Srisakdi", R.font.srisakdi);
+ */
+ public void addCustomFont(@NonNull Context context, @NonNull String fontFamily, int fontId) {
+ Typeface font = ResourcesCompat.getFont(context, fontId);
+ if (font != null) {
+ mCustomTypefaceCache.put(fontFamily, font);
+ }
+ }
+
/**
* Add additional font family, or replace the exist one in the font memory cache.
* @param style