Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: reusing PagingData crash [WPB-15055][WPB-15079][WPB-15064] 🍒 #3778

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from

Conversation

saleniuk
Copy link
Contributor

@saleniuk saleniuk commented Dec 30, 2024

BugWPB-15055 [Android] Crash when opening connection request from paginated list

This PR was manually cherry-picked based on the following PR:

Original PR description:


PR Submission Checklist for internal contributors

  • The PR Title

    • conforms to the style of semantic commits messages¹ supported in Wire's Github Workflow²
    • contains a reference JIRA issue number like SQPIT-764
    • answers the question: If merged, this PR will: ... ³
  • The PR Description

    • is free of optional paragraphs and you have filled the relevant parts to the best of your ability

What's new in this PR?

Issues

There are crashes related to reusing PagingData flow when doing some actions on paginated conversation list screen, like accepting legal hold request, answering 1:1 call or opening pending connection request which can fetch user data.

Causes (Optional)

Each action that modifies (or even puts the same exact data but just requires executing insert, update or delete query) a table that then affects paginated conversation list query, makes this query dirty and executes it again, which reloads the list.
When using combine, it creates a new instance of flow, so if the combine is used after PagingData is created then if the data is changed and emitted by the flow that's combined, it will re-use the same PagingData and put it into a new flow, so cachedIn won't cache the flow properly and it will crash because PagingData cannot be used twice.

Solutions

Move combine "above" the PagingData flow so that each time a new value is emitted, it will always create a new PagingData for the new flow and also cachedIn will be used correctly.
Simplify showLoading parameter to be a simple logical equation rather than a state. Make use of mocked previewConversationFoldersFlow with proper LoadStates to represent loaded data instead of using specific initiallyLoaded parameter.
Fix rememberSearchbarState so that it actually saves the searchQueryTextState.

Testing

Test Coverage (Optional)

  • I have added automated test to this contribution

How to Test

The crash was happening when opening pending connection request (most frequently), answering 1:1 call or accepting legal hold request, so these actions shouldn't crash the app. Also, after opening connection request or 1:1 conversation, if your or that user's data hasn't changed since the last fetch, then it shouldn't refresh the conversation list when navigating back.

Attachments (Optional)

Before After
refreshing_when_going_back.mp4
no_refreshing_when_going_back.mp4
pagination_crash.mp4

PR Post Submission Checklist for internal contributors (Optional)

  • Wire's Github Workflow has automatically linked the PR to a JIRA issue

PR Post Merge Checklist for internal contributors

  • If any soft of configuration variable was introduced by this PR, it has been added to the relevant documents and the CI jobs have been updated.

References
  1. https://sparkbox.com/foundry/semantic_commit_messages
  2. https://github.com/wireapp/.github#usage
  3. E.g. feat(conversation-list): Sort conversations by most emojis in the title #SQPIT-764.

@echoes-hq echoes-hq bot added the echoes: unplanned Any work item that isn’t part of the product or technical roadmap. label Dec 30, 2024
@codecov-commenter
Copy link

Codecov Report

Attention: Patch coverage is 42.55319% with 27 lines in your changes missing coverage. Please review.

Project coverage is 45.96%. Comparing base (8bf8c7f) to head (eaee3ef).

Files with missing lines Patch % Lines
...ome/conversationslist/ConversationListViewModel.kt 42.55% 23 Missing and 4 partials ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #3778      +/-   ##
===========================================
+ Coverage    45.94%   45.96%   +0.02%     
===========================================
  Files          482      482              
  Lines        16441    16450       +9     
  Branches      2770     2770              
===========================================
+ Hits          7553     7561       +8     
- Misses        8112     8113       +1     
  Partials       776      776              
Files with missing lines Coverage Δ
...ome/conversationslist/ConversationListViewModel.kt 34.63% <42.55%> (+1.96%) ⬆️

Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 8bf8c7f...eaee3ef. Read the comment docs.

Copy link
Contributor

Built wire-android-staging-compat-pr-3778.apk is available for download

Copy link
Contributor

Built wire-android-dev-debug-pr-3778.apk is available for download

@saleniuk saleniuk changed the title fix: reusing PagingData crash [WPB-15055][WPB-15079][WPB-15064] fix: reusing PagingData crash [WPB-15055][WPB-15079][WPB-15064] 🍒 Dec 31, 2024
@saleniuk saleniuk requested review from a team, m-zagorski, MohamadJaara, vitorhugods, Garzas and sergeibakhtiarov and removed request for a team December 31, 2024 09:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
echoes: unplanned Any work item that isn’t part of the product or technical roadmap. size/S
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants