Fix Android notification avatars, E2EE wake alerts, and tap navigation.
Some checks failed
Build / increment-version (push) Successful in 5s
Build / build-android (push) Failing after 5m3s

Show circular sender avatars with MessagingStyle, notify on encrypted background sync events, deep-link tray taps into the right room, and suppress Firefox open-link contextual actions.
This commit is contained in:
2026-07-24 15:03:03 +10:00
parent 3940441d9b
commit 157d707581
7 changed files with 518 additions and 57 deletions

View File

@@ -66,14 +66,25 @@ interface MatrixBackgroundSyncPlugin {
}): Promise<{ success: boolean }>;
/** Post a message notification with optional avatar (base64) from the JS layer. */
showNotification(options: {
title: string;
body: string;
title?: string;
body?: string;
senderName?: string;
messageText?: string;
conversationTitle?: string;
path?: string;
roomId: string;
groupId: string;
groupName: string;
kind: string;
largeIconBase64?: string;
bigPictureBase64?: string;
}): Promise<{ shown: boolean }>;
/** Pending navigation target from a native notification tap. */
getPendingNotificationNav(): Promise<{ path?: string | null; roomId?: string | null }>;
addListener(
eventName: 'notificationOpened',
listenerFunc: (event: { path?: string; roomId?: string }) => void
): Promise<PluginListenerHandle>;
addListener(
eventName: 'unifiedPushNewEndpoint',
listenerFunc: (event: UnifiedPushEndpointEvent) => void
@@ -580,13 +591,18 @@ export const syncNotificationGroupMap = async (
* Prefer this over Capacitor LocalNotifications on Android.
*/
export const showNativeNotification = async (options: {
title: string;
body: string;
title?: string;
body?: string;
senderName?: string;
messageText?: string;
conversationTitle?: string;
path?: string;
roomId: string;
groupId: string;
groupName: string;
kind: string;
largeIconBase64?: string;
bigPictureBase64?: string;
}): Promise<boolean> => {
if (!isBackgroundSyncSupported()) return false;
@@ -598,3 +614,30 @@ export const showNativeNotification = async (options: {
return false;
}
};
/** Consume a pending native notification navigation target, if any. */
export const getPendingNotificationNav = async (): Promise<{
path?: string | null;
roomId?: string | null;
}> => {
if (!isBackgroundSyncSupported()) return {};
try {
return await MatrixBackgroundSync.getPendingNotificationNav();
} catch (err) {
console.warn('[BackgroundSync] getPendingNotificationNav failed:', err);
return {};
}
};
/** Subscribe to native notification taps that open the app. */
export const listenForNotificationOpens = async (
listener: (event: { path?: string; roomId?: string }) => void
): Promise<PluginListenerHandle | undefined> => {
if (!isBackgroundSyncSupported()) return undefined;
try {
return await MatrixBackgroundSync.addListener('notificationOpened', listener);
} catch (err) {
console.warn('[BackgroundSync] notificationOpened listener failed:', err);
return undefined;
}
};