mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Placeholders added in push notifications (#1176)
* placeholders added in push notifications * this code is a bit easier to read * code improvement
This commit is contained in:
@@ -216,6 +216,7 @@
|
|||||||
5455147CAC63F71E48F7D699 /* NSELogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3D455BC2423D911A62ACFB2 /* NSELogger.swift */; };
|
5455147CAC63F71E48F7D699 /* NSELogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3D455BC2423D911A62ACFB2 /* NSELogger.swift */; };
|
||||||
54AE8860D668AFD96E7E177B /* UITestsScreenIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CEBE5EA91E8691EDF364EC2 /* UITestsScreenIdentifier.swift */; };
|
54AE8860D668AFD96E7E177B /* UITestsScreenIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CEBE5EA91E8691EDF364EC2 /* UITestsScreenIdentifier.swift */; };
|
||||||
54C774874BED4A8FAD1F22FE /* AnalyticsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77B3D4950F1707E66E4A45A /* AnalyticsConfiguration.swift */; };
|
54C774874BED4A8FAD1F22FE /* AnalyticsConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77B3D4950F1707E66E4A45A /* AnalyticsConfiguration.swift */; };
|
||||||
|
55CDD3968D95D1A820B5491E /* PlaceholderAvatarImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */; };
|
||||||
564BF06B3E93D6DD55F903B2 /* CreateRoomCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C618CA2B6C8758B06C88013C /* CreateRoomCoordinator.swift */; };
|
564BF06B3E93D6DD55F903B2 /* CreateRoomCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C618CA2B6C8758B06C88013C /* CreateRoomCoordinator.swift */; };
|
||||||
565868808A1DA565707394ED /* CurrentValuePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 127C8472672A5BA09EF1ACF8 /* CurrentValuePublisher.swift */; };
|
565868808A1DA565707394ED /* CurrentValuePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 127C8472672A5BA09EF1ACF8 /* CurrentValuePublisher.swift */; };
|
||||||
56F0A22972A3BB519DA2261C /* HomeScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F5530B2212862FA4BEFF2D /* HomeScreenViewModelProtocol.swift */; };
|
56F0A22972A3BB519DA2261C /* HomeScreenViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F5530B2212862FA4BEFF2D /* HomeScreenViewModelProtocol.swift */; };
|
||||||
@@ -594,6 +595,7 @@
|
|||||||
D55AF9B5B55FEED04771A461 /* RoomFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A008E57D52B07B78DFAD1BB /* RoomFlowCoordinator.swift */; };
|
D55AF9B5B55FEED04771A461 /* RoomFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A008E57D52B07B78DFAD1BB /* RoomFlowCoordinator.swift */; };
|
||||||
D5C805F49B2C75DC3793E780 /* EmojiItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A243E04B58DC6E41FDCD82 /* EmojiItem.swift */; };
|
D5C805F49B2C75DC3793E780 /* EmojiItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A243E04B58DC6E41FDCD82 /* EmojiItem.swift */; };
|
||||||
D5EA4C6C80579279770D5804 /* ImageRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A45283CF1DB96E583BECA6 /* ImageRoomTimelineView.swift */; };
|
D5EA4C6C80579279770D5804 /* ImageRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A45283CF1DB96E583BECA6 /* ImageRoomTimelineView.swift */; };
|
||||||
|
D63974A88CF2BC721F109C77 /* Compound in Frameworks */ = {isa = PBXBuildFile; productRef = DCA3C4A997AD28E6918D4CE5 /* Compound */; };
|
||||||
D6661A94DBD97658B2ADBD6A /* MapTilerStaticMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A4D29F2683F5772AC72406F /* MapTilerStaticMap.swift */; };
|
D6661A94DBD97658B2ADBD6A /* MapTilerStaticMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A4D29F2683F5772AC72406F /* MapTilerStaticMap.swift */; };
|
||||||
D7CDBAE82782BD0529DECB5F /* AttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BD6ED18E2EB61E28C340AD /* AttributedString.swift */; };
|
D7CDBAE82782BD0529DECB5F /* AttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BD6ED18E2EB61E28C340AD /* AttributedString.swift */; };
|
||||||
D8359F67AF3A83516E9083C1 /* MockUserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4756C5A8C8649AD6C10C615 /* MockUserSession.swift */; };
|
D8359F67AF3A83516E9083C1 /* MockUserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4756C5A8C8649AD6C10C615 /* MockUserSession.swift */; };
|
||||||
@@ -609,6 +611,7 @@
|
|||||||
DE0BBA736557B42BC0DA6CBF /* TimelineEventProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B62EE933FC3D5651AF4607 /* TimelineEventProxy.swift */; };
|
DE0BBA736557B42BC0DA6CBF /* TimelineEventProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B62EE933FC3D5651AF4607 /* TimelineEventProxy.swift */; };
|
||||||
DE4F8C4E0F1DB4832F09DE97 /* HomeScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D6764D6976D235926FE5FC /* HomeScreenViewModel.swift */; };
|
DE4F8C4E0F1DB4832F09DE97 /* HomeScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D6764D6976D235926FE5FC /* HomeScreenViewModel.swift */; };
|
||||||
DF004A5B2EABBD0574D06A04 /* SplashScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854BCEAF2A832176FAACD2CB /* SplashScreenCoordinator.swift */; };
|
DF004A5B2EABBD0574D06A04 /* SplashScreenCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854BCEAF2A832176FAACD2CB /* SplashScreenCoordinator.swift */; };
|
||||||
|
DF05F9C9D3D977EB77E13692 /* DesignKit in Frameworks */ = {isa = PBXBuildFile; productRef = A593735D882778FD2C9A185B /* DesignKit */; };
|
||||||
DF504B10A4918F971A57BEF2 /* PostHogAnalyticsClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */; };
|
DF504B10A4918F971A57BEF2 /* PostHogAnalyticsClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1715E3D7F53C0748AA50C91C /* PostHogAnalyticsClient.swift */; };
|
||||||
DFCA89C4EC2A5332ED6B441F /* DataProtectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4959CECEC984B3995616F427 /* DataProtectionManager.swift */; };
|
DFCA89C4EC2A5332ED6B441F /* DataProtectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4959CECEC984B3995616F427 /* DataProtectionManager.swift */; };
|
||||||
DFD5AA8688A34C72D48AF3B1 /* StaticLocationScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5311C989EC15B4C2D699025 /* StaticLocationScreenViewModel.swift */; };
|
DFD5AA8688A34C72D48AF3B1 /* StaticLocationScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5311C989EC15B4C2D699025 /* StaticLocationScreenViewModel.swift */; };
|
||||||
@@ -1430,6 +1433,8 @@
|
|||||||
53DEF39F0C4DE02E3FC56D91 /* KeychainAccess in Frameworks */,
|
53DEF39F0C4DE02E3FC56D91 /* KeychainAccess in Frameworks */,
|
||||||
F06CE9132855E81EBB6DDC32 /* Kingfisher in Frameworks */,
|
F06CE9132855E81EBB6DDC32 /* Kingfisher in Frameworks */,
|
||||||
67D6E0700A9C1E676F6231F8 /* Collections in Frameworks */,
|
67D6E0700A9C1E676F6231F8 /* Collections in Frameworks */,
|
||||||
|
D63974A88CF2BC721F109C77 /* Compound in Frameworks */,
|
||||||
|
DF05F9C9D3D977EB77E13692 /* DesignKit in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -3582,6 +3587,8 @@
|
|||||||
800631D7250B7F93195035F1 /* KeychainAccess */,
|
800631D7250B7F93195035F1 /* KeychainAccess */,
|
||||||
940C605265DD82DA0C655E23 /* Kingfisher */,
|
940C605265DD82DA0C655E23 /* Kingfisher */,
|
||||||
AD544C0FA48DFFB080920061 /* Collections */,
|
AD544C0FA48DFFB080920061 /* Collections */,
|
||||||
|
DCA3C4A997AD28E6918D4CE5 /* Compound */,
|
||||||
|
A593735D882778FD2C9A185B /* DesignKit */,
|
||||||
);
|
);
|
||||||
productName = NSE;
|
productName = NSE;
|
||||||
productReference = 0D8F620C8B314840D8602E3F /* NSE.appex */;
|
productReference = 0D8F620C8B314840D8602E3F /* NSE.appex */;
|
||||||
@@ -3849,6 +3856,7 @@
|
|||||||
5C02841B2A86327B2C377682 /* NotificationConstants.swift in Sources */,
|
5C02841B2A86327B2C377682 /* NotificationConstants.swift in Sources */,
|
||||||
5D70FAE4D2BF4553AFFFFE41 /* NotificationItemProxy.swift in Sources */,
|
5D70FAE4D2BF4553AFFFFE41 /* NotificationItemProxy.swift in Sources */,
|
||||||
B14BC354E56616B6B7D9A3D7 /* NotificationServiceExtension.swift in Sources */,
|
B14BC354E56616B6B7D9A3D7 /* NotificationServiceExtension.swift in Sources */,
|
||||||
|
55CDD3968D95D1A820B5491E /* PlaceholderAvatarImage.swift in Sources */,
|
||||||
414F50CFCFEEE2611127DCFB /* RestorationToken.swift in Sources */,
|
414F50CFCFEEE2611127DCFB /* RestorationToken.swift in Sources */,
|
||||||
7354D094A4C59B555F407FA1 /* RustTracing.swift in Sources */,
|
7354D094A4C59B555F407FA1 /* RustTracing.swift in Sources */,
|
||||||
6C5A2C454E6C198AB39ED760 /* SharedUserDefaultsKeys.swift in Sources */,
|
6C5A2C454E6C198AB39ED760 /* SharedUserDefaultsKeys.swift in Sources */,
|
||||||
@@ -5337,6 +5345,10 @@
|
|||||||
package = 395DE6AE429B7ACC7C7FE31D /* XCRemoteSwiftPackageReference "KZFileWatchers" */;
|
package = 395DE6AE429B7ACC7C7FE31D /* XCRemoteSwiftPackageReference "KZFileWatchers" */;
|
||||||
productName = KZFileWatchers;
|
productName = KZFileWatchers;
|
||||||
};
|
};
|
||||||
|
A593735D882778FD2C9A185B /* DesignKit */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
productName = DesignKit;
|
||||||
|
};
|
||||||
A5A56C4F47C368EBE5C5E870 /* DesignKit */ = {
|
A5A56C4F47C368EBE5C5E870 /* DesignKit */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
productName = DesignKit;
|
productName = DesignKit;
|
||||||
@@ -5391,6 +5403,11 @@
|
|||||||
package = AC3475112CA40C2C6E78D1EB /* XCRemoteSwiftPackageReference "matrix-analytics-events" */;
|
package = AC3475112CA40C2C6E78D1EB /* XCRemoteSwiftPackageReference "matrix-analytics-events" */;
|
||||||
productName = AnalyticsEvents;
|
productName = AnalyticsEvents;
|
||||||
};
|
};
|
||||||
|
DCA3C4A997AD28E6918D4CE5 /* Compound */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = 9754C4B03F6255F67FC15E52 /* XCRemoteSwiftPackageReference "compound-ios" */;
|
||||||
|
productName = Compound;
|
||||||
|
};
|
||||||
DE8DC9B3FBA402117DC4C49F /* Kingfisher */ = {
|
DE8DC9B3FBA402117DC4C49F /* Kingfisher */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = D283517192CAC3E2E6920765 /* XCRemoteSwiftPackageReference "Kingfisher" */;
|
package = D283517192CAC3E2E6920765 /* XCRemoteSwiftPackageReference "Kingfisher" */;
|
||||||
|
|||||||
@@ -16,15 +16,21 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import Intents
|
import Intents
|
||||||
|
import SwiftUI
|
||||||
import UserNotifications
|
import UserNotifications
|
||||||
|
|
||||||
struct NotificationIcon {
|
struct NotificationIcon {
|
||||||
|
struct GroupInfo {
|
||||||
|
let name: String
|
||||||
|
let id: String
|
||||||
|
}
|
||||||
|
|
||||||
let mediaSource: MediaSourceProxy?
|
let mediaSource: MediaSourceProxy?
|
||||||
// Required as the key to set images for groups
|
// Required as the key to set images for groups
|
||||||
let groupName: String?
|
let groupInfo: GroupInfo?
|
||||||
|
|
||||||
var shouldDisplayAsGroup: Bool {
|
var shouldDisplayAsGroup: Bool {
|
||||||
groupName != nil
|
groupInfo != nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,11 +105,12 @@ extension UNMutableNotificationContent {
|
|||||||
senderID: String,
|
senderID: String,
|
||||||
senderName: String,
|
senderName: String,
|
||||||
icon: NotificationIcon) async throws -> UNMutableNotificationContent {
|
icon: NotificationIcon) async throws -> UNMutableNotificationContent {
|
||||||
var image = INImage(named: "")
|
var fetchedImage: INImage?
|
||||||
|
let image: INImage
|
||||||
if let mediaSource = icon.mediaSource {
|
if let mediaSource = icon.mediaSource {
|
||||||
switch await mediaProvider?.loadImageDataFromSource(mediaSource) {
|
switch await mediaProvider?.loadImageDataFromSource(mediaSource) {
|
||||||
case .success(let data):
|
case .success(let data):
|
||||||
image = INImage(imageData: data)
|
fetchedImage = INImage(imageData: data)
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
MXLog.error("Couldn't add sender icon: \(error)")
|
MXLog.error("Couldn't add sender icon: \(error)")
|
||||||
case .none:
|
case .none:
|
||||||
@@ -111,6 +118,15 @@ extension UNMutableNotificationContent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let fetchedImage {
|
||||||
|
image = fetchedImage
|
||||||
|
} else if let data = await getPlaceholderAvatarImageData(name: icon.groupInfo?.name ?? senderName,
|
||||||
|
id: icon.groupInfo?.name ?? senderName) {
|
||||||
|
image = INImage(imageData: data)
|
||||||
|
} else {
|
||||||
|
image = INImage(named: "")
|
||||||
|
}
|
||||||
|
|
||||||
let senderHandle = INPersonHandle(value: senderID, type: .unknown)
|
let senderHandle = INPersonHandle(value: senderID, type: .unknown)
|
||||||
let sender = INPerson(personHandle: senderHandle,
|
let sender = INPerson(personHandle: senderHandle,
|
||||||
nameComponents: nil,
|
nameComponents: nil,
|
||||||
@@ -122,10 +138,10 @@ extension UNMutableNotificationContent {
|
|||||||
// These are required to show the group name as subtitle
|
// These are required to show the group name as subtitle
|
||||||
var speakableGroupName: INSpeakableString?
|
var speakableGroupName: INSpeakableString?
|
||||||
var recipients: [INPerson]?
|
var recipients: [INPerson]?
|
||||||
if let groupName = icon.groupName {
|
if let groupInfo = icon.groupInfo {
|
||||||
let meHandle = INPersonHandle(value: receiverID, type: .unknown)
|
let meHandle = INPersonHandle(value: receiverID, type: .unknown)
|
||||||
let me = INPerson(personHandle: meHandle, nameComponents: nil, displayName: nil, image: nil, contactIdentifier: nil, customIdentifier: nil, isMe: true)
|
let me = INPerson(personHandle: meHandle, nameComponents: nil, displayName: nil, image: nil, contactIdentifier: nil, customIdentifier: nil, isMe: true)
|
||||||
speakableGroupName = INSpeakableString(spokenPhrase: groupName)
|
speakableGroupName = INSpeakableString(spokenPhrase: groupInfo.name)
|
||||||
recipients = [sender, me]
|
recipients = [sender, me]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,4 +173,13 @@ extension UNMutableNotificationContent {
|
|||||||
// swiftlint:disable:next force_cast
|
// swiftlint:disable:next force_cast
|
||||||
return updatedContent.mutableCopy() as! UNMutableNotificationContent
|
return updatedContent.mutableCopy() as! UNMutableNotificationContent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func getPlaceholderAvatarImageData(name: String, id: String) async -> Data? {
|
||||||
|
let image = PlaceholderAvatarImage(name: name,
|
||||||
|
contentID: id)
|
||||||
|
.clipShape(Circle())
|
||||||
|
.frame(width: 100, height: 100)
|
||||||
|
let renderer = await ImageRenderer(content: image)
|
||||||
|
return await renderer.uiImage?.jpegData(compressionQuality: 0.8)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,11 @@
|
|||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
import Compound
|
||||||
|
import DesignKit
|
||||||
|
|
||||||
struct PlaceholderAvatarImage: View {
|
struct PlaceholderAvatarImage: View {
|
||||||
@Environment(\.redactionReasons) var redactionReasons
|
@Environment(\.redactionReasons) private var redactionReasons
|
||||||
|
|
||||||
private let textForImage: String
|
private let textForImage: String
|
||||||
private let contentID: String?
|
private let contentID: String?
|
||||||
|
|||||||
@@ -185,6 +185,15 @@ extension NotificationItemProxyProtocol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var icon: NotificationIcon {
|
||||||
|
if isDirect {
|
||||||
|
return NotificationIcon(mediaSource: senderAvatarMediaSource, groupInfo: nil)
|
||||||
|
} else {
|
||||||
|
return NotificationIcon(mediaSource: roomAvatarMediaSource,
|
||||||
|
groupInfo: .init(name: roomDisplayName, id: roomID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Process the receiver item proxy
|
/// Process the receiver item proxy
|
||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - receiverId: identifier of the user that has received the notification
|
/// - receiverId: identifier of the user that has received the notification
|
||||||
@@ -236,13 +245,10 @@ extension NotificationItemProxyProtocol {
|
|||||||
|
|
||||||
notification.categoryIdentifier = NotificationConstants.Category.invite
|
notification.categoryIdentifier = NotificationConstants.Category.invite
|
||||||
|
|
||||||
let icon: NotificationIcon
|
|
||||||
let body: String
|
let body: String
|
||||||
if !isDirect {
|
if !isDirect {
|
||||||
icon = NotificationIcon(mediaSource: roomAvatarMediaSource, groupName: roomDisplayName)
|
|
||||||
body = L10n.notificationRoomInviteBody
|
body = L10n.notificationRoomInviteBody
|
||||||
} else {
|
} else {
|
||||||
icon = NotificationIcon(mediaSource: senderAvatarMediaSource, groupName: nil)
|
|
||||||
body = L10n.notificationInviteBody
|
body = L10n.notificationInviteBody
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,17 +298,9 @@ extension NotificationItemProxyProtocol {
|
|||||||
}
|
}
|
||||||
notification.categoryIdentifier = NotificationConstants.Category.message
|
notification.categoryIdentifier = NotificationConstants.Category.message
|
||||||
|
|
||||||
let senderName = senderDisplayName ?? roomDisplayName
|
|
||||||
let icon: NotificationIcon
|
|
||||||
if !isDirect {
|
|
||||||
icon = NotificationIcon(mediaSource: roomAvatarMediaSource, groupName: roomDisplayName)
|
|
||||||
} else {
|
|
||||||
icon = NotificationIcon(mediaSource: senderAvatarMediaSource, groupName: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
notification = try await notification.addSenderIcon(using: mediaProvider,
|
notification = try await notification.addSenderIcon(using: mediaProvider,
|
||||||
senderID: event.senderID,
|
senderID: event.senderID,
|
||||||
senderName: senderName,
|
senderName: senderDisplayName ?? roomDisplayName,
|
||||||
icon: icon)
|
icon: icon)
|
||||||
return notification
|
return notification
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ targets:
|
|||||||
- package: KeychainAccess
|
- package: KeychainAccess
|
||||||
- package: Kingfisher
|
- package: Kingfisher
|
||||||
- package: Collections
|
- package: Collections
|
||||||
|
- package: Compound
|
||||||
|
- package: DesignKit
|
||||||
|
|
||||||
info:
|
info:
|
||||||
path: ../SupportingFiles/Info.plist
|
path: ../SupportingFiles/Info.plist
|
||||||
@@ -91,3 +93,4 @@ targets:
|
|||||||
- path: ../../ElementX/Sources/Other/Extensions/UNNotificationContent.swift
|
- path: ../../ElementX/Sources/Other/Extensions/UNNotificationContent.swift
|
||||||
- path: ../../ElementX/Sources/Other/UserPreference.swift
|
- path: ../../ElementX/Sources/Other/UserPreference.swift
|
||||||
- path: ../../ElementX/Sources/Other/SharedUserDefaultsKeys.swift
|
- path: ../../ElementX/Sources/Other/SharedUserDefaultsKeys.swift
|
||||||
|
- path: ../../ElementX/Sources/Other/SwiftUI/Views/PlaceholderAvatarImage.swift
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Push Notifications of rooms/dm without avatars will now display the default placeholder used in app.
|
||||||
Reference in New Issue
Block a user