From b726cd8fc265c5ce8e809e931d310f811d1cd8a4 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 12:57:35 +0200 Subject: [PATCH 1/7] fix(profile): a save that fails is a failure Nextcloud Social reads a multipart PATCH of the credentials, and since 0.26.124 it never answers 500 over half a profile: what can be refused is checked before anything is written, and a later failure is logged while the rest is stored and answered with 200. So a 5xx means nothing was saved, and the profile is no longer read back after one to see what was made anyway; the save is a failure, as on any server. The endpoint no longer says Social ignores a multipart PATCH: one request carries the pictures, names and fields. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- .../aloha/core/data/profile/OwnProfile.kt | 27 ++-------- .../aloha/core/data/profile/OwnProfileTest.kt | 53 +++++++++++++++++++ .../endpoints/AccountExtraEndpoints.kt | 5 +- .../aloha/core/testing/SignedInFixture.kt | 3 ++ 4 files changed, 60 insertions(+), 28 deletions(-) create mode 100644 core/data/src/test/kotlin/social/aloha/core/data/profile/OwnProfileTest.kt diff --git a/core/data/src/main/kotlin/social/aloha/core/data/profile/OwnProfile.kt b/core/data/src/main/kotlin/social/aloha/core/data/profile/OwnProfile.kt index 7bbe2ef5..43933d72 100644 --- a/core/data/src/main/kotlin/social/aloha/core/data/profile/OwnProfile.kt +++ b/core/data/src/main/kotlin/social/aloha/core/data/profile/OwnProfile.kt @@ -11,7 +11,6 @@ import social.aloha.core.data.answer import social.aloha.core.database.AccountDao import social.aloha.core.model.Account import social.aloha.core.model.SignedInAccount -import social.aloha.core.network.ApiError import social.aloha.core.network.ApiRequest import social.aloha.core.network.endpoints.AccountEndpoints import social.aloha.core.network.endpoints.CredentialEndpoints @@ -21,8 +20,6 @@ import social.aloha.core.network.endpoints.CredentialsUpdate * The reader's own profile as they edit it: loaded with its source (the note as written, the * posting defaults), saved with only what changed, pictures removed where asked. What the server * answers with becomes the stored account, so the switcher shows the new name and picture. - * Nextcloud Social can answer a save with a 500 after it made it; the profile it then has says - * whether it did. */ @Singleton public class OwnProfile @Inject constructor(private val clients: ClientFactory, private val accounts: AccountDao) { @@ -44,37 +41,19 @@ public class OwnProfile @Inject constructor(private val clients: ClientFactory, CredentialEndpoints.deleteHeader().takeIf { removeHeader }, CredentialEndpoints.update(changes).takeIf { !changes.isEmpty }, ) - val saved = run(reader, steps, changes) ?: load(reader) + val saved = run(reader, steps) ?: load(reader) // the stored account is what the switcher and the shell draw, so they follow at once (saved as? Answer.Got)?.value?.let { accounts.setProfile(reader.id, it.displayName, it.avatar, it.header) } return saved } /** Makes [steps] in turn; the last answer, or the first refusal, which stops the rest; null for none. */ - private suspend fun run( - reader: SignedInAccount, - steps: List>, - changes: CredentialsUpdate, - ): Answer? { + private suspend fun run(reader: SignedInAccount, steps: List>): Answer? { var last: Answer? = null for (step in steps) { - last = answer(reader, step, changes) + last = clients.answer(reader, step) if (last is Answer.Missed) break } return last } - - /** [step]'s answer, or a server error's that the profile shows was made regardless. */ - private suspend fun answer(reader: SignedInAccount, step: ApiRequest, changes: CredentialsUpdate) = - clients.answer(reader, step).let { if (it.lost()) made(reader, changes) ?: it else it } - - private fun Answer.lost() = (this as? Answer.Missed)?.error is ApiError.Server - - /** The profile as it is, when it shows [changes] made in spite of the answer; null when it does not. */ - private suspend fun made(reader: SignedInAccount, changes: CredentialsUpdate): Answer? { - val now = (load(reader) as? Answer.Got)?.value ?: return null - val shown = (changes.displayName == null || changes.displayName == now.displayName) && - (changes.note == null || changes.note == now.source?.note) - return Answer.Got(now).takeIf { shown && changes.avatar == null && changes.header == null } - } } diff --git a/core/data/src/test/kotlin/social/aloha/core/data/profile/OwnProfileTest.kt b/core/data/src/test/kotlin/social/aloha/core/data/profile/OwnProfileTest.kt new file mode 100644 index 00000000..8653a72d --- /dev/null +++ b/core/data/src/test/kotlin/social/aloha/core/data/profile/OwnProfileTest.kt @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2026 Aloha Social contributors +// SPDX-License-Identifier: MIT + +package social.aloha.core.data.profile + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import java.util.concurrent.CopyOnWriteArrayList +import kotlinx.coroutines.runBlocking +import mockwebserver3.Dispatcher +import mockwebserver3.MockResponse +import mockwebserver3.MockWebServer +import mockwebserver3.RecordedRequest +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import social.aloha.core.data.Answer +import social.aloha.core.network.ApiError +import social.aloha.core.network.endpoints.CredentialsUpdate +import social.aloha.core.testing.SignedInFixture + +@RunWith(RobolectricTestRunner::class) +class OwnProfileTest { + private val context = ApplicationProvider.getApplicationContext() + private val fixture = SignedInFixture(context) + private val asked = CopyOnWriteArrayList() + private val server = MockWebServer().apply { + dispatcher = object : Dispatcher() { + override fun dispatch(request: RecordedRequest): MockResponse { + asked += "${request.method} ${request.url.encodedPath}" + return MockResponse.Builder().code(500).body("{}").build() + } + } + start() + } + + @After + fun close() { + fixture.close() + server.close() + } + + @Test + fun `a save the server fails is a failure, not looked up again`() = runBlocking { + val reader = fixture.signIn(server.url("/")) + val saved = fixture.ownProfile.save(reader, CredentialsUpdate(displayName = "Alice"), false, false) + assertTrue((saved as Answer.Missed).error is ApiError.Server) + assertEquals(listOf("PATCH /api/v1/accounts/update_credentials"), asked) + } +} diff --git a/core/network/src/main/kotlin/social/aloha/core/network/endpoints/AccountExtraEndpoints.kt b/core/network/src/main/kotlin/social/aloha/core/network/endpoints/AccountExtraEndpoints.kt index 4aa7a8be..5934e7aa 100644 --- a/core/network/src/main/kotlin/social/aloha/core/network/endpoints/AccountExtraEndpoints.kt +++ b/core/network/src/main/kotlin/social/aloha/core/network/endpoints/AccountExtraEndpoints.kt @@ -85,10 +85,7 @@ public object CredentialEndpoints { private fun account(endpoint: Endpoint): ApiRequest = request(endpoint, AccountDto.serializer()) { it.toDomain() } - /** - * A form when no picture goes, multipart only with one: a PHP server reads a multipart body for - * `POST` alone, so Nextcloud Social answers a multipart `PATCH` with 200 and changes nothing. - */ + /** A form when no picture goes, multipart with one: the pictures, names and fields in one request. */ public fun update(changes: CredentialsUpdate): ApiRequest { val parts = changes.parts() val body = if (parts.any { it is Part.FileContent }) { diff --git a/core/testing/src/main/kotlin/social/aloha/core/testing/SignedInFixture.kt b/core/testing/src/main/kotlin/social/aloha/core/testing/SignedInFixture.kt index febabf5f..281b0b58 100644 --- a/core/testing/src/main/kotlin/social/aloha/core/testing/SignedInFixture.kt +++ b/core/testing/src/main/kotlin/social/aloha/core/testing/SignedInFixture.kt @@ -28,6 +28,7 @@ import social.aloha.core.data.nextcloud.NextcloudConnection import social.aloha.core.data.notifications.NotificationsRepository import social.aloha.core.data.notifications.RaisedNotifications import social.aloha.core.data.photos.Albums +import social.aloha.core.data.profile.OwnProfile import social.aloha.core.data.sync.UnreadCounts import social.aloha.core.data.sync.WidgetUpdates import social.aloha.core.data.timeline.CacheSweeper @@ -128,6 +129,8 @@ public class SignedInFixture(private val context: Context) : Closeable { /** The reader's albums, their posts stored in [statuses]. */ public val albums: Albums by lazy { Albums(clients, statuses) } + public val ownProfile: OwnProfile by lazy { OwnProfile(clients, database.accountDao()) } + /** What sends posts, storing what the server made in an in-memory cache. */ public val sender: PostSender by lazy { val statuses = StatusRepository(cache.value.statusDao(), clock) From 0d442c3a97743eb1900cefc0c50f6683cfee6fdc Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 13:58:36 +0200 Subject: [PATCH 2/7] docs(server): a new account answers at once on Social 0.26.119 Checked on the dev instance: an account created moments before answers verify_credentials and its first post with 200, and removing the avatar answers 200 with Nextcloud's generated one, verify_credentials straight after included. The 500 a new account met was seen on 0.26.97 and fixed in 0.26.104, so the notes say so; sign-in keeps falling back to /oauth/userinfo on a 5xx for older servers. A Nextcloud user without a Social account cannot authorize an app at all, as the authorize page needs the account to exist; the server notes say that too. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- .../src/main/kotlin/social/aloha/core/data/SignInCoordinator.kt | 2 +- .../main/kotlin/social/aloha/core/database/AccountsDatabase.kt | 2 +- docs/02-server-api.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/data/src/main/kotlin/social/aloha/core/data/SignInCoordinator.kt b/core/data/src/main/kotlin/social/aloha/core/data/SignInCoordinator.kt index 598b08da..4f8e3207 100644 --- a/core/data/src/main/kotlin/social/aloha/core/data/SignInCoordinator.kt +++ b/core/data/src/main/kotlin/social/aloha/core/data/SignInCoordinator.kt @@ -134,7 +134,7 @@ public class SignInCoordinator @Inject constructor( /** * `verify_credentials`, or `/oauth/userinfo` when the server cannot describe a brand-new account - * yet (Nextcloud Social answers 500 until its avatar cache job has run). + * yet: Nextcloud Social before 0.26.104 answered 500 until its avatar cache job had run. */ private suspend fun describe(pending: PendingAuthorization, base: HttpUrl, token: AccessToken): SignInResult { val client = clients.create(base) { Credentials(token.value) } diff --git a/core/database/src/main/kotlin/social/aloha/core/database/AccountsDatabase.kt b/core/database/src/main/kotlin/social/aloha/core/database/AccountsDatabase.kt index fcb88cf9..ada5bb5a 100644 --- a/core/database/src/main/kotlin/social/aloha/core/database/AccountsDatabase.kt +++ b/core/database/src/main/kotlin/social/aloha/core/database/AccountsDatabase.kt @@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.Flow * * @property capabilitiesJson the detected server capabilities, refreshed every 24 hours. * @property profilePending set while the server cannot describe a brand-new account yet (Nextcloud - * Social answers 500 from `verify_credentials` until its avatar cache job has run). + * Social before 0.26.104 answered 500 from `verify_credentials` until its avatar cache job had run). */ @Entity(tableName = "account") public data class AccountEntity( diff --git a/docs/02-server-api.md b/docs/02-server-api.md index 69ef63f5..45368eda 100644 --- a/docs/02-server-api.md +++ b/docs/02-server-api.md @@ -11,7 +11,7 @@ This is the Apple app's specification, carried over as the product contract for | Boosts | `reblog` is always `null`; a boost is not visible as a boost. | | Media | `POST /api/v2/media` answers 200 synchronously; `focus` is stored; `hls_url` and video `meta` are empty without ffmpeg on the server. | | Pagination | `Link` headers point at the app path even through the root rules; `limit=0` answers 400. `min_id` answers with the posts immediately above the anchor and `since_id` with the newest above it, as on Mastodon, so a refresh asks with `since_id` and a full page leaves a gap between it and the cache. | -| New accounts | `verify_credentials`, `accounts/lookup` and the first post answer 500 until the avatar cache job runs. | +| New accounts | Before 0.26.104 (seen on 0.26.97), `verify_credentials`, `accounts/lookup` and the first post answered 500 until the avatar cache job ran. On 0.26.119 an account created moments before answers `verify_credentials` and its first post with 200 (`accounts/lookup` not checked again). Sign-in still falls back to `/oauth/userinfo` on a 5xx, for older servers. A Nextcloud user without a Social account cannot authorize an app at all: the authorize page needs the account to exist. | | Places and reactions | `place_*` is never stored; reactions come only from `/statuses/{id}/reactions`. | | Web-server rules | Show the server's own `contrib/webserver` files; the snippet described here is outdated. | | Client | Plain OkHttp with kotlinx.serialization, one `ApiClient` per account base. Decoding is lenient (ids, URLs, booleans and dates in any of the shapes servers send) and lossy (a malformed row in a list is dropped and recorded, the rest of the page stays). | From c81fd4412619d432e3b2e0b84707223fc007f86c Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 15:11:13 +0200 Subject: [PATCH 3/7] fix(network): a placeholder picture is not the account's own Mastodon's API requires a URL for both pictures, so servers send a placeholder where an account set none. Nextcloud Social says which since 0.26.125, with avatar_default and header_default on every account, and repairs the headers older versions stored as the account's avatar. Mastodon says nothing, and its default header is headers/{style}/missing.png. Decoding now reads a header Social marks as default, and Mastodon's missing.png, as no header, where every account is read rather than only on the profile, which knew missing.png alone; the profile's own check goes. The account keeps whether its avatar is a stand-in, and Edit profile offers no removal of one: removing it would give the same picture back. A header that is a placeholder had been offered for removal as well. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- .../kotlin/social/aloha/core/model/Account.kt | 4 +++ .../aloha/core/network/dto/AccountDto.kt | 25 +++++++++++++++++-- .../aloha/core/network/dto/DtoDecodingTest.kt | 24 ++++++++++++++++++ docs/02-server-api.md | 1 + .../feature/profile/EditProfileScreen.kt | 4 +-- .../feature/profile/EditProfileViewModel.kt | 5 ++-- .../feature/profile/ProfilePresentation.kt | 2 +- .../aloha/feature/profile/EditProfileTest.kt | 10 ++++++++ 8 files changed, 68 insertions(+), 7 deletions(-) diff --git a/core/model/src/main/kotlin/social/aloha/core/model/Account.kt b/core/model/src/main/kotlin/social/aloha/core/model/Account.kt index 7f1bb6ee..a5c90e22 100644 --- a/core/model/src/main/kotlin/social/aloha/core/model/Account.kt +++ b/core/model/src/main/kotlin/social/aloha/core/model/Account.kt @@ -12,6 +12,9 @@ import kotlinx.serialization.Serializable * @property acct `alice` for a local account, `alice@example.social` for a remote one. * @property avatar none when the server sends `""` or `null`, which Nextcloud Social does for an * account whose avatar it has not cached yet. + * @property avatarDefault the avatar is the server's stand-in, not a picture the account chose + * (Nextcloud Social says so; other servers do not, and it stays false there). + * @property header none as well when it is only the server's stand-in for "no header". * @property source present only on the credentials routes, which answer for the account itself. */ @Serializable @@ -25,6 +28,7 @@ public data class Account( val uri: String? = null, val avatar: String? = null, val avatarStatic: String? = null, + val avatarDefault: Boolean = false, val header: String? = null, val headerStatic: String? = null, val locked: Boolean = false, diff --git a/core/network/src/main/kotlin/social/aloha/core/network/dto/AccountDto.kt b/core/network/src/main/kotlin/social/aloha/core/network/dto/AccountDto.kt index 1fb57e4d..65684828 100644 --- a/core/network/src/main/kotlin/social/aloha/core/network/dto/AccountDto.kt +++ b/core/network/src/main/kotlin/social/aloha/core/network/dto/AccountDto.kt @@ -7,6 +7,7 @@ import java.time.Instant import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import social.aloha.core.model.Account import social.aloha.core.model.AccountField import social.aloha.core.model.AccountSource @@ -17,6 +18,7 @@ import social.aloha.core.network.decoding.LenientInstantSerializer import social.aloha.core.network.decoding.LenientIntSerializer import social.aloha.core.network.decoding.LenientUrlSerializer import social.aloha.core.network.decoding.LossyListSerializer +import social.aloha.core.network.decoding.OptionalBoolSerializer import social.aloha.core.network.decoding.OrNullSerializer @Serializable @@ -32,6 +34,10 @@ internal data class AccountDto( @SerialName("avatar_static") @Serializable(with = LenientUrlSerializer::class) val avatarStatic: String? = null, @Serializable(with = LenientUrlSerializer::class) val header: String? = null, @SerialName("header_static") @Serializable(with = LenientUrlSerializer::class) val headerStatic: String? = null, + @SerialName("avatar_default") @Serializable(with = OptionalBoolSerializer::class) + val avatarDefault: Boolean? = null, + @SerialName("header_default") @Serializable(with = OptionalBoolSerializer::class) + val headerDefault: Boolean? = null, @Serializable(with = LenientBoolSerializer::class) val locked: Boolean = false, @Serializable(with = LenientBoolSerializer::class) val bot: Boolean = false, @Serializable(with = LenientBoolSerializer::class) val discoverable: Boolean = false, @@ -85,8 +91,9 @@ internal fun AccountDto.toDomain(): Account { uri = uri, avatar = avatar, avatarStatic = avatarStatic, - header = header, - headerStatic = headerStatic, + avatarDefault = avatarDefault == true, + header = header.takeUnless(::isPlaceholderHeader), + headerStatic = headerStatic.takeUnless(::isPlaceholderHeader), locked = locked, bot = bot, discoverable = discoverable, @@ -106,6 +113,20 @@ internal fun AccountDto.toDomain(): Account { ) } +/** + * Whether [header] stands in for "no header", so that the profile draws its own empty banner and the + * editor offers no removal of a picture nobody chose. Mastodon's API requires a URL, so servers send + * a placeholder rather than none: Nextcloud Social says so with `header_default`; Mastodon does not, + * and its `headers/{style}/missing.png` is recognised by its address. + */ +private fun AccountDto.isPlaceholderHeader(header: String?): Boolean { + if (headerDefault == true) return true + val last = header?.toHttpUrlOrNull()?.pathSegments?.takeLast(MASTODON_MISSING_SEGMENTS) ?: return false + return last.size == MASTODON_MISSING_SEGMENTS && last[0] == "headers" && last[2] == "missing.png" +} + +private const val MASTODON_MISSING_SEGMENTS = 3 + internal fun AccountFieldDto.toDomain(): AccountField = AccountField(name, value, verifiedAt) internal fun AccountSourceDto.toDomain(): AccountSource = AccountSource( diff --git a/core/network/src/test/kotlin/social/aloha/core/network/dto/DtoDecodingTest.kt b/core/network/src/test/kotlin/social/aloha/core/network/dto/DtoDecodingTest.kt index cbdca916..d9cc54fd 100644 --- a/core/network/src/test/kotlin/social/aloha/core/network/dto/DtoDecodingTest.kt +++ b/core/network/src/test/kotlin/social/aloha/core/network/dto/DtoDecodingTest.kt @@ -50,6 +50,30 @@ class DtoDecodingTest { assertEquals(null, decodeStatus(status(""", "quote_approval": "public"""")).quoteApproval) } + @Test + fun `a placeholder header is no header, a picture the account set is kept`() { + fun account(json: String) = decodeStatus("""{"id": "1", "account": {"id": "2", "username": "alice", $json}}""") + .account + val placeholder = "https://cloud.example/apps-extra/social/img/header-missing.png" + assertNull(account(""""header": "$placeholder", "header_default": true""").header) + val chosen = "https://cloud.example/index.php/apps/social/media/02aa6a9a.png" + assertEquals(chosen, account(""""header": "$chosen", "header_default": false""").header) + assertNull(account(""""header": "https://mastodon.example/headers/original/missing.png"""").header) + val uploadedAsMissing = "https://pleroma.example/media/5f1c/missing.png" + assertEquals(uploadedAsMissing, account(""""header": "$uploadedAsMissing"""").header) + } + + @Test + fun `an avatar the server stands in with is marked, and one without the flag is the account's own`() { + fun account(json: String) = decodeStatus("""{"id": "1", "account": {"id": "2", "username": "alice", $json}}""") + .account + val route = "https://cloud.example/index.php/avatar/alice/128" + val generated = account(""""avatar": "$route", "avatar_default": true""") + assertEquals(route, generated.avatar) + assertTrue(generated.avatarDefault) + assertFalse(account(""""avatar": "https://mastodon.example/a.png"""").avatarDefault) + } + @Test fun `an account without acct falls back to its username`() { val s = decodeStatus("""{"id": "1", "account": {"id": "2", "username": "bob", "avatar": null}}""") diff --git a/docs/02-server-api.md b/docs/02-server-api.md index 45368eda..ff03c949 100644 --- a/docs/02-server-api.md +++ b/docs/02-server-api.md @@ -12,6 +12,7 @@ This is the Apple app's specification, carried over as the product contract for | Media | `POST /api/v2/media` answers 200 synchronously; `focus` is stored; `hls_url` and video `meta` are empty without ffmpeg on the server. | | Pagination | `Link` headers point at the app path even through the root rules; `limit=0` answers 400. `min_id` answers with the posts immediately above the anchor and `since_id` with the newest above it, as on Mastodon, so a refresh asks with `since_id` and a full page leaves a gap between it and the cache. | | New accounts | Before 0.26.104 (seen on 0.26.97), `verify_credentials`, `accounts/lookup` and the first post answered 500 until the avatar cache job ran. On 0.26.119 an account created moments before answers `verify_credentials` and its first post with 200 (`accounts/lookup` not checked again). Sign-in still falls back to `/oauth/userinfo` on a 5xx, for older servers. A Nextcloud user without a Social account cannot authorize an app at all: the authorize page needs the account to exist. | +| Pictures | Before 0.26.119 a local account had `avatar: ""` and its Nextcloud avatar as `header`; 0.26.119 stopped that fallback without repairing what it had stored. Since 0.26.125 a repair step clears those headers, the avatar is the same on every route, the header placeholder is `img/header-missing.png`, and every Account carries `avatar_default` and `header_default` ([AlohaSocial/social#2487](https://github.com/AlohaSocial/social/issues/2487)). The app reads a banner the Account marks with `header_default: true`, and Mastodon's `headers/…/missing.png` (Mastodon has no such field), as no header, and Edit profile offers no removal of an `avatar_default` avatar. | | Places and reactions | `place_*` is never stored; reactions come only from `/statuses/{id}/reactions`. | | Web-server rules | Show the server's own `contrib/webserver` files; the snippet described here is outdated. | | Client | Plain OkHttp with kotlinx.serialization, one `ApiClient` per account base. Decoding is lenient (ids, URLs, booleans and dates in any of the shapes servers send) and lossy (a malformed row in a list is dropped and recorded, the rest of the page stays). | diff --git a/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileScreen.kt b/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileScreen.kt index fbb562b3..65f2f534 100644 --- a/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileScreen.kt +++ b/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileScreen.kt @@ -180,7 +180,7 @@ private fun Pictures(form: ProfileForm, onForm: (ProfileForm) -> Unit) { PictureButtons( R.string.profile_edit_header, R.string.profile_edit_remove_header, - form.header !is Picture.Kept || form.header.shown != null, + form.header !is Picture.Kept || form.header.chosen, { pickHeader.launch(image) }, ) { onForm(form.copy(header = Picture.Removed)) } Row(horizontalArrangement = Arrangement.spacedBy(AlohaSpacing.m)) { @@ -188,7 +188,7 @@ private fun Pictures(form: ProfileForm, onForm: (ProfileForm) -> Unit) { PictureButtons( R.string.profile_edit_avatar, R.string.profile_edit_remove_avatar, - form.avatar !is Picture.Kept || form.avatar.shown != null, + form.avatar !is Picture.Kept || form.avatar.chosen, { pickAvatar.launch(image) }, ) { onForm(form.copy(avatar = Picture.Removed)) } } diff --git a/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileViewModel.kt b/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileViewModel.kt index 48a086a3..6e2f05eb 100644 --- a/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileViewModel.kt +++ b/feature/profile/src/main/kotlin/social/aloha/feature/profile/EditProfileViewModel.kt @@ -37,7 +37,8 @@ import social.aloha.core.ui.extensionFor /** A picture of the profile: as it is on the server, one picked on the phone, or none. */ @Immutable internal sealed interface Picture { - data class Kept(val url: String?) : Picture + /** What the account has; [chosen] when it is a picture of its own, not the server's stand-in. */ + data class Kept(val url: String?, val chosen: Boolean = url != null) : Picture data class Picked(val uri: String) : Picture @@ -77,7 +78,7 @@ internal data class ProfileForm( indexable = account.indexable, privacy = source?.privacy ?: Visibility.Public, sensitive = source?.sensitive == true, - avatar = Picture.Kept(account.avatar), + avatar = Picture.Kept(account.avatar, chosen = !account.avatarDefault), header = Picture.Kept(account.header), ) } diff --git a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfilePresentation.kt b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfilePresentation.kt index 798f183c..26e12a4c 100644 --- a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfilePresentation.kt +++ b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfilePresentation.kt @@ -55,7 +55,7 @@ internal object ProfilePresentation { return ProfileHeader( author = mapper.author(account), emojis = account.emojis, - headerUrl = account.header?.takeUnless { it.endsWith("/missing.png") }, + headerUrl = account.header, note = StatusHtmlParser.parse(account.note, emojis = account.emojis).toAnnotatedString(colors), fields = account.fields.map { field -> ProfileHeader.Field( diff --git a/feature/profile/src/test/kotlin/social/aloha/feature/profile/EditProfileTest.kt b/feature/profile/src/test/kotlin/social/aloha/feature/profile/EditProfileTest.kt index a9f5c95f..9b7626d7 100644 --- a/feature/profile/src/test/kotlin/social/aloha/feature/profile/EditProfileTest.kt +++ b/feature/profile/src/test/kotlin/social/aloha/feature/profile/EditProfileTest.kt @@ -6,12 +6,22 @@ package social.aloha.feature.profile import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test +import social.aloha.core.model.Account import social.aloha.core.model.AccountField import social.aloha.core.network.ApiError class EditProfileTest { private val original = ProfileForm(displayName = "Alice", note = "Surfs", avatar = Picture.Kept("https://x/a.png")) + @Test + fun `a stand-in avatar is shown but not offered for removal, a chosen one is`() { + val generated = Account("1", "alice", "alice", avatar = "https://x/avatar/alice/128", avatarDefault = true) + assertEquals(Picture.Kept("https://x/avatar/alice/128", chosen = false), ProfileForm.of(generated).avatar) + val own = generated.copy(avatar = "https://x/a.png", avatarDefault = false) + assertEquals(Picture.Kept("https://x/a.png", chosen = true), ProfileForm.of(own).avatar) + assertEquals(Picture.Kept(null, chosen = false), ProfileForm.of(own).header) + } + @Test fun `nothing changed sends nothing`() { assertTrue(changes(original, original, avatar = null, header = null).isEmpty) From 768b20ec2de3ee43f848ed27ba145fb003822a93 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 15:16:00 +0200 Subject: [PATCH 4/7] docs: Social 0.26.126 as the app uses it, and Phase 19a built The server notes say what Nextcloud Social changed up to 0.26.126 that the app relies on: upload limits capped at what PHP accepts and a refusal that says why, search by account and with offset, and each version's media in the edit history. The status page lists what #33 built of Phase 18 and what of it is still open, and Phase 19a as built in this pull request; profile post search on Nextcloud Social leaves the list of what is not built. Written as the page reads once this is merged, so it needs no follow-up. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- docs/02-server-api.md | 5 +++-- docs/14-status.md | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/02-server-api.md b/docs/02-server-api.md index ff03c949..7eb3be8b 100644 --- a/docs/02-server-api.md +++ b/docs/02-server-api.md @@ -2,17 +2,18 @@ ## On Android -This is the Apple app's specification, carried over as the product contract for Android. Where it names an Apple mechanism, read its Android counterpart from the table below; where it states a server fact, the facts below, verified against a live Nextcloud Social 0.26.97 instance, win. +This is the Apple app's specification, carried over as the product contract for Android. Where it names an Apple mechanism, read its Android counterpart from the table below; where it states a server fact, the facts below, verified against a live Nextcloud Social 0.26.97 instance, and where a row names a later version against 0.26.126 (AlohaSocial/social `cdd847797`, on 2026-10-06), win. | Topic | Android | |---|---| | Credentials | A Social OAuth token, or a Nextcloud app password over HTTP Basic with `OCS-APIRequest: true`; the second also reaches memories, statistics, channels and migration. | | Caching | Nextcloud Social 0.26.97 sends no `ETag` on the polling routes (`Cache-Control: no-store`). | | Boosts | `reblog` is always `null`; a boost is not visible as a boost. | -| Media | `POST /api/v2/media` answers 200 synchronously; `focus` is stored; `hls_url` and video `meta` are empty without ffmpeg on the server. | +| Media | `POST /api/v2/media` answers 200 synchronously; `focus` is stored; `hls_url` and video `meta` are empty without ffmpeg on the server. Since 0.26.123 `image_size_limit` and `video_size_limit` are capped at what PHP accepts, which the composer's pre-flight checks against, and a refused upload says why: a `422` for a file too large (naming the limit) or an interrupted upload, which the attachment card shows; a `500` naming a server problem, retried like any server error. | | Pagination | `Link` headers point at the app path even through the root rules; `limit=0` answers 400. `min_id` answers with the posts immediately above the anchor and `since_id` with the newest above it, as on Mastodon, so a refresh asks with `since_id` and a full page leaves a gap between it and the cache. | | New accounts | Before 0.26.104 (seen on 0.26.97), `verify_credentials`, `accounts/lookup` and the first post answered 500 until the avatar cache job ran. On 0.26.119 an account created moments before answers `verify_credentials` and its first post with 200 (`accounts/lookup` not checked again). Sign-in still falls back to `/oauth/userinfo` on a 5xx, for older servers. A Nextcloud user without a Social account cannot authorize an app at all: the authorize page needs the account to exist. | | Pictures | Before 0.26.119 a local account had `avatar: ""` and its Nextcloud avatar as `header`; 0.26.119 stopped that fallback without repairing what it had stored. Since 0.26.125 a repair step clears those headers, the avatar is the same on every route, the header placeholder is `img/header-missing.png`, and every Account carries `avatar_default` and `header_default` ([AlohaSocial/social#2487](https://github.com/AlohaSocial/social/issues/2487)). The app reads a banner the Account marks with `header_default: true`, and Mastodon's `headers/…/missing.png` (Mastodon has no such field), as no header, and Edit profile offers no removal of an `avatar_default` avatar. | +| Search and edits | Since 0.26.122 `api/v2/search` honours `account_id` and `offset`, so a profile's posts are searchable on Nextcloud Social as elsewhere; `/api/v2/instance` announces `api_versions.aloha_social: 1`. Since 0.26.121 each version in `statuses/{id}/history` carries its media, which the history sheet lists by description. | | Places and reactions | `place_*` is never stored; reactions come only from `/statuses/{id}/reactions`. | | Web-server rules | Show the server's own `contrib/webserver` files; the snippet described here is outdated. | | Client | Plain OkHttp with kotlinx.serialization, one `ApiClient` per account base. Decoding is lenient (ids, URLs, booleans and dates in any of the shapes servers send) and lossy (a malformed row in a list is dropped and recorded, the rest of the page stays). | diff --git a/docs/14-status.md b/docs/14-status.md index 9823e3c1..9b2dd5f5 100644 --- a/docs/14-status.md +++ b/docs/14-status.md @@ -23,12 +23,14 @@ Each phase was one pull request into `main`. | 13 | [#28](https://github.com/AlohaSocial/Android/pull/28) | 2026-10-05 | A post card with a two-line header, hidden content that says what it hides, motion that Reduce motion stills, a thread with connectors and a reply bar, the profile header and tabs, notification cards, Black without tints and a colour per account, a viewer tinted by its picture, text size, times instead of ages, folded boosts, screens that slide, one skeleton and one empty state | | 14 | [#30](https://github.com/AlohaSocial/Android/pull/30) | 2026-10-05 | Home as the reader's pinned feeds with a switcher and Edit feeds, another server's own posts as a feed, quoting, boosting for a chosen audience and acting as another account, pausing notifications and choosing whose arrive, a richer composer (completion strip, detected language, attachment cards, alt-text page, draft resume and preview), search intents, hashtag curves, a profile's QR code and post search, the sign-in server preview, the catch-up page, focus mode, the picture-in-picture window's buttons | | 17 | [#32](https://github.com/AlohaSocial/Android/pull/32) | 2026-10-06 | Alt text drafted on the device, marked as AI generated until edited and checked before posting; a draft rewritten on the device with its mentions, hashtags and links kept; a thread summarised in a sheet and translated on one tap; an Intelligence section in Settings with each feature off until turned on and a privacy note per build. Alt-text drafts come in both builds, by open software; rewriting and summaries need Gemini Nano and are in the Play build only | +| 18 (in part) | [#33](https://github.com/AlohaSocial/Android/pull/33) | 2026-10-06 | The active account's stream where its server has one (Mastodon): edits, deletions, notifications and filter changes as they happen, polling slowed to a safety net meanwhile; uploads sent once per file, joined again by a reopened draft, cancellable from their notification, not cut off by a call timeout. Push through the Nextcloud push proxy and the sync etiquette review are still open | +| 19a | [#34](https://github.com/AlohaSocial/Android/pull/34) | 2026-10-06 | What Nextcloud Social 0.26.126 fixed, taken up by the app: a profile save answered with a server error is a failure (Social no longer answers 500 after storing part of a save, and answers 200 with what it stored when a late step fails); a profile's posts are searchable on Social too; the edit history lists each version's pictures by description; a placeholder header is no header (Social's `header_default`, Mastodon's `missing.png`) and a stand-in avatar is not offered for removal; a new account answers at once. Uploads meet the limit PHP really enforces, which Social now advertises | Between the phases: CI artifact retention ([#3](https://github.com/AlohaSocial/Android/pull/3)), the device benchmark and baseline profiles ([#4](https://github.com/AlohaSocial/Android/pull/4)), looking an account up by its id ([#10](https://github.com/AlohaSocial/Android/pull/10)) and who favourited and boosted a post ([#13](https://github.com/AlohaSocial/Android/pull/13)). ## In progress -Phase 18, sync: the active account's stream where its server has one, and uploads that are sent once per file, can be cancelled from their notification and are not cut off by a call timeout. Not merged yet. +Nothing at the moment. ## Not built @@ -40,7 +42,6 @@ Phase 18, sync: the active account's stream where its server has one, and upload | Push through the Nextcloud push proxy (FCM) | [08-notifications-sync.md](08-notifications-sync.md) §2 | Push is UnifiedPush in both flavours. FCM would be `gplay` only and needs the push proxy to allow the app | | Encrypted direct messages bound to the app lock | [11-safety-privacy-appstore.md](11-safety-privacy-appstore.md) | The app lock guards the screen, not the data | | Push from Nextcloud Social to Mastodon clients | [08-notifications-sync.md](08-notifications-sync.md) §2 | Social serves no Web Push API yet ([AlohaSocial/social#2479](https://github.com/AlohaSocial/social/issues/2479)); against it the app polls, and "Get notifications from" filters what polling finds | -| Searching one profile's posts on Nextcloud Social | [05-core-ui.md](05-core-ui.md) §5 | Social ignores `account_id` in search ([AlohaSocial/social#2481](https://github.com/AlohaSocial/social/issues/2481)), so the field is left out there | | A cross-account merged timeline | [00-overview.md](00-overview.md) §6 | Deferred past 1.0 by the specification itself | | Handoff and Spotlight counterparts | [00-overview.md](00-overview.md) §5 | No Android equivalent is planned yet | | A WebDAV browser for Nextcloud files | [07-composer.md](07-composer.md) §6 | The picker is a path field with recent paths | From 1c808f9bde43ab602ae68640b4fcbea32d54a4bf Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 16:58:32 +0200 Subject: [PATCH 5/7] test(sync): the thirty-second wait allows for however long the run took The test asked for the wait after a poll and expected 20 to 30 seconds, leaving ten seconds for the poll and the question. A loaded CI runner took longer and failed it. It now measures the time taken and expects what is left of thirty seconds after it, which still tells 30 s from 60 s and 10 min. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- .../test/kotlin/social/aloha/core/sync/SyncEngineTest.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/sync/src/test/kotlin/social/aloha/core/sync/SyncEngineTest.kt b/core/sync/src/test/kotlin/social/aloha/core/sync/SyncEngineTest.kt index ac4ee73b..c4dc2fa2 100644 --- a/core/sync/src/test/kotlin/social/aloha/core/sync/SyncEngineTest.kt +++ b/core/sync/src/test/kotlin/social/aloha/core/sync/SyncEngineTest.kt @@ -11,6 +11,7 @@ import java.util.concurrent.CopyOnWriteArrayList import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeSource import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers @@ -201,10 +202,12 @@ class SyncEngineTest { @Test fun `an active account is asked again after thirty seconds, and a manual one never on a timer`() = runBlocking { val account = fixture.signIn(server.url("/")) + val started = TimeSource.Monotonic.markNow() engine.poll(account, PollScope.Full) val wait = engine.waitBeforeNext(account)!! - // a loaded test run takes seconds between the poll and this question; 30 s is told from 60 s and 10 min - assertTrue("$wait", wait > 20.seconds && wait <= 30.seconds) + // what is left of 30 s after however long a loaded run took to get here, never 60 s or 10 min + val taken = started.elapsedNow() + assertTrue("$wait after $taken", wait <= 30.seconds && wait >= 30.seconds - taken - 1.seconds) settings.setPollFrequency(account.id, PollFrequency.Manual) assertNull(engine.waitBeforeNext(account)) } From 97c025de6b8905b420ec57133783557c2db80e8d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 17:24:06 +0200 Subject: [PATCH 6/7] feat(profile): search a profile's posts on Nextcloud Social too Nextcloud Social honours account_id in api/v2/search since 0.26.122, and pages with offset, so a profile's own post search is offered there as everywhere else; it had been left out because Social answered with everyone's posts. Checked on the dev instance: the same query finds two accounts' posts without account_id and only the one asked for with it. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- .../main/kotlin/social/aloha/feature/profile/ProfileScreen.kt | 2 +- .../main/kotlin/social/aloha/feature/profile/ProfileUiState.kt | 2 -- .../kotlin/social/aloha/feature/profile/ProfileViewModel.kt | 2 -- .../social/aloha/feature/profile/ProfileScreenshotTest.kt | 2 +- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileScreen.kt b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileScreen.kt index 40f391c5..e1f3cb52 100644 --- a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileScreen.kt +++ b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileScreen.kt @@ -185,7 +185,7 @@ private fun Content( item(key = "highlights", contentType = "highlights") { Highlights(highlights) } } stickyHeader(key = "tabs", contentType = "tabs") { Tabs(state, pinned, timeline, choose) } - tabContent(state, actions, rowActions, search.takeIf { state.postSearch }) + tabContent(state, actions, rowActions, search) } } } diff --git a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileUiState.kt b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileUiState.kt index f8d9e6c7..0cf0a8a5 100644 --- a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileUiState.kt +++ b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileUiState.kt @@ -106,8 +106,6 @@ internal data class ProfileUiState( val actionFailed: Boolean = false, /** The reader's lists, once asked for, each saying whether the account is on it. */ val lists: List? = null, - /** The account's posts can be searched: the reader's server searches by account. */ - val postSearch: Boolean = false, /** The people the reader follows who follow this account too. */ val familiar: List = emptyList(), /** The handle the profile was opened by, shown while the account loads. */ diff --git a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileViewModel.kt b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileViewModel.kt index 74de1bbf..ae2fa2e3 100644 --- a/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileViewModel.kt +++ b/feature/profile/src/main/kotlin/social/aloha/feature/profile/ProfileViewModel.kt @@ -416,8 +416,6 @@ internal class ProfileViewModel @AssistedInject constructor( lists = control.lists, familiar = control.familiar.map { Familiar(it.id, it.bestDisplayName, it.avatar) }, knownHandle = key.acct?.let { if (it.startsWith('@')) it else "@$it" }, - // Nextcloud Social reads no account_id, and would answer with everyone's posts - postSearch = !reader.capabilities.isNextcloudSocial, featured = ProfilePresentation.featured(control.pinned, control.featuredTags) { rows.rowFor(it, reader.serverAccountId, null) }, diff --git a/feature/profile/src/test/kotlin/social/aloha/feature/profile/ProfileScreenshotTest.kt b/feature/profile/src/test/kotlin/social/aloha/feature/profile/ProfileScreenshotTest.kt index 59a05415..3b1d5fb2 100644 --- a/feature/profile/src/test/kotlin/social/aloha/feature/profile/ProfileScreenshotTest.kt +++ b/feature/profile/src/test/kotlin/social/aloha/feature/profile/ProfileScreenshotTest.kt @@ -170,7 +170,7 @@ class ProfileScreenshotTest { val found = PostSearchUi("waves", rows = listOf(mapper.map(StatusSamples.post("

Waves at the point

"), "9"))) ProfileScreen( - profile().copy(postSearch = true), + profile(), NoActions, NoActions, listState = LazyListState(firstVisibleItemIndex = 2), From 78d69d1fb5411b3c5bd0693c891a10fa2b55b766 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 6 Oct 2026 17:24:06 +0200 Subject: [PATCH 7/7] feat(thread): the edit history says what each version's pictures say An edit can change nothing but a picture's description, which the history showed as two identical versions. Each version now lists its attachments by description, or says one has none. Nextcloud Social records each version's media since 0.26.121; Mastodon always has. Assisted-by: Claude Code:claude-opus-5-5 Signed-off-by: Andy Scherzinger --- .../feature/thread/ThreadPresentation.kt | 1 + .../aloha/feature/thread/ThreadScreen.kt | 12 +++++++ .../aloha/feature/thread/ThreadUiState.kt | 9 +++-- .../thread/src/main/res/values/strings.xml | 4 +++ .../aloha/feature/thread/EditVersionsTest.kt | 33 ++++++++++++++++++ .../feature/thread/ThreadScreenshotTest.kt | 7 +++- .../src/test/screenshots/thread-history.png | Bin 143126 -> 150938 bytes 7 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 feature/thread/src/test/kotlin/social/aloha/feature/thread/EditVersionsTest.kt diff --git a/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadPresentation.kt b/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadPresentation.kt index 05886326..a54c07c7 100644 --- a/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadPresentation.kt +++ b/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadPresentation.kt @@ -76,6 +76,7 @@ internal object ThreadPresentation { createdAt = edit.createdAt, spoiler = edit.spoilerText.takeIf { it.isNotBlank() }, body = StatusHtmlParser.parse(edit.content).toAnnotatedString(colors), + media = edit.mediaAttachments.map { it.description?.takeIf(String::isNotBlank) }, ) } } diff --git a/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadScreen.kt b/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadScreen.kt index d5cd4a1a..c1882a58 100644 --- a/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadScreen.kt +++ b/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadScreen.kt @@ -290,6 +290,18 @@ private fun History(versions: List, onDismiss: () -> Unit) { ) version.spoiler?.let { Text(it, style = MaterialTheme.typography.titleSmall) } Text(version.body, style = MaterialTheme.typography.bodyLarge) + // an edit may change only what the pictures say, which is then all that tells versions apart + version.media.forEachIndexed { index, description -> + Text( + stringResource( + R.string.thread_history_media, + index + 1, + description ?: stringResource(R.string.thread_history_no_description), + ), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } } } } diff --git a/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadUiState.kt b/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadUiState.kt index 690389cb..edfcd246 100644 --- a/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadUiState.kt +++ b/feature/thread/src/main/kotlin/social/aloha/feature/thread/ThreadUiState.kt @@ -28,9 +28,14 @@ internal sealed interface ThreadItem { } } -/** One earlier version of an edited post, oldest first. */ +/** One earlier version of an edited post, oldest first; [media] holds each attachment's description, null for none. */ @Immutable -internal data class EditVersion(val createdAt: Instant, val spoiler: String?, val body: AnnotatedString) +internal data class EditVersion( + val createdAt: Instant, + val spoiler: String?, + val body: AnnotatedString, + val media: List = emptyList(), +) /** * What the thread screen shows. The focused post draws from the cache while the conversation loads; diff --git a/feature/thread/src/main/res/values/strings.xml b/feature/thread/src/main/res/values/strings.xml index a2220cf1..4a32666f 100644 --- a/feature/thread/src/main/res/values/strings.xml +++ b/feature/thread/src/main/res/values/strings.xml @@ -67,6 +67,10 @@ Edit history Original + + Attachment %1$d: %2$s + + no description You\'re offline. Showing what is saved on this device. diff --git a/feature/thread/src/test/kotlin/social/aloha/feature/thread/EditVersionsTest.kt b/feature/thread/src/test/kotlin/social/aloha/feature/thread/EditVersionsTest.kt new file mode 100644 index 00000000..7e5ef940 --- /dev/null +++ b/feature/thread/src/test/kotlin/social/aloha/feature/thread/EditVersionsTest.kt @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2026 Aloha Social contributors +// SPDX-License-Identifier: MIT + +package social.aloha.feature.thread + +import androidx.compose.ui.graphics.Color +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import social.aloha.core.model.AttachmentKind +import social.aloha.core.model.MediaAttachment +import social.aloha.core.model.StatusEdit +import social.aloha.core.testing.StatusSamples +import social.aloha.core.ui.RichTextColors + +class EditVersionsTest { + @Test + fun `each version says what its pictures say, so an edit of a description alone shows`() { + fun edit(vararg descriptions: String?) = StatusEdit( + StatusSamples.post().account, + "

Aloha

", + mediaAttachments = descriptions.mapIndexed { i, text -> + MediaAttachment("$i", AttachmentKind.Image, "https://x/$i.png", description = text) + }, + ) + val versions = ThreadPresentation.versions(listOf(edit("Before", " "), edit("After", null)), COLORS) + assertEquals(listOf("Before", null), versions[0].media) + assertEquals(listOf("After", null), versions[1].media) + } + + private companion object { + val COLORS = RichTextColors(Color.Black, Color.Black, Color.Black) + } +} diff --git a/feature/thread/src/test/kotlin/social/aloha/feature/thread/ThreadScreenshotTest.kt b/feature/thread/src/test/kotlin/social/aloha/feature/thread/ThreadScreenshotTest.kt index 44eebbfa..314c87ee 100644 --- a/feature/thread/src/test/kotlin/social/aloha/feature/thread/ThreadScreenshotTest.kt +++ b/feature/thread/src/test/kotlin/social/aloha/feature/thread/ThreadScreenshotTest.kt @@ -155,7 +155,12 @@ class ThreadScreenshotTest { fun history() { val versions = listOf( EditVersion(StatusSamples.NOW.minusSeconds(3600), null, AnnotatedString("Aloha from the beach")), - EditVersion(StatusSamples.NOW, "Sunburn", AnnotatedString("Aloha from the beach! Bring sunscreen.")), + EditVersion( + StatusSamples.NOW, + "Sunburn", + AnnotatedString("Aloha from the beach! Bring sunscreen."), + listOf("Waves breaking at sunset", null), + ), ) compose.setContent { AlohaTheme(ThemeSettings(mode = ThemeMode.Light)) { diff --git a/feature/thread/src/test/screenshots/thread-history.png b/feature/thread/src/test/screenshots/thread-history.png index f4c93a832c1f709472e6c8f7c2e834083c389779..e050ee768bb3977762eae0a03c8be45d0a0a31e7 100644 GIT binary patch delta 63171 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%0A(kF4~hXBelHTSb~28ju&q!Q%YLzf&or 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 delta 55897 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