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 c622aa1b84..28b5c7aa95 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 @@ -15,6 +15,11 @@ object ThemeManager { fun onThemeChange(theme: Theme) } + private const val SHARE_TYPE = "SHARE" + private const val USER_TYPE = "USER" + const val DEFAULT_THEME = "trime" + const val TONGWENFENG_THEME = "tongwenfeng" + /** * Update sharedThemes and userThemes. */ @@ -32,27 +37,56 @@ object ThemeManager { private fun listThemes(path: File): MutableList { return path.listFiles { _, name -> name.endsWith("trime.yaml") } ?.mapNotNull { f -> - if (f.name == "trime.yaml") "trime" else f.name.substringBeforeLast(".trime.yaml") + getThemeName(f) } ?.toMutableList() ?: mutableListOf() } - private val sharedThemes: MutableList get() = listThemes(DataManager.sharedDataDir) + private fun getThemeName(f: File): String { + val name = f.name.substringBeforeLast(".trime.yaml") + return if (name == "trime.yaml") { + "trime" + } else { + name + } + } + + private fun getSharedThemes(): List = listThemes(DataManager.sharedDataDir).sorted() - private val userThemes: MutableList get() = listThemes(DataManager.userDataDir) + private fun getUserThemes(): List = listThemes(DataManager.userDataDir).sorted() - fun getAllThemes(): List { + fun getAllThemes(): List> { + val userThemes = getUserThemes() if (DataManager.sharedDataDir.absolutePath == DataManager.userDataDir.absolutePath) { - return userThemes + return userThemes.map { Pair(it, USER_TYPE) } + } + + // if same theme exists in both user & share dir, user dir will be used + val allThemes = userThemes.map { Pair(it, USER_TYPE) }.toMutableList() + getSharedThemes().forEach { + if (!userThemes.contains(it)) { + allThemes.add(Pair(it, SHARE_TYPE)) + } + } + + return allThemes.also { + moveThemeToFirst(it, TONGWENFENG_THEME) + moveThemeToFirst(it, DEFAULT_THEME) + } + } + + private fun moveThemeToFirst( + themes: MutableList>, + themeName: String, + ) { + val defaultThemeIdx = themes.indexOfFirst { it.first == themeName } + if (defaultThemeIdx > 0) { + val pair = themes.removeAt(defaultThemeIdx) + themes.add(0, pair) } - return sharedThemes + userThemes } private fun refreshThemes() { - sharedThemes.clear() - userThemes.clear() - sharedThemes.addAll(listThemes(DataManager.sharedDataDir)) - userThemes.addAll(listThemes(DataManager.userDataDir)) } // 在初始化 ColorManager 时会被赋值 @@ -76,4 +110,8 @@ object ThemeManager { TabManager.refresh() } } + + fun isUserTheme(theme: Pair): Boolean { + return theme.second == USER_TYPE + } } diff --git a/app/src/main/java/com/osfans/trime/ui/main/settings/ThemePickerDialog.kt b/app/src/main/java/com/osfans/trime/ui/main/settings/ThemePickerDialog.kt index cbedbb92c0..046cab3917 100644 --- a/app/src/main/java/com/osfans/trime/ui/main/settings/ThemePickerDialog.kt +++ b/app/src/main/java/com/osfans/trime/ui/main/settings/ThemePickerDialog.kt @@ -26,15 +26,19 @@ object ThemePickerDialog { } val allNames = all.map { - when (it) { - "trime" -> context.getString(R.string.theme_trime) - "tongwenfeng" -> context.getString(R.string.theme_tongwenfeng) - else -> it + when (val themeName = it.first) { + ThemeManager.DEFAULT_THEME -> context.getString(R.string.theme_trime) + ThemeManager.TONGWENFENG_THEME -> context.getString(R.string.theme_tongwenfeng) + else -> + if (ThemeManager.isUserTheme(it)) { + themeName + } else { + "[${context.getString(R.string.share)}] $themeName" + } } } - val current = - AppPrefs.defaultInstance().theme.selectedTheme - val currentIndex = all.indexOfFirst { it == current }.coerceAtLeast(0) + val current = AppPrefs.defaultInstance().theme.selectedTheme + val currentIndex = all.indexOfFirst { it.first == current }.coerceAtLeast(0) return AlertDialog.Builder(context).apply { setTitle(R.string.looks__selected_theme_title) if (allNames.isEmpty()) { @@ -48,7 +52,7 @@ object ThemePickerDialog { dialog.dismiss() withContext(Dispatchers.IO) { copyThemeFile(context, all[which]) - ThemeManager.setNormalTheme(all[which]) + ThemeManager.setNormalTheme(all[which].first) } } } @@ -59,14 +63,35 @@ object ThemePickerDialog { private suspend fun copyThemeFile( context: Context, - selectedName: String, + selectedTheme: Pair, ) { - val fileNameWithoutExt = if (selectedName == "trime") selectedName else "$selectedName.trime" + val themeName = selectedTheme.first + val fileNameWithoutExt = + if (themeName == "trime") { + "trime" + } else { + "$themeName.trime" + } + + val profile = AppPrefs.defaultInstance().profile + val uri = + if (ThemeManager.isUserTheme(selectedTheme)) { + profile.userDataDirUri + } else { + profile.sharedDataDirUri + } + + val targetPath = + if (ThemeManager.isUserTheme(selectedTheme)) { + profile.getAppUserDir() + } else { + profile.getAppShareDir() + } - val sync = FolderSync(context, AppPrefs.defaultInstance().profile.userDataDirUri) + val sync = FolderSync(context, uri) sync.copyFiles( arrayOf("$fileNameWithoutExt.yaml", "$fileNameWithoutExt.custom.yaml"), - AppPrefs.Profile.getAppPath(), + targetPath, ) } } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 237f316ab8..ff9ac7a49d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -289,4 +289,5 @@ SPDX-License-Identifier: GPL-3.0-or-later 默认 同文风 清除 + 共享 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 569d167cac..238a03e159 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -290,4 +290,5 @@ SPDX-License-Identifier: GPL-3.0-or-later 預設 同文風 清除 + 共享 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af010780de..799349e056 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -291,4 +291,5 @@ SPDX-License-Identifier: GPL-3.0-or-later default tongwenfeng Clear + Share