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:
parent
07c1cd4b10
commit
cb59566881
@ -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
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user