0
0
mirror of https://github.com/florisboard/florisboard.git synced 2024-09-19 11:32:18 +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
}.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)
}
}
val clipboardManager = context.clipboardManager().value
if (shouldReset) {
clipboardManager.clearFullHistory()
ClipboardFileStorage.resetClipboardFileStorage(context)
}
if (restoreFilesSelector.provideClipboardItems()) {
val clipboardFilesDir = workspace.outputDir.subDir("clipboard")
val clipboardManager = context.clipboardManager().value
if (restoreFilesSelector.clipboardTextItems) {
val clipboardItems = clipboardFilesDir.subFile(Backup.CLIPBOARD_TEXT_ITEMS_JSON_NAME)
if (clipboardItems.exists()) {
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) {
@ -192,14 +200,18 @@ fun RestoreScreen() = FlorisScreen {
if (clipboardItems.exists()) {
val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>()
for (item in clipboardItemsList.filter { it.type == ItemType.IMAGE }) {
ClipboardFileStorage.instertFileFromBackup(
ClipboardFileStorage.insertFileFromBackupIfNotExisting(
context,
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) {
@ -207,14 +219,18 @@ fun RestoreScreen() = FlorisScreen {
if (clipboardItems.exists()) {
val clipboardItemsList = clipboardItems.readJson<List<ClipboardItem>>()
for (item in clipboardItemsList.filter { it.type == ItemType.VIDEO }) {
ClipboardFileStorage.instertFileFromBackup(
ClipboardFileStorage.insertFileFromBackupIfNotExisting(
context,
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)
navController.navigateUp()
} 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 {
restoreDataFromFileSystemLauncher.launch("*/*")
}.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

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.ClipboardItem
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.Dispatchers
import kotlinx.coroutines.Job
@ -45,6 +40,11 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
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 java.io.Closeable
@ -110,7 +110,9 @@ class ClipboardManager(
val primaryClipFlow = _primaryClipFlow.asStateFlow()
inline var primaryClip
get() = primaryClipFlow.value
private set(v) { _primaryClipFlow.value = v }
private set(v) {
_primaryClipFlow.value = v
}
init {
systemClipboardManager.addPrimaryClipChangedListener(this)
@ -278,6 +280,9 @@ class ClipboardManager(
}
}
/**
* Clears all unpinned items from the clipboard history
*/
fun clearHistory() {
ioScope.launch {
for (item in history().all) {
@ -287,6 +292,9 @@ class ClipboardManager(
}
}
/**
* Clears the full clipboard history
*/
fun clearFullHistory() {
ioScope.launch {
for (item in history().all) {
@ -300,26 +308,15 @@ class ClipboardManager(
/**
* Restore the clipboard history from a [List]
*
* @param shouldReset if the history should be reset
* @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 {
if (shouldReset) {
for (item in history().all) {
item.close(appContext)
}
clipHistoryDao?.deleteAllFromType(itemType)
for (item in items) {
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))
}
} 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) {
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())
}
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()
}
}
}