package org.emdev.common.fonts; import android.graphics.Typeface; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.emdev.common.fonts.data.FontFamily; import org.emdev.common.fonts.data.FontFamilyType; import org.emdev.common.fonts.data.FontInfo; import org.emdev.common.fonts.data.FontPack; import org.emdev.utils.FileUtils; public class BaseExtStorageFontProvider extends AbstractCustomFontProvider { private final File fontsFolder; private final File fontsCatalog; public BaseExtStorageFontProvider(final File targetAppStorage) { super(2, "External"); fontsFolder = new File(targetAppStorage, "fonts"); fontsFolder.mkdirs(); fontsCatalog = new File(fontsFolder, "fonts.jso"); } @Override protected final InputStream openCatalog() throws IOException { return fontsCatalog.exists() ? new FileInputStream(fontsCatalog) : null; } @Override protected Typeface loadTypeface(final FontFamilyType type, final FontInfo fi) { final File f = getFontFile(fi); try { return f.exists() ? Typeface.create(type.getResValue(), fi.style.getStyle()) : null; } catch (final Throwable th) { th.printStackTrace(); } return null; } public final boolean hasInstalled() { return fontsCatalog.exists(); } public final File getFontFile(final FontInfo fi) { return fi.path.startsWith("/") ? new File(fi.path) : new File(fontsFolder, fi.path); } @Override protected final boolean save() { try { final FileWriter fw = new FileWriter(fontsCatalog); final BufferedWriter out = new BufferedWriter(fw); try { out.write(toJSON().toString(4)); return true; } catch (final Exception ex) { ex.printStackTrace(); } finally { try { out.close(); } catch (final IOException ex) { } } } catch (final IOException ex) { ex.printStackTrace(); } return false; } @Override public final InputStream openInputFontStream(final FontInfo fi) throws IOException { return new FileInputStream(getFontFile(fi)); } @Override public final OutputStream openOutputFontStream(final FontInfo fi) throws IOException { final File ff = getFontFile(fi); ff.getParentFile().mkdirs(); return new FileOutputStream(ff); } public final boolean install(final FontPack selectedPack) { final AbstractCustomFontProvider source = (AbstractCustomFontProvider) selectedPack.provider; final FontPack newfp = new FontPack(this, selectedPack); final FontPack oldfp = packs.put(newfp.name, newfp); if (oldfp != null) { removeImpl(oldfp); } for (final FontFamily family : newfp) { for (final FontInfo fi : family) { try { FileUtils.copy(source.openInputFontStream(fi), this.openOutputFontStream(fi)); } catch (final IOException ex) { ex.printStackTrace(); } } } return this.save(); } public final boolean uninstall(final FontPack fontPack) { if (packs.containsKey(fontPack.name)) { removeImpl(fontPack); return this.save(); } return false; } private final void removeImpl(final FontPack oldfp) { for (final FontFamily family : oldfp) { for (final FontInfo fi : family) { final File f = getFontFile(fi); if (f.exists()) { f.delete(); } } } } }