Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4696a13

Browse files
committed
New option to toggle emoji filtering in picker
1 parent adadaa8 commit 4696a13

File tree

4 files changed

+60
-31
lines changed

4 files changed

+60
-31
lines changed

app/src/main/java/org/fcitx/fcitx5/android/data/prefs/AppPrefs.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@ class AppPrefs(private val sharedPreferences: SharedPreferences) {
346346
}
347347

348348
inner class Symbols : ManagedPreferenceCategory(R.string.emoji_and_symbols, sharedPreferences) {
349+
val hideUnsupportedEmojis = switch(
350+
R.string.hide_unsupported_emojis,
351+
"hide_unsupported_emojis",
352+
true
353+
)
354+
349355
val defaultEmojiSkinTone = enumList(
350356
R.string.default_emoji_skin_tone,
351357
"default_emoji_skin_tone",

app/src/main/java/org/fcitx/fcitx5/android/input/picker/PickerPagesAdapter.kt

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.text.TextPaint
88
import android.view.ViewGroup
99
import androidx.recyclerview.widget.RecyclerView
1010
import org.fcitx.fcitx5.android.data.RecentlyUsed
11+
import org.fcitx.fcitx5.android.data.prefs.AppPrefs
1112
import org.fcitx.fcitx5.android.data.theme.Theme
1213
import org.fcitx.fcitx5.android.input.keyboard.KeyActionListener
1314
import org.fcitx.fcitx5.android.input.popup.PopupActionListener
@@ -16,7 +17,7 @@ class PickerPagesAdapter(
1617
val theme: Theme,
1718
private val keyActionListener: KeyActionListener,
1819
private val popupActionListener: PopupActionListener,
19-
data: List<Pair<PickerData.Category, Array<String>>>,
20+
private val rawData: List<Pair<PickerData.Category, Array<String>>>,
2021
private val density: PickerPageUi.Density,
2122
recentlyUsedFileName: String,
2223
private val bordered: Boolean = false,
@@ -37,27 +38,51 @@ class PickerPagesAdapter(
3738
*/
3839
private val pages: MutableList<List<String>> = mutableListOf(listOf())
3940

40-
fun getCategoryList(): List<PickerData.Category> {
41-
return categories.map { it.first }
42-
}
43-
44-
init {
45-
val textPaint = TextPaint()
41+
private fun buildCategories(
42+
data: List<Pair<PickerData.Category, Array<String>>>,
43+
knowGraphOnly: Boolean = false
44+
) {
45+
val textPaint = if (knowGraphOnly) TextPaint() else null
4646
data.forEach { (cat, arr) ->
47-
val chunks = arr.filter { if (isEmoji) textPaint.hasGlyph(it) else true }
48-
.chunked(density.pageSize)
47+
val list = if (textPaint != null) {
48+
arr.filter { textPaint.hasGlyph(it) }
49+
} else {
50+
arr.toList()
51+
}
52+
val chunks = list.chunked(density.pageSize)
4953
categories.add(cat to IntRange(pages.size, pages.size + chunks.size - 1))
5054
pages.addAll(chunks)
5155
}
5256
}
5357

58+
init {
59+
buildCategories(
60+
rawData,
61+
isEmoji && AppPrefs.getInstance().symbols.hideUnsupportedEmojis.getValue()
62+
)
63+
}
64+
65+
fun rebuildCategories(knowGraphOnly: Boolean = false) {
66+
categories.clear()
67+
// empty "RecentlyUsed" category
68+
categories.add(PickerData.RecentlyUsedCategory to IntRange(0, 0))
69+
pages.clear()
70+
// empty "RecentlyUsed" page
71+
pages.add(emptyList())
72+
buildCategories(rawData, knowGraphOnly)
73+
}
74+
5475
private val recentlyUsed = RecentlyUsed(recentlyUsedFileName, density.pageSize)
5576

5677
fun insertRecent(text: String) {
5778
if (text.length == 1 && text[0].code.let { it in Digit || it in FullWidthDigit }) return
5879
recentlyUsed.insert(text)
5980
}
6081

82+
fun getCategoryList(): List<PickerData.Category> {
83+
return categories.map { it.first }
84+
}
85+
6186
fun getCategoryIndexOfPage(page: Int): Int {
6287
return categories.indexOfFirst { page in it.second }
6388
}

app/src/main/java/org/fcitx/fcitx5/android/input/picker/PickerWindow.kt

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@
55
package org.fcitx.fcitx5.android.input.picker
66

77
import android.annotation.SuppressLint
8-
import android.view.Gravity
98
import androidx.core.content.ContextCompat
10-
import androidx.transition.Slide
119
import androidx.transition.Transition
1210
import androidx.viewpager2.widget.ViewPager2
1311
import org.fcitx.fcitx5.android.data.prefs.AppPrefs
1412
import org.fcitx.fcitx5.android.data.prefs.ManagedPreference
1513
import org.fcitx.fcitx5.android.data.theme.ThemeManager
1614
import org.fcitx.fcitx5.android.input.broadcast.ReturnKeyDrawableComponent
17-
import org.fcitx.fcitx5.android.input.dependency.inputMethodService
1815
import org.fcitx.fcitx5.android.input.dependency.theme
1916
import org.fcitx.fcitx5.android.input.keyboard.CommonKeyActionListener
2017
import org.fcitx.fcitx5.android.input.keyboard.KeyAction
@@ -44,7 +41,6 @@ class PickerWindow(
4441
Emoticon
4542
}
4643

47-
private val service by manager.inputMethodService()
4844
private val theme by manager.theme()
4945
private val windowManager: InputWindowManager by manager.must()
5046
private val commonKeyActionListener: CommonKeyActionListener by manager.must()
@@ -56,19 +52,9 @@ class PickerWindow(
5652
private lateinit var pickerLayout: PickerLayout
5753
private lateinit var pickerPagesAdapter: PickerPagesAdapter
5854

59-
override fun enterAnimation(lastWindow: InputWindow): Transition? {
60-
// disable animation switching between keyboard
61-
return if (lastWindow !is KeyboardWindow && lastWindow !is PickerWindow)
62-
Slide().apply { slideEdge = Gravity.BOTTOM }
63-
else null
64-
}
55+
override fun enterAnimation(lastWindow: InputWindow): Transition? = null
6556

66-
override fun exitAnimation(nextWindow: InputWindow): Transition? {
67-
// disable animation switching between keyboard
68-
return if (nextWindow !is KeyboardWindow && nextWindow !is PickerWindow)
69-
super.exitAnimation(nextWindow)
70-
else null
71-
}
57+
override fun exitAnimation(nextWindow: InputWindow): Transition? = null
7258

7359
private val keyActionListener = KeyActionListener { it, source ->
7460
when (it) {
@@ -118,10 +104,11 @@ class PickerWindow(
118104
}
119105
}
120106

107+
private val isEmoji = key === Key.Emoji
108+
121109
override fun onCreateView() = PickerLayout(context, theme, switchKey).apply {
122110
pickerLayout = this
123111
val bordered = followKeyBorder && keyBorder
124-
val isEmoji = key === Key.Emoji
125112
pickerPagesAdapter = PickerPagesAdapter(
126113
theme, keyActionListener, popupActionListener, data,
127114
density, key.name, bordered, isEmoji
@@ -162,7 +149,15 @@ class PickerWindow(
162149

163150
override fun onCreateBarExtension() = pickerLayout.tabsUi.root
164151

165-
private val skinTonePreference = AppPrefs.getInstance().symbols.defaultEmojiSkinTone
152+
val symbolPrefs = AppPrefs.getInstance().symbols
153+
private val hideUnsupportedEmojisPrefs = symbolPrefs.hideUnsupportedEmojis
154+
private val defaultEmojiSkinTonePrefs = symbolPrefs.defaultEmojiSkinTone
155+
156+
@SuppressLint("NotifyDataSetChanged")
157+
private val initDataListener = ManagedPreference.OnChangeListener<Any> { _, _ ->
158+
pickerPagesAdapter.rebuildCategories(hideUnsupportedEmojisPrefs.getValue())
159+
pickerPagesAdapter.notifyDataSetChanged()
160+
}.takeIf { isEmoji }
166161

167162
@SuppressLint("NotifyDataSetChanged")
168163
private val refreshPagesListener = ManagedPreference.OnChangeListener<Any> { _, _ ->
@@ -174,16 +169,18 @@ class PickerWindow(
174169
it.onReturnDrawableUpdate(returnKeyDrawable.resourceId)
175170
it.keyActionListener = keyActionListener
176171
}
177-
if (key === Key.Emoji) {
178-
skinTonePreference.registerOnChangeListener(refreshPagesListener)
172+
if (isEmoji) {
173+
hideUnsupportedEmojisPrefs.registerOnChangeListener(initDataListener!!)
174+
defaultEmojiSkinTonePrefs.registerOnChangeListener(refreshPagesListener)
179175
}
180176
}
181177

182178
override fun onDetached() {
183179
popup.dismissAll()
184180
pickerLayout.embeddedKeyboard.keyActionListener = null
185-
if (key === Key.Emoji) {
186-
skinTonePreference.unregisterOnChangeListener(refreshPagesListener)
181+
if (isEmoji) {
182+
hideUnsupportedEmojisPrefs.unregisterOnChangeListener(initDataListener!!)
183+
defaultEmojiSkinTonePrefs.unregisterOnChangeListener(refreshPagesListener)
187184
}
188185
}
189186

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,4 +314,5 @@
314314
<string name="emoji_skin_tone_type_4">🏽 Type-4</string>
315315
<string name="emoji_skin_tone_type_5">🏾 Type-5</string>
316316
<string name="emoji_skin_tone_type_6">🏿 Type-6</string>
317+
<string name="hide_unsupported_emojis">Hide unsupported Emojis</string>
317318
</resources>

0 commit comments

Comments
 (0)