From 8ad40e11906f44ccf44bbb78fbe400a25c93e925 Mon Sep 17 00:00:00 2001 From: rhunk <101876869+rhunk@users.noreply.github.com> Date: Tue, 28 May 2024 19:03:24 +0200 Subject: [PATCH] feat(native): custom emoji font --- native/jni/src/common.h | 1 + native/jni/src/hooks/custom_emoji_font.h | 14 ++++++++++++++ native/jni/src/library.cpp | 12 ++++++++++++ .../me/rhunk/snapenhance/nativelib/NativeConfig.kt | 1 + 4 files changed, 28 insertions(+) create mode 100644 native/jni/src/hooks/custom_emoji_font.h diff --git a/native/jni/src/common.h b/native/jni/src/common.h index 6a8c5d81..cab6ac38 100644 --- a/native/jni/src/common.h +++ b/native/jni/src/common.h @@ -13,6 +13,7 @@ typedef struct { bool disable_bitmoji; bool disable_metrics; bool composer_hooks; + char custom_emoji_font_path[256]; } native_config_t; namespace common { diff --git a/native/jni/src/hooks/custom_emoji_font.h b/native/jni/src/hooks/custom_emoji_font.h new file mode 100644 index 00000000..8e0a8c2e --- /dev/null +++ b/native/jni/src/hooks/custom_emoji_font.h @@ -0,0 +1,14 @@ +#pragma once + +namespace CustomEmojiFont { + HOOK_DEF(int, open_hook, const char *pathname, int flags, mode_t mode) { + if (strstr(pathname, "/system/fonts/NotoColorEmoji.ttf") != 0 && common::native_config->custom_emoji_font_path[0] != 0) { + pathname = common::native_config->custom_emoji_font_path; + } + return open_hook_original(pathname, flags, mode); + } + + void init() { + DobbyHook((void *) DobbySymbolResolver("libc.so", "open"), (void *)open_hook, (void **)&open_hook_original); + } +} \ No newline at end of file diff --git a/native/jni/src/library.cpp b/native/jni/src/library.cpp index 3c4570c9..d4780d63 100644 --- a/native/jni/src/library.cpp +++ b/native/jni/src/library.cpp @@ -11,6 +11,7 @@ #include "hooks/sqlite_mutex.h" #include "hooks/duplex_hook.h" #include "hooks/composer_hook.h" +#include "hooks/custom_emoji_font.h" bool JNICALL init(JNIEnv *env, jobject clazz) { LOGD("Initializing native"); @@ -38,6 +39,9 @@ bool JNICALL init(JNIEnv *env, jobject clazz) { RUN(FstatHook::init()); RUN(SqliteMutexHook::init()); RUN(DuplexHook::init(env)); + if (common::native_config->custom_emoji_font_path[0] != 0) { + RUN(CustomEmojiFont::init()); + } if (common::native_config->composer_hooks) { RUN(ComposerHook::init()); } @@ -58,6 +62,14 @@ void JNICALL load_config(JNIEnv *env, jobject, jobject config_object) { native_config->disable_bitmoji = GET_CONFIG_BOOL("disableBitmoji"); native_config->disable_metrics = GET_CONFIG_BOOL("disableMetrics"); native_config->composer_hooks = GET_CONFIG_BOOL("composerHooks"); + + memset(native_config->custom_emoji_font_path, 0, sizeof(native_config->custom_emoji_font_path)); + auto custom_emoji_font_path = env->GetObjectField(config_object, env->GetFieldID(native_config_clazz, "customEmojiFontPath", "Ljava/lang/String;")); + if (custom_emoji_font_path != nullptr) { + auto custom_emoji_font_path_str = env->GetStringUTFChars((jstring) custom_emoji_font_path, nullptr); + strncpy(native_config->custom_emoji_font_path, custom_emoji_font_path_str, sizeof(native_config->custom_emoji_font_path)); + env->ReleaseStringUTFChars((jstring) custom_emoji_font_path, custom_emoji_font_path_str); + } } void JNICALL lock_database(JNIEnv *env, jobject, jstring database_name, jobject runnable) { diff --git a/native/src/main/kotlin/me/rhunk/snapenhance/nativelib/NativeConfig.kt b/native/src/main/kotlin/me/rhunk/snapenhance/nativelib/NativeConfig.kt index 3d02f3f6..17d64622 100644 --- a/native/src/main/kotlin/me/rhunk/snapenhance/nativelib/NativeConfig.kt +++ b/native/src/main/kotlin/me/rhunk/snapenhance/nativelib/NativeConfig.kt @@ -4,4 +4,5 @@ data class NativeConfig( val disableBitmoji: Boolean = false, val disableMetrics: Boolean = false, val composerHooks: Boolean = false, + val customEmojiFontPath: String? = null, ) \ No newline at end of file