srctree

Robin Linden parent d0e7dea4 45b8d5cb
Fix crash on tapping notification during file transfer

For some reason Android revokes permissions when that happens. Seemsodd, but oh well.

inlinesplit
atox/src/main/kotlin/ui/chat/ChatFragment.kt added: 28, removed: 5, total 23
@@ -4,6 +4,7 @@ import android.app.AlertDialog
import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
@@ -50,6 +51,13 @@ import ltd.evilcorp.domain.tox.PublicKey
const val CONTACT_PUBLIC_KEY = "publicKey"
private const val MAX_CONFIRM_DELETE_STRING_LENGTH = 20
 
class OpenMultiplePersistableDocuments : ActivityResultContracts.OpenMultipleDocuments() {
override fun createIntent(context: Context, input: Array<out String>): Intent {
return super.createIntent(context, input)
.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
}
}
 
class ChatFragment : BaseFragment<FragmentChatBinding>(FragmentChatBinding::inflate) {
private val viewModel: ChatViewModel by viewModels { vmFactory }
 
@@ -64,9 +72,10 @@ class ChatFragment : BaseFragment<FragmentChatBinding>(FragmentChatBinding::infl
}
 
private val attachFilesLauncher =
registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { files ->
registerForActivityResult(OpenMultiplePersistableDocuments()) { files ->
viewModel.setActiveChat(PublicKey(contactPubKey))
for (file in files) {
activity?.contentResolver?.takePersistableUriPermission(file, Intent.FLAG_GRANT_READ_URI_PERMISSION)
viewModel.createFt(file)
}
}
 
domain/src/main/kotlin/feature/FileTransferManager.kt added: 28, removed: 5, total 23
@@ -2,6 +2,7 @@ package ltd.evilcorp.domain.feature
 
import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.OpenableColumns
import android.util.Log
@@ -49,6 +50,10 @@ class FileTransferManager @Inject constructor(
init {
File(context.filesDir, "ft").mkdir()
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)
}
}
 
fun reset() {
@@ -64,6 +69,10 @@ class FileTransferManager @Inject constructor(
setProgress(ft, FtRejected)
fileTransfers.remove(ft)
File(ft.destination).delete()
if (ft.outgoing) {
val uri = Uri.parse(ft.destination)
resolver.releasePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
}
 
@@ -140,7 +149,11 @@ class FileTransferManager @Inject constructor(
fileTransfers.remove(ft)
setProgress(ft, FtRejected)
tox.stopFileTransfer(PublicKey(ft.publicKey), ft.fileNumber)
File(Uri.parse(ft.destination).path!!).delete()
val uri = Uri.parse(ft.destination)
File(uri.path!!).delete()
if (ft.outgoing) {
resolver.releasePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
 
private fun setDestination(ft: FileTransfer, destination: Uri) {
@@ -225,13 +238,14 @@ class FileTransferManager @Inject constructor(
return
}
 
val src = Uri.parse(ft.destination)
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)
return
}
 
val src = Uri.parse(ft.destination)
val bytes = resolver.openInputStream(src)?.use {
it.skip(pos)
val bytes = ByteArray(length)