diff --git a/app/src/main/java/om/sstvencoder/EditTextActivity.java b/app/src/main/java/om/sstvencoder/EditTextActivity.java index dea7ea8..085f1ac 100644 --- a/app/src/main/java/om/sstvencoder/EditTextActivity.java +++ b/app/src/main/java/om/sstvencoder/EditTextActivity.java @@ -37,7 +37,6 @@ import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; -import java.util.ArrayList; import java.util.List; import om.sstvencoder.TextOverlay.Label; @@ -55,7 +54,7 @@ public class EditTextActivity extends AppCompatActivity public static final String EXTRA = "EDIT_TEXT_EXTRA"; private Label mLabel; private EditColorMode mEditColor; - private List mFontFilePathList; + private List mFontFamilyNameList; private CheckBox mEditItalic, mEditBold, mEditOutline; private int mClearTextButtonWidth; @@ -148,20 +147,10 @@ public class EditTextActivity extends AppCompatActivity private void initFontFamilySpinner(String familyName) { Spinner spinner = findViewById(R.id.edit_font_family); spinner.setOnItemSelectedListener(this); - mFontFilePathList = Utility.getSystemFontFilePaths(); - mFontFilePathList.add(0, Label.DEFAULT_FONT); - List fontFamilyNameList = getFontNames(mFontFilePathList); + mFontFamilyNameList = Utility.getSystemFontFamilyList(); spinner.setAdapter(new ArrayAdapter<>(this, - android.R.layout.simple_spinner_dropdown_item, fontFamilyNameList)); - spinner.setSelection(mFontFilePathList.indexOf(familyName)); - } - - private static List getFontNames(List fontFilePathList) { - List fontNameList = new ArrayList<>(); - for (String path : fontFilePathList) { - fontNameList.add(Utility.getFileNameWithoutExtension(path)); - } - return fontNameList; + android.R.layout.simple_spinner_dropdown_item, mFontFamilyNameList)); + spinner.setSelection(mFontFamilyNameList.indexOf(familyName)); } private void initTextSizeSpinner(float textSize) { @@ -227,7 +216,7 @@ public class EditTextActivity extends AppCompatActivity mLabel.setOutlineSize(positionToOutlineSize(position)); } else if (parentId == R.id.edit_font_family) { - mLabel.setFamilyName(mFontFilePathList.get(position)); + mLabel.setFamilyName(mFontFamilyNameList.get(position)); } } diff --git a/app/src/main/java/om/sstvencoder/TextOverlay/Label.java b/app/src/main/java/om/sstvencoder/TextOverlay/Label.java index 4fe1cd9..ecaff10 100644 --- a/app/src/main/java/om/sstvencoder/TextOverlay/Label.java +++ b/app/src/main/java/om/sstvencoder/TextOverlay/Label.java @@ -24,7 +24,6 @@ import java.lang.reflect.Modifier; public class Label implements Serializable { public static final float TEXT_SIZE_NORMAL = 2f; public static final float OUTLINE_SIZE_NORMAL = 0.05f; - public static final String DEFAULT_FONT = "Default"; private String mText; private float mTextSize, mOutlineSize; private String mFamilyName; diff --git a/app/src/main/java/om/sstvencoder/TextOverlay/LabelPainter.java b/app/src/main/java/om/sstvencoder/TextOverlay/LabelPainter.java index 46f37e3..8c6edee 100644 --- a/app/src/main/java/om/sstvencoder/TextOverlay/LabelPainter.java +++ b/app/src/main/java/om/sstvencoder/TextOverlay/LabelPainter.java @@ -23,9 +23,8 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; -import java.io.File; - import androidx.annotation.NonNull; +import om.sstvencoder.Utility; class LabelPainter { private interface IDrawer { @@ -134,10 +133,7 @@ class LabelPainter { private void setPaintSettings(float sizeFactor) { mPaint.setAlpha(255); try { - Typeface tf = Typeface.create( - createTypefaceFromFontFile(), - createTypefaceFromFontAttributes()); - mPaint.setTypeface(tf); + mPaint.setTypeface(createTypeface()); } catch (Exception ignore) { } setTextPaintSettings(); @@ -160,30 +156,22 @@ class LabelPainter { mPaint.setStrokeWidth(mLabel.getOutlineSize() * textSize); } - private Typeface createTypefaceFromFontFile() { - Typeface typeface = null; // Typeface.DEFAULT - String fontFilePath = mLabel.getFamilyName(); - - if (!fontFilePath.equalsIgnoreCase(Label.DEFAULT_FONT)) { - File fontFile = new File(fontFilePath); - if (fontFile.exists() && fontFile.canRead()) - typeface = Typeface.createFromFile(fontFilePath); - } - return typeface; - } - - private int createTypefaceFromFontAttributes() { - int typeface = Typeface.NORMAL; + private Typeface createTypeface() { + int style = Typeface.NORMAL; if (mLabel.getBold() && mLabel.getItalic()) - typeface = Typeface.BOLD_ITALIC; + style = Typeface.BOLD_ITALIC; else { if (mLabel.getBold()) - typeface = Typeface.BOLD; + style = Typeface.BOLD; else if (mLabel.getItalic()) - typeface = Typeface.ITALIC; + style = Typeface.ITALIC; } - return typeface; + + String fontFilePath = Utility.getFontFilePath(mLabel.getFamilyName(), style); + Typeface family = Typeface.createFromFile(fontFilePath); + + return Typeface.create(family, style); } } diff --git a/app/src/main/java/om/sstvencoder/Utility.java b/app/src/main/java/om/sstvencoder/Utility.java index 33ec634..52048c2 100644 --- a/app/src/main/java/om/sstvencoder/Utility.java +++ b/app/src/main/java/om/sstvencoder/Utility.java @@ -18,7 +18,10 @@ package om.sstvencoder; import android.content.Context; import android.content.Intent; import android.graphics.Rect; + import androidx.exifinterface.media.ExifInterface; + +import android.graphics.Typeface; import android.net.Uri; import android.os.Build; import android.os.Environment; @@ -33,8 +36,9 @@ import java.util.Date; import java.util.List; import java.util.Locale; -final class Utility { - static final String DIRECTORY_SYSTEM_FONTS = "/system/fonts"; +public final class Utility { + private static final String DIRECTORY_SYSTEM_FONTS = "/system/fonts"; + private static final String DEFAULT_FONT_FAMILY = "Default"; @NonNull static Rect getEmbeddedRect(int w, int h, int iw, int ih) { @@ -118,31 +122,93 @@ final class Utility { return Environment.MEDIA_MOUNTED.equals(state); } - static List getSystemFontFilePaths() { - List fontList = new ArrayList<>(); + static List getSystemFontFamilyList() { + List fontFamilyNameList = new ArrayList<>(); File fontsDir = new File(DIRECTORY_SYSTEM_FONTS); - String fontFileExtension = ".ttf"; if (fontsDir.exists() && fontsDir.isDirectory()) { File[] files = fontsDir.listFiles(); if (files != null) { for (File file : files) { - if (file.isFile() && file.getName().endsWith(fontFileExtension)) { - fontList.add(file.getAbsolutePath()); + String fileName = file.getName(); + if (file.isFile() && isSupportedFontFileFormat(fileName)) { + String fontFamilyName = getFontFamilyName(fileName); + if (!fontFamilyNameList.contains(fontFamilyName)) + fontFamilyNameList.add(fontFamilyName); } } } } - return fontList; + + fontFamilyNameList.add(0, Utility.DEFAULT_FONT_FAMILY); + return fontFamilyNameList; } - static String getFileNameWithoutExtension(String filePath) { - File file = new File(filePath); - String fileName = file.getName(); - int dotIndex = fileName.lastIndexOf('.'); - if (dotIndex > 0 && dotIndex < fileName.length() - 1) { - return fileName.substring(0, dotIndex); + private static boolean isSupportedFontFileFormat(String fileName) { + return fileName.endsWith(".ttf") || fileName.endsWith(".otf"); + } + + private static String getFontFamilyName(String fileName) { + String fontFamilyName = fileName; + int lastIndex = fileName.length() - 1; + + int charIndex = fileName.indexOf('-'); + if (0 < charIndex && charIndex < lastIndex) { + fontFamilyName = fileName.substring(0, charIndex); + } else { + charIndex = fileName.lastIndexOf('.'); + if (0 < charIndex && charIndex < lastIndex) { + fontFamilyName = fileName.substring(0, charIndex); + } } - return fileName; + return fontFamilyName; + } + + public static String getFontFilePath(String fontFamilyName, int style) { + List fontFamilyFilePathList = getFontFamilyFilePathList(fontFamilyName); + String fontFilePath = fontFamilyFilePathList.get(0); + + String styleString = getFontFileStyleString(style); + if (!styleString.isEmpty()) { + for (String path : fontFamilyFilePathList) { + if (path.contains(styleString)) { + fontFilePath = path; + break; + } + } + } + return fontFilePath; + } + + private static List getFontFamilyFilePathList(String fontFamilyName) { + List fontFamilyFilePathList = new ArrayList<>(); + File fontsDir = new File(DIRECTORY_SYSTEM_FONTS); + + if (fontsDir.exists() && fontsDir.isDirectory()) { + File[] files = fontsDir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + String path = file.getAbsolutePath(); + if (path.contains(fontFamilyName)) { + fontFamilyFilePathList.add(path); + } + } + } + } + } + return fontFamilyFilePathList; + } + + private static String getFontFileStyleString(int style) { + if (style == Typeface.NORMAL) + return "-Regular"; + if (style == Typeface.BOLD_ITALIC) + return "-BoldItalic"; + if (style == Typeface.BOLD) + return "-Bold"; + if (style == Typeface.ITALIC) + return "-Italic"; + return ""; } }