Broken fonts should now be detected correctly.

This commit is contained in:
Constantin A 2018-05-01 09:45:08 +02:00
parent dc4e60cd7a
commit a216310a0b
2 changed files with 36 additions and 7 deletions

View file

@ -38,6 +38,10 @@ android {
} }
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
} }
dependencies { dependencies {

View file

@ -1,6 +1,6 @@
package de.c1710.filemojicompat; package de.c1710.filemojicompat;
/* /*
* Original file (https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java): * Adapted from https://android.googlesource.com/platform/frameworks/support/+/master/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
* Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2017 The Android Open Source Project
* Modifications Copyright (C) 2018 Constantin A. * Modifications Copyright (C) 2018 Constantin A.
* *
@ -20,6 +20,7 @@ package de.c1710.filemojicompat;
import android.content.Context; import android.content.Context;
import android.content.res.AssetManager; import android.content.res.AssetManager;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Build;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
import android.support.text.emoji.EmojiCompat; import android.support.text.emoji.EmojiCompat;
@ -29,6 +30,8 @@ import android.util.Log;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
/** /**
@ -44,7 +47,8 @@ public class FileEmojiCompatConfig extends EmojiCompat.Config {
/** /**
* This boolean indicates whether the fallback solution is used. * This boolean indicates whether the fallback solution is used.
*/ */
private final boolean fallback; private boolean fallback;
private static final HashMap<File, InitRunnable.EmojiFontFailListener> listeners = new HashMap<>(1);
/** /**
* Create a new configuration for this EmojiCompat * Create a new configuration for this EmojiCompat
@ -67,7 +71,8 @@ public class FileEmojiCompatConfig extends EmojiCompat.Config {
// NEW // NEW
@NonNull File fontFile) { @NonNull File fontFile) {
super(new FileMetadataLoader(context, fontFile)); super(new FileMetadataLoader(context, fontFile));
fallback = !fontFile.exists() || !fontFile.canRead(); // The InitRunable needs to find this config if it fails.
listeners.put(fontFile, this::onFailed);
} }
@Override @Override
@ -77,11 +82,19 @@ public class FileEmojiCompatConfig extends EmojiCompat.Config {
} }
else { else {
super.setReplaceAll(false); super.setReplaceAll(false);
Log.w(TAG, "setReplaceAll: Cannot replace all emojis. Fallback font is active"); if(replaceAll) {
// If replaceAll would have been set to false anyway, there's no need for apologizing.
Log.w(TAG, "setReplaceAll: Cannot replace all emojis. Fallback font is active");
}
} }
return this; return this;
} }
private void onFailed() {
fallback = true;
setReplaceAll(false);
}
/** /**
* This is the MetadataLoader. Derived from BundledMetadataLoader but with * This is the MetadataLoader. Derived from BundledMetadataLoader but with
* the addition of a custom file name. * the addition of a custom file name.
@ -91,9 +104,9 @@ public class FileEmojiCompatConfig extends EmojiCompat.Config {
// NEW // NEW
private final File fontFile; private final File fontFile;
private FileMetadataLoader(@NonNull Context context, private FileMetadataLoader(@NonNull Context context,
// NEW // NEW
File fontFile) { File fontFile) {
this.mContext = context.getApplicationContext(); this.mContext = context.getApplicationContext();
// NEW // NEW
this.fontFile = fontFile; this.fontFile = fontFile;
@ -142,6 +155,14 @@ public class FileEmojiCompatConfig extends EmojiCompat.Config {
catch (Throwable t) { catch (Throwable t) {
// Instead of crashing, this one will first try to load the fallback font // Instead of crashing, this one will first try to load the fallback font
try { try {
/*
This solution is very bad but it's impossible to not use such a solution since
EmojiCompat.Config is very restricted.
*/
if(listeners.containsKey(FONT_FILE)) {
listeners.get(FONT_FILE).onFailed();
}
android.util.Log.w(TAG, "Error while loading the font file.", t);
final AssetManager assetManager = context.getAssets(); final AssetManager assetManager = context.getAssets();
final MetadataRepo resourceIndex = final MetadataRepo resourceIndex =
MetadataRepo.create(assetManager, "NoEmojiCompat.ttf"); MetadataRepo.create(assetManager, "NoEmojiCompat.ttf");
@ -151,5 +172,9 @@ public class FileEmojiCompatConfig extends EmojiCompat.Config {
} }
} }
} }
interface EmojiFontFailListener {
void onFailed();
}
} }
} }