Merge pull request #492 from MajeurAndroid/fix-clipboard-duplicates

Fixed duplicates in history keyboard #487
This commit is contained in:
Majeur 2022-01-19 16:46:24 +01:00 committed by GitHub
commit f73f2506c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 13 deletions

View file

@ -16,4 +16,13 @@ public class ClipboardManagerCompat {
} }
} }
@TargetApi(Build.VERSION_CODES.O)
public static Long getClipTimestamp(ClipData cd) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return cd.getDescription().getTimestamp();
} else {
return null;
}
}
} }

View file

@ -2,9 +2,11 @@ package org.dslul.openboard.inputmethod.latin
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.os.Build
import android.text.TextUtils import android.text.TextUtils
import android.util.Base64 import android.util.Base64
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi
import org.dslul.openboard.inputmethod.compat.ClipboardManagerCompat import org.dslul.openboard.inputmethod.compat.ClipboardManagerCompat
import org.dslul.openboard.inputmethod.latin.utils.JsonUtils import org.dslul.openboard.inputmethod.latin.utils.JsonUtils
import java.io.File import java.io.File
@ -45,25 +47,31 @@ class ClipboardHistoryManager(
override fun onPrimaryClipChanged() = fetchPrimaryClip() override fun onPrimaryClipChanged() = fetchPrimaryClip()
private fun fetchPrimaryClip() { private fun fetchPrimaryClip() {
if (!clipboardManager.hasPrimaryClip()) return val clipData = clipboardManager.primaryClip ?: return
val clipData = clipboardManager.primaryClip if (clipData.itemCount == 0) return
if (clipData != null && clipData.itemCount > 0 && clipData.getItemAt(0) != null) { clipData.getItemAt(0)?.let { clipItem ->
val content = clipData.getItemAt(0).coerceToText(latinIME) // Starting from API 30, onPrimaryClipChanged() can be called multiple times
if (!TextUtils.isEmpty(content)) { // for the same clip. We can identify clips with their timestamps since API 26.
val id = System.nanoTime() // We use that to prevent unwanted duplicates.
val entry = ClipboardHistoryEntry(id, content) val id = ClipboardManagerCompat.getClipTimestamp(clipData)?.also { stamp ->
historyEntries.add(entry) if (historyEntries.any { it.id == stamp }) return
sortHistoryEntries() } ?: System.currentTimeMillis()
val at = historyEntries.indexOf(entry)
onHistoryChangeListener?.onClipboardHistoryEntryAdded(at) val content = clipItem.coerceToText(latinIME)
} if (TextUtils.isEmpty(content)) return
val entry = ClipboardHistoryEntry(id, content)
historyEntries.add(entry)
sortHistoryEntries()
val at = historyEntries.indexOf(entry)
onHistoryChangeListener?.onClipboardHistoryEntryAdded(at)
} }
} }
fun toggleClipPinned(clipId: Long) { fun toggleClipPinned(clipId: Long) {
val from = historyEntries.indexOfFirst { it.id == clipId } val from = historyEntries.indexOfFirst { it.id == clipId }
val historyEntry = historyEntries[from].apply { val historyEntry = historyEntries[from].apply {
id = System.nanoTime() id = System.currentTimeMillis()
isPinned = !isPinned isPinned = !isPinned
} }
sortHistoryEntries() sortHistoryEntries()