srctree

Robin Linden parent 24dcef32 762dd713
Fix rare crash on canceling a file transfer

At first I thought this was a lot more common than it was, but inaddition to what's in the title, you need to be transfering the samefile in multiple transfers, and have e.g. closed aTox and reopened itfrom a notification or have changed phone orientation in order totrigger the crash.

inlinesplit
domain/src/main/kotlin/feature/FileTransferManager.kt added: 14, removed: 5, total 9
@@ -56,7 +56,7 @@ class FileTransferManager @Inject constructor(
File(context.filesDir, "avatar").mkdir()
resolver.persistedUriPermissions.forEach {
Log.w(TAG, "Clearing leftover permission for ${it.uri}")
resolver.releasePersistableUriPermission(it.uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
releaseFilePermission(it.uri)
}
}
 
@@ -74,7 +74,7 @@ class FileTransferManager @Inject constructor(
fileTransfers.remove(ft)
if (ft.outgoing) {
val uri = Uri.parse(ft.destination)
resolver.releasePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
releaseFilePermission(uri)
} else {
File(ft.destination).delete()
}
@@ -156,7 +156,7 @@ class FileTransferManager @Inject constructor(
tox.stopFileTransfer(PublicKey(ft.publicKey), ft.fileNumber)
val uri = Uri.parse(ft.destination)
if (ft.outgoing) {
resolver.releasePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
releaseFilePermission(uri)
} else {
File(uri.path!!).delete()
}
@@ -248,7 +248,7 @@ class FileTransferManager @Inject constructor(
if (length == 0) {
Log.i(TAG, "Finished outgoing ft ${pk.take(8)} $fileNo ${ft.isComplete()}")
fileTransfers.remove(ft)
resolver.releasePersistableUriPermission(src, Intent.FLAG_GRANT_READ_URI_PERMISSION)
releaseFilePermission(src)
return
}
 
@@ -305,6 +305,15 @@ class FileTransferManager @Inject constructor(
 
fun get(id: Int) = fileTransferRepository.get(id)
 
private fun releaseFilePermission(uri: Uri) {
if (fileTransfers.firstOrNull { it.destination == uri.toString() } != null) {
return
}
 
Log.i(TAG, "Releasing read permission for $uri")
resolver.releasePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
 
private fun makeDestination(ft: FileTransfer) =
Uri.fromFile(File(File(File(context.filesDir, "ft"), ft.publicKey.take(8)), Random.nextLong().toString()))