package org.emdev.common.fonts; import android.util.SparseArray; import java.io.File; import java.lang.ref.WeakReference; import org.emdev.common.fonts.data.FontFamilyType; import org.emdev.common.fonts.data.FontInfo; import org.emdev.common.fonts.data.FontPack; import org.emdev.common.fonts.data.FontStyle; import org.emdev.common.fonts.typeface.TypefaceEx; import org.emdev.utils.LengthUtils; import org.emdev.utils.enums.EnumUtils; public class FontManager { public static SystemFontProvider system; public static AssetsFontProvider assets; public static ExtStorageFontProvider external; private static final SparseArray<WeakReference<TypefaceEx>> fonts = new SparseArray<WeakReference<TypefaceEx>>(); public static void init(final File storage) { try { system = new SystemFontProvider(); assets = new AssetsFontProvider(); external = new ExtStorageFontProvider(storage); system.init(); assets.init(); external.init(); } catch (VerifyError ex) { ex.printStackTrace(); throw ex; } } public static TypefaceEx getFont(final String fontAndFamily, final FontFamilyType defaultFamily, final FontStyle style) { final String[] arr = LengthUtils.safeString(fontAndFamily).split(","); final String fontPackName = arr[0].trim(); final FontFamilyType type = getFontFamily(arr, defaultFamily); FontPack fontPack = external.getFontPack(fontPackName); if (fontPack == null) { fontPack = assets.getFontPack(fontPackName); if (fontPack == null) { fontPack = system.getFontPack(SystemFontProvider.SYSTEM_FONT_PACK); } } final int id = TypefaceEx.calculateId(fontPack, type, style); final WeakReference<TypefaceEx> res = fonts.get(id); TypefaceEx result = res != null ? res.get() : null; if (result == null) { result = fontPack.getTypeface(type, style); fonts.put(id, new WeakReference<TypefaceEx>(result)); } return result; } public static String getExternalFont(final String fontAndFamily, final FontFamilyType defaultFamily, final FontStyle style) { final String[] arr = LengthUtils.safeString(fontAndFamily).split(","); final String fontPackName = arr[0].trim(); final FontFamilyType type = getFontFamily(arr, defaultFamily); final FontPack fontPack = external.getFontPack(fontPackName); if (fontPack != null) { return getExternalFont(fontPack, type, style); } return null; } public static String[] getExternalFonts(final String fontAndFamily, final FontFamilyType defaultFamily) { final FontStyle[] styles = FontStyle.values(); final String[] fonts = new String[styles.length]; final String[] arr = LengthUtils.safeString(fontAndFamily).split(","); final String fontPackName = arr[0].trim(); final FontFamilyType type = getFontFamily(arr, defaultFamily); final FontPack fontPack = external.getFontPack(fontPackName); if (fontPack != null) { for (int i = 0; i < styles.length; i++) { fonts[i] = getExternalFont(fontPack, type, styles[i]); } } return fonts; } protected static String getExternalFont(final FontPack fontPack, final FontFamilyType type, final FontStyle style) { final FontInfo font = fontPack.getFont(type, style); if (font == null) { return null; } final File fontFile = external.getFontFile(font); if (fontFile.exists()) { return fontFile.getAbsolutePath(); } return null; } protected static FontFamilyType getFontFamily(final String[] arr, final FontFamilyType defType) { FontFamilyType type = defType; if (arr.length > 1) { type = EnumUtils.getByResValue(FontFamilyType.class, arr[1].trim(), type); } return type; } }