package com.micabytes.util; import android.content.Context; import android.content.res.AssetManager; import android.databinding.BindingAdapter; import android.graphics.Typeface; import android.support.annotation.Nullable; import android.widget.TextView; import org.jetbrains.annotations.NonNls; import java.io.IOException; import java.util.HashMap; import java.util.Map; @SuppressWarnings("Singleton") public final class FontCache { private static final String TAG = FontCache.class.getName(); private static final char BACKSLASH = '/'; private static final char DOT = '.'; @NonNls private static final String FONT_DIR = "fonts"; private static final Map<String, Typeface> CACHE = new HashMap<>(); private static final Map<String, String> FONT_MAPPING = new HashMap<>(); private static FontCache instance = null; private Context context = null; public static FontCache getInstance(Context c) { if (instance == null) { instance = new FontCache(c.getApplicationContext()); } return instance; } public static void addFont(String name, String fontFilename) { FONT_MAPPING.put(name, fontFilename); } private FontCache(Context c) { context = c; AssetManager am = c.getResources().getAssets(); String[] fileList; try { fileList = am.list(FONT_DIR); } catch (IOException ignored) { GameLog.e(TAG, "Error loading fonts from assets/fonts."); return; } for (String filename : fileList) { @NonNls String alias = filename.substring(0, filename.lastIndexOf(DOT)); FONT_MAPPING.put(alias, filename); FONT_MAPPING.put(alias.toLowerCase(), filename); } } @Nullable public Typeface get(String fontName) { String fontFilename = FONT_MAPPING.get(fontName); if (fontFilename == null) { GameLog.e(TAG, "Couldn't find font " + fontName + ". Maybe you need to call addFont() first?"); return null; } if (CACHE.containsKey(fontFilename)) { return CACHE.get(fontFilename); } else { Typeface typeface = Typeface.createFromAsset(context.getAssets(), FONT_DIR + BACKSLASH + fontFilename); CACHE.put(fontFilename, typeface); return typeface; } } @BindingAdapter({"font"}) public static void setFont(TextView view, String fontName) { view.setTypeface(getInstance(view.getContext()).get(fontName)); } }