Automatically try reloading failed images on network changes (#3170)

* Add the networkMonitor to the NSE and delete the old MockMediaLoader

* Generate a MediaLoaderMock through AutoMockable and use it in the MediaProviderTests

* Implement an ImageProvider mechanism that automatically tries reloading images when connectivity is established again and use it for LoadableImages

* Merge the ImageProvider protocol back into the MediaProvider

* Address PR review comments

* Provide a default sdk client request configuration

* Address tasks not automatically cancelling themselves when views get deallocated
This commit is contained in:
Stefan Ceriu
2024-08-15 18:20:19 +03:00
committed by GitHub
parent cf35056c78
commit f89c3e54b4
92 changed files with 618 additions and 332 deletions
@@ -32,7 +32,7 @@ struct RoomAvatarImage: View {
let avatar: RoomAvatar
let avatarSize: AvatarSize
let imageProvider: ImageProviderProtocol?
let mediaProvider: MediaProviderProtocol?
var body: some View {
switch avatar {
@@ -41,7 +41,7 @@ struct RoomAvatarImage: View {
name: name,
contentID: id,
avatarSize: avatarSize,
imageProvider: imageProvider)
mediaProvider: mediaProvider)
case .heroes(let users):
// We will expand upon this with more stack sizes in the future.
if users.count == 0 {
@@ -54,14 +54,14 @@ struct RoomAvatarImage: View {
name: users[0].displayName,
contentID: users[0].userID,
avatarSize: avatarSize,
imageProvider: imageProvider)
mediaProvider: mediaProvider)
.scaledFrame(size: clusterSize, alignment: .topTrailing)
LoadableAvatarImage(url: users[1].avatarURL,
name: users[1].displayName,
contentID: users[1].userID,
avatarSize: avatarSize,
imageProvider: imageProvider)
mediaProvider: mediaProvider)
.mask {
Rectangle()
.fill(Color.white)
@@ -83,7 +83,7 @@ struct RoomAvatarImage: View {
name: users[0].displayName,
contentID: users[0].userID,
avatarSize: avatarSize,
imageProvider: imageProvider)
mediaProvider: mediaProvider)
}
}
}
@@ -96,30 +96,30 @@ struct RoomAvatarImage_Previews: PreviewProvider, TestablePreview {
name: "Room",
avatarURL: nil),
avatarSize: .room(on: .home),
imageProvider: MockMediaProvider())
mediaProvider: MockMediaProvider())
RoomAvatarImage(avatar: .room(id: "!2:server.com",
name: "Room",
avatarURL: .picturesDirectory),
avatarSize: .room(on: .home),
imageProvider: MockMediaProvider())
mediaProvider: MockMediaProvider())
RoomAvatarImage(avatar: .heroes([.init(userID: "@user:server.com",
displayName: "User",
avatarURL: nil)]),
avatarSize: .room(on: .home),
imageProvider: MockMediaProvider())
mediaProvider: MockMediaProvider())
RoomAvatarImage(avatar: .heroes([.init(userID: "@user:server.com",
displayName: "User",
avatarURL: .picturesDirectory)]),
avatarSize: .room(on: .home),
imageProvider: MockMediaProvider())
mediaProvider: MockMediaProvider())
RoomAvatarImage(avatar: .heroes([.init(userID: "@alice:server.com", displayName: "Alice", avatarURL: nil),
.init(userID: "@bob:server.net", displayName: "Bob", avatarURL: nil)]),
avatarSize: .room(on: .home),
imageProvider: MockMediaProvider())
mediaProvider: MockMediaProvider())
}
}
}