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 e7a6e8219dab46..8a90535223f67d 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 3e58370518ab69..b003fb1d3a2ed8 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.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 String getJSMainModuleName() { } @Override - public @Nullable String getBundleAssetName() { + public String getBundleAssetName() { return "RNTesterApp.android.bundle"; } @@ -46,6 +45,12 @@ public List getPackages() { } }; + @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 00000000000000..c38d8f34a0eae9 --- /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 00000000000000..01a5bcb5d30f23 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 00000000000000..4db47aaad380e3 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 a29fc01cb88543..82d77d3427217e 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 7b5f33cc32b763..c3cc40afea4b5b 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 CustomStyleSpan( int fontStyle, int fontWeight, @Nullable String fontFamily, - AssetManager assetManager) { + @NonNull AssetManager assetManager) { mStyle = fontStyle; mWeight = fontWeight; mFontFamily = fontFamily; @@ -52,7 +53,7 @@ public void updateDrawState(TextPaint ds) { } @Override - public void updateMeasureState(TextPaint paint) { + public void updateMeasureState(@NonNull TextPaint paint) { apply(paint, mStyle, mWeight, mFontFamily, mAssetManager); } @@ -116,5 +117,4 @@ private static void apply( } 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 41faa061a91333..66017625138172 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 static ReactFontManager getInstance() { return sReactFontManagerInstance; } - public - @Nullable Typeface getTypeface( + public @Nullable Typeface getTypeface( String fontFamilyName, int style, AssetManager assetManager) { @@ -60,6 +64,13 @@ public static ReactFontManager getInstance() { 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 static ReactFontManager getInstance() { 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