From a9411b3631378aa35159d143292de837f4263954 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 12 Apr 2024 17:35:57 +0200 Subject: [PATCH] properly re-sort the list when copying an existing clipboard entry --- .../keyboard/latin/ClipboardHistoryManager.kt | 23 ++++++++++++------- .../keyboard/latin/inputlogic/InputLogic.java | 1 + 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt index 2a3065d95..b35d44c1b 100644 --- a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt +++ b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt @@ -5,7 +5,6 @@ package helium314.keyboard.latin import android.content.ClipboardManager import android.content.Context import android.text.TextUtils -import androidx.preference.PreferenceManager import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import helium314.keyboard.compat.ClipboardManagerCompat @@ -51,15 +50,23 @@ class ClipboardHistoryManager( val clipData = clipboardManager.primaryClip ?: return if (clipData.itemCount == 0) return clipData.getItemAt(0)?.let { clipItem -> - // Starting from API 30, onPrimaryClipChanged() can be called multiple times - // for the same clip. We can identify clips with their timestamps since API 26. - // We use that to prevent unwanted duplicates. - val timeStamp = ClipboardManagerCompat.getClipTimestamp(clipData)?.also { stamp -> - if (historyEntries.any { it.timeStamp == stamp }) return - } ?: System.currentTimeMillis() - + val timeStamp = ClipboardManagerCompat.getClipTimestamp(clipData) ?: System.currentTimeMillis() val content = clipItem.coerceToText(latinIME) if (TextUtils.isEmpty(content)) return + + val duplicateEntryIndex = historyEntries.indexOfFirst { it.content.toString() == content.toString() } + if (duplicateEntryIndex != -1) { + val existingEntry = historyEntries[duplicateEntryIndex] + if (existingEntry.timeStamp == timeStamp) return // nothing to change (may occur frequently starting with API 30) + // older entry with the same text already exists, update the timestamp and re-sort the list + existingEntry.timeStamp = timeStamp + historyEntries.removeAt(duplicateEntryIndex) + historyEntries.add(0, existingEntry) + sortHistoryEntries() + val newIndex = historyEntries.indexOf(existingEntry) + onHistoryChangeListener?.onClipboardHistoryEntryMoved(duplicateEntryIndex, newIndex) + return + } if (historyEntries.any { it.content.toString() == content.toString() }) return val entry = ClipboardHistoryEntry(timeStamp, content) diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 8e70a4c8f..7dde71886 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -719,6 +719,7 @@ public final class InputLogic { case KeyCode.CLIPBOARD_CUT: if (mConnection.hasSelection()) { mConnection.copyText(); + // fake delete keypress to remove the text final Event backspaceEvent = LatinIME.createSoftwareKeypressEvent(KeyCode.DELETE, event.getMX(), event.getMY(), event.isKeyRepeat()); handleBackspaceEvent(backspaceEvent, inputTransaction, currentKeyboardScript);