Skip to content

Commit 1feb1ef

Browse files
committed
feat: add clipboard listening switch
1 parent 5d6715d commit 1feb1ef

File tree

5 files changed

+42
-9
lines changed

5 files changed

+42
-9
lines changed

app/src/main/java/com/osfans/trime/data/db/ClipboardHelper.kt

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ package com.osfans.trime.data.db
77
import android.content.ClipboardManager
88
import android.content.Context
99
import android.os.Build
10+
import androidx.annotation.Keep
1011
import androidx.room.Room
1112
import androidx.room.withTransaction
1213
import com.osfans.trime.data.prefs.AppPrefs
14+
import com.osfans.trime.data.prefs.PreferenceDelegate
1315
import com.osfans.trime.util.WeakHashSet
1416
import com.osfans.trime.util.matchesAny
1517
import com.osfans.trime.util.removeRegexSet
@@ -53,7 +55,23 @@ object ClipboardHelper :
5355

5456
private val clipPref = AppPrefs.defaultInstance().clipboard
5557

56-
private val limit by clipPref.clipboardLimit
58+
private val enabledPref = clipPref.clipboardListening
59+
60+
@Keep
61+
private val enabledListener = PreferenceDelegate.OnChangeListener<Boolean> { _, value ->
62+
if (value) {
63+
clipboardManager.addPrimaryClipChangedListener(this)
64+
} else {
65+
clipboardManager.removePrimaryClipChangedListener(this)
66+
}
67+
}
68+
69+
private val limitPref = clipPref.clipboardLimit
70+
71+
@Keep
72+
private val limitListener = PreferenceDelegate.OnChangeListener<Int> { _, _ ->
73+
launch { removeOutdated() }
74+
}
5775

5876
private val compareRules: Set<Regex> by lazy {
5977
val rules by clipPref.clipboardCompareRules
@@ -86,6 +104,10 @@ object ClipboardHelper :
86104
.addMigrations(Database.MIGRATION_3_4)
87105
.build()
88106
clbDao = clbDb.databaseDao()
107+
enabledListener.onChange(enabledPref.key, enabledPref.getValue())
108+
enabledPref.registerOnChangeListener(enabledListener)
109+
limitListener.onChange(limitPref.key, limitPref.getValue())
110+
limitPref.registerOnChangeListener(limitListener)
89111
launch { updateItemCount() }
90112
}
91113

@@ -135,9 +157,6 @@ object ClipboardHelper :
135157
* - [outputRules] 输出规则。如果剪贴板内容与规则匹配,则不通知剪贴板管理器。
136158
*/
137159
override fun onPrimaryClipChanged() {
138-
if (!(limit != 0 && this::clbDao.isInitialized)) {
139-
return
140-
}
141160
val clip = clipboardManager.primaryClip ?: return
142161
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
143162
val timestamp = clip.description.timestamp
@@ -183,6 +202,7 @@ object ClipboardHelper :
183202
}
184203

185204
private suspend fun removeOutdated() {
205+
val limit = limitPref.getValue()
186206
val unpinned = clbDao.getAllUnpinned()
187207
if (unpinned.size > limit) {
188208
val outdated =

app/src/main/java/com/osfans/trime/data/prefs/AppPrefs.kt

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,34 +241,44 @@ class AppPrefs(
241241
shared: SharedPreferences,
242242
) : PreferenceDelegateOwner(shared, R.string.clipboard) {
243243
companion object {
244+
const val CLIPBOARD_LISTENING = "clipboard_listening"
244245
const val CLIPBOARD_LIMIT = "clipboard_clipboard_limit"
245246
const val CLIPBOARD_COMPARE_RULES = "clipboard_clipboard_compare"
246247
const val CLIPBOARD_OUTPUT_RULES = "clipboard_clipboard_output"
247248
const val CLIPBOARD_SUGGESTION = "clipboard_suggestion"
248249
const val CLIPBOARD_SUGGESTION_TIMEOUT = "clipboard_suggestion_timeout"
249250
}
250-
val clipboardLimit = int(R.string.clipboard_limit, CLIPBOARD_LIMIT, 10)
251+
val clipboardListening = switch(R.string.clipboard_listening, CLIPBOARD_LISTENING, true)
252+
val clipboardLimit = int(
253+
R.string.clipboard_limit,
254+
CLIPBOARD_LIMIT,
255+
10,
256+
) { clipboardListening.getValue() }
251257
val clipboardCompareRules = editText(
252258
R.string.clipboard_compare_rules,
253259
CLIPBOARD_COMPARE_RULES,
254260
"",
255261
R.string.a_regular_expression_per_line,
256-
)
262+
) { clipboardListening.getValue() }
257263
val clipboardOutputRules = editText(
258264
R.string.clipboard_output_rules,
259265
CLIPBOARD_OUTPUT_RULES,
260266
"",
261267
R.string.a_regular_expression_per_line,
262-
)
263-
val clipboardSuggestion = switch(R.string.clipboard_suggestion, CLIPBOARD_SUGGESTION, true)
268+
) { clipboardListening.getValue() }
269+
val clipboardSuggestion = switch(
270+
R.string.clipboard_suggestion,
271+
CLIPBOARD_SUGGESTION,
272+
true,
273+
) { clipboardListening.getValue() }
264274
val clipboardSuggestionTimeout = int(
265275
R.string.clipboard_suggestion_timeout,
266276
CLIPBOARD_SUGGESTION_TIMEOUT,
267277
20,
268278
0,
269279
100,
270280
"s",
271-
) { clipboardSuggestion.getValue() }
281+
) { clipboardListening.getValue() && clipboardSuggestion.getValue() }
272282
}
273283

274284
/**

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,5 @@ SPDX-License-Identifier: GPL-3.0-or-later
237237
<string name="restored_from_x">已从 %1$s 中还原</string>
238238
<string name="backup">备份</string>
239239
<string name="restore">还原</string>
240+
<string name="clipboard_listening">记录剪贴板历史</string>
240241
</resources>

app/src/main/res/values-zh-rTW/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,5 @@ SPDX-License-Identifier: GPL-3.0-or-later
238238
<string name="restored_from_x">已從 %1$s 還原</string>
239239
<string name="backup">備份</string>
240240
<string name="restore">還原</string>
241+
<string name="clipboard_listening">監聽剪貼簿</string>
241242
</resources>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,5 @@ SPDX-License-Identifier: GPL-3.0-or-later
238238
<string name="restored_from_x">Restored from %1$s</string>
239239
<string name="backup">Backup</string>
240240
<string name="restore">Restore</string>
241+
<string name="clipboard_listening">Clipboard listening</string>
241242
</resources>

0 commit comments

Comments
 (0)