diff --git a/app/src/main/java/org/fcitx/fcitx5/android/input/popup/PopupComponent.kt b/app/src/main/java/org/fcitx/fcitx5/android/input/popup/PopupComponent.kt index 1b46ccb15..1e8e159ce 100644 --- a/app/src/main/java/org/fcitx/fcitx5/android/input/popup/PopupComponent.kt +++ b/app/src/main/java/org/fcitx/fcitx5/android/input/popup/PopupComponent.kt @@ -27,6 +27,9 @@ import splitties.views.dsl.core.add import splitties.views.dsl.core.frameLayout import splitties.views.dsl.core.lParams import java.util.LinkedList +import kotlinx.serialization.json.Json +import org.fcitx.fcitx5.android.utils.appContext +import java.io.File class PopupComponent : UniqueComponent(), Dependent, ManagedHandler by managedHandler() { @@ -62,6 +65,32 @@ class PopupComponent : private val rootLocation = intArrayOf(0, 0) private val rootBounds: Rect = Rect() + companion object { + private var lastModified = 0L + private var cachedPopupPreset: Map>? = null + val popupPresetJson: Map>? + @Synchronized + get() { + var file = File(appContext.getExternalFilesDir(null), "config/PopupPreset.json") + if (!file.exists()) { + cachedPopupPreset = null + return null + } + if (cachedPopupPreset == null || file.lastModified() != lastModified) { + try { + lastModified = file.lastModified() + val json = file.readText() + cachedPopupPreset = Json.decodeFromString>>(json) + .mapValues { it.value.toTypedArray() } + } catch (e: Exception) { + e.printStackTrace() + cachedPopupPreset = null + } + } + return cachedPopupPreset + } + } + val root by lazy { context.frameLayout { // we want (0, 0) at top left @@ -107,7 +136,7 @@ class PopupComponent : } private fun showKeyboard(viewId: Int, keyboard: KeyDef.Popup.Keyboard, bounds: Rect) { - val keys = PopupPreset[keyboard.label] ?: return + val keys = Companion.popupPresetJson?.get(keyboard.label) ?: PopupPreset[keyboard.label] ?: return // clear popup preview text OR create empty popup preview showingEntryUi[viewId]?.setText("") ?: showPopup(viewId, "", bounds) reallyShowKeyboard(viewId, keys, bounds)