From c263b681d45eb7e44c5c7a75acf4d79436301856 Mon Sep 17 00:00:00 2001 From: Max Litruv Boonzaayer Date: Sun, 26 Apr 2026 14:32:19 +1000 Subject: [PATCH] feat: add ShareRoomPicker component for selecting rooms to share Android content - Implemented ShareRoomPicker component to allow users to pick a room for sharing content received from Android intents. - Integrated search functionality to filter rooms and directs. - Added virtualized list for efficient rendering of room options. - Created utility functions for handling Android share payloads, including fetching and clearing pending shares. Co-authored-by: Copilot --- android/app/build.gradle | 4 +- android/app/src/main/AndroidManifest.xml | 18 ++ .../java/com/paarrot/app/MainActivity.java | 3 +- .../java/com/paarrot/app/MatrixSyncService.kt | 39 ++- .../com/paarrot/app/ShareHandlerPlugin.kt | 196 ++++++++++++++ .../src/main/res/drawable/ic_stat_paarrot.xml | 37 ++- cinny | 2 +- full_logcat.txt | Bin 0 -> 947140 bytes overlay/src/app/features/ShareRoomPicker.tsx | 255 ++++++++++++++++++ .../notifications/SystemNotification.tsx | 132 ++++++++- .../app/pages/client/ClientNonUIFeatures.tsx | 154 ++++++++++- overlay/src/app/utils/androidShare.ts | 73 +++++ overlay/src/app/utils/backgroundSync.ts | 203 ++++++++++++-- scripts/apply-overlay.mjs | 24 +- 14 files changed, 1090 insertions(+), 50 deletions(-) create mode 100644 android/app/src/main/java/com/paarrot/app/ShareHandlerPlugin.kt create mode 100644 full_logcat.txt create mode 100644 overlay/src/app/features/ShareRoomPicker.tsx create mode 100644 overlay/src/app/utils/androidShare.ts diff --git a/android/app/build.gradle b/android/app/build.gradle index 800e8eb..95dc739 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,8 +27,8 @@ android { applicationId "com.paarrot.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" + versionCode 1777176952 + versionName "2026-04-26.041552.151" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2c6d96c..6509eb6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -22,6 +22,24 @@ + + + + + + + + + + + + + + + + + + (64) + /** In-memory cache of MXID → display name to avoid redundant API calls per service run. */ + private val displayNameCache = HashMap(16) + override fun onBind(intent: Intent?) = null override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -140,6 +143,9 @@ class MatrixSyncService : Service() { } private fun processRoomEvents(sync: JSONObject, myUserId: String) { + val prefs = applicationContext.getSharedPreferences(SyncServicePlugin.PREFS, Context.MODE_PRIVATE) + val homeserver = prefs.getString(EXTRA_HOMESERVER, null)?.trimEnd('/') ?: return + val token = prefs.getString(EXTRA_TOKEN, null) ?: return val joinedRooms = sync.optJSONObject("rooms")?.optJSONObject("join") ?: return val nm = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager ensureMessageChannel(nm) @@ -161,13 +167,44 @@ class MatrixSyncService : Service() { val content = event.optJSONObject("content") ?: continue val body = content.optString("body").takeIf { it.isNotBlank() } ?: continue val sender = event.optString("sender") - val senderName = sender.substringAfter("@").substringBefore(":") + val senderName = resolveDisplayName(sender, homeserver, token) showMessageNotification(nm, senderName, body) } } } + private fun resolveDisplayName(mxid: String, homeserver: String, token: String): String { + displayNameCache[mxid]?.let { return it } + + val fallback = mxid.substringAfter("@").substringBefore(":") + return try { + val encodedId = URLEncoder.encode(mxid, "UTF-8") + val url = "$homeserver/_matrix/client/v3/profile/$encodedId/displayname" + val conn = URL(url).openConnection() as HttpURLConnection + val name = try { + conn.requestMethod = "GET" + conn.setRequestProperty("Authorization", "Bearer $token") + conn.setRequestProperty("Accept", "application/json") + conn.connectTimeout = 4_000 + conn.readTimeout = 4_000 + if (conn.responseCode == 200) { + val body = conn.inputStream.bufferedReader().readText() + JSONObject(body).optString("displayname").takeIf { it.isNotBlank() } ?: fallback + } else { + fallback + } + } finally { + conn.disconnect() + } + displayNameCache[mxid] = name + name + } catch (e: Exception) { + Log.w(TAG, "Could not resolve display name for $mxid: ${e.message}") + fallback + } + } + private fun showMessageNotification(nm: NotificationManager, sender: String, body: String) { val launchIntent = packageManager.getLaunchIntentForPackage(packageName) ?: Intent(this, MainActivity::class.java) diff --git a/android/app/src/main/java/com/paarrot/app/ShareHandlerPlugin.kt b/android/app/src/main/java/com/paarrot/app/ShareHandlerPlugin.kt new file mode 100644 index 0000000..0ac7975 --- /dev/null +++ b/android/app/src/main/java/com/paarrot/app/ShareHandlerPlugin.kt @@ -0,0 +1,196 @@ +package com.paarrot.app + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import com.getcapacitor.JSArray +import com.getcapacitor.JSObject +import com.getcapacitor.Plugin +import com.getcapacitor.PluginCall +import com.getcapacitor.PluginMethod +import com.getcapacitor.annotation.CapacitorPlugin +import java.io.File +import java.io.FileOutputStream + +/** Payload for a single shared file. */ +data class SharedFilePayload( + val path: String, + val name: String, + val mimeType: String, + val size: Long, +) + +/** Full payload delivered to JS when a share intent is received. */ +data class SharePayload( + val text: String?, + val subject: String?, + val files: List, + val receivedAt: Long, +) { + /** Serialize to a [JSObject] for the Capacitor bridge. */ + fun toJsObject(): JSObject { + val obj = JSObject() + obj.put("text", text) + obj.put("subject", subject) + + val filesArray = JSArray() + for (f in files) { + val fileObj = JSObject() + fileObj.put("path", f.path) + fileObj.put("name", f.name) + fileObj.put("mimeType", f.mimeType) + fileObj.put("size", f.size) + filesArray.put(fileObj) + } + obj.put("files", filesArray) + obj.put("receivedAt", receivedAt) + return obj + } +} + +/** Singleton that bridges between Android activity lifecycle and the Capacitor plugin. */ +object ShareIntentStore { + var plugin: ShareHandlerPlugin? = null + var pendingShare: SharePayload? = null + + /** Parse [intent] and, if it is a share action, store the payload and notify JS. */ + fun handleIntent(context: Context, intent: Intent?) { + if (intent == null) return + val action = intent.action ?: return + + if (action != Intent.ACTION_SEND && action != Intent.ACTION_SEND_MULTIPLE) return + + val receivedAt = System.currentTimeMillis() + val text = intent.getStringExtra(Intent.EXTRA_TEXT) + val subject = intent.getStringExtra(Intent.EXTRA_SUBJECT) + + val uris = mutableListOf() + if (action == Intent.ACTION_SEND_MULTIPLE) { + @Suppress("UNCHECKED_CAST") + val list = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, Uri::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM) + } + list?.let { uris.addAll(it) } + } else { + val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(Intent.EXTRA_STREAM) + } + uri?.let { uris.add(it) } + } + + val copiedFiles = uris.mapNotNull { copySharedUri(context, it, receivedAt) } + + val payload = SharePayload( + text = text, + subject = subject, + files = copiedFiles, + receivedAt = receivedAt, + ) + + pendingShare = payload + plugin?.emitShare(payload) + } + + private fun copySharedUri(context: Context, uri: Uri, receivedAt: Long): SharedFilePayload? { + return try { + val resolver = context.contentResolver + val mimeType = resolver.getType(uri) ?: "application/octet-stream" + + val originalName = resolver.query(uri, arrayOf("_display_name"), null, null, null) + ?.use { cursor -> + if (cursor.moveToFirst()) cursor.getString(0) else null + } ?: uri.lastPathSegment ?: "shared_file" + + val safeName = sanitizeFileName(originalName) + val destDir = File(context.cacheDir, "shared-intents/$receivedAt") + destDir.mkdirs() + + var destFile = File(destDir, safeName) + var counter = 1 + while (destFile.exists()) { + val dot = safeName.lastIndexOf('.') + val base = if (dot >= 0) safeName.substring(0, dot) else safeName + val ext = if (dot >= 0) safeName.substring(dot) else "" + destFile = File(destDir, "${base}_$counter$ext") + counter++ + } + + resolver.openInputStream(uri)?.use { input -> + FileOutputStream(destFile).use { output -> input.copyTo(output) } + } + + SharedFilePayload( + path = destFile.absolutePath, + name = destFile.name, + mimeType = mimeType, + size = destFile.length(), + ) + } catch (e: Exception) { + android.util.Log.e("ShareHandlerPlugin", "Failed to copy shared URI: $uri", e) + null + } + } + + private fun sanitizeFileName(name: String): String { + return name.replace(Regex("[^a-zA-Z0-9._\\-]"), "_").take(128).ifEmpty { "file" } + } + + /** Remove cached files from a previous share and clear the stored payload. */ + fun clearIntent(receivedAt: Long?) { + if (receivedAt != null) { + val dir = plugin?.context?.let { File(it.cacheDir, "shared-intents/$receivedAt") } + dir?.deleteRecursively() + } + pendingShare = null + } +} + +/** Capacitor plugin that exposes Android share intents to JavaScript. */ +@CapacitorPlugin(name = "AndroidShareHandler") +class ShareHandlerPlugin : Plugin() { + + override fun load() { + ShareIntentStore.plugin = this + ShareIntentStore.handleIntent(context, activity.intent) + } + + override fun handleOnNewIntent(intent: Intent?) { + super.handleOnNewIntent(intent) + ShareIntentStore.handleIntent(context, intent) + } + + /** Fire the `shareReceived` event toward the JS layer. */ + fun emitShare(payload: SharePayload) { + notifyListeners("shareReceived", payload.toJsObject()) + } + + /** Returns the pending share payload (if any) as a JS object. */ + @PluginMethod + fun getPendingShare(call: PluginCall) { + val pending = ShareIntentStore.pendingShare + if (pending == null) { + val result = JSObject() + result.put("share", JSObject.NULL) + call.resolve(result) + } else { + val result = JSObject() + result.put("share", pending.toJsObject()) + call.resolve(result) + } + } + + /** Clears the pending share and removes any copied temp files. */ + @PluginMethod + fun clearPendingShare(call: PluginCall) { + ShareIntentStore.clearIntent(ShareIntentStore.pendingShare?.receivedAt) + call.resolve() + } +} diff --git a/android/app/src/main/res/drawable/ic_stat_paarrot.xml b/android/app/src/main/res/drawable/ic_stat_paarrot.xml index 8ea915e..6501ff5 100644 --- a/android/app/src/main/res/drawable/ic_stat_paarrot.xml +++ b/android/app/src/main/res/drawable/ic_stat_paarrot.xml @@ -2,15 +2,30 @@ - - - + android:viewportWidth="18" + android:viewportHeight="18"> + + + + + + \ No newline at end of file diff --git a/cinny b/cinny index 7b69ed6..ef0aa2a 160000 --- a/cinny +++ b/cinny @@ -1 +1 @@ -Subproject commit 7b69ed6df85fdbfa22df5957c268fd874a10f749 +Subproject commit ef0aa2a8478950466933065d0f71ab33e762caec diff --git a/full_logcat.txt b/full_logcat.txt new file mode 100644 index 0000000000000000000000000000000000000000..b538b5cac1307dce675477fa2105c28c5440b70e GIT binary patch literal 947140 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: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 literal 0 HcmV?d00001 diff --git a/overlay/src/app/features/ShareRoomPicker.tsx b/overlay/src/app/features/ShareRoomPicker.tsx new file mode 100644 index 0000000..bd10d0f --- /dev/null +++ b/overlay/src/app/features/ShareRoomPicker.tsx @@ -0,0 +1,255 @@ +import { useAtomValue } from 'jotai'; +import React, { ChangeEventHandler, useCallback, useMemo, useRef, useState } from 'react'; +import { useVirtualizer } from '@tanstack/react-virtual'; +import FocusTrap from 'focus-trap-react'; +import { + Avatar, + Box, + Header, + Icon, + IconButton, + Icons, + Input, + MenuItem, + Modal, + Overlay, + OverlayBackdrop, + OverlayCenter, + Scroll, + Text, + config, +} from 'folds'; +import { useMatrixClient } from '../hooks/useMatrixClient'; +import { useAllJoinedRoomsSet, useGetRoom } from '../hooks/useGetRoom'; +import { allRoomsAtom } from '../state/room-list/roomList'; +import { mDirectAtom } from '../state/mDirectList'; +import { useDirects, useRooms } from '../state/hooks/roomList'; +import { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '../utils/room'; +import { RoomAvatar, RoomIcon } from '../components/room-avatar'; +import { nameInitials } from '../utils/common'; +import { useMediaAuthentication } from '../hooks/useMediaAuthentication'; +import { factoryRoomIdByActivity } from '../utils/sort'; +import { + SearchItemStrGetter, + useAsyncSearch, + UseAsyncSearchOptions, +} from '../hooks/useAsyncSearch'; +import { VirtualTile } from '../components/virtualizer'; +import { AndroidSharePayload } from '../utils/androidShare'; +import { stopPropagation } from '../utils/keyboard'; + +const SEARCH_OPTS: UseAsyncSearchOptions = { + limit: 200, + matchOptions: { + contain: true, + }, +}; + +type ShareRoomPickerProps = { + /** The pending share payload to display a preview of. */ + share: AndroidSharePayload; + /** Called when the user picks a room. */ + onPick: (roomId: string) => void; + /** Called when the user dismisses without picking. */ + onDismiss: () => void; +}; + +/** + * Full-screen modal that lets the user pick a room to send + * an incoming Android share intent into. + */ +export function ShareRoomPicker({ share, onPick, onDismiss }: ShareRoomPickerProps) { + const mx = useMatrixClient(); + const useAuthentication = useMediaAuthentication(); + const scrollRef = useRef(null); + + const mDirects = useAtomValue(mDirectAtom); + const allRoomsSet = useAllJoinedRoomsSet(); + const getRoom = useGetRoom(allRoomsSet); + const rooms = useRooms(mx, allRoomsAtom, mDirects); + const directs = useDirects(mx, allRoomsAtom, mDirects); + + const allItems = useMemo( + () => [...rooms, ...directs].sort(factoryRoomIdByActivity(mx)), + [mx, rooms, directs] + ); + + const getRoomNameStr: SearchItemStrGetter = useCallback( + (rId) => getRoom(rId)?.name ?? rId, + [getRoom] + ); + + const [searchResult, searchRoom, resetSearch] = useAsyncSearch( + allItems, + getRoomNameStr, + SEARCH_OPTS + ); + + const items = searchResult ? searchResult.items : allItems; + + const virtualizer = useVirtualizer({ + count: items.length, + getScrollElement: () => scrollRef.current, + estimateSize: () => 48, + overscan: 8, + }); + const vItems = virtualizer.getVirtualItems(); + + const handleSearchChange: ChangeEventHandler = (evt) => { + const value = evt.currentTarget.value.trim(); + if (!value) { + resetSearch(); + return; + } + searchRoom(value); + }; + + const handleRoomClick: React.MouseEventHandler = (evt) => { + const roomId = evt.currentTarget.getAttribute('data-room-id'); + if (roomId) { + onPick(roomId); + } + }; + + const previewText = share.text?.slice(0, 80) ?? share.subject?.slice(0, 80); + const fileCount = share.files.length; + + return ( + }> + + + + +
+ + Share to Room + {(previewText || fileCount > 0) && ( + + {previewText + ? `"${previewText}${(share.text?.length ?? 0) > 80 ? '…' : ''}"` + : `${fileCount} file${fileCount !== 1 ? 's' : ''}`} + + )} + + + + + + +
+ + + } + placeholder="Search rooms…" + size="400" + variant="Background" + outlined + autoFocus + /> + + + + + {vItems.length === 0 && ( + + + {searchResult ? 'No Match Found' : 'No Rooms'} + + + {searchResult + ? `No rooms found for "${searchResult.query}".` + : 'You have no rooms to share into.'} + + + )} + + {vItems.map((vItem) => { + const roomId = items[vItem.index]; + const room = getRoom(roomId); + if (!room) return null; + const isDm = mDirects.has(roomId); + + const avatarSrc = isDm + ? getDirectRoomAvatarUrl(mx, room, 96, useAuthentication) + : getRoomAvatarUrl(mx, room, 96, useAuthentication); + + return ( + + + {avatarSrc ? ( + ( + + {nameInitials(room.name)} + + )} + /> + ) : ( + + )} + + } + > + + + {room.name} + + + + + ); + })} + + + +
+
+
+
+
+ ); +} diff --git a/overlay/src/app/features/settings/notifications/SystemNotification.tsx b/overlay/src/app/features/settings/notifications/SystemNotification.tsx index f8f5764..4b31548 100644 --- a/overlay/src/app/features/settings/notifications/SystemNotification.tsx +++ b/overlay/src/app/features/settings/notifications/SystemNotification.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { Box, Text, Switch, Button, color, Spinner } from 'folds'; import { IPusherRequest } from 'matrix-js-sdk'; import { SequenceCard } from '../../../components/sequence-card'; @@ -11,6 +11,12 @@ import { useEmailNotifications } from '../../../hooks/useEmailNotifications'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { isCapacitorNative, requestSystemNotificationPermission } from '../../../utils/tauri'; +import { + isBackgroundSyncSupported, + getBackgroundSyncStatus, + requestResetPushRegistration, + triggerBackgroundSyncPing, +} from '../../../utils/backgroundSync'; function EmailNotification() { const mx = useMatrixClient(); @@ -147,6 +153,7 @@ export function SystemNotification() { after={} /> + {isBackgroundSyncSupported() && } ); } + +type PushStatus = { + registered: boolean; + distributor: string; + endpoint: string; +}; + +/** Android-only section showing UnifiedPush registration status and controls. */ +function AndroidPushNotifications() { + const [status, setStatus] = useState(undefined); + const [loading, setLoading] = useState(true); + + const refresh = useCallback(async () => { + setLoading(true); + const s = await getBackgroundSyncStatus(); + setStatus( + s + ? { + registered: s.registered, + distributor: s.distributor || '', + endpoint: s.endpoint || '', + } + : undefined + ); + setLoading(false); + }, []); + + useEffect(() => { + void refresh(); + }, [refresh]); + + const [resetState, reset] = useAsyncCallback( + useCallback(async () => { + await requestResetPushRegistration(); + await refresh(); + }, [refresh]) + ); + + const [pingState, ping] = useAsyncCallback( + useCallback(async () => { + await triggerBackgroundSyncPing('manual-test'); + }, []) + ); + + const isBusy = + loading || + resetState.status === AsyncStatus.Loading || + pingState.status === AsyncStatus.Loading; + + return ( + + Android Push (UnifiedPush) + + + Failed to read push status. + + ) : status.registered ? ( + <> + + {`Distributor: ${status.distributor || 'unknown'}`} + + + ) : ( + + Not registered. Tap "Reset" to choose a distributor app. + + ) + } + after={loading ? : undefined} + /> + void reset()} + > + {resetState.status === AsyncStatus.Loading ? ( + + ) : ( + Reset + )} + + } + /> + void ping()} + > + {pingState.status === AsyncStatus.Loading ? ( + + ) : ( + Send Test + )} + + } + /> + + + ); +} diff --git a/overlay/src/app/pages/client/ClientNonUIFeatures.tsx b/overlay/src/app/pages/client/ClientNonUIFeatures.tsx index d675ae8..8f6072f 100644 --- a/overlay/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/overlay/src/app/pages/client/ClientNonUIFeatures.tsx @@ -1,5 +1,6 @@ import { useAtomValue } from 'jotai'; -import React, { ReactNode, useCallback, useEffect, useRef } from 'react'; +import { useAtom, useSetAtom } from 'jotai'; +import React, { ReactNode, useCallback, useEffect, useRef, useState, Fragment } from 'react'; import { useNavigate } from 'react-router-dom'; import { RoomEvent, RoomEventHandlerMap } from 'matrix-js-sdk'; import { roomToUnreadAtom, unreadEqual, unreadInfoToUnread } from '../../state/room/roomToUnread'; @@ -28,6 +29,8 @@ import { roomToParentsAtom } from '../../state/room/roomToParents'; import { useSelectedRoom } from '../../hooks/router/useSelectedRoom'; import { useInboxNotificationsSelected } from '../../hooks/router/useInbox'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; +import { plainToEditorInput, toPlainText } from '../../components/editor'; +import { ShareRoomPicker } from '../../features/ShareRoomPicker'; import { isTauri, isElectron, @@ -41,6 +44,20 @@ import { stopBackgroundSync, setAppForegroundState, } from '../../utils/backgroundSync'; +import { + TUploadItem, + roomIdToMsgDraftAtomFamily, + roomIdToUploadItemsAtomFamily, +} from '../../state/room/roomInputDrafts'; +import { encryptFile } from '../../utils/matrix'; +import { + AndroidSharePayload, + clearPendingAndroidShare, + getPendingAndroidShare, + isAndroidShareSupported, + listenForAndroidShares, + materializeSharedFile, +} from '../../utils/androidShare'; /** * Applies the selected emoji style font to the document. @@ -426,8 +443,13 @@ function MessageNotifications() { */ function BackgroundSyncSetup() { const mx = useMatrixClient(); + // Try to make a simple fetch to verify component is rendering + try { + fetch('/_matrix/client/v3/sync', { method: 'HEAD' }).catch(() => {}); + } catch {} useEffect(() => { + console.log('BackgroundSyncSetup: Starting background sync for', mx.getUserId()); startBackgroundSync(mx); const onVisibility = () => setAppForegroundState(!document.hidden); @@ -493,6 +515,135 @@ function TaskbarFlashStopper() { return null; } +function AndroidShareIntentHandler() { + const mx = useMatrixClient(); + const [isMarkdown] = useSetting(settingsAtom, 'isMarkdown'); + const [pendingShare, setPendingShare] = useState(null); + const [pickedRoomId, setPickedRoomId] = useState(null); + const [msgDraft, setMsgDraft] = useAtom(roomIdToMsgDraftAtomFamily(pickedRoomId ?? '__android_share__')); + const setUploadItems = useSetAtom(roomIdToUploadItemsAtomFamily(pickedRoomId ?? '__android_share__')); + + const applyPendingShare = useCallback( + async (share: AndroidSharePayload, roomId: string) => { + const room = mx.getRoom(roomId); + if (!room) return false; + + const nextParts = [share.subject?.trim(), share.text?.trim()].filter( + (value): value is string => !!value + ); + if (nextParts.length > 0) { + const existingText = toPlainText(msgDraft, isMarkdown).trim(); + const nextText = existingText ? `${existingText}\n${nextParts.join('\n')}` : nextParts.join('\n'); + setMsgDraft(plainToEditorInput(nextText, isMarkdown)); + } + + if (share.files.length > 0) { + const uploadItems: TUploadItem[] = []; + for (const sharedFile of share.files) { + const originalFile = await materializeSharedFile(sharedFile, share.receivedAt); + if (room.hasEncryptionStateEvent()) { + const encrypted = await encryptFile(originalFile); + uploadItems.push({ + file: encrypted.file, + originalFile, + metadata: { markedAsSpoiler: false }, + encInfo: encrypted.encInfo, + }); + continue; + } + + uploadItems.push({ + file: originalFile, + originalFile, + metadata: { markedAsSpoiler: false }, + encInfo: undefined, + }); + } + + setUploadItems({ + type: 'PUT', + item: uploadItems, + }); + } + + await clearPendingAndroidShare(); + return true; + }, + [isMarkdown, msgDraft, mx, setMsgDraft, setUploadItems] + ); + + const handlePickRoom = useCallback( + (roomId: string) => { + setPickedRoomId(roomId); + if (!pendingShare) return; + + applyPendingShare(pendingShare, roomId) + .then((applied) => { + if (applied) { + setPendingShare(null); + setPickedRoomId(null); + } + }) + .catch((err) => { + console.error('[AndroidShare] Failed to apply share after pick:', err); + setPendingShare(null); + setPickedRoomId(null); + }); + }, + [applyPendingShare, pendingShare] + ); + + const handleDismiss = useCallback(() => { + clearPendingAndroidShare().catch(() => {}); + setPendingShare(null); + setPickedRoomId(null); + }, []); + + useEffect(() => { + if (!isAndroidShareSupported()) return; + + let mounted = true; + let listenerHandle: { remove: () => Promise } | undefined; + + getPendingAndroidShare() + .then((share) => { + if (mounted && share) { + setPendingShare(share); + } + }) + .catch((err) => { + console.error('[AndroidShare] Failed to get pending share:', err); + }); + + listenForAndroidShares((share) => { + if (mounted) { + setPendingShare(share); + } + }) + .then((handle) => { + listenerHandle = handle; + }) + .catch((err) => { + console.error('[AndroidShare] Failed to listen for shares:', err); + }); + + return () => { + mounted = false; + void listenerHandle?.remove(); + }; + }, []); + + if (!pendingShare) return null; + + return ( + + ); +} + type ClientNonUIFeaturesProps = { children: ReactNode; }; @@ -508,6 +659,7 @@ export function ClientNonUIFeatures({ children }: ClientNonUIFeaturesProps) { + {children} ); diff --git a/overlay/src/app/utils/androidShare.ts b/overlay/src/app/utils/androidShare.ts new file mode 100644 index 0000000..445cc96 --- /dev/null +++ b/overlay/src/app/utils/androidShare.ts @@ -0,0 +1,73 @@ +import { Capacitor, registerPlugin, type PluginListenerHandle } from '@capacitor/core'; + +/** Metadata for a file received from an Android share intent. */ +export type AndroidSharedFile = { + path: string; + name: string; + mimeType: string; + size: number; +}; + +/** Payload persisted by the native Android share handler. */ +export type AndroidSharePayload = { + text?: string; + subject?: string; + files: AndroidSharedFile[]; + receivedAt: number; +}; + +interface AndroidShareHandlerPlugin { + /** Returns the last pending share payload, if one exists. */ + getPendingShare(): Promise<{ share: AndroidSharePayload | null }>; + /** Clears the last pending share payload after it has been consumed. */ + clearPendingShare(): Promise; + addListener( + eventName: 'shareReceived', + listenerFunc: (payload: AndroidSharePayload) => void + ): Promise; +} + +const AndroidShareHandler = registerPlugin('AndroidShareHandler'); + +/** Returns true when the Android share bridge is available. */ +export const isAndroidShareSupported = (): boolean => + Capacitor.isNativePlatform() && Capacitor.getPlatform() === 'android'; + +/** Fetches the current pending native share payload. */ +export const getPendingAndroidShare = async (): Promise => { + if (!isAndroidShareSupported()) return null; + const result = await AndroidShareHandler.getPendingShare(); + return result.share; +}; + +/** Clears the native pending share payload. */ +export const clearPendingAndroidShare = async (): Promise => { + if (!isAndroidShareSupported()) return; + await AndroidShareHandler.clearPendingShare(); +}; + +/** Subscribes to new incoming native share payloads. */ +export const listenForAndroidShares = async ( + listener: (payload: AndroidSharePayload) => void +): Promise => { + if (!isAndroidShareSupported()) return undefined; + return AndroidShareHandler.addListener('shareReceived', listener); +}; + +/** Converts a cached native shared file into a browser File for upload. */ +export const materializeSharedFile = async ( + sharedFile: AndroidSharedFile, + receivedAt: number +): Promise => { + const fileUrl = Capacitor.convertFileSrc(sharedFile.path); + const response = await fetch(fileUrl); + if (!response.ok) { + throw new Error(`Failed to read shared file: ${sharedFile.name}`); + } + + const blob = await response.blob(); + return new File([blob], sharedFile.name, { + type: sharedFile.mimeType || blob.type, + lastModified: receivedAt, + }); +}; \ No newline at end of file diff --git a/overlay/src/app/utils/backgroundSync.ts b/overlay/src/app/utils/backgroundSync.ts index f4cdea7..9f31676 100644 --- a/overlay/src/app/utils/backgroundSync.ts +++ b/overlay/src/app/utils/backgroundSync.ts @@ -7,7 +7,7 @@ type UnifiedPushStatus = { instance: string; registered: boolean; distributor: string; - distributors: string[]; + distributors: string[] | string; }; type UnifiedPushEndpointEvent = { @@ -36,6 +36,8 @@ interface MatrixBackgroundSyncPlugin { }): Promise; /** Trigger a one-shot fetch as if a push ping arrived. */ triggerPing(options: { reason?: string }): Promise; + /** Re-open distributor setup flow and retry registration. */ + requestDistributorSetup(): Promise<{ success: boolean }>; /** Stop any in-flight fetch, clear credentials, and unregister UnifiedPush. */ stop(): Promise; /** @@ -112,6 +114,24 @@ const clearStoredPusherState = (userId: string | null, deviceId: string | null): window.localStorage.removeItem(getStoredPusherKey(userId, deviceId)); }; +const normalizeDistributors = (raw: UnifiedPushStatus['distributors']): string[] => { + if (Array.isArray(raw)) return raw; + if (typeof raw !== 'string') return []; + + const trimmed = raw.trim(); + if (!trimmed || trimmed === '[]') return []; + + if (trimmed.startsWith('[') && trimmed.endsWith(']')) { + return trimmed + .slice(1, -1) + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean); + } + + return [trimmed]; +}; + const resolveUnifiedPushGateway = async (endpoint: string): Promise => { try { const discoveryUrl = new URL(endpoint); @@ -143,31 +163,52 @@ class AndroidUnifiedPushManager { private listenersReady = false; + private distributorSetupAttempted = false; + + private distributorPromptShown = false; + /** Start native UnifiedPush registration and synchronize the Matrix pusher. */ async start(mx: MatrixClient): Promise { - if (!isBackgroundSyncSupported()) return; + console.log('[BackgroundSync] start() called, platform:', Capacitor.getPlatform(), 'isNative:', Capacitor.isNativePlatform()); + + if (!isBackgroundSyncSupported()) { + console.log('[BackgroundSync] Background sync not supported on this platform'); + return; + } const homeserverUrl = mx.getHomeserverUrl(); const accessToken = mx.getAccessToken(); const userId = mx.getUserId(); const deviceId = mx.getDeviceId(); + console.log('[BackgroundSync] Credentials check:', { userId, deviceId, hasToken: !!accessToken, hasUrl: !!homeserverUrl }); + if (!homeserverUrl || !accessToken || !userId) { console.warn('[BackgroundSync] Missing credentials, not starting'); return; } this.client = mx; + this.distributorSetupAttempted = false; + this.distributorPromptShown = false; await this.ensureListeners(); - await MatrixBackgroundSync.start({ - homeserverUrl, - accessToken, - userId, - deviceId: deviceId ?? '', - }); + try { + console.log('[BackgroundSync] Calling plugin.start()...'); + await MatrixBackgroundSync.start({ + homeserverUrl, + accessToken, + userId, + deviceId: deviceId ?? '', + }); + console.log('[BackgroundSync] plugin.start() completed'); + } catch (err) { + console.error('[BackgroundSync] plugin.start() failed:', err); + throw err; + } await this.syncExistingEndpoint(); + await this.ensureDistributorPromptFromStatus(); console.log('[BackgroundSync] UnifiedPush registration requested'); } @@ -227,6 +268,67 @@ class AndroidUnifiedPushManager { /** Log native registration failures so the missing distributor path is visible. */ private handleRegistrationFailed(event: UnifiedPushRegistrationFailedEvent): void { console.warn('[BackgroundSync] UnifiedPush registration failed:', event.reason); + + if (event.reason !== 'ACTION_REQUIRED' || this.distributorSetupAttempted) { + return; + } + + this.distributorSetupAttempted = true; + void this.tryRequestDistributorSetup(); + } + + /** Re-opens distributor selection once after ACTION_REQUIRED and logs actionable status. */ + private async tryRequestDistributorSetup(): Promise { + try { + const setupResult = await MatrixBackgroundSync.requestDistributorSetup(); + console.warn('[BackgroundSync] requestDistributorSetup result:', setupResult); + const status = await this.safeGetStatus(); + console.warn('[BackgroundSync] UnifiedPush status after setup attempt:', status); + const distributors = normalizeDistributors(status?.distributors ?? []); + if (distributors.length === 0) { + console.error( + '[BackgroundSync] No UnifiedPush distributor installed. Install one (for example ntfy) to enable Android background notifications.' + ); + this.showNoDistributorPrompt(); + } + } catch (err) { + console.warn('[BackgroundSync] requestDistributorSetup failed:', err); + } + } + + /** Fallback check so users still get prompted even when ACTION_REQUIRED event is missed. */ + private async ensureDistributorPromptFromStatus(): Promise { + const status = await this.safeGetStatus(); + if (!status) return; + + const distributors = normalizeDistributors(status.distributors); + if (!status.registered && distributors.length === 0) { + console.error( + '[BackgroundSync] No UnifiedPush distributor installed. Install one (for example ntfy) to enable Android background notifications.' + ); + this.showNoDistributorPrompt(); + } + } + + /** Show a one-time actionable prompt when no distributor app is installed. */ + private showNoDistributorPrompt(): void { + if (this.distributorPromptShown) return; + this.distributorPromptShown = true; + + const message = + 'Android background notifications need a UnifiedPush distributor app. Install one (for example ntfy), then reopen Paarrot.'; + const docsUrl = 'https://unifiedpush.org/users/distributors/'; + + if (typeof window === 'undefined') return; + + try { + const openDocs = window.confirm(`${message}\n\nOpen distributor list now?`); + if (openDocs) { + window.open(docsUrl, '_blank', 'noopener,noreferrer'); + } + } catch { + window.alert(message); + } } /** Install plugin listeners once for the active Matrix client. */ @@ -235,7 +337,9 @@ class AndroidUnifiedPushManager { this.listenerHandles = [ await MatrixBackgroundSync.addListener('unifiedPushNewEndpoint', (event) => { - void this.handleNewEndpoint(event); + void this.handleNewEndpoint(event).catch((err) => { + console.error('[BackgroundSync] handleNewEndpoint failed:', err); + }); }), await MatrixBackgroundSync.addListener('unifiedPushUnregistered', (event) => { void this.handleUnregistered(event); @@ -260,6 +364,7 @@ class AndroidUnifiedPushManager { if (!client) return; const status = await this.safeGetStatus(); + console.log('[BackgroundSync] Native status before pusher sync:', status); if (status?.registered && status.endpoint) { await this.upsertPusher(client, status.endpoint); } @@ -272,20 +377,40 @@ class AndroidUnifiedPushManager { const appId = buildPusherAppId(deviceId); const gatewayUrl = await resolveUnifiedPushGateway(endpoint); - await mx.setPusher({ - kind: 'http', - app_id: appId, - pushkey: endpoint, - app_display_name: 'Paarrot', - device_display_name: deviceId ?? 'Android', - lang: 'en', - data: { - url: gatewayUrl, - format: 'event_id_only', - }, - append: false, - device_id: deviceId ?? undefined, - } as unknown as IPusherRequest); + console.log('[BackgroundSync] Upserting Matrix pusher', { + appId, + endpoint, + gatewayUrl, + deviceId, + userId, + }); + + try { + await mx.setPusher({ + kind: 'http', + app_id: appId, + pushkey: endpoint, + app_display_name: 'Paarrot', + device_display_name: deviceId ?? 'Android', + lang: 'en', + data: { + url: gatewayUrl, + format: 'event_id_only', + }, + append: false, + device_id: deviceId ?? undefined, + } as unknown as IPusherRequest); + + const pushers = (await mx.getPushers())?.pushers ?? []; + const thisPusher = pushers.find((p) => p.pushkey === endpoint && p.app_id === appId); + console.log('[BackgroundSync] Matrix pusher upserted successfully', { + totalPushers: pushers.length, + foundThisPusher: Boolean(thisPusher), + }); + } catch (err) { + console.error('[BackgroundSync] Matrix pusher upsert failed:', err); + throw err; + } saveStoredPusherState(userId, deviceId, { endpoint, appId }); } @@ -359,3 +484,35 @@ export const setAppForegroundState = async (foreground: boolean): Promise console.warn('[BackgroundSync] setAppForeground failed:', err); } }; + +/** + * Re-opens the UnifiedPush distributor selection dialog. + * Allows users to re-select or change their push notification distributor without terminal access. + * Useful when the current endpoint becomes unavailable. + */ +export const requestResetPushRegistration = async (): Promise<{ success: boolean }> => { + if (!isBackgroundSyncSupported()) { + console.warn('[BackgroundSync] Background sync not supported on this platform'); + return { success: false }; + } + + try { + const result = await MatrixBackgroundSync.requestDistributorSetup(); + console.log('[BackgroundSync] requestDistributorSetup completed:', result); + return result ?? { success: false }; + } catch (err) { + console.error('[BackgroundSync] requestDistributorSetup failed:', err); + return { success: false }; + } +}; + +/** Returns the current native UnifiedPush status, or undefined if unavailable. */ +export const getBackgroundSyncStatus = async (): Promise => { + if (!isBackgroundSyncSupported()) return undefined; + try { + return await MatrixBackgroundSync.getStatus(); + } catch (err) { + console.warn('[BackgroundSync] getStatus failed:', err); + return undefined; + } +}; diff --git a/scripts/apply-overlay.mjs b/scripts/apply-overlay.mjs index c866503..f379c6b 100644 --- a/scripts/apply-overlay.mjs +++ b/scripts/apply-overlay.mjs @@ -30,6 +30,14 @@ const STASH_FLAG = join(ROOT, '.cinny-stash-pending'); const cinnyStatus = execSync('git status --porcelain', { cwd: CINNY, encoding: 'utf8' }); if (cinnyStatus.trim()) { console.log('[apply-overlay] Stashing pre-existing cinny changes...'); + // Ensure android/ junction is excluded from the cinny git view — otherwise + // `git stash -u` would traverse the junction into the root android/ directory + // and delete files there when the stash is created. + const cinnyExclude = join(CINNY, '.git', 'info', 'exclude'); + const excludeContent = existsSync(cinnyExclude) ? readFileSync(cinnyExclude, 'utf8') : ''; + if (!excludeContent.includes('android/')) { + writeFileSync(cinnyExclude, excludeContent + (excludeContent.endsWith('\n') || !excludeContent ? '' : '\n') + 'android/\n', 'utf8'); + } execSync('git stash push -u -m "pre-overlay stash"', { cwd: CINNY, stdio: 'inherit' }); writeFileSync(STASH_FLAG, '1', 'utf8'); console.log('[apply-overlay] Stash saved.'); @@ -120,21 +128,19 @@ if (!existsSync(androidJunction)) { console.log(` android/ link already exists, skipping`); } -// 8. Sync version from root package.json into android/app/build.gradle -console.log('[apply-overlay] Syncing version into build.gradle...'); -const rootPkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8')); -const version = rootPkg.version ?? '1.0.0'; -const parts = version.split('.').map(Number); -// versionCode: major*10000 + minor*100 + patch (e.g. 4.11.78 -> 41178) -const versionCode = (parts[0] ?? 0) * 10000 + (parts[1] ?? 0) * 100 + (parts[2] ?? 0); +// 8. Sync time-based version into android/app/build.gradle +console.log('[apply-overlay] Syncing time-based version into build.gradle...'); +const buildTimestampMs = Date.now(); +const versionCode = Math.floor(buildTimestampMs / 1000); +const versionName = new Date(buildTimestampMs).toISOString().replace('T', '.').replaceAll(':', '').replace('Z', ''); const buildGradlePath = join(androidTarget, 'app', 'build.gradle'); let buildGradle = readFileSync(buildGradlePath, 'utf8'); buildGradle = buildGradle .replace(/versionCode\s+\d+/, `versionCode ${versionCode}`) - .replace(/versionName\s+"[^"]+"/, `versionName "${version}"`); + .replace(/versionName\s+"[^"]+"/, `versionName "${versionName}"`); writeFileSync(buildGradlePath, buildGradle, 'utf8'); -console.log(` versionName "${version}", versionCode ${versionCode}`); +console.log(` versionName "${versionName}", versionCode ${versionCode}`); // 9. Write android/local.properties with the current machine's Android SDK path const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;