diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/app/settings/advanced/RestoreScreen.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/app/settings/advanced/RestoreScreen.kt index c532ffb7..f22445f1 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/app/settings/advanced/RestoreScreen.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/app/settings/advanced/RestoreScreen.kt @@ -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>() - 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>() 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>() 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 diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/ClipboardManager.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/ClipboardManager.kt index 7e46bf23..eb833d0b 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/ClipboardManager.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/ClipboardManager.kt @@ -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, shouldReset: Boolean, itemType: ItemType) { + fun restoreHistory(items: List) { 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)) } } diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/provider/ClipboardFileStorage.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/provider/ClipboardFileStorage.kt index a5fa20fd..0cbf215e 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/provider/ClipboardFileStorage.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/provider/ClipboardFileStorage.kt @@ -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() + } + } + }