Skip to content

Commit 33d09ec

Browse files
committed
fix: update local file access permission
1 parent a1823b0 commit 33d09ec

File tree

14 files changed

+78
-26
lines changed

14 files changed

+78
-26
lines changed

changelog.d/3616.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix crash when accessing a local file and permission is revoked.

library/multipicker/src/main/java/im/vector/lib/multipicker/AudioPicker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class AudioPicker : Picker<MultiPickerAudioType>() {
3131
* Returns selected audio files or empty list if user did not select any files.
3232
*/
3333
override fun getSelectedFiles(context: Context, data: Intent?): List<MultiPickerAudioType> {
34-
return getSelectedUriList(data).mapNotNull { selectedUri ->
34+
return getSelectedUriList(context, data).mapNotNull { selectedUri ->
3535
selectedUri.toMultiPickerAudioType(context)
3636
}
3737
}

library/multipicker/src/main/java/im/vector/lib/multipicker/FilePicker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class FilePicker : Picker<MultiPickerBaseType>() {
4141
* Returns selected files or empty list if user did not select any files.
4242
*/
4343
override fun getSelectedFiles(context: Context, data: Intent?): List<MultiPickerBaseType> {
44-
return getSelectedUriList(data).mapNotNull { selectedUri ->
44+
return getSelectedUriList(context, data).mapNotNull { selectedUri ->
4545
val type = context.contentResolver.getType(selectedUri)
4646

4747
when {

library/multipicker/src/main/java/im/vector/lib/multipicker/ImagePicker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class ImagePicker : Picker<MultiPickerImageType>() {
3131
* Returns selected image files or empty list if user did not select any files.
3232
*/
3333
override fun getSelectedFiles(context: Context, data: Intent?): List<MultiPickerImageType> {
34-
return getSelectedUriList(data).mapNotNull { selectedUri ->
34+
return getSelectedUriList(context, data).mapNotNull { selectedUri ->
3535
selectedUri.toMultiPickerImageType(context)
3636
}
3737
}

library/multipicker/src/main/java/im/vector/lib/multipicker/MediaPicker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class MediaPicker : Picker<MultiPickerBaseMediaType>() {
3333
* Returns selected image/video files or empty list if user did not select any files.
3434
*/
3535
override fun getSelectedFiles(context: Context, data: Intent?): List<MultiPickerBaseMediaType> {
36-
return getSelectedUriList(data).mapNotNull { selectedUri ->
36+
return getSelectedUriList(context, data).mapNotNull { selectedUri ->
3737
val mimeType = context.contentResolver.getType(selectedUri)
3838

3939
if (mimeType.isMimeTypeVideo()) {

library/multipicker/src/main/java/im/vector/lib/multipicker/Picker.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package im.vector.lib.multipicker
1818

19+
import android.content.ComponentName
1920
import android.content.Context
2021
import android.content.Intent
2122
import android.content.pm.PackageManager
@@ -58,7 +59,17 @@ abstract class Picker<T> {
5859
uriList.forEach {
5960
for (resolveInfo in resInfoList) {
6061
val packageName: String = resolveInfo.activityInfo.packageName
61-
context.grantUriPermission(packageName, it, Intent.FLAG_GRANT_READ_URI_PERMISSION)
62+
63+
// Replace implicit intent by an explicit to fix crash on some devices like Xiaomi.
64+
// see https://juejin.cn/post/7031736325422186510
65+
try {
66+
context.grantUriPermission(packageName, it, Intent.FLAG_GRANT_READ_URI_PERMISSION)
67+
} catch (e: Exception) {
68+
continue
69+
}
70+
data.action = null
71+
data.component = ComponentName(packageName, resolveInfo.activityInfo.name)
72+
break
6273
}
6374
}
6475
return getSelectedFiles(context, data)
@@ -82,7 +93,7 @@ abstract class Picker<T> {
8293
activityResultLauncher.launch(createIntent().apply { addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) })
8394
}
8495

85-
protected fun getSelectedUriList(data: Intent?): List<Uri> {
96+
protected fun getSelectedUriList(context: Context, data: Intent?): List<Uri> {
8697
val selectedUriList = mutableListOf<Uri>()
8798
val dataUri = data?.data
8899
val clipData = data?.clipData
@@ -104,6 +115,6 @@ abstract class Picker<T> {
104115
}
105116
}
106117
}
107-
return selectedUriList
118+
return selectedUriList.onEach { context.grantUriPermission(context.applicationContext.packageName, it, Intent.FLAG_GRANT_READ_URI_PERMISSION) }
108119
}
109120
}

library/multipicker/src/main/java/im/vector/lib/multipicker/VideoPicker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class VideoPicker : Picker<MultiPickerVideoType>() {
3131
* Returns selected video files or empty list if user did not select any files.
3232
*/
3333
override fun getSelectedFiles(context: Context, data: Intent?): List<MultiPickerVideoType> {
34-
return getSelectedUriList(data).mapNotNull { selectedUri ->
34+
return getSelectedUriList(context, data).mapNotNull { selectedUri ->
3535
selectedUri.toMultiPickerVideoType(context)
3636
}
3737
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
package org.matrix.android.sdk.internal.session.content
1818

1919
import android.content.Context
20+
import android.content.Intent
2021
import android.graphics.BitmapFactory
2122
import android.media.MediaMetadataRetriever
23+
import android.os.Build
2224
import androidx.core.net.toUri
2325
import androidx.work.WorkerParameters
2426
import com.squareup.moshi.JsonClass
@@ -115,7 +117,15 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
115117
if (allCancelled) {
116118
// there is no point in uploading the image!
117119
return Result.success(inputData)
118-
.also { Timber.e("## Send: Work cancelled by user") }
120+
.also {
121+
Timber.e("## Send: Work cancelled by user")
122+
123+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
124+
context.revokeUriPermission(context.packageName, params.attachment.queryUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
125+
} else {
126+
context.revokeUriPermission(params.attachment.queryUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
127+
}
128+
}
119129
}
120130

121131
val attachment = params.attachment
@@ -396,6 +406,12 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
396406
)
397407
return Result.success(WorkerParamsFactory.toData(sendParams)).also {
398408
Timber.v("## handleSuccess $attachmentUrl, work is stopped $isStopped")
409+
410+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
411+
context.revokeUriPermission(context.packageName, params.attachment.queryUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
412+
} else {
413+
context.revokeUriPermission(params.attachment.queryUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
414+
}
399415
}
400416
}
401417

vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ sealed class RoomDetailAction : VectorViewModelAction {
5252

5353
data class ResendMessage(val eventId: String) : RoomDetailAction()
5454
data class RemoveFailedEcho(val eventId: String) : RoomDetailAction()
55-
data class CancelSend(val eventId: String, val force: Boolean) : RoomDetailAction()
55+
data class CancelSend(val event: TimelineEvent, val force: Boolean) : RoomDetailAction()
5656

5757
data class VoteToPoll(val eventId: String, val optionKey: String) : RoomDetailAction()
5858

vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewEvents.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ sealed class RoomDetailViewEvents : VectorViewEvents {
6565
val mimeType: String?
6666
) : RoomDetailViewEvents()
6767

68+
data class RevokeFilePermission(
69+
val uri: Uri
70+
) : RoomDetailViewEvents()
71+
6872
data class DisplayAndAcceptCall(val call: WebRtcCall) : RoomDetailViewEvents()
6973

7074
object DisplayPromptForIntegrationManager : RoomDetailViewEvents()

0 commit comments

Comments
 (0)