Skip to content

Conversation

@lukstbit
Copy link
Member

Purpose / Description

Fixes a state restore bug for find and replace fragment where previously selected notes would get ignored when coming back from the background. This is not great because if the user doesn't notice he's going to run the find and replace operation over his entire collection. See bug:

Screen_recording_20251230_192801.webm

I used our IdsFile implementation to not query the browser's ViewModel. I'm not enthusiastic about this but it works, the browser could probably be changed to fix this but I didn't look into it.

With the code in this PR:

Screen_recording_20251230_191350.webm

Fixes

How Has This Been Tested?

Checked the bug scenario, ran tests.

Checklist

  • You have a descriptive commit message with a short title (first line, max 50 chars).
  • You have commented your code, particularly in hard-to-understand areas
  • You have performed a self-review of your own code
  • UI changes: include screenshots of all affected screens (in particular showing any new or changed strings)
  • UI Changes: You have tested your change using the Google Accessibility Scanner

To get the current selected notes the fragment is querying the browser's
ViewModel for the selected notes.

This works most of the times but fails(we lose the selection and will
target everything instead of only the selected notes) when going to
the background and coming back(and fragment gets recreated). At this point
the fragment tries to access again the selected notes but these are not
available as they are being manually restored from a file.

This bug can be seen by using the "Don't keep activities" dev option.

The fix consists in using an IdsFile so the fragment always has a
reference to the selected notes from the moment of its creation.
@lukstbit lukstbit force-pushed the fix_findReplaceBackgroundRestore branch from bdffe19 to a7cd900 Compare December 30, 2025 17:49
Copy link
Member

@david-allison david-allison left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs to handle IdsFile being missing

This is a common issue

companion object {
const val TAG = "FindAndReplaceDialogFragment"
const val REQUEST_FIND_AND_REPLACE = "request_find_and_replace"
const val ARG_IDS = " arg_ids"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const val ARG_IDS = " arg_ids"
const val ARG_IDS = "arg_ids"

Comment on lines +112 to +120
val idsFile =
requireNotNull(
BundleCompat.getParcelable(
requireArguments(),
ARG_IDS,
IdsFile::class.java,
),
)
val noteIds = idsFile.getIds()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add handling for the file being deleted

context: Context,
noteIds: List<NoteId>,
): FindAndReplaceDialogFragment {
val file = IdsFile(context.cacheDir, noteIds)
Copy link
Member

@david-allison david-allison Jan 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a common issue that IdsFile is not deleted after the activity/fragment/dialog is disposed.

Is it feasible to handle this in the PR for this fragment?

context: Context,
noteIds: List<NoteId>,
): FindAndReplaceDialogFragment {
val file = IdsFile(context.cacheDir, noteIds)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide a name to the IdsFile, this will make it easier to clean up our 'bad' IdsFile implementation at a future date

@mikehardy
Copy link
Member

See bug:

🤔 which bug ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants