summaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
17 hoursrelease: HardenedPass 0.3.0v0.3.0Danilo M.2-2/+20
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 hoursautofill-parser: update public suffix listDanilo M.2-1/+1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 hoursdocs: add push after save to the TODO listDanilo M.1-0/+3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 hoursdocs: record the Firefox run on the minSdk 31 buildDanilo M.1-2/+3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 hourschore: clear what the Material and AppCompat removal left behindDanilo M.6-7/+7
Drop the stale Material repository filter and lint ignore, use an emulator image that exists at API 31, state the Android 12 minimum in the README, and correct the TODO: biometric keeps AppCompat in the APK as well as zxing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 hoursdocs: record the emulator run on the minSdk 31 buildDanilo M.1-3/+7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 hoursbuild: remove Material Components and the AppCompat dependencyDanilo M.5-69/+14
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
19 hoursrefactor(app): take the app's own code off AppCompatDanilo M.31-134/+75
Activities extend FragmentActivity, window themes derive from the platform's Material theme and night mode uses UiModeManager. APSTheme colors the system bars, which DynamicColors did through the window theme. AppCompat stays in the APK through zxing. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
19 hoursfeat(app): move the git dialogs and the snackbar to ComposeDanilo M.19-175/+509
An activity-scoped Prompts ViewModel holds them, since git operations have no composable to draw in; PromptHost draws them. The credential dialog's window is now FLAG_SECURE, and a recreated activity no longer loses it and strands the SSH thread. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
20 hoursbuild: raise minSdk to 31Danilo M.48-497/+87
The project targets GrapheneOS, which only runs current Android. Android 12 gives the platform night mode API and removes the fingerprint dialog path that needs AppCompat. Devices below it stay on 0.2.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20 hoursdocs: add the git dialogs to Compose planDanilo M.2-16/+925
Record what reading the code changed in the design: values-v29 already hides the battery saver option, and AppCompat goes before Material so themes change once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20 hoursdocs: add the git dialogs to Compose designDanilo M.1-0/+140
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20 hoursdocs: link the documentation on the websiteDanilo M.2-5/+4
The website item in the TODO list is done. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20 hoursfix(app): use the 45 second copy timeout the settings showDanilo M.2-2/+3
The settings screen displayed 45 seconds as the default, but the app used 60. Both now read the same constant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 hoursdocs: record the Pixel 6 Pro autofill runDanilo M.1-2/+5
Fill and save from Firefox passed on Android 17, so the Android 14+ save fix holds on a newer release too. uiautomator dump fails on that device, so note how to drive it instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 hoursdocs: add the website to the TODO listDanilo M.1-0/+5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 hoursfeat(app): replace the launcher icon with a HardenedPass oneDanilo M.23-152/+24
The launcher still showed Password Store's icon. The new one is a shield shaped lock with a git branch cut through it, steel with an ember shackle on a dark tile. The cut is transparent, so the foreground also works without a tile on the welcome screen and in the autofill picker. The monochrome layer is the same figure. Debug builds now override only the background, in violet, and share the foreground. The density PNGs go: minSdk 26 always uses the adaptive icon. The Play Store PNGs were unused. Two lint baseline entries for those PNGs go with them. The old Play Store banner, referenced nowhere, becomes media/banner.png with the new icon and name, and heads the README. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
23 hoursfix(autofill-parser): open the save window on top on Android 14+Danilo M.3-16/+28
From Android 14 the framework sends the save IntentSender from the app being filled. Firefox targets SDK 34 or later and does not opt in to background activity starts, so the launch was blocked and AutofillSaveActivity opened hidden behind it: tapping Save seemed to do nothing. FixedSaveCallback now starts it from the service, which the system has bound, and opts in as the sender. Tested on an Android 14 tablet with Firefox release: the editor comes up on its own and the entry is saved. The same run confirmed the stale cached passphrase prompt, so both items leave TODO.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 hoursfix(autofill-parser): request saves from Firefox release and betaDanilo M.1-0/+2
org.mozilla.firefox and org.mozilla.firefox_beta are Fenix, as are org.mozilla.fenix and its nightly, which were already on the save list. Without an entry, saving from Firefox release did not work. Not yet tested on a device, so the TODO item stays until it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 hoursfix(app): ask again when autofill's cached passphrase failsDanilo M.1-4/+15
A stale cached passphrase (the key's passphrase changed) made every autofill fail until the cache was cleared. A cached passphrase that fails is now not tried again: the passphrase prompt opens with its wrong passphrase message, and the passphrase typed there replaces the cached one, as in the entry view. Not yet tested on a device (autofill cannot be tested on the emulator), so the TODO item stays until it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 hoursfix(app): show an invalid .gpg-id as a snackbar in the entry view and editorDanilo M.5-13/+15
getPGPIdentifiers showed its own Toast, while the entry view and the editor report every other error with a snackbar. It now passes the message to its caller: the entry view and editor show a snackbar, autofill keeps the Toast because its window finishes right after. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 hoursfeat(app): show a snackbar after a successful git operationDanilo M.4-6/+9
Pull to sync and sync, pull and push from the list's menu showed nothing on success. They now show "<operation>: done", as hard reset and garbage collection do in the git settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 hoursdocs: add a TODO list of open workDanilo M.2-0/+26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 hoursrelease: HardenedPass 0.2.0v0.2.0Danilo M.2-7/+26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 hoursautofill-parser: update public suffix listDanilo M.2-1/+1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 hoursMerge branch 'compose': Compose UI overhaulDanilo M.226-9956/+28251
Every screen moves from XML layouts, Views and Fragments to Jetpack Compose with Material 3, in one MainActivity with a NavHost: the list with breadcrumbs, search, pull to sync and multi-select; the entry view with OTP countdown; the editor with generator sheet and folder picker; setup (welcome, git server and clone, SSH key, PGP keys); settings, git config, commit log and proxy; and the autofill picker, publisher warning and decryption prompts. LaunchActivity stays the only exported activity. Fixes found on the way reach master with it, among them symlink-safe deletes, the proxy user name, screen lock gated switches, the Android 14 app lock and screen lock prompts, and the autofill passphrase cache rule. The View-era dependencies and view binding are gone; Material Components (Views) stays for the git dialogs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 hoursfix(app): point the rebase conflict error at the current settings pathDanilo M.10-11/+10
The detached HEAD error sent users to "Settings > Git utils", a screen the Compose settings no longer have. Every locale now names Settings > Repository > Local Git config & utilities, and the English quotes are escaped so they show. The git configuration screen's title reuses that translated row label instead of an untranslatable English string. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursdocs: record the finished Compose overhaulDanilo M.4-28/+63
AGENTS.md drops the compose branch exception, describes the Compose UI and its activities, updates the emulator notes (serial pinning, prefixed helpers, Compose nodes, which windows are FLAG_SECURE, waiting for user storage after boot, FAB content-desc, text field clearing, run-as quoting) and the last device runs, and records why Material Components (Views) and fragment-ktx stay. The spec is marked complete with what was removed and kept, and says the merge waits for the maintainer's phone test; CONTRIBUTING.md no longer asks for view binding. The cleanup plan's emulator pass gets the harness fixes found while running it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursfix(app): name the pushed conflict branch after abort rebaseDanilo M.1-6/+7
The success dialog showed a literal conflicting-<branch>-... instead of the branch BreakOutOfDetached pushed. It now reads the newest local conflicting-<branch>-<millis> ref, which is the one just created. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursfix(i18n): name HardenedPass in every localeDanilo M.8-22/+22
0.1.4 renamed the app in the English and Italian autofill and biometric texts only; German, French, Galician, Korean, Polish, Brazilian Portuguese, Russian and Chinese still said Password Store in 22 strings. 20 now name HardenedPass; the two German messages where it meant the store itself say Repository, as the rest of that translation does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursrefactor(app): lay out the git credential prompt without ConstraintLayoutDanilo M.3-12/+5
The prompt was ConstraintLayout's last user: a vertical LinearLayout holds the same field and checkbox, so the dependency goes. Ids, input type and the remember box's default are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursbuild(app): drop the View-era dependencies and view bindingDanilo M.9-66/+2
Nothing uses preference, recyclerview, recyclerview-selection, fastscroll or modernandroidpreferences since the Compose screens replaced the Views, nor view binding. fragment-ktx stays as the pin that keeps androidx.fragment at 1.8.4. The preference widget override, the multiselect attribute, the toolbar and bottom sheet styles and the lint ignores for deleted layouts go. Lint checks unused ids again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursrefactor(app): fold BasePGPActivity into the autofill decryptionDanilo M.8-78/+86
AutofillDecryptActivity was its last subclass: it now sets FLAG_SECURE and injects the settings, crypto repository and dispatchers itself. The path and clipboard helpers move to CryptoExtensions.kt as top-level functions (a test pins the path helpers), and the FILE_PATH extra key moves, unchanged, to LaunchActivity. An invalid or short .gpg-id ID is reported with a toast: the snackbar never showed in the autofill decryption, which closes its window at once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursrefactor(app): drop dead Fragment, view and navigation stack helpersDanilo M.11-276/+14
The Compose screens use no Fragments or view binding, so FragmentExtensions (with its four slide animators) and FragmentViewBindingDelegate have no users, nor do resolveAttribute, isPermissionGranted, launchActivity and the unused Modifier.conditional. SearchableRepositoryViewModel keeps one navigateTo: the Compose list owns the back stack, so the RecyclerView-era navigation stack, stableId, isFiltered and the unused DirectoriesOnly mode go. PasswordItem loses the parent overloads, @JvmStatic and the unread NAME extra, and the leftover sentry.properties goes too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 hoursdocs: add the Compose cleanup and merge planDanilo M.1-0/+1710
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfix(app): show the autofill switch off right after turning it offDanilo M.1-1/+2
hasEnabledAutofillServices() still answers true right after disableAutofillServices(), so the switch stayed on and the next tap turned autofill off again instead of opening the instructions dialog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfix(app): guard the autofill picker against overlaysDanilo M.3-2/+7
The picker decides which entry fills the requesting app, so it drops touches under another app's overlay, as the publisher warning does. The entry view now uses cachesPassphrase too, so the cache rule lives in one place, and the publisher warning's app name gets its closing quote. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursdocs: record the autofill activities' Compose UI in the specDanilo M.2-3/+21
The autofill activities cannot join MainActivity's graph, so they keep opening the PGP key import through the setup intent; the spec and the ponytail note no longer promise otherwise. The spec gains an Autofill section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfix(app): cache only a typed autofill passphrase, close on a bad .gpg-idDanilo M.1-5/+17
Autofill re-cached the passphrase it had just read from the cache, and cached an empty one for keys without a passphrase. Like the entry view, it now caches only what the user typed into the passphrase dialog. An unreadable .gpg-id left the transparent window up with a snackbar no one could see; the activity now finishes and fills nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfeat(app): move the autofill decryption prompts to ComposeDanilo M.9-262/+166
AutofillDecryptActivity shows the no keys dialog and the entry view's passphrase dialog in Compose over its transparent FLAG_SECURE window. The flow starts once, on the first window focus, instead of on every onStart: Android 14 evicts a screen lock prompt shown before the activity is on top, and a restart showed a second passphrase dialog. After a key import it restarts on the next focus. Dismissing the no keys dialog now finishes instead of leaving an invisible window. Rotation and resizing no longer recreate the activity; other recreations cancel the fill. The passphrase is now cached only after a successful screen lock prompt, as the entry view does: a passphrase typed after a cancelled or unavailable prompt was cached whenever the cache feature was on. PasswordDialog, its layout, dimens.xml and requireKeysExist lose their last user and go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfix(app): keep a double tap from re-enabling autofillDanilo M.1-6/+10
The Re-enable button replaced Advanced information in place, so a quick double tap re-enabled autofill for an app with a changed publisher (upstream had the same flaw). The package and certificate details now come first and push Re-enable below them. The title is marked as a heading and the footer's ponytail note sits on the footer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfix(app): address the autofill picker reviewDanilo M.3-5/+12
- Run the first search during composition with the saved query and strict switch, so a recreated picker no longer flashes the results for the initial query under the restored text. - Scroll the result list back to the top on every new result, as the old picker did. - Fall back to the file name when a row has neither identifier nor account part, instead of an empty label. DirectoryStructure never returns both null today, so no test can reach it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfeat(app): move the publisher warning to ComposeDanilo M.5-258/+175
AutofillPublisherChangedActivity draws the warning with the shared theme. Keep Autofill disabled is now the primary button, and the Possible phishing attempt title replaces the logo. Re-enabling still takes two taps (Advanced information first) and still clears the app's matches before returning the prepared fill response; every other way out fills nothing. Touches that reach the warning through another app's window are now dropped (filterTouchesWhenObscured on the decor view), so an overlay cannot trick the user into re-enabling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfeat(app): move the autofill picker to ComposeDanilo M.11-521/+215
AutofillFilterView draws the picker with the shared theme: origin header, search field, entry rows in a grouped surface and the three switches, over the same SearchableRepositoryViewModel search. Rows name the origin identifier and show the account and folders below it. The first tap wins, so a double tap no longer starts two decryptions. PasswordViewHolder, the RecyclerView adapter, the two layouts, their drawables, the multiselect color and their lint baseline entries go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 hoursfeat(app): add the autofill picker's row modelDanilo M.2-0/+111
autofillRows turns the picker's search results into list rows: the origin identifier, the part that must match the site or app, becomes the row's name, and the account part and the folders above it the subtitle, as the old picker's bold title and subtitle showed them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
45 hoursdocs: add the Compose autofill implementation planDanilo M.1-0/+1864
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 daysfix(app): make the app lock work on Android 14Danilo M.2-3/+12
LaunchActivity showed the screen lock prompt from onCreate, before the activity was on top. Android 14's SystemUI evicts a prompt whose app is not the top activity ("Evicting client due to top activity is not ..."), so the prompt closed at once with ERROR_CANCELED and the app quit. This is upstream issue 2802, which upstream worked around by disabling the setting on Android 14. The prompt now opens on the first window focus. LaunchActivity also used a translucent theme, so after unlocking the home screen showed through until MainActivity drew. It now uses the app's opaque theme. Verified on an Android 14 tablet with a PIN-only screen lock: unlock opens the app without a flash of the home screen, cancel closes it, and turning the lock off asks for the PIN. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 daysfix(app): validate the proxy fully and keep its password out of propertiesDanilo M.2-11/+10
- A host with an empty port was saved, but ProxySelector treats port -1 as no proxy, so git silently connected directly. The port is now required while a host is set. - Patterns.WEB_URL accepted "http://proxy.example.org:3128/" as a host, which then broke every HTTPS operation. The host must be a numeric address or a plain domain name, without scheme, port or path. - setDefaultProxy copied the proxy password into the process-wide http.proxyPassword system property. The Authenticator already supplies the credentials, so the properties are only cleared now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 daysrefactor(app): remove the legacy settings screensDanilo M.36-1786/+22
The Compose settings, git config, commit log and proxy screens replace SettingsActivity with its six preference providers, GitConfigActivity with TextInputDialog, GitLogActivity with its adapter and GitLogModel, and ProxySelectorActivity, with their layouts and manifest entries. The dead OpenKeystore key ID row goes with its string, the Android 14 platform bug summary and normal_margin lose their last users, and the setup intent loses the two starts only Settings used. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 daysfeat(app): run Settings in MainActivityDanilo M.4-9/+99
The list and the welcome screen open the Compose settings; their rows open the git server, SSH key, key generation, PGP keys, proxy and git config screens within the graph. Deleting the repository returns to the welcome screen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>