aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/res/values
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-11-04 18:51:35 +0100
committerDanilo M. <danix@danix.xyz>2026-11-04 18:51:35 +0100
commitba2a60a14717fd7c82cd2c4b1778673d1bb6388f (patch)
tree45fc389cbafedcfef0f88ae8b7e789af39690c84 /app/src/main/res/values
parent0ad0b1ca6a7f7fa814a92dd6eaf9da88948ee377 (diff)
parent136ee43d6080da288afae8ec133727962ea60640 (diff)
downloadHardenedPass-ba2a60a14717fd7c82cd2c4b1778673d1bb6388f.tar.gz
HardenedPass-ba2a60a14717fd7c82cd2c4b1778673d1bb6388f.zip
Merge branch 'compose': Compose UI overhaul
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>
Diffstat (limited to 'app/src/main/res/values')
-rw-r--r--app/src/main/res/values/arrays.xml4
-rw-r--r--app/src/main/res/values/attrs.xml10
-rw-r--r--app/src/main/res/values/colors_material3.xml1
-rw-r--r--app/src/main/res/values/dimens.xml16
-rw-r--r--app/src/main/res/values/strings.xml80
-rw-r--r--app/src/main/res/values/styles_material3.xml12
-rw-r--r--app/src/main/res/values/themes_material3.xml14
7 files changed, 61 insertions, 76 deletions
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 9f44710b..2891987d 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -6,14 +6,10 @@
<resources>
<string-array name="sort_order_entries">
<item>@string/pref_folder_first_sort_order</item>
- <item>@string/pref_file_first_sort_order</item>
- <item>@string/pref_type_independent_sort_order</item>
<item>@string/pref_recently_used_sort_order</item>
</string-array>
<string-array name="sort_order_values">
<item>FOLDER_FIRST</item>
- <item>FILE_FIRST</item>
- <item>INDEPENDENT</item>
<item>RECENTLY_USED</item>
</string-array>
<string-array name="pwgen_provider_labels">
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
deleted file mode 100644
index a1d3c974..00000000
--- a/app/src/main/res/values/attrs.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved.
- ~ SPDX-License-Identifier: GPL-3.0-only
- -->
-
-<resources>
- <declare-styleable name="Multiselected">
- <attr name="state_multiselected" format="boolean" />
- </declare-styleable>
-</resources>
diff --git a/app/src/main/res/values/colors_material3.xml b/app/src/main/res/values/colors_material3.xml
index 3a7341b5..ecd34921 100644
--- a/app/src/main/res/values/colors_material3.xml
+++ b/app/src/main/res/values/colors_material3.xml
@@ -60,5 +60,4 @@
<color name="error">#BA1B1B</color>
<!-- Multiselect color -->
- <color name="list_multiselect_background">#668eacbb</color>
</resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
deleted file mode 100644
index d6939e63..00000000
--- a/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
- ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved.
- ~ SPDX-License-Identifier: GPL-3.0-only
- -->
-
-<resources>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <dimen name="fab_compat_margin">16dp</dimen>
- <dimen name="normal_margin">8dp</dimen>
- <dimen name="bottom_sheet_item_height">56dp</dimen>
- <dimen name="onboarding_icon_margin_top">100dp</dimen>
- <dimen name="onboarding_button_margin_top">140dp</dimen>
- <dimen name="onboarding_desc_margin_top">48dp</dimen>
-</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 07f24aa5..f1a858fd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -19,7 +19,6 @@
<string name="dialog_delete">Delete directory</string>
<string name="dialog_do_not_delete">Cancel</string>
<string name="title_activity_git_clone">Repository information</string>
- <string name="title_activity_git_config" translatable="false">Git configuration</string>
<string name="title_activity_git_log">Commit log</string>
<!-- Password Store -->
@@ -30,7 +29,6 @@
</plurals>
<string name="delete_directory_progress_text">Deleting…</string>
<string name="move">Move</string>
- <string name="edit">Edit</string>
<string name="delete">Delete</string>
<string name="password_exists_title">Password already exists!</string>
<string name="password_exists_message">This will overwrite %1$s with %2$s.</string>
@@ -48,7 +46,6 @@
<!-- PGPHandler -->
<string name="clipboard_copied_text">Copied to clipboard</string>
<string name="file_toast_text">Please provide a file name</string>
- <string name="path_toast_text">Please provide a file path</string>
<string name="empty_toast_text">You cannot use an empty password or empty extra content</string>
<!-- Git Async Task -->
@@ -80,7 +77,6 @@
<string name="crypto_username_hint">Username</string>
<string name="crypto_pass_label">Password</string>
<string name="crypto_extra_label">Extra content</string>
- <string name="crypto_encrypt_username_label">Encrypt username</string>
<string name="crypto_select">Select</string>
<string name="crypto_save">Save</string>
<string name="crypto_save_and_copy">Save and Copy</string>
@@ -119,8 +115,6 @@
<string name="pref_directory_structure">Password file organization</string>
<string name="pref_sort_order_title">Password sort order</string>
<string name="pref_folder_first_sort_order">Folders first</string>
- <string name="pref_file_first_sort_order">Files first</string>
- <string name="pref_type_independent_sort_order">Type independent</string>
<string name="pref_recently_used_sort_order">Recently used</string>
<string name="pref_category_autofill_title">Autofill</string>
<string name="pref_autofill_enable_title">Enable Autofill</string>
@@ -149,7 +143,6 @@
<!-- PasswordGenerator fragment -->
<string name="pwgen_title">Generate Password</string>
<string name="pwgen_generate">Generate</string>
- <string name="pwgen_include">Include</string>
<string name="pwgen_length">Length</string>
<string name="pwgen_numerals">Numerals</string>
<string name="pwgen_symbols">Symbols</string>
@@ -195,7 +188,6 @@
<string name="dialog_yes">Yes</string>
<string name="dialog_no">No</string>
<string name="dialog_cancel">Cancel</string>
- <string name="dialog_skip">Skip</string>
<string name="git_sync">Synchronize repository</string>
<string name="git_pull">Pull from remote</string>
<string name="git_push">Push to remote</string>
@@ -203,10 +195,7 @@
<string name="git_log">Show commit log</string>
<string name="show_password_pref_title">Show the password</string>
<string name="show_password_pref_summary">Control the visibility of the passwords once decrypted. This does not disable copying to clipboard.</string>
- <string name="pwd_generate_button">Generate</string>
- <string name="refresh_list">Refresh list</string>
<string name="send_plaintext_password_to">Send password as plaintext using…</string>
- <string name="app_icon_hint">App icon</string>
<!-- Oreo Autofill -->
<string name="oreo_autofill_select_and_fill_into">Select entry to fill into</string>
@@ -223,7 +212,7 @@
<string name="oreo_autofill_warning_publisher_header">This app\'s publisher has changed since you first associated a HardenedPass entry with it:</string>
<string name="oreo_autofill_warning_publisher_footer"><b>The currently installed app may be trying to steal your credentials by pretending to be a trusted app.</b>\n\nTry to uninstall and reinstall the app from a trusted source, such as the Play Store, Amazon Appstore, F-Droid, or your phone manufacturer\'s store.</string>
<string name="oreo_autofill_warning_publisher_install_time">Installed: %1$s</string>
- <string name="oreo_autofill_warning_publisher_app_name" translatable="false">“%1$s“</string>
+ <string name="oreo_autofill_warning_publisher_app_name" translatable="false">“%1$s”</string>
<string name="oreo_autofill_warning_publisher_advanced_info_template" translatable="false">Package:\n%1$s\n\nHash:\n%2$s</string>
<string name="oreo_autofill_warning_publisher_advanced_info_button">Advanced information</string>
<string name="oreo_autofill_warning_publisher_changed_disable_autofill_button">Keep Autofill disabled</string>
@@ -242,7 +231,6 @@
<!-- Autofill -->
<string name="ssh_key_does_not_exist">Unable to open the ssh private key, please check that the file exists</string>
- <string name="new_password_title">New password</string>
<string name="clear_saved_passphrase_ssh">Clear saved passphrase for local SSH key</string>
<string name="clear_saved_passphrase_https">Clear saved HTTPS password</string>
<string name="git_operation_remember_passphrase">Remember key passphrase</string>
@@ -258,8 +246,6 @@
<string name="pref_biometric_auth_title">Enable biometric authentication</string>
<string name="pref_biometric_auth_summary">When enabled, HardenedPass will prompt you for your fingerprint when launching the app</string>
<string name="pref_biometric_auth_summary_error">Fingerprint hardware not accessible or missing</string>
- <string name="pref_biometric_auth_summary_disabled_platform">Feature unavailable due to a platform bug</string>
- <string name="pref_title_openkeystore_clear_keyid">Clear remembered OpenKeystore SSH Key ID</string>
<string name="your_public_key">Your public key</string>
<string name="error_generate_ssh_key">Error while trying to generate the ssh-key</string>
<string name="pref_show_hidden_title">Show all files and folders</string>
@@ -267,7 +253,6 @@
<string name="title_create_folder">Create folder</string>
<string name="title_rename_folder">Rename folder</string>
<string name="message_category_error_empty_field">Category name can\'t be empty</string>
- <string name="message_category_error_category_exists">Category name already exists</string>
<string name="message_error_destination_outside_repo">Destination must be within the repository</string>
<string name="message_rename_folder">Enter destination for %1$s</string>
<string name="button_create">Create</string>
@@ -315,12 +300,10 @@
<string name="invalid_gpg_id">Found .gpg-id, but it contains an invalid key ID, fingerprint or user ID</string>
<string name="short_gpg_id">Found .gpg-id, but it contains a short hex ID, which is not supported</string>
<string name="invalid_filename_text">File name must not contain \'/\', set directory above</string>
- <string name="directory_hint">Directory</string>
- <string name="new_folder_set_gpg_key">Set GPG key for directory</string>
<!-- GitException messages -->
<string name="git_unknown_error">Unknown error</string>
- <string name="git_pull_rebase_fail_error">Pull has failed, you\'re in a detached head. Using "settings > git utils", save your changes to the remote in a new branch and resolve the conflict on your computer.</string>
+ <string name="git_pull_rebase_fail_error">Pull has failed, you\'re in a detached head. Using \"Settings > Repository > Local Git config &amp; utilities\", save your changes to the remote in a new branch and resolve the conflict on your computer.</string>
<string name="git_pull_merge_fail_error">Merge has failed, you\'re in a conflicting state.</string>
<string name="git_push_nff_error">Push was rejected by remote, run pull before pushing again. You can use Synchronize rather than pull/push as it implements both</string>
@@ -332,17 +315,13 @@
<string name="git_break_out_of_detached_unneeded">The repository is not rebasing, no need to push to another branch</string>
<!-- GPG key selection in folder creation -->
- <string name="gpg_key_select_mandatory">Selecting a GPG key is necessary to proceed</string>
<string name="folder_creation_err_file_exists">A file by that name already exists</string>
<string name="folder_creation_err_folder_exists">A folder by that name already exists</string>
<!-- Onboarding flow -->
- <string name="let_s_go">Let\'s Go</string>
- <string name="select_n_repository_type">Select \nRepository Type</string>
<string name="select_repo_type_text">Select if you want to create a local repo or clone a remote repo.</string>
<string name="clone_remote_repo">Clone Remote Repo</string>
<string name="create_local_repo">Create Local Repo</string>
- <string name="select_gpg_key_title">Select\nGPG Key</string>
<string name="select_gpg_key_message">Select a GPG key to initialize your store with</string>
<string name="gpg_key_select">Select key</string>
@@ -365,11 +344,9 @@
<string name="clear_saved_host_key_success">Successfully cleared saved host key!</string>
<string name="otp_import_qr_code">Scan QR code</string>
<string name="otp_import_from_file">Choose an image</string>
- <string name="otp_import_manual_entry">Enter manually</string>
<string name="otp_import_manual_hint_secret">Secret</string>
<string name="otp_import_manual_hint_account">Account</string>
<string name="place_shortcut_on_home_screen">Place shortcut on home screen</string>
- <string name="password_list_fab_content_description">Create new password or folder</string>
<string name="pgp_key_import_failed">Failed to import PGP key</string>
<string name="pgp_key_import_failed_replace_message">An existing key with this ID was found, do you want to replace it?</string>
<string name="pgp_key_import_succeeded">Successfully imported PGP key</string>
@@ -385,4 +362,57 @@
<string name="no_keys_imported_dialog_message">There are no PGP keys imported in the app yet, press the button below to pick a key file</string>
<string name="biometric_prompt_title_gpg_passphrase_cache">Unlock passphrase cache</string>
<string name="clear_cached_password_on_screen_off">Clear cached password on screen-off</string>
+
+ <!-- Compose password list -->
+ <string name="list_new_entry">New entry</string>
+ <string name="list_store_root">Password store</string>
+ <string name="list_more_options">More options</string>
+ <string name="list_clear_search">Clear search</string>
+
+ <!-- Compose entry view -->
+ <string name="entry_back">Back</string>
+ <string name="entry_show_password">Show password</string>
+ <string name="entry_hide_password">Hide password</string>
+ <string name="entry_copy_name">Copy name</string>
+
+ <!-- Compose folder picker -->
+ <string name="folder_picker_title">Choose a folder</string>
+ <string name="folder_creation_err_failed">Could not create the folder</string>
+ <string name="folder_picker_new">New folder</string>
+
+ <!-- Compose editor -->
+ <string name="editor_new_title">New entry</string>
+ <string name="editor_edit_title">Edit entry</string>
+ <string name="editor_close">Close</string>
+ <string name="editor_folder">Folder</string>
+ <string name="editor_change_folder">Change</string>
+ <string name="editor_otp_qr">OTP from QR</string>
+ <string name="editor_otp_manual">Manual OTP</string>
+ <string name="generator_random">Random</string>
+ <string name="generator_diceware" translatable="false">Diceware</string>
+ <string name="generator_use">Use</string>
+
+ <!-- Compose setup -->
+ <string name="ssh_key_state_none">No SSH key yet</string>
+ <string name="ssh_key_state_imported">Imported private key</string>
+ <string name="ssh_key_state_generated">Generated on this device</string>
+ <string name="git_clone_progress">Cloning…</string>
+ <string name="connection_mode_none">None</string>
+ <string name="ssh_key_manage">Manage</string>
+ <string name="ssh_key_public_hint">Provide this public key to your Git server.</string>
+ <string name="pgp_key_needed_message">Import the private key this store is encrypted for, so its entries can be read and saved.</string>
+ <string name="pgp_key_needed_recipients">Store recipients</string>
+ <string name="store_create_failed">Could not create the store: %1$s</string>
+ <string name="store_not_empty">the folder already holds a store</string>
+ <string name="git_clone_delete_failed">Could not empty the store folder, so the clone did not start.</string>
+ <string name="pgp_key_import_too_large">The file is larger than 1 MiB: not a PGP key.</string>
+ <string name="pgp_key_import_downgrade">A private key with this ID is already imported. Its public key alone cannot replace it: delete the private key first if you really want to.</string>
+
+ <!-- Compose settings -->
+ <string name="store_delete_failed">Could not delete everything in the store folder.</string>
+ <string name="clear_saved_secret_message">It will be asked again at the next Git operation.</string>
+ <string name="invalid_proxy_port">Enter a port from 1 to 65535, or nothing</string>
+ <string name="git_reset_confirm_message">Local commits and changes that are not on this remote branch are discarded.</string>
+ <string name="git_tool_done">%1$s: done</string>
+ <string name="store_delete_confirm">Delete the local store? Entries not pushed to the remote are lost.</string>
</resources>
diff --git a/app/src/main/res/values/styles_material3.xml b/app/src/main/res/values/styles_material3.xml
deleted file mode 100644
index 329905e1..00000000
--- a/app/src/main/res/values/styles_material3.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved.
- ~ SPDX-License-Identifier: GPL-3.0-only
- -->
-
-<resources>
-
- <style name="APSThemeM3.Toolbar" parent="Widget.Material3.Toolbar">
- <item name="android:background">?android:colorBackground</item>
- </style>
-
-</resources>
diff --git a/app/src/main/res/values/themes_material3.xml b/app/src/main/res/values/themes_material3.xml
index 7e34b472..0ec74a45 100644
--- a/app/src/main/res/values/themes_material3.xml
+++ b/app/src/main/res/values/themes_material3.xml
@@ -10,8 +10,12 @@
<item name="android:windowLightStatusBar">@bool/light_status_bar</item>
<item name="android:statusBarColor">?android:colorBackground</item>
<item name="android:navigationBarColor">?android:colorBackground</item>
- <item name="toolbarStyle">@style/APSThemeM3.Toolbar</item>
- <item name="bottomSheetDialogTheme">@style/APSThemeM3.BottomSheetDialog</item>
+ </style>
+
+ <!-- AppCompat activities whose whole UI is Compose -->
+ <style name="NoActionBarThemeM3" parent="AppThemeM3">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
</style>
<style name="NoBackgroundThemeM3" parent="@style/AppThemeM3">
@@ -37,12 +41,6 @@
<item name="windowNoTitle">true</item>
</style>
- <style name="APSThemeM3.BottomSheetDialog" parent="ThemeOverlay.Material3.BottomSheetDialog">
- <item name="android:windowIsFloating">false</item>
- <item name="android:statusBarColor">@android:color/transparent</item>
- <item name="android:navigationBarColor">@android:color/transparent</item>
- </style>
-
<style name="APSThemeM3" parent="Theme.Material3.DayNight">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>