package org.emdev.common.fonts;
import android.graphics.Typeface;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
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.json.JSONArray;
import org.json.JSONException;
public abstract class AbstractCustomFontProvider extends AbstractFontProvider {
protected AbstractCustomFontProvider(int id, String name) {
super(id, name);
}
@Override
public TypefaceEx getTypeface(final FontPack fp, final FontFamilyType type, final FontStyle style) {
FontInfo font = fp.getFont(type, style);
Typeface target = null;
if (font != null) {
target = loadTypeface(type, font);
}
if (target == null) {
final FontStyle base = style.getBase();
if (base != style) {
font = fp.getFont(type, base);
if (font != null) {
target = loadTypeface(type, font);
}
}
}
if (target == null) {
return null;
}
final int st = style.getStyle();
final boolean fake = (st & Typeface.BOLD) != (target.getStyle() & Typeface.BOLD);
return new TypefaceEx(fp, type, style, target, fake);
}
@Override
protected List<FontPack> load() {
try {
return loadCatalog();
} catch (final Exception ex) {
ex.printStackTrace();
}
return Collections.emptyList();
}
protected List<FontPack> loadCatalog() throws IOException, JSONException {
final List<FontPack> list = new ArrayList<FontPack>();
final InputStream stream = openCatalog();
if (stream != null) {
final BufferedReader in = new BufferedReader(new InputStreamReader(stream));
try {
final StringBuilder buf = new StringBuilder();
for (String s = in.readLine(); s != null; s = in.readLine()) {
buf.append(s).append("\n");
}
final JSONArray arr = new JSONArray(buf.toString());
for (int i = 0, n = arr.length(); i < n; i++) {
list.add(new FontPack(this, arr.getJSONObject(i)));
}
} finally {
try {
in.close();
} catch (final Exception ex) {
}
}
}
return list;
}
protected final JSONArray fromJSON(final InputStream stream) throws IOException, JSONException {
final StringBuilder buf = new StringBuilder();
final BufferedReader in = new BufferedReader(new InputStreamReader(stream));
for (String s = in.readLine(); s != null; s = in.readLine()) {
buf.append(s).append("\n");
}
return new JSONArray(buf.toString());
}
protected final JSONArray toJSON() throws JSONException {
JSONArray arr = new JSONArray();
for (FontPack fp : packs.values()) {
arr.put(fp.toJSON());
}
return arr;
}
protected abstract InputStream openCatalog() throws IOException;
protected abstract Typeface loadTypeface(final FontFamilyType type, FontInfo fi);
public abstract InputStream openInputFontStream(FontInfo fi) throws IOException;
public abstract OutputStream openOutputFontStream(FontInfo fi) throws IOException;
}