Repository navigation
feat(feedback): feedback conversations with team replies - #1228
Merged
Merged
Conversation
Feedback goes to the new support API through :core:support, falling back to the old form while it is unavailable. The screen is rebuilt around type pills, a roomy message card and a keyboard bar, and a sent screen offers notifications when the reply will show up in the app.
Support requests carry X-Request-Proof, the device key's signature over the session, method and path, which the support API now requires. Each send carries a retry key that a resend of the same message reuses, and meta lists every push topic to subscribe to.
…nges The compose screen is one layout, so the keyboard or a height change no longer replaces the message field and loses its focus. The draft is locked while sending, an older draft past the limit is kept whole until shortened, the server's message limit and categories apply as sent, the phone model goes only with diagnostics, and photos are left out (and said so) when support can't take them. The old form is used only when it can deliver, a stale pause is cleared once support is gone, support calls are cancellable and never cached, and the photo row scrolls on narrow phones.
Feedback lists the listener's conversations, opens each with the team's replies and how it ended, and takes replies; landscape tablets show the list and the conversation side by side. A reply push lights Home's Feedback button and posts a Feedback replies notification that opens the conversation, and the app joins the push topics the server lists. Feedback keeps the mini player small, as Lore does.
…oken A send's retry key is kept until the message is saved or discarded, so a retry after the app was closed isn't saved twice, and photos already uploaded are reused. Support requests carry the signed-in account's ID token from the first request, so conversations link to the account, and a missing device-key proof is no longer retried with a token.
…hat was read A conversation loads each time it shows, reloads on a reply push, and is marked read only once on screen, up to the newest message. Its reply draft and retry key live in saved state; a closed answer shows its ending at once; photos use a small retrying cache and scroll sideways. The list and conversation keep their places across the split gate, the shown conversation stays selected when narrowing, and a late send no longer clears a newer draft. Push topics follow every refresh, a list from before a push can't clear it, start-up checks count failed attempts, and a reply notification closes an open tablet detail.
The list, compose and sent screens each send their own page view (feedback_list, feedback, feedback_sent; the conversation already sent feedback_thread), and the host that only holds them is exempt from the page-view guard.
The in-app Privacy page and docs/PRIVACY.md say what feedback sends, where conversations are kept and who they're tied to, what Telegram receives and never receives, how long photos are kept, and how to have conversations deleted. The Feedback screen's privacy link points at the new section.
|
Caution Review failedThe pull request is closed. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.




Summary
Motivation
What changed
:core:supportmodule:SupportRepository(send, list, open, reply, mark read, mark solved, photo fetch), local list cache and topic sync for reply notifications, and photo preparation (resize, re-encode, strip metadata) ready for when photos are switched on.:core:network:SupportApi(suspend Retrofit),RequestProofSigner+RequestProofInterceptorthat sign each support request with the install's device key, andAccountTokenInterceptorso a signed-in listener's conversations follow them to their other devices.DEVICE_KEY_REQUIREDandPROOF_REQUIREDjoin the shield codes.:feature:settingsFeedback: compose screen (type pills, message, optional diagnostics, privacy link), sent screen, conversation list and conversation screen with reply, load earlier, mark solved and photo viewing. On wide windows the list and the open conversation sit side by side.RetryKeys/RetryKeyStore) so a send retried after a failure or a process restart never creates a duplicate.:app:support_replypush handling, a "Feedback replies" notification channel, thefeedback?thread=route (allowed for pushes; it closes open detail screens and keeps the compact player), a check for new replies every 30 minutes while the app is in use, and the account token wiring.:core:designsystem:LocalFeedbackReplyWaitingdrives the reply dot on the top-bar Feedback action.docs/PRIVACY.mddescribe feedback conversations and replies; the privacy link points to boxlore.in.core/support,core/network,core/designsystem,feature/settingsandapp.Behavior & compatibility
support_reply(threadId,title,body); older clients ignore it.Impact (required)
User impact — pick exactly one
user-impact-criticaluser-impact-highuser-impact-mediumuser-impact-lowno-user-impactuser-impact-criticaluser-impact-highuser-impact-mediumuser-impact-lowno-user-impactListener impact — required when
user-impact-critical,user-impact-high, oruser-impact-mediumWhat changes in the user’s life:
Backend — optional, pairable with any user-impact level
backend-changebackend-changeRelease copy (verbatim)
CHANGELOG.md (required developer copy)
Added
:core:supportmodule (SupportRepository, local cache, reply topic sync, photo prep),SupportApi, and Feedback list, conversation and sent screens in:feature:settings, with list and conversation side by side on wide windows.RequestProofSigner,RequestProofInterceptor),AccountTokenInterceptor, and retry keys that survive process restarts.support_replypush handling with a "Feedback replies" notification channel, thefeedback?thread=push route and a reply dot on the top-bar Feedback action (LocalFeedbackReplyWaiting).Changed
docs/PRIVACY.mddescribe conversations and replies.Listener notes (required for user-impact changes)
release-notes/upcoming.mdgains one line under New.Test plan
testDebugUnitTest(all modules),koverVerifyMerged, dependency guards,lintDebug, release-script tests and architecture checks./gradlew installDebug) when UI or app behavior changedNotes (optional)