diff --git a/app/src/main/java/com/osfans/trime/data/DataDirectoryChangeListener.kt b/app/src/main/java/com/osfans/trime/data/DataDirectoryChangeListener.kt deleted file mode 100644 index b37ae9dd5b..0000000000 --- a/app/src/main/java/com/osfans/trime/data/DataDirectoryChangeListener.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.osfans.trime.data - -/** - * Do something when data directory change. - */ -object DataDirectoryChangeListener { - // listener list - val directoryChangeListeners = mutableListOf() - - interface Listener { - fun onDataDirectoryChange() - } - - fun addDirectoryChangeListener(directoryChangeListener: DataDirectoryChangeListener.Listener) { - directoryChangeListeners.add(directoryChangeListener) - } - // do not remove - // 在 directoryChangeListeners 中存放单例类的情况下,不应该尝试调用remove,会导致ConcurrentModificationException -} diff --git a/app/src/main/java/com/osfans/trime/data/DataManager.kt b/app/src/main/java/com/osfans/trime/data/DataManager.kt index ebd2526411..1747acf8ad 100644 --- a/app/src/main/java/com/osfans/trime/data/DataManager.kt +++ b/app/src/main/java/com/osfans/trime/data/DataManager.kt @@ -3,6 +3,7 @@ package com.osfans.trime.data import com.blankj.utilcode.util.PathUtils import com.blankj.utilcode.util.ResourceUtils import com.osfans.trime.util.Const +import com.osfans.trime.util.WeakHashSet import timber.log.Timber import java.io.File @@ -12,6 +13,24 @@ object DataManager { val defaultDataDirectory = File(PathUtils.getExternalStoragePath(), "rime") + private val onDataDirChangeListeners = WeakHashSet() + + fun interface OnDataDirChangeListener { + fun onDataDirChange() + } + + fun addOnChangedListener(listener: OnDataDirChangeListener) { + onDataDirChangeListeners.add(listener) + } + + fun removeOnChangedListener(listener: OnDataDirChangeListener) { + onDataDirChangeListeners.remove(listener) + } + + fun dirFireChange() { + onDataDirChangeListeners.forEach { it.onDataDirChange() } + } + @JvmStatic val sharedDataDir get() = File(prefs.profile.sharedDataDir) diff --git a/app/src/main/java/com/osfans/trime/data/opencc/OpenCCDictManager.kt b/app/src/main/java/com/osfans/trime/data/opencc/OpenCCDictManager.kt index 4c1c934ac9..be55809b45 100644 --- a/app/src/main/java/com/osfans/trime/data/opencc/OpenCCDictManager.kt +++ b/app/src/main/java/com/osfans/trime/data/opencc/OpenCCDictManager.kt @@ -1,6 +1,6 @@ package com.osfans.trime.data.opencc -import com.osfans.trime.data.DataDirectoryChangeListener +import androidx.annotation.Keep import com.osfans.trime.data.DataManager import com.osfans.trime.data.opencc.dict.Dictionary import com.osfans.trime.data.opencc.dict.OpenCCDictionary @@ -11,24 +11,26 @@ import java.io.File import java.io.InputStream import kotlin.system.measureTimeMillis -object OpenCCDictManager : DataDirectoryChangeListener.Listener { +object OpenCCDictManager { + /** + * Update sharedDir and userDir. + */ + @Keep + private val onDataDirChange = + DataManager.OnDataDirChangeListener { + sharedDir = File(DataManager.sharedDataDir, "opencc").also { it.mkdirs() } + userDir = File(DataManager.userDataDir, "opencc").also { it.mkdirs() } + } + init { System.loadLibrary("rime_jni") // register listener - DataDirectoryChangeListener.addDirectoryChangeListener(this) + DataManager.addOnChangedListener(onDataDirChange) } var sharedDir = File(DataManager.sharedDataDir, "opencc").also { it.mkdirs() } var userDir = File(DataManager.userDataDir, "opencc").also { it.mkdirs() } - /** - * Update sharedDir and userDir. - */ - override fun onDataDirectoryChange() { - sharedDir = File(DataManager.sharedDataDir, "opencc").also { it.mkdirs() } - userDir = File(DataManager.userDataDir, "opencc").also { it.mkdirs() } - } - fun sharedDictionaries(): List = sharedDir .listFiles() diff --git a/app/src/main/java/com/osfans/trime/data/sound/SoundThemeManager.kt b/app/src/main/java/com/osfans/trime/data/sound/SoundThemeManager.kt index 99c63d9071..9ca551ff95 100644 --- a/app/src/main/java/com/osfans/trime/data/sound/SoundThemeManager.kt +++ b/app/src/main/java/com/osfans/trime/data/sound/SoundThemeManager.kt @@ -1,27 +1,24 @@ package com.osfans.trime.data.sound +import androidx.annotation.Keep import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.YamlConfiguration import com.osfans.trime.data.AppPrefs -import com.osfans.trime.data.DataDirectoryChangeListener import com.osfans.trime.data.DataManager import timber.log.Timber import java.io.File -object SoundThemeManager : DataDirectoryChangeListener.Listener { +object SoundThemeManager { var userDir = File(DataManager.userDataDir, "sound") - init { - // register listener - DataDirectoryChangeListener.addDirectoryChangeListener(this) - } - /** * Update userDir. */ - override fun onDataDirectoryChange() { - userDir = File(DataManager.userDataDir, "sound") - } + @Keep + private val onDataDirChange = + DataManager.OnDataDirChangeListener { + userDir = File(DataManager.userDataDir, "sound") + } private val yaml = Yaml( @@ -64,6 +61,8 @@ object SoundThemeManager : DataDirectoryChangeListener.Listener { } fun init() { + // register listener + DataManager.addOnChangedListener(onDataDirChange) currentSoundTheme = getSound(AppPrefs.defaultInstance().keyboard.customSoundPackage) ?: return } diff --git a/app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt b/app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt index 009b46e19a..0919c83f3d 100644 --- a/app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt +++ b/app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt @@ -1,14 +1,26 @@ package com.osfans.trime.data.theme +import androidx.annotation.Keep import com.osfans.trime.data.AppPrefs -import com.osfans.trime.data.DataDirectoryChangeListener import com.osfans.trime.data.DataManager import java.io.File -object ThemeManager : DataDirectoryChangeListener.Listener { +object ThemeManager { + /** + * Update sharedThemes and userThemes. + */ + @Keep + private val onDataDirChange = + DataManager.OnDataDirChangeListener { + sharedThemes.clear() + userThemes.clear() + sharedThemes.addAll(listThemes(DataManager.sharedDataDir)) + userThemes.addAll(listThemes(DataManager.userDataDir)) + } + init { // register listener - DataDirectoryChangeListener.addDirectoryChangeListener(this) + DataManager.addOnChangedListener(onDataDirChange) } private fun listThemes(path: File): MutableList { @@ -22,17 +34,9 @@ object ThemeManager : DataDirectoryChangeListener.Listener { AppPrefs.defaultInstance().themeAndColor.selectedTheme = theme } - var sharedThemes: MutableList = listThemes(DataManager.sharedDataDir) + val sharedThemes: MutableList = listThemes(DataManager.sharedDataDir) - var userThemes: MutableList = listThemes(DataManager.userDataDir) - - /** - * Update sharedThemes and userThemes. - */ - override fun onDataDirectoryChange() { - sharedThemes = listThemes(DataManager.sharedDataDir) - userThemes = listThemes(DataManager.userDataDir) - } + val userThemes: MutableList = listThemes(DataManager.userDataDir) @JvmStatic fun getAllThemes(): List { diff --git a/app/src/main/java/com/osfans/trime/ime/core/RimeWrapper.kt b/app/src/main/java/com/osfans/trime/ime/core/RimeWrapper.kt index 0cab40acab..0a7b0152d2 100644 --- a/app/src/main/java/com/osfans/trime/ime/core/RimeWrapper.kt +++ b/app/src/main/java/com/osfans/trime/ime/core/RimeWrapper.kt @@ -3,7 +3,7 @@ package com.osfans.trime.ime.core import android.os.Looper import androidx.core.os.HandlerCompat import com.osfans.trime.core.Rime -import com.osfans.trime.data.DataDirectoryChangeListener +import com.osfans.trime.data.DataManager import com.osfans.trime.data.theme.Theme import com.osfans.trime.util.appContext import com.osfans.trime.util.isStorageAvailable @@ -67,9 +67,7 @@ object RimeWrapper { _statusStateFlow.value = Status.IN_PROGRESS mutex.unlock() - DataDirectoryChangeListener.directoryChangeListeners.forEach { - it.onDataDirectoryChange() - } + DataManager.dirFireChange() Rime.deploy()