0
0
mirror of https://github.com/florisboard/florisboard.git synced 2024-09-19 19:42:20 +02:00

Fix history import error when files are already in ClipboardFileStorage

This commit is contained in:
lm41 2024-09-13 02:02:06 +02:00
parent 07c1cd4b10
commit cb59566881
No known key found for this signature in database
3 changed files with 76 additions and 35 deletions

View File

@ -138,7 +138,10 @@ fun RestoreScreen() = FlorisScreen {
} }
restoreWorkspace = workspace restoreWorkspace = workspace
}.onFailure { error -> }.onFailure { error ->
context.showLongToast(R.string.backup_and_restore__restore__failure, "error_message" to error.localizedMessage) context.showLongToast(
R.string.backup_and_restore__restore__failure,
"error_message" to error.localizedMessage
)
} }
}, },
) )
@ -176,15 +179,20 @@ fun RestoreScreen() = FlorisScreen {
srcDir.copyRecursively(dstDir, overwrite = true) srcDir.copyRecursively(dstDir, overwrite = true)
} }
} }
val clipboardManager = context.clipboardManager().value
if (shouldReset) {
clipboardManager.clearFullHistory()
ClipboardFileStorage.resetClipboardFileStorage(context)
}
if (restoreFilesSelector.provideClipboardItems()) { if (restoreFilesSelector.provideClipboardItems()) {
val clipboardFilesDir = workspace.outputDir.subDir("clipboard") val clipboardFilesDir = workspace.outputDir.subDir("clipboard")
val clipboardManager = context.clipboardManager().value
if (restoreFilesSelector.clipboardTextItems) { if (restoreFilesSelector.clipboardTextItems) {
val clipboardItems = clipboardFilesDir.subFile(Backup.CLIPBOARD_TEXT_ITEMS_JSON_NAME) val clipboardItems = clipboardFilesDir.subFile(Backup.CLIPBOARD_TEXT_ITEMS_JSON_NAME)
if (clipboardItems.exists()) { if (clipboardItems.exists()) {
val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>() val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>()
clipboardManager.restoreHistory(shouldReset = shouldReset, items = clipboardItemsList.filter { it.type == ItemType.TEXT }, itemType = ItemType.TEXT) clipboardManager.restoreHistory(items = clipboardItemsList.filter { it.type == ItemType.TEXT })
} }
} }
if (restoreFilesSelector.clipboardImageItems) { if (restoreFilesSelector.clipboardImageItems) {
@ -192,14 +200,18 @@ fun RestoreScreen() = FlorisScreen {
if (clipboardItems.exists()) { if (clipboardItems.exists()) {
val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>() val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>()
for (item in clipboardItemsList.filter { it.type == ItemType.IMAGE }) { for (item in clipboardItemsList.filter { it.type == ItemType.IMAGE }) {
ClipboardFileStorage.instertFileFromBackup( ClipboardFileStorage.insertFileFromBackupIfNotExisting(
context, context,
clipboardFilesDir.subFile( clipboardFilesDir.subFile(
relPath = "${ClipboardFileStorage.CLIPBOARD_FILES_PATH}/${item.uri!!.path!!.split('/').last()}" relPath = "${ClipboardFileStorage.CLIPBOARD_FILES_PATH}/${
item.uri!!.path!!.split(
'/'
).last()
}"
) )
) )
} }
clipboardManager.restoreHistory(shouldReset = shouldReset, items = clipboardItemsList.filter { it.type == ItemType.IMAGE }, itemType = ItemType.IMAGE) clipboardManager.restoreHistory(items = clipboardItemsList.filter { it.type == ItemType.IMAGE })
} }
} }
if (restoreFilesSelector.clipboardVideoItems) { if (restoreFilesSelector.clipboardVideoItems) {
@ -207,14 +219,18 @@ fun RestoreScreen() = FlorisScreen {
if (clipboardItems.exists()) { if (clipboardItems.exists()) {
val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>() val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>()
for (item in clipboardItemsList.filter { it.type == ItemType.VIDEO }) { for (item in clipboardItemsList.filter { it.type == ItemType.VIDEO }) {
ClipboardFileStorage.instertFileFromBackup( ClipboardFileStorage.insertFileFromBackupIfNotExisting(
context, context,
clipboardFilesDir.subFile( clipboardFilesDir.subFile(
relPath = "${ClipboardFileStorage.CLIPBOARD_FILES_PATH}/${item.uri!!.path!!.split('/').last()}" relPath = "${ClipboardFileStorage.CLIPBOARD_FILES_PATH}/${
item.uri!!.path!!.split(
'/'
).last()
}"
) )
) )
} }
clipboardManager.restoreHistory(shouldReset = shouldReset, items = clipboardItemsList.filter { it.type == ItemType.VIDEO }, itemType = ItemType.VIDEO) clipboardManager.restoreHistory(items = clipboardItemsList.filter { it.type == ItemType.VIDEO })
} }
} }
} }
@ -238,7 +254,11 @@ fun RestoreScreen() = FlorisScreen {
context.showLongToast(R.string.backup_and_restore__restore__success) context.showLongToast(R.string.backup_and_restore__restore__success)
navController.navigateUp() navController.navigateUp()
} catch (e: Throwable) { } catch (e: Throwable) {
context.showLongToast(R.string.backup_and_restore__restore__failure, "error_message" to e.localizedMessage) e.printStackTrace()
context.showLongToast(
R.string.backup_and_restore__restore__failure,
"error_message" to e.localizedMessage
)
} }
} }
}, },
@ -273,7 +293,10 @@ fun RestoreScreen() = FlorisScreen {
runCatching { runCatching {
restoreDataFromFileSystemLauncher.launch("*/*") restoreDataFromFileSystemLauncher.launch("*/*")
}.onFailure { error -> }.onFailure { error ->
context.showLongToast(R.string.backup_and_restore__restore__failure, "error_message" to error.localizedMessage) context.showLongToast(
R.string.backup_and_restore__restore__failure,
"error_message" to error.localizedMessage
)
} }
}, },
modifier = Modifier modifier = Modifier

View File

@ -28,11 +28,6 @@ import dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardHistoryDao
import dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardHistoryDatabase import dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardHistoryDatabase
import dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardItem import dev.patrickgold.florisboard.ime.clipboard.provider.ClipboardItem
import dev.patrickgold.florisboard.ime.clipboard.provider.ItemType import dev.patrickgold.florisboard.ime.clipboard.provider.ItemType
import org.florisboard.lib.android.AndroidClipboardManager
import org.florisboard.lib.android.AndroidClipboardManager_OnPrimaryClipChangedListener
import org.florisboard.lib.android.setOrClearPrimaryClip
import org.florisboard.lib.android.showShortToast
import org.florisboard.lib.android.systemService
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -45,6 +40,11 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.florisboard.lib.android.AndroidClipboardManager
import org.florisboard.lib.android.AndroidClipboardManager_OnPrimaryClipChangedListener
import org.florisboard.lib.android.setOrClearPrimaryClip
import org.florisboard.lib.android.showShortToast
import org.florisboard.lib.android.systemService
import org.florisboard.lib.kotlin.tryOrNull import org.florisboard.lib.kotlin.tryOrNull
import java.io.Closeable import java.io.Closeable
@ -110,7 +110,9 @@ class ClipboardManager(
val primaryClipFlow = _primaryClipFlow.asStateFlow() val primaryClipFlow = _primaryClipFlow.asStateFlow()
inline var primaryClip inline var primaryClip
get() = primaryClipFlow.value get() = primaryClipFlow.value
private set(v) { _primaryClipFlow.value = v } private set(v) {
_primaryClipFlow.value = v
}
init { init {
systemClipboardManager.addPrimaryClipChangedListener(this) systemClipboardManager.addPrimaryClipChangedListener(this)
@ -278,6 +280,9 @@ class ClipboardManager(
} }
} }
/**
* Clears all unpinned items from the clipboard history
*/
fun clearHistory() { fun clearHistory() {
ioScope.launch { ioScope.launch {
for (item in history().all) { for (item in history().all) {
@ -287,6 +292,9 @@ class ClipboardManager(
} }
} }
/**
* Clears the full clipboard history
*/
fun clearFullHistory() { fun clearFullHistory() {
ioScope.launch { ioScope.launch {
for (item in history().all) { for (item in history().all) {
@ -300,26 +308,15 @@ class ClipboardManager(
/** /**
* Restore the clipboard history from a [List] * Restore the clipboard history from a [List]
* *
* @param shouldReset if the history should be reset
* @param items the [ClipboardItem] list with the new items * @param items the [ClipboardItem] list with the new items
*/ */
fun restoreHistory(items: List<ClipboardItem>, shouldReset: Boolean, itemType: ItemType) { fun restoreHistory(items: List<ClipboardItem>) {
ioScope.launch { ioScope.launch {
if (shouldReset) { val currentHistory = this@ClipboardManager.history().all
for (item in history().all) { for (item in items) {
item.close(appContext) if (!currentHistory.map { it.copy(id = 0) }.contains(item.copy(id = 0))) {
}
clipHistoryDao?.deleteAllFromType(itemType)
for (item in items) {
this@ClipboardManager.insertClip(item.copy(id = 0)) this@ClipboardManager.insertClip(item.copy(id = 0))
} }
} else {
val currentHistory = this@ClipboardManager.history().all
for (item in items) {
if (!currentHistory.map { it.copy(id = 0) }.contains(item.copy(id = 0))) {
this@ClipboardManager.insertClip(item.copy(id = 0))
}
}
} }
} }
} }
@ -344,7 +341,7 @@ class ClipboardManager(
fun unpinClip(item: ClipboardItem) { fun unpinClip(item: ClipboardItem) {
ioScope.launch { ioScope.launch {
clipHistoryDao?.update(item.copy(isPinned = false)) clipHistoryDao?.update(item.copy(isPinned = false))
} }
} }

View File

@ -61,7 +61,28 @@ object ClipboardFileStorage {
return context.clipboardFilesDir.subFile(id.toString()) return context.clipboardFilesDir.subFile(id.toString())
} }
fun instertFileFromBackup(context: Context, file: FsFile) {
file.copyTo(context.clipboardFilesDir.subFile(file.name), overwrite = false) /**
* Insert file from backup if not existing
*
* @param context the application context
* @param file the file to be inserted
*/
fun insertFileFromBackupIfNotExisting(context: Context, file: FsFile) {
if (!context.clipboardFilesDir.subFile(file.name).isFile) {
file.copyTo(context.clipboardFilesDir.subFile(file.name), overwrite = false)
}
} }
/**
* Deletes all files from the clipboard subdirectory
*
* @param context the application context
*/
fun resetClipboardFileStorage(context: Context) {
context.clipboardFilesDir.listFiles()?.forEach {
it.delete()
}
}
} }