java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA
at android.media.MediaMetadataRetriever._setDataSource(MediaMetadataRetriever.java)
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:306)
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:327)
at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:376)
at org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory.createVideoEvent
at org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory.createMediaEvent
at org.matrix.android.sdk.internal.session.room.send.DefaultSendService.sendMedia(DefaultSendService.kt:253)
at org.matrix.android.sdk.internal.session.room.send.DefaultSendService.sendMedias(DefaultSendService.kt:240)
at org.matrix.android.sdk.internal.session.room.DefaultRoom.sendMedias
at im.vector.app.features.home.room.detail.RoomDetailViewModel.handleSendMedia(RoomDetailViewModel.kt:1158)
at im.vector.app.features.home.room.detail.RoomDetailViewModel.handle(RoomDetailViewModel.kt:298)
at im.vector.app.features.home.room.detail.RoomDetailFragment$contentAttachmentActivityResultLauncher$1.invoke(RoomDetailFragment.kt:1161)
at im.vector.app.features.home.room.detail.RoomDetailFragment$contentAttachmentActivityResultLauncher$1.invoke(RoomDetailFragment.kt:1156)
at im.vector.app.core.extensions.FragmentKt.registerStartForActivityResult$lambda-0
at im.vector.app.core.extensions.FragmentKt.lambda$6uyRKSScfR1yqThCkGUu8777SL8
at im.vector.app.core.extensions.-$$Lambda$FragmentKt$6uyRKSScfR1yqThCkGUu8777SL8.onActivityResult(lambda:0)
at androidx.activity.result.ActivityResultRegistry$1.onStateChanged(ActivityResultRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3026)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:589)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300)
at androidx.fragment.app.FragmentStore.moveToExpectedState
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchStart
at androidx.fragment.app.FragmentController.dispatchStart
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:510)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
at android.app.Activity.performStart(Activity.java:8076)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3653)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2203)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7822)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Change-Id: Ib909abe6468703452d53e760bde414e81a8876e3
Removing devices in foreach resulted in an exception, thus the device
did not get properly removed, which resulted in following issues:
- In the room settings, members would show with unverified devices,
where devices were actually logged out
- Sending encrypted messages to contacts who logged out a device did
lead to a "Message failed to send" with Retry button showing
E/ /Tag: ## CRYPTO | refreshOutdatedDeviceLists() : ERROR updating device keys for users [@redacted:somematrixserver.com]
java.util.NoSuchElementException: Cannot access index 10 when size is 9. Remember to check hasNext() before using next().
at io.realm.RealmList$RealmItr.next(RealmList.java:9)
at org.matrix.android.sdk.internal.crypto.store.db.RealmCryptoStore$storeUserDevices$1.invoke(RealmCryptoStore.kt:41)
at org.matrix.android.sdk.internal.crypto.store.db.RealmCryptoStore$storeUserDevices$1.invoke(RealmCryptoStore.kt:1)
at org.matrix.android.sdk.internal.crypto.store.db.-$$Lambda$HelperKt$XtYpPdQTMtzbOWZdtlMV_aWM9XY.execute(lambda:2)
at io.realm.Realm.executeTransaction(Realm.java:9)
at org.matrix.android.sdk.api.MatrixCallback$DefaultImpls.doRealmTransaction(MatrixCallback.kt:2)
at org.matrix.android.sdk.internal.crypto.store.db.RealmCryptoStore.storeUserDevices(RealmCryptoStore.kt:1)
at org.matrix.android.sdk.internal.crypto.DeviceListManager.doKeyDownloadForUsers(DeviceListManager.kt:120)
at org.matrix.android.sdk.internal.crypto.DeviceListManager$doKeyDownloadForUsers$1.invokeSuspend(DeviceListManager.kt:1)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:3)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:18)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.os.HandlerThread.run(HandlerThread.java:67)
Change-Id: Icd3e21f15c6672673fec58e0fc617fa8c57ba18e
The sync response can omit the field device_one_time_keys_count.signed_curve25519 and the SDK was waiting to know this value to upload the OTK.
Now the SDK uploads the OTK when it uploads the device keys.
Verification flows have something called a transaction id. This is a
client-set custom ID that identifies the flow and is established by the
first message that gets sent out. This transaction ID needs to be kept the
same and be part of all events that are sent during the verification flow.
To-device requests have something called a transaction id. This is a
client-set custom ID that identifies a given request. It is used to
ensure idempotency of requests, i.e. retrying to send a request won't
result in two events being sent as long as the transaction id is kept
the same.
This patch removes usage of the first type of transaction ID for the
second use-case.
This closes: #3589.