Skip to content

release: 1.27.0 - #232

Merged
pando85 merged 2 commits into
mainfrom
release/1.27.0
Oct 28, 2026
Merged

pando85 merged 2 commits into
mainfrom
release/1.27.0

Conversation

@forkline-bot

@forkline-bot forkline-bot Bot commented Oct 27, 2026

Copy link
Copy Markdown

Summary

Release version 1.27.0 with the following changes since v1.26.0:

Added

  • Setting to enable Autofill directly from the app settings
  • Dialog showing the SSH server's authentication banner, if any
  • Android 17: runtime request for the local network permission and a connectivity check for local Git servers

Changed

  • Autofill search pane: whitespace-tolerant search, persistent filter switches, start-ellipsised paths, better username lookup and more inline suggestions
  • New password entries and Autofill-saved credentials honour the directory structure setting
  • Bouncy Castle and coroutines versions are aligned through BOMs

Fixed

  • Classic Autofill no longer offers or fills passkey entries
  • Autofill-saved credentials are filled in right after creation
  • SSH host key verification and compatibility with sshj 0.41
  • Alert dialogs are no longer clipped by the keyboard on short screens
  • Empty Git author email is now allowed
  • Spanish translation fixes

This PR was generated by Forkline — AI-powered code contributions.
The agent analyzed the issue and implemented this fix autonomously.

forkline-dev[bot] added 2 commits October 27, 2026 22:49
- Fix DirectoryStructure.getIdentifierFor() for DirectoryBased mode:
  was returning full path instead of just the directory name, affecting
  sort ordering in the password list
- Fix renameFilesInDirectoryTree() using String.replace() which corrupts
  filenames containing the extension string multiple times; use
  removeSuffix() instead
- Fix import progress dialog showing export message string (copy-paste bug)
- Add explicit parentheses to validateInput() condition in
  PasswordCreationActivity for clarity
- Simplify redundant ?.let { it } ?: "" in AutofillViewUtils
- Remove unused PORT_REGEX constant from GitServerConfigActivity
@forkline-bot

forkline-bot Bot commented Oct 27, 2026

Copy link
Copy Markdown
Author

Maintainability Review for PR #232: release 1.27.0

Initial expected implementation: matched
Initial reason: The release commit correctly bumps version to 1.27.0 and updates CHANGELOG. The branch contains the expected upstream sync changes for autofill improvements, directory structure honoring, SSH compatibility, and dependency updates as described in the PR.

Applied maintenance work: 6 fixes addressing bugs and code quality issues

Final implementation: matches
Validation: spotlessCheck passed during commit


Applied Changes

Priority: high
Category: bug
Decision: applied
Location: app/src/main/java/app/passwordstore/util/settings/DirectoryStructure.kt:100
Problem: getIdentifierFor() for DirectoryBased mode returned file.parentFile?.parent which is the full path (e.g., work/example.org) instead of just the directory name (example.org) as documented. This affected sort ordering in the password list view.
Action: Changed to file.parentFile?.parentFile?.name to return only the identifier directory name.
Why it is worth it: Fixes incorrect sort behavior and aligns implementation with documentation.
Risk / scope: Low - isolated change to a single line with clear semantics.


Priority: high
Category: bug
Decision: applied
Location: app/src/main/java/app/passwordstore/ui/settings/RepositorySettings.kt:543
Problem: renameFilesInDirectoryTree() used fileName.replace(oldExtension, newExtension) which replaces ALL occurrences of the extension string. For .bin → `` conversion, a file named data.bin.backup.bin would become `data.backup.` instead of `data.bin.backup`.
Action: Changed to `fileName.removeSuffix(oldExtension) + newExtension` to only replace the suffix.
Why it is worth it: Prevents filename corruption during repository import/export operations.
Risk / scope: Low - straightforward fix with clear intent.


Priority: medium
Category: bug
Decision: applied
Location: app/src/main/java/app/passwordstore/ui/settings/RepositorySettings.kt:166
Problem: Import progress dialog used R.string.prefs_export_passwords_dialog_message (export message) instead of an import-specific message. Copy-paste bug from the export dialog implementation.
Action: Added prefs_import_passwords_dialog_message string resource and updated the import dialog to use it.
Why it is worth it: Improves code clarity and maintainability; prevents future confusion.
Risk / scope: Very low - adds a new string resource and updates one reference.


Priority: low
Category: refactor
Decision: applied
Location: app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt:475-478
Problem: validateInput() condition lacked explicit parentheses, relying on operator precedence (&& binds tighter than ||). While the behavior was correct, the expression was hard to read and verify.
Action: Added explicit parentheses to clarify the intended grouping.
Why it is worth it: Improves readability and reduces cognitive load for future maintainers.
Risk / scope: Very low - no behavioral change, only clarity improvement.


Priority: low
Category: refactor
Decision: applied
Location: app/src/main/java/app/passwordstore/util/autofill/AutofillViewUtils.kt:79-80
Problem: Redundant ?.let { it } ?: "" pattern used for nullable strings. This is equivalent to ?: "" but more verbose.
Action: Simplified to metadata.title ?: "" and metadata.subtitle ?: "".
Why it is worth it: Reduces verbosity without changing behavior.
Risk / scope: Very low - idiomatic Kotlin simplification.


Priority: low
Category: refactor
Decision: applied
Location: app/src/main/java/app/passwordstore/ui/git/config/GitServerConfigActivity.kt:291
Problem: PORT_REGEX constant was defined but never used anywhere in the codebase. Dead code.
Action: Removed the unused constant.
Why it is worth it: Reduces code clutter and maintenance burden.
Risk / scope: Very low - removing unused code.


Findings Recommended but Deferred

Priority: medium
Category: bug
Decision: recommend, but defer
Location: app/src/main/java/app/passwordstore/ui/settings/GeneralSettings.kt:98-117
Problem: Biometric authentication preference changes are written inside an async callback, but SharedPreferences.edit {} commits synchronously. The putBoolean calls in the biometric result callback happen AFTER the edit block has already committed, so preferences are never actually saved.
Action: This is a pre-existing bug (not introduced in this release) that requires careful refactoring of the biometric authentication flow. Recommend addressing in a follow-up PR.
Why it is worth it: Users' biometric auth preferences are not persisted correctly.
Risk / scope: Medium - requires understanding the biometric authentication lifecycle and may need testing on multiple devices.


Priority: medium
Category: bug
Decision: recommend, but defer
Location: app/src/main/java/app/passwordstore/data/repo/PasswordRepository.kt:129-131
Problem: getRelativePath() uses fullPath.replace(referencePath, "") which is a naive string replacement. If the reference path appears multiple times in the full path, the result is incorrect.
Action: Pre-existing issue. Recommend using removePrefix() or proper path manipulation in a follow-up.
Why it is worth it: Prevents edge-case bugs with unusual repository paths.
Risk / scope: Low-medium - unlikely to cause issues in practice but theoretically incorrect.


Findings Not Pursued

  • Executor lifecycle management in AutofillDecryptActivity - Thread leaks from unclosed executors. Pre-existing, requires broader refactoring.
  • Shared mutable state in companion objects - Activity-specific state in companion objects. Pre-existing architectural concern.
  • Regex creation per list item in AutofillFilterView - Performance concern but list is typically small.
  • makeEmptyMetadata() placeholder strings - Debug code but only used for pre-Android P compatibility, not user-visible.
  • String matching on exception messages in BaseGitActivity - Fragile error handling but pre-existing and low impact.

This review was generated by Forkline — AI-powered code contributions.
The agent analyzed the release branch for maintainability issues and applied targeted fixes.

@pando85
pando85 merged commit e3e7e54 into main Oct 28, 2026
5 checks passed
@pando85
pando85 deleted the release/1.27.0 branch October 28, 2026 05:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant