From b11d3bdf811d4ee44a9b86f22d5d65388e1cf77a Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 11 Nov 2010 01:53:17 +0000 Subject: [PATCH] fonts catalog rescan has been added --- TODO.ExternalFonts | 1 - .../fbreader/preferences/FontOption.java | 2 +- .../ui/android/view/AndroidFontUtil.java | 39 +++++++++++++++---- .../android/view/ZLAndroidPaintContext.java | 4 +- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/TODO.ExternalFonts b/TODO.ExternalFonts index a78f84082..49c05af46 100644 --- a/TODO.ExternalFonts +++ b/TODO.ExternalFonts @@ -1,2 +1 @@ -* Пересканировать файлы шрифтов время от времени -- чтобы замечать добавившиеся * (?) Показывать названия шрифтов соответсвующими шрифтами diff --git a/src/org/geometerplus/android/fbreader/preferences/FontOption.java b/src/org/geometerplus/android/fbreader/preferences/FontOption.java index 1447401b7..539d25364 100644 --- a/src/org/geometerplus/android/fbreader/preferences/FontOption.java +++ b/src/org/geometerplus/android/fbreader/preferences/FontOption.java @@ -36,7 +36,7 @@ class FontOption extends ZLStringListPreference { myOption = option; final ArrayList fonts = new ArrayList(); - AndroidFontUtil.fillFamiliesList(fonts); + AndroidFontUtil.fillFamiliesList(fonts, true); setList((String[])fonts.toArray(new String[fonts.size()])); final String initialValue = AndroidFontUtil.realFontFamilyName(option.getValue()); diff --git a/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java b/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java index 2cab9eeba..697e6f463 100644 --- a/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java +++ b/src/org/geometerplus/zlibrary/ui/android/view/AndroidFontUtil.java @@ -56,18 +56,41 @@ public final class AndroidFontUtil { } private static Map ourFontMap; - public static Map getFontMap() { - if (ourFontMap == null) { + private static File[] ourFileList; + private static long myTimeStamp; + public static Map getFontMap(boolean forceReload) { + final long timeStamp = System.currentTimeMillis(); + if (forceReload && timeStamp < myTimeStamp + 1000) { + forceReload = false; + } + myTimeStamp = timeStamp; + if (ourFontMap == null || forceReload) { + boolean rebuildMap = ourFontMap == null; if (ourFontCreationMethod == null) { - ourFontMap = new HashMap(); + if (rebuildMap) { + ourFontMap = new HashMap(); + } } else { - ourFontMap = new ZLTTFInfoDetector().collectFonts(new File(Paths.FontsDirectoryOption().getValue()).listFiles( + final File[] fileList = new File(Paths.FontsDirectoryOption().getValue()).listFiles( new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".ttf") && !name.startsWith("."); } } - )); + ); + if (fileList == null) { + if (ourFileList != null) { + ourFileList = null; + rebuildMap = true; + } + } + if (fileList != null && !fileList.equals(ourFileList)) { + ourFileList = fileList; + rebuildMap = true; + } + if (rebuildMap) { + ourFontMap = new ZLTTFInfoDetector().collectFonts(fileList); + } } } return ourFontMap; @@ -83,7 +106,7 @@ public final class AndroidFontUtil { if ("monospace".equalsIgnoreCase(fontFamily) || "droid mono".equalsIgnoreCase(fontFamily)) { return "monospace"; } - for (String name : getFontMap().keySet()) { + for (String name : getFontMap(false).keySet()) { if (name.equalsIgnoreCase(fontFamily)) { return name; } @@ -91,11 +114,11 @@ public final class AndroidFontUtil { return "sans-serif"; } - public static void fillFamiliesList(ArrayList families) { + public static void fillFamiliesList(ArrayList families, boolean forceReload) { families.add("Droid Sans"); families.add("Droid Serif"); families.add("Droid Mono"); - families.addAll(getFontMap().keySet()); + families.addAll(getFontMap(forceReload).keySet()); Collections.sort(families); } } diff --git a/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidPaintContext.java b/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidPaintContext.java index ae257bdc0..fbfcc4002 100644 --- a/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidPaintContext.java +++ b/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidPaintContext.java @@ -116,7 +116,7 @@ public final class ZLAndroidPaintContext extends ZLPaintContext { } Typeface tf = typefaces[style]; if (tf == null) { - File[] files = AndroidFontUtil.getFontMap().get(family); + File[] files = AndroidFontUtil.getFontMap(false).get(family); if (files != null) { try { if (files[style] != null) { @@ -233,6 +233,6 @@ public final class ZLAndroidPaintContext extends ZLPaintContext { } protected void fillFamiliesList(ArrayList families) { - AndroidFontUtil.fillFamiliesList(families); + AndroidFontUtil.fillFamiliesList(families, false); } }