aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-08-06 01:08:12 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-08-06 01:08:12 +0200
commit881a50207af0a9f9f5aa69f451110de786779b54 (patch)
tree776bf4363c3e8736c3678eba93017387fffd8463
parent0bfac9989f801aa93d8bc336307d60b817995688 (diff)
parent6ba7536838b8fbc69684bec7c3e847afcb5e9d6a (diff)
downloadopen-keychain-881a50207af0a9f9f5aa69f451110de786779b54.tar.gz
open-keychain-881a50207af0a9f9f5aa69f451110de786779b54.tar.bz2
open-keychain-881a50207af0a9f9f5aa69f451110de786779b54.zip
Merge branch 'master' into yubikey
Conflicts: .gitmodules OpenKeychain/build.gradle OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java extern/openpgp-api-lib settings.gradle
-rw-r--r--.gitmodules3
-rw-r--r--CHANGELOG188
-rw-r--r--OpenKeychain/build.gradle3
-rw-r--r--OpenKeychain/src/main/AndroidManifest.xml43
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java28
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ContactHelper.java44
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java64
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java201
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/Preferences.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/TlsHelper.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java18
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/NullProgressable.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpConversionHelper.java102
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedSecretKey.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java19
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java43
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java24
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java171
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AccountSettings.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java144
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java87
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java187
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java73
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java485
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivityInterface.java33
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java331
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java488
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java172
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptSymmetricFragment.java45
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java84
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java334
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java)134
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ChangeExpiryDialogFragment.java187
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java83
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java187
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java62
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java88
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java271
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/FoldableLinearLayout.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java380
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NoSwipeWrapContentViewPager.java62
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java428
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java267
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java36
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/attachment_bg_holo.9.pngbin0 -> 282 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_cloud.pngbin450 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.pngbin485 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.pngbin473 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_doc_generic_am.pngbin0 -> 694 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_generic_man.pngbin0 -> 2375 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search.pngbin1218 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search_list.pngbin1190 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_next.pngbin1722 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_previous.pngbin1712 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_small.pngbin2088 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-ldpi/ic_next.pngbin916 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-ldpi/ic_previous.pngbin922 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-ldpi/key_small.pngbin1074 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/attachment_bg_holo.9.pngbin0 -> 204 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_cloud.pngbin335 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.pngbin343 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.pngbin361 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_doc_generic_am.pngbin0 -> 561 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_generic_man.pngbin0 -> 1657 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search.pngbin858 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search_list.pngbin863 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_next.pngbin1360 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_previous.pngbin1352 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_small.pngbin1484 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/attachment_bg_holo.9.pngbin0 -> 344 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_cloud.pngbin538 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.pngbin566 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.pngbin623 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_doc_generic_am.pngbin0 -> 831 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_generic_man.pngbin0 -> 3149 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search.pngbin1629 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search_list.pngbin1571 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/attachment_bg_holo.9.pngbin0 -> 1316 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_cloud.pngbin760 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.pngbin823 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.pngbin890 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_doc_generic_am.pngbin0 -> 585 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_generic_man.pngbin0 -> 3607 bytes
-rw-r--r--OpenKeychain/src/main/res/layout/add_subkey_dialog.xml (renamed from OpenKeychain/src/main/res/layout/edit_key_subkey_added_item.xml)195
-rw-r--r--OpenKeychain/src/main/res/layout/api_account_settings_fragment.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/create_key_dialog.xml86
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml53
-rw-r--r--OpenKeychain/src/main/res/layout/edit_key_key_item.xml172
-rw-r--r--OpenKeychain/src/main/res/layout/edit_key_section.xml41
-rw-r--r--OpenKeychain/src/main/res/layout/edit_key_user_id_item.xml96
-rw-r--r--OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml16
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_activity.xml13
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_asymmetric_fragment.xml68
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_asymmetric_signkey.xml31
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_content.xml30
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml39
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml117
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_symmetric_fragment.xml74
-rw-r--r--OpenKeychain/src/main/res/layout/file_list_entry.xml60
-rw-r--r--OpenKeychain/src/main/res/layout/file_list_entry_add.xml21
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_list_entry.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/recipient_box_entry.xml24
-rw-r--r--OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml51
-rw-r--r--OpenKeychain/src/main/res/layout/select_key_item.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/select_secret_key_layout_fragment.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_share_fragment.xml4
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_subkey_item.xml57
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_user_id_item.xml2
-rw-r--r--OpenKeychain/src/main/res/menu/encrypt_activity.xml7
-rw-r--r--OpenKeychain/src/main/res/raw-ar/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-el/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_changelog.html6
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ko/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_about.html50
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_changelog.html156
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_nfc_beam.html12
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_start.html22
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_wot.html17
-rw-r--r--OpenKeychain/src/main/res/raw-ro/nfc_beam_share.html11
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh/nfc_beam_share.html2
-rw-r--r--OpenKeychain/src/main/res/raw/help_about.html29
-rw-r--r--OpenKeychain/src/main/res/raw/help_changelog.html164
-rw-r--r--OpenKeychain/src/main/res/values-ar/strings.xml6
-rw-r--r--OpenKeychain/src/main/res/values-cs/strings.xml176
-rw-r--r--OpenKeychain/src/main/res/values-de/strings.xml166
-rw-r--r--OpenKeychain/src/main/res/values-el/strings.xml12
-rw-r--r--OpenKeychain/src/main/res/values-es/strings.xml219
-rw-r--r--OpenKeychain/src/main/res/values-et/strings.xml20
-rw-r--r--OpenKeychain/src/main/res/values-fr/strings.xml255
-rw-r--r--OpenKeychain/src/main/res/values-it/strings.xml184
-rw-r--r--OpenKeychain/src/main/res/values-ja/strings.xml206
-rw-r--r--OpenKeychain/src/main/res/values-ko/strings.xml6
-rw-r--r--OpenKeychain/src/main/res/values-nl/strings.xml101
-rw-r--r--OpenKeychain/src/main/res/values-pl/strings.xml97
-rw-r--r--OpenKeychain/src/main/res/values-ro/strings.xml43
-rw-r--r--OpenKeychain/src/main/res/values-ru/strings.xml117
-rw-r--r--OpenKeychain/src/main/res/values-sk/strings.xml6
-rw-r--r--OpenKeychain/src/main/res/values-sl/strings.xml154
-rw-r--r--OpenKeychain/src/main/res/values-tr/strings.xml28
-rw-r--r--OpenKeychain/src/main/res/values-uk/strings.xml144
-rw-r--r--OpenKeychain/src/main/res/values-zh/strings.xml26
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml105
-rw-r--r--README.md11
m---------extern/TokenAutoComplete0
m---------extern/openkeychain-api-lib0
m---------extern/openpgp-api-lib0
m---------extern/openpgp-card-nfc-lib0
m---------extern/spongycastle0
-rw-r--r--settings.gradle1
207 files changed, 4730 insertions, 5236 deletions
diff --git a/.gitmodules b/.gitmodules
index 919f7e1db..6fa51e40c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -28,6 +28,9 @@
[submodule "extern/minidns"]
path = extern/minidns
url = https://github.com/open-keychain/minidns.git
+[submodule "extern/TokenAutoComplete"]
+ path = extern/TokenAutoComplete
+ url = https://github.com/open-keychain/TokenAutoComplete
[submodule "extern/openpgp-card-nfc-lib"]
path = extern/openpgp-card-nfc-lib
url = https://github.com/open-keychain/openpgp-card-nfc-lib.git \ No newline at end of file
diff --git a/CHANGELOG b/CHANGELOG
index 893082aa4..be5ea325c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,17 @@
+2.8
+* So many bugs have been fixed in this release that we focus on the main new features
+* Key edit: awesome new design, key revocation
+* Key import: awesome new design, secure keyserver connections via hkps, keyserver resolving via DNS SRV records
+* New first time screen
+* New create key screen: autocompletion of name and email based on your personal Android accounts
+* File encryption: awesome new design, support for encrypting multiple files
+* New icons to show status of key (by Brennan Novak)
+* Important bug fix: Importing of large key collections from a file is now possible
+* Notification showing cached passphrases
+
+This release wouldn't be possible without the work of Vincent Breitmoser (GSoC 2014), mar-v-in (GSoC 2014), Daniel Albert, Art O Cathain, Daniel Haß, Tim Bray, Thialfihar
+
+
2.7
* Purple! (Dominik, Vincent)
* New key view design (Dominik, Vincent)
@@ -6,50 +20,50 @@
* Keybase.io import (Tim Bray)
2.6.1
-* some fixes for regression bugs
+* Some fixes for regression bugs
2.6
-* key certifications (thanks to Vincent Breitmoser)
-* support for GnuPG partial secret keys (thanks to Vincent Breitmoser)
-* new design for signature verification
-* custom key length (thanks to Greg Witczak)
-* fix share-functionality from other apps
+* Key certifications (thanks to Vincent Breitmoser)
+* Support for GnuPG partial secret keys (thanks to Vincent Breitmoser)
+* New design for signature verification
+* Custom key length (thanks to Greg Witczak)
+* Fix share-functionality from other apps
2.5
-* fix decryption of symmetric pgp messages/files
-* refactored edit key screen (thanks to Ash Hughes)
-* new modern design for encrypt/decrypt screens
+* Fix decryption of symmetric pgp messages/files
+* Refactored edit key screen (thanks to Ash Hughes)
+* New modern design for encrypt/decrypt screens
* OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
2.4
Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.
-* new unified key list
-* colorized key fingerprint
-* support for keyserver ports
-* deactivate possibility to generate weak keys
-* much more internal work on the API
-* certify user ids
-* keyserver query based on machine-readable output
-* lock navigation drawer on tablets
-* suggestions for emails on creation of keys
-* search in public key lists
-* and much more improvements and fixes…
+* New unified key list
+* Colorized key fingerprint
+* Support for keyserver ports
+* Deactivate possibility to generate weak keys
+* Much more internal work on the API
+* Certify user ids
+* Keyserver query based on machine-readable output
+* Lock navigation drawer on tablets
+* Suggestions for emails on creation of keys
+* Search in public key lists
+* And much more improvements and fixes…
2.3.1
-* hotfix for crash when upgrading from old versions
+* Hotfix for crash when upgrading from old versions
2.3
-* remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)
-* fix setting expiry dates on keys (thanks to Ash Hughes)
-* more internal fixes when editing keys (thanks to Ash Hughes)
-* querying keyservers directly from the import screen
-* fix layout and dialog style on Android 2.2-3.0
-* fix crash on keys with empty user ids
-* fix crash and empty lists when coming back from signing screen
+* Remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)
+* Fix setting expiry dates on keys (thanks to Ash Hughes)
+* More internal fixes when editing keys (thanks to Ash Hughes)
+* Querying keyservers directly from the import screen
+* Fix layout and dialog style on Android 2.2-3.0
+* Fix crash on keys with empty user ids
+* Fix crash and empty lists when coming back from signing screen
* Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source
-* fix upload of key from signing screen
+* Fix upload of key from signing screen
2.2
* New design with navigation drawer
@@ -76,110 +90,110 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
* New AIDL API
1.0.8
-* basic keyserver support (HKP, please report bugs :))
-* app2sd (untested, let me know if there are problems)
-* more choices for pass phrase cache: 1, 2, 4, 8, hours
-* translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
-* bugfixes
-* optimizations
+* Basic keyserver support (HKP, please report bugs :))
+* App2sd (untested, let me know if there are problems)
+* More choices for pass phrase cache: 1, 2, 4, 8, hours
+* Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)
+* Bugfixes
+* Optimizations
1.0.7
-* clear sign problem with lacking trailing newline fixed
-* more options for pass phrase cache time to live (20, 40, 60 mins)
+* Clear sign problem with lacking trailing newline fixed
+* More options for pass phrase cache time to live (20, 40, 60 mins)
1.0.6
-* account adding crash on Froyo fixed
-* secure file deletion
-* option to delete key file after import
-* stream encryption/decryption (gallery, etc.)
-* new options (language, force v3 signatures)
-* interface changes
-* bugfixes
+* Account adding crash on Froyo fixed
+* Secure file deletion
+* Option to delete key file after import
+* Stream encryption/decryption (gallery, etc.)
+* New options (language, force v3 signatures)
+* Interface changes
+* Bugfixes
1.0.5
* German and Italian translation
-* much smaller package, due to reduced BC sources
-* new preferences GUI
-* layout adjustment for localization
-* signature bugfix
+* Much smaller package, due to reduced BC sources
+* New preferences GUI
+* Layout adjustment for localization
+* Signature bugfix
1.0.4
-* fixed another crash caused by some SDK bug with query builder
+* Fixed another crash caused by some SDK bug with query builder
1.0.3
-* fixed crashes during encryption/signing and possibly key export
+* Fixed crashes during encryption/signing and possibly key export
1.0.2
-* filterable key lists
-* smarter preselection of encryption keys
-* new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers
-* fixes and additional features (key preselection) for k9, new beta build available
+* Filterable key lists
+* Smarter preselection of encryption keys
+* New Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers
+* Fixes and additional features (key preselection) for k9, new beta build available
1.0.1
* GMail account listing was broken in 1.0.0, fixed again
1.0.0
-* k9mail integration, APG supporting beta build of k9mail
-* support of more file managers (including ASTRO)
+* K-9 Mail integration, APG supporting beta build of K-9 Mail
+* Support of more file managers (including ASTRO)
* Slovenian translation
-* new database, much faster, less memory usage
-* defined Intents and content provider for other apps
-* bugfixes
+* New database, much faster, less memory usage
+* Defined Intents and content provider for other apps
+* Bugfixes
0.9.7
* 0.9.5 must have introduced a bug that prevented symmetric encryption, this release fixes it
0.9.6
-* finally fixed that bug that prevents the import of keys exported with Enigmail (and others), since this likely affects many users... it gets its own quick release
+* Finally fixed that bug that prevents the import of keys exported with Enigmail (and others), since this likely affects many users... it gets its own quick release
0.9.5
-* k9mail integration: using "More -> Forward (alternate)"
-* pass phrase cache
-* compression preferences added
-* accurate decryption progress bar
-* internationalization prepared, hopefully translations will follow
+* K-9 Mail integration: using "More -> Forward (alternate)"
+* Passphrase cache
+* Compression preferences added
+* Accurate decryption progress bar
+* Internationalization prepared, hopefully translations will follow
0.9.4
* Android 1.5 support, I *hope*, please report problems with layout and graphics
-* yet another interface change, hopefully this will be it :)
-* symmetric encryption for messages
-* encrypt and decrypt processes all wrapped into ONE activity respectively in preparation for defined Intents to use APG in other apps
+* Yet another interface change, hopefully this will be it :)
+* Symmetric encryption for messages
+* Encrypt and decrypt processes all wrapped into ONE activity respectively in preparation for defined Intents to use APG in other apps
0.9.3
-* handle large files correctly
-* better progress bars (especially for file encryption/decryption)
-* option to delete files after en-/decryption
-* bug fixes, layout tweaks
+* Handle large files correctly
+* Better progress bars (especially for file encryption/decryption)
+* Option to delete files after en-/decryption
+* Bug fixes, layout tweaks
0.9.2
-* settings for default encryption/hash algorithm
-* hushmail key support
+* Settings for default encryption/hash algorithm
+* Hushmail key support
* GUI improvements (encrypt file layout rewritten)
-* bug fixes
+* Bug fixes
0.9.1
* ElGamal support for subkeys
-* fixes of some silly 0.9.0 bugs
+* Fixes of some silly 0.9.0 bugs
0.9.0
* OI File Manager support
-* file encryption/decryption
+* File encryption/decryption
0.8.1
-* display/verify signed-only mails
-* bug fixes, layout fixes
+* Display/verify signed-only mails
+* Bug fixes, layout fixes
0.8.0
-* create/edit keys
-* export keys
+* Create/edit keys
+* Export keys
* GUI more Android-like
-* a lot of code review, rewriting things
-* tidy up strings and error handling
+* A lot of code review, rewriting things
+* Tidy up strings and error handling
0.7.1
-* minor fixes, some code review
-* recognize ElGamal encryption keys as suitable for encryption
-* allow signing only
+* Minor fixes, some code review
+* Recognize ElGamal encryption keys as suitable for encryption
+* Allow signing only
0.7.0
-* initial public release \ No newline at end of file
+* Initial public release \ No newline at end of file
diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle
index 265411595..32ae8ceb0 100644
--- a/OpenKeychain/build.gradle
+++ b/OpenKeychain/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'android'
+apply plugin: 'com.android.application'
dependencies {
// NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information
@@ -18,6 +18,7 @@ dependencies {
compile project(':extern:SuperToasts:supertoasts')
compile project(':extern:minidns')
compile project(':extern:KeybaseLib:Lib')
+ compile project(':extern:TokenAutoComplete:library')
compile project(':extern:openpgp-card-nfc-lib:library')
}
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index 7af9d895f..c10629c6d 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -49,6 +49,10 @@
android:name="android.hardware.touchscreen"
android:required="false" />
+ <permission android:name="org.sufficientlysecure.keychain.WRITE_TEMPORARY_STORAGE" />
+
+ <uses-permission android:name="org.sufficientlysecure.keychain.WRITE_TEMPORARY_STORAGE" />
+
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" />
@@ -152,12 +156,14 @@
<action android:name="org.sufficientlysecure.keychain.action.ENCRYPT" />
<category android:name="android.intent.category.DEFAULT" />
- <!-- TODO: accept other schemes! -->
+
<data android:scheme="file" />
+ <data android:scheme="content" />
</intent-filter>
<!-- Android's Send Action -->
<intent-filter android:label="@string/intent_send_encrypt">
<action android:name="android.intent.action.SEND" />
+ <action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
@@ -170,26 +176,16 @@
android:label="@string/title_decrypt"
android:windowSoftInputMode="stateHidden">
- <!--&lt;!&ndash; VIEW with mimeType: TODO (from email app) &ndash;&gt;-->
- <!--<intent-filter android:label="@string/intent_import_key">-->
- <!--<action android:name="android.intent.action.VIEW" />-->
-
- <!--<category android:name="android.intent.category.BROWSABLE" />-->
- <!--<category android:name="android.intent.category.DEFAULT" />-->
-
- <!--&lt;!&ndash; mime type as defined in http://tools.ietf.org/html/rfc3156 &ndash;&gt;-->
- <!--<data android:mimeType="application/pgp-signature" />-->
- <!--</intent-filter>-->
- <!--&lt;!&ndash; VIEW with mimeType: TODO (from email app) &ndash;&gt;-->
- <!--<intent-filter android:label="@string/intent_import_key">-->
- <!--<action android:name="android.intent.action.VIEW" />-->
+ <!-- VIEW with mimeType application/pgp-encrypted -->
+ <intent-filter android:label="@string/intent_send_decrypt">
+ <action android:name="android.intent.action.VIEW" />
- <!--<category android:name="android.intent.category.BROWSABLE" />-->
- <!--<category android:name="android.intent.category.DEFAULT" />-->
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
- <!--&lt;!&ndash; mime type as defined in http://tools.ietf.org/html/rfc3156 &ndash;&gt;-->
- <!--<data android:mimeType="application/pgp-encrypted" />-->
- <!--</intent-filter>-->
+ <!-- mime type as defined in http://tools.ietf.org/html/rfc3156 -->
+ <data android:mimeType="application/pgp-encrypted" />
+ </intent-filter>
<!-- Keychain's own Actions -->
<!-- DECRYPT with text as extra -->
<intent-filter>
@@ -202,8 +198,9 @@
<action android:name="org.sufficientlysecure.keychain.action.DECRYPT" />
<category android:name="android.intent.category.DEFAULT" />
- <!-- TODO: accept other schemes! -->
+
<data android:scheme="file" />
+ <data android:scheme="content" />
</intent-filter>
<!-- Android's Send Action -->
<intent-filter android:label="@string/intent_send_decrypt">
@@ -644,6 +641,12 @@
android:resource="@xml/custom_pgp_contacts_structure" />
</service>
+ <provider
+ android:name=".provider.TemporaryStorageProvider"
+ android:authorities="org.sufficientlysecure.keychain.tempstorage"
+ android:writePermission="org.sufficientlysecure.keychain.WRITE_TEMPORARY_STORAGE"
+ android:exported="true" />
+
</application>
</manifest>
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
index 16b6173f0..7d1af704d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
@@ -17,16 +17,16 @@
package org.sufficientlysecure.keychain;
-import android.os.Build;
import android.os.Environment;
-import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.sufficientlysecure.keychain.remote.ui.AppsListActivity;
import org.sufficientlysecure.keychain.ui.DecryptActivity;
import org.sufficientlysecure.keychain.ui.EncryptActivity;
import org.sufficientlysecure.keychain.ui.KeyListActivity;
+import java.io.File;
+
public final class Constants {
public static final boolean DEBUG = BuildConfig.DEBUG;
@@ -49,12 +49,11 @@ public final class Constants {
public static final String CUSTOM_CONTACT_DATA_MIME_TYPE = "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.key";
- public static boolean KITKAT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+ public static int TEMPFILE_TTL = 24 * 60 * 60 * 1000; // 1 day
public static final class Path {
- public static final String APP_DIR = Environment.getExternalStorageDirectory()
- + "/OpenKeychain";
- public static final String APP_DIR_FILE = APP_DIR + "/export.asc";
+ public static final File APP_DIR = new File(Environment.getExternalStorageDirectory(), "OpenKeychain");
+ public static final File APP_DIR_FILE = new File(APP_DIR, "export.asc");
}
public static final class Pref {
@@ -89,23 +88,6 @@ public final class Constants {
};
}
- public static final class choice {
- public static final class algorithm {
- // TODO: legacy reasons :/ better: PublicKeyAlgorithmTags
- public static final int dsa = 0x21070001;
- public static final int elgamal = 0x21070002;
- public static final int rsa = 0x21070003;
- }
-
- public static final class compression {
- // TODO: legacy reasons :/ better: CompressionAlgorithmTags.UNCOMPRESSED
- public static final int none = 0x21070001;
- public static final int zlib = CompressionAlgorithmTags.ZLIB;
- public static final int bzip2 = CompressionAlgorithmTags.BZIP2;
- public static final int zip = CompressionAlgorithmTags.ZIP;
- }
- }
-
public static final class key {
public static final int none = 0;
public static final int symmetric = -1;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
index e70b134aa..9b9880533 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
@@ -28,11 +28,10 @@ import android.os.Environment;
import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.helper.TlsHelper;
+import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.PRNGFixes;
-import java.io.File;
-import java.security.Provider;
import java.security.Security;
public class KeychainApplication extends Application {
@@ -73,8 +72,7 @@ public class KeychainApplication extends Application {
// Create APG directory on sdcard if not existing
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- File dir = new File(Constants.Path.APP_DIR);
- if (!dir.exists() && !dir.mkdirs()) {
+ if (!Constants.Path.APP_DIR.exists() && !Constants.Path.APP_DIR.mkdirs()) {
// ignore this for now, it's not crucial
// that the directory doesn't exist at this point
}
@@ -86,9 +84,11 @@ public class KeychainApplication extends Application {
setupAccountAsNeeded(this);
// Update keyserver list as needed
- Preferences.getPreferences(this).updateKeyServers();
+ Preferences.getPreferences(this).updatePreferences();
TlsHelper.addStaticCA("pool.sks-keyservers.net", getAssets(), "sks-keyservers.netCA.cer");
+
+ TemporaryStorageProvider.cleanUp(this);
}
public static void setupAccountAsNeeded(Context context) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ContactHelper.java
index e639824ec..8697e49f7 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ContactHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ContactHelper.java
@@ -19,8 +19,13 @@ package org.sufficientlysecure.keychain.helper;
import android.accounts.Account;
import android.accounts.AccountManager;
-import android.content.*;
+import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.Context;
import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.ContactsContract;
@@ -33,7 +38,14 @@ import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.util.Log;
-import java.util.*;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
public class ContactHelper {
@@ -60,6 +72,8 @@ public class ContactHelper {
ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?";
public static final String ID_SELECTION = ContactsContract.RawContacts._ID + "=?";
+ private static final Map<String, Bitmap> photoCache = new HashMap<String, Bitmap>();
+
public static List<String> getPossibleUserEmails(Context context) {
Set<String> accountMails = getAccountEmails(context);
accountMails.addAll(getMainProfileContactEmails(context));
@@ -232,6 +246,30 @@ public class ContactHelper {
return null;
}
+ public static Bitmap photoFromFingerprint(ContentResolver contentResolver, String fingerprint) {
+ if (fingerprint == null) return null;
+ if (!photoCache.containsKey(fingerprint)) {
+ photoCache.put(fingerprint, loadPhotoFromFingerprint(contentResolver, fingerprint));
+ }
+ return photoCache.get(fingerprint);
+ }
+
+ private static Bitmap loadPhotoFromFingerprint(ContentResolver contentResolver, String fingerprint) {
+ if (fingerprint == null) return null;
+ try {
+ int rawContactId = findRawContactId(contentResolver, fingerprint);
+ if (rawContactId == -1) return null;
+ Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId);
+ Uri contactUri = ContactsContract.RawContacts.getContactLookupUri(contentResolver, rawContactUri);
+ InputStream photoInputStream =
+ ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, contactUri);
+ if (photoInputStream == null) return null;
+ return BitmapFactory.decodeStream(photoInputStream);
+ } catch (Throwable ignored) {
+ return null;
+ }
+ }
+
/**
* Write the current Keychain to the contact db
*/
@@ -356,7 +394,7 @@ public class ContactHelper {
int rawContactId, long masterKeyId) {
ops.add(selectByRawContactAndItemType(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI),
rawContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).build());
- Cursor ids = resolver.query(KeychainContract.UserIds.buildUserIdsUri(Long.toString(masterKeyId)),
+ Cursor ids = resolver.query(KeychainContract.UserIds.buildUserIdsUri(masterKeyId),
USER_IDS_PROJECTION, NON_REVOKED_SELECTION, null, null);
if (ids != null) {
while (ids.moveToNext()) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java
index 5d281d5b0..d8efdc480 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Messenger;
+
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.Keyserver;
@@ -29,6 +30,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentService;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Set;
public class EmailKeyHelper {
@@ -86,7 +88,7 @@ public class EmailKeyHelper {
for (ImportKeysListEntry key : keyServer.search(mail)) {
if (key.isRevoked() || key.isExpired()) continue;
for (String userId : key.getUserIds()) {
- if (userId.toLowerCase().contains(mail.toLowerCase())) {
+ if (userId.toLowerCase().contains(mail.toLowerCase(Locale.ENGLISH))) {
keys.add(key);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java
index 16ef28311..bcd57b290 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java
@@ -30,18 +30,17 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
+import java.io.File;
+
public class ExportHelper {
- protected FileDialogFragment mFileDialog;
- protected String mExportFilename;
+ protected File mExportFile;
ActionBarActivity mActivity;
@@ -68,47 +67,30 @@ public class ExportHelper {
/**
* Show dialog where to export keys
*/
- public void showExportKeysDialog(final long[] masterKeyIds, final String exportFilename,
+ public void showExportKeysDialog(final long[] masterKeyIds, final File exportFile,
final boolean showSecretCheckbox) {
- mExportFilename = exportFilename;
-
- // Message is received after file is selected
- Handler returnHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- if (message.what == FileDialogFragment.MESSAGE_OKAY) {
- Bundle data = message.getData();
- mExportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME);
-
- exportKeys(masterKeyIds, data.getBoolean(FileDialogFragment.MESSAGE_DATA_CHECKED));
- }
- }
- };
+ mExportFile = exportFile;
- // Create a new Messenger for the communication back
- final Messenger messenger = new Messenger(returnHandler);
-
- DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
- public void run() {
- String title = null;
- if (masterKeyIds == null) {
- // export all keys
- title = mActivity.getString(R.string.title_export_keys);
- } else {
- // export only key specified at data uri
- title = mActivity.getString(R.string.title_export_key);
- }
-
- String message = mActivity.getString(R.string.specify_file_to_export_to);
- String checkMsg = showSecretCheckbox ?
- mActivity.getString(R.string.also_export_secret_keys) : null;
+ String title = null;
+ if (masterKeyIds == null) {
+ // export all keys
+ title = mActivity.getString(R.string.title_export_keys);
+ } else {
+ // export only key specified at data uri
+ title = mActivity.getString(R.string.title_export_key);
+ }
- mFileDialog = FileDialogFragment.newInstance(messenger, title, message,
- exportFilename, checkMsg);
+ String message = mActivity.getString(R.string.specify_file_to_export_to);
+ String checkMsg = showSecretCheckbox ?
+ mActivity.getString(R.string.also_export_secret_keys) : null;
- mFileDialog.show(mActivity.getSupportFragmentManager(), "fileDialog");
+ FileHelper.saveFile(new FileHelper.FileDialogCallback() {
+ @Override
+ public void onFileSelected(File file, boolean checked) {
+ mExportFile = file;
+ exportKeys(masterKeyIds, checked);
}
- });
+ }, mActivity.getSupportFragmentManager() ,title, message, exportFile, checkMsg);
}
/**
@@ -125,7 +107,7 @@ public class ExportHelper {
// fill values for this action
Bundle data = new Bundle();
- data.putString(KeychainIntentService.EXPORT_FILENAME, mExportFilename);
+ data.putString(KeychainIntentService.EXPORT_FILENAME, mExportFile.getAbsolutePath());
data.putBoolean(KeychainIntentService.EXPORT_SECRET, exportSecret);
if (masterKeyIds == null) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
index e0c94b947..b640ecb03 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
@@ -23,15 +23,26 @@ import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.Point;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.provider.DocumentsContract;
+import android.provider.OpenableColumns;
import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
import android.widget.Toast;
-import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
+import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment;
+
+import java.io.File;
+import java.text.DecimalFormat;
public class FileHelper {
@@ -55,25 +66,18 @@ public class FileHelper {
* Opens the preferred installed file manager on Android and shows a toast if no manager is
* installed.
*
- * @param activity
- * @param filename default selected file, not supported by all file managers
+ * @param fragment
+ * @param last default selected Uri, not supported by all file managers
* @param mimeType can be text/plain for example
* @param requestCode requestCode used to identify the result coming back from file manager to
* onActivityResult() in your activity
*/
- public static void openFile(Activity activity, String filename, String mimeType, int requestCode) {
- Intent intent = buildFileIntent(filename, mimeType);
-
- try {
- activity.startActivityForResult(intent, requestCode);
- } catch (ActivityNotFoundException e) {
- // No compatible file manager was found.
- Toast.makeText(activity, R.string.no_filemanager_installed, Toast.LENGTH_SHORT).show();
- }
- }
+ public static void openFile(Fragment fragment, Uri last, String mimeType, int requestCode) {
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
- public static void openFile(Fragment fragment, String filename, String mimeType, int requestCode) {
- Intent intent = buildFileIntent(filename, mimeType);
+ intent.setData(last);
+ intent.setType(mimeType);
try {
fragment.startActivityForResult(intent, requestCode);
@@ -84,86 +88,153 @@ public class FileHelper {
}
}
+ public static void saveFile(final FileDialogCallback callback, final FragmentManager fragmentManager,
+ final String title, final String message, final File defaultFile,
+ final String checkMsg) {
+ // Message is received after file is selected
+ Handler returnHandler = new Handler() {
+ @Override
+ public void handleMessage(Message message) {
+ if (message.what == FileDialogFragment.MESSAGE_OKAY) {
+ callback.onFileSelected(
+ new File(message.getData().getString(FileDialogFragment.MESSAGE_DATA_FILE)),
+ message.getData().getBoolean(FileDialogFragment.MESSAGE_DATA_CHECKED));
+ }
+ }
+ };
+
+ // Create a new Messenger for the communication back
+ final Messenger messenger = new Messenger(returnHandler);
+
+ DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
+ @Override
+ public void run() {
+ FileDialogFragment fileDialog = FileDialogFragment.newInstance(messenger, title, message,
+ defaultFile, checkMsg);
+
+ fileDialog.show(fragmentManager, "fileDialog");
+ }
+ });
+ }
+
+ public static void saveFile(Fragment fragment, String title, String message, File defaultFile, int requestCode) {
+ saveFile(fragment, title, message, defaultFile, requestCode, null);
+ }
+
+ public static void saveFile(final Fragment fragment, String title, String message, File defaultFile,
+ final int requestCode, String checkMsg) {
+ saveFile(new FileDialogCallback() {
+ @Override
+ public void onFileSelected(File file, boolean checked) {
+ Intent intent = new Intent();
+ intent.setData(Uri.fromFile(file));
+ fragment.onActivityResult(requestCode, Activity.RESULT_OK, intent);
+ }
+ }, fragment.getActivity().getSupportFragmentManager(), title, message, defaultFile, checkMsg);
+ }
+
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ public static void openDocument(Fragment fragment, String mimeType, int requestCode) {
+ openDocument(fragment, mimeType, false, requestCode);
+ }
/**
* Opens the storage browser on Android 4.4 or later for opening a file
+ *
* @param fragment
- * @param last default selected file
- * @param mimeType can be text/plain for example
+ * @param mimeType can be text/plain for example
+ * @param multiple allow file chooser to return multiple files
* @param requestCode used to identify the result coming back from storage browser onActivityResult() in your
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
- public static void openDocument(Fragment fragment, Uri last, String mimeType, int requestCode) {
+ public static void openDocument(Fragment fragment, String mimeType, boolean multiple, int requestCode) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
- intent.setData(last);
intent.setType(mimeType);
+ intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple);
+
fragment.startActivityForResult(intent, requestCode);
}
/**
* Opens the storage browser on Android 4.4 or later for saving a file
+ *
* @param fragment
- * @param last default selected file
- * @param mimeType can be text/plain for example
- * @param requestCode used to identify the result coming back from storage browser onActivityResult() in your
+ * @param mimeType can be text/plain for example
+ * @param suggestedName a filename desirable for the file to be saved
+ * @param requestCode used to identify the result coming back from storage browser onActivityResult() in your
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
- public static void saveDocument(Fragment fragment, Uri last, String mimeType, int requestCode) {
+ public static void saveDocument(Fragment fragment, String mimeType, String suggestedName, int requestCode) {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
- intent.setData(last);
intent.setType(mimeType);
+ intent.putExtra("android.content.extra.SHOW_ADVANCED", true); // Note: This is not documented, but works
+ intent.putExtra(Intent.EXTRA_TITLE, suggestedName);
fragment.startActivityForResult(intent, requestCode);
}
- private static Intent buildFileIntent(String filename, String mimeType) {
- Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
- intent.addCategory(Intent.CATEGORY_OPENABLE);
+ public static String getFilename(Context context, Uri uri) {
+ String filename = null;
+ try {
+ Cursor cursor = context.getContentResolver().query(uri, new String[]{OpenableColumns.DISPLAY_NAME}, null, null, null);
- intent.setData(Uri.parse("file://" + filename));
- intent.setType(mimeType);
+ if (cursor != null) {
+ if (cursor.moveToNext()) {
+ filename = cursor.getString(0);
+ }
+ cursor.close();
+ }
+ } catch (Exception ignored) {
+ // This happens in rare cases (eg: document deleted since selection) and should not cause a failure
+ }
+ if (filename == null) {
+ String[] split = uri.toString().split("/");
+ filename = split[split.length - 1];
+ }
+ return filename;
+ }
- return intent;
+ public static long getFileSize(Context context, Uri uri) {
+ return getFileSize(context, uri, -1);
}
- /**
- * Get a file path from a Uri.
- * <p/>
- * from https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/
- * afilechooser/utils/FileUtils.java
- *
- * @param context
- * @param uri
- * @return
- * @author paulburke
- */
- public static String getPath(Context context, Uri uri) {
- Log.d(Constants.TAG + " File -",
- "Authority: " + uri.getAuthority() + ", Fragment: " + uri.getFragment()
- + ", Port: " + uri.getPort() + ", Query: " + uri.getQuery() + ", Scheme: "
- + uri.getScheme() + ", Host: " + uri.getHost() + ", Segments: "
- + uri.getPathSegments().toString());
-
- if ("content".equalsIgnoreCase(uri.getScheme())) {
- String[] projection = {"_data"};
- Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
- try {
- if (cursor != null && cursor.moveToFirst()) {
- int columnIndex = cursor.getColumnIndexOrThrow("_data");
- return cursor.getString(columnIndex);
- }
- } catch (Exception e) {
- // Eat it
- } finally {
- if (cursor != null) {
- cursor.close();
+ public static long getFileSize(Context context, Uri uri, long def) {
+ long size = def;
+ try {
+ Cursor cursor = context.getContentResolver().query(uri, new String[]{OpenableColumns.SIZE}, null, null, null);
+
+ if (cursor != null) {
+ if (cursor.moveToNext()) {
+ size = cursor.getLong(0);
}
+ cursor.close();
}
- } else if ("file".equalsIgnoreCase(uri.getScheme())) {
- return uri.getPath();
+ } catch (Exception ignored) {
+ // This happens in rare cases (eg: document deleted since selection) and should not cause a failure
+ }
+ return size;
+ }
+
+ /**
+ * Retrieve thumbnail of file, document api feature and thus KitKat only
+ */
+ public static Bitmap getThumbnail(Context context, Uri uri, Point size) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ return DocumentsContract.getDocumentThumbnail(context.getContentResolver(), uri, size, null);
+ } else {
+ return null;
}
+ }
+
+ public static String readableFileSize(long size) {
+ if (size <= 0) return "0";
+ final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
+ int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
+ return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
+ }
- return null;
+ public static interface FileDialogCallback {
+ public void onFileSelected(File file, boolean checked);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/Preferences.java
index a060092a3..491709354 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/Preferences.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/Preferences.java
@@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.helper;
import android.content.Context;
import android.content.SharedPreferences;
+import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData;
import org.sufficientlysecure.keychain.Constants;
@@ -99,7 +100,7 @@ public class Preferences {
public int getDefaultMessageCompression() {
return mSharedPreferences.getInt(Constants.Pref.DEFAULT_MESSAGE_COMPRESSION,
- Constants.choice.compression.zlib);
+ CompressionAlgorithmTags.ZLIB);
}
public void setDefaultMessageCompression(int value) {
@@ -110,7 +111,7 @@ public class Preferences {
public int getDefaultFileCompression() {
return mSharedPreferences.getInt(Constants.Pref.DEFAULT_FILE_COMPRESSION,
- Constants.choice.compression.none);
+ CompressionAlgorithmTags.UNCOMPRESSED);
}
public void setDefaultFileCompression(int value) {
@@ -170,7 +171,8 @@ public class Preferences {
editor.commit();
}
- public void updateKeyServers() {
+ public void updatePreferences() {
+ // migrate keyserver to hkps
if (mSharedPreferences.getInt(Constants.Pref.KEY_SERVERS_DEFAULT_VERSION, 0) !=
Constants.Defaults.KEY_SERVERS_VERSION) {
String[] servers = getKeyServers();
@@ -186,6 +188,11 @@ public class Preferences {
.putInt(Constants.Pref.KEY_SERVERS_DEFAULT_VERSION, Constants.Defaults.KEY_SERVERS_VERSION)
.commit();
}
+
+ // migrate old uncompressed constant to new one
+ if (mSharedPreferences.getInt(Constants.Pref.DEFAULT_FILE_COMPRESSION, 0) == 0x21070001) {
+ setDefaultFileCompression(CompressionAlgorithmTags.UNCOMPRESSED);
+ }
}
public void setConcealPgpApplication(boolean conceal) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/TlsHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/TlsHelper.java
index 4b09af04d..8bbe73676 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/TlsHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/TlsHelper.java
@@ -18,12 +18,10 @@
package org.sufficientlysecure.keychain.helper;
import android.content.res.AssetManager;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.util.Log;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManagerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -34,10 +32,16 @@ import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
-import java.security.cert.*;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
import java.util.HashMap;
import java.util.Map;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManagerFactory;
+
public class TlsHelper {
public static class TlsHelperException extends Exception {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java
index 41f1e6997..f617be62a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java
@@ -18,11 +18,6 @@
package org.sufficientlysecure.keychain.keyimport;
-import de.measite.minidns.Client;
-import de.measite.minidns.Question;
-import de.measite.minidns.Record;
-import de.measite.minidns.record.SRV;
-
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.helper.TlsHelper;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
@@ -45,6 +40,11 @@ import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import de.measite.minidns.Client;
+import de.measite.minidns.Question;
+import de.measite.minidns.Record;
+import de.measite.minidns.record.SRV;
+
public class HkpKeyserver extends Keyserver {
private static class HttpError extends Exception {
private static final long serialVersionUID = 1718783705229428893L;
@@ -251,14 +251,14 @@ public class HkpKeyserver extends Keyserver {
data = query(request);
} catch (HttpError e) {
if (e.getData() != null) {
- Log.d(Constants.TAG, "returned error data: " + e.getData().toLowerCase(Locale.US));
+ Log.d(Constants.TAG, "returned error data: " + e.getData().toLowerCase(Locale.ENGLISH));
- if (e.getData().toLowerCase(Locale.US).contains("no keys found")) {
+ if (e.getData().toLowerCase(Locale.ENGLISH).contains("no keys found")) {
// NOTE: This is also a 404 error for some keyservers!
return results;
- } else if (e.getData().toLowerCase(Locale.US).contains("too many")) {
+ } else if (e.getData().toLowerCase(Locale.ENGLISH).contains("too many")) {
throw new TooManyResponsesException();
- } else if (e.getData().toLowerCase(Locale.US).contains("insufficient")) {
+ } else if (e.getData().toLowerCase(Locale.ENGLISH).contains("insufficient")) {
throw new QueryTooShortException();
} else if (e.getCode() == 404) {
// NOTE: handle this 404 at last, maybe it was a "no keys found" error
@@ -285,7 +285,7 @@ public class HkpKeyserver extends Keyserver {
// group 1 contains the full fingerprint (v4) or the long key id if available
// see http://bit.ly/1d4bxbk and http://bit.ly/1gD1wwr
- String fingerprintOrKeyId = matcher.group(1).toLowerCase(Locale.US);
+ String fingerprintOrKeyId = matcher.group(1).toLowerCase(Locale.ENGLISH);
if (fingerprintOrKeyId.length() > 16) {
entry.setFingerprintHex(fingerprintOrKeyId);
entry.setKeyIdHex("0x" + fingerprintOrKeyId.substring(fingerprintOrKeyId.length()
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java
index 066c51a13..8609a7082 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.keyimport;
import android.os.Parcel;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java
index ee0dfefa4..1da66872d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.openpgp.PGPKeyRing;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
index 981caad49..ce6498df1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.openpgp.PGPPublicKey;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
index 70288dceb..972e45c2e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.ArmoredOutputStream;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java
index ff82da07a..e39924f7e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.HashAlgorithmTags;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java
index 7d3e26000..4f74a2336 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.S2K;
@@ -6,7 +23,6 @@ import org.spongycastle.openpgp.PGPKeyRing;
import org.spongycastle.openpgp.PGPObjectFactory;
import org.spongycastle.openpgp.PGPPrivateKey;
import org.spongycastle.openpgp.PGPPublicKey;
-import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java
index 7d11a20d3..35020b815 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import android.text.TextUtils;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/NullProgressable.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/NullProgressable.java
index 68312dca3..5ef4f7998 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/NullProgressable.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/NullProgressable.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpConversionHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpConversionHelper.java
deleted file mode 100644
index 3a5a96fbb..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpConversionHelper.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.pgp;
-
-import org.spongycastle.openpgp.PGPObjectFactory;
-import org.spongycastle.openpgp.PGPSecretKey;
-import org.spongycastle.openpgp.PGPSecretKeyRing;
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.util.Log;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-public class PgpConversionHelper {
-
- /**
- * Convert from byte[] to ArrayList<PGPSecretKey>
- *
- * @param keysBytes
- * @return
- */
- public static ArrayList<UncachedSecretKey> BytesToPGPSecretKeyList(byte[] keysBytes) {
- PGPObjectFactory factory = new PGPObjectFactory(keysBytes);
- Object obj = null;
- ArrayList<UncachedSecretKey> keys = new ArrayList<UncachedSecretKey>();
- try {
- while ((obj = factory.nextObject()) != null) {
- PGPSecretKey secKey = null;
- if (obj instanceof PGPSecretKey) {
- secKey = (PGPSecretKey) obj;
- if (secKey == null) {
- Log.e(Constants.TAG, "No keys given!");
- }
- keys.add(new UncachedSecretKey(secKey));
- } else if (obj instanceof PGPSecretKeyRing) { //master keys are sent as keyrings
- PGPSecretKeyRing keyRing = null;
- keyRing = (PGPSecretKeyRing) obj;
- if (keyRing == null) {
- Log.e(Constants.TAG, "No keys given!");
- }
- @SuppressWarnings("unchecked")
- Iterator<PGPSecretKey> itr = keyRing.getSecretKeys();
- while (itr.hasNext()) {
- keys.add(new UncachedSecretKey(itr.next()));
- }
- }
- }
- } catch (IOException e) {
- }
-
- return keys;
- }
-
- /**
- * Convert from byte[] to PGPSecretKey
- * <p/>
- * Singles keys are encoded as keyRings with one single key in it by Bouncy Castle
- *
- * @param keyBytes
- * @return
- */
- public static UncachedSecretKey BytesToPGPSecretKey(byte[] keyBytes) {
- PGPObjectFactory factory = new PGPObjectFactory(keyBytes);
- Object obj = null;
- try {
- obj = factory.nextObject();
- } catch (IOException e) {
- Log.e(Constants.TAG, "Error while converting to PGPSecretKey!", e);
- }
- PGPSecretKey secKey = null;
- if (obj instanceof PGPSecretKey) {
- if ((secKey = (PGPSecretKey) obj) == null) {
- Log.e(Constants.TAG, "No keys given!");
- }
- } else if (obj instanceof PGPSecretKeyRing) { //master keys are sent as keyrings
- PGPSecretKeyRing keyRing = null;
- if ((keyRing = (PGPSecretKeyRing) obj) == null) {
- Log.e(Constants.TAG, "No keys given!");
- }
- secKey = keyRing.getSecretKey();
- }
-
- return new UncachedSecretKey(secKey);
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java
index 20bb1f97c..459b80be2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java
@@ -24,7 +24,7 @@ import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
-import org.spongycastle.openpgp.PGPPublicKey;
+import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
@@ -37,9 +37,6 @@ import java.util.Locale;
public class PgpKeyHelper {
- /**
- * TODO: Only used in HkpKeyServer. Get rid of this one!
- */
public static String getAlgorithmInfo(int algorithm) {
return getAlgorithmInfo(null, algorithm, 0);
}
@@ -55,25 +52,25 @@ public class PgpKeyHelper {
String algorithmStr;
switch (algorithm) {
- case PGPPublicKey.RSA_ENCRYPT:
- case PGPPublicKey.RSA_GENERAL:
- case PGPPublicKey.RSA_SIGN: {
+ case PublicKeyAlgorithmTags.RSA_ENCRYPT:
+ case PublicKeyAlgorithmTags.RSA_GENERAL:
+ case PublicKeyAlgorithmTags.RSA_SIGN: {
algorithmStr = "RSA";
break;
}
- case PGPPublicKey.DSA: {
+ case PublicKeyAlgorithmTags.DSA: {
algorithmStr = "DSA";
break;
}
- case PGPPublicKey.ELGAMAL_ENCRYPT:
- case PGPPublicKey.ELGAMAL_GENERAL: {
+ case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
+ case PublicKeyAlgorithmTags.ELGAMAL_GENERAL: {
algorithmStr = "ElGamal";
break;
}
- case PGPPublicKey.ECDSA:
- case PGPPublicKey.ECDH: {
+ case PublicKeyAlgorithmTags.ECDSA:
+ case PublicKeyAlgorithmTags.ECDH: {
algorithmStr = "ECC";
break;
}
@@ -82,7 +79,6 @@ public class PgpKeyHelper {
if (context != null) {
algorithmStr = context.getResources().getString(R.string.unknown_algorithm);
} else {
- // TODO
algorithmStr = "unknown";
}
break;
@@ -104,7 +100,7 @@ public class PgpKeyHelper {
* @return
*/
public static String convertFingerprintToHex(byte[] fingerprint) {
- String hexString = Hex.toHexString(fingerprint).toLowerCase(Locale.US);
+ String hexString = Hex.toHexString(fingerprint).toLowerCase(Locale.ENGLISH);
return hexString;
}
@@ -133,7 +129,7 @@ public class PgpKeyHelper {
}
private static String convertKeyIdToHex32bit(long keyId) {
- String hexString = Long.toHexString(keyId & 0xffffffffL).toLowerCase(Locale.US);
+ String hexString = Long.toHexString(keyId & 0xffffffffL).toLowerCase(Locale.ENGLISH);
while (hexString.length() < 8) {
hexString = "0" + hexString;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
index 19b0d81b7..bb692555e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
+import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
import org.spongycastle.bcpg.SymmetricKeyAlgorithmTags;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.spongycastle.jce.spec.ElGamalParameterSpec;
@@ -138,7 +139,7 @@ public class PgpKeyOperation {
KeyPairGenerator keyGen;
switch (algorithmChoice) {
- case Constants.choice.algorithm.dsa: {
+ case PublicKeyAlgorithmTags.DSA: {
progress(R.string.progress_generating_dsa, 30);
keyGen = KeyPairGenerator.getInstance("DSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
keyGen.initialize(keySize, new SecureRandom());
@@ -146,7 +147,7 @@ public class PgpKeyOperation {
break;
}
- case Constants.choice.algorithm.elgamal: {
+ case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT: {
progress(R.string.progress_generating_elgamal, 30);
keyGen = KeyPairGenerator.getInstance("ElGamal", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
BigInteger p = Primes.getBestPrime(keySize);
@@ -159,7 +160,7 @@ public class PgpKeyOperation {
break;
}
- case Constants.choice.algorithm.rsa: {
+ case PublicKeyAlgorithmTags.RSA_GENERAL: {
progress(R.string.progress_generating_rsa, 30);
keyGen = KeyPairGenerator.getInstance("RSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
keyGen.initialize(keySize, new SecureRandom());
@@ -217,7 +218,7 @@ public class PgpKeyOperation {
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
}
- if (add.mAlgorithm == Constants.choice.algorithm.elgamal) {
+ if (add.mAlgorithm == PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT) {
log.add(LogLevel.ERROR, LogType.MSG_CR_ERROR_MASTER_ELGAMAL, indent);
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
}
@@ -356,7 +357,7 @@ public class PgpKeyOperation {
progress(R.string.progress_modify_adduid, (i-1) * (100 / saveParcel.mAddUserIds.size()));
String userId = saveParcel.mAddUserIds.get(i);
- log.add(LogLevel.INFO, LogType.MSG_MF_UID_ADD, indent);
+ log.add(LogLevel.INFO, LogType.MSG_MF_UID_ADD, indent, userId);
if (userId.equals("")) {
log.add(LogLevel.ERROR, LogType.MSG_MF_UID_ERROR_EMPTY, indent+1);
@@ -768,7 +769,7 @@ public class PgpKeyOperation {
PGPSignatureSubpacketGenerator unhashedPacketsGen = new PGPSignatureSubpacketGenerator();
// If this key can sign, we need a primary key binding signature
- if ((flags & KeyFlags.SIGN_DATA) != 0) {
+ if ((flags & KeyFlags.SIGN_DATA) > 0) {
// cross-certify signing keys
PGPSignatureSubpacketGenerator subHashedPacketsGen = new PGPSignatureSubpacketGenerator();
subHashedPacketsGen.setSignatureCreationTime(false, todayDate);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
index 09c28e7c5..67eced699 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.ArmoredOutputStream;
import org.spongycastle.bcpg.BCPGOutputStream;
+import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.openpgp.PGPCompressedDataGenerator;
import org.spongycastle.openpgp.PGPEncryptedDataGenerator;
import org.spongycastle.openpgp.PGPException;
@@ -116,7 +117,7 @@ public class PgpSignEncrypt {
// optional
private Progressable mProgressable = null;
private boolean mEnableAsciiArmorOutput = false;
- private int mCompressionId = Constants.choice.compression.none;
+ private int mCompressionId = CompressionAlgorithmTags.UNCOMPRESSED;
private long[] mEncryptionMasterKeyIds = null;
private String mSymmetricPassphrase = null;
private int mSymmetricEncryptionAlgorithm = 0;
@@ -264,7 +265,7 @@ public class PgpSignEncrypt {
boolean enableSignature = mSignatureMasterKeyId != Constants.key.none;
boolean enableEncryption = ((mEncryptionMasterKeyIds != null && mEncryptionMasterKeyIds.length > 0)
|| mSymmetricPassphrase != null);
- boolean enableCompression = (mCompressionId != Constants.choice.compression.none);
+ boolean enableCompression = (mCompressionId != CompressionAlgorithmTags.UNCOMPRESSED);
Log.d(Constants.TAG, "enableSignature:" + enableSignature
+ "\nenableEncryption:" + enableEncryption
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
index d29f19d67..18ddaa0ec 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.ArmoredOutputStream;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java
index 4a03d942b..341ca6d04 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.sig.KeyFlags;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedSecretKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedSecretKey.java
index 0e14a7fd3..8dc28c2b3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedSecretKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedSecretKey.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.sig.KeyFlags;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
index 07fb4fb9e..ebd110dc5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.SignatureSubpacket;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java
index aa0207a6a..e076fd9cc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.provider;
import android.database.Cursor;
@@ -201,7 +218,7 @@ public class CachedPublicKeyRing extends KeyRing {
}
private Cursor getSubkeys() throws PgpGeneralException {
- Uri keysUri = KeychainContract.Keys.buildKeysUri(Long.toString(extractOrGetMasterKeyId()));
+ Uri keysUri = KeychainContract.Keys.buildKeysUri(extractOrGetMasterKeyId());
return mProviderHelper.getContentResolver().query(keysUri, null, null, null, null);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
index 483f762f7..56168847f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
@@ -172,8 +172,8 @@ public class KeychainContract {
return CONTENT_URI.buildUpon().appendPath(PATH_PUBLIC).build();
}
- public static Uri buildPublicKeyRingUri(String masterKeyId) {
- return CONTENT_URI.buildUpon().appendPath(masterKeyId).appendPath(PATH_PUBLIC).build();
+ public static Uri buildPublicKeyRingUri(long masterKeyId) {
+ return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId)).appendPath(PATH_PUBLIC).build();
}
public static Uri buildPublicKeyRingUri(Uri uri) {
@@ -184,8 +184,8 @@ public class KeychainContract {
return CONTENT_URI.buildUpon().appendPath(PATH_SECRET).build();
}
- public static Uri buildSecretKeyRingUri(String masterKeyId) {
- return CONTENT_URI.buildUpon().appendPath(masterKeyId).appendPath(PATH_SECRET).build();
+ public static Uri buildSecretKeyRingUri(long masterKeyId) {
+ return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId)).appendPath(PATH_SECRET).build();
}
public static Uri buildSecretKeyRingUri(Uri uri) {
@@ -210,8 +210,8 @@ public class KeychainContract {
public static final String CONTENT_ITEM_TYPE
= "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.provider.keychain.keys";
- public static Uri buildKeysUri(String masterKeyId) {
- return CONTENT_URI.buildUpon().appendPath(masterKeyId).appendPath(PATH_KEYS).build();
+ public static Uri buildKeysUri(long masterKeyId) {
+ return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId)).appendPath(PATH_KEYS).build();
}
public static Uri buildKeysUri(Uri uri) {
@@ -237,8 +237,8 @@ public class KeychainContract {
public static final String CONTENT_ITEM_TYPE
= "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.provider.user_ids";
- public static Uri buildUserIdsUri(String masterKeyId) {
- return CONTENT_URI.buildUpon().appendPath(masterKeyId).appendPath(PATH_USER_IDS).build();
+ public static Uri buildUserIdsUri(long masterKeyId) {
+ return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId)).appendPath(PATH_USER_IDS).build();
}
public static Uri buildUserIdsUri(Uri uri) {
@@ -304,12 +304,14 @@ public class KeychainContract {
public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
.appendPath(BASE_KEY_RINGS).build();
- public static Uri buildCertsUri(String masterKeyId) {
- return CONTENT_URI.buildUpon().appendPath(masterKeyId).appendPath(PATH_CERTS).build();
+ public static Uri buildCertsUri(long masterKeyId) {
+ return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId)).appendPath(PATH_CERTS).build();
}
- public static Uri buildCertsSpecificUri(String masterKeyId, String rank, String certifier) {
- return CONTENT_URI.buildUpon().appendPath(masterKeyId).appendPath(PATH_CERTS).appendPath(rank).appendPath(certifier).build();
+ public static Uri buildCertsSpecificUri(long masterKeyId, long rank, long certifier) {
+ return CONTENT_URI.buildUpon().appendPath(Long.toString(masterKeyId))
+ .appendPath(PATH_CERTS).appendPath(Long.toString(rank))
+ .appendPath(Long.toString(certifier)).build();
}
public static Uri buildCertsUri(Uri uri) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
index 7a63ec3d7..3a859f505 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -165,8 +165,8 @@ public class KeychainDatabase extends SQLiteOpenHelper {
// make sure this is only done once, on the first instance!
boolean iAmIt = false;
- synchronized(KeychainDatabase.class) {
- if(!KeychainDatabase.apgHack) {
+ synchronized (KeychainDatabase.class) {
+ if (!KeychainDatabase.apgHack) {
iAmIt = true;
KeychainDatabase.apgHack = true;
}
@@ -316,42 +316,37 @@ public class KeychainDatabase extends SQLiteOpenHelper {
}
private static void copy(File in, File out) throws IOException {
- FileInputStream ss = new FileInputStream(in);
- FileOutputStream ds = new FileOutputStream(out);
+ FileInputStream is = new FileInputStream(in);
+ FileOutputStream os = new FileOutputStream(out);
byte[] buf = new byte[512];
- while (ss.available() > 0) {
- int count = ss.read(buf, 0, 512);
- ds.write(buf, 0, count);
+ while (is.available() > 0) {
+ int count = is.read(buf, 0, 512);
+ os.write(buf, 0, count);
}
}
- public static void debugRead(Context context) throws IOException {
+ public static void debugBackup(Context context, boolean restore) throws IOException {
if (!Constants.DEBUG) {
return;
}
- File in = context.getDatabasePath("debug.db");
- File out = context.getDatabasePath("openkeychain.db");
- if (!in.canRead()) {
- throw new IOException("Cannot read " + in.getName());
- }
- if (!out.canRead()) {
- throw new IOException("Cannot write " + out.getName());
- }
- copy(in, out);
- }
- public static void debugWrite(Context context) throws IOException {
- if (!Constants.DEBUG) {
- return;
+ File in;
+ File out;
+ if (restore) {
+ in = context.getDatabasePath("debug_backup.db");
+ out = context.getDatabasePath(DATABASE_NAME);
+ } else {
+ in = context.getDatabasePath(DATABASE_NAME);
+ out = context.getDatabasePath("debug_backup.db");
+ out.createNewFile();
}
- File in = context.getDatabasePath("openkeychain.db");
- File out = context.getDatabasePath("debug.db");
if (!in.canRead()) {
throw new IOException("Cannot read " + in.getName());
}
- if (!out.canRead()) {
+ if (!out.canWrite()) {
throw new IOException("Cannot write " + out.getName());
}
copy(in, out);
}
+
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index aa85577e0..6111a4ef4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -28,17 +28,14 @@ import android.os.RemoteException;
import android.support.v4.util.LongSparseArray;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.pgp.NullProgressable;
-import org.sufficientlysecure.keychain.pgp.Progressable;
-import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
-import org.sufficientlysecure.keychain.service.OperationResultParcel.LogType;
-import org.sufficientlysecure.keychain.service.OperationResultParcel.LogLevel;
-import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
+import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
@@ -51,6 +48,9 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
import org.sufficientlysecure.keychain.remote.AccountSettings;
import org.sufficientlysecure.keychain.remote.AppSettings;
+import org.sufficientlysecure.keychain.service.OperationResultParcel.LogLevel;
+import org.sufficientlysecure.keychain.service.OperationResultParcel.LogType;
+import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog;
import org.sufficientlysecure.keychain.service.OperationResults.SaveKeyringResult;
import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
@@ -299,7 +299,7 @@ public class ProviderHelper {
return SaveKeyringResult.RESULT_ERROR;
}
- Uri uri = KeyRingData.buildPublicKeyRingUri(Long.toString(masterKeyId));
+ Uri uri = KeyRingData.buildPublicKeyRingUri(masterKeyId);
operations.add(ContentProviderOperation.newInsert(uri).withValues(values).build());
}
@@ -307,7 +307,7 @@ public class ProviderHelper {
progress.setProgress(LogType.MSG_IP_INSERT_SUBKEYS.getMsgId(), 40, 100);
mIndent += 1;
{ // insert subkeys
- Uri uri = Keys.buildKeysUri(Long.toString(masterKeyId));
+ Uri uri = Keys.buildKeysUri(masterKeyId);
int rank = 0;
for (CanonicalizedPublicKey key : keyRing.publicKeyIterator()) {
long keyId = key.getKeyId();
@@ -498,7 +498,7 @@ public class ProviderHelper {
try {
// delete old version of this keyRing, which also deletes all keys and userIds on cascade
int deleted = mContentResolver.delete(
- KeyRingData.buildPublicKeyRingUri(Long.toString(masterKeyId)), null, null);
+ KeyRingData.buildPublicKeyRingUri(masterKeyId), null, null);
if (deleted > 0) {
log(LogLevel.DEBUG, LogType.MSG_IP_DELETE_OLD_OK);
result |= SaveKeyringResult.UPDATED;
@@ -567,7 +567,7 @@ public class ProviderHelper {
values.put(KeyRingData.MASTER_KEY_ID, masterKeyId);
values.put(KeyRingData.KEY_RING_DATA, keyRing.getEncoded());
// insert new version of this keyRing
- Uri uri = KeyRingData.buildSecretKeyRingUri(Long.toString(masterKeyId));
+ Uri uri = KeyRingData.buildSecretKeyRingUri(masterKeyId);
if (mContentResolver.insert(uri, values) == null) {
log(LogLevel.ERROR, LogType.MSG_IS_DB_EXCEPTION);
return SaveKeyringResult.RESULT_ERROR;
@@ -579,7 +579,7 @@ public class ProviderHelper {
}
{
- Uri uri = Keys.buildKeysUri(Long.toString(masterKeyId));
+ Uri uri = Keys.buildKeysUri(masterKeyId);
// first, mark all keys as not available
ContentValues values = new ContentValues();
@@ -836,7 +836,7 @@ public class ProviderHelper {
values.put(Certs.VERIFIED, verified);
values.put(Certs.DATA, cert.getEncoded());
- Uri uri = Certs.buildCertsUri(Long.toString(masterKeyId));
+ Uri uri = Certs.buildCertsUri(masterKeyId);
return ContentProviderOperation.newInsert(uri).withValues(values).build();
}
@@ -853,7 +853,7 @@ public class ProviderHelper {
values.put(UserIds.IS_REVOKED, item.isRevoked);
values.put(UserIds.RANK, rank);
- Uri uri = UserIds.buildUserIdsUri(Long.toString(masterKeyId));
+ Uri uri = UserIds.buildUserIdsUri(masterKeyId);
return ContentProviderOperation.newInsert(uri).withValues(values).build();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java
new file mode 100644
index 000000000..87c0cc0a6
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/TemporaryStorageProvider.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.provider;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.provider.OpenableColumns;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.util.DatabaseUtil;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class TemporaryStorageProvider extends ContentProvider {
+
+ private static final String DB_NAME = "tempstorage.db";
+ private static final String TABLE_FILES = "files";
+ private static final String COLUMN_ID = "id";
+ private static final String COLUMN_NAME = "name";
+ private static final String COLUMN_TIME = "time";
+ private static final Uri BASE_URI = Uri.parse("content://org.sufficientlysecure.keychain.tempstorage/");
+ private static final int DB_VERSION = 1;
+
+ public static Uri createFile(Context context, String targetName) {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(COLUMN_NAME, targetName);
+ return context.getContentResolver().insert(BASE_URI, contentValues);
+ }
+
+ public static int cleanUp(Context context) {
+ return context.getContentResolver().delete(BASE_URI, COLUMN_TIME + "< ?",
+ new String[]{Long.toString(System.currentTimeMillis() - Constants.TEMPFILE_TTL)});
+ }
+
+ private class TemporaryStorageDatabase extends SQLiteOpenHelper {
+
+ public TemporaryStorageDatabase(Context context) {
+ super(context, DB_NAME, null, DB_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_FILES + " (" +
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
+ COLUMN_NAME + " TEXT, " +
+ COLUMN_TIME + " INTEGER" +
+ ");");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+
+ }
+ }
+
+ private TemporaryStorageDatabase db;
+
+ private File getFile(Uri uri) throws FileNotFoundException {
+ try {
+ return getFile(Integer.parseInt(uri.getLastPathSegment()));
+ } catch (NumberFormatException e) {
+ throw new FileNotFoundException();
+ }
+ }
+
+ private File getFile(int id) {
+ return new File(getContext().getCacheDir(), "temp/" + id);
+ }
+
+ @Override
+ public boolean onCreate() {
+ db = new TemporaryStorageDatabase(getContext());
+ return new File(getContext().getCacheDir(), "temp").mkdirs();
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ File file;
+ try {
+ file = getFile(uri);
+ } catch (FileNotFoundException e) {
+ return null;
+ }
+ Cursor fileName = db.getReadableDatabase().query(TABLE_FILES, new String[]{COLUMN_NAME}, COLUMN_ID + "=?",
+ new String[]{uri.getLastPathSegment()}, null, null, null);
+ if (fileName != null) {
+ if (fileName.moveToNext()) {
+ MatrixCursor cursor =
+ new MatrixCursor(new String[]{OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE, "_data"});
+ cursor.newRow().add(fileName.getString(0)).add(file.length()).add(file.getAbsolutePath());
+ fileName.close();
+ return cursor;
+ }
+ fileName.close();
+ }
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ // Note: If we can find a files mime type, we can decrypt it to temp storage and open it after
+ // encryption. The mime type is needed, else UI really sucks and some apps break.
+ return "*/*";
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ if (!values.containsKey(COLUMN_TIME)) {
+ values.put(COLUMN_TIME, System.currentTimeMillis());
+ }
+ int insert = (int) db.getWritableDatabase().insert(TABLE_FILES, null, values);
+ try {
+ getFile(insert).createNewFile();
+ } catch (IOException e) {
+ return null;
+ }
+ return Uri.withAppendedPath(BASE_URI, Long.toString(insert));
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ if (uri.getLastPathSegment() != null) {
+ selection = DatabaseUtil.concatenateWhere(selection, COLUMN_ID + "=?");
+ selectionArgs = DatabaseUtil.appendSelectionArgs(selectionArgs, new String[]{uri.getLastPathSegment()});
+ }
+ Cursor files = db.getReadableDatabase().query(TABLE_FILES, new String[]{COLUMN_ID}, selection,
+ selectionArgs, null, null, null);
+ if (files != null) {
+ while (files.moveToNext()) {
+ getFile(files.getInt(0)).delete();
+ }
+ files.close();
+ return db.getWritableDatabase().delete(TABLE_FILES, selection, selectionArgs);
+ }
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException("Update not supported");
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ return openFileHelper(uri, mode);
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AccountSettings.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AccountSettings.java
index a25ecded6..d6013b49d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AccountSettings.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/AccountSettings.java
@@ -17,6 +17,7 @@
package org.sufficientlysecure.keychain.remote;
+import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData;
import org.sufficientlysecure.keychain.Constants;
@@ -39,7 +40,7 @@ public class AccountSettings {
// defaults:
this.mEncryptionAlgorithm = PGPEncryptedData.AES_256;
this.mHashAlgorithm = HashAlgorithmTags.SHA512;
- this.mCompression = Constants.choice.compression.zlib;
+ this.mCompression = CompressionAlgorithmTags.ZLIB;
}
public String getAccountName() {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java
index 2ba792f9a..8468f5eca 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java
@@ -26,9 +26,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
-import android.widget.Button;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java
index 6c4d59a77..43ed2dad0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java
@@ -23,7 +23,13 @@ import android.content.AbstractThreadedSyncAdapter;
import android.content.ContentProviderClient;
import android.content.Intent;
import android.content.SyncResult;
-import android.os.*;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.KeychainApplication;
import org.sufficientlysecure.keychain.helper.ContactHelper;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java
index 008502ce7..41ff6d02b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/DummyAccountService.java
@@ -29,6 +29,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.widget.Toast;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.util.Log;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index 7250a861d..a7115a53d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -24,7 +24,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
-import android.os.Parcel;
import android.os.RemoteException;
import org.sufficientlysecure.keychain.Constants;
@@ -32,7 +31,6 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.helper.OtherHelper;
import org.sufficientlysecure.keychain.helper.Preferences;
-import org.sufficientlysecure.keychain.util.FileImportCache;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
@@ -56,6 +54,7 @@ import org.sufficientlysecure.keychain.provider.KeychainDatabase;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.OperationResults.EditKeyResult;
import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;
+import org.sufficientlysecure.keychain.util.FileImportCache;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressScaler;
@@ -63,11 +62,9 @@ import org.sufficientlysecure.keychain.util.ProgressScaler;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -110,8 +107,10 @@ public class KeychainIntentService extends IntentService
public static final String SOURCE = "source";
// possible targets:
public static final int IO_BYTES = 1;
- public static final int IO_FILE = 2; // This was misleadingly TARGET_URI before!
- public static final int IO_URI = 3;
+ public static final int IO_URI = 2;
+ public static final int IO_URIS = 3;
+
+ public static final String SELECTED_URI = "selected_uri";
// encrypt
public static final String ENCRYPT_SIGNATURE_KEY_ID = "secret_key_id";
@@ -121,8 +120,10 @@ public class KeychainIntentService extends IntentService
public static final String ENCRYPT_MESSAGE_BYTES = "message_bytes";
public static final String ENCRYPT_INPUT_FILE = "input_file";
public static final String ENCRYPT_INPUT_URI = "input_uri";
+ public static final String ENCRYPT_INPUT_URIS = "input_uris";
public static final String ENCRYPT_OUTPUT_FILE = "output_file";
public static final String ENCRYPT_OUTPUT_URI = "output_uri";
+ public static final String ENCRYPT_OUTPUT_URIS = "output_uris";
public static final String ENCRYPT_SYMMETRIC_PASSPHRASE = "passphrase";
// decrypt/verify
@@ -142,6 +143,7 @@ public class KeychainIntentService extends IntentService
// export key
public static final String EXPORT_OUTPUT_STREAM = "export_output_stream";
public static final String EXPORT_FILENAME = "export_filename";
+ public static final String EXPORT_URI = "export_uri";
public static final String EXPORT_SECRET = "export_secret";
public static final String EXPORT_ALL = "export_all";
public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id";
@@ -226,6 +228,7 @@ public class KeychainIntentService extends IntentService
try {
/* Input */
int source = data.get(SOURCE) != null ? data.getInt(SOURCE) : data.getInt(TARGET);
+ Bundle resultData = new Bundle();
long signatureKeyId = data.getLong(ENCRYPT_SIGNATURE_KEY_ID);
String symmetricPassphrase = data.getString(ENCRYPT_SYMMETRIC_PASSPHRASE);
@@ -233,43 +236,47 @@ public class KeychainIntentService extends IntentService
boolean useAsciiArmor = data.getBoolean(ENCRYPT_USE_ASCII_ARMOR);
long encryptionKeyIds[] = data.getLongArray(ENCRYPT_ENCRYPTION_KEYS_IDS);
int compressionId = data.getInt(ENCRYPT_COMPRESSION_ID);
- InputData inputData = createEncryptInputData(data);
- OutputStream outStream = createCryptOutputStream(data);
-
- /* Operation */
- PgpSignEncrypt.Builder builder =
- new PgpSignEncrypt.Builder(
- new ProviderHelper(this),
- PgpHelper.getFullVersion(this),
- inputData, outStream);
- builder.setProgressable(this);
+ int urisCount = data.containsKey(ENCRYPT_INPUT_URIS) ? data.getParcelableArrayList(ENCRYPT_INPUT_URIS).size() : 1;
+ for (int i = 0; i < urisCount; i++) {
+ data.putInt(SELECTED_URI, i);
+ InputData inputData = createEncryptInputData(data);
+ OutputStream outStream = createCryptOutputStream(data);
+
+ /* Operation */
+ PgpSignEncrypt.Builder builder =
+ new PgpSignEncrypt.Builder(
+ new ProviderHelper(this),
+ PgpHelper.getFullVersion(this),
+ inputData, outStream);
+ builder.setProgressable(this);
+
+ builder.setEnableAsciiArmorOutput(useAsciiArmor)
+ .setCompressionId(compressionId)
+ .setSymmetricEncryptionAlgorithm(
+ Preferences.getPreferences(this).getDefaultEncryptionAlgorithm())
+ .setEncryptionMasterKeyIds(encryptionKeyIds)
+ .setSymmetricPassphrase(symmetricPassphrase)
+ .setSignatureMasterKeyId(signatureKeyId)
+ .setEncryptToSigner(true)
+ .setSignatureHashAlgorithm(
+ Preferences.getPreferences(this).getDefaultHashAlgorithm())
+ .setSignaturePassphrase(
+ PassphraseCacheService.getCachedPassphrase(this, signatureKeyId));
+
+ // this assumes that the bytes are cleartext (valid for current implementation!)
+ if (source == IO_BYTES) {
+ builder.setCleartextInput(true);
+ }
- builder.setEnableAsciiArmorOutput(useAsciiArmor)
- .setCompressionId(compressionId)
- .setSymmetricEncryptionAlgorithm(
- Preferences.getPreferences(this).getDefaultEncryptionAlgorithm())
- .setEncryptionMasterKeyIds(encryptionKeyIds)
- .setSymmetricPassphrase(symmetricPassphrase)
- .setSignatureMasterKeyId(signatureKeyId)
- .setEncryptToSigner(true)
- .setSignatureHashAlgorithm(
- Preferences.getPreferences(this).getDefaultHashAlgorithm())
- .setSignaturePassphrase(
- PassphraseCacheService.getCachedPassphrase(this, signatureKeyId));
-
- // this assumes that the bytes are cleartext (valid for current implementation!)
- if (source == IO_BYTES) {
- builder.setCleartextInput(true);
- }
+ builder.build().execute();
- builder.build().execute();
+ outStream.close();
- outStream.close();
+ /* Output */
- /* Output */
+ finalizeEncryptOutputStream(data, resultData, outStream);
- Bundle resultData = new Bundle();
- finalizeEncryptOutputStream(data, resultData, outStream);
+ }
OtherHelper.logDebugBundle(resultData, "resultData");
@@ -415,13 +422,16 @@ public class KeychainIntentService extends IntentService
boolean exportSecret = data.getBoolean(EXPORT_SECRET, false);
long[] masterKeyIds = data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID);
String outputFile = data.getString(EXPORT_FILENAME);
+ Uri outputUri = data.getParcelable(EXPORT_URI);
// If not exporting all keys get the masterKeyIds of the keys to export from the intent
boolean exportAll = data.getBoolean(EXPORT_ALL);
- // check if storage is ready
- if (!FileHelper.isStorageMounted(outputFile)) {
- throw new PgpGeneralException(getString(R.string.error_external_storage_not_ready));
+ if (outputFile != null) {
+ // check if storage is ready
+ if (!FileHelper.isStorageMounted(outputFile)) {
+ throw new PgpGeneralException(getString(R.string.error_external_storage_not_ready));
+ }
}
ArrayList<Long> publicMasterKeyIds = new ArrayList<Long>();
@@ -453,12 +463,19 @@ public class KeychainIntentService extends IntentService
}
}
+ OutputStream outStream;
+ if (outputFile != null) {
+ outStream = new FileOutputStream(outputFile);
+ } else {
+ outStream = getContentResolver().openOutputStream(outputUri);
+ }
+
PgpImportExport pgpImportExport = new PgpImportExport(this, this, this);
Bundle resultData = pgpImportExport
.exportKeyRings(publicMasterKeyIds, secretMasterKeyIds,
- new FileOutputStream(outputFile));
+ outStream);
- if (mIsCanceled) {
+ if (mIsCanceled && outputFile != null) {
new File(outputFile).delete();
}
@@ -694,22 +711,17 @@ public class KeychainIntentService extends IntentService
byte[] bytes = data.getByteArray(bytesName);
return new InputData(new ByteArrayInputStream(bytes), bytes.length);
- case IO_FILE: /* encrypting file */
- String inputFile = data.getString(ENCRYPT_INPUT_FILE);
-
- // check if storage is ready
- if (!FileHelper.isStorageMounted(inputFile)) {
- throw new PgpGeneralException(getString(R.string.error_external_storage_not_ready));
- }
-
- return new InputData(new FileInputStream(inputFile), new File(inputFile).length());
-
case IO_URI: /* encrypting content uri */
Uri providerUri = data.getParcelable(ENCRYPT_INPUT_URI);
// InputStream
- InputStream in = getContentResolver().openInputStream(providerUri);
- return new InputData(in, 0);
+ return new InputData(getContentResolver().openInputStream(providerUri), FileHelper.getFileSize(this, providerUri, 0));
+
+ case IO_URIS:
+ providerUri = data.<Uri>getParcelableArrayList(ENCRYPT_INPUT_URIS).get(data.getInt(SELECTED_URI));
+
+ // InputStream
+ return new InputData(getContentResolver().openInputStream(providerUri), FileHelper.getFileSize(this, providerUri, 0));
default:
throw new PgpGeneralException("No target choosen!");
@@ -722,23 +734,16 @@ public class KeychainIntentService extends IntentService
case IO_BYTES:
return new ByteArrayOutputStream();
- case IO_FILE:
- String outputFile = data.getString(ENCRYPT_OUTPUT_FILE);
-
- // check if storage is ready
- if (!FileHelper.isStorageMounted(outputFile)) {
- throw new PgpGeneralException(
- getString(R.string.error_external_storage_not_ready));
- }
-
- // OutputStream
- return new FileOutputStream(outputFile);
-
case IO_URI:
Uri providerUri = data.getParcelable(ENCRYPT_OUTPUT_URI);
return getContentResolver().openOutputStream(providerUri);
+ case IO_URIS:
+ providerUri = data.<Uri>getParcelableArrayList(ENCRYPT_OUTPUT_URIS).get(data.getInt(SELECTED_URI));
+
+ return getContentResolver().openOutputStream(providerUri);
+
default:
throw new PgpGeneralException("No target choosen!");
}
@@ -759,11 +764,8 @@ public class KeychainIntentService extends IntentService
byte output[] = ((ByteArrayOutputStream) outStream).toByteArray();
resultData.putByteArray(bytesName, output);
break;
- case IO_FILE:
- // nothing, file was written, just send okay and verification bundle
-
- break;
case IO_URI:
+ case IO_URIS:
// nothing, output was written, just send okay and verification bundle
break;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java
index c27b3f6da..d7d98fd68 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.service;
import android.app.Activity;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java
index 11829e7b8..543b83edb 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.service;
import android.app.Activity;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
index 97d92dbf7..e813ca26c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
@@ -34,9 +34,8 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
-
-import android.support.v4.util.LongSparseArray;
import android.support.v4.app.NotificationCompat;
+import android.support.v4.util.LongSparseArray;
import org.spongycastle.bcpg.S2K;
import org.sufficientlysecure.keychain.Constants;
@@ -396,8 +395,8 @@ public class PassphraseCacheService extends Service {
} else {
// Fallback, since expandable notifications weren't available back then
builder.setSmallIcon(R.drawable.ic_launcher)
- .setContentTitle(String.format(getString(R.string.passp_cache_notif_n_keys,
- mPassphraseCache.size())))
+ .setContentTitle(String.format(getString(R.string.passp_cache_notif_n_keys),
+ mPassphraseCache.size()))
.setContentText(getString(R.string.passp_cache_notif_click_to_clear));
Intent intent = new Intent(getApplicationContext(), PassphraseCacheService.class);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
index 5e90b396e..490a8e738 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
package org.sufficientlysecure.keychain.service;
import android.os.Parcel;
@@ -6,16 +23,17 @@ import android.os.Parcelable;
import java.io.Serializable;
import java.util.ArrayList;
-/** This class is a a transferable representation for a collection of changes
+/**
+ * This class is a a transferable representation for a collection of changes
* to be done on a keyring.
- *
+ * <p/>
* This class should include all types of operations supported in the backend.
- *
+ * <p/>
* All changes are done in a differential manner. Besides the two key
* identification attributes, all attributes may be null, which indicates no
* change to the keyring. This is also the reason why boxed values are used
* instead of primitives in the subclasses.
- *
+ * <p/>
* Application of operations in the backend should be fail-fast, which means an
* error in any included operation (for example revocation of a non-existent
* subkey) will cause the operation as a whole to fail.
@@ -65,12 +83,23 @@ public class SaveKeyringParcel implements Parcelable {
public int mKeysize;
public int mFlags;
public Long mExpiry;
+
public SubkeyAdd(int algorithm, int keysize, int flags, Long expiry) {
mAlgorithm = algorithm;
mKeysize = keysize;
mFlags = flags;
mExpiry = expiry;
}
+
+ @Override
+ public String toString() {
+ String out = "mAlgorithm: " + mAlgorithm + ", ";
+ out += "mKeysize: " + mKeysize + ", ";
+ out += "mFlags: " + mFlags;
+ out += "mExpiry: " + mExpiry;
+
+ return out;
+ }
}
public static class SubkeyChange implements Serializable {
@@ -78,11 +107,46 @@ public class SaveKeyringParcel implements Parcelable {
public Integer mFlags;
// this is a long unix timestamp, in seconds (NOT MILLISECONDS!)
public Long mExpiry;
+
+ public SubkeyChange(long keyId) {
+ mKeyId = keyId;
+ }
+
public SubkeyChange(long keyId, Integer flags, Long expiry) {
mKeyId = keyId;
mFlags = flags;
mExpiry = expiry;
}
+
+ @Override
+ public String toString() {
+ String out = "mKeyId: " + mKeyId + ", ";
+ out += "mFlags: " + mFlags + ", ";
+ out += "mExpiry: " + mExpiry;
+
+ return out;
+ }
+ }
+
+ public SubkeyChange getSubkeyChange(long keyId) {
+ for (SubkeyChange subkeyChange : mChangeSubKeys) {
+ if (subkeyChange.mKeyId == keyId) {
+ return subkeyChange;
+ }
+ }
+ return null;
+ }
+
+ public SubkeyChange getOrCreateSubkeyChange(long keyId) {
+ SubkeyChange foundSubkeyChange = getSubkeyChange(keyId);
+ if (foundSubkeyChange != null) {
+ return foundSubkeyChange;
+ } else {
+ // else, create a new one
+ SubkeyChange newSubkeyChange = new SubkeyChange(keyId);
+ mChangeSubKeys.add(newSubkeyChange);
+ return newSubkeyChange;
+ }
}
public SaveKeyringParcel(Parcel source) {
@@ -104,7 +168,7 @@ public class SaveKeyringParcel implements Parcelable {
@Override
public void writeToParcel(Parcel destination, int flags) {
destination.writeInt(mMasterKeyId == null ? 0 : 1);
- if(mMasterKeyId != null) {
+ if (mMasterKeyId != null) {
destination.writeLong(mMasterKeyId);
}
destination.writeByteArray(mFingerprint);
@@ -136,4 +200,17 @@ public class SaveKeyringParcel implements Parcelable {
return 0;
}
+ @Override
+ public String toString() {
+ String out = "mMasterKeyId: " + mMasterKeyId + "\n";
+ out += "mNewPassphrase: " + mNewPassphrase + "\n";
+ out += "mAddUserIds: " + mAddUserIds + "\n";
+ out += "mAddSubKeys: " + mAddSubKeys + "\n";
+ out += "mChangeSubKeys: " + mChangeSubKeys + "\n";
+ out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n";
+ out += "mRevokeUserIds: " + mRevokeUserIds + "\n";
+ out += "mRevokeSubKeys: " + mRevokeSubKeys;
+
+ return out;
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
index 662ba4ce1..773be816a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
@@ -31,8 +31,8 @@ import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
+import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
import org.spongycastle.bcpg.sig.KeyFlags;
-import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.pgp.KeyRing;
@@ -169,11 +169,12 @@ public class CreateKeyFinalFragment extends Fragment {
Bundle data = new Bundle();
SaveKeyringParcel parcel = new SaveKeyringParcel();
- parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.CERTIFY_OTHER, null));
- parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.SIGN_DATA, null));
- parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, null));
+ parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(PublicKeyAlgorithmTags.RSA_GENERAL, 4096, KeyFlags.CERTIFY_OTHER, null));
+ parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(PublicKeyAlgorithmTags.RSA_GENERAL, 4096, KeyFlags.SIGN_DATA, null));
+ parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(PublicKeyAlgorithmTags.RSA_GENERAL, 4096, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, null));
String userId = KeyRing.createUserId(mName, mEmail, null);
parcel.mAddUserIds.add(userId);
+ parcel.mChangePrimaryUserId = userId;
parcel.mNewPassphrase = mPassphrase;
// get selected key entries
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
index dba742268..830b9a279 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
@@ -23,11 +23,9 @@ import android.net.Uri;
import android.os.Bundle;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
-import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.util.Log;
@@ -114,7 +112,7 @@ public class DecryptActivity extends DrawerActivity {
} else {
// Binary via content provider (could also be files)
// override uri to get stream from send
- uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
+ uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
action = ACTION_DECRYPT;
}
} else if (Intent.ACTION_VIEW.equals(action)) {
@@ -122,6 +120,7 @@ public class DecryptActivity extends DrawerActivity {
// override action
action = ACTION_DECRYPT;
+ mFileFragmentBundle.putBoolean(DecryptFileFragment.ARG_FROM_VIEW_INTENT, true);
}
String textData = extras.getString(EXTRA_TEXT);
@@ -155,21 +154,8 @@ public class DecryptActivity extends DrawerActivity {
}
}
} else if (ACTION_DECRYPT.equals(action) && uri != null) {
- // get file path from uri
- String path = FileHelper.getPath(this, uri);
-
- if (path != null) {
- mFileFragmentBundle.putString(DecryptFileFragment.ARG_FILENAME, path);
- mSwitchToTab = PAGER_TAB_FILE;
- } else {
- Log.e(Constants.TAG,
- "Direct binary data without actual file in filesystem is not supported. " +
- "Please use the Remote Service API!");
- Toast.makeText(this, R.string.error_only_files_are_supported, Toast.LENGTH_LONG)
- .show();
- // end activity
- finish();
- }
+ mFileFragmentBundle.putParcelable(DecryptFileFragment.ARG_URI, uri);
+ mSwitchToTab = PAGER_TAB_FILE;
} else if (ACTION_DECRYPT.equals(action)) {
Log.e(Constants.TAG,
"Include the extra 'text' or an Uri with setData() in your Intent!");
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java
index 56dfdbd95..c33b1489a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java
@@ -20,19 +20,16 @@ package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
-import android.database.Cursor;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
-import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
-import android.provider.OpenableColumns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageButton;
+import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
@@ -40,31 +37,28 @@ import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.util.Notify;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Notify;
import java.io.File;
public class DecryptFileFragment extends DecryptFragment {
- public static final String ARG_FILENAME = "filename";
+ public static final String ARG_URI = "uri";
+ public static final String ARG_FROM_VIEW_INTENT = "view_intent";
- private static final int RESULT_CODE_FILE = 0x00007003;
+ private static final int REQUEST_CODE_INPUT = 0x00007003;
+ private static final int REQUEST_CODE_OUTPUT = 0x00007007;
// view
- private EditText mFilename;
+ private TextView mFilename;
private CheckBox mDeleteAfter;
- private ImageButton mBrowse;
private View mDecryptButton;
- private String mInputFilename = null;
+ // model
private Uri mInputUri = null;
- private String mOutputFilename = null;
private Uri mOutputUri = null;
- private FileDialogFragment mFileDialog;
-
/**
* Inflate the layout for this fragment
*/
@@ -72,17 +66,16 @@ public class DecryptFileFragment extends DecryptFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.decrypt_file_fragment, container, false);
- mFilename = (EditText) view.findViewById(R.id.decrypt_file_filename);
- mBrowse = (ImageButton) view.findViewById(R.id.decrypt_file_browse);
+ mFilename = (TextView) view.findViewById(R.id.decrypt_file_filename);
mDeleteAfter = (CheckBox) view.findViewById(R.id.decrypt_file_delete_after_decryption);
mDecryptButton = view.findViewById(R.id.decrypt_file_action_decrypt);
- mBrowse.setOnClickListener(new View.OnClickListener() {
+ view.findViewById(R.id.decrypt_file_browse).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
- if (Constants.KITKAT) {
- FileHelper.openDocument(DecryptFileFragment.this, mInputUri, "*/*", RESULT_CODE_FILE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ FileHelper.openDocument(DecryptFileFragment.this, "*/*", REQUEST_CODE_INPUT);
} else {
- FileHelper.openFile(DecryptFileFragment.this, mFilename.getText().toString(), "*/*",
- RESULT_CODE_FILE);
+ FileHelper.openFile(DecryptFileFragment.this, mInputUri, "*/*",
+ REQUEST_CODE_INPUT);
}
}
});
@@ -100,74 +93,47 @@ public class DecryptFileFragment extends DecryptFragment {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- String filename = getArguments().getString(ARG_FILENAME);
- if (filename != null) {
- mFilename.setText(filename);
- }
+ setInputUri(getArguments().<Uri>getParcelable(ARG_URI));
}
- private String guessOutputFilename() {
- File file = new File(mInputFilename);
- String filename = file.getName();
- if (filename.endsWith(".asc") || filename.endsWith(".gpg") || filename.endsWith(".pgp")) {
- filename = filename.substring(0, filename.length() - 4);
+ private void setInputUri(Uri inputUri) {
+ if (inputUri == null) {
+ mInputUri = null;
+ mFilename.setText("");
+ return;
}
- return Constants.Path.APP_DIR + "/" + filename;
+
+ mInputUri = inputUri;
+ mFilename.setText(FileHelper.getFilename(getActivity(), mInputUri));
}
private void decryptAction() {
- String currentFilename = mFilename.getText().toString();
- if (mInputFilename == null || !mInputFilename.equals(currentFilename)) {
- mInputUri = null;
- mInputFilename = mFilename.getText().toString();
- }
-
if (mInputUri == null) {
- mOutputFilename = guessOutputFilename();
- }
-
- if (mInputFilename.equals("")) {
Notify.showNotify(getActivity(), R.string.no_file_selected, Notify.Style.ERROR);
return;
}
- if (mInputUri == null && mInputFilename.startsWith("file")) {
- File file = new File(mInputFilename);
- if (!file.exists() || !file.isFile()) {
- Notify.showNotify(getActivity(), getString(R.string.error_message,
- getString(R.string.error_file_not_found)), Notify.Style.ERROR);
- return;
- }
- }
-
askForOutputFilename();
}
- private void askForOutputFilename() {
- // Message is received after passphrase is cached
- Handler returnHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- if (message.what == FileDialogFragment.MESSAGE_OKAY) {
- Bundle data = message.getData();
- if (data.containsKey(FileDialogFragment.MESSAGE_DATA_URI)) {
- mOutputUri = data.getParcelable(FileDialogFragment.MESSAGE_DATA_URI);
- } else {
- mOutputFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME);
- }
- decryptStart(null);
- }
- }
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(returnHandler);
-
- mFileDialog = FileDialogFragment.newInstance(messenger,
- getString(R.string.title_decrypt_to_file),
- getString(R.string.specify_file_to_decrypt_to), mOutputFilename, null);
+ private String removeEncryptedAppend(String name) {
+ if (name.endsWith(".asc") || name.endsWith(".gpg") || name.endsWith(".pgp")) {
+ return name.substring(0, name.length() - 4);
+ }
+ return name;
+ }
- mFileDialog.show(getActivity().getSupportFragmentManager(), "fileDialog");
+ private void askForOutputFilename() {
+ String targetName = removeEncryptedAppend(FileHelper.getFilename(getActivity(), mInputUri));
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
+ File file = new File(mInputUri.getPath());
+ File parentDir = file.exists() ? file.getParentFile() : Constants.Path.APP_DIR;
+ File targetFile = new File(parentDir, targetName);
+ FileHelper.saveFile(this, getString(R.string.title_decrypt_to_file),
+ getString(R.string.specify_file_to_decrypt_to), targetFile, REQUEST_CODE_OUTPUT);
+ } else {
+ FileHelper.saveDocument(this, "*/*", targetName, REQUEST_CODE_OUTPUT);
+ }
}
@Override
@@ -183,25 +149,13 @@ public class DecryptFileFragment extends DecryptFragment {
intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY);
// data
- Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename="
- + mOutputFilename + ",mInputUri=" + mInputUri + ", mOutputUri="
- + mOutputUri);
+ Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri);
- if (mInputUri != null) {
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URI);
- data.putParcelable(KeychainIntentService.ENCRYPT_INPUT_URI, mInputUri);
- } else {
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_FILE);
- data.putString(KeychainIntentService.ENCRYPT_INPUT_FILE, mInputFilename);
- }
+ data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URI);
+ data.putParcelable(KeychainIntentService.ENCRYPT_INPUT_URI, mInputUri);
- if (mOutputUri != null) {
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URI);
- data.putParcelable(KeychainIntentService.ENCRYPT_OUTPUT_URI, mOutputUri);
- } else {
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_FILE);
- data.putString(KeychainIntentService.ENCRYPT_OUTPUT_FILE, mOutputFilename);
- }
+ data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URI);
+ data.putParcelable(KeychainIntentService.ENCRYPT_OUTPUT_URI, mOutputUri);
data.putString(KeychainIntentService.DECRYPT_PASSPHRASE, passphrase);
@@ -232,15 +186,19 @@ public class DecryptFileFragment extends DecryptFragment {
if (mDeleteAfter.isChecked()) {
// Create and show dialog to delete original file
- DeleteFileDialogFragment deleteFileDialog;
- if (mInputUri != null) {
- deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri);
- } else {
- deleteFileDialog = DeleteFileDialogFragment
- .newInstance(mInputFilename);
- }
+ DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri);
deleteFileDialog.show(getActivity().getSupportFragmentManager(), "deleteDialog");
+ setInputUri(null);
}
+
+ /*
+ // A future open after decryption feature
+ if () {
+ Intent viewFile = new Intent(Intent.ACTION_VIEW);
+ viewFile.setData(mOutputUri);
+ startActivity(viewFile);
+ }
+ */
}
}
}
@@ -260,28 +218,17 @@ public class DecryptFileFragment extends DecryptFragment {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
- case RESULT_CODE_FILE: {
+ case REQUEST_CODE_INPUT: {
if (resultCode == Activity.RESULT_OK && data != null) {
- if (Constants.KITKAT) {
- mInputUri = data.getData();
- Cursor cursor = getActivity().getContentResolver().query(mInputUri, new String[]{OpenableColumns.DISPLAY_NAME}, null, null, null);
- if (cursor != null) {
- if (cursor.moveToNext()) {
- mInputFilename = cursor.getString(0);
- mFilename.setText(mInputFilename);
- }
- cursor.close();
- }
- } else {
- try {
- String path = FileHelper.getPath(getActivity(), data.getData());
- Log.d(Constants.TAG, "path=" + path);
-
- mFilename.setText(path);
- } catch (NullPointerException e) {
- Log.e(Constants.TAG, "Nullpointer while retrieving path!");
- }
- }
+ setInputUri(data.getData());
+ }
+ return;
+ }
+ case REQUEST_CODE_OUTPUT: {
+ // This happens after output file was selected, so start our operation
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ mOutputUri = data.getData();
+ decryptStart(null);
}
return;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
index d4235b82b..211a20ec8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
@@ -25,11 +25,11 @@ import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.View.OnClickListener;
+import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
-import android.widget.Button;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.sufficientlysecure.keychain.R;
@@ -38,7 +38,7 @@ import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
-public class DecryptFragment extends Fragment {
+public abstract class DecryptFragment extends Fragment {
private static final int RESULT_CODE_LOOKUP_KEY = 0x00007006;
protected long mSignatureKeyId = 0;
@@ -217,8 +217,6 @@ public class DecryptFragment extends Fragment {
*
* @param passphrase
*/
- protected void decryptStart(String passphrase) {
-
- }
+ protected abstract void decryptStart(String passphrase);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
index 586442bb0..0e8d6f39d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
@@ -35,9 +35,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
-import android.widget.ImageView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
index b76755bb2..5be196a45 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
@@ -37,7 +37,6 @@ import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
-import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
@@ -57,17 +56,15 @@ import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter;
import org.sufficientlysecure.keychain.ui.adapter.SubkeysAddedAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAddedAdapter;
+import org.sufficientlysecure.keychain.ui.dialog.AddSubkeyDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.AddUserIdDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.ChangeExpiryDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyExpiryDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
-import java.util.ArrayList;
-import java.util.Date;
-
public class EditKeyFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
@@ -95,8 +92,8 @@ public class EditKeyFragment extends LoaderFragment implements
private Uri mDataUri;
private SaveKeyringParcel mSaveKeyringParcel;
- private String mPrimaryUserId;
+ private String mPrimaryUserId;
private String mCurrentPassphrase;
/**
@@ -215,8 +212,7 @@ public class EditKeyFragment extends LoaderFragment implements
mUserIdsList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- String userId = mUserIdsAdapter.getUserId(position);
- editUserId(userId);
+ editUserId(position);
}
});
@@ -230,8 +226,7 @@ public class EditKeyFragment extends LoaderFragment implements
mSubkeysList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- long keyId = mSubkeysAdapter.getKeyId(position);
- editSubkey(keyId);
+ editSubkey(position);
}
});
@@ -320,7 +315,11 @@ public class EditKeyFragment extends LoaderFragment implements
setPassphraseDialog.show(getActivity().getSupportFragmentManager(), "setPassphraseDialog");
}
- private void editUserId(final String userId) {
+ private void editUserId(final int position) {
+ final String userId = mUserIdsAdapter.getUserId(position);
+ final boolean isRevoked = mUserIdsAdapter.getIsRevoked(position);
+ final boolean isRevokedPending = mUserIdsAdapter.getIsRevokedPending(position);
+
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
@@ -353,20 +352,21 @@ public class EditKeyFragment extends LoaderFragment implements
DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
public void run() {
EditUserIdDialogFragment dialogFragment =
- EditUserIdDialogFragment.newInstance(messenger);
-
+ EditUserIdDialogFragment.newInstance(messenger, isRevoked, isRevokedPending);
dialogFragment.show(getActivity().getSupportFragmentManager(), "editUserIdDialog");
}
});
}
- private void editSubkey(final long keyId) {
+ private void editSubkey(final int position) {
+ final long keyId = mSubkeysAdapter.getKeyId(position);
+
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case EditSubkeyDialogFragment.MESSAGE_CHANGE_EXPIRY:
- editSubkeyExpiry(keyId);
+ editSubkeyExpiry(position);
break;
case EditSubkeyDialogFragment.MESSAGE_REVOKE:
// toggle
@@ -394,19 +394,19 @@ public class EditKeyFragment extends LoaderFragment implements
});
}
- private void editSubkeyExpiry(final long keyId) {
+ private void editSubkeyExpiry(final int position) {
+ final long keyId = mSubkeysAdapter.getKeyId(position);
+ final Long creationDate = mSubkeysAdapter.getCreationDate(position);
+ final Long expiryDate = mSubkeysAdapter.getExpiryDate(position);
+
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
- case ChangeExpiryDialogFragment.MESSAGE_NEW_EXPIRY_DATE:
- // toggle
-// if (mSaveKeyringParcel.changePrimaryUserId != null
-// && mSaveKeyringParcel.changePrimaryUserId.equals(userId)) {
-// mSaveKeyringParcel.changePrimaryUserId = null;
-// } else {
-// mSaveKeyringParcel.changePrimaryUserId = userId;
-// }
+ case EditSubkeyExpiryDialogFragment.MESSAGE_NEW_EXPIRY_DATE:
+ Long expiry = (Long) message.getData().
+ getSerializable(EditSubkeyExpiryDialogFragment.MESSAGE_DATA_EXPIRY_DATE);
+ mSaveKeyringParcel.getOrCreateSubkeyChange(keyId).mExpiry = expiry;
break;
}
getLoaderManager().getLoader(LOADER_ID_SUBKEYS).forceLoad();
@@ -418,8 +418,8 @@ public class EditKeyFragment extends LoaderFragment implements
DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
public void run() {
- ChangeExpiryDialogFragment dialogFragment =
- ChangeExpiryDialogFragment.newInstance(messenger, new Date(), new Date());
+ EditSubkeyExpiryDialogFragment dialogFragment =
+ EditSubkeyExpiryDialogFragment.newInstance(messenger, creationDate, expiryDate);
dialogFragment.show(getActivity().getSupportFragmentManager(), "editSubkeyExpiryDialog");
}
@@ -453,8 +453,21 @@ public class EditKeyFragment extends LoaderFragment implements
}
private void addSubkey() {
- // default values
- mSubkeysAddedAdapter.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.SIGN_DATA, null));
+ boolean willBeMasterKey = mSubkeysAdapter.getCount() == 0
+ && mSubkeysAddedAdapter.getCount() == 0;
+
+ AddSubkeyDialogFragment addSubkeyDialogFragment =
+ AddSubkeyDialogFragment.newInstance(willBeMasterKey);
+ addSubkeyDialogFragment
+ .setOnAlgorithmSelectedListener(
+ new AddSubkeyDialogFragment.OnAlgorithmSelectedListener() {
+ @Override
+ public void onAlgorithmSelected(SaveKeyringParcel.SubkeyAdd newSubkey) {
+ mSubkeysAddedAdapter.add(newSubkey);
+ }
+ }
+ );
+ addSubkeyDialogFragment.show(getActivity().getSupportFragmentManager(), "addSubkeyDialog");
}
private void cachePassphraseForEdit() {
@@ -479,9 +492,7 @@ public class EditKeyFragment extends LoaderFragment implements
}
private void save(String passphrase) {
- Log.d(Constants.TAG, "mSaveKeyringParcel.mAddUserIds: " + mSaveKeyringParcel.mAddUserIds);
- Log.d(Constants.TAG, "mSaveKeyringParcel.mNewPassphrase: " + mSaveKeyringParcel.mNewPassphrase);
- Log.d(Constants.TAG, "mSaveKeyringParcel.mRevokeUserIds: " + mSaveKeyringParcel.mRevokeUserIds);
+ Log.d(Constants.TAG, "mSaveKeyringParcel:\n" + mSaveKeyringParcel.toString());
// Message is received after importing is done in KeychainIntentService
KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
index cc69148c1..94f828b48 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
@@ -18,23 +18,46 @@
package org.sufficientlysecure.keychain.ui;
+import android.app.ProgressDialog;
import android.content.Intent;
+import android.content.pm.LabeledIntent;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.Parcelable;
+import android.support.v4.app.Fragment;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
-import android.widget.Toast;
+import android.view.Menu;
+import android.view.MenuItem;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.FileHelper;
+import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.helper.Preferences;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
+import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Notify;
-public class EncryptActivity extends DrawerActivity implements
- EncryptSymmetricFragment.OnSymmetricKeySelection,
- EncryptAsymmetricFragment.OnAsymmetricKeySelection,
- EncryptActivityInterface {
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class EncryptActivity extends DrawerActivity implements EncryptActivityInterface {
/* Intents */
public static final String ACTION_ENCRYPT = Constants.INTENT_PREFIX + "ENCRYPT";
@@ -51,7 +74,7 @@ public class EncryptActivity extends DrawerActivity implements
// view
ViewPager mViewPagerMode;
- PagerTabStrip mPagerTabStripMode;
+ //PagerTabStrip mPagerTabStripMode;
PagerTabStripAdapter mTabsAdapterMode;
ViewPager mViewPagerContent;
PagerTabStrip mPagerTabStripContent;
@@ -72,63 +95,386 @@ public class EncryptActivity extends DrawerActivity implements
// model used by message and file fragments
private long mEncryptionKeyIds[] = null;
+ private String mEncryptionUserIds[] = null;
private long mSigningKeyId = Constants.key.none;
- private String mPassphrase;
- private String mPassphraseAgain;
+ private String mPassphrase = "";
+ private boolean mUseArmor;
+ private boolean mDeleteAfterEncrypt = false;
+ private boolean mShareAfterEncrypt = false;
+ private ArrayList<Uri> mInputUris;
+ private ArrayList<Uri> mOutputUris;
+ private String mMessage = "";
+
+ public boolean isModeSymmetric() {
+ return PAGER_MODE_SYMMETRIC == mViewPagerMode.getCurrentItem();
+ }
+
+ public boolean isContentMessage() {
+ return PAGER_CONTENT_MESSAGE == mViewPagerContent.getCurrentItem();
+ }
@Override
- public void onSigningKeySelected(long signingKeyId) {
- mSigningKeyId = signingKeyId;
+ public boolean isUseArmor() {
+ return mUseArmor;
}
@Override
- public void onEncryptionKeysSelected(long[] encryptionKeyIds) {
- mEncryptionKeyIds = encryptionKeyIds;
+ public long getSignatureKey() {
+ return mSigningKeyId;
}
@Override
- public void onPassphraseUpdate(String passphrase) {
+ public long[] getEncryptionKeys() {
+ return mEncryptionKeyIds;
+ }
+
+ @Override
+ public String[] getEncryptionUsers() {
+ return mEncryptionUserIds;
+ }
+
+ @Override
+ public void setSignatureKey(long signatureKey) {
+ mSigningKeyId = signatureKey;
+ notifyUpdate();
+ }
+
+ @Override
+ public void setEncryptionKeys(long[] encryptionKeys) {
+ mEncryptionKeyIds = encryptionKeys;
+ notifyUpdate();
+ }
+
+ @Override
+ public void setEncryptionUsers(String[] encryptionUsers) {
+ mEncryptionUserIds = encryptionUsers;
+ notifyUpdate();
+ }
+
+ @Override
+ public void setPassphrase(String passphrase) {
mPassphrase = passphrase;
}
@Override
- public void onPassphraseAgainUpdate(String passphrase) {
- mPassphraseAgain = passphrase;
+ public ArrayList<Uri> getInputUris() {
+ if (mInputUris == null) mInputUris = new ArrayList<Uri>();
+ return mInputUris;
}
@Override
- public boolean isModeSymmetric() {
- if (PAGER_MODE_SYMMETRIC == mViewPagerMode.getCurrentItem()) {
- return true;
- } else {
- return false;
- }
+ public ArrayList<Uri> getOutputUris() {
+ if (mOutputUris == null) mOutputUris = new ArrayList<Uri>();
+ return mOutputUris;
}
@Override
- public long getSignatureKey() {
- return mSigningKeyId;
+ public void setInputUris(ArrayList<Uri> uris) {
+ mInputUris = uris;
+ notifyUpdate();
}
@Override
- public long[] getEncryptionKeys() {
- return mEncryptionKeyIds;
+ public void setOutputUris(ArrayList<Uri> uris) {
+ mOutputUris = uris;
+ notifyUpdate();
+ }
+
+ @Override
+ public String getMessage() {
+ return mMessage;
}
@Override
- public String getPassphrase() {
- return mPassphrase;
+ public void setMessage(String message) {
+ mMessage = message;
}
@Override
- public String getPassphraseAgain() {
- return mPassphraseAgain;
+ public void notifyUpdate() {
+ for (Fragment fragment : getSupportFragmentManager().getFragments()) {
+ if (fragment instanceof EncryptActivityInterface.UpdateListener) {
+ ((UpdateListener) fragment).onNotifyUpdate();
+ }
+ }
}
+ @Override
+ public void startEncrypt(boolean share) {
+ mShareAfterEncrypt = share;
+ startEncrypt();
+ }
+
+ public void startEncrypt() {
+ if (!inputIsValid()) {
+ // Notify was created by inputIsValid.
+ return;
+ }
+
+ // Send all information needed to service to edit key in other thread
+ Intent intent = new Intent(this, KeychainIntentService.class);
+ intent.setAction(KeychainIntentService.ACTION_ENCRYPT_SIGN);
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, createEncryptBundle());
+
+ // Message is received after encrypting is done in KeychainIntentService
+ KeychainIntentServiceHandler serviceHandler = new KeychainIntentServiceHandler(this,
+ getString(R.string.progress_encrypting), ProgressDialog.STYLE_HORIZONTAL) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (!isContentMessage()) {
+ Notify.showNotify(EncryptActivity.this, R.string.encrypt_sign_successful, Notify.Style.INFO);
+
+ if (mDeleteAfterEncrypt) {
+ for (Uri inputUri : mInputUris) {
+ DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(inputUri);
+ deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog");
+ }
+ mInputUris.clear();
+ notifyUpdate();
+ }
+ }
+
+ if (mShareAfterEncrypt) {
+ // Share encrypted message/file
+ startActivity(sendWithChooserExcludingEncrypt(message));
+ } else if (isContentMessage()) {
+ // Copy to clipboard
+ copyToClipboard(message);
+ Notify.showNotify(EncryptActivity.this,
+ R.string.encrypt_sign_clipboard_successful, Notify.Style.INFO);
+ }
+ }
+ }
+ };
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(serviceHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ // show progress dialog
+ serviceHandler.showProgressDialog(this);
+
+ // start service with intent
+ startService(intent);
+ }
+
+ private Bundle createEncryptBundle() {
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ if (isContentMessage()) {
+ data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_BYTES);
+ data.putByteArray(KeychainIntentService.ENCRYPT_MESSAGE_BYTES, mMessage.getBytes());
+ } else {
+ data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URIS);
+ data.putParcelableArrayList(KeychainIntentService.ENCRYPT_INPUT_URIS, mInputUris);
+
+ data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URIS);
+ data.putParcelableArrayList(KeychainIntentService.ENCRYPT_OUTPUT_URIS, mOutputUris);
+ }
+
+ // Always use armor for messages
+ data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_ARMOR, mUseArmor || isContentMessage());
+
+ // TODO: Only default compression right now...
+ int compressionId = Preferences.getPreferences(this).getDefaultMessageCompression();
+ data.putInt(KeychainIntentService.ENCRYPT_COMPRESSION_ID, compressionId);
+
+ if (isModeSymmetric()) {
+ Log.d(Constants.TAG, "Symmetric encryption enabled!");
+ String passphrase = mPassphrase;
+ if (passphrase.length() == 0) {
+ passphrase = null;
+ }
+ data.putString(KeychainIntentService.ENCRYPT_SYMMETRIC_PASSPHRASE, passphrase);
+ } else {
+ data.putLong(KeychainIntentService.ENCRYPT_SIGNATURE_KEY_ID, mSigningKeyId);
+ data.putLongArray(KeychainIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS, mEncryptionKeyIds);
+ }
+ return data;
+ }
+
+ private void copyToClipboard(Message message) {
+ ClipboardReflection.copyToClipboard(this, new String(message.getData().getByteArray(KeychainIntentService.RESULT_BYTES)));
+ }
+
+ /**
+ * Create Intent Chooser but exclude OK's EncryptActivity.
+ * <p/>
+ * Put together from some stackoverflow posts...
+ *
+ * @param message
+ * @return
+ */
+ private Intent sendWithChooserExcludingEncrypt(Message message) {
+ Intent prototype = createSendIntent(message);
+
+ String title = isContentMessage() ? getString(R.string.title_share_message)
+ : getString(R.string.title_share_file);
+
+ // fallback on Android 2.3, otherwise we would get weird results
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return Intent.createChooser(prototype, title);
+ }
+
+ // prevent recursion aka Inception :P
+ String[] blacklist = new String[]{Constants.PACKAGE_NAME + ".ui.EncryptActivity"};
+
+ List<LabeledIntent> targetedShareIntents = new ArrayList<LabeledIntent>();
+
+ List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(prototype, 0);
+ List<ResolveInfo> resInfoListFiltered = new ArrayList<ResolveInfo>();
+ if (!resInfoList.isEmpty()) {
+ for (ResolveInfo resolveInfo : resInfoList) {
+ // do not add blacklisted ones
+ if (resolveInfo.activityInfo == null || Arrays.asList(blacklist).contains(resolveInfo.activityInfo.name))
+ continue;
+
+ resInfoListFiltered.add(resolveInfo);
+ }
+
+ if (!resInfoListFiltered.isEmpty()) {
+ // sorting for nice readability
+ Collections.sort(resInfoListFiltered, new Comparator<ResolveInfo>() {
+ @Override
+ public int compare(ResolveInfo first, ResolveInfo second) {
+ String firstName = first.loadLabel(getPackageManager()).toString();
+ String secondName = second.loadLabel(getPackageManager()).toString();
+ return firstName.compareToIgnoreCase(secondName);
+ }
+ });
+
+ // create the custom intent list
+ for (ResolveInfo resolveInfo : resInfoListFiltered) {
+ Intent targetedShareIntent = (Intent) prototype.clone();
+ targetedShareIntent.setPackage(resolveInfo.activityInfo.packageName);
+ targetedShareIntent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
+
+ LabeledIntent lIntent = new LabeledIntent(targetedShareIntent,
+ resolveInfo.activityInfo.packageName,
+ resolveInfo.loadLabel(getPackageManager()),
+ resolveInfo.activityInfo.icon);
+ targetedShareIntents.add(lIntent);
+ }
+
+ // Create chooser with only one Intent in it
+ Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(targetedShareIntents.size() - 1), title);
+ // append all other Intents
+ chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
+ return chooserIntent;
+ }
+
+ }
+
+ // fallback to Android's default chooser
+ return Intent.createChooser(prototype, title);
+ }
+
+ private Intent createSendIntent(Message message) {
+ Intent sendIntent;
+ if (isContentMessage()) {
+ sendIntent = new Intent(Intent.ACTION_SEND);
+ sendIntent.setType("text/plain");
+ sendIntent.putExtra(Intent.EXTRA_TEXT, new String(message.getData().getByteArray(KeychainIntentService.RESULT_BYTES)));
+ } else {
+ // file
+ if (mOutputUris.size() == 1) {
+ sendIntent = new Intent(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_STREAM, mOutputUris.get(0));
+ } else {
+ sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
+ sendIntent.putExtra(Intent.EXTRA_STREAM, mOutputUris);
+ }
+ sendIntent.setType("application/pgp-encrypted");
+ }
+ if (!isModeSymmetric() && mEncryptionUserIds != null) {
+ Set<String> users = new HashSet<String>();
+ for (String user : mEncryptionUserIds) {
+ String[] userId = KeyRing.splitUserId(user);
+ if (userId[1] != null) {
+ users.add(userId[1]);
+ }
+ }
+ sendIntent.putExtra(Intent.EXTRA_EMAIL, users.toArray(new String[users.size()]));
+ }
+ return sendIntent;
+ }
+
+ private boolean inputIsValid() {
+ if (isContentMessage()) {
+ if (mMessage == null) {
+ Notify.showNotify(this, R.string.error_message, Notify.Style.ERROR);
+ return false;
+ }
+ } else {
+ // file checks
+
+ if (mInputUris.isEmpty()) {
+ Notify.showNotify(this, R.string.no_file_selected, Notify.Style.ERROR);
+ return false;
+ } else if (mInputUris.size() > 1 && !mShareAfterEncrypt) {
+ // This should be impossible...
+ return false;
+ } else if (mInputUris.size() != mOutputUris.size()) {
+ // This as well
+ return false;
+ }
+ }
+
+ if (isModeSymmetric()) {
+ // symmetric encryption checks
+
+
+ if (mPassphrase == null) {
+ Notify.showNotify(this, R.string.passphrases_do_not_match, Notify.Style.ERROR);
+ return false;
+ }
+ if (mPassphrase.isEmpty()) {
+ Notify.showNotify(this, R.string.passphrase_must_not_be_empty, Notify.Style.ERROR);
+ return false;
+ }
+
+ } else {
+ // asymmetric encryption checks
+
+ boolean gotEncryptionKeys = (mEncryptionKeyIds != null
+ && mEncryptionKeyIds.length > 0);
+
+ // Files must be encrypted, only text can be signed-only right now
+ if (!gotEncryptionKeys && !isContentMessage()) {
+ Notify.showNotify(this, R.string.select_encryption_key, Notify.Style.ERROR);
+ return false;
+ }
+
+ if (!gotEncryptionKeys && mSigningKeyId == 0) {
+ Notify.showNotify(this, R.string.select_encryption_or_signature_key, Notify.Style.ERROR);
+ return false;
+ }
+
+ if (mSigningKeyId != 0 && PassphraseCacheService.getCachedPassphrase(this, mSigningKeyId) == null) {
+ PassphraseDialogFragment.show(this, mSigningKeyId,
+ new Handler() {
+ @Override
+ public void handleMessage(Message message) {
+ if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) {
+ // restart
+ startEncrypt();
+ }
+ }
+ }
+ );
+
+ return false;
+ }
+ }
+ return true;
+ }
private void initView() {
mViewPagerMode = (ViewPager) findViewById(R.id.encrypt_pager_mode);
- mPagerTabStripMode = (PagerTabStrip) findViewById(R.id.encrypt_pager_tab_strip_mode);
+ //mPagerTabStripMode = (PagerTabStrip) findViewById(R.id.encrypt_pager_tab_strip_mode);
mViewPagerContent = (ViewPager) findViewById(R.id.encrypt_pager_content);
mPagerTabStripContent = (PagerTabStrip) findViewById(R.id.encrypt_pager_tab_strip_content);
@@ -165,8 +511,43 @@ public class EncryptActivity extends DrawerActivity implements
mTabsAdapterContent.addTab(EncryptMessageFragment.class,
mMessageFragmentBundle, getString(R.string.label_message));
mTabsAdapterContent.addTab(EncryptFileFragment.class,
- mFileFragmentBundle, getString(R.string.label_file));
+ mFileFragmentBundle, getString(R.string.label_files));
mViewPagerContent.setCurrentItem(mSwitchToContent);
+
+ mUseArmor = Preferences.getPreferences(this).getDefaultAsciiArmor();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.encrypt_activity, menu);
+ menu.findItem(R.id.check_use_armor).setChecked(mUseArmor);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.isCheckable()) {
+ item.setChecked(!item.isChecked());
+ }
+ switch (item.getItemId()) {
+ case R.id.check_use_symmetric:
+ mSwitchToMode = item.isChecked() ? PAGER_MODE_SYMMETRIC : PAGER_MODE_ASYMMETRIC;
+
+ mViewPagerMode.setCurrentItem(mSwitchToMode);
+ notifyUpdate();
+ break;
+ case R.id.check_use_armor:
+ mUseArmor = item.isChecked();
+ notifyUpdate();
+ break;
+ case R.id.check_delete_after_encrypt:
+ mDeleteAfterEncrypt = item.isChecked();
+ notifyUpdate();
+ break;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ return true;
}
/**
@@ -178,17 +559,21 @@ public class EncryptActivity extends DrawerActivity implements
String action = intent.getAction();
Bundle extras = intent.getExtras();
String type = intent.getType();
- Uri uri = intent.getData();
+ ArrayList<Uri> uris = new ArrayList<Uri>();
if (extras == null) {
extras = new Bundle();
}
+ if (intent.getData() != null) {
+ uris.add(intent.getData());
+ }
+
/*
* Android's Action
*/
if (Intent.ACTION_SEND.equals(action) && type != null) {
- // When sending to APG Encrypt via share menu
+ // When sending to OpenKeychain Encrypt via share menu
if ("text/plain".equals(type)) {
// Plain text
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
@@ -201,14 +586,19 @@ public class EncryptActivity extends DrawerActivity implements
}
} else {
// Files via content provider, override uri and action
- uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
+ uris.clear();
+ uris.add(intent.<Uri>getParcelableExtra(Intent.EXTRA_STREAM));
action = ACTION_ENCRYPT;
}
}
+ if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
+ uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
+ action = ACTION_ENCRYPT;
+ }
+
if (extras.containsKey(EXTRA_ASCII_ARMOR)) {
- boolean requestAsciiArmor = extras.getBoolean(EXTRA_ASCII_ARMOR, true);
- mFileFragmentBundle.putBoolean(EncryptFileFragment.ARG_ASCII_ARMOR, requestAsciiArmor);
+ mUseArmor = extras.getBoolean(EXTRA_ASCII_ARMOR, true);
}
String textData = extras.getString(EXTRA_TEXT);
@@ -230,25 +620,10 @@ public class EncryptActivity extends DrawerActivity implements
// encrypt text based on given extra
mMessageFragmentBundle.putString(EncryptMessageFragment.ARG_TEXT, textData);
mSwitchToContent = PAGER_CONTENT_MESSAGE;
- } else if (ACTION_ENCRYPT.equals(action) && uri != null) {
+ } else if (ACTION_ENCRYPT.equals(action) && uris != null && !uris.isEmpty()) {
// encrypt file based on Uri
-
- // get file path from uri
- String path = FileHelper.getPath(this, uri);
-
- if (path != null) {
- mFileFragmentBundle.putString(EncryptFileFragment.ARG_FILENAME, path);
- mSwitchToContent = PAGER_CONTENT_FILE;
- } else {
- Log.e(Constants.TAG,
- "Direct binary data without actual file in filesystem is not supported " +
- "by Intents. Please use the Remote Service API!"
- );
- Toast.makeText(this, R.string.error_only_files_are_supported,
- Toast.LENGTH_LONG).show();
- // end activity
- finish();
- }
+ mFileFragmentBundle.putParcelableArrayList(EncryptFileFragment.ARG_URIS, uris);
+ mSwitchToContent = PAGER_CONTENT_FILE;
} else if (ACTION_ENCRYPT.equals(action)) {
Log.e(Constants.TAG,
"Include the extra 'text' or an Uri with setData() in your Intent!");
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivityInterface.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivityInterface.java
index 0786b3a16..54fe369a7 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivityInterface.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivityInterface.java
@@ -17,14 +17,41 @@
package org.sufficientlysecure.keychain.ui;
+import android.net.Uri;
+
+import java.util.ArrayList;
+
public interface EncryptActivityInterface {
- public boolean isModeSymmetric();
+ public interface UpdateListener {
+ void onNotifyUpdate();
+ }
+
+ public boolean isUseArmor();
public long getSignatureKey();
public long[] getEncryptionKeys();
+ public String[] getEncryptionUsers();
+ public void setSignatureKey(long signatureKey);
+ public void setEncryptionKeys(long[] encryptionKeys);
+ public void setEncryptionUsers(String[] encryptionUsers);
+
+ public void setPassphrase(String passphrase);
+
+ // ArrayList on purpose as only those are parcelable
+ public ArrayList<Uri> getInputUris();
+ public ArrayList<Uri> getOutputUris();
+ public void setInputUris(ArrayList<Uri> uris);
+ public void setOutputUris(ArrayList<Uri> uris);
+
+ public String getMessage();
+ public void setMessage(String message);
- public String getPassphrase();
- public String getPassphraseAgain();
+ /**
+ * Call this to notify the UI for changes done on the array lists or arrays,
+ * automatically called if setter is used
+ */
+ public void notifyUpdate();
+ public void startEncrypt(boolean share);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
index eb807792b..3de617ca0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
@@ -18,16 +18,25 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.content.Intent;
+import android.content.Context;
+import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.CheckBox;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.Spinner;
+import android.widget.SpinnerAdapter;
import android.widget.TextView;
-import android.widget.Button;
+
+import com.tokenautocomplete.TokenCompleteTextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
@@ -37,61 +46,52 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.widget.EncryptKeyCompletionView;
import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.Notify;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
-public class EncryptAsymmetricFragment extends Fragment {
+public class EncryptAsymmetricFragment extends Fragment implements EncryptActivityInterface.UpdateListener {
public static final String ARG_SIGNATURE_KEY_ID = "signature_key_id";
public static final String ARG_ENCRYPTION_KEY_IDS = "encryption_key_ids";
- public static final int REQUEST_CODE_PUBLIC_KEYS = 0x00007001;
- public static final int REQUEST_CODE_SECRET_KEYS = 0x00007002;
-
ProviderHelper mProviderHelper;
- OnAsymmetricKeySelection mKeySelectionListener;
-
// view
- private Button mSelectKeysButton;
- private CheckBox mSign;
- private TextView mMainUserId;
- private TextView mMainUserIdRest;
+ private Spinner mSign;
+ private EncryptKeyCompletionView mEncryptKeyView;
+ private SelectSignKeyCursorAdapter mSignAdapter = new SelectSignKeyCursorAdapter();
// model
- private long mSecretKeyId = Constants.key.none;
- private long mEncryptionKeyIds[] = null;
+ private EncryptActivityInterface mEncryptInterface;
- // Container Activity must implement this interface
- public interface OnAsymmetricKeySelection {
- public void onSigningKeySelected(long signingKeyId);
+ @Override
+ public void onNotifyUpdate() {
- public void onEncryptionKeysSelected(long[] encryptionKeyIds);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
- mKeySelectionListener = (OnAsymmetricKeySelection) activity;
+ mEncryptInterface = (EncryptActivityInterface) activity;
} catch (ClassCastException e) {
- throw new ClassCastException(activity.toString() + " must implement OnAsymmetricKeySelection");
+ throw new ClassCastException(activity.toString() + " must implement EncryptActivityInterface");
}
}
private void setSignatureKeyId(long signatureKeyId) {
- mSecretKeyId = signatureKeyId;
- // update key selection in EncryptActivity
- mKeySelectionListener.onSigningKeySelected(signatureKeyId);
- updateView();
+ mEncryptInterface.setSignatureKey(signatureKeyId);
}
private void setEncryptionKeyIds(long[] encryptionKeyIds) {
- mEncryptionKeyIds = encryptionKeyIds;
- // update key selection in EncryptActivity
- mKeySelectionListener.onEncryptionKeysSelected(encryptionKeyIds);
- updateView();
+ mEncryptInterface.setEncryptionKeys(encryptionKeyIds);
+ }
+
+ private void setEncryptionUserIds(String[] encryptionUserIds) {
+ mEncryptInterface.setEncryptionUsers(encryptionUserIds);
}
/**
@@ -101,25 +101,21 @@ public class EncryptAsymmetricFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.encrypt_asymmetric_fragment, container, false);
- mSelectKeysButton = (Button) view.findViewById(R.id.btn_selectEncryptKeys);
- mSign = (CheckBox) view.findViewById(R.id.sign);
- mMainUserId = (TextView) view.findViewById(R.id.mainUserId);
- mMainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
- mSelectKeysButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- selectPublicKeys();
+ mSign = (Spinner) view.findViewById(R.id.sign);
+ mSign.setAdapter(mSignAdapter);
+ mSign.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ setSignatureKeyId(parent.getAdapter().getItemId(position));
}
- });
- mSign.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- CheckBox checkBox = (CheckBox) v;
- if (checkBox.isChecked()) {
- selectSecretKey();
- } else {
- setSignatureKeyId(Constants.key.none);
- }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ setSignatureKeyId(Constants.key.none);
}
});
+ mEncryptKeyView = (EncryptKeyCompletionView) view.findViewById(R.id.recipient_list);
+ mEncryptKeyView.setThreshold(1); // Start working from first character
return view;
}
@@ -135,6 +131,65 @@ public class EncryptAsymmetricFragment extends Fragment {
// preselect keys given by arguments (given by Intent to EncryptActivity)
preselectKeys(signatureKeyId, encryptionKeyIds, mProviderHelper);
+
+ getLoaderManager().initLoader(1, null, new LoaderManager.LoaderCallbacks<Cursor>() {
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ // This is called when a new Loader needs to be created. This
+ // sample only has one Loader, so we don't care about the ID.
+ Uri baseUri = KeyRings.buildUnifiedKeyRingsUri();
+
+ // These are the rows that we will retrieve.
+ String[] projection = new String[]{
+ KeyRings._ID,
+ KeyRings.MASTER_KEY_ID,
+ KeyRings.KEY_ID,
+ KeyRings.USER_ID,
+ KeyRings.EXPIRY,
+ KeyRings.IS_REVOKED,
+ // can certify info only related to master key
+ KeyRings.CAN_CERTIFY,
+ // has sign may be any subkey
+ KeyRings.HAS_SIGN,
+ KeyRings.HAS_ANY_SECRET,
+ KeyRings.HAS_SECRET
+ };
+
+ String where = KeyRings.HAS_ANY_SECRET + " = 1";
+
+ // Now create and return a CursorLoader that will take care of
+ // creating a Cursor for the data being displayed.
+ return new CursorLoader(getActivity(), baseUri, projection, where, null, null);
+ /*return new CursorLoader(getActivity(), KeyRings.buildUnifiedKeyRingsUri(),
+ new String[]{KeyRings.USER_ID, KeyRings.KEY_ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET}, SIGN_KEY_SELECTION,
+ null, null);*/
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ mSignAdapter.swapCursor(data);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ mSignAdapter.swapCursor(null);
+ }
+ });
+ mEncryptKeyView.setTokenListener(new TokenCompleteTextView.TokenListener() {
+ @Override
+ public void onTokenAdded(Object token) {
+ if (token instanceof EncryptKeyCompletionView.EncryptionKey) {
+ updateEncryptionKeys();
+ }
+ }
+
+ @Override
+ public void onTokenRemoved(Object token) {
+ if (token instanceof EncryptKeyCompletionView.EncryptionKey) {
+ updateEncryptionKeys();
+ }
+ }
+ });
}
/**
@@ -161,117 +216,125 @@ public class EncryptAsymmetricFragment extends Fragment {
}
if (preselectedEncryptionKeyIds != null) {
- Vector<Long> goodIds = new Vector<Long>();
- for (int i = 0; i < preselectedEncryptionKeyIds.length; ++i) {
+ for (long preselectedId : preselectedEncryptionKeyIds) {
try {
- long id = providerHelper.getCachedPublicKeyRing(
- KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(
- preselectedEncryptionKeyIds[i])
- ).getMasterKeyId();
- goodIds.add(id);
+ CachedPublicKeyRing ring = providerHelper.getCachedPublicKeyRing(
+ KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(preselectedId));
+ mEncryptKeyView.addObject(mEncryptKeyView.new EncryptionKey(ring));
} catch (PgpGeneralException e) {
Log.e(Constants.TAG, "key not found!", e);
}
}
- if (goodIds.size() > 0) {
- long[] keyIds = new long[goodIds.size()];
- for (int i = 0; i < goodIds.size(); ++i) {
- keyIds[i] = goodIds.get(i);
- }
- setEncryptionKeyIds(keyIds);
- }
+ updateEncryptionKeys();
}
}
- private void updateView() {
- if (mEncryptionKeyIds == null || mEncryptionKeyIds.length == 0) {
- mSelectKeysButton.setText(getString(R.string.select_keys_button_default));
- } else {
- mSelectKeysButton.setText(getResources().getQuantityString(
- R.plurals.select_keys_button, mEncryptionKeyIds.length,
- mEncryptionKeyIds.length));
+ private void updateEncryptionKeys() {
+ List<Object> objects = mEncryptKeyView.getObjects();
+ List<Long> keyIds = new ArrayList<Long>();
+ List<String> userIds = new ArrayList<String>();
+ for (Object object : objects) {
+ if (object instanceof EncryptKeyCompletionView.EncryptionKey) {
+ keyIds.add(((EncryptKeyCompletionView.EncryptionKey) object).getKeyId());
+ userIds.add(((EncryptKeyCompletionView.EncryptionKey) object).getUserId());
+ }
+ }
+ long[] keyIdsArr = new long[keyIds.size()];
+ Iterator<Long> iterator = keyIds.iterator();
+ for (int i = 0; i < keyIds.size(); i++) {
+ keyIdsArr[i] = iterator.next();
}
+ setEncryptionKeyIds(keyIdsArr);
+ setEncryptionUserIds(userIds.toArray(new String[userIds.size()]));
+ }
- if (mSecretKeyId == Constants.key.none) {
- mSign.setChecked(false);
- mMainUserId.setText("");
- mMainUserIdRest.setText("");
- } else {
- // See if we can get a user_id from a unified query
- try {
- String[] userIdSplit = mProviderHelper.getCachedPublicKeyRing(
- KeyRings.buildUnifiedKeyRingUri(mSecretKeyId)).getSplitPrimaryUserIdWithFallback();
+ private class SelectSignKeyCursorAdapter extends BaseAdapter implements SpinnerAdapter {
+ private CursorAdapter inner;
+ private int mIndexUserId;
+ private int mIndexKeyId;
+ private int mIndexMasterKeyId;
+
+ public SelectSignKeyCursorAdapter() {
+ inner = new CursorAdapter(null, null, 0) {
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ return getActivity().getLayoutInflater().inflate(R.layout.encrypt_asymmetric_signkey, null);
+ }
- if (userIdSplit[0] != null) {
- mMainUserId.setText(userIdSplit[0]);
- } else {
- mMainUserId.setText(R.string.user_id_no_name);
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ String[] userId = KeyRing.splitUserId(cursor.getString(mIndexUserId));
+ ((TextView) view.findViewById(android.R.id.title)).setText(userId[2] == null ? userId[0] : (userId[0] + " (" + userId[2] + ")"));
+ ((TextView) view.findViewById(android.R.id.text1)).setText(userId[1]);
+ ((TextView) view.findViewById(android.R.id.text2)).setText(PgpKeyHelper.convertKeyIdToHex(cursor.getLong(mIndexKeyId)));
}
- if (userIdSplit[1] != null) {
- mMainUserIdRest.setText(userIdSplit[1]);
- } else {
- mMainUserIdRest.setText(getString(R.string.label_key_id) + ": "
- + PgpKeyHelper.convertKeyIdToHex(mSecretKeyId));
+
+ @Override
+ public long getItemId(int position) {
+ mCursor.moveToPosition(position);
+ return mCursor.getLong(mIndexMasterKeyId);
}
- } catch (PgpGeneralException e) {
- Notify.showNotify(getActivity(), "Key not found! This is a bug!", Notify.Style.ERROR);
- }
- mSign.setChecked(true);
+ };
}
- }
- private void selectPublicKeys() {
- Intent intent = new Intent(getActivity(), SelectPublicKeyActivity.class);
- Vector<Long> keyIds = new Vector<Long>();
- if (mEncryptionKeyIds != null && mEncryptionKeyIds.length > 0) {
- for (int i = 0; i < mEncryptionKeyIds.length; ++i) {
- keyIds.add(mEncryptionKeyIds[i]);
+ public Cursor swapCursor(Cursor newCursor) {
+ if (newCursor == null) return inner.swapCursor(null);
+
+ mIndexKeyId = newCursor.getColumnIndex(KeyRings.KEY_ID);
+ mIndexUserId = newCursor.getColumnIndex(KeyRings.USER_ID);
+ mIndexMasterKeyId = newCursor.getColumnIndex(KeyRings.MASTER_KEY_ID);
+ if (newCursor.moveToFirst()) {
+ do {
+ if (newCursor.getLong(mIndexMasterKeyId) == mEncryptInterface.getSignatureKey()) {
+ mSign.setSelection(newCursor.getPosition() + 1);
+ }
+ } while (newCursor.moveToNext());
}
+ return inner.swapCursor(newCursor);
}
- long[] initialKeyIds = null;
- if (keyIds.size() > 0) {
- initialKeyIds = new long[keyIds.size()];
- for (int i = 0; i < keyIds.size(); ++i) {
- initialKeyIds[i] = keyIds.get(i);
- }
+
+ @Override
+ public int getCount() {
+ return inner.getCount() + 1;
}
- intent.putExtra(SelectPublicKeyActivity.EXTRA_SELECTED_MASTER_KEY_IDS, initialKeyIds);
- startActivityForResult(intent, REQUEST_CODE_PUBLIC_KEYS);
- }
- private void selectSecretKey() {
- Intent intent = new Intent(getActivity(), SelectSecretKeyActivity.class);
- intent.putExtra(SelectSecretKeyActivity.EXTRA_FILTER_SIGN, true);
- startActivityForResult(intent, REQUEST_CODE_SECRET_KEYS);
- }
+ @Override
+ public Object getItem(int position) {
+ if (position == 0) return null;
+ return inner.getItem(position - 1);
+ }
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case REQUEST_CODE_PUBLIC_KEYS: {
- if (resultCode == Activity.RESULT_OK) {
- Bundle bundle = data.getExtras();
- setEncryptionKeyIds(bundle
- .getLongArray(SelectPublicKeyActivity.RESULT_EXTRA_MASTER_KEY_IDS));
- }
- break;
- }
+ @Override
+ public long getItemId(int position) {
+ if (position == 0) return Constants.key.none;
+ return inner.getItemId(position - 1);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View v = getDropDownView(position, convertView, parent);
+ v.findViewById(android.R.id.text1).setVisibility(View.GONE);
+ return v;
+ }
- case REQUEST_CODE_SECRET_KEYS: {
- if (resultCode == Activity.RESULT_OK) {
- Uri uriMasterKey = data.getData();
- setSignatureKeyId(Long.valueOf(uriMasterKey.getLastPathSegment()));
+ @Override
+ public View getDropDownView(int position, View convertView, ViewGroup parent) {
+ View v;
+ if (position == 0) {
+ if (convertView == null) {
+ v = inner.newView(null, null, parent);
} else {
- setSignatureKeyId(Constants.key.none);
+ v = convertView;
}
- break;
- }
-
- default: {
- super.onActivityResult(requestCode, resultCode, data);
-
- break;
+ ((TextView) v.findViewById(android.R.id.title)).setText("None");
+ v.findViewById(android.R.id.text1).setVisibility(View.GONE);
+ v.findViewById(android.R.id.text2).setVisibility(View.GONE);
+ } else {
+ v = inner.getView(position - 1, convertView, parent);
+ v.findViewById(android.R.id.text1).setVisibility(View.VISIBLE);
+ v.findViewById(android.R.id.text2).setVisibility(View.VISIBLE);
}
+ return v;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java
index 345e38a0e..8a9e17020 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java
@@ -17,66 +17,50 @@
package org.sufficientlysecure.keychain.ui;
+import android.annotation.TargetApi;
import android.app.Activity;
-import android.app.ProgressDialog;
import android.content.Intent;
-import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.Point;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
-import android.provider.OpenableColumns;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.Spinner;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.FileHelper;
-import org.sufficientlysecure.keychain.helper.Preferences;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.service.PassphraseCacheService;
-import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
-import org.sufficientlysecure.keychain.util.Choice;
-import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.Notify;
+import org.sufficientlysecure.keychain.helper.OtherHelper;
+import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
import java.io.File;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
-public class EncryptFileFragment extends Fragment {
- public static final String ARG_FILENAME = "filename";
- public static final String ARG_ASCII_ARMOR = "ascii_armor";
+public class EncryptFileFragment extends Fragment implements EncryptActivityInterface.UpdateListener {
+ public static final String ARG_URIS = "uris";
- private static final int REQUEST_CODE_FILE = 0x00007003;
+ private static final int REQUEST_CODE_INPUT = 0x00007003;
+ private static final int REQUEST_CODE_OUTPUT = 0x00007007;
private EncryptActivityInterface mEncryptInterface;
// view
- private CheckBox mAsciiArmor = null;
- private Spinner mFileCompression = null;
- private EditText mFilename = null;
- private CheckBox mDeleteAfter = null;
- private CheckBox mShareAfter = null;
- private ImageButton mBrowse = null;
+ private View mAddView;
+ private View mShareFile;
private View mEncryptFile;
-
- private FileDialogFragment mFileDialog;
-
- // model
- private String mInputFilename = null;
- private Uri mInputUri = null;
- private String mOutputFilename = null;
- private Uri mOutputUri = null;
+ private ListView mSelectedFiles;
+ private SelectedFilesAdapter mAdapter = new SelectedFilesAdapter();
+ private final Map<Uri, Bitmap> thumbnailCache = new HashMap<Uri, Bitmap>();
@Override
public void onAttach(Activity activity) {
@@ -99,52 +83,27 @@ public class EncryptFileFragment extends Fragment {
mEncryptFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- encryptClicked();
+ encryptClicked(false);
}
});
-
- mFilename = (EditText) view.findViewById(R.id.filename);
- mBrowse = (ImageButton) view.findViewById(R.id.btn_browse);
- mBrowse.setOnClickListener(new View.OnClickListener() {
+ mShareFile = view.findViewById(R.id.action_encrypt_share);
+ mShareFile.setOnClickListener(new View.OnClickListener() {
+ @Override
public void onClick(View v) {
- if (Constants.KITKAT) {
- FileHelper.openDocument(EncryptFileFragment.this, mInputUri, "*/*", REQUEST_CODE_FILE);
- } else {
- FileHelper.openFile(EncryptFileFragment.this, mFilename.getText().toString(), "*/*",
- REQUEST_CODE_FILE);
- }
+ encryptClicked(true);
}
});
- mFileCompression = (Spinner) view.findViewById(R.id.fileCompression);
- Choice[] choices = new Choice[]{
- new Choice(Constants.choice.compression.none, getString(R.string.choice_none) + " ("
- + getString(R.string.compression_fast) + ")"),
- new Choice(Constants.choice.compression.zip, "ZIP ("
- + getString(R.string.compression_fast) + ")"),
- new Choice(Constants.choice.compression.zlib, "ZLIB ("
- + getString(R.string.compression_fast) + ")"),
- new Choice(Constants.choice.compression.bzip2, "BZIP2 ("
- + getString(R.string.compression_very_slow) + ")"),
- };
- ArrayAdapter<Choice> adapter = new ArrayAdapter<Choice>(getActivity(),
- android.R.layout.simple_spinner_item, choices);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mFileCompression.setAdapter(adapter);
-
- int defaultFileCompression = Preferences.getPreferences(getActivity()).getDefaultFileCompression();
- for (int i = 0; i < choices.length; ++i) {
- if (choices[i].getId() == defaultFileCompression) {
- mFileCompression.setSelection(i);
- break;
+ mAddView = inflater.inflate(R.layout.file_list_entry_add, null);
+ mAddView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ addInputUri();
}
- }
-
- mDeleteAfter = (CheckBox) view.findViewById(R.id.deleteAfterEncryption);
- mShareAfter = (CheckBox) view.findViewById(R.id.shareAfterEncryption);
-
- mAsciiArmor = (CheckBox) view.findViewById(R.id.asciiArmor);
- mAsciiArmor.setChecked(Preferences.getPreferences(getActivity()).getDefaultAsciiArmor());
+ });
+ mSelectedFiles = (ListView) view.findViewById(R.id.selected_files_list);
+ mSelectedFiles.addFooterView(mAddView);
+ mSelectedFiles.setAdapter(mAdapter);
return view;
}
@@ -153,267 +112,128 @@ public class EncryptFileFragment extends Fragment {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- String filename = getArguments().getString(ARG_FILENAME);
- if (filename != null) {
- mFilename.setText(filename);
- }
- boolean asciiArmor = getArguments().getBoolean(ARG_ASCII_ARMOR);
- if (asciiArmor) {
- mAsciiArmor.setChecked(asciiArmor);
- }
+ addInputUris(getArguments().<Uri>getParcelableArrayList(ARG_URIS));
}
- /**
- * Guess output filename based on input path
- *
- * @param path
- * @return Suggestion for output filename
- */
- private String guessOutputFilename(String path) {
- // output in the same directory but with additional ending
- File file = new File(path);
- String ending = (mAsciiArmor.isChecked() ? ".asc" : ".gpg");
- String outputFilename = file.getParent() + File.separator + file.getName() + ending;
-
- return outputFilename;
+ private void addInputUri() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ FileHelper.openDocument(EncryptFileFragment.this, "*/*", true, REQUEST_CODE_INPUT);
+ } else {
+ FileHelper.openFile(EncryptFileFragment.this, mEncryptInterface.getInputUris().isEmpty() ?
+ null : mEncryptInterface.getInputUris().get(mEncryptInterface.getInputUris().size() - 1),
+ "*/*", REQUEST_CODE_INPUT);
+ }
}
- private void showOutputFileDialog() {
- // Message is received after file is selected
- Handler returnHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- if (message.what == FileDialogFragment.MESSAGE_OKAY) {
- Bundle data = message.getData();
- if (data.containsKey(FileDialogFragment.MESSAGE_DATA_URI)) {
- mOutputUri = data.getParcelable(FileDialogFragment.MESSAGE_DATA_URI);
- } else {
- mOutputFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME);
- }
- encryptStart();
- }
+ private void addInputUris(List<Uri> uris) {
+ if (uris != null) {
+ for (Uri uri : uris) {
+ addInputUri(uri);
}
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(returnHandler);
-
- mFileDialog = FileDialogFragment.newInstance(messenger,
- getString(R.string.title_encrypt_to_file),
- getString(R.string.specify_file_to_encrypt_to), mOutputFilename, null);
-
- mFileDialog.show(getActivity().getSupportFragmentManager(), "fileDialog");
- }
-
- private void encryptClicked() {
- String currentFilename = mFilename.getText().toString();
- if (mInputFilename == null || !mInputFilename.equals(currentFilename)) {
- mInputUri = null;
- mInputFilename = mFilename.getText().toString();
- }
-
- if (mInputUri == null) {
- mOutputFilename = guessOutputFilename(mInputFilename);
}
+ }
- if (mInputFilename.equals("")) {
- Notify.showNotify(getActivity(), R.string.no_file_selected, Notify.Style.ERROR);
+ private void addInputUri(Uri inputUri) {
+ if (inputUri == null) {
return;
}
- if (mInputUri == null && !mInputFilename.startsWith("content")) {
- File file = new File(mInputFilename);
- if (!file.exists() || !file.isFile()) {
- Notify.showNotify(
- getActivity(),
- getString(R.string.error_message,
- getString(R.string.error_file_not_found)), Notify.Style.ERROR
- );
- return;
- }
- }
+ mEncryptInterface.getInputUris().add(inputUri);
+ mEncryptInterface.notifyUpdate();
+ mSelectedFiles.requestFocus();
- if (mEncryptInterface.isModeSymmetric()) {
- // symmetric encryption
+ /**
+ * We hide the encrypt to file button if multiple files are selected.
+ *
+ * With Android L it will be possible to select a target directory for multiple files, so we might want to
+ * change this later
+ */
- boolean gotPassphrase = (mEncryptInterface.getPassphrase() != null
- && mEncryptInterface.getPassphrase().length() != 0);
- if (!gotPassphrase) {
- Notify.showNotify(getActivity(), R.string.passphrase_must_not_be_empty, Notify.Style.ERROR)
- ;
- return;
- }
-
- if (!mEncryptInterface.getPassphrase().equals(mEncryptInterface.getPassphraseAgain())) {
- Notify.showNotify(getActivity(), R.string.passphrases_do_not_match, Notify.Style.ERROR);
- return;
- }
+ if (mEncryptInterface.getInputUris().size() > 1) {
+ mEncryptFile.setVisibility(View.GONE);
} else {
- // asymmetric encryption
-
- boolean gotEncryptionKeys = (mEncryptInterface.getEncryptionKeys() != null
- && mEncryptInterface.getEncryptionKeys().length > 0);
-
- if (!gotEncryptionKeys) {
- Notify.showNotify(getActivity(), R.string.select_encryption_key, Notify.Style.ERROR);
- return;
- }
-
- if (!gotEncryptionKeys && mEncryptInterface.getSignatureKey() == 0) {
- Notify.showNotify(getActivity(), R.string.select_encryption_or_signature_key,
- Notify.Style.ERROR);
- return;
- }
-
- if (mEncryptInterface.getSignatureKey() != 0 &&
- PassphraseCacheService.getCachedPassphrase(getActivity(),
- mEncryptInterface.getSignatureKey()) == null) {
- PassphraseDialogFragment.show(getActivity(), mEncryptInterface.getSignatureKey(),
- new Handler() {
- @Override
- public void handleMessage(Message message) {
- if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) {
- showOutputFileDialog();
- }
- }
- });
-
- return;
- }
+ mEncryptFile.setVisibility(View.VISIBLE);
}
-
- showOutputFileDialog();
}
- private void encryptStart() {
- // Send all information needed to service to edit key in other thread
- Intent intent = new Intent(getActivity(), KeychainIntentService.class);
-
- intent.setAction(KeychainIntentService.ACTION_ENCRYPT_SIGN);
+ private void delInputUri(int position) {
+ mEncryptInterface.getInputUris().remove(position);
+ mEncryptInterface.notifyUpdate();
+ mSelectedFiles.requestFocus();
- // fill values for this action
- Bundle data = new Bundle();
-
- Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename="
- + mOutputFilename + ",mInputUri=" + mInputUri + ", mOutputUri="
- + mOutputUri);
-
- if (mInputUri != null) {
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URI);
- data.putParcelable(KeychainIntentService.ENCRYPT_INPUT_URI, mInputUri);
+ if (mEncryptInterface.getInputUris().size() > 1) {
+ mEncryptFile.setVisibility(View.GONE);
} else {
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_FILE);
- data.putString(KeychainIntentService.ENCRYPT_INPUT_FILE, mInputFilename);
+ mEncryptFile.setVisibility(View.VISIBLE);
}
+ }
- if (mOutputUri != null) {
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URI);
- data.putParcelable(KeychainIntentService.ENCRYPT_OUTPUT_URI, mOutputUri);
+ private void showOutputFileDialog() {
+ if (mEncryptInterface.getInputUris().size() > 1 || mEncryptInterface.getInputUris().isEmpty()) {
+ throw new IllegalStateException();
+ }
+ Uri inputUri = mEncryptInterface.getInputUris().get(0);
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
+ File file = new File(inputUri.getPath());
+ File parentDir = file.exists() ? file.getParentFile() : Constants.Path.APP_DIR;
+ String targetName = FileHelper.getFilename(getActivity(), inputUri) +
+ (mEncryptInterface.isUseArmor() ? ".asc" : ".gpg");
+ File targetFile = new File(parentDir, targetName);
+ FileHelper.saveFile(this, getString(R.string.title_encrypt_to_file),
+ getString(R.string.specify_file_to_encrypt_to), targetFile, REQUEST_CODE_OUTPUT);
} else {
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_FILE);
- data.putString(KeychainIntentService.ENCRYPT_OUTPUT_FILE, mOutputFilename);
+ FileHelper.saveDocument(this, "*/*", FileHelper.getFilename(getActivity(), inputUri) +
+ (mEncryptInterface.isUseArmor() ? ".asc" : ".gpg"), REQUEST_CODE_OUTPUT);
}
+ }
- if (mEncryptInterface.isModeSymmetric()) {
- Log.d(Constants.TAG, "Symmetric encryption enabled!");
- String passphrase = mEncryptInterface.getPassphrase();
- if (passphrase.length() == 0) {
- passphrase = null;
+ private void encryptClicked(boolean share) {
+ if (share) {
+ mEncryptInterface.getOutputUris().clear();
+ for (Uri uri : mEncryptInterface.getInputUris()) {
+ String targetName = FileHelper.getFilename(getActivity(), uri) +
+ (mEncryptInterface.isUseArmor() ? ".asc" : ".gpg");
+ mEncryptInterface.getOutputUris().add(TemporaryStorageProvider.createFile(getActivity(), targetName));
}
- data.putString(KeychainIntentService.ENCRYPT_SYMMETRIC_PASSPHRASE, passphrase);
- } else {
- data.putLong(KeychainIntentService.ENCRYPT_SIGNATURE_KEY_ID,
- mEncryptInterface.getSignatureKey());
- data.putLongArray(KeychainIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS,
- mEncryptInterface.getEncryptionKeys());
+ mEncryptInterface.startEncrypt(true);
+ } else if (mEncryptInterface.getInputUris().size() == 1) {
+ showOutputFileDialog();
}
+ }
- boolean useAsciiArmor = mAsciiArmor.isChecked();
- data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_ARMOR, useAsciiArmor);
-
- int compressionId = ((Choice) mFileCompression.getSelectedItem()).getId();
- data.putInt(KeychainIntentService.ENCRYPT_COMPRESSION_ID, compressionId);
-
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- // Message is received after encrypting is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(),
- getString(R.string.progress_encrypting), ProgressDialog.STYLE_HORIZONTAL) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- Notify.showNotify(getActivity(), R.string.encrypt_sign_successful,
- Notify.Style.INFO);
-
- if (mDeleteAfter.isChecked()) {
- // Create and show dialog to delete original file
- DeleteFileDialogFragment deleteFileDialog;
- if (mInputUri != null) {
- deleteFileDialog = DeleteFileDialogFragment.newInstance(mInputUri);
- } else {
- deleteFileDialog = DeleteFileDialogFragment
- .newInstance(mInputFilename);
- }
- deleteFileDialog.show(getActivity().getSupportFragmentManager(), "deleteDialog");
- }
-
- if (mShareAfter.isChecked()) {
- // Share encrypted file
- Intent sendFileIntent = new Intent(Intent.ACTION_SEND);
- sendFileIntent.setType("*/*");
- if (mOutputUri != null) {
- sendFileIntent.putExtra(Intent.EXTRA_STREAM, mOutputUri);
- } else {
- sendFileIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(mOutputFilename));
- }
- startActivity(Intent.createChooser(sendFileIntent,
- getString(R.string.title_share_file)));
- }
- }
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ public boolean handleClipData(Intent data) {
+ if (data.getClipData() != null && data.getClipData().getItemCount() > 0) {
+ for (int i = 0; i < data.getClipData().getItemCount(); i++) {
+ Uri uri = data.getClipData().getItemAt(i).getUri();
+ if (uri != null) addInputUri(uri);
}
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(getActivity());
-
- // start service with intent
- getActivity().startService(intent);
+ return true;
+ }
+ return false;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
- case REQUEST_CODE_FILE: {
+ case REQUEST_CODE_INPUT: {
if (resultCode == Activity.RESULT_OK && data != null) {
- if (Constants.KITKAT) {
- mInputUri = data.getData();
- Cursor cursor = getActivity().getContentResolver().query(mInputUri, new String[]{OpenableColumns.DISPLAY_NAME}, null, null, null);
- if (cursor != null) {
- if (cursor.moveToNext()) {
- mInputFilename = cursor.getString(0);
- mFilename.setText(mInputFilename);
- }
- cursor.close();
- }
- } else {
- try {
- String path = FileHelper.getPath(getActivity(), data.getData());
- Log.d(Constants.TAG, "path=" + path);
-
- mFilename.setText(path);
- } catch (NullPointerException e) {
- Log.e(Constants.TAG, "Nullpointer while retrieving path!");
- }
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || !handleClipData(data)) {
+ addInputUri(data.getData());
}
}
return;
}
+ case REQUEST_CODE_OUTPUT: {
+ // This happens after output file was selected, so start our operation
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ mEncryptInterface.getOutputUris().clear();
+ mEncryptInterface.getOutputUris().add(data.getData());
+ mEncryptInterface.notifyUpdate();
+ mEncryptInterface.startEncrypt(false);
+ }
+ return;
+ }
default: {
super.onActivityResult(requestCode, resultCode, data);
@@ -422,4 +242,68 @@ public class EncryptFileFragment extends Fragment {
}
}
}
+
+ @Override
+ public void onNotifyUpdate() {
+ // Clear cache if needed
+ for (Uri uri : new HashSet<Uri>(thumbnailCache.keySet())) {
+ if (!mEncryptInterface.getInputUris().contains(uri)) {
+ thumbnailCache.remove(uri);
+ }
+ }
+
+ mAdapter.notifyDataSetChanged();
+ }
+
+ private class SelectedFilesAdapter extends BaseAdapter {
+ @Override
+ public int getCount() {
+ return mEncryptInterface.getInputUris().size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mEncryptInterface.getInputUris().get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return getItem(position).hashCode();
+ }
+
+ @Override
+ public View getView(final int position, View convertView, ViewGroup parent) {
+ Uri inputUri = mEncryptInterface.getInputUris().get(position);
+ View view;
+ if (convertView == null) {
+ view = getActivity().getLayoutInflater().inflate(R.layout.file_list_entry, null);
+ } else {
+ view = convertView;
+ }
+ ((TextView) view.findViewById(R.id.filename)).setText(FileHelper.getFilename(getActivity(), inputUri));
+ long size = FileHelper.getFileSize(getActivity(), inputUri);
+ if (size == -1) {
+ ((TextView) view.findViewById(R.id.filesize)).setText("");
+ } else {
+ ((TextView) view.findViewById(R.id.filesize)).setText(FileHelper.readableFileSize(size));
+ }
+ view.findViewById(R.id.action_remove_file_from_list).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ delInputUri(position);
+ }
+ });
+ int px = OtherHelper.dpToPx(getActivity(), 48);
+ if (!thumbnailCache.containsKey(inputUri)) {
+ thumbnailCache.put(inputUri, FileHelper.getThumbnail(getActivity(), inputUri, new Point(px, px)));
+ }
+ Bitmap bitmap = thumbnailCache.get(inputUri);
+ if (bitmap != null) {
+ ((ImageView) view.findViewById(R.id.thumbnail)).setImageBitmap(bitmap);
+ } else {
+ ((ImageView) view.findViewById(R.id.thumbnail)).setImageResource(R.drawable.ic_doc_generic_am);
+ }
+ return view;
+ }
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java
index e1760b4ed..6d753088b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java
@@ -18,28 +18,16 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
-import android.app.ProgressDialog;
-import android.content.Intent;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
-import org.sufficientlysecure.keychain.helper.Preferences;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.service.PassphraseCacheService;
-import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
-import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.Notify;
public class EncryptMessageFragment extends Fragment {
public static final String ARG_TEXT = "text";
@@ -69,18 +57,34 @@ public class EncryptMessageFragment extends Fragment {
View view = inflater.inflate(R.layout.encrypt_message_fragment, container, false);
mMessage = (TextView) view.findViewById(R.id.message);
+ mMessage.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ mEncryptInterface.setMessage(s.toString());
+ }
+ });
mEncryptClipboard = view.findViewById(R.id.action_encrypt_clipboard);
mEncryptShare = view.findViewById(R.id.action_encrypt_share);
mEncryptClipboard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- encryptClicked(true);
+ mEncryptInterface.startEncrypt(false);
}
});
mEncryptShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- encryptClicked(false);
+ mEncryptInterface.startEncrypt(true);
}
});
@@ -92,7 +96,7 @@ public class EncryptMessageFragment extends Fragment {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- String text = getArguments().getString(ARG_TEXT);
+ String text = mEncryptInterface.getMessage();
if (text != null) {
mMessage.setText(text);
}
@@ -117,138 +121,4 @@ public class EncryptMessageFragment extends Fragment {
return message;
}
-
- private void encryptClicked(final boolean toClipboard) {
- if (mEncryptInterface.isModeSymmetric()) {
- // symmetric encryption
-
- boolean gotPassphrase = (mEncryptInterface.getPassphrase() != null
- && mEncryptInterface.getPassphrase().length() != 0);
- if (!gotPassphrase) {
- Notify.showNotify(getActivity(), R.string.passphrase_must_not_be_empty, Notify.Style.ERROR);
- return;
- }
-
- if (!mEncryptInterface.getPassphrase().equals(mEncryptInterface.getPassphraseAgain())) {
- Notify.showNotify(getActivity(), R.string.passphrases_do_not_match, Notify.Style.ERROR);
- return;
- }
-
- } else {
- // asymmetric encryption
-
- boolean gotEncryptionKeys = (mEncryptInterface.getEncryptionKeys() != null
- && mEncryptInterface.getEncryptionKeys().length > 0);
-
- if (!gotEncryptionKeys && mEncryptInterface.getSignatureKey() == 0) {
- Notify.showNotify(getActivity(), R.string.select_encryption_or_signature_key,
- Notify.Style.ERROR);
- return;
- }
-
- if (mEncryptInterface.getSignatureKey() != 0 &&
- PassphraseCacheService.getCachedPassphrase(getActivity(),
- mEncryptInterface.getSignatureKey()) == null) {
- PassphraseDialogFragment.show(getActivity(), mEncryptInterface.getSignatureKey(),
- new Handler() {
- @Override
- public void handleMessage(Message message) {
- if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) {
- encryptStart(toClipboard);
- }
- }
- });
-
- return;
- }
- }
-
- encryptStart(toClipboard);
- }
-
- private void encryptStart(final boolean toClipboard) {
- // Send all information needed to service to edit key in other thread
- Intent intent = new Intent(getActivity(), KeychainIntentService.class);
-
- intent.setAction(KeychainIntentService.ACTION_ENCRYPT_SIGN);
-
- // fill values for this action
- Bundle data = new Bundle();
-
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_BYTES);
-
- String message = mMessage.getText().toString();
-
- if (mEncryptInterface.isModeSymmetric()) {
- Log.d(Constants.TAG, "Symmetric encryption enabled!");
- String passphrase = mEncryptInterface.getPassphrase();
- if (passphrase.length() == 0) {
- passphrase = null;
- }
- data.putString(KeychainIntentService.ENCRYPT_SYMMETRIC_PASSPHRASE, passphrase);
- } else {
- data.putLong(KeychainIntentService.ENCRYPT_SIGNATURE_KEY_ID,
- mEncryptInterface.getSignatureKey());
- data.putLongArray(KeychainIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS,
- mEncryptInterface.getEncryptionKeys());
-
- boolean signOnly = (mEncryptInterface.getEncryptionKeys() == null
- || mEncryptInterface.getEncryptionKeys().length == 0);
- if (signOnly) {
- message = fixBadCharactersForGmail(message);
- }
- }
-
- data.putByteArray(KeychainIntentService.ENCRYPT_MESSAGE_BYTES, message.getBytes());
-
- data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_ARMOR, true);
-
- int compressionId = Preferences.getPreferences(getActivity()).getDefaultMessageCompression();
- data.putInt(KeychainIntentService.ENCRYPT_COMPRESSION_ID, compressionId);
-
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- // Message is received after encrypting is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(),
- getString(R.string.progress_encrypting), ProgressDialog.STYLE_HORIZONTAL) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- // get returned data bundle
- Bundle data = message.getData();
-
- String output = new String(data.getByteArray(KeychainIntentService.RESULT_BYTES));
- Log.d(Constants.TAG, "output: " + output);
-
- if (toClipboard) {
- ClipboardReflection.copyToClipboard(getActivity(), output);
- Notify.showNotify(getActivity(),
- R.string.encrypt_sign_clipboard_successful, Notify.Style.INFO);
- } else {
- Intent sendIntent = new Intent(Intent.ACTION_SEND);
-
- // Type is set to text/plain so that encrypted messages can
- // be sent with Whatsapp, Hangouts, SMS etc...
- sendIntent.setType("text/plain");
-
- sendIntent.putExtra(Intent.EXTRA_TEXT, output);
- startActivity(Intent.createChooser(sendIntent,
- getString(R.string.title_share_with)));
- }
- }
- }
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(getActivity());
-
- // start service with intent
- getActivity().startService(intent);
- }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptSymmetricFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptSymmetricFragment.java
index 8efa07953..86731b162 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptSymmetricFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptSymmetricFragment.java
@@ -29,27 +29,20 @@ import android.widget.EditText;
import org.sufficientlysecure.keychain.R;
-public class EncryptSymmetricFragment extends Fragment {
+public class EncryptSymmetricFragment extends Fragment implements EncryptActivityInterface.UpdateListener {
- OnSymmetricKeySelection mPassphraseUpdateListener;
+ EncryptActivityInterface mEncryptInterface;
private EditText mPassphrase;
private EditText mPassphraseAgain;
- // Container Activity must implement this interface
- public interface OnSymmetricKeySelection {
- public void onPassphraseUpdate(String passphrase);
-
- public void onPassphraseAgainUpdate(String passphrase);
- }
-
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
- mPassphraseUpdateListener = (OnSymmetricKeySelection) activity;
+ mEncryptInterface = (EncryptActivityInterface) activity;
} catch (ClassCastException e) {
- throw new ClassCastException(activity.toString() + " must implement OnSymmetricKeySelection");
+ throw new ClassCastException(activity.toString() + " must implement EncryptActivityInterface");
}
}
@@ -62,7 +55,7 @@ public class EncryptSymmetricFragment extends Fragment {
mPassphrase = (EditText) view.findViewById(R.id.passphrase);
mPassphraseAgain = (EditText) view.findViewById(R.id.passphraseAgain);
- mPassphrase.addTextChangedListener(new TextWatcher() {
+ TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@@ -74,25 +67,21 @@ public class EncryptSymmetricFragment extends Fragment {
@Override
public void afterTextChanged(Editable s) {
// update passphrase in EncryptActivity
- mPassphraseUpdateListener.onPassphraseUpdate(s.toString());
- }
- });
- mPassphraseAgain.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ if (mPassphrase.getText().toString().equals(mPassphraseAgain.getText().toString())) {
+ mEncryptInterface.setPassphrase(s.toString());
+ } else {
+ mEncryptInterface.setPassphrase(null);
+ }
}
+ };
+ mPassphrase.addTextChangedListener(textWatcher);
+ mPassphraseAgain.addTextChangedListener(textWatcher);
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
+ return view;
+ }
- @Override
- public void afterTextChanged(Editable s) {
- // update passphrase in EncryptActivity
- mPassphraseUpdateListener.onPassphraseAgainUpdate(s.toString());
- }
- });
+ @Override
+ public void onNotifyUpdate() {
- return view;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index 4a606a1b3..255290de3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -40,7 +40,6 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.OtherHelper;
import org.sufficientlysecure.keychain.helper.Preferences;
-import org.sufficientlysecure.keychain.util.FileImportCache;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
@@ -49,6 +48,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;
+import org.sufficientlysecure.keychain.util.FileImportCache;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Notify;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
index ce885c419..cb53647f6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
@@ -66,7 +66,7 @@ public class ImportKeysFileFragment extends Fragment {
// open .asc or .gpg files
// setting it to text/plain prevents Cyanogenmod's file manager from selecting asc
// or gpg types!
- FileHelper.openFile(ImportKeysFileFragment.this, Constants.Path.APP_DIR + "/",
+ FileHelper.openFile(ImportKeysFileFragment.this, Uri.fromFile(Constants.Path.APP_DIR),
"*/*", REQUEST_CODE_FILE);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
index 50ff5c753..7a6e78a7d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
@@ -94,22 +94,22 @@ public class KeyListActivity extends DrawerActivity {
case R.id.menu_key_list_debug_read:
try {
- KeychainDatabase.debugRead(this);
- Notify.showNotify(this, "Restored Notify.Style backup", Notify.Style.INFO);
+ KeychainDatabase.debugBackup(this, true);
+ Notify.showNotify(this, "Restored debug_backup.db", Notify.Style.INFO);
getContentResolver().notifyChange(KeychainContract.KeyRings.CONTENT_URI, null);
} catch (IOException e) {
Log.e(Constants.TAG, "IO Error", e);
- Notify.showNotify(this, "IO Notify.Style: " + e.getMessage(), Notify.Style.ERROR);
+ Notify.showNotify(this, "IO Error " + e.getMessage(), Notify.Style.ERROR);
}
return true;
case R.id.menu_key_list_debug_write:
try {
- KeychainDatabase.debugWrite(this);
- Notify.showNotify(this, "Backup Notify.Style", Notify.Style.INFO);
+ KeychainDatabase.debugBackup(this, false);
+ Notify.showNotify(this, "Backup to debug_backup.db completed", Notify.Style.INFO);
} catch(IOException e) {
Log.e(Constants.TAG, "IO Error", e);
- Notify.showNotify(this, "IO Notify.Style: " + e.getMessage(), Notify.Style.ERROR);
+ Notify.showNotify(this, "IO Error: " + e.getMessage(), Notify.Style.ERROR);
}
return true;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index aa17aea3d..3c97b1128 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -47,10 +47,10 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
+import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
-import android.widget.Button;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
@@ -176,8 +176,8 @@ public class KeyListFragment extends LoaderFragment
case R.id.menu_key_list_multi_export: {
ids = mAdapter.getCurrentSelectedMasterKeyIds();
ExportHelper mExportHelper = new ExportHelper((ActionBarActivity) getActivity());
- mExportHelper.showExportKeysDialog(
- ids, Constants.Path.APP_DIR_FILE, mAdapter.isAnySecretSelected());
+ mExportHelper.showExportKeysDialog(ids, Constants.Path.APP_DIR_FILE,
+ mAdapter.isAnySecretSelected());
break;
}
case R.id.menu_key_list_multi_select_all: {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java
index 43de6774b..0e948bf7f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java
@@ -41,9 +41,7 @@ import org.sufficientlysecure.keychain.service.OperationResultParcel.LogEntryPar
import org.sufficientlysecure.keychain.service.OperationResultParcel.LogLevel;
import org.sufficientlysecure.keychain.util.Log;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
public class LogDisplayFragment extends ListFragment implements OnTouchListener {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java
index 283b79b13..a6561dfad 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java
@@ -27,6 +27,7 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
+import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData;
import org.sufficientlysecure.keychain.Constants;
@@ -88,10 +89,10 @@ public class PreferencesActivity extends PreferenceActivity {
(IntegerListPreference) findPreference(Constants.Pref.DEFAULT_ENCRYPTION_ALGORITHM));
int[] valueIds = new int[]{
- Constants.choice.compression.none,
- Constants.choice.compression.zip,
- Constants.choice.compression.zlib,
- Constants.choice.compression.bzip2,
+ CompressionAlgorithmTags.UNCOMPRESSED,
+ CompressionAlgorithmTags.ZIP,
+ CompressionAlgorithmTags.ZLIB,
+ CompressionAlgorithmTags.BZIP2,
};
String[] entries = new String[]{
getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")",
@@ -229,10 +230,10 @@ public class PreferencesActivity extends PreferenceActivity {
(IntegerListPreference) findPreference(Constants.Pref.DEFAULT_ENCRYPTION_ALGORITHM));
int[] valueIds = new int[]{
- Constants.choice.compression.none,
- Constants.choice.compression.zip,
- Constants.choice.compression.zlib,
- Constants.choice.compression.bzip2,
+ CompressionAlgorithmTags.UNCOMPRESSED,
+ CompressionAlgorithmTags.ZIP,
+ CompressionAlgorithmTags.ZLIB,
+ CompressionAlgorithmTags.BZIP2,
};
String[] entries = new String[]{
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
index 5201b5df8..341e11d1d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
@@ -34,8 +34,8 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 44a51a75f..28f7b8bf5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -42,7 +42,6 @@ import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -57,9 +56,9 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.OperationResultParcel;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
+import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;
import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout.TabColorizer;
import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;
import org.sufficientlysecure.keychain.util.Notify;
import java.util.Date;
@@ -103,7 +102,6 @@ public class ViewKeyActivity extends ActionBarActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(this);
@@ -296,8 +294,7 @@ public class ViewKeyActivity extends ActionBarActivity implements
exportHelper.showExportKeysDialog(
new long[]{(Long) data.get(KeychainContract.KeyRings.MASTER_KEY_ID)},
- Constants.Path.APP_DIR_FILE,
- ((Long) data.get(KeychainContract.KeyRings.HAS_SECRET) == 1)
+ Constants.Path.APP_DIR_FILE, ((Long) data.get(KeychainContract.KeyRings.HAS_SECRET) == 1)
);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
index e98562690..5a55b0dad 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
@@ -150,7 +150,7 @@ public class ViewKeyCertsFragment extends LoaderFragment
Intent viewIntent = new Intent(getActivity(), ViewCertActivity.class);
viewIntent.setData(Certs.buildCertsSpecificUri(
- Long.toString(masterKeyId), Long.toString(rank), Long.toString(certifierId)));
+ masterKeyId, rank, certifierId));
startActivity(viewIntent);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
index 54ab76464..ae0bea5e9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
@@ -49,7 +49,6 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Notify;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
index 7a55f9aaa..1f809cc51 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
@@ -111,7 +111,7 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
convertView = mInflater.inflate(R.layout.import_keys_list_entry, null);
holder.mainUserId = (TextView) convertView.findViewById(R.id.mainUserId);
holder.mainUserIdRest = (TextView) convertView.findViewById(R.id.mainUserIdRest);
- holder.keyId = (TextView) convertView.findViewById(R.id.keyId);
+ holder.keyId = (TextView) convertView.findViewById(R.id.subkey_item_key_id);
holder.fingerprint = (TextView) convertView.findViewById(R.id.view_key_fingerprint);
holder.algorithm = (TextView) convertView.findViewById(R.id.algorithm);
holder.status = (TextView) convertView.findViewById(R.id.status);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
index 4971c535c..04947da93 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
@@ -33,7 +33,6 @@ import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
-import java.util.List;
public class ImportKeysListLoader
extends AsyncTaskLoader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java
index 3e3098b10..330254a8f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java
@@ -20,13 +20,8 @@ package org.sufficientlysecure.keychain.ui.adapter;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
-import android.view.ViewGroup;
-
-import org.sufficientlysecure.keychain.Constants;
import java.util.ArrayList;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
index e69a63c63..0e2177568 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
@@ -152,7 +152,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
holder.view = view;
holder.mainUserId = (TextView) view.findViewById(R.id.mainUserId);
holder.mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
- holder.keyId = (TextView) view.findViewById(R.id.keyId);
+ holder.keyId = (TextView) view.findViewById(R.id.subkey_item_key_id);
holder.status = (TextView) view.findViewById(R.id.status);
holder.selected = (CheckBox) view.findViewById(R.id.selected);
view.setTag(holder);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java
index c2a882fdb..d457e75bd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui.adapter;
import android.content.Context;
import android.content.res.ColorStateList;
import android.database.Cursor;
+import android.graphics.Typeface;
import android.support.v4.widget.CursorAdapter;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
@@ -89,6 +90,20 @@ public class SubkeysAdapter extends CursorAdapter {
return mCursor.getLong(INDEX_KEY_ID);
}
+ public long getCreationDate(int position) {
+ mCursor.moveToPosition(position);
+ return mCursor.getLong(INDEX_CREATION);
+ }
+
+ public Long getExpiryDate(int position) {
+ mCursor.moveToPosition(position);
+ if (mCursor.isNull(INDEX_EXPIRY)) {
+ return null;
+ } else {
+ return mCursor.getLong(INDEX_EXPIRY);
+ }
+ }
+
@Override
public Cursor swapCursor(Cursor newCursor) {
hasAnySecret = false;
@@ -106,15 +121,18 @@ public class SubkeysAdapter extends CursorAdapter {
@Override
public void bindView(View view, Context context, Cursor cursor) {
- TextView vKeyId = (TextView) view.findViewById(R.id.keyId);
- TextView vKeyDetails = (TextView) view.findViewById(R.id.keyDetails);
- TextView vKeyExpiry = (TextView) view.findViewById(R.id.keyExpiry);
- ImageView vMasterKeyIcon = (ImageView) view.findViewById(R.id.ic_masterKey);
- ImageView vCertifyIcon = (ImageView) view.findViewById(R.id.ic_certifyKey);
- ImageView vEncryptIcon = (ImageView) view.findViewById(R.id.ic_encryptKey);
- ImageView vSignIcon = (ImageView) view.findViewById(R.id.ic_signKey);
- ImageView vRevokedKeyIcon = (ImageView) view.findViewById(R.id.ic_revokedKey);
- ImageView vEditImage = (ImageView) view.findViewById(R.id.user_id_item_edit_image);
+ TextView vKeyId = (TextView) view.findViewById(R.id.subkey_item_key_id);
+ TextView vKeyDetails = (TextView) view.findViewById(R.id.subkey_item_details);
+ TextView vKeyExpiry = (TextView) view.findViewById(R.id.subkey_item_expiry);
+ ImageView vCertifyIcon = (ImageView) view.findViewById(R.id.subkey_item_ic_certify);
+ ImageView vEncryptIcon = (ImageView) view.findViewById(R.id.subkey_item_ic_encrypt);
+ ImageView vSignIcon = (ImageView) view.findViewById(R.id.subkey_item_ic_sign);
+ ImageView vRevokedIcon = (ImageView) view.findViewById(R.id.subkey_item_ic_revoked);
+ ImageView vEditImage = (ImageView) view.findViewById(R.id.subkey_item_edit_image);
+
+ // not used:
+ ImageView deleteImage = (ImageView) view.findViewById(R.id.subkey_item_delete_button);
+ deleteImage.setVisibility(View.GONE);
long keyId = cursor.getLong(INDEX_KEY_ID);
String keyIdStr = PgpKeyHelper.convertKeyIdToHex(keyId);
@@ -133,14 +151,26 @@ public class SubkeysAdapter extends CursorAdapter {
vKeyDetails.setText(algorithmStr);
}
+ boolean isMasterKey = cursor.getInt(INDEX_RANK) == 0;
+ if (isMasterKey) {
+ vKeyId.setTypeface(null, Typeface.BOLD);
+ } else {
+ vKeyId.setTypeface(null, Typeface.NORMAL);
+ }
+
// Set icons according to properties
- vMasterKeyIcon.setVisibility(cursor.getInt(INDEX_RANK) == 0 ? View.VISIBLE : View.INVISIBLE);
vCertifyIcon.setVisibility(cursor.getInt(INDEX_CAN_CERTIFY) != 0 ? View.VISIBLE : View.GONE);
vEncryptIcon.setVisibility(cursor.getInt(INDEX_CAN_ENCRYPT) != 0 ? View.VISIBLE : View.GONE);
vSignIcon.setVisibility(cursor.getInt(INDEX_CAN_SIGN) != 0 ? View.VISIBLE : View.GONE);
+ // TODO: missing icon for authenticate
boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
+ Date expiryDate = null;
+ if (!cursor.isNull(INDEX_EXPIRY)) {
+ expiryDate = new Date(cursor.getLong(INDEX_EXPIRY) * 1000);
+ }
+
// for edit key
if (mSaveKeyringParcel != null) {
boolean revokeThisSubkey = (mSaveKeyringParcel.mRevokeSubKeys.contains(keyId));
@@ -151,24 +181,22 @@ public class SubkeysAdapter extends CursorAdapter {
}
}
+ SaveKeyringParcel.SubkeyChange subkeyChange = mSaveKeyringParcel.getSubkeyChange(keyId);
+ if (subkeyChange != null) {
+ if (subkeyChange.mExpiry == null) {
+ expiryDate = null;
+ } else {
+ expiryDate = new Date(subkeyChange.mExpiry * 1000);
+ }
+ }
+
vEditImage.setVisibility(View.VISIBLE);
} else {
vEditImage.setVisibility(View.GONE);
}
- if (isRevoked) {
- vRevokedKeyIcon.setVisibility(View.VISIBLE);
- } else {
- vKeyId.setTextColor(mDefaultTextColor);
- vKeyDetails.setTextColor(mDefaultTextColor);
- vKeyExpiry.setTextColor(mDefaultTextColor);
-
- vRevokedKeyIcon.setVisibility(View.GONE);
- }
-
boolean isExpired;
- if (!cursor.isNull(INDEX_EXPIRY)) {
- Date expiryDate = new Date(cursor.getLong(INDEX_EXPIRY) * 1000);
+ if (expiryDate != null) {
isExpired = expiryDate.before(new Date());
vKeyExpiry.setText(context.getString(R.string.label_expiry) + ": "
@@ -179,6 +207,16 @@ public class SubkeysAdapter extends CursorAdapter {
vKeyExpiry.setText(context.getString(R.string.label_expiry) + ": " + context.getString(R.string.none));
}
+ if (isRevoked) {
+ vRevokedIcon.setVisibility(View.VISIBLE);
+ } else {
+ vKeyId.setTextColor(mDefaultTextColor);
+ vKeyDetails.setTextColor(mDefaultTextColor);
+ vKeyExpiry.setTextColor(mDefaultTextColor);
+
+ vRevokedIcon.setVisibility(View.GONE);
+ }
+
// if key is expired or revoked, strike through text
boolean isInvalid = isRevoked || isExpired;
if (isInvalid) {
@@ -195,7 +233,7 @@ public class SubkeysAdapter extends CursorAdapter {
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mInflater.inflate(R.layout.view_key_subkey_item, null);
if (mDefaultTextColor == null) {
- TextView keyId = (TextView) view.findViewById(R.id.keyId);
+ TextView keyId = (TextView) view.findViewById(R.id.subkey_item_key_id);
mDefaultTextColor = keyId.getTextColors();
}
return view;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java
index 25509fee5..be2e17c63 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java
@@ -17,48 +17,29 @@
package org.sufficientlysecure.keychain.ui.adapter;
-import android.annotation.TargetApi;
import android.app.Activity;
-import android.app.AlertDialog;
import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Build;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.util.Patterns;
+import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.AdapterView;
import android.widget.ArrayAdapter;
-import android.widget.AutoCompleteTextView;
-import android.widget.EditText;
import android.widget.ImageButton;
-import android.widget.Spinner;
+import android.widget.ImageView;
import android.widget.TextView;
-import org.sufficientlysecure.keychain.Constants;
+import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ContactHelper;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
-import org.sufficientlysecure.keychain.ui.dialog.CreateKeyDialogFragment;
-import org.sufficientlysecure.keychain.util.Choice;
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Date;
import java.util.List;
-import java.util.regex.Matcher;
public class SubkeysAddedAdapter extends ArrayAdapter<SaveKeyringParcel.SubkeyAdd> {
private LayoutInflater mInflater;
private Activity mActivity;
- public interface OnAlgorithmSelectedListener {
- public void onAlgorithmSelected(Choice algorithmChoice, int keySize);
- }
-
// hold a private reference to the underlying data List
private List<SaveKeyringParcel.SubkeyAdd> mData;
@@ -70,12 +51,12 @@ public class SubkeysAddedAdapter extends ArrayAdapter<SaveKeyringParcel.SubkeyAd
}
static class ViewHolder {
- public OnAlgorithmSelectedListener mAlgorithmSelectedListener;
- public Spinner mAlgorithmSpinner;
- public Spinner mKeySizeSpinner;
- public TextView mCustomKeyTextView;
- public EditText mCustomKeyEditText;
- public TextView mCustomKeyInfoTextView;
+ public TextView vKeyId;
+ public TextView vKeyDetails;
+ public TextView vKeyExpiry;
+ public ImageView vCertifyIcon;
+ public ImageView vEncryptIcon;
+ public ImageView vSignIcon;
public ImageButton vDelete;
// also hold a reference to the model item
public SaveKeyringParcel.SubkeyAdd mModel;
@@ -84,43 +65,24 @@ public class SubkeysAddedAdapter extends ArrayAdapter<SaveKeyringParcel.SubkeyAd
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// Not recycled, inflate a new view
- convertView = mInflater.inflate(R.layout.edit_key_subkey_added_item, null);
+ convertView = mInflater.inflate(R.layout.view_key_subkey_item, null);
final ViewHolder holder = new ViewHolder();
- holder.mAlgorithmSpinner = (Spinner) convertView.findViewById(R.id.create_key_algorithm);
- holder.mKeySizeSpinner = (Spinner) convertView.findViewById(R.id.create_key_size);
- holder.mCustomKeyTextView = (TextView) convertView.findViewById(R.id.custom_key_size_label);
- holder.mCustomKeyEditText = (EditText) convertView.findViewById(R.id.custom_key_size_input);
- holder.mCustomKeyInfoTextView = (TextView) convertView.findViewById(R.id.custom_key_size_info);
- holder.vDelete = (ImageButton) convertView.findViewById(R.id.subkey_added_item_delete);
- convertView.setTag(holder);
-
- holder.mAlgorithmSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- Choice newKeyAlgorithmChoice = (Choice) holder.mAlgorithmSpinner.getSelectedItem();
- // update referenced model item
- holder.mModel.mAlgorithm = newKeyAlgorithmChoice.getId();
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
+ holder.vKeyId = (TextView) convertView.findViewById(R.id.subkey_item_key_id);
+ holder.vKeyDetails = (TextView) convertView.findViewById(R.id.subkey_item_details);
+ holder.vKeyExpiry = (TextView) convertView.findViewById(R.id.subkey_item_expiry);
+ holder.vCertifyIcon = (ImageView) convertView.findViewById(R.id.subkey_item_ic_certify);
+ holder.vEncryptIcon = (ImageView) convertView.findViewById(R.id.subkey_item_ic_encrypt);
+ holder.vSignIcon = (ImageView) convertView.findViewById(R.id.subkey_item_ic_sign);
+ holder.vDelete = (ImageButton) convertView.findViewById(R.id.subkey_item_delete_button);
+ holder.vDelete.setVisibility(View.VISIBLE); // always visible
+
+ // not used:
+ ImageView editImage = (ImageView) convertView.findViewById(R.id.subkey_item_edit_image);
+ editImage.setVisibility(View.GONE);
+ ImageView revokedIcon = (ImageView) convertView.findViewById(R.id.subkey_item_ic_revoked);
+ revokedIcon.setVisibility(View.GONE);
- holder.mKeySizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- Choice newKeyAlgorithmChoice = (Choice) holder.mAlgorithmSpinner.getSelectedItem();
- int newKeySize = getProperKeyLength(newKeyAlgorithmChoice.getId(),
- getSelectedKeyLength(holder.mKeySizeSpinner, holder.mCustomKeyEditText));
- // update referenced model item
- holder.mModel.mKeysize = newKeySize;
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
+ convertView.setTag(holder);
holder.vDelete.setOnClickListener(new View.OnClickListener() {
@Override
@@ -136,226 +98,44 @@ public class SubkeysAddedAdapter extends ArrayAdapter<SaveKeyringParcel.SubkeyAd
// save reference to model item
holder.mModel = getItem(position);
- // TODO
- boolean wouldBeMasterKey = false;
-// boolean wouldBeMasterKey = (childCount == 0);
-
- ArrayList<Choice> choices = new ArrayList<Choice>();
- choices.add(new Choice(Constants.choice.algorithm.dsa, mActivity.getResources().getString(
- R.string.dsa)));
- if (!wouldBeMasterKey) {
- choices.add(new Choice(Constants.choice.algorithm.elgamal, mActivity.getResources().getString(
- R.string.elgamal)));
- }
-
- choices.add(new Choice(Constants.choice.algorithm.rsa, mActivity.getResources().getString(
- R.string.rsa)));
-
- ArrayAdapter<Choice> adapter = new ArrayAdapter<Choice>(mActivity,
- android.R.layout.simple_spinner_item, choices);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- holder.mAlgorithmSpinner.setAdapter(adapter);
- // make RSA the default
- for (int i = 0; i < choices.size(); ++i) {
- if (choices.get(i).getId() == Constants.choice.algorithm.rsa) {
- holder.mAlgorithmSpinner.setSelection(i);
- break;
- }
- }
-
- // dynamic ArrayAdapter must be created (instead of ArrayAdapter.getFromResource), because it's content may change
- ArrayAdapter<CharSequence> keySizeAdapter = new ArrayAdapter<CharSequence>(mActivity, android.R.layout.simple_spinner_item,
- new ArrayList<CharSequence>(Arrays.asList(mActivity.getResources().getStringArray(R.array.rsa_key_size_spinner_values))));
- keySizeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- holder.mKeySizeSpinner.setAdapter(keySizeAdapter);
- holder.mKeySizeSpinner.setSelection(1); // Default to 4096 for the key length
-
- holder.mCustomKeyEditText.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
-// setOkButtonAvailability(alertDialog);
- }
- });
-
- holder.mKeySizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- setCustomKeyVisibility(holder.mKeySizeSpinner, holder.mCustomKeyEditText,
- holder.mCustomKeyTextView, holder.mCustomKeyInfoTextView);
-// setOkButtonAvailability(alertDialog);
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
+ String algorithmStr = PgpKeyHelper.getAlgorithmInfo(
+ mActivity,
+ holder.mModel.mAlgorithm,
+ holder.mModel.mKeysize
+ );
+ holder.vKeyId.setText(R.string.edit_key_new_subkey);
+ holder.vKeyDetails.setText(algorithmStr);
- holder.mAlgorithmSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- setKeyLengthSpinnerValuesForAlgorithm(((Choice) parent.getSelectedItem()).getId(),
- holder.mKeySizeSpinner, holder.mCustomKeyInfoTextView);
+ if (holder.mModel.mExpiry != null) {
+ Date expiryDate = new Date(holder.mModel.mExpiry * 1000);
- setCustomKeyVisibility(holder.mKeySizeSpinner, holder.mCustomKeyEditText,
- holder.mCustomKeyTextView, holder.mCustomKeyInfoTextView);
-// setOkButtonAvailability(alertDialog);
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
-//
-// holder.vAddress.setText(holder.mModel.address);
-// holder.vAddress.setThreshold(1); // Start working from first character
-// holder.vAddress.setAdapter(mAutoCompleteEmailAdapter);
-//
-// holder.vName.setText(holder.mModel.name);
-// holder.vName.setThreshold(1); // Start working from first character
-// holder.vName.setAdapter(mAutoCompleteNameAdapter);
-//
-// holder.vComment.setText(holder.mModel.comment);
-
- return convertView;
- }
-
-
- private int getSelectedKeyLength(Spinner keySizeSpinner, EditText customKeyEditText) {
- final String selectedItemString = (String) keySizeSpinner.getSelectedItem();
- final String customLengthString = mActivity.getResources().getString(R.string.key_size_custom);
- final boolean customSelected = customLengthString.equals(selectedItemString);
- String keyLengthString = customSelected ? customKeyEditText.getText().toString() : selectedItemString;
- int keySize;
- try {
- keySize = Integer.parseInt(keyLengthString);
- } catch (NumberFormatException e) {
- keySize = 0;
- }
- return keySize;
- }
-
- /**
- * <h3>RSA</h3>
- * <p>for RSA algorithm, key length must be greater than 1024 (according to
- * <a href="https://github.com/open-keychain/open-keychain/issues/102">#102</a>). Possibility to generate keys bigger
- * than 8192 bits is currently disabled, because it's almost impossible to generate them on a mobile device (check
- * <a href="http://www.javamex.com/tutorials/cryptography/rsa_key_length.shtml">RSA key length plot</a> and
- * <a href="http://www.keylength.com/">Cryptographic Key Length Recommendation</a>). Also, key length must be a
- * multiplicity of 8.</p>
- * <h3>ElGamal</h3>
- * <p>For ElGamal algorithm, supported key lengths are 1536, 2048, 3072, 4096 or 8192 bits.</p>
- * <h3>DSA</h3>
- * <p>For DSA algorithm key length must be between 512 and 1024. Also, it must me dividable by 64.</p>
- *
- * @return correct key length, according to SpongyCastle specification. Returns <code>-1</code>, if key length is
- * inappropriate.
- */
- private int getProperKeyLength(int algorithmId, int currentKeyLength) {
- final int[] elGamalSupportedLengths = {1536, 2048, 3072, 4096, 8192};
- int properKeyLength = -1;
- switch (algorithmId) {
- case Constants.choice.algorithm.rsa:
- if (currentKeyLength > 1024 && currentKeyLength <= 8192) {
- properKeyLength = currentKeyLength + ((8 - (currentKeyLength % 8)) % 8);
- }
- break;
- case Constants.choice.algorithm.elgamal:
- int[] elGammalKeyDiff = new int[elGamalSupportedLengths.length];
- for (int i = 0; i < elGamalSupportedLengths.length; i++) {
- elGammalKeyDiff[i] = Math.abs(elGamalSupportedLengths[i] - currentKeyLength);
- }
- int minimalValue = Integer.MAX_VALUE;
- int minimalIndex = -1;
- for (int i = 0; i < elGammalKeyDiff.length; i++) {
- if (elGammalKeyDiff[i] <= minimalValue) {
- minimalValue = elGammalKeyDiff[i];
- minimalIndex = i;
- }
- }
- properKeyLength = elGamalSupportedLengths[minimalIndex];
- break;
- case Constants.choice.algorithm.dsa:
- if (currentKeyLength >= 512 && currentKeyLength <= 1024) {
- properKeyLength = currentKeyLength + ((64 - (currentKeyLength % 64)) % 64);
- }
- break;
- }
- return properKeyLength;
- }
-
- // TODO: make this an error message on the field
-// private boolean setOkButtonAvailability(AlertDialog alertDialog) {
-// final Choice selectedAlgorithm = (Choice) mAlgorithmSpinner.getSelectedItem();
-// final int selectedKeySize = getSelectedKeyLength(); //Integer.parseInt((String) mKeySizeSpinner.getSelectedItem());
-// final int properKeyLength = getProperKeyLength(selectedAlgorithm.getId(), selectedKeySize);
-// alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(properKeyLength > 0);
-// }
-
- private void setCustomKeyVisibility(Spinner keySizeSpinner, EditText customkeyedittext, TextView customKeyTextView, TextView customKeyInfoTextView) {
- final String selectedItemString = (String) keySizeSpinner.getSelectedItem();
- final String customLengthString = mActivity.getResources().getString(R.string.key_size_custom);
- final boolean customSelected = customLengthString.equals(selectedItemString);
- final int visibility = customSelected ? View.VISIBLE : View.GONE;
-
- customkeyedittext.setVisibility(visibility);
- customKeyTextView.setVisibility(visibility);
- customKeyInfoTextView.setVisibility(visibility);
-
- // hide keyboard after setting visibility to gone
- if (visibility == View.GONE) {
- InputMethodManager imm = (InputMethodManager)
- mActivity.getSystemService(mActivity.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(customkeyedittext.getWindowToken(), 0);
+ holder.vKeyExpiry.setText(getContext().getString(R.string.label_expiry) + ": "
+ + DateFormat.getDateFormat(getContext()).format(expiryDate));
+ } else {
+ holder.vKeyExpiry.setText(getContext().getString(R.string.label_expiry) + ": "
+ + getContext().getString(R.string.none));
}
- }
- private void setKeyLengthSpinnerValuesForAlgorithm(int algorithmId, Spinner keySizeSpinner, TextView customKeyInfoTextView) {
- final ArrayAdapter<CharSequence> keySizeAdapter = (ArrayAdapter<CharSequence>) keySizeSpinner.getAdapter();
- final Object selectedItem = keySizeSpinner.getSelectedItem();
- keySizeAdapter.clear();
- switch (algorithmId) {
- case Constants.choice.algorithm.rsa:
- replaceArrayAdapterContent(keySizeAdapter, R.array.rsa_key_size_spinner_values);
- customKeyInfoTextView.setText(mActivity.getResources().getString(R.string.key_size_custom_info_rsa));
- break;
- case Constants.choice.algorithm.elgamal:
- replaceArrayAdapterContent(keySizeAdapter, R.array.elgamal_key_size_spinner_values);
- customKeyInfoTextView.setText(""); // ElGamal does not support custom key length
- break;
- case Constants.choice.algorithm.dsa:
- replaceArrayAdapterContent(keySizeAdapter, R.array.dsa_key_size_spinner_values);
- customKeyInfoTextView.setText(mActivity.getResources().getString(R.string.key_size_custom_info_dsa));
- break;
+ int flags = holder.mModel.mFlags;
+ if ((flags & KeyFlags.CERTIFY_OTHER) > 0) {
+ holder.vCertifyIcon.setVisibility(View.VISIBLE);
+ } else {
+ holder.vCertifyIcon.setVisibility(View.GONE);
}
- keySizeAdapter.notifyDataSetChanged();
-
- // when switching algorithm, try to select same key length as before
- for (int i = 0; i < keySizeAdapter.getCount(); i++) {
- if (selectedItem.equals(keySizeAdapter.getItem(i))) {
- keySizeSpinner.setSelection(i);
- break;
- }
+ if ((flags & KeyFlags.SIGN_DATA) > 0) {
+ holder.vSignIcon.setVisibility(View.VISIBLE);
+ } else {
+ holder.vSignIcon.setVisibility(View.GONE);
}
- }
-
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- private void replaceArrayAdapterContent(ArrayAdapter<CharSequence> arrayAdapter, int stringArrayResourceId) {
- final String[] spinnerValuesStringArray = mActivity.getResources().getStringArray(stringArrayResourceId);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- arrayAdapter.addAll(spinnerValuesStringArray);
+ if (((flags & KeyFlags.ENCRYPT_COMMS) > 0)
+ || ((flags & KeyFlags.ENCRYPT_STORAGE) > 0)) {
+ holder.vEncryptIcon.setVisibility(View.VISIBLE);
} else {
- for (final String value : spinnerValuesStringArray) {
- arrayAdapter.add(value);
- }
+ holder.vEncryptIcon.setVisibility(View.GONE);
}
+ // TODO: missing icon for authenticate
+
+ return convertView;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java
index ee3341c08..9bf47a387 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java
@@ -252,6 +252,26 @@ public class UserIdsAdapter extends CursorAdapter implements AdapterView.OnItemC
return mCursor.getString(INDEX_USER_ID);
}
+ public boolean getIsRevoked(int position) {
+ mCursor.moveToPosition(position);
+ return mCursor.getInt(INDEX_IS_REVOKED) > 0;
+ }
+
+ public boolean getIsRevokedPending(int position) {
+ mCursor.moveToPosition(position);
+ String userId = mCursor.getString(INDEX_USER_ID);
+
+ boolean isRevokedPending = false;
+ if (mSaveKeyringParcel != null) {
+ if (mSaveKeyringParcel.mRevokeUserIds.contains(userId)) {
+ isRevokedPending = true;
+ }
+
+ }
+
+ return isRevokedPending;
+ }
+
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mInflater.inflate(R.layout.view_key_user_id_item, null);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java
index 920743a9b..cb31978e9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java
@@ -27,46 +27,64 @@ import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.text.Editable;
import android.text.TextWatcher;
+import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
+import android.widget.TableRow;
import android.widget.TextView;
-import org.sufficientlysecure.keychain.Constants;
+import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
+import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.util.Choice;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
-public class CreateKeyDialogFragment extends DialogFragment {
+public class AddSubkeyDialogFragment extends DialogFragment {
public interface OnAlgorithmSelectedListener {
- public void onAlgorithmSelected(Choice algorithmChoice, int keySize);
+ public void onAlgorithmSelected(SaveKeyringParcel.SubkeyAdd newSubkey);
}
- private static final String ARG_EDITOR_CHILD_COUNT = "child_count";
+ private static final String ARG_WILL_BE_MASTER_KEY = "will_be_master_key";
private OnAlgorithmSelectedListener mAlgorithmSelectedListener;
+
+ private CheckBox mNoExpiryCheckBox;
+ private TableRow mExpiryRow;
+ private DatePicker mExpiryDatePicker;
private Spinner mAlgorithmSpinner;
private Spinner mKeySizeSpinner;
private TextView mCustomKeyTextView;
private EditText mCustomKeyEditText;
private TextView mCustomKeyInfoTextView;
+ private CheckBox mFlagCertify;
+ private CheckBox mFlagSign;
+ private CheckBox mFlagEncrypt;
+ private CheckBox mFlagAuthenticate;
public void setOnAlgorithmSelectedListener(OnAlgorithmSelectedListener listener) {
mAlgorithmSelectedListener = listener;
}
- public static CreateKeyDialogFragment newInstance(int mEditorChildCount) {
- CreateKeyDialogFragment frag = new CreateKeyDialogFragment();
+ public static AddSubkeyDialogFragment newInstance(boolean willBeMasterKey) {
+ AddSubkeyDialogFragment frag = new AddSubkeyDialogFragment();
Bundle args = new Bundle();
- args.putInt(ARG_EDITOR_CHILD_COUNT, mEditorChildCount);
+ args.putBoolean(ARG_WILL_BE_MASTER_KEY, willBeMasterKey);
frag.setArguments(args);
@@ -78,42 +96,64 @@ public class CreateKeyDialogFragment extends DialogFragment {
final FragmentActivity context = getActivity();
final LayoutInflater mInflater;
- final int childCount = getArguments().getInt(ARG_EDITOR_CHILD_COUNT);
+ final boolean willBeMasterKey = getArguments().getBoolean(ARG_WILL_BE_MASTER_KEY);
mInflater = context.getLayoutInflater();
CustomAlertDialogBuilder dialog = new CustomAlertDialogBuilder(context);
- View view = mInflater.inflate(R.layout.create_key_dialog, null);
+ View view = mInflater.inflate(R.layout.add_subkey_dialog, null);
dialog.setView(view);
- dialog.setTitle(R.string.title_create_key);
+ dialog.setTitle(R.string.title_add_subkey);
+
+ mNoExpiryCheckBox = (CheckBox) view.findViewById(R.id.add_subkey_no_expiry);
+ mExpiryRow = (TableRow) view.findViewById(R.id.add_subkey_expiry_row);
+ mExpiryDatePicker = (DatePicker) view.findViewById(R.id.add_subkey_expiry_date_picker);
+ mAlgorithmSpinner = (Spinner) view.findViewById(R.id.add_subkey_algorithm);
+ mKeySizeSpinner = (Spinner) view.findViewById(R.id.add_subkey_size);
+ mCustomKeyTextView = (TextView) view.findViewById(R.id.add_subkey_custom_key_size_label);
+ mCustomKeyEditText = (EditText) view.findViewById(R.id.add_subkey_custom_key_size_input);
+ mCustomKeyInfoTextView = (TextView) view.findViewById(R.id.add_subkey_custom_key_size_info);
+ mFlagCertify = (CheckBox) view.findViewById(R.id.add_subkey_flag_certify);
+ mFlagSign = (CheckBox) view.findViewById(R.id.add_subkey_flag_sign);
+ mFlagEncrypt = (CheckBox) view.findViewById(R.id.add_subkey_flag_encrypt);
+ mFlagAuthenticate = (CheckBox) view.findViewById(R.id.add_subkey_flag_authenticate);
+
+ mNoExpiryCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ mExpiryRow.setVisibility(View.GONE);
+ } else {
+ mExpiryRow.setVisibility(View.VISIBLE);
+ }
+ }
+ });
- boolean wouldBeMasterKey = (childCount == 0);
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
+ mExpiryDatePicker.setMinDate(new Date().getTime() + DateUtils.DAY_IN_MILLIS);
+ }
- mAlgorithmSpinner = (Spinner) view.findViewById(R.id.create_key_algorithm);
ArrayList<Choice> choices = new ArrayList<Choice>();
- choices.add(new Choice(Constants.choice.algorithm.dsa, getResources().getString(
+ choices.add(new Choice(PublicKeyAlgorithmTags.DSA, getResources().getString(
R.string.dsa)));
- if (!wouldBeMasterKey) {
- choices.add(new Choice(Constants.choice.algorithm.elgamal, getResources().getString(
+ if (!willBeMasterKey) {
+ choices.add(new Choice(PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT, getResources().getString(
R.string.elgamal)));
}
-
- choices.add(new Choice(Constants.choice.algorithm.rsa, getResources().getString(
+ choices.add(new Choice(PublicKeyAlgorithmTags.RSA_GENERAL, getResources().getString(
R.string.rsa)));
-
ArrayAdapter<Choice> adapter = new ArrayAdapter<Choice>(context,
android.R.layout.simple_spinner_item, choices);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mAlgorithmSpinner.setAdapter(adapter);
// make RSA the default
for (int i = 0; i < choices.size(); ++i) {
- if (choices.get(i).getId() == Constants.choice.algorithm.rsa) {
+ if (choices.get(i).getId() == PublicKeyAlgorithmTags.RSA_GENERAL) {
mAlgorithmSpinner.setSelection(i);
break;
}
}
- mKeySizeSpinner = (Spinner) view.findViewById(R.id.create_key_size);
// dynamic ArrayAdapter must be created (instead of ArrayAdapter.getFromResource), because it's content may change
ArrayAdapter<CharSequence> keySizeAdapter = new ArrayAdapter<CharSequence>(context, android.R.layout.simple_spinner_item,
new ArrayList<CharSequence>(Arrays.asList(getResources().getStringArray(R.array.rsa_key_size_spinner_values))));
@@ -121,9 +161,6 @@ public class CreateKeyDialogFragment extends DialogFragment {
mKeySizeSpinner.setAdapter(keySizeAdapter);
mKeySizeSpinner.setSelection(1); // Default to 4096 for the key length
- mCustomKeyTextView = (TextView) view.findViewById(R.id.custom_key_size_label);
- mCustomKeyEditText = (EditText) view.findViewById(R.id.custom_key_size_input);
- mCustomKeyInfoTextView = (TextView) view.findViewById(R.id.custom_key_size_info);
dialog.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@@ -131,7 +168,39 @@ public class CreateKeyDialogFragment extends DialogFragment {
di.dismiss();
Choice newKeyAlgorithmChoice = (Choice) mAlgorithmSpinner.getSelectedItem();
int newKeySize = getProperKeyLength(newKeyAlgorithmChoice.getId(), getSelectedKeyLength());
- mAlgorithmSelectedListener.onAlgorithmSelected(newKeyAlgorithmChoice, newKeySize);
+
+ int flags = 0;
+ if (mFlagCertify.isChecked()) {
+ flags |= KeyFlags.CERTIFY_OTHER;
+ }
+ if (mFlagSign.isChecked()) {
+ flags |= KeyFlags.SIGN_DATA;
+ }
+ if (mFlagEncrypt.isChecked()) {
+ flags |= KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE;
+ }
+ if (mFlagAuthenticate.isChecked()) {
+ flags |= KeyFlags.AUTHENTICATION;
+ }
+
+ Long expiry;
+ if (mNoExpiryCheckBox.isChecked()) {
+ expiry = null;
+ } else {
+ Calendar selectedCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ //noinspection ResourceType
+ selectedCal.set(mExpiryDatePicker.getYear(),
+ mExpiryDatePicker.getMonth(), mExpiryDatePicker.getDayOfMonth());
+ expiry = selectedCal.getTime().getTime() / 1000;
+ }
+
+ SaveKeyringParcel.SubkeyAdd newSubkey = new SaveKeyringParcel.SubkeyAdd(
+ newKeyAlgorithmChoice.getId(),
+ newKeySize,
+ flags,
+ expiry
+ );
+ mAlgorithmSelectedListener.onAlgorithmSelected(newSubkey);
}
}
);
@@ -142,7 +211,8 @@ public class CreateKeyDialogFragment extends DialogFragment {
public void onClick(DialogInterface di, int id) {
di.dismiss();
}
- });
+ }
+ );
final AlertDialog alertDialog = dialog.show();
@@ -224,12 +294,12 @@ public class CreateKeyDialogFragment extends DialogFragment {
final int[] elGamalSupportedLengths = {1536, 2048, 3072, 4096, 8192};
int properKeyLength = -1;
switch (algorithmId) {
- case Constants.choice.algorithm.rsa:
- if (currentKeyLength > 1024 && currentKeyLength <= 8192) {
+ case PublicKeyAlgorithmTags.RSA_GENERAL:
+ if (currentKeyLength > 1024 && currentKeyLength <= 16384) {
properKeyLength = currentKeyLength + ((8 - (currentKeyLength % 8)) % 8);
}
break;
- case Constants.choice.algorithm.elgamal:
+ case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
int[] elGammalKeyDiff = new int[elGamalSupportedLengths.length];
for (int i = 0; i < elGamalSupportedLengths.length; i++) {
elGammalKeyDiff[i] = Math.abs(elGamalSupportedLengths[i] - currentKeyLength);
@@ -244,7 +314,7 @@ public class CreateKeyDialogFragment extends DialogFragment {
}
properKeyLength = elGamalSupportedLengths[minimalIndex];
break;
- case Constants.choice.algorithm.dsa:
+ case PublicKeyAlgorithmTags.DSA:
if (currentKeyLength >= 512 && currentKeyLength <= 1024) {
properKeyLength = currentKeyLength + ((64 - (currentKeyLength % 64)) % 64);
}
@@ -283,15 +353,15 @@ public class CreateKeyDialogFragment extends DialogFragment {
final Object selectedItem = mKeySizeSpinner.getSelectedItem();
keySizeAdapter.clear();
switch (algorithmId) {
- case Constants.choice.algorithm.rsa:
+ case PublicKeyAlgorithmTags.RSA_GENERAL:
replaceArrayAdapterContent(keySizeAdapter, R.array.rsa_key_size_spinner_values);
mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_rsa));
break;
- case Constants.choice.algorithm.elgamal:
+ case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
replaceArrayAdapterContent(keySizeAdapter, R.array.elgamal_key_size_spinner_values);
mCustomKeyInfoTextView.setText(""); // ElGamal does not support custom key length
break;
- case Constants.choice.algorithm.dsa:
+ case PublicKeyAlgorithmTags.DSA:
replaceArrayAdapterContent(keySizeAdapter, R.array.dsa_key_size_spinner_values);
mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_dsa));
break;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java
index d5264ae10..4d6b13476 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java
@@ -29,7 +29,6 @@ import android.os.Messenger;
import android.os.RemoteException;
import android.support.v4.app.DialogFragment;
import android.text.Editable;
-import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Patterns;
import android.view.KeyEvent;
@@ -149,6 +148,14 @@ public class AddUserIdDialogFragment extends DialogFragment implements OnEditorA
}
});
+ mName.setThreshold(1); // Start working from first character
+ mName.setAdapter(
+ new ArrayAdapter<String>
+ (getActivity(), android.R.layout.simple_spinner_dropdown_item,
+ ContactHelper.getPossibleUserNames(getActivity())
+ )
+ );
+
alert.setNegativeButton(android.R.string.cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ChangeExpiryDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ChangeExpiryDialogFragment.java
deleted file mode 100644
index d5354a9f6..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ChangeExpiryDialogFragment.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui.dialog;
-
-import android.app.DatePickerDialog;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.support.v4.app.DialogFragment;
-import android.text.format.DateUtils;
-import android.widget.DatePicker;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Log;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-public class ChangeExpiryDialogFragment extends DialogFragment {
- private static final String ARG_MESSENGER = "messenger";
- private static final String ARG_CREATION_DATE = "creation_date";
- private static final String ARG_EXPIRY_DATE = "expiry_date";
-
- public static final int MESSAGE_NEW_EXPIRY_DATE = 1;
- public static final String MESSAGE_DATA_EXPIRY_DATE = "expiry_date";
-
- private Messenger mMessenger;
- private Calendar mCreationCal;
- private Calendar mExpiryCal;
-
- private int mDatePickerResultCount = 0;
- private DatePickerDialog.OnDateSetListener mExpiryDateSetListener =
- new DatePickerDialog.OnDateSetListener() {
- public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
- // Note: Ignore results after the first one - android sends multiples.
- if (mDatePickerResultCount++ == 0) {
- Calendar selectedCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- selectedCal.set(year, monthOfYear, dayOfMonth);
- if (mExpiryCal != null) {
- long numDays = (selectedCal.getTimeInMillis() / 86400000)
- - (mExpiryCal.getTimeInMillis() / 86400000);
- if (numDays > 0) {
- Bundle data = new Bundle();
- data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime());
- sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
- }
- } else {
- Bundle data = new Bundle();
- data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime());
- sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
- }
- }
- }
- };
-
- public class ExpiryDatePickerDialog extends DatePickerDialog {
-
- public ExpiryDatePickerDialog(Context context, OnDateSetListener callBack,
- int year, int monthOfYear, int dayOfMonth) {
- super(context, callBack, year, monthOfYear, dayOfMonth);
- }
-
- // set permanent title
- public void setTitle(CharSequence title) {
- super.setTitle(getContext().getString(R.string.expiry_date_dialog_title));
- }
- }
-
- /**
- * Creates new instance of this dialog fragment
- */
- public static ChangeExpiryDialogFragment newInstance(Messenger messenger,
- Date creationDate, Date expiryDate) {
- ChangeExpiryDialogFragment frag = new ChangeExpiryDialogFragment();
- Bundle args = new Bundle();
- args.putParcelable(ARG_MESSENGER, messenger);
- args.putSerializable(ARG_CREATION_DATE, creationDate);
- args.putSerializable(ARG_EXPIRY_DATE, expiryDate);
-
- frag.setArguments(args);
-
- return frag;
- }
-
- /**
- * Creates dialog
- */
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- mMessenger = getArguments().getParcelable(ARG_MESSENGER);
- Date creationDate = (Date) getArguments().getSerializable(ARG_CREATION_DATE);
- Date expiryDate = (Date) getArguments().getSerializable(ARG_EXPIRY_DATE);
-
- mCreationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- mCreationCal.setTime(creationDate);
- mExpiryCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- mExpiryCal.setTime(expiryDate);
-
- /*
- * Using custom DatePickerDialog which overrides the setTitle because
- * the DatePickerDialog title is buggy (unix warparound bug).
- * See: https://code.google.com/p/android/issues/detail?id=49066
- */
- DatePickerDialog dialog = new ExpiryDatePickerDialog(getActivity(),
- mExpiryDateSetListener, mExpiryCal.get(Calendar.YEAR), mExpiryCal.get(Calendar.MONTH),
- mExpiryCal.get(Calendar.DAY_OF_MONTH));
- mDatePickerResultCount = 0;
- dialog.setCancelable(true);
- dialog.setButton(Dialog.BUTTON_NEGATIVE,
- getActivity().getString(R.string.btn_no_date),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // Note: Ignore results after the first one - android sends multiples.
- if (mDatePickerResultCount++ == 0) {
- // none expiry dates corresponds to a null message
- Bundle data = new Bundle();
- data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, null);
- sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
- }
- }
- }
- );
-
- // setCalendarViewShown() is supported from API 11 onwards.
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
- // Hide calendarView in tablets because of the unix warparound bug.
- dialog.getDatePicker().setCalendarViewShown(false);
- }
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
- // will crash with IllegalArgumentException if we set a min date
- // that is not before expiry
- if (mCreationCal != null && mCreationCal.before(mExpiryCal)) {
- dialog.getDatePicker().setMinDate(mCreationCal.getTime().getTime()
- + DateUtils.DAY_IN_MILLIS);
- } else {
- // When created date isn't available
- dialog.getDatePicker().setMinDate(mExpiryCal.getTime().getTime()
- + DateUtils.DAY_IN_MILLIS);
- }
- }
-
- return dialog;
- }
-
- /**
- * Send message back to handler which is initialized in a activity
- *
- * @param what Message integer you want to send
- */
- private void sendMessageToHandler(Integer what, Bundle data) {
- Message msg = Message.obtain();
- msg.what = what;
- if (data != null) {
- msg.setData(data);
- }
-
- try {
- mMessenger.send(msg);
- } catch (RemoteException e) {
- Log.w(Constants.TAG, "Exception sending message, Is handler present?", e);
- } catch (NullPointerException e) {
- Log.w(Constants.TAG, "Messenger is null!", e);
- }
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
index cae6cf043..5f29f1d18 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
@@ -18,43 +18,24 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Dialog;
-import android.app.ProgressDialog;
import android.content.DialogInterface;
-import android.content.Intent;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
import android.provider.DocumentsContract;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.helper.FileHelper;
public class DeleteFileDialogFragment extends DialogFragment {
- private static final String ARG_DELETE_FILE = "delete_file";
private static final String ARG_DELETE_URI = "delete_uri";
/**
* Creates new instance of this delete file dialog fragment
*/
- public static DeleteFileDialogFragment newInstance(String deleteFile) {
- DeleteFileDialogFragment frag = new DeleteFileDialogFragment();
- Bundle args = new Bundle();
-
- args.putString(ARG_DELETE_FILE, deleteFile);
-
- frag.setArguments(args);
-
- return frag;
- }
-
- /**
- * Creates new instance of this delete file dialog fragment
- */
public static DeleteFileDialogFragment newInstance(Uri deleteUri) {
DeleteFileDialogFragment frag = new DeleteFileDialogFragment();
Bundle args = new Bundle();
@@ -73,15 +54,15 @@ public class DeleteFileDialogFragment extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
- final Uri deleteUri = getArguments().containsKey(ARG_DELETE_URI) ? getArguments().<Uri>getParcelable(ARG_DELETE_URI) : null;
- final String deleteFile = getArguments().getString(ARG_DELETE_FILE);
+ final Uri deleteUri = getArguments().getParcelable(ARG_DELETE_URI);
+ final String deleteFilename = FileHelper.getFilename(getActivity(), deleteUri);
CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
alert.setTitle(R.string.warning);
- alert.setMessage(this.getString(R.string.file_delete_confirmation, deleteFile));
+ alert.setMessage(this.getString(R.string.file_delete_confirmation, deleteFilename));
alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@@ -89,51 +70,23 @@ public class DeleteFileDialogFragment extends DialogFragment {
public void onClick(DialogInterface dialog, int id) {
dismiss();
- if (deleteUri != null) {
- // We can not securely delete Documents, so just use usual delete on them
- DocumentsContract.deleteDocument(getActivity().getContentResolver(), deleteUri);
- return;
- }
-
- // Send all information needed to service to edit key in other thread
- Intent intent = new Intent(activity, KeychainIntentService.class);
-
- // fill values for this action
- Bundle data = new Bundle();
-
- intent.setAction(KeychainIntentService.ACTION_DELETE_FILE_SECURELY);
- data.putString(KeychainIntentService.DELETE_FILE, deleteFile);
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- ProgressDialogFragment deletingDialog = ProgressDialogFragment.newInstance(
- getString(R.string.progress_deleting_securely),
- ProgressDialog.STYLE_HORIZONTAL,
- false,
- null);
-
- // Message is received after deleting is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler =
- new KeychainIntentServiceHandler(activity, deletingDialog) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentHandler first
- super.handleMessage(message);
-
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- Toast.makeText(activity, R.string.file_delete_successful,
- Toast.LENGTH_SHORT).show();
- }
+ // We can not securely delete Uris, so just use usual delete on them
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ if (DocumentsContract.deleteDocument(getActivity().getContentResolver(), deleteUri)) {
+ Toast.makeText(getActivity(), R.string.file_delete_successful, Toast.LENGTH_SHORT).show();
+ return;
}
- };
+ }
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+ if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
+ Toast.makeText(getActivity(), R.string.file_delete_successful, Toast.LENGTH_SHORT).show();
+ return;
+ }
- // show progress dialog
- deletingDialog.show(activity.getSupportFragmentManager(), "deletingDialog");
+ Toast.makeText(getActivity(), getActivity().getString(R.string.error_file_delete_failed, deleteFilename), Toast.LENGTH_SHORT).show();
- // start service with intent
- activity.startService(intent);
+ // Note: We can't delete every file...
+ // If possible we should find out if deletion is possible before even showing the option to do so.
}
});
alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
index 01d2fae6a..4927a4d24 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
@@ -123,7 +123,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
boolean success = false;
for (long masterKeyId : masterKeyIds) {
int count = activity.getContentResolver().delete(
- KeyRingData.buildPublicKeyRingUri(Long.toString(masterKeyId)), null, null
+ KeyRingData.buildPublicKeyRingUri(masterKeyId), null, null
);
success = count > 0;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java
new file mode 100644
index 000000000..aa63f9944
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditSubkeyExpiryDialogFragment.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui.dialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.support.v4.app.DialogFragment;
+import android.text.format.DateUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.DatePicker;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class EditSubkeyExpiryDialogFragment extends DialogFragment {
+ private static final String ARG_MESSENGER = "messenger";
+ private static final String ARG_CREATION_DATE = "creation_date";
+ private static final String ARG_EXPIRY_DATE = "expiry_date";
+
+ public static final int MESSAGE_NEW_EXPIRY_DATE = 1;
+ public static final int MESSAGE_CANCEL = 2;
+ public static final String MESSAGE_DATA_EXPIRY_DATE = "expiry_date";
+
+ private Messenger mMessenger;
+ private Calendar mExpiryCal;
+
+ private DatePicker mDatePicker;
+
+ /**
+ * Creates new instance of this dialog fragment
+ */
+ public static EditSubkeyExpiryDialogFragment newInstance(Messenger messenger,
+ Long creationDate, Long expiryDate) {
+ EditSubkeyExpiryDialogFragment frag = new EditSubkeyExpiryDialogFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_MESSENGER, messenger);
+ args.putSerializable(ARG_CREATION_DATE, creationDate);
+ args.putSerializable(ARG_EXPIRY_DATE, expiryDate);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ /**
+ * Creates dialog
+ */
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final Activity activity = getActivity();
+ mMessenger = getArguments().getParcelable(ARG_MESSENGER);
+ Date creationDate = new Date(getArguments().getLong(ARG_CREATION_DATE) * 1000);
+ Date expiryDate = new Date(getArguments().getLong(ARG_EXPIRY_DATE) * 1000);
+
+ Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ creationCal.setTime(creationDate);
+ mExpiryCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ mExpiryCal.setTime(expiryDate);
+
+ Log.d(Constants.TAG, "onCreateDialog");
+
+ // Explicitly not using DatePickerDialog here!
+ // DatePickerDialog is difficult to customize and has many problems (see old git versions)
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
+
+ alert.setTitle(R.string.expiry_date_dialog_title);
+
+ LayoutInflater inflater = activity.getLayoutInflater();
+ View view = inflater.inflate(R.layout.edit_subkey_expiry_dialog, null);
+ alert.setView(view);
+
+ mDatePicker = (DatePicker) view.findViewById(R.id.edit_subkey_expiry_date_picker);
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
+ // will crash with IllegalArgumentException if we set a min date
+ // that is not before expiry
+ if (creationCal.before(mExpiryCal)) {
+ mDatePicker.setMinDate(creationCal.getTime().getTime()
+ + DateUtils.DAY_IN_MILLIS);
+ } else {
+ // when creation date isn't available
+ mDatePicker.setMinDate(mExpiryCal.getTime().getTime()
+ + DateUtils.DAY_IN_MILLIS);
+ }
+ }
+
+ alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ dismiss();
+
+ Calendar selectedCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ //noinspection ResourceType
+ selectedCal.set(mDatePicker.getYear(), mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
+
+ if (mExpiryCal != null) {
+ long numDays = (selectedCal.getTimeInMillis() / 86400000)
+ - (mExpiryCal.getTimeInMillis() / 86400000);
+ if (numDays > 0) {
+ Bundle data = new Bundle();
+ data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime().getTime() / 1000);
+ sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
+ }
+ } else {
+ Bundle data = new Bundle();
+ data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime().getTime() / 1000);
+ sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
+ }
+ }
+ });
+
+ alert.setNeutralButton(R.string.btn_no_date, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ dismiss();
+
+ Bundle data = new Bundle();
+ data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, null);
+ sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
+ }
+ });
+
+ alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ dismiss();
+ }
+ });
+
+ return alert.show();
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+
+ dismiss();
+ sendMessageToHandler(MESSAGE_CANCEL, null);
+ }
+
+ /**
+ * Send message back to handler which is initialized in a activity
+ *
+ * @param what Message integer you want to send
+ */
+ private void sendMessageToHandler(Integer what, Bundle data) {
+ Message msg = Message.obtain();
+ msg.what = what;
+ if (data != null) {
+ msg.setData(data);
+ }
+
+ try {
+ mMessenger.send(msg);
+ } catch (RemoteException e) {
+ Log.w(Constants.TAG, "Exception sending message, Is handler present?", e);
+ } catch (NullPointerException e) {
+ Log.w(Constants.TAG, "Messenger is null!", e);
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java
index 5eba3a463..70a3b8fd0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/EditUserIdDialogFragment.java
@@ -32,6 +32,9 @@ import org.sufficientlysecure.keychain.util.Log;
public class EditUserIdDialogFragment extends DialogFragment {
private static final String ARG_MESSENGER = "messenger";
+ private static final String ARG_IS_REVOKED = "is_revoked";
+ private static final String ARG_IS_REVOKED_PENDING = "is_revoked_pending";
+
public static final int MESSAGE_CHANGE_PRIMARY_USER_ID = 1;
public static final int MESSAGE_REVOKE = 2;
@@ -40,10 +43,13 @@ public class EditUserIdDialogFragment extends DialogFragment {
/**
* Creates new instance of this dialog fragment
*/
- public static EditUserIdDialogFragment newInstance(Messenger messenger) {
+ public static EditUserIdDialogFragment newInstance(Messenger messenger, boolean isRevoked,
+ boolean isRevokedPending) {
EditUserIdDialogFragment frag = new EditUserIdDialogFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_MESSENGER, messenger);
+ args.putBoolean(ARG_IS_REVOKED, isRevoked);
+ args.putBoolean(ARG_IS_REVOKED_PENDING, isRevokedPending);
frag.setArguments(args);
@@ -56,27 +62,49 @@ public class EditUserIdDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
+ boolean isRevoked = getArguments().getBoolean(ARG_IS_REVOKED);
+ boolean isRevokedPending = getArguments().getBoolean(ARG_IS_REVOKED_PENDING);
CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(getActivity());
- CharSequence[] array = getResources().getStringArray(R.array.edit_key_edit_user_id);
-
builder.setTitle(R.string.edit_key_edit_user_id_title);
- builder.setItems(array, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case 0:
- sendMessageToHandler(MESSAGE_CHANGE_PRIMARY_USER_ID, null);
- break;
- case 1:
- sendMessageToHandler(MESSAGE_REVOKE, null);
- break;
- default:
- break;
+ if (isRevokedPending) {
+ CharSequence[] array = getResources().getStringArray(R.array.edit_key_edit_user_id_revert_revocation);
+
+ builder.setItems(array, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case 0:
+ sendMessageToHandler(MESSAGE_REVOKE, null);
+ break;
+ default:
+ break;
+ }
}
- }
- });
+ });
+ } else if (isRevoked) {
+ builder.setMessage(R.string.edit_key_edit_user_id_revoked);
+ } else {
+ CharSequence[] array = getResources().getStringArray(R.array.edit_key_edit_user_id);
+
+ builder.setItems(array, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case 0:
+ sendMessageToHandler(MESSAGE_CHANGE_PRIMARY_USER_ID, null);
+ break;
+ case 1:
+ sendMessageToHandler(MESSAGE_REVOKE, null);
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ }
+
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java
index 448787ee2..18f134594 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java
@@ -18,18 +18,15 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
-import android.provider.OpenableColumns;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
@@ -42,7 +39,13 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Notify;
+import java.io.File;
+
+/**
+ * This is a file chooser dialog no longer used with KitKat
+ */
public class FileDialogFragment extends DialogFragment {
private static final String ARG_MESSENGER = "messenger";
private static final String ARG_TITLE = "title";
@@ -52,8 +55,7 @@ public class FileDialogFragment extends DialogFragment {
public static final int MESSAGE_OKAY = 1;
- public static final String MESSAGE_DATA_URI = "uri";
- public static final String MESSAGE_DATA_FILENAME = "filename";
+ public static final String MESSAGE_DATA_FILE = "file";
public static final String MESSAGE_DATA_CHECKED = "checked";
private Messenger mMessenger;
@@ -63,8 +65,7 @@ public class FileDialogFragment extends DialogFragment {
private CheckBox mCheckBox;
private TextView mMessageTextView;
- private String mOutputFilename;
- private Uri mOutputUri;
+ private File mFile;
private static final int REQUEST_CODE = 0x00007004;
@@ -72,14 +73,14 @@ public class FileDialogFragment extends DialogFragment {
* Creates new instance of this file dialog fragment
*/
public static FileDialogFragment newInstance(Messenger messenger, String title, String message,
- String defaultFile, String checkboxText) {
+ File defaultFile, String checkboxText) {
FileDialogFragment frag = new FileDialogFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_MESSENGER, messenger);
args.putString(ARG_TITLE, title);
args.putString(ARG_MESSAGE, message);
- args.putString(ARG_DEFAULT_FILE, defaultFile);
+ args.putString(ARG_DEFAULT_FILE, defaultFile.getAbsolutePath());
args.putString(ARG_CHECKBOX_TEXT, checkboxText);
frag.setArguments(args);
@@ -98,7 +99,11 @@ public class FileDialogFragment extends DialogFragment {
String title = getArguments().getString(ARG_TITLE);
String message = getArguments().getString(ARG_MESSAGE);
- mOutputFilename = getArguments().getString(ARG_DEFAULT_FILE);
+ mFile = new File(getArguments().getString(ARG_DEFAULT_FILE));
+ if (!mFile.isAbsolute()) {
+ // We use OK dir by default
+ mFile = new File(Constants.Path.APP_DIR.getAbsolutePath(), mFile.getName());
+ }
String checkboxText = getArguments().getString(ARG_CHECKBOX_TEXT);
LayoutInflater inflater = (LayoutInflater) activity
@@ -112,18 +117,14 @@ public class FileDialogFragment extends DialogFragment {
mMessageTextView.setText(message);
mFilename = (EditText) view.findViewById(R.id.input);
- mFilename.setText(mOutputFilename);
+ mFilename.setText(mFile.getName());
mBrowse = (ImageButton) view.findViewById(R.id.btn_browse);
mBrowse.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// only .asc or .gpg files
// setting it to text/plain prevents Cynaogenmod's file manager from selecting asc
// or gpg types!
- if (Constants.KITKAT) {
- FileHelper.saveDocument(FileDialogFragment.this, mOutputUri, "*/*", REQUEST_CODE);
- } else {
- FileHelper.openFile(FileDialogFragment.this, mOutputFilename, "*/*", REQUEST_CODE);
- }
+ FileHelper.openFile(FileDialogFragment.this, Uri.fromFile(mFile), "*/*", REQUEST_CODE);
}
});
@@ -146,19 +147,23 @@ public class FileDialogFragment extends DialogFragment {
dismiss();
String currentFilename = mFilename.getText().toString();
- if (mOutputFilename == null || !mOutputFilename.equals(currentFilename)) {
- mOutputUri = null;
- mOutputFilename = mFilename.getText().toString();
+ if (currentFilename == null || currentFilename.isEmpty()) {
+ // No file is like pressing cancel, UI: maybe disable positive button in this case?
+ return;
+ }
+
+ if (mFile == null || currentFilename.startsWith("/")) {
+ mFile = new File(currentFilename);
+ } else if (!mFile.getName().equals(currentFilename)) {
+ // We update our File object if user changed name!
+ mFile = new File(mFile.getParentFile(), currentFilename);
}
boolean checked = mCheckBox.isEnabled() && mCheckBox.isChecked();
// return resulting data back to activity
Bundle data = new Bundle();
- if (mOutputUri != null) {
- data.putParcelable(MESSAGE_DATA_URI, mOutputUri);
- }
- data.putString(MESSAGE_DATA_FILENAME, mFilename.getText().toString());
+ data.putString(MESSAGE_DATA_FILE, mFile.getAbsolutePath());
data.putBoolean(MESSAGE_DATA_CHECKED, checked);
sendMessageToHandler(MESSAGE_OKAY, data);
@@ -175,44 +180,17 @@ public class FileDialogFragment extends DialogFragment {
return alert.show();
}
- /**
- * Updates filename in dialog, normally called in onActivityResult in activity using the
- * FileDialog
- */
- private void setFilename(String filename) {
- AlertDialog dialog = (AlertDialog) getDialog();
- EditText filenameEditText = (EditText) dialog.findViewById(R.id.input);
-
- if (filenameEditText != null) {
- filenameEditText.setText(filename);
- }
- }
-
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode & 0xFFFF) {
case REQUEST_CODE: {
if (resultCode == Activity.RESULT_OK && data != null) {
- if (Constants.KITKAT) {
- mOutputUri = data.getData();
- Cursor cursor = getActivity().getContentResolver().query(mOutputUri, new String[]{OpenableColumns.DISPLAY_NAME}, null, null, null);
- if (cursor != null) {
- if (cursor.moveToNext()) {
- mOutputFilename = cursor.getString(0);
- mFilename.setText(mOutputFilename);
- }
- cursor.close();
- }
+ File file = new File(data.getData().getPath());
+ if (file.getParentFile().exists()) {
+ mFile = file;
+ mFilename.setText(mFile.getName());
} else {
- try {
- String path = data.getData().getPath();
- Log.d(Constants.TAG, "path=" + path);
-
- // set filename used in export/import dialogs
- setFilename(path);
- } catch (NullPointerException e) {
- Log.e(Constants.TAG, "Nullpointer while retrieving path!", e);
- }
+ Notify.showNotify(getActivity(), R.string.no_file_selected, Notify.Style.ERROR);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
index 1386ed098..5e2bec0e9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
@@ -31,7 +31,6 @@ import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.WindowManager.LayoutParams;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
new file mode 100644
index 000000000..7e762fe77
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui.widget;
+
+import android.app.Activity;
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.tokenautocomplete.FilteredArrayAdapter;
+import com.tokenautocomplete.TokenCompleteTextView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.helper.ContactHelper;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
+import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+
+public class EncryptKeyCompletionView extends TokenCompleteTextView {
+ public EncryptKeyCompletionView(Context context) {
+ super(context);
+ initView();
+ }
+
+ public EncryptKeyCompletionView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initView();
+ }
+
+ public EncryptKeyCompletionView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ initView();
+ }
+
+ private void initView() {
+ swapCursor(null);
+ setPrefix(getContext().getString(R.string.label_to));
+ allowDuplicates(false);
+ }
+
+ @Override
+ protected View getViewForObject(Object object) {
+ if (object instanceof EncryptionKey) {
+ LayoutInflater l = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
+ View view = l.inflate(R.layout.recipient_box_entry, null);
+ ((TextView) view.findViewById(android.R.id.text1)).setText(((EncryptionKey) object).getPrimary());
+ setImageByKey((ImageView) view.findViewById(android.R.id.icon), (EncryptionKey) object);
+ return view;
+ }
+ return null;
+ }
+
+ private void setImageByKey(ImageView view, EncryptionKey key) {
+ Bitmap photo = ContactHelper.photoFromFingerprint(getContext().getContentResolver(), key.getFingerprint());
+
+ if (photo != null) {
+ view.setImageBitmap(photo);
+ } else {
+ view.setImageResource(R.drawable.ic_generic_man);
+ }
+ }
+
+ @Override
+ protected Object defaultObject(String completionText) {
+ // TODO: We could try to automagically download the key if it's unknown but a key id
+ /*if (completionText.startsWith("0x")) {
+
+ }*/
+ return null;
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ if (getContext() instanceof FragmentActivity) {
+ ((FragmentActivity) getContext()).getSupportLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ return new CursorLoader(getContext(), KeychainContract.KeyRings.buildUnifiedKeyRingsUri(),
+ new String[]{KeychainContract.KeyRings.HAS_ENCRYPT, KeychainContract.KeyRings.KEY_ID, KeychainContract.KeyRings.USER_ID, KeychainContract.KeyRings.FINGERPRINT},
+ null, null, null);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ swapCursor(data);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ swapCursor(null);
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onFocusChanged(boolean hasFocus, int direction, Rect previous) {
+ super.onFocusChanged(hasFocus, direction, previous);
+ if (hasFocus) {
+ ((InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
+ .showSoftInput(this, InputMethodManager.SHOW_IMPLICIT);
+ }
+ }
+
+ public void swapCursor(Cursor cursor) {
+ if (cursor == null) {
+ setAdapter(new EncryptKeyAdapter(Collections.<EncryptionKey>emptyList()));
+ return;
+ }
+ ArrayList<EncryptionKey> keys = new ArrayList<EncryptionKey>();
+ while (cursor.moveToNext()) {
+ try {
+ if (cursor.getInt(cursor.getColumnIndexOrThrow(KeychainContract.KeyRings.HAS_ENCRYPT)) != 0) {
+ EncryptionKey key = new EncryptionKey(cursor);
+ keys.add(key);
+ }
+ } catch (Exception e) {
+ Log.w(Constants.TAG, e);
+ return;
+ }
+ }
+ setAdapter(new EncryptKeyAdapter(keys));
+ }
+
+ public class EncryptionKey {
+ private String mUserIdFull;
+ private String[] mUserId;
+ private long mKeyId;
+ private String mFingerprint;
+
+ public EncryptionKey(String userId, long keyId, String fingerprint) {
+ this.mUserId = KeyRing.splitUserId(userId);
+ this.mUserIdFull = userId;
+ this.mKeyId = keyId;
+ this.mFingerprint = fingerprint;
+ }
+
+ public EncryptionKey(Cursor cursor) {
+ this(cursor.getString(cursor.getColumnIndexOrThrow(KeychainContract.KeyRings.USER_ID)),
+ cursor.getLong(cursor.getColumnIndexOrThrow(KeychainContract.KeyRings.KEY_ID)),
+ PgpKeyHelper.convertFingerprintToHex(
+ cursor.getBlob(cursor.getColumnIndexOrThrow(KeychainContract.KeyRings.FINGERPRINT))));
+
+ }
+
+ public EncryptionKey(CachedPublicKeyRing ring) throws PgpGeneralException {
+ this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(),
+ PgpKeyHelper.convertFingerprintToHex(ring.getFingerprint()));
+ }
+
+ public String getUserId() {
+ return mUserIdFull;
+ }
+
+ public String getFingerprint() {
+ return mFingerprint;
+ }
+
+ public String getPrimary() {
+ if (mUserId[0] != null && mUserId[2] != null) {
+ return mUserId[0] + " (" + mUserId[2] + ")";
+ } else if (mUserId[0] != null) {
+ return mUserId[0];
+ } else {
+ return mUserId[1];
+ }
+ }
+
+ public String getSecondary() {
+ if (mUserId[0] != null) {
+ return mUserId[1];
+ } else {
+ return getKeyIdHex();
+ }
+ }
+
+ public String getTertiary() {
+ if (mUserId[0] != null) {
+ return getKeyIdHex();
+ } else {
+ return null;
+ }
+ }
+
+ public long getKeyId() {
+ return mKeyId;
+ }
+
+ public String getKeyIdHex() {
+ return PgpKeyHelper.convertKeyIdToHex(mKeyId);
+ }
+
+ public String getKeyIdHexShort() {
+ return PgpKeyHelper.convertKeyIdToHexShort(mKeyId);
+ }
+
+ @Override
+ public String toString() {
+ return Long.toString(mKeyId);
+ }
+ }
+
+ private class EncryptKeyAdapter extends FilteredArrayAdapter<EncryptionKey> {
+
+ public EncryptKeyAdapter(List<EncryptionKey> objs) {
+ super(EncryptKeyCompletionView.this.getContext(), 0, 0, objs);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ LayoutInflater l = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
+ View view;
+ if (convertView != null) {
+ view = convertView;
+ } else {
+ view = l.inflate(R.layout.recipient_selection_list_entry, null);
+ }
+ ((TextView) view.findViewById(android.R.id.title)).setText(getItem(position).getPrimary());
+ ((TextView) view.findViewById(android.R.id.text1)).setText(getItem(position).getSecondary());
+ ((TextView) view.findViewById(android.R.id.text2)).setText(getItem(position).getTertiary());
+ setImageByKey((ImageView) view.findViewById(android.R.id.icon), getItem(position));
+ return view;
+ }
+
+ @Override
+ protected boolean keepObject(EncryptionKey obj, String mask) {
+ String m = mask.toLowerCase(Locale.ENGLISH);
+ return obj.getUserId().toLowerCase(Locale.ENGLISH).contains(m) ||
+ obj.getKeyIdHex().contains(m) ||
+ obj.getKeyIdHexShort().startsWith(m);
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/FoldableLinearLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/FoldableLinearLayout.java
index a29c17d37..31e01a7fb 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/FoldableLinearLayout.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/FoldableLinearLayout.java
@@ -24,9 +24,9 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
+import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
-import android.widget.ImageButton;
import org.sufficientlysecure.keychain.R;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java
deleted file mode 100644
index c23b4c3ff..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-import android.annotation.TargetApi;
-import android.app.DatePickerDialog;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.text.format.DateUtils;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.DatePicker;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.TableLayout;
-import android.widget.TableRow;
-import android.widget.TextView;
-import android.widget.Button;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
-import org.sufficientlysecure.keychain.pgp.UncachedSecretKey;
-
-import java.text.DateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
- private UncachedSecretKey mKey;
-
- private EditorListener mEditorListener = null;
-
- private boolean mIsMasterKey;
- ImageButton mDeleteButton;
- TextView mAlgorithm;
- TextView mKeyId;
- TextView mCreationDate;
- Button mExpiryDateButton;
- Calendar mCreatedDate;
- Calendar mExpiryDate;
- Calendar mOriginalExpiryDate = null;
- CheckBox mChkCertify;
- CheckBox mChkSign;
- CheckBox mChkEncrypt;
- CheckBox mChkAuthenticate;
- int mUsage;
- int mOriginalUsage;
- boolean mIsNewKey;
-
- private CheckBox.OnCheckedChangeListener mCheckChanged = new CheckBox.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
- };
-
-
- private int mDatePickerResultCount = 0;
- private DatePickerDialog.OnDateSetListener mExpiryDateSetListener =
- new DatePickerDialog.OnDateSetListener() {
- public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
- // Note: Ignore results after the first one - android sends multiples.
- if (mDatePickerResultCount++ == 0) {
- GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
- date.set(year, monthOfYear, dayOfMonth);
- if (mOriginalExpiryDate != null) {
- long numDays = (date.getTimeInMillis() / 86400000) -
- (mOriginalExpiryDate.getTimeInMillis() / 86400000);
- if (numDays == 0) {
- setExpiryDate(mOriginalExpiryDate);
- } else {
- setExpiryDate(date);
- }
- } else {
- setExpiryDate(date);
- }
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
- }
- };
-
- public KeyEditor(Context context) {
- super(context);
- }
-
- public KeyEditor(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onFinishInflate() {
- setDrawingCacheEnabled(true);
- setAlwaysDrawnWithCacheEnabled(true);
-
- mAlgorithm = (TextView) findViewById(R.id.algorithm);
- mKeyId = (TextView) findViewById(R.id.keyId);
- mCreationDate = (TextView) findViewById(R.id.creation);
- mExpiryDateButton = (Button) findViewById(R.id.expiry);
-
- mDeleteButton = (ImageButton) findViewById(R.id.delete);
- mDeleteButton.setOnClickListener(this);
- mChkCertify = (CheckBox) findViewById(R.id.chkCertify);
- mChkCertify.setOnCheckedChangeListener(mCheckChanged);
- mChkSign = (CheckBox) findViewById(R.id.chkSign);
- mChkSign.setOnCheckedChangeListener(mCheckChanged);
- mChkEncrypt = (CheckBox) findViewById(R.id.chkEncrypt);
- mChkEncrypt.setOnCheckedChangeListener(mCheckChanged);
- mChkAuthenticate = (CheckBox) findViewById(R.id.chkAuthenticate);
- mChkAuthenticate.setOnCheckedChangeListener(mCheckChanged);
-
- setExpiryDate(null);
-
- mExpiryDateButton.setOnClickListener(new OnClickListener() {
- @TargetApi(11)
- public void onClick(View v) {
- Calendar expiryDate = mExpiryDate;
- if (expiryDate == null) {
- expiryDate = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- }
- /*
- * Using custom DatePickerDialog which overrides the setTitle because
- * the DatePickerDialog title is buggy (unix warparound bug).
- * See: https://code.google.com/p/android/issues/detail?id=49066
- */
- DatePickerDialog dialog = new ExpiryDatePickerDialog(getContext(),
- mExpiryDateSetListener, expiryDate.get(Calendar.YEAR), expiryDate.get(Calendar.MONTH),
- expiryDate.get(Calendar.DAY_OF_MONTH));
- mDatePickerResultCount = 0;
- dialog.setCancelable(true);
- dialog.setButton(Dialog.BUTTON_NEGATIVE,
- getContext().getString(R.string.btn_no_date),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // Note: Ignore results after the first one - android sends multiples.
- if (mDatePickerResultCount++ == 0) {
- setExpiryDate(null);
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
- }
- });
-
- // setCalendarViewShown() is supported from API 11 onwards.
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
- // Hide calendarView in tablets because of the unix warparound bug.
- dialog.getDatePicker().setCalendarViewShown(false);
- }
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
-
- // will crash with IllegalArgumentException if we set a min date
- // that is not before expiry
- if (mCreatedDate != null && mCreatedDate.before(expiryDate)) {
- dialog.getDatePicker()
- .setMinDate(
- mCreatedDate.getTime().getTime() + DateUtils.DAY_IN_MILLIS);
- } else {
- // When created date isn't available
- dialog.getDatePicker().setMinDate(expiryDate.getTime().getTime() + DateUtils.DAY_IN_MILLIS);
- }
- }
-
- dialog.show();
- }
- });
-
- super.onFinishInflate();
- }
-
- public void setCanBeEdited(boolean canBeEdited) {
- if (!canBeEdited) {
- mDeleteButton.setVisibility(View.INVISIBLE);
- mExpiryDateButton.setEnabled(false);
- mChkSign.setEnabled(false); //certify is always disabled
- mChkEncrypt.setEnabled(false);
- mChkAuthenticate.setEnabled(false);
- }
- }
-
- public void setValue(UncachedSecretKey key, boolean isMasterKey, int usage, boolean isNewKey) {
- mKey = key;
-
- mIsMasterKey = isMasterKey;
- if (mIsMasterKey) {
- mDeleteButton.setVisibility(View.INVISIBLE);
- }
-
- mAlgorithm.setText(PgpKeyHelper.getAlgorithmInfo(getContext(), key.getAlgorithm()));
- String keyIdStr = PgpKeyHelper.convertKeyIdToHex(key.getKeyId());
- mKeyId.setText(keyIdStr);
-
- boolean isElGamalKey = (key.isElGamalEncrypt());
- boolean isDSAKey = (key.isDSA());
- if (isElGamalKey) {
- mChkSign.setVisibility(View.INVISIBLE);
- TableLayout table = (TableLayout) findViewById(R.id.table_keylayout);
- TableRow row = (TableRow) findViewById(R.id.row_sign);
- table.removeView(row);
- }
- if (isDSAKey) {
- mChkEncrypt.setVisibility(View.INVISIBLE);
- TableLayout table = (TableLayout) findViewById(R.id.table_keylayout);
- TableRow row = (TableRow) findViewById(R.id.row_encrypt);
- table.removeView(row);
- }
- if (!mIsMasterKey) {
- mChkCertify.setVisibility(View.INVISIBLE);
- TableLayout table = (TableLayout) findViewById(R.id.table_keylayout);
- TableRow row = (TableRow) findViewById(R.id.row_certify);
- table.removeView(row);
- } else {
- TextView mLabelUsage2 = (TextView) findViewById(R.id.label_usage2);
- mLabelUsage2.setVisibility(View.INVISIBLE);
- }
-
- mIsNewKey = isNewKey;
- if (isNewKey) {
- mUsage = usage;
- mChkCertify.setChecked(
- (usage & UncachedSecretKey.CERTIFY_OTHER) == UncachedSecretKey.CERTIFY_OTHER);
- mChkSign.setChecked(
- (usage & UncachedSecretKey.SIGN_DATA) == UncachedSecretKey.SIGN_DATA);
- mChkEncrypt.setChecked(
- ((usage & UncachedSecretKey.ENCRYPT_COMMS) == UncachedSecretKey.ENCRYPT_COMMS) ||
- ((usage & UncachedSecretKey.ENCRYPT_STORAGE) == UncachedSecretKey.ENCRYPT_STORAGE));
- mChkAuthenticate.setChecked(
- (usage & UncachedSecretKey.AUTHENTICATION) == UncachedSecretKey.AUTHENTICATION);
- } else {
- mUsage = key.getKeyUsage();
- mOriginalUsage = mUsage;
- if (key.isMasterKey()) {
- mChkCertify.setChecked(key.canCertify());
- }
- mChkSign.setChecked(key.canSign());
- mChkEncrypt.setChecked(key.canEncrypt());
- mChkAuthenticate.setChecked(key.canAuthenticate());
- }
-
- {
- Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- cal.setTime(key.getCreationTime());
- setCreatedDate(cal);
- }
-
- Date expiryDate = key.getExpiryTime();
- if (expiryDate == null) {
- setExpiryDate(null);
- } else {
- Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- cal.setTime(expiryDate);
- setExpiryDate(cal);
- mOriginalExpiryDate = cal;
- }
-
- }
-
- public UncachedSecretKey getValue() {
- return mKey;
- }
-
- public void onClick(View v) {
- final ViewGroup parent = (ViewGroup) getParent();
- if (v == mDeleteButton) {
- parent.removeView(this);
- if (mEditorListener != null) {
- mEditorListener.onDeleted(this, mIsNewKey);
- }
- }
- }
-
- public void setEditorListener(EditorListener listener) {
- mEditorListener = listener;
- }
-
- private void setCreatedDate(Calendar date) {
- mCreatedDate = date;
- if (date == null) {
- mCreationDate.setText(getContext().getString(R.string.none));
- } else {
- mCreationDate.setText(DateFormat.getDateInstance().format(date.getTime()));
- }
- }
-
- private void setExpiryDate(Calendar date) {
- mExpiryDate = date;
- if (date == null) {
- mExpiryDateButton.setText(getContext().getString(R.string.none));
- } else {
- mExpiryDateButton.setText(DateFormat.getDateInstance().format(date.getTime()));
- }
- }
-
- public Calendar getExpiryDate() {
- return mExpiryDate;
- }
-
- public int getUsage() {
- mUsage = (mUsage & ~UncachedSecretKey.CERTIFY_OTHER) |
- (mChkCertify.isChecked() ? UncachedSecretKey.CERTIFY_OTHER : 0);
- mUsage = (mUsage & ~UncachedSecretKey.SIGN_DATA) |
- (mChkSign.isChecked() ? UncachedSecretKey.SIGN_DATA : 0);
- mUsage = (mUsage & ~UncachedSecretKey.ENCRYPT_COMMS) |
- (mChkEncrypt.isChecked() ? UncachedSecretKey.ENCRYPT_COMMS : 0);
- mUsage = (mUsage & ~UncachedSecretKey.ENCRYPT_STORAGE) |
- (mChkEncrypt.isChecked() ? UncachedSecretKey.ENCRYPT_STORAGE : 0);
- mUsage = (mUsage & ~UncachedSecretKey.AUTHENTICATION) |
- (mChkAuthenticate.isChecked() ? UncachedSecretKey.AUTHENTICATION : 0);
-
- return mUsage;
- }
-
- public boolean needsSaving() {
- if (mIsNewKey) {
- return true;
- }
-
- boolean retval = (getUsage() != mOriginalUsage);
-
- boolean dateChanged;
- boolean mOEDNull = (mOriginalExpiryDate == null);
- boolean mEDNull = (mExpiryDate == null);
- if (mOEDNull != mEDNull) {
- dateChanged = true;
- } else {
- if (mOEDNull) {
- //both null, no change
- dateChanged = false;
- } else {
- dateChanged = ((mExpiryDate.compareTo(mOriginalExpiryDate)) != 0);
- }
- }
- retval |= dateChanged;
-
- return retval;
- }
-
- public boolean getIsNewKey() {
- return mIsNewKey;
- }
-}
-
-class ExpiryDatePickerDialog extends DatePickerDialog {
-
- public ExpiryDatePickerDialog(Context context, OnDateSetListener callBack,
- int year, int monthOfYear, int dayOfMonth) {
- super(context, callBack, year, monthOfYear, dayOfMonth);
- }
-
- //Set permanent title.
- public void setTitle(CharSequence title) {
- super.setTitle(getContext().getString(R.string.expiry_date_dialog_title));
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NoSwipeWrapContentViewPager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NoSwipeWrapContentViewPager.java
new file mode 100644
index 000000000..a48d2a026
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/NoSwipeWrapContentViewPager.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class NoSwipeWrapContentViewPager extends android.support.v4.view.ViewPager {
+ public NoSwipeWrapContentViewPager(Context context) {
+ super(context);
+ }
+
+ public NoSwipeWrapContentViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ int height;
+ View child = getChildAt(getCurrentItem());
+ if (child != null) {
+ child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+ height = child.getMeasuredHeight();
+ } else {
+ height = 0;
+ }
+
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent arg0) {
+ // Never allow swiping to switch between pages
+ return false;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // Never allow swiping to switch between pages
+ return false;
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java
deleted file mode 100644
index cd5671801..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SectionView.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.support.v7.app.ActionBarActivity;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.ImageButton;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.PgpConversionHelper;
-import org.sufficientlysecure.keychain.pgp.UncachedSecretKey;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.service.PassphraseCacheService;
-import org.sufficientlysecure.keychain.ui.dialog.CreateKeyDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
-import org.sufficientlysecure.keychain.ui.widget.Editor.EditorListener;
-import org.sufficientlysecure.keychain.util.Choice;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-public class SectionView extends LinearLayout implements OnClickListener, EditorListener, Editor {
- private LayoutInflater mInflater;
- private ImageButton mPlusButton;
- private ViewGroup mEditors;
- private TextView mTitle;
- private int mType = 0;
- private EditorListener mEditorListener = null;
-
- private Choice mNewKeyAlgorithmChoice;
- private int mNewKeySize;
- private boolean mOldItemDeleted = false;
- private ArrayList<String> mDeletedIDs = new ArrayList<String>();
- private ArrayList<UncachedSecretKey> mDeletedKeys = new ArrayList<UncachedSecretKey>();
- private boolean mCanBeEdited = true;
-
- private ActionBarActivity mActivity;
-
- private ProgressDialogFragment mGeneratingDialog;
-
- public static final int TYPE_USER_ID = 1;
- public static final int TYPE_KEY = 2;
-
- public void setEditorListener(EditorListener listener) {
- mEditorListener = listener;
- }
-
- public SectionView(Context context) {
- super(context);
- mActivity = (ActionBarActivity) context;
- }
-
- public SectionView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mActivity = (ActionBarActivity) context;
- }
-
- public ViewGroup getEditors() {
- return mEditors;
- }
-
- public void setType(int type) {
- mType = type;
- switch (type) {
- case TYPE_USER_ID: {
- mTitle.setText(R.string.section_user_ids);
- break;
- }
-
- case TYPE_KEY: {
- mTitle.setText(R.string.section_keys);
- break;
- }
-
- default: {
- break;
- }
- }
- }
-
- public void setCanBeEdited(boolean canBeEdited) {
- mCanBeEdited = canBeEdited;
- if (!mCanBeEdited) {
- mPlusButton.setVisibility(View.INVISIBLE);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onFinishInflate() {
- mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
- setDrawingCacheEnabled(true);
- setAlwaysDrawnWithCacheEnabled(true);
-
- mPlusButton = (ImageButton) findViewById(R.id.plusbutton);
- mPlusButton.setOnClickListener(this);
-
- mEditors = (ViewGroup) findViewById(R.id.editors);
- mTitle = (TextView) findViewById(R.id.title);
-
- updateEditorsVisible();
- super.onFinishInflate();
- }
-
- /**
- * {@inheritDoc}
- */
- public void onDeleted(Editor editor, boolean wasNewItem) {
- mOldItemDeleted |= !wasNewItem;
- if (mOldItemDeleted) {
- if (mType == TYPE_USER_ID) {
- mDeletedIDs.add(((UserIdEditor) editor).getOriginalID());
- } else if (mType == TYPE_KEY) {
- mDeletedKeys.add(((KeyEditor) editor).getValue());
- }
- }
- this.updateEditorsVisible();
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
-
- @Override
- public void onEdited() {
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
-
- protected void updateEditorsVisible() {
- final boolean hasChildren = mEditors.getChildCount() > 0;
- mEditors.setVisibility(hasChildren ? View.VISIBLE : View.GONE);
- }
-
- public boolean needsSaving() {
- //check each view for needs saving, take account of deleted items
- boolean ret = mOldItemDeleted;
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- Editor editor = (Editor) mEditors.getChildAt(i);
- ret |= editor.needsSaving();
- if (mType == TYPE_USER_ID) {
- ret |= ((UserIdEditor) editor).primarySwapped();
- }
- }
- return ret;
- }
-
- public boolean primaryChanged() {
- boolean ret = false;
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- Editor editor = (Editor) mEditors.getChildAt(i);
- if (mType == TYPE_USER_ID) {
- ret |= ((UserIdEditor) editor).primarySwapped();
- }
- }
- return ret;
- }
-
- public String getOriginalPrimaryID() {
- //NB: this will have to change when we change how Primary IDs are chosen, and so we need to be
- // careful about where Master key capabilities are stored... multiple primaries and
- // revoked ones make this harder than the simple case we are continuing to assume here
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- Editor editor = (Editor) mEditors.getChildAt(i);
- if (mType == TYPE_USER_ID) {
- if (((UserIdEditor) editor).getIsOriginallyMainUserID()) {
- return ((UserIdEditor) editor).getOriginalID();
- }
- }
- }
- return null;
- }
-
- public ArrayList<String> getOriginalIDs() {
- ArrayList<String> orig = new ArrayList<String>();
- if (mType == TYPE_USER_ID) {
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- UserIdEditor editor = (UserIdEditor) mEditors.getChildAt(i);
- if (editor.isMainUserId()) {
- orig.add(0, editor.getOriginalID());
- } else {
- orig.add(editor.getOriginalID());
- }
- }
- return orig;
- } else {
- return null;
- }
- }
-
- public ArrayList<String> getDeletedIDs() {
- return mDeletedIDs;
- }
-
- public ArrayList<UncachedSecretKey> getDeletedKeys() {
- return mDeletedKeys;
- }
-
- public List<Boolean> getNeedsSavingArray() {
- ArrayList<Boolean> mList = new ArrayList<Boolean>();
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- Editor editor = (Editor) mEditors.getChildAt(i);
- mList.add(editor.needsSaving());
- }
- return mList;
- }
-
- public List<Boolean> getNewIDFlags() {
- ArrayList<Boolean> mList = new ArrayList<Boolean>();
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- UserIdEditor editor = (UserIdEditor) mEditors.getChildAt(i);
- if (editor.isMainUserId()) {
- mList.add(0, editor.getIsNewID());
- } else {
- mList.add(editor.getIsNewID());
- }
- }
- return mList;
- }
-
- public List<Boolean> getNewKeysArray() {
- ArrayList<Boolean> mList = new ArrayList<Boolean>();
- if (mType == TYPE_KEY) {
- for (int i = 0; i < mEditors.getChildCount(); ++i) {
- KeyEditor editor = (KeyEditor) mEditors.getChildAt(i);
- mList.add(editor.getIsNewKey());
- }
- }
- return mList;
- }
-
- /**
- * {@inheritDoc}
- */
- public void onClick(View v) {
- if (mCanBeEdited) {
- switch (mType) {
- case TYPE_USER_ID: {
- UserIdEditor view = (UserIdEditor) mInflater.inflate(
- R.layout.edit_key_user_id_item, mEditors, false);
- view.setEditorListener(this);
- view.setValue("", mEditors.getChildCount() == 0, true);
- mEditors.addView(view);
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- break;
- }
-
- case TYPE_KEY: {
- CreateKeyDialogFragment mCreateKeyDialogFragment =
- CreateKeyDialogFragment.newInstance(mEditors.getChildCount());
- mCreateKeyDialogFragment
- .setOnAlgorithmSelectedListener(
- new CreateKeyDialogFragment.OnAlgorithmSelectedListener() {
- @Override
- public void onAlgorithmSelected(Choice algorithmChoice, int keySize) {
- mNewKeyAlgorithmChoice = algorithmChoice;
- mNewKeySize = keySize;
- createKey();
- }
- });
- mCreateKeyDialogFragment.show(mActivity.getSupportFragmentManager(), "createKeyDialog");
- break;
- }
-
- default: {
- break;
- }
- }
- this.updateEditorsVisible();
- }
- }
-
- public void setUserIds(Vector<String> list) {
- if (mType != TYPE_USER_ID) {
- return;
- }
-
- mEditors.removeAllViews();
- for (String userId : list) {
- UserIdEditor view = (UserIdEditor) mInflater.inflate(R.layout.edit_key_user_id_item,
- mEditors, false);
- view.setEditorListener(this);
- view.setValue(userId, mEditors.getChildCount() == 0, false);
- view.setCanBeEdited(mCanBeEdited);
- mEditors.addView(view);
- }
-
- this.updateEditorsVisible();
- }
-
- public void setKeys(Vector<UncachedSecretKey> list, Vector<Integer> usages, boolean newKeys) {
- if (mType != TYPE_KEY) {
- return;
- }
-
- mEditors.removeAllViews();
-
- // go through all keys and set view based on them
- for (int i = 0; i < list.size(); i++) {
- KeyEditor view = (KeyEditor) mInflater.inflate(R.layout.edit_key_key_item, mEditors,
- false);
- view.setEditorListener(this);
- boolean isMasterKey = (mEditors.getChildCount() == 0);
- view.setValue(list.get(i), isMasterKey, usages.get(i), newKeys);
- view.setCanBeEdited(mCanBeEdited);
- mEditors.addView(view);
- }
-
- this.updateEditorsVisible();
- }
-
- private void createKey() {
-
- // fill values for this action
- Boolean isMasterKey;
-
- String passphrase;
- if (mEditors.getChildCount() > 0) {
- UncachedSecretKey masterKey = ((KeyEditor) mEditors.getChildAt(0)).getValue();
- passphrase = PassphraseCacheService
- .getCachedPassphrase(mActivity, masterKey.getKeyId());
- isMasterKey = false;
- } else {
- passphrase = "";
- isMasterKey = true;
- }
- /*
- data.putBoolean(KeychainIntentService.GENERATE_KEY_MASTER_KEY, isMasterKey);
- data.putString(KeychainIntentService.GENERATE_KEY_SYMMETRIC_PASSPHRASE, passphrase);
- data.putInt(KeychainIntentService.GENERATE_KEY_ALGORITHM, mNewKeyAlgorithmChoice.getId());
- data.putInt(KeychainIntentService.GENERATE_KEY_KEY_SIZE, mNewKeySize);
-
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- // show progress dialog
- mGeneratingDialog = ProgressDialogFragment.newInstance(
- getResources().getQuantityString(R.plurals.progress_generating, 1),
- ProgressDialog.STYLE_SPINNER,
- true,
- new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- mActivity.stopService(intent);
- }
- });
-
- // Message is received after generating is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(mActivity,
- mGeneratingDialog) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- // get new key from data bundle returned from service
- Bundle data = message.getDataAsStringList();
- UncachedSecretKey newKey = PgpConversionHelper
- .BytesToPGPSecretKey(data
- .getByteArray(KeychainIntentService.RESULT_NEW_KEY));
- addGeneratedKeyToView(newKey);
- }
- }
- };
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-
- mGeneratingDialog.show(mActivity.getSupportFragmentManager(), "dialog");
-
- // start service with intent
- mActivity.startService(intent);
- */
-
- }
-
- private void addGeneratedKeyToView(UncachedSecretKey newKey) {
- // add view with new key
- KeyEditor view = (KeyEditor) mInflater.inflate(R.layout.edit_key_key_item,
- mEditors, false);
- view.setEditorListener(SectionView.this);
- int usage = 0;
- if (mEditors.getChildCount() == 0) {
- usage = UncachedSecretKey.CERTIFY_OTHER;
- }
- view.setValue(newKey, newKey.isMasterKey(), usage, true);
- mEditors.addView(view);
- SectionView.this.updateEditorsVisible();
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java
deleted file mode 100644
index f50d2adc6..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-import android.content.Context;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.util.AttributeSet;
-import android.util.Patterns;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.AutoCompleteTextView;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.RadioButton;
-import android.widget.ImageButton;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ContactHelper;
-import org.sufficientlysecure.keychain.pgp.KeyRing;
-
-import java.util.regex.Matcher;
-
-public class UserIdEditor extends LinearLayout implements Editor, OnClickListener {
- private EditorListener mEditorListener = null;
-
- private ImageButton mDeleteButton;
- private RadioButton mIsMainUserId;
- private String mOriginalID;
- private EditText mName;
- private String mOriginalName;
- private AutoCompleteTextView mEmail;
- private String mOriginalEmail;
- private EditText mComment;
- private String mOriginalComment;
- private boolean mOriginallyMainUserID;
- private boolean mIsNewId;
-
- public void setCanBeEdited(boolean canBeEdited) {
- if (!canBeEdited) {
- mDeleteButton.setVisibility(View.INVISIBLE);
- mName.setEnabled(false);
- mIsMainUserId.setEnabled(false);
- mEmail.setEnabled(false);
- mComment.setEnabled(false);
- }
- }
-
- public static class InvalidEmailException extends Exception {
- static final long serialVersionUID = 0xf812773345L;
-
- public InvalidEmailException(String message) {
- super(message);
- }
- }
-
- public UserIdEditor(Context context) {
- super(context);
- }
-
- public UserIdEditor(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- TextWatcher mTextWatcher = new TextWatcher() {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
- };
-
- @Override
- protected void onFinishInflate() {
- setDrawingCacheEnabled(true);
- setAlwaysDrawnWithCacheEnabled(true);
-
- mDeleteButton = (ImageButton) findViewById(R.id.delete);
- mDeleteButton.setOnClickListener(this);
- mIsMainUserId = (RadioButton) findViewById(R.id.isMainUserId);
- mIsMainUserId.setOnClickListener(this);
-
- mName = (EditText) findViewById(R.id.name);
- mName.addTextChangedListener(mTextWatcher);
- mEmail = (AutoCompleteTextView) findViewById(R.id.email);
- mComment = (EditText) findViewById(R.id.user_id_item_comment);
- mComment.addTextChangedListener(mTextWatcher);
-
-
- mEmail.setThreshold(1); // Start working from first character
- mEmail.setAdapter(
- new ArrayAdapter<String>
- (this.getContext(), android.R.layout.simple_dropdown_item_1line,
- ContactHelper.getPossibleUserEmails(getContext())
- ));
- mEmail.addTextChangedListener(new TextWatcher(){
- @Override
- public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
-
- @Override
- public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
-
- @Override
- public void afterTextChanged(Editable editable) {
- String email = editable.toString();
- if (email.length() > 0) {
- Matcher emailMatcher = Patterns.EMAIL_ADDRESS.matcher(email);
- if (emailMatcher.matches()) {
- mEmail.setCompoundDrawablesWithIntrinsicBounds(0, 0,
- R.drawable.uid_mail_ok, 0);
- } else {
- mEmail.setCompoundDrawablesWithIntrinsicBounds(0, 0,
- R.drawable.uid_mail_bad, 0);
- }
- } else {
- // remove drawable if email is empty
- mEmail.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
- }
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
- });
-
- super.onFinishInflate();
- }
-
- public void setValue(String userId, boolean isMainID, boolean isNewId) {
-
- mName.setText("");
- mOriginalName = "";
- mComment.setText("");
- mOriginalComment = "";
- mEmail.setText("");
- mOriginalEmail = "";
- mIsNewId = isNewId;
- mOriginalID = userId;
-
- String[] result = KeyRing.splitUserId(userId);
- if (result[0] != null) {
- mName.setText(result[0]);
- mOriginalName = result[0];
- }
- if (result[1] != null) {
- mEmail.setText(result[1]);
- mOriginalEmail = result[1];
- }
- if (result[2] != null) {
- mComment.setText(result[2]);
- mOriginalComment = result[2];
- }
-
- mOriginallyMainUserID = isMainID;
- setIsMainUserId(isMainID);
- }
-
- public String getValue() {
- String name = ("" + mName.getText()).trim();
- String email = ("" + mEmail.getText()).trim();
- String comment = ("" + mComment.getText()).trim();
-
- String userId = name;
- if (comment.length() > 0) {
- userId += " (" + comment + ")";
- }
- if (email.length() > 0) {
- userId += " <" + email + ">";
- }
-
- if (userId.equals("")) {
- // ok, empty one...
- return userId;
- }
- //TODO: check gpg accepts an entirely empty ID packet. specs say this is allowed
- return userId;
- }
-
- public void onClick(View v) {
- final ViewGroup parent = (ViewGroup) getParent();
- if (v == mDeleteButton) {
- boolean wasMainUserId = mIsMainUserId.isChecked();
- parent.removeView(this);
- if (mEditorListener != null) {
- mEditorListener.onDeleted(this, mIsNewId);
- }
- if (wasMainUserId && parent.getChildCount() > 0) {
- UserIdEditor editor = (UserIdEditor) parent.getChildAt(0);
- editor.setIsMainUserId(true);
- }
- } else if (v == mIsMainUserId) {
- for (int i = 0; i < parent.getChildCount(); ++i) {
- UserIdEditor editor = (UserIdEditor) parent.getChildAt(i);
- if (editor == this) {
- editor.setIsMainUserId(true);
- } else {
- editor.setIsMainUserId(false);
- }
- }
- if (mEditorListener != null) {
- mEditorListener.onEdited();
- }
- }
- }
-
- public void setIsMainUserId(boolean value) {
- mIsMainUserId.setChecked(value);
- }
-
- public boolean isMainUserId() {
- return mIsMainUserId.isChecked();
- }
-
- public void setEditorListener(EditorListener listener) {
- mEditorListener = listener;
- }
-
- @Override
- public boolean needsSaving() {
- boolean retval = false; //(mOriginallyMainUserID != isMainUserId());
- retval |= !(mOriginalName.equals(("" + mName.getText()).trim()));
- retval |= !(mOriginalEmail.equals(("" + mEmail.getText()).trim()));
- retval |= !(mOriginalComment.equals(("" + mComment.getText()).trim()));
- retval |= mIsNewId;
- return retval;
- }
-
- public boolean getIsOriginallyMainUserID() {
- return mOriginallyMainUserID;
- }
-
- public boolean primarySwapped() {
- return (mOriginallyMainUserID != isMainUserId());
- }
-
- public String getOriginalID() {
- return mOriginalID;
- }
-
- public boolean getIsNewID() { return mIsNewId; }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java
index 2499f2571..9acc7a73b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.util;
import android.annotation.SuppressLint;
import android.app.Activity;
+import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData;
import org.sufficientlysecure.keychain.Constants;
@@ -57,13 +58,13 @@ public class AlgorithmNames {
mHashNames.put(HashAlgorithmTags.SHA384, "SHA-384");
mHashNames.put(HashAlgorithmTags.SHA512, "SHA-512");
- mCompressionNames.put(Constants.choice.compression.none, mActivity.getString(R.string.choice_none)
+ mCompressionNames.put(CompressionAlgorithmTags.UNCOMPRESSED, mActivity.getString(R.string.choice_none)
+ " (" + mActivity.getString(R.string.compression_fast) + ")");
- mCompressionNames.put(Constants.choice.compression.zip,
+ mCompressionNames.put(CompressionAlgorithmTags.ZIP,
"ZIP (" + mActivity.getString(R.string.compression_fast) + ")");
- mCompressionNames.put(Constants.choice.compression.zlib,
+ mCompressionNames.put(CompressionAlgorithmTags.ZLIB,
"ZLIB (" + mActivity.getString(R.string.compression_fast) + ")");
- mCompressionNames.put(Constants.choice.compression.bzip2,
+ mCompressionNames.put(CompressionAlgorithmTags.BZIP2,
"BZIP2 (" + mActivity.getString(R.string.compression_very_slow) + ")");
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java
new file mode 100644
index 000000000..c18e5cabd
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/DatabaseUtil.java
@@ -0,0 +1,36 @@
+package org.sufficientlysecure.keychain.util;
+
+import android.text.TextUtils;
+
+/**
+ * Shamelessly copied from android.database.DatabaseUtils
+ */
+public class DatabaseUtil {
+ /**
+ * Concatenates two SQL WHERE clauses, handling empty or null values.
+ */
+ public static String concatenateWhere(String a, String b) {
+ if (TextUtils.isEmpty(a)) {
+ return b;
+ }
+ if (TextUtils.isEmpty(b)) {
+ return a;
+ }
+
+ return "(" + a + ") AND (" + b + ")";
+ }
+
+ /**
+ * Appends one set of selection args to another. This is useful when adding a selection
+ * argument to a user provided set.
+ */
+ public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {
+ if (originalValues == null || originalValues.length == 0) {
+ return newValues;
+ }
+ String[] result = new String[originalValues.length + newValues.length ];
+ System.arraycopy(originalValues, 0, result, 0, originalValues.length);
+ System.arraycopy(newValues, 0, result, originalValues.length, newValues.length);
+ return result;
+ }
+}
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/attachment_bg_holo.9.png b/OpenKeychain/src/main/res/drawable-hdpi/attachment_bg_holo.9.png
new file mode 100644
index 000000000..3cbdd667b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/attachment_bg_holo.9.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_cloud.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_cloud.png
deleted file mode 100644
index 3daa64131..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_cloud.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png
deleted file mode 100644
index 38051d8d6..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png
deleted file mode 100644
index a1804b2c1..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_doc_generic_am.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_doc_generic_am.png
new file mode 100644
index 000000000..55b9b7d3c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_generic_man.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_generic_man.png
new file mode 100644
index 000000000..b6b3129f5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_generic_man.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search.png
deleted file mode 100644
index 1cb61faf4..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search_list.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search_list.png
deleted file mode 100644
index efee6dfd2..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_menu_search_list.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_next.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_next.png
deleted file mode 100644
index d71058055..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_next.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_previous.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_previous.png
deleted file mode 100644
index d610e4667..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_previous.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_small.png b/OpenKeychain/src/main/res/drawable-hdpi/key_small.png
deleted file mode 100644
index 6966048a1..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/key_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-ldpi/ic_next.png b/OpenKeychain/src/main/res/drawable-ldpi/ic_next.png
deleted file mode 100644
index 474ed8faa..000000000
--- a/OpenKeychain/src/main/res/drawable-ldpi/ic_next.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-ldpi/ic_previous.png b/OpenKeychain/src/main/res/drawable-ldpi/ic_previous.png
deleted file mode 100644
index 6fd885e6b..000000000
--- a/OpenKeychain/src/main/res/drawable-ldpi/ic_previous.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-ldpi/key_small.png b/OpenKeychain/src/main/res/drawable-ldpi/key_small.png
deleted file mode 100644
index 073b95029..000000000
--- a/OpenKeychain/src/main/res/drawable-ldpi/key_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/attachment_bg_holo.9.png b/OpenKeychain/src/main/res/drawable-mdpi/attachment_bg_holo.9.png
new file mode 100644
index 000000000..bb9214b6a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/attachment_bg_holo.9.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_cloud.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_cloud.png
deleted file mode 100644
index 266d4c21f..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_cloud.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png
deleted file mode 100644
index 13967b30a..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png
deleted file mode 100644
index 11a25b504..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_doc_generic_am.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_doc_generic_am.png
new file mode 100644
index 000000000..a1bd14eaf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_generic_man.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_generic_man.png
new file mode 100644
index 000000000..f763dd259
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_generic_man.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search.png
deleted file mode 100644
index 2369d03f3..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search_list.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search_list.png
deleted file mode 100644
index 9033f1ec2..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_menu_search_list.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_next.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_next.png
deleted file mode 100644
index 8271c1380..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_next.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_previous.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_previous.png
deleted file mode 100644
index ef90db972..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_previous.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_small.png b/OpenKeychain/src/main/res/drawable-mdpi/key_small.png
deleted file mode 100644
index c806b6041..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/key_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/attachment_bg_holo.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/attachment_bg_holo.9.png
new file mode 100644
index 000000000..1f4b25d21
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/attachment_bg_holo.9.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_cloud.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_cloud.png
deleted file mode 100644
index 0769899fd..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_cloud.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png
deleted file mode 100644
index 0bb45d2c0..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png
deleted file mode 100644
index 40ca1572c..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_doc_generic_am.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_doc_generic_am.png
new file mode 100644
index 000000000..e05c4b48d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_generic_man.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_generic_man.png
new file mode 100644
index 000000000..212293db0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_generic_man.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search.png
deleted file mode 100644
index 578cb24eb..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search_list.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search_list.png
deleted file mode 100644
index de20fa0e7..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_menu_search_list.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/attachment_bg_holo.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/attachment_bg_holo.9.png
new file mode 100644
index 000000000..13855a2b1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/attachment_bg_holo.9.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_cloud.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_cloud.png
deleted file mode 100644
index f97084dbe..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_cloud.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png
deleted file mode 100644
index fda51ad86..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png
deleted file mode 100644
index 44754152f..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_doc_generic_am.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_doc_generic_am.png
new file mode 100644
index 000000000..c09886632
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_generic_man.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_generic_man.png
new file mode 100644
index 000000000..130c670c9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_generic_man.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/layout/edit_key_subkey_added_item.xml b/OpenKeychain/src/main/res/layout/add_subkey_dialog.xml
index a4258b998..e1ccfee1f 100644
--- a/OpenKeychain/src/main/res/layout/edit_key_subkey_added_item.xml
+++ b/OpenKeychain/src/main/res/layout/add_subkey_dialog.xml
@@ -1,127 +1,150 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="5dp">
-
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:minWidth="10dp"
- android:background="@color/android_green_light" />
+ android:layout_height="match_parent">
<TableLayout
- android:layout_width="0dp"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:paddingLeft="8dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
android:stretchColumns="1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginBottom="4dp"
+ android:text="@string/key_creation_el_gamal_info" />
+
<TableRow>
<TextView
- android:id="@+id/label_expiry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_expiry" />
+ android:text="@string/label_algorithm" />
- <Button
- android:id="@+id/expiry"
+ <Spinner
+ android:id="@+id/add_subkey_algorithm"
android:layout_width="match_parent"
- android:layout_height="40dp"
- android:text="@string/none"
- android:background="@drawable/button_edgy" />
+ android:layout_height="wrap_content"
+ android:padding="4dp" />
</TableRow>
- <TableRow
- android:id="@+id/row_certify">
+ <TableRow>
<TextView
- android:id="@+id/label_usage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_usage" />
- <CheckBox
- android:id="@+id/chkCertify"
- android:enabled = "false"
- android:layout_width="wrap_content"
+ android:text="@string/label_key_size" />
+
+ <Spinner
+ android:id="@+id/add_subkey_size"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/flag_certify" />
+ android:gravity="right"
+ android:padding="4dp" />
</TableRow>
+ <TextView
+ android:id="@+id/add_subkey_custom_key_size_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:text="@string/key_size_custom_info"
+ android:visibility="gone" />
+
+ <EditText
+ android:id="@+id/add_subkey_custom_key_size_input"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="number"
+ android:visibility="gone" />
+
+ <TextView
+ android:id="@+id/add_subkey_custom_key_size_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical" />
+
<TableRow
- android:id="@+id/row_sign">
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp">
<TextView
- android:id="@+id/label_usage2"
+ android:id="@+id/label_expiry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingRight="10dip"
- android:text="@string/label_usage" />
+ android:text="@string/label_expiry" />
+
<CheckBox
- android:id="@+id/chkSign"
+ android:id="@+id/add_subkey_no_expiry"
+ android:checked="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/flag_sign" />
+ android:text="@string/btn_no_date" />
+
</TableRow>
<TableRow
- android:id="@+id/row_encrypt">
+ android:id="@+id/add_subkey_expiry_row"
+ android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingRight="10dip" />
- <CheckBox
- android:id="@+id/chkEncrypt"
+
+ <DatePicker
+ android:id="@+id/add_subkey_expiry_date_picker"
+ android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/flag_encrypt" />
+ android:spinnersShown="true"
+ android:calendarViewShown="false" />
+
</TableRow>
- <TableRow
- android:id="@+id/row_authenticate">
+ <TableRow>
<TextView
+ android:id="@+id/label_usage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:paddingRight="10dip" />
+ android:paddingRight="10dip"
+ android:text="@string/label_usage" />
+
+
<CheckBox
- android:id="@+id/chkAuthenticate"
+ android:id="@+id/add_subkey_flag_certify"
+ android:enabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/flag_authenticate" />
+ android:text="@string/flag_certify" />
</TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/key_creation_el_gamal_info" />
-
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/label_algorithm" />
+ android:paddingRight="10dip" />
- <Spinner
- android:id="@+id/create_key_algorithm"
- android:layout_width="match_parent"
+ <CheckBox
+ android:id="@+id/add_subkey_flag_sign"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:padding="4dp" />
+ android:text="@string/flag_sign" />
</TableRow>
<TableRow>
@@ -130,50 +153,30 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/label_key_size" />
+ android:paddingRight="10dip" />
- <Spinner
- android:id="@+id/create_key_size"
- android:layout_width="match_parent"
+ <CheckBox
+ android:id="@+id/add_subkey_flag_encrypt"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:gravity="right"
- android:padding="4dp" />
+ android:text="@string/flag_encrypt" />
</TableRow>
- <TextView
- android:id="@+id/custom_key_size_label"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/key_size_custom_info"
- android:visibility="gone" />
+ <TableRow>
- <EditText
- android:id="@+id/custom_key_size_input"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:inputType="number"
- android:visibility="gone" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:paddingRight="10dip" />
- <TextView
- android:id="@+id/custom_key_size_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:visibility="gone" />
+ <CheckBox
+ android:id="@+id/add_subkey_flag_authenticate"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/flag_authenticate" />
+ </TableRow>
</TableLayout>
- <ImageButton
- android:id="@+id/subkey_added_item_delete"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/ic_action_cancel"
- android:layout_gravity="center_vertical"
- style="@style/SelectableItem" />
-</LinearLayout> \ No newline at end of file
+</ScrollView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_account_settings_fragment.xml b/OpenKeychain/src/main/res/layout/api_account_settings_fragment.xml
index 7bb861547..aaeae78e0 100644
--- a/OpenKeychain/src/main/res/layout/api_account_settings_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/api_account_settings_fragment.xml
@@ -53,7 +53,7 @@
android:text="@string/api_settings_create_key"
android:background="@drawable/button_edgy"
android:drawableLeft="@drawable/ic_action_accounts"
- android:textSize="14dip"/>
+ android:textSize="14sp"/>
<org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout
android:layout_width="match_parent"
diff --git a/OpenKeychain/src/main/res/layout/create_key_dialog.xml b/OpenKeychain/src/main/res/layout/create_key_dialog.xml
deleted file mode 100644
index 16eef08c4..000000000
--- a/OpenKeychain/src/main/res/layout/create_key_dialog.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <TableLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:stretchColumns="1" >
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/key_creation_el_gamal_info" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/key_creation_weak_rsa_info" />
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/label_algorithm" />
-
- <Spinner
- android:id="@+id/create_key_algorithm"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="4dp" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/label_key_size" />
-
- <Spinner
- android:id="@+id/create_key_size"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="right"
- android:padding="4dp" />
- </TableRow>
-
- <TextView
- android:id="@+id/custom_key_size_label"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp"
- android:text="@string/key_size_custom_info"
- android:visibility="gone"/>
-
- <EditText
- android:id="@+id/custom_key_size_input"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:inputType="number"
- android:visibility="gone"/>
-
- <TextView
- android:id="@+id/custom_key_size_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:padding="4dp" />
-
- </TableLayout>
-
-</ScrollView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
index 098aaaea1..6ff827894 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
@@ -26,32 +26,41 @@
android:orientation="vertical">
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <EditText
- android:id="@+id/decrypt_file_filename"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="top|left"
- android:inputType="textMultiLine|textUri"
- android:lines="4"
- android:maxLines="10"
- android:minLines="2"
- android:scrollbars="vertical" />
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:orientation="horizontal"
- <ImageButton
android:id="@+id/decrypt_file_browse"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp"
- android:src="@drawable/ic_action_collection"
- android:background="@drawable/button_rounded"
- android:layout_gravity="center_vertical"/>
+ android:clickable="true"
+ style="@style/SelectableItem">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/label_file_colon"
+ android:gravity="center_vertical"/>
+
+ <TextView
+ android:id="@+id/decrypt_file_filename"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:hint="@string/filemanager_title_open"
+ android:drawableRight="@drawable/ic_action_collection"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"/>
</LinearLayout>
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginBottom="8dp"/>
+
<CheckBox
android:id="@+id/decrypt_file_delete_after_decryption"
android:layout_width="wrap_content"
diff --git a/OpenKeychain/src/main/res/layout/edit_key_key_item.xml b/OpenKeychain/src/main/res/layout/edit_key_key_item.xml
deleted file mode 100644
index 81fb643ab..000000000
--- a/OpenKeychain/src/main/res/layout/edit_key_key_item.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<org.sufficientlysecure.keychain.ui.widget.KeyEditor xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
-
- <TableLayout
- android:id="@+id/table_keylayout"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:stretchColumns="1" >
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_keyId"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_key_id" />
-
- <TextView
- android:id="@+id/keyId"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="00000000 00000000"
- android:typeface="monospace" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_algorithm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_algorithm" />
-
- <TextView
- android:id="@+id/algorithm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="@string/label_name" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_creation"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_creation" />
-
- <TextView
- android:id="@+id/creation"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_expiry"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_expiry" />
-
- <Button
- android:id="@+id/expiry"
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:text="@string/none"
- android:background="@drawable/button_edgy" />
- </TableRow>
-
- <TableRow
- android:id="@+id/row_certify">
-
- <TextView
- android:id="@+id/label_usage"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_usage" />
- <CheckBox
- android:id="@+id/chkCertify"
- android:enabled = "false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/flag_certify" />
- </TableRow>
-
- <TableRow
- android:id="@+id/row_sign">
-
- <TextView
- android:id="@+id/label_usage2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_usage" />
- <CheckBox
- android:id="@+id/chkSign"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/flag_sign" />
- </TableRow>
-
- <TableRow
- android:id="@+id/row_encrypt">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip" />
- <CheckBox
- android:id="@+id/chkEncrypt"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/flag_encrypt" />
- </TableRow>
-
- <TableRow
- android:id="@+id/row_authenticate">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip" />
- <CheckBox
- android:id="@+id/chkAuthenticate"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/flag_authenticate" />
- </TableRow>
- </TableLayout>
-
- <ImageButton
- android:id="@+id/delete"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="10dp"
- android:src="@drawable/minus"
- android:background="@drawable/button_rounded_red"/>
- </LinearLayout>
-
- <View
- android:id="@+id/separator"
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
-</org.sufficientlysecure.keychain.ui.widget.KeyEditor>
-
diff --git a/OpenKeychain/src/main/res/layout/edit_key_section.xml b/OpenKeychain/src/main/res/layout/edit_key_section.xml
deleted file mode 100644
index 6cfe18bd6..000000000
--- a/OpenKeychain/src/main/res/layout/edit_key_section.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<org.sufficientlysecure.keychain.ui.widget.SectionView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <LinearLayout
- android:id="@+id/header"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:orientation="horizontal" >
-
- <TextView
- android:id="@+id/title"
- style="@style/SectionHeader"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- android:singleLine="true"
- android:text="Section Name" />
-
- <ImageButton
- android:id="@+id/plusbutton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="10dp"
- android:src="@drawable/plus"
- android:background="@drawable/button_rounded_green"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/editors"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingBottom="6dip" />
-
-</org.sufficientlysecure.keychain.ui.widget.SectionView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/edit_key_user_id_item.xml b/OpenKeychain/src/main/res/layout/edit_key_user_id_item.xml
deleted file mode 100644
index 877ea77db..000000000
--- a/OpenKeychain/src/main/res/layout/edit_key_user_id_item.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<org.sufficientlysecure.keychain.ui.widget.UserIdEditor xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <RadioButton
- android:id="@+id/isMainUserId"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/label_main_user_id" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
-
- <TableLayout
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="5dip"
- android:text="@string/label_name" />
-
- <EditText
- android:id="@+id/name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:inputType="textPersonName|textCapWords" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_email"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="5dip"
- android:text="@string/label_email" />
-
- <AutoCompleteTextView
- android:id="@+id/email"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:inputType="textEmailAddress" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_comment"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="5dip"
- android:text="@string/label_comment" />
-
- <EditText
- android:id="@+id/user_id_item_comment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:inputType="text"/>
- </TableRow>
- </TableLayout>
-
- <ImageButton
- android:id="@+id/delete"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_margin="10dip"
- android:layout_marginLeft="4dip"
- android:layout_marginRight="6dip"
- android:src="@drawable/minus"
- android:background="@drawable/button_rounded_red" />
- </LinearLayout>
-
- <View
- android:id="@+id/separator"
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
-</org.sufficientlysecure.keychain.ui.widget.UserIdEditor> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml b/OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml
new file mode 100644
index 000000000..062f07863
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <DatePicker
+ android:id="@+id/edit_subkey_expiry_date_picker"
+ android:layout_gravity="center_horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:spinnersShown="true"
+ android:calendarViewShown="false" />
+ <!-- Hide calendarView in tablets because of the unix warparound bug. -->
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_activity.xml b/OpenKeychain/src/main/res/layout/encrypt_activity.xml
index 65c2ee8fd..839bddc75 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_activity.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_activity.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
- xmlns:fontawesometext="http://schemas.android.com/apk/res-auto"
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+<android.support.v4.widget.FixedDrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".ui.EncryptActivity">
<include layout="@layout/encrypt_content"/>
diff --git a/OpenKeychain/src/main/res/layout/encrypt_asymmetric_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_asymmetric_fragment.xml
index cde92b477..4d82477bc 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_asymmetric_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_asymmetric_fragment.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -12,66 +11,29 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:padding="0dp"
+ android:layout_margin="0dp"
+ style="@android:style/Widget.EditText">
- <CheckBox
- android:id="@+id/sign"
+ <TextView
+ android:paddingLeft="12dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/label_sign" />
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/label_asymmetric_from" />
- <LinearLayout
+ <Spinner
+ android:id="@+id/sign"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="4dip">
+ android:layout_gravity="center_vertical" />
- <TextView
- android:id="@+id/mainUserId"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:ellipsize="end"
- android:singleLine="true"
- android:text=""
- android:textAppearance="?android:attr/textAppearanceMedium" />
-
- <TextView
- android:id="@+id/mainUserIdRest"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:ellipsize="end"
- android:singleLine="true"
- android:text=""
- android:textAppearance="?android:attr/textAppearanceSmall" />
- </LinearLayout>
</LinearLayout>
- <LinearLayout
+ <org.sufficientlysecure.keychain.ui.widget.EncryptKeyCompletionView
+ android:id="@+id/recipient_list"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <TextView
- android:id="@+id/label_selectPublicKeys"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_weight="1"
- android:text="@string/label_select_public_keys"
- android:textAppearance="?android:attr/textAppearanceMedium" />
-
- <Button
- android:id="@+id/btn_selectEncryptKeys"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_margin="4dp"
- android:text="@string/select_keys_button_default"
- android:background="@drawable/button_edgy"
- android:drawableLeft="@drawable/ic_action_person" />
- </LinearLayout>
+ android:layout_height="wrap_content" />
</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_asymmetric_signkey.xml b/OpenKeychain/src/main/res/layout/encrypt_asymmetric_signkey.xml
new file mode 100644
index 000000000..703f9133b
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/encrypt_asymmetric_signkey.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:padding="4dp"
+ android:layout_height="wrap_content">
+ <TextView android:id="@android:id/title"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textSize="18sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"/>
+ <TextView android:id="@android:id/text1"
+ android:textColor="?android:attr/textColorTertiary"
+ android:textSize="14sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_marginTop="-4dip"/>
+ <TextView android:id="@android:id/text2"
+ android:textColor="?android:attr/textColorTertiary"
+ android:textSize="14sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_marginTop="-4dip"/>
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_content.xml b/OpenKeychain/src/main/res/layout/encrypt_content.xml
index a9a7db3e5..e5edc6657 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_content.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_content.xml
@@ -1,23 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content_frame"
- android:layout_marginLeft="@dimen/drawer_content_padding"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <android.support.v4.view.ViewPager
- android:id="@+id/encrypt_pager_mode"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/content_frame"
+ android:layout_marginLeft="@dimen/drawer_content_padding"
android:layout_width="match_parent"
- android:layout_height="150dp">
+ android:layout_height="match_parent"
+ android:orientation="vertical">
- <android.support.v4.view.PagerTabStrip
- android:id="@+id/encrypt_pager_tab_strip_mode"
+ <include layout="@layout/notify_area"/>
+
+ <org.sufficientlysecure.keychain.ui.widget.NoSwipeWrapContentViewPager
+ android:id="@+id/encrypt_pager_mode"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:textColor="@color/emphasis" />
- </android.support.v4.view.ViewPager>
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ </org.sufficientlysecure.keychain.ui.widget.NoSwipeWrapContentViewPager>
<android.support.v4.view.ViewPager
android:id="@+id/encrypt_pager_content"
diff --git a/OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml b/OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml
index ac990653a..67f7032c1 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml
@@ -21,43 +21,4 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
</LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <CheckBox
- android:id="@+id/deleteAfterEncryption"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/label_delete_after_encryption"/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <CheckBox
- android:id="@+id/shareAfterEncryption"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/label_share_after_encryption"/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <CheckBox
- android:id="@+id/asciiArmor"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:text="@string/label_ascii_armor"/>
- </LinearLayout>
</merge>
diff --git a/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml
index 4142b3de6..b853ac2fb 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml
@@ -1,87 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
- xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="4dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:orientation="vertical">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <EditText
- android:id="@+id/filename"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="top|left"
- android:inputType="textMultiLine|textUri"
- android:lines="4"
- android:maxLines="10"
- android:minLines="2"
- android:scrollbars="vertical" />
-
- <ImageButton
- android:id="@+id/btn_browse"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp"
- android:layout_gravity="center_vertical"
- android:src="@drawable/ic_action_collection"
- android:background="@drawable/button_rounded"/>
- </LinearLayout>
-
- <org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- custom:foldedLabel="@string/btn_encryption_advanced_settings_show"
- custom:unFoldedLabel="@string/btn_encryption_advanced_settings_hide"
- custom:foldedIcon="fa-chevron-right"
- custom:unFoldedIcon="fa-chevron-down">
-
- <include layout="@layout/encrypt_content_adv_settings" />
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical">
+ <ListView
+ android:id="@+id/selected_files_list"
+ android:dividerHeight="4dip"
+ android:divider="@android:color/transparent"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:layout_marginTop="8dp"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"/>
- </org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout>
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"/>
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+ <!-- Note: The following construct should be a widget, we use it quiet often -->
- <TextView
- android:id="@+id/action_encrypt_file"
+ <LinearLayout
+ android:id="@+id/action_encrypt_share"
android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:text="@string/btn_encrypt_file"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:layout_marginBottom="8dp"
android:clickable="true"
style="@style/SelectableItem"
- android:drawableRight="@drawable/ic_action_save"
- android:drawablePadding="8dp"
- android:gravity="center_vertical"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true"
- android:layout_marginBottom="8dp" />
+ android:orientation="horizontal">
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:text="@string/btn_encrypt_share_file"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_action_share"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"/>
<View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_above="@+id/action_encrypt_file" />
+ android:layout_width="1dip"
+ android:layout_height="match_parent"
+ android:gravity="right"
+ android:layout_marginBottom="8dp"
+ android:layout_marginTop="8dp"
+ android:background="?android:attr/listDivider"/>
- </RelativeLayout>
+ <ImageButton
+ android:id="@+id/action_encrypt_file"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_save"
+ android:layout_gravity="center_vertical"
+ style="@style/SelectableItem"/>
+
+ </LinearLayout>
</LinearLayout>
</ScrollView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_symmetric_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_symmetric_fragment.xml
index 89381e499..699f991a7 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_symmetric_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_symmetric_fragment.xml
@@ -1,52 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/modeSymmetric"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
+ android:stretchColumns="1"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
- android:orientation="vertical">
+ android:layout_centerVertical="true">
- <TableLayout
- android:id="@+id/modeSymmetric"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="1"
- android:layout_centerVertical="true">
+ <TableRow>
- <TableRow>
+ <TextView
+ android:id="@+id/label_passphrase"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingRight="8dp"
+ android:text="@string/label_passphrase"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
- <TextView
- android:id="@+id/label_passphrase"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="8dp"
- android:text="@string/label_passphrase"
- android:textAppearance="?android:attr/textAppearanceMedium" />
+ <EditText
+ android:id="@+id/passphrase"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="textPassword" />
+ </TableRow>
- <EditText
- android:id="@+id/passphrase"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:inputType="textPassword" />
- </TableRow>
+ <TableRow>
- <TableRow>
+ <TextView
+ android:id="@+id/label_passphraseAgain"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingRight="8dp"
+ android:text="@string/label_passphrase_again"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
- <TextView
- android:id="@+id/label_passphraseAgain"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="8dp"
- android:text="@string/label_passphrase_again"
- android:textAppearance="?android:attr/textAppearanceMedium" />
-
- <EditText
- android:id="@+id/passphraseAgain"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:inputType="textPassword" />
- </TableRow>
- </TableLayout>
-</RelativeLayout> \ No newline at end of file
+ <EditText
+ android:id="@+id/passphraseAgain"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="textPassword" />
+ </TableRow>
+</TableLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/file_list_entry.xml b/OpenKeychain/src/main/res/layout/file_list_entry.xml
new file mode 100644
index 000000000..f6fde2447
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/file_list_entry.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:background="@drawable/attachment_bg_holo">
+
+ <ImageView
+ android:id="@+id/thumbnail"
+ android:layout_alignParentLeft="true"
+ android:layout_centerVertical="true"
+ android:scaleType="center"
+ android:layout_width="48dip"
+ android:layout_height="48dip"/>
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@+id/thumbnail"
+ android:layout_centerVertical="true">
+
+ <TextView
+ android:id="@+id/filename"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="32dip"
+ android:maxLines="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:ellipsize="end"/>
+
+ <TextView
+ android:id="@+id/filesize"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="32dip"
+ android:maxLines="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?android:attr/textColorTertiary"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textSize="12sp"
+ android:ellipsize="end"/>
+
+ </LinearLayout>
+
+ <ImageButton
+ android:id="@+id/action_remove_file_from_list"
+ android:layout_width="48dip"
+ android:layout_height="48dip"
+ android:layout_alignParentRight="true"
+ android:paddingRight="16dip"
+ android:paddingLeft="16dip"
+ android:src="@drawable/ic_action_cancel"
+ android:clickable="true"
+ android:layout_centerVertical="true"
+ style="@style/SelectableItem"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/file_list_entry_add.xml b/OpenKeychain/src/main/res/layout/file_list_entry_add.xml
new file mode 100644
index 000000000..f2caab653
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/file_list_entry_add.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:padding="4dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ style="@style/SelectableItem">
+ <TextView
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:text="@string/btn_add_files"
+ android:drawableLeft="@drawable/ic_action_collection"
+ android:drawablePadding="8dp"
+ android:gravity="center"/>
+</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
index 56f34e2eb..773250dc6 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
@@ -100,7 +100,7 @@
android:orientation="vertical" />
<TextView
- android:id="@+id/keyId"
+ android:id="@+id/subkey_item_key_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0xBBBBBBBBBBBBBBBB"
diff --git a/OpenKeychain/src/main/res/layout/recipient_box_entry.xml b/OpenKeychain/src/main/res/layout/recipient_box_entry.xml
new file mode 100644
index 000000000..a7862c515
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/recipient_box_entry.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/attachment_bg_holo">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="4dip"
+ android:id="@android:id/text1"
+ android:layout_gravity="center_vertical"/>
+
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="32dip"
+ android:layout_height="32dip"
+ android:layout_marginLeft="12dip"
+ android:cropToPadding="true"
+ android:background="#ccc"
+ android:scaleType="centerCrop"/>
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml b/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml
new file mode 100644
index 000000000..9d2d1e9a9
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="48dip"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+ <LinearLayout
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:orientation="vertical"
+ android:layout_weight="1">
+ <TextView android:id="@android:id/title"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textSize="18sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="8dip"
+ android:singleLine="true"
+ android:ellipsize="end"/>
+ <TextView android:id="@android:id/text1"
+ android:textColor="?android:attr/textColorTertiary"
+ android:textSize="14sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dip"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_marginTop="-4dip"/>
+ <TextView android:id="@android:id/text2"
+ android:textColor="?android:attr/textColorTertiary"
+ android:textSize="14sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dip"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_marginTop="-4dip"/>
+ </LinearLayout>
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="56dip"
+ android:layout_height="56dip"
+ android:layout_marginLeft="12dip"
+ android:cropToPadding="true"
+ android:background="#ccc"
+ android:scaleType="centerCrop"/>
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/select_key_item.xml b/OpenKeychain/src/main/res/layout/select_key_item.xml
index 90635e6a4..4fe80c7e1 100644
--- a/OpenKeychain/src/main/res/layout/select_key_item.xml
+++ b/OpenKeychain/src/main/res/layout/select_key_item.xml
@@ -38,7 +38,7 @@
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
- android:id="@+id/keyId"
+ android:id="@+id/subkey_item_key_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0xBBBBBBBBBBBBBBB"
diff --git a/OpenKeychain/src/main/res/layout/select_secret_key_layout_fragment.xml b/OpenKeychain/src/main/res/layout/select_secret_key_layout_fragment.xml
index 63eeb8eaf..e5fd3f9f2 100644
--- a/OpenKeychain/src/main/res/layout/select_secret_key_layout_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/select_secret_key_layout_fragment.xml
@@ -15,7 +15,7 @@
android:text="@string/api_settings_select_key"
android:drawableLeft="@drawable/ic_action_accounts"
android:background="@drawable/button_edgy"
- android:textSize="14dp"/>
+ android:textSize="14sp"/>
<LinearLayout
android:layout_width="match_parent"
diff --git a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
index a8786c461..0895098d4 100644
--- a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
@@ -133,7 +133,6 @@
android:id="@+id/view_key_action_upload"
android:paddingLeft="8dp"
android:paddingRight="8dp"
- android:layout_marginBottom="8dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -144,8 +143,7 @@
android:layout_weight="1"
android:drawableRight="@drawable/ic_action_upload"
android:drawablePadding="8dp"
- android:gravity="center_vertical"
- android:editable="false" />
+ android:gravity="center_vertical" />
<View
android:layout_width="match_parent"
diff --git a/OpenKeychain/src/main/res/layout/view_key_subkey_item.xml b/OpenKeychain/src/main/res/layout/view_key_subkey_item.xml
index 226ed52cf..af7e32039 100644
--- a/OpenKeychain/src/main/res/layout/view_key_subkey_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_subkey_item.xml
@@ -6,36 +6,39 @@
android:orientation="horizontal"
android:singleLine="true">
- <ImageView
- android:id="@+id/ic_masterKey"
+ <FrameLayout
+ android:id="@+id/subkey_item_buttons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:src="@drawable/key_small"
- android:padding="8dp"
- android:layout_centerVertical="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
-
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/user_id_item_edit_image"
- android:src="@drawable/ic_action_edit"
- android:padding="8dp"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true" />
+ android:layout_alignParentEnd="true">
+
+ <ImageView
+ android:id="@+id/subkey_item_edit_image"
+ android:src="@drawable/ic_action_edit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="8dp" />
+
+ <ImageButton
+ android:id="@+id/subkey_item_delete_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_cancel"
+ style="@style/SelectableItem" />
+
+ </FrameLayout>
<LinearLayout
android:orientation="vertical"
- android:layout_toRightOf="@id/ic_masterKey"
- android:layout_toLeftOf="@id/user_id_item_edit_image"
+ android:layout_toLeftOf="@id/subkey_item_buttons"
android:layout_centerVertical="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginRight="8dp"
- android:id="@+id/linearLayout">
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp">
<LinearLayout
android:layout_width="match_parent"
@@ -46,7 +49,7 @@
android:paddingTop="2dip">
<TextView
- android:id="@+id/keyId"
+ android:id="@+id/subkey_item_key_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0x00000000"
@@ -55,7 +58,7 @@
android:layout_weight="1" />
<ImageView
- android:id="@+id/ic_certifyKey"
+ android:id="@+id/subkey_item_ic_certify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/certify_small"
@@ -63,7 +66,7 @@
android:layout_gravity="center_vertical" />
<ImageView
- android:id="@+id/ic_encryptKey"
+ android:id="@+id/subkey_item_ic_encrypt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/encrypted_small"
@@ -71,7 +74,7 @@
android:layout_gravity="center_vertical" />
<ImageView
- android:id="@+id/ic_signKey"
+ android:id="@+id/subkey_item_ic_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/signed_small"
@@ -79,7 +82,7 @@
android:layout_gravity="center_vertical" />
<ImageView
- android:id="@+id/ic_revokedKey"
+ android:id="@+id/subkey_item_ic_revoked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/revoked_key_small"
@@ -94,7 +97,7 @@
android:layout_height="match_parent">
<TextView
- android:id="@+id/keyDetails"
+ android:id="@+id/subkey_item_details"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingRight="5dip"
@@ -103,7 +106,7 @@
android:layout_weight="1" />
<TextView
- android:id="@+id/keyExpiry"
+ android:id="@+id/subkey_item_expiry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Expiry: 4/7/2016"
diff --git a/OpenKeychain/src/main/res/layout/view_key_user_id_item.xml b/OpenKeychain/src/main/res/layout/view_key_user_id_item.xml
index e6dae3eeb..24e8e1a10 100644
--- a/OpenKeychain/src/main/res/layout/view_key_user_id_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_user_id_item.xml
@@ -69,7 +69,7 @@
android:layout_height="match_parent"
android:src="@drawable/ic_action_edit"
android:padding="8dp"
- android:layout_gravity="center_horizontal" />
+ android:layout_gravity="center_vertical" />
<ImageButton
android:id="@+id/user_id_item_delete_button"
diff --git a/OpenKeychain/src/main/res/menu/encrypt_activity.xml b/OpenKeychain/src/main/res/menu/encrypt_activity.xml
new file mode 100644
index 000000000..05d85ee2a
--- /dev/null
+++ b/OpenKeychain/src/main/res/menu/encrypt_activity.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/check_use_symmetric" android:title="@string/label_symmetric" android:checkable="true"/>
+ <item android:id="@+id/check_use_armor" android:title="@string/label_file_ascii_armor" android:checkable="true" />
+ <item android:id="@+id/check_delete_after_encrypt" android:title="@string/label_delete_after_encryption" android:checkable="true" />
+</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-ar/help_start.html b/OpenKeychain/src/main/res/raw-ar/help_start.html
index 3a681f8fa..51a76c01e 100644
--- a/OpenKeychain/src/main/res/raw-ar/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ar/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Getting started</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-cs/help_start.html b/OpenKeychain/src/main/res/raw-cs/help_start.html
index 3a681f8fa..51a76c01e 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_start.html
+++ b/OpenKeychain/src/main/res/raw-cs/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Getting started</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-el/help_start.html b/OpenKeychain/src/main/res/raw-el/help_start.html
index 3a681f8fa..51a76c01e 100644
--- a/OpenKeychain/src/main/res/raw-el/help_start.html
+++ b/OpenKeychain/src/main/res/raw-el/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Getting started</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-es/help_start.html b/OpenKeychain/src/main/res/raw-es/help_start.html
index 5fcda44b4..137b03c86 100644
--- a/OpenKeychain/src/main/res/raw-es/help_start.html
+++ b/OpenKeychain/src/main/res/raw-es/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Primeros pasos</h2>
-<p>Primero necesita una clave privada (secreta) personal. Cree una mediante las opciones de menú en &quot;Claves&quot;, o importe claves privadas existentes. En adelante puede descargar las claves de sus amigos, o intercambiarlas mediante códigos QR o vía NFC.</p>
+<p>Primero necesita una clave privada (secreta) personal. Cree una mediante las opciones de menú en "Claves", o importe claves privadas existentes. En adelante puede descargar las claves de sus amigos, o intercambiarlas mediante códigos QR o vía NFC.</p>
<p>Es recomendable que instales <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> para una mejor selección de archivos y <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> para escanear los códigos QR generados. Pulsando en los enlaces se abrirá Google Play o F-Droid.</p>
diff --git a/OpenKeychain/src/main/res/raw-et/help_start.html b/OpenKeychain/src/main/res/raw-et/help_start.html
index 3a681f8fa..51a76c01e 100644
--- a/OpenKeychain/src/main/res/raw-et/help_start.html
+++ b/OpenKeychain/src/main/res/raw-et/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Getting started</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_changelog.html b/OpenKeychain/src/main/res/raw-fr/help_changelog.html
index 2746881fb..82486cdcc 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_changelog.html
@@ -38,7 +38,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>prise en charge des ports du serveur de clefs</li>
<li>désactiver la possibilité de générer des clefs faibles</li>
<li>bien plus de travail interne sur l'API</li>
-<li>certifier les ID des utilisateurs</li>
+<li>certifier les ID d'utilisateurs</li>
<li>requête du serveur de clef basée sur une sortie lisible par la machine</li>
<li>verrouiller le tiroir de navigation sur les tablettes</li>
<li>suggestions de courriels à la création des clefs</li>
@@ -56,7 +56,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>autres correctifs internes affectant la modifications des clefs (merci à Ash hughes)</li>
<li>interrogation des serveurs de clefs directement depuis l'écran d'importation</li>
<li>correctif de mise en page et du style des fenêtres de dialogue sur Android 2.2-3.0</li>
-<li>corrige un plantage pour les clefs avec des ID utilisateur vides</li>
+<li>corriger un plantage pour les clefs avec des ID d'utilisateurs vides</li>
<li>corrige un plantage et des listes vides en revenant de l'écran de signature</li>
<li>Bouncy Castle (bibliothèque cryptographique) mise à jour de 1.47 à 1.50 et compilée depuis la source</li>
<li>correction du téléversement d'une clef depuis l'écran de signature</li>
@@ -111,7 +111,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>correction de l'ajout de compte sur Froyo</li>
<li>suppression sécurisée de fichiers</li>
<li>option de suppression du fichier de clef après l'importation</li>
-<li>chiffrement/déchiffrement de flux (galerie, etc...)</li>
+<li>chiffrement/déchiffrement de flux (galerie, etc.)</li>
<li>nouvelles options (langue, forcer les signatures v3)</li>
<li>changements dans l'interface</li>
<li>correctifs de bogues</li>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_wot.html b/OpenKeychain/src/main/res/raw-fr/help_wot.html
index 4162c9b1b..c15e6eefd 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_wot.html
@@ -11,7 +11,7 @@
<p>L'évaluation de la confiance est fondée sur la simple supposition que toutes les clefs ayant des clefs secrètes disponibles sont de confiance. Les clefs publiques contenant au moins un ID d'utilisateur certifié par une clef de confiance seront marquées par un point vert dans le listage des clefs. Il n'est pas (encore) possible de spécifier les niveaux de confiance pour les certificats d'autres clefs publiques inconnues.</p>
<h2>Certifications des clefs</h2>
-<p>La prise en charge de la certification des clefs est disponible et les ID d'utilisateur peuvent être certifiées individuellement. Il n'est pas encore possible de spécifier le niveau de confiance ou de créer des certificats locaux et d'autres types spéciaux.</p>
+<p>La prise en charge de la certification des clefs est disponible et les ID d'utilisateurs peuvent être certifiées individuellement. Il n'est pas encore possible de spécifier le niveau de confiance ou de créer des certificats locaux et d'autres types spéciaux.</p>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-ja/help_changelog.html b/OpenKeychain/src/main/res/raw-ja/help_changelog.html
index 0aae03ba6..0bde8d000 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_changelog.html
@@ -38,7 +38,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>鍵サーバのポート設定のサポート</li>
<li>弱い鍵の生成が可能だったのを無効化</li>
<li>さらなるAPIでの内部動作</li>
-<li>ユーザーIDの証明</li>
+<li>ユーザIDの証明</li>
<li>鍵サーバへの要求をマシンリーダブル出力を基盤にした</li>
<li>タブレットでのナビゲーションドロワーのロック</li>
<li>鍵の生成についてメールでのサジェスト</li>
diff --git a/OpenKeychain/src/main/res/raw-ja/help_start.html b/OpenKeychain/src/main/res/raw-ja/help_start.html
index 1e522cc74..188fc2de6 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>入門</h2>
-<p>最初にあなたの個人用秘密鍵が必要になります。オプションメニューの&quot;鍵&quot;で生成するか、既存の秘密鍵をインポートします。その後、あなたの友人の鍵をダウンロード、もしくはQRコードやNFCで交換します。</p>
+<p>最初にあなたの個人用秘密鍵が必要になります。オプションメニューの"鍵"で生成するか、既存の秘密鍵をインポートします。その後、あなたの友人の鍵をダウンロード、もしくはQRコードやNFCで交換します。</p>
<p>ファイルの選択を拡張するには<a href="market://details?id=org.openintents.filemanager">OI File Manager</a>、<a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>を生成したQRコードのスキャンのため、それぞれのインストールを必要とします。 リンクをクリックして、Google Play Store上かF-Droidからインストールしてください。</p>
diff --git a/OpenKeychain/src/main/res/raw-ja/help_wot.html b/OpenKeychain/src/main/res/raw-ja/help_wot.html
index 3675b6258..01b523d76 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>信頼の輪</h2>
-<p>信頼の輪はPGPが証明の作成と維持する一面を説明します。ユーザが公開鍵が属する者の追跡を維持し、他のユーザーとその情報を共有する手助けになるメカニズムを提供します。暗号化通信のプライバシーを確保するためには、あなたが暗号化したいという相手の公開鍵が必要な要素となります</p>
+<p>信頼の輪はPGPが証明の作成と維持する一面を説明します。ユーザが公開鍵が属する者の追跡を維持し、他のユーザとその情報を共有する手助けになるメカニズムを提供します。暗号化通信のプライバシーを確保するためには、あなたが暗号化したいという相手の公開鍵が必要な要素となります</p>
<h2>OpenKeychainでサポート</h2>
<p>OpenKeychainで信頼の輪の基本のみサポートされます。とても重い作業を進めており今後やってくるリリースにおいて状態が変更されていきます。</p>
diff --git a/OpenKeychain/src/main/res/raw-ko/help_start.html b/OpenKeychain/src/main/res/raw-ko/help_start.html
index 3a681f8fa..51a76c01e 100644
--- a/OpenKeychain/src/main/res/raw-ko/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ko/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Getting started</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-pl/help_changelog.html b/OpenKeychain/src/main/res/raw-pl/help_changelog.html
index d94ac3c0f..8fce6c475 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_changelog.html
@@ -136,7 +136,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<ul>
<li>dodano możliwość filtrowania listy kluczy</li>
<li>sprytniejsze automatyczne wybieranie kluczy szyfrujących</li>
-<li>dodano nowy sposób obsługi intencji &quot;wyświetl&quot; i &quot;wyślij&quot;, umożliwia szyfrowanie/deszyfrowanie plików wprost z menadżera plików.</li>
+<li>dodano nowy sposób obsługi intencji "wyświetl" i "wyślij", umożliwia szyfrowanie/deszyfrowanie plików wprost z menadżera plików.</li>
<li>poprawki i dodatkowe funkcje (podpowiedź wyboru klucza) dla K-9 Mail, nowe wydanie beta dostępne</li>
</ul>
<h2>1.0.1</h2>
diff --git a/OpenKeychain/src/main/res/raw-pl/help_start.html b/OpenKeychain/src/main/res/raw-pl/help_start.html
index 36ff31548..3fb420fd9 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_start.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Pierwsze kroki</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>Zalecana jest instalacja menadżera plików <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> w celu zapewnienia wygodniejszego wyboru plików oraz programu <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>, który jest w stanie skanować wygenerowane kody QR. Kliknięcie na powyższe linki przekieruje Cię do sklepu Google Play / F-Droid.</p>
diff --git a/OpenKeychain/src/main/res/raw-ro/help_about.html b/OpenKeychain/src/main/res/raw-ro/help_about.html
new file mode 100644
index 000000000..ab3c19375
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_about.html
@@ -0,0 +1,50 @@
+<html>
+<head></head>
+<body>
+<p><a href="http://www.openkeychain.org">http://www.openkeychain.org</a></p>
+<p><a href="http://www.openkeychain.org">OpenKeychain</a> is an OpenPGP implementation for Android.</p>
+<p>License: GPLv3+</p>
+
+<h2>Developers OpenKeychain</h2>
+<ul>
+<li>Dominik Schürmann (Lead developer)</li>
+<li>Ash Hughes (crypto patches)</li>
+<li>Brian C. Barnes</li>
+<li>Bahtiar 'kalkin' Gadimov (UI)</li>
+<li>Daniel Hammann</li>
+<li>Daniel Haß</li>
+<li>Greg Witczak</li>
+<li>Miroojin Bakshi</li>
+<li>Nikhil Peter Raj</li>
+<li>Paul Sarbinowski</li>
+<li>Sreeram Boyapati</li>
+<li>Vincent Breitmoser</li>
+<li>Tim Bray</li>
+</ul>
+<h2>Developers APG 1.x</h2>
+<ul>
+<li>Thialfihar (Lead developer)</li>
+<li>'Senecaso' (QRCode, sign key, upload key)</li>
+<li>Markus Doits</li>
+</ul>
+<h2>Libraries</h2>
+<ul>
+<li>
+<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (Apache License v2)</li>
+<li>
+<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (Apache License v2)</li>
+<li>
+<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache License v2)</li>
+<li>
+<a href="https://github.com/Bearded-Hen/Android-Bootstrap">Android-Bootstrap</a> (MIT License)</li>
+<li>
+<a href="http://code.google.com/p/zxing/">ZXing</a> (Apache License v2)</li>
+<li>
+<a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (MIT X11 License)</li>
+<li>
+<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache License v2)</li>
+<li>
+<a href="https://github.com/johnkil/Android-AppMsg">Android AppMsg Library</a> (Apache License v2)</li>
+</ul>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ro/help_changelog.html b/OpenKeychain/src/main/res/raw-ro/help_changelog.html
new file mode 100644
index 000000000..ebada67f9
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_changelog.html
@@ -0,0 +1,156 @@
+<html>
+<head></head>
+<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
+<h2>2.6.1</h2>
+<ul>
+<li>some fixes for regression bugs</li>
+</ul>
+<h2>2.6</h2>
+<ul>
+<li>key certifications (thanks to Vincent Breitmoser)</li>
+<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li>
+<li>new design for signature verification</li>
+<li>custom key length (thanks to Greg Witczak)</li>
+<li>fix share-functionality from other apps</li>
+</ul>
+<h2>2.5</h2>
+<ul>
+<li>fix decryption of symmetric pgp messages/files</li>
+<li>refactored edit key screen (thanks to Ash Hughes)</li>
+<li>new modern design for encrypt/decrypt screens</li>
+<li>OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)</li>
+</ul>
+<h2>2.4</h2>
+<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
+Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
+Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p>
+<ul>
+<li>new unified key list</li>
+<li>colorized key fingerprint</li>
+<li>support for keyserver ports</li>
+<li>deactivate possibility to generate weak keys</li>
+<li>much more internal work on the API</li>
+<li>certify user ids</li>
+<li>keyserver query based on machine-readable output</li>
+<li>lock navigation drawer on tablets</li>
+<li>suggestions for emails on creation of keys</li>
+<li>search in public key lists</li>
+<li>and much more improvements and fixes…</li>
+</ul>
+<h2>2.3.1</h2>
+<ul>
+<li>hotfix for crash when upgrading from old versions</li>
+</ul>
+<h2>2.3</h2>
+<ul>
+<li>remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)</li>
+<li>fix setting expiry dates on keys (thanks to Ash Hughes)</li>
+<li>more internal fixes when editing keys (thanks to Ash Hughes)</li>
+<li>querying keyservers directly from the import screen</li>
+<li>fix layout and dialog style on Android 2.2-3.0</li>
+<li>fix crash on keys with empty user ids</li>
+<li>fix crash and empty lists when coming back from signing screen</li>
+<li>Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source</li>
+<li>fix upload of key from signing screen</li>
+</ul>
+<h2>2.2</h2>
+<ul>
+<li>new design with navigation drawer</li>
+<li>new public key list design</li>
+<li>new public key view</li>
+<li>bug fixes for importing of keys</li>
+<li>key cross-certification (thanks to Ash Hughes)</li>
+<li>handle UTF-8 passwords properly (thanks to Ash Hughes)</li>
+<li>first version with new languages (thanks to the contributors on Transifex)</li>
+<li>sharing of keys via QR Codes fixed and improved</li>
+<li>package signature verification for API</li>
+</ul>
+<h2>2.1.1</h2>
+<ul>
+<li>API Updates, preparation for K-9 Mail integration</li>
+</ul>
+<h2>2.1</h2>
+<ul>
+<li>lots of bug fixes</li>
+<li>new API for developers</li>
+<li>PRNG bug fix by Google</li>
+</ul>
+<h2>2.0</h2>
+<ul>
+<li>complete redesign</li>
+<li>share public keys via qr codes, nfc beam</li>
+<li>sign keys</li>
+<li>upload keys to server</li>
+<li>fixes import issues</li>
+<li>new AIDL API</li>
+</ul>
+<h2>1.0.8</h2>
+<ul>
+<li>basic keyserver support</li>
+<li>app2sd</li>
+<li>more choices for pass phrase cache: 1, 2, 4, 8, hours</li>
+<li>translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)</li>
+<li>bugfixes</li>
+<li>optimizations</li>
+</ul>
+<h2>1.0.7</h2>
+<ul>
+<li>fixed problem with signature verification of texts with trailing newline</li>
+<li>more options for pass phrase cache time to live (20, 40, 60 mins)</li>
+</ul>
+<h2>1.0.6</h2>
+<ul>
+<li>account adding crash on Froyo fixed</li>
+<li>secure file deletion</li>
+<li>option to delete key file after import</li>
+<li>stream encryption/decryption (gallery, etc.)</li>
+<li>new options (language, force v3 signatures)</li>
+<li>interface changes</li>
+<li>bugfixes</li>
+</ul>
+<h2>1.0.5</h2>
+<ul>
+<li>German and Italian translation</li>
+<li>much smaller package, due to reduced BC sources</li>
+<li>new preferences GUI</li>
+<li>layout adjustment for localization</li>
+<li>signature bugfix</li>
+</ul>
+<h2>1.0.4</h2>
+<ul>
+<li>fixed another crash caused by some SDK bug with query builder</li>
+</ul>
+<h2>1.0.3</h2>
+<ul>
+<li>fixed crashes during encryption/signing and possibly key export</li>
+</ul>
+<h2>1.0.2</h2>
+<ul>
+<li>filterable key lists</li>
+<li>smarter pre-selection of encryption keys</li>
+<li>new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li>
+<li>fixes and additional features (key preselection) for K-9 Mail, new beta build available</li>
+</ul>
+<h2>1.0.1</h2>
+<ul>
+<li>GMail account listing was broken in 1.0.0, fixed again</li>
+</ul>
+<h2>1.0.0</h2>
+<ul>
+<li>K-9 Mail integration, APG supporting beta build of K-9 Mail</li>
+<li>support of more file managers (including ASTRO)</li>
+<li>Slovenian translation</li>
+<li>new database, much faster, less memory usage</li>
+<li>defined Intents and content provider for other apps</li>
+<li>bugfixes</li>
+</ul>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ro/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-ro/help_nfc_beam.html
new file mode 100644
index 000000000..88492731c
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_nfc_beam.html
@@ -0,0 +1,12 @@
+<html>
+<head></head>
+<body>
+<h2>How to receive keys</h2>
+<ol>
+<li>Go to your partners contacts and open the contact you want to share.</li>
+<li>Hold the two devices back to back (they have to be almost touching) and you’ll feel a vibration.</li>
+<li>After it vibrates you’ll see the content on your partners device turn into a card-like object with Star Trek warp speed-looking animation in the background.</li>
+<li>Tap the card and the content will then load on the your device.</li>
+</ol>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ro/help_start.html b/OpenKeychain/src/main/res/raw-ro/help_start.html
new file mode 100644
index 000000000..51a76c01e
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_start.html
@@ -0,0 +1,22 @@
+<html>
+<head></head>
+<body>
+<h2>Getting started</h2>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+
+<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:<br><img src="apps_k9"><br>K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!<br><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations"><br>Conversations</a>: Jabber/XMPP client<br><a href="market://details?id=org.lf_net.pgpunlocker"><img src="apps_pgpauth"><br>PGPAuth</a>: App to send a PGP-signed request to a server to open or close something, e.g. a door</p>
+
+<h2>I found a bug in OpenKeychain!</h2>
+<p>Please report the bug using the <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">issue tracker of OpenKeychain</a>.</p>
+
+<h2>Contribute</h2>
+<p>If you want to help us developing OpenKeychain by contributing code <a href="https://github.com/openpgp-keychain/openpgp-keychain#contribute-code">follow our small guide on Github</a>.</p>
+
+<h2>Translations</h2>
+<p>Help translating OpenKeychain! Everybody can participate at <a href="https://www.transifex.com/projects/p/openpgp-keychain/">OpenKeychain on Transifex</a>.</p>
+
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ro/help_wot.html b/OpenKeychain/src/main/res/raw-ro/help_wot.html
new file mode 100644
index 000000000..29790139b
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_wot.html
@@ -0,0 +1,17 @@
+<html>
+<head></head>
+<body>
+<h2>Web of Trust</h2>
+<p>The Web of Trust describes the part of PGP which deals with creation and bookkeeping of certifications. It provides mechanisms to help the user keep track of who a public key belongs to, and share this information with others; To ensure the privacy of encrypted communication, it is essential to know that the public key you encrypt to belongs to the person you think it does.</p>
+
+<h2>Support in OpenKeychain</h2>
+<p>There is only basic support for Web of Trust in OpenKeychain. This is a heavy work in progress and subject to changes in upcoming releases.</p>
+
+<h2>Trust Model</h2>
+<p>Trust evaluation is based on the simple assumption that all keys which have secret keys available are trusted. Public keys which contain at least one user id certified by a trusted key will be marked with a green dot in the key listings. It is not (yet) possible to specify trust levels for certificates of other known public keys.</p>
+
+<h2>Certifying keys</h2>
+<p>Support for key certification is available, and user ids can be certified individually. It is not yet possible to specify the level of trust or create local and other special types of certificates.</p>
+
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ro/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-ro/nfc_beam_share.html
new file mode 100644
index 000000000..083e055c7
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/nfc_beam_share.html
@@ -0,0 +1,11 @@
+<html>
+<head></head>
+<body>
+<ol>
+<li>Make sure that NFC is turned on in Settings &gt; More &gt; NFC and make sure that Android Beam is also on in the same section.</li>
+<li>Hold the two devices back to back (they have to be almost touching) and you'll feel a vibration.</li>
+<li>After it vibrates you'll see the content on your device turn into a card-like object with Star Trek warp speed-looking animation in the background.</li>
+<li>Tap the card and the content will then load on the other person’s device.</li>
+</ol>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ru/help_start.html b/OpenKeychain/src/main/res/raw-ru/help_start.html
index 9534acead..e1b7b0876 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Приступая</h2>
-<p>Для начала Вас нужен свой секретный ключ. Создайте его в меню раздела &quot;Ключи&quot; или импортируйте ранее созданный ключ. Позже вы сможете поделиться данными своего ключа с друзьями с помощью QR кода или NFC.</p>
+<p>Для начала Вас нужен свой секретный ключ. Создайте его в меню раздела "Ключи" или импортируйте ранее созданный ключ. Позже вы сможете поделиться данными своего ключа с друзьями с помощью QR кода или NFC.</p>
<p>Рекомендуется установить <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> для удобного выбора файлов и <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> для распознавания QR кодов. Перейдите по ссылкам на соответствующие страницы Google Play или F-Droid для дальнейшей установки.</p>
diff --git a/OpenKeychain/src/main/res/raw-tr/help_start.html b/OpenKeychain/src/main/res/raw-tr/help_start.html
index 3a681f8fa..51a76c01e 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_start.html
+++ b/OpenKeychain/src/main/res/raw-tr/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Getting started</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-uk/help_start.html b/OpenKeychain/src/main/res/raw-uk/help_start.html
index 5caf05cc0..0943beb92 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_start.html
+++ b/OpenKeychain/src/main/res/raw-uk/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Приступаючи до роботи</h2>
-<p>Спершу вам потрібний особистий секретний ключ. Створіть один через меню параметрів у „Ключі&quot; або імпортуйте наявні секретні ключі через &quot;Імпорт ключів&quot;. Після цього ви зможете завантажувати ключі ваших друзів чи обміняти їх через штрих-коди або NFC.</p>
+<p>Спершу вам потрібний особистий секретний ключ. Створіть один через меню параметрів у „Ключі" або імпортуйте наявні секретні ключі через "Імпорт ключів". Після цього ви зможете завантажувати ключі ваших друзів чи обміняти їх через штрих-коди або NFC.</p>
<p>Рекомендуємо вам встановити <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> для поліпшеного виділення файлів та <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> для сканування згенерованих штрих-кодів. Натискання посилань відкриє Google Play або F-Droid для встановлення.</p>
diff --git a/OpenKeychain/src/main/res/raw-zh/help_start.html b/OpenKeychain/src/main/res/raw-zh/help_start.html
index 705bbcceb..f37faec43 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_start.html
+++ b/OpenKeychain/src/main/res/raw-zh/help_start.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>快速上手</h2>
-<p>First you need a personal secret key. Create one via the option menus in &quot;Keys&quot; or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
diff --git a/OpenKeychain/src/main/res/raw-zh/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-zh/nfc_beam_share.html
index 78f00c9f7..99ffe4c12 100644
--- a/OpenKeychain/src/main/res/raw-zh/nfc_beam_share.html
+++ b/OpenKeychain/src/main/res/raw-zh/nfc_beam_share.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<ol>
-<li>確定在 &quot;設定&quot; &gt; &quot;更多內容…&quot; &gt; &quot;NFC&quot; 裡面已經開啟 NFC 和 Android Beam。</li>
+<li>確定在 "設定" &gt; "更多內容…" &gt; "NFC" 裡面已經開啟 NFC 和 Android Beam。</li>
<li>將兩部裝置背對背貼近(幾乎接觸),你會感覺到一股震動。</li>
<li>震動之後你會看見你夥伴的畫面變成卡片狀,並且背景帶有如 Star Trek 般的特效。</li>
<li>輕觸卡片,內容隨即顯示在你的裝置上。</li>
diff --git a/OpenKeychain/src/main/res/raw/help_about.html b/OpenKeychain/src/main/res/raw/help_about.html
index a9178d515..580ac5865 100644
--- a/OpenKeychain/src/main/res/raw/help_about.html
+++ b/OpenKeychain/src/main/res/raw/help_about.html
@@ -9,40 +9,41 @@ And don't add newlines before or after p tags because of transifex -->
<p><a href="http://www.openkeychain.org">OpenKeychain</a> is an OpenPGP implementation for Android.</p>
<p>License: GPLv3+</p>
-<h2>Developers OpenKeychain</h2>
+<h2>Developers</h2>
<ul>
-<li>Dominik Schürmann (Lead developer)</li>
-<li>Ash Hughes (crypto patches)</li>
+<li>Dominik Schürmann (Maintainer)</li>
+<li>Art O Cathain</li>
+<li>Ash Hughes</li>
<li>Brian C. Barnes</li>
-<li>Bahtiar 'kalkin' Gadimov (UI)</li>
+<li>Bahtiar 'kalkin' Gadimov</li>
+<li>Daniel Albert
<li>Daniel Hammann</li>
<li>Daniel Haß</li>
<li>Greg Witczak</li>
+<li>'mar-v-in'</li>
+<li>Markus Doits</li>
<li>Miroojin Bakshi</li>
<li>Nikhil Peter Raj</li>
<li>Paul Sarbinowski</li>
+<li>'Senecaso'</li>
<li>Sreeram Boyapati</li>
-<li>Vincent Breitmoser</li>
+<li>Thialfihar (APG 1.x)</li>
<li>Tim Bray</li>
-</ul>
-
-<h2>Developers APG 1.x</h2>
-<ul>
-<li>Thialfihar (Lead developer)</li>
-<li>'Senecaso' (QRCode, sign key, upload key)</li>
-<li>Markus Doits</li>
+<li>Vincent Breitmoser</li>
</ul>
<h2>Libraries</h2>
<ul>
<li><a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (Apache License v2)</li>
<li><a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (Apache License v2)</li>
+<li><a href="https://github.com/timbray/KeybaseLib">KeybaseLib</a> (Apache License v2)</li>
+<li><a href="https://github.com/JohnPersano/SuperToasts">SuperToasts</a> (Apache License v2)</li>
+<li><a href="https://github.com/splitwise/TokenAutoComplete">TokenAutoComplete</a> (Apache License v2)</li>
+<li><a href="https://github.com/rtreffer/minidns">MiniDNS</a> (Apache License v2)</li>
<li><a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache License v2)</li>
-<li><a href="https://github.com/Bearded-Hen/Android-Bootstrap">Android-Bootstrap</a> (MIT License)</li>
<li><a href="http://code.google.com/p/zxing/">ZXing</a> (Apache License v2)</li>
<li><a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (MIT X11 License)</li>
<li><a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache License v2)</li>
-<li><a href="https://github.com/johnkil/Android-AppMsg">Android AppMsg Library</a> (Apache License v2)</li>
</ul>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw/help_changelog.html b/OpenKeychain/src/main/res/raw/help_changelog.html
index 779aa696f..b2c798615 100644
--- a/OpenKeychain/src/main/res/raw/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw/help_changelog.html
@@ -5,6 +5,20 @@ And don't add newlines before or after p tags because of transifex -->
<head>
</head>
<body>
+<h2>2.8</h2>
+<ul>
+<li>So many bugs have been fixed in this release that we focus on the main new features</li>
+<li>Key edit: awesome new design, key revocation</li>
+<li>Key import: awesome new design, secure keyserver connections via hkps, keyserver resolving via DNS SRV records</li>
+<li>New first time screen</li>
+<li>New create key screen: autocompletion of name and email based on your personal Android accounts</li>
+<li>File encryption: awesome new design, support for encrypting multiple files</li>
+<li>New icons to show status of key (by Brennan Novak)</li>
+<li>Important bug fix: Importing of large key collections from a file is now possible</li>
+<li>Notification showing cached passphrases</li>
+</ul>
+<p>This release wouldn't be possible without the work of Vincent Breitmoser (GSoC 2014), mar-v-in (GSoC 2014), Daniel Albert, Art O Cathain, Daniel Haß, Tim Bray, Thialfihar</p>
+
<h2>2.7</h2>
<ul>
<li>Purple! (Dominik, Vincent)</li>
@@ -16,23 +30,23 @@ And don't add newlines before or after p tags because of transifex -->
<h2>2.6.1</h2>
<ul>
-<li>some fixes for regression bugs</li>
+<li>Some fixes for regression bugs</li>
</ul>
<h2>2.6</h2>
<ul>
-<li>key certifications (thanks to Vincent Breitmoser)</li>
-<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li>
-<li>new design for signature verification</li>
-<li>custom key length (thanks to Greg Witczak)</li>
-<li>fix share-functionality from other apps</li>
+<li>Key certifications (thanks to Vincent Breitmoser)</li>
+<li>Support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li>
+<li>New design for signature verification</li>
+<li>Custom key length (thanks to Greg Witczak)</li>
+<li>Fix share-functionality from other apps</li>
</ul>
<h2>2.5</h2>
<ul>
-<li>fix decryption of symmetric pgp messages/files</li>
-<li>refactored edit key screen (thanks to Ash Hughes)</li>
-<li>new modern design for encrypt/decrypt screens</li>
+<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Refactored edit key screen (thanks to Ash Hughes)</li>
+<li>New modern design for encrypt/decrypt screens</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)</li>
</ul>
@@ -41,48 +55,48 @@ And don't add newlines before or after p tags because of transifex -->
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p>
<ul>
-<li>new unified key list</li>
-<li>colorized key fingerprint</li>
-<li>support for keyserver ports</li>
-<li>deactivate possibility to generate weak keys</li>
-<li>much more internal work on the API</li>
-<li>certify user ids</li>
-<li>keyserver query based on machine-readable output</li>
-<li>lock navigation drawer on tablets</li>
-<li>suggestions for emails on creation of keys</li>
-<li>search in public key lists</li>
-<li>and much more improvements and fixes…</li>
+<li>New unified key list</li>
+<li>Colorized key fingerprint</li>
+<li>Support for keyserver ports</li>
+<li>Deactivate possibility to generate weak keys</li>
+<li>Much more internal work on the API</li>
+<li>Certify user ids</li>
+<li>Keyserver query based on machine-readable output</li>
+<li>Lock navigation drawer on tablets</li>
+<li>Suggestions for emails on creation of keys</li>
+<li>Search in public key lists</li>
+<li>And much more improvements and fixes…</li>
</ul>
<h2>2.3.1</h2>
<ul>
-<li>hotfix for crash when upgrading from old versions</li>
+<li>Hotfix for crash when upgrading from old versions</li>
</ul>
<h2>2.3</h2>
<ul>
-<li>remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)</li>
-<li>fix setting expiry dates on keys (thanks to Ash Hughes)</li>
-<li>more internal fixes when editing keys (thanks to Ash Hughes)</li>
-<li>querying keyservers directly from the import screen</li>
-<li>fix layout and dialog style on Android 2.2-3.0</li>
-<li>fix crash on keys with empty user ids</li>
-<li>fix crash and empty lists when coming back from signing screen</li>
+<li>Remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)</li>
+<li>Fix setting expiry dates on keys (thanks to Ash Hughes)</li>
+<li>More internal fixes when editing keys (thanks to Ash Hughes)</li>
+<li>Querying keyservers directly from the import screen</li>
+<li>Fix layout and dialog style on Android 2.2-3.0</li>
+<li>Fix crash on keys with empty user ids</li>
+<li>Fix crash and empty lists when coming back from signing screen</li>
<li>Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source</li>
-<li>fix upload of key from signing screen</li>
+<li>Fix upload of key from signing screen</li>
</ul>
<h2>2.2</h2>
<ul>
-<li>new design with navigation drawer</li>
-<li>new public key list design</li>
-<li>new public key view</li>
-<li>bug fixes for importing of keys</li>
-<li>key cross-certification (thanks to Ash Hughes)</li>
-<li>handle UTF-8 passwords properly (thanks to Ash Hughes)</li>
-<li>first version with new languages (thanks to the contributors on Transifex)</li>
-<li>sharing of keys via QR Codes fixed and improved</li>
-<li>package signature verification for API</li>
+<li>New design with navigation drawer</li>
+<li>New public key list design</li>
+<li>New public key view</li>
+<li>Bug fixes for importing of keys</li>
+<li>Key cross-certification (thanks to Ash Hughes)</li>
+<li>Handle UTF-8 passwords properly (thanks to Ash Hughes)</li>
+<li>First version with new languages (thanks to the contributors on Transifex)</li>
+<li>Sharing of keys via QR Codes fixed and improved</li>
+<li>Package signature verification for API</li>
</ul>
<h2>2.1.1</h2>
@@ -92,73 +106,73 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<h2>2.1</h2>
<ul>
-<li>lots of bug fixes</li>
-<li>new API for developers</li>
+<li>Lots of bug fixes</li>
+<li>New API for developers</li>
<li>PRNG bug fix by Google</li>
</ul>
<h2>2.0</h2>
<ul>
-<li>complete redesign</li>
-<li>share public keys via qr codes, nfc beam</li>
-<li>sign keys</li>
-<li>upload keys to server</li>
-<li>fixes import issues</li>
-<li>new AIDL API</li>
+<li>Complete redesign</li>
+<li>Share public keys via qr codes, nfc beam</li>
+<li>Sign keys</li>
+<li>Upload keys to server</li>
+<li>Fixes import issues</li>
+<li>New AIDL API</li>
</ul>
<h2>1.0.8</h2>
<ul>
-<li>basic keyserver support</li>
-<li>app2sd</li>
-<li>more choices for pass phrase cache: 1, 2, 4, 8, hours</li>
-<li>translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)</li>
-<li>bugfixes</li>
-<li>optimizations</li>
+<li>Basic keyserver support</li>
+<li>App2sd</li>
+<li>More choices for pass phrase cache: 1, 2, 4, 8, hours</li>
+<li>Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)</li>
+<li>Bugfixes</li>
+<li>Optimizations</li>
</ul>
<h2>1.0.7</h2>
<ul>
-<li>fixed problem with signature verification of texts with trailing newline</li>
-<li>more options for pass phrase cache time to live (20, 40, 60 mins)</li>
+<li>Fixed problem with signature verification of texts with trailing newline</li>
+<li>More options for pass phrase cache time to live (20, 40, 60 mins)</li>
</ul>
<h2>1.0.6</h2>
<ul>
-<li>account adding crash on Froyo fixed</li>
-<li>secure file deletion</li>
-<li>option to delete key file after import</li>
-<li>stream encryption/decryption (gallery, etc.)</li>
-<li>new options (language, force v3 signatures)</li>
-<li>interface changes</li>
-<li>bugfixes</li>
+<li>Account adding crash on Froyo fixed</li>
+<li>Secure file deletion</li>
+<li>Option to delete key file after import</li>
+<li>Stream encryption/decryption (gallery, etc.)</li>
+<li>New options (language, force v3 signatures)</li>
+<li>Interface changes</li>
+<li>Bugfixes</li>
</ul>
<h2>1.0.5</h2>
<ul>
<li>German and Italian translation</li>
-<li>much smaller package, due to reduced BC sources</li>
-<li>new preferences GUI</li>
-<li>layout adjustment for localization</li>
-<li>signature bugfix</li>
+<li>Much smaller package, due to reduced BC sources</li>
+<li>New preferences GUI</li>
+<li>Layout adjustment for localization</li>
+<li>Signature bugfix</li>
</ul>
<h2>1.0.4</h2>
<ul>
-<li>fixed another crash caused by some SDK bug with query builder</li>
+<li>Fixed another crash caused by some SDK bug with query builder</li>
</ul>
<h2>1.0.3</h2>
<ul>
-<li>fixed crashes during encryption/signing and possibly key export</li>
+<li>Fixed crashes during encryption/signing and possibly key export</li>
</ul>
<h2>1.0.2</h2>
<ul>
-<li>filterable key lists</li>
-<li>smarter pre-selection of encryption keys</li>
-<li>new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li>
-<li>fixes and additional features (key preselection) for K-9 Mail, new beta build available</li>
+<li>Filterable key lists</li>
+<li>Smarter pre-selection of encryption keys</li>
+<li>New Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li>
+<li>Fixes and additional features (key preselection) for K-9 Mail, new beta build available</li>
</ul>
<h2>1.0.1</h2>
@@ -169,11 +183,11 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<h2>1.0.0</h2>
<ul>
<li>K-9 Mail integration, APG supporting beta build of K-9 Mail</li>
-<li>support of more file managers (including ASTRO)</li>
+<li>Support of more file managers (including ASTRO)</li>
<li>Slovenian translation</li>
-<li>new database, much faster, less memory usage</li>
-<li>defined Intents and content provider for other apps</li>
-<li>bugfixes</li>
+<li>New database, much faster, less memory usage</li>
+<li>Defined Intents and content provider for other apps</li>
+<li>Bugfixes</li>
</ul>
</body>
</html> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values-ar/strings.xml b/OpenKeychain/src/main/res/values-ar/strings.xml
index 593fc2d11..4cf33460a 100644
--- a/OpenKeychain/src/main/res/values-ar/strings.xml
+++ b/OpenKeychain/src/main/res/values-ar/strings.xml
@@ -25,6 +25,9 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -32,6 +35,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml
index a7c24cd0e..2bb0ab5c8 100644
--- a/OpenKeychain/src/main/res/values-cs/strings.xml
+++ b/OpenKeychain/src/main/res/values-cs/strings.xml
@@ -1,17 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Vybrat veřejný klíč</string>
- <string name="title_select_secret_key">Vybrat veřjný klíč</string>
<string name="title_encrypt">Zašifrovat</string>
<string name="title_decrypt">Rozšifrovat</string>
<string name="title_authentication">Heslo</string>
- <string name="title_create_key">Vytvořit klíč</string>
<string name="title_edit_key">Editovat klíč</string>
<string name="title_preferences">Možnosti</string>
<string name="title_api_registered_apps">Appky</string>
<string name="title_key_server_preference">Nastavení keyservrů</string>
- <string name="title_set_passphrase">Nastavit heslo</string>
+ <string name="title_change_passphrase">Změnit heslo</string>
<string name="title_encrypt_to_file">Zašifrovat do souboru</string>
<string name="title_decrypt_to_file">Rozšifrovat do souboru</string>
<string name="title_import_keys">Importovat klíče</string>
@@ -19,6 +16,8 @@
<string name="title_export_keys">Exportovat klíče</string>
<string name="title_key_not_found">Klíč nebyl nalezen</string>
<string name="title_send_key">Nahrát na keyserver</string>
+ <string name="title_certify_key">Certifikovat identity</string>
+ <string name="title_key_details">Detaily klíče</string>
<string name="title_help">Nápověda</string>
<!--section-->
<string name="section_user_ids">Identity</string>
@@ -26,6 +25,10 @@
<string name="section_general">Obecné</string>
<string name="section_defaults">Výchozí hodnoty</string>
<string name="section_advanced">Pokročilé</string>
+ <string name="section_actions">Akce</string>
+ <string name="section_certification_key">Klíč použitý pro certifikaci</string>
+ <string name="section_upload_key">Uploadovat klíč</string>
+ <string name="section_key_server">Keyserver</string>
<!--button-->
<string name="btn_encrypt_file">Zaširovat a uložit soubor</string>
<string name="btn_save">Uložit</string>
@@ -33,41 +36,31 @@
<string name="btn_delete">Smazat</string>
<string name="btn_no_date">Nic</string>
<string name="btn_okay">OK</string>
- <string name="btn_change_passphrase">Změnit nové heslo</string>
- <string name="btn_set_passphrase">Nastavit nové heslo</string>
<string name="btn_export_to_server">Nahrát na keyserver</string>
<string name="btn_next">Další</string>
<string name="btn_back">Zpět</string>
+ <string name="btn_lookup_key">Vyhledat klíč</string>
<!--menu-->
<string name="menu_preferences">Nastavení</string>
+ <string name="menu_help">Nápověda</string>
<string name="menu_export_key">Exportovat do souboru</string>
<string name="menu_delete_key">Smazat klíč</string>
- <string name="menu_create_key">Vytvořit klíč</string>
- <string name="menu_create_key_expert">Vytvořit klíč (pokročilé)</string>
<string name="menu_search">Hledat</string>
- <string name="menu_key_server">Keyserver...</string>
- <string name="menu_update_key">Obnovit z keyservru</string>
- <string name="menu_export_key_to_server">Obnovit na keyserveru</string>
- <string name="menu_share">Sdílet...</string>
- <string name="menu_share_qr_code">pomocí QR kódu</string>
- <string name="menu_share_nfc">pomocí NFC</string>
<string name="menu_beam_preferences">Beam settings</string>
+ <string name="menu_key_edit_cancel">Zrušit</string>
+ <string name="menu_encrypt_to">Zašifrovat do...</string>
+ <string name="menu_select_all">Vybrat vše</string>
+ <string name="menu_add_keys">Přidat klíče</string>
<!--label-->
- <string name="label_sign">Podepsat</string>
<string name="label_message">Zpráva</string>
<string name="label_file">Soubor</string>
<string name="label_no_passphrase">Bez hesla</string>
<string name="label_passphrase">Heslo</string>
- <string name="label_passphrase_again">Znovu</string>
<string name="label_algorithm">Algoritmus</string>
<string name="label_ascii_armor">ASCII Armor</string>
- <string name="label_select_public_keys">Příjemci</string>
- <string name="label_delete_after_encryption">Smazat po zašifrování</string>
<string name="label_delete_after_decryption">Smazat po rozšifrování</string>
<string name="label_encryption_algorithm">Šifrovací algoritmus</string>
<string name="label_hash_algorithm">Hashovací algoritmus</string>
- <string name="label_asymmetric">veřejným klíčem</string>
- <string name="label_symmetric">heslem</string>
<string name="label_passphrase_cache_ttl">Cache hesel</string>
<string name="label_message_compression">Komprimovat zprávu</string>
<string name="label_file_compression">Komprimovat soubor</string>
@@ -82,11 +75,15 @@
<string name="label_comment">Komentář</string>
<string name="label_email">Email</string>
<string name="label_send_key">Po vytvoření nahrt na vybraný keyserver</string>
+ <string name="label_fingerprint">Otisk</string>
+ <string name="expiry_date_dialog_title">Nastavit datum expirace</string>
+ <string name="user_id_no_name">&lt;beze jména&gt;</string>
<string name="none">&lt;žádný&gt;</string>
<string name="no_key">&lt;žádný klíč&gt;</string>
<string name="can_encrypt">slouží k šifrovní</string>
<string name="can_sign">slouží k podpisu</string>
<string name="expired">po epiraci</string>
+ <string name="revoked">revokovat</string>
<string name="secret_key">Tajný klíč:</string>
<!--choice-->
<string name="choice_none">Žádný</string>
@@ -101,15 +98,21 @@
<string name="choice_2hours">2 hodiny</string>
<string name="choice_4hours">4 hodiny</string>
<string name="choice_8hours">8 hodin</string>
+ <string name="choice_forever">navždy</string>
<string name="dsa">DSA</string>
+ <string name="elgamal">ElGamal</string>
+ <string name="rsa">RSA</string>
<string name="filemanager_title_open">Otevřít...</string>
<string name="warning">Varovnání</string>
<string name="error">Chyba</string>
<string name="error_message">Chyba: %s</string>
<!--key flags-->
+ <string name="flag_certify">Certifikovat</string>
+ <string name="flag_sign">Podepsat</string>
+ <string name="flag_encrypt">Zašifrovat</string>
+ <string name="flag_authenticate">Authentikovat</string>
<!--sentences-->
<string name="wrong_passphrase">Špatné heslo.</string>
- <string name="set_a_passphrase">Nejprve nastavit heslo.</string>
<string name="no_filemanager_installed">Není nainstalován žádný compatibilní správce souborů.</string>
<string name="passphrases_do_not_match">Hesla se neshodují.</string>
<string name="passphrase_must_not_be_empty">Prosím zadejte heslo.</string>
@@ -124,7 +127,9 @@
<string name="specify_file_to_encrypt_to">Prosím specifikujte do kterého souboru zašifrovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
<string name="specify_file_to_decrypt_to">Prosím specifikujte do kterého souboru rozšifrovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
<string name="specify_file_to_export_to">Prosím specifikujte do kterého souboru exportovat.\nVAROVÁNÍ: Pokud soubor již existuje, bude přepsán.</string>
+ <string name="key_deletion_confirmation_multi">Opravdu si přejete smazat všechny vybrané veřejné klíče?\nToto nebude možné vzít zpět!</string>
<string name="secret_key_deletion_confirmation">Opravdu chcete smazat TAJNÝ klíč \'%s\'?\nToto je nevratná operace!</string>
+ <string name="public_key_deletetion_confirmation">Opravdu chcete smazat veřejný klíč \'%s\'?\nToto nebude možné vrátit zpět!</string>
<string name="key_exported">Úspěšně exportován 1 klíč.</string>
<string name="keys_exported">Úspěšně exportován %d klíč.</string>
<string name="no_keys_exported">Žádný kláč pro export.</string>
@@ -132,6 +137,8 @@
<string name="key_not_found">Nemohu najít klíč %08X.</string>
<string name="key_send_success">Úspěšně nahráno na keyserver.</string>
<string name="list_empty">Seznam je prázný!</string>
+ <string name="key_copied_to_clipboard">Klíč byl zkopírován do schránky!</string>
+ <string name="key_too_big_for_sharing">Klíč je příliš velký aby byl sdílen pomocí této metody!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
@@ -140,32 +147,153 @@
<string name="error_no_secret_key_found">žádný vhodný tajný klíč nenalezen</string>
<string name="error_external_storage_not_ready">externí úložiště není připraveno</string>
<string name="error_key_size_minimum512bit">délka klíče musí být alespoň 512 bitů</string>
- <string name="error_master_key_must_not_be_el_gamal">hlavní klíč nemůže být typu ElGamal</string>
<string name="error_unknown_algorithm_choice">neznámý typ algoritmu</string>
+ <string name="error_user_id_no_email">žádný email nenalezen</string>
<string name="error_key_needs_a_user_id">potřebuji alespoň jednu identitu</string>
- <string name="error_main_user_id_must_not_be_empty">hlavní identita nesmí být prázdná</string>
- <string name="error_key_needs_master_key">potřebuji alespoň hlavní klíč</string>
+ <string name="error_no_signature_passphrase">nebylo poskytnuto heslo</string>
+ <string name="error_no_signature_key">nebyl poskytnut podpisový klíč</string>
+ <string name="error_invalid_data">kryptovaná data nejsou správná</string>
+ <string name="error_integrity_check_failed">selhala kontrola integrity! Data byla pozměněna!</string>
+ <string name="error_wrong_passphrase">špatné heslo</string>
+ <string name="error_could_not_extract_private_key">nebylo možné extrahovat privátní klíč</string>
<!--errors without preceeding Error:-->
+ <string name="error_jelly_bean_needed">Musíte mít Android 4.1 abyste mohli používat Androidí NFC Beam technologii!</string>
+ <string name="error_nfc_needed">NFC není na vašem zařízení k dispozici!</string>
+ <string name="error_nothing_import">Žádný klíč nenalezen!</string>
+ <string name="error_generic_report_bug">Nastala obecná chyba, prosím vytvořte nový bug report pro OpenKeychain.</string>
<!--results shown after decryption/verification-->
<!--progress dialogs, usually ending in '…'-->
+ <string name="progress_done">Hotovo.</string>
+ <string name="progress_cancel">Zrušit</string>
+ <string name="progress_saving">ukládám...</string>
+ <string name="progress_importing">importuji...</string>
+ <string name="progress_exporting">exportuji...</string>
+ <string name="progress_building_key">vytvářím klíč...</string>
+ <string name="progress_building_master_key">vytvářím hlavní klíč...</string>
+ <string name="progress_extracting_signature_key">extrahuji podpisový klíč...</string>
+ <string name="progress_extracting_key">extrahuji klíč...</string>
+ <string name="progress_preparing_streams">připravuji streamy...</string>
+ <string name="progress_encrypting">šifruji data...</string>
+ <string name="progress_decrypting">dešifruji data...</string>
+ <string name="progress_preparing_signature">připravuji podpis...</string>
+ <string name="progress_generating_signature">generuji podpis...</string>
+ <string name="progress_processing_signature">zpracovávám podpis...</string>
+ <string name="progress_verifying_signature">verifikuji podpis...</string>
+ <string name="progress_signing">podepisuji...</string>
+ <string name="progress_reading_data">načítám data...</string>
+ <string name="progress_finding_key">hledám klíč...</string>
+ <string name="progress_decompressing_data">rozbaluji data...</string>
+ <string name="progress_verifying_integrity">verifikuji integritu...</string>
+ <string name="progress_deleting_securely">mažu \'%s\' bezpečně...</string>
<!--action strings-->
+ <string name="hint_public_keys">Jméno/Email/ID klíče</string>
<!--key bit length selections-->
+ <string name="key_size_512">512</string>
+ <string name="key_size_768">768</string>
+ <string name="key_size_1024">1024</string>
+ <string name="key_size_1536">1536</string>
+ <string name="key_size_2048">2048</string>
+ <string name="key_size_3072">3072</string>
+ <string name="key_size_4096">4096</string>
+ <string name="key_size_8192">8192</string>
+ <string name="key_size_custom">Vlastní velikost klíče</string>
+ <string name="key_size_custom_info">Napište vlastní délku klíče (v bitech):</string>
+ <string name="key_size_custom_info_rsa">délka RSA klíče musí být větší než 1024 a nejvýše 8192. Zároveň musí být dělitelná 8mi.</string>
+ <string name="key_size_custom_info_dsa">Délka DSA klíče musí být alespoň 512 a nejvýše 1024. Zároveň musí být dělitelná 64.</string>
<!--compression-->
+ <string name="compression_fast">rychle</string>
+ <string name="compression_very_slow">velmi pomalu</string>
<!--Help-->
+ <string name="help_tab_start">Začít</string>
+ <string name="help_tab_faq">FAQ</string>
+ <string name="help_tab_wot">Síť důvěry</string>
+ <string name="help_tab_nfc_beam">NFC Beam</string>
+ <string name="help_tab_changelog">Historie změn</string>
+ <string name="help_tab_about">O aplikaci</string>
+ <string name="help_about_version">Verze:</string>
<!--Import-->
+ <string name="import_import">Importovat vybrané klíče</string>
+ <string name="import_qr_code_wrong">QR kód nerozpoznán! Zkuste to znovu prosím!</string>
+ <string name="import_qr_code_too_short_fingerprint">Fingerprint je příliš krátký (&lt; 16 znaků)</string>
<!--Import result toast-->
<!--Intent labels-->
+ <string name="intent_decrypt_file">Dešifrovat soubor pomocí OpenKeychain</string>
+ <string name="intent_import_key">Importovat kíč pomocí OpenKeychain</string>
+ <string name="intent_send_encrypt">Zašifrovat pomocí OpenKeychain</string>
+ <string name="intent_send_decrypt">Dešifrovat pomocí OpenKeychain</string>
<!--Remote API-->
+ <string name="api_no_apps">Neregistrovaná appka!\n\nSeznam podporovaných aplikací třetích stran je možo nalézt v \'Nápovědě\'!</string>
+ <string name="api_settings_show_info">Zobrazit pokročilé informace</string>
+ <string name="api_settings_hide_info">Schovat pokročilé informace</string>
+ <string name="api_settings_show_advanced">Zobrazit pokročilá nastavení</string>
+ <string name="api_settings_hide_advanced">Schovat pokročilá nastavení</string>
+ <string name="api_settings_no_key">Žádný klíč nebyl vybrán</string>
+ <string name="api_settings_select_key">Vybrat klíč</string>
+ <string name="api_settings_create_key">Vytvořit nový klíč pro tento účet</string>
+ <string name="api_settings_save">Uložit</string>
+ <string name="api_settings_cancel">Zrušit</string>
+ <string name="api_settings_revoke">Zneplatnit přístup</string>
+ <string name="api_settings_delete_account">Smazat účet</string>
+ <string name="api_settings_package_name">Jméno balíčku</string>
+ <string name="api_settings_package_signature">SHA-256 z podpisu balíčku</string>
+ <string name="api_settings_accounts">Účty</string>
+ <string name="api_settings_accounts_empty">Žádné účty nejsou specifikovány pro tuto appku.</string>
+ <string name="api_register_text">Zobrazená appka chce zašifrovat/rozšifrovat zprávy a podepsat je vačím jménem.\nPovolit přístup?\n\nVAROVÁNÍ: Pokud nevíte proč se tato obrazovka objevila, zamítněte přístup! Také můžete zneplatnit přístup jindy v obrazovce \'Appky\'.</string>
+ <string name="api_register_allow">Povolit přístup</string>
+ <string name="api_register_disallow">Zamítnout přístup</string>
+ <string name="api_register_error_select_key">Prosím vyberte klíč!</string>
+ <string name="api_select_pub_keys_missing_text">Nebyl nalezen žádný veřejný klíč pro tyto identity:</string>
+ <string name="api_select_pub_keys_dublicates_text">Existuje více jak jeden veřejný klíč pro tyto identity:</string>
+ <string name="api_select_pub_keys_text">Zkontrolujte prosím seznam příjemců!</string>
+ <string name="api_error_wrong_signature">Selhala kontrola podpisu! Instalovali jste tuto appku z jiného zdroje? Pokud jste si jistí, že toto není útok, zneplatněte registraci této appky v OpenKeychain a poté ji znovu zaregistrujte.</string>
<!--Share-->
+ <string name="share_qr_code_dialog_title">Sdílet pomocí QR kódu</string>
+ <string name="share_nfc_dialog">Sdílet pomocí NFC</string>
<!--Key list-->
+ <string name="key_list_empty_text1">Žádné klíče nejsou zatím k dispozici...</string>
+ <string name="key_list_empty_text2">Můžete začít pomocí</string>
+ <string name="key_list_empty_text3">nebo</string>
+ <string name="key_list_empty_button_create">vytvářím váš vlastní klíč</string>
<!--Key view-->
+ <string name="key_view_action_edit">Editovat klíč</string>
+ <string name="key_view_action_encrypt">Šifruji pomocí těchto klíčů.</string>
+ <string name="key_view_action_certify">Certifikovat identity</string>
+ <string name="key_view_tab_main">Hlavní info</string>
+ <string name="key_view_tab_certs">Certifikáty</string>
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
+ <string name="nav_encrypt">Podepisuji a šifruji</string>
+ <string name="nav_decrypt">Dešifruji a kontroluji</string>
+ <string name="nav_apps">Appky</string>
+ <string name="drawer_open">Otevřít navigační panel</string>
+ <string name="drawer_close">Zavří navigační panel</string>
+ <string name="my_keys">Moje Klíče</string>
<!--hints-->
<!--certs-->
+ <string name="cert_default">výchozí</string>
+ <string name="cert_none">žádný</string>
+ <string name="cert_casual">příležitostně</string>
+ <string name="cert_positive">pozitivní</string>
+ <string name="cert_revoke">revokované</string>
+ <string name="cert_verify_ok">OK</string>
+ <string name="cert_verify_failed">selhalo!</string>
+ <string name="cert_verify_error">chyba!</string>
+ <string name="cert_verify_unavailable">klíč není k dispozici</string>
<!--Import Public log entries-->
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <string name="label_user_id">Identita</string>
+ <string name="unknown_uid">&lt;neznámý&gt;</string>
+ <string name="empty_certs">Žádné certifikáty pro tento klíč</string>
+ <string name="label_revocation">Důvod revokace</string>
+ <string name="label_verify_status">Stav ověření</string>
+ <string name="label_cert_type">Typ</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 9d9868457..e6e594708 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -1,19 +1,17 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Öffentlichen Schlüssel auswählen</string>
- <string name="title_select_secret_key">Privaten Schlüssel auswählen</string>
+ <string name="title_select_recipients">Wähle Schlüssel</string>
+ <string name="title_select_secret_key">Wähle Deinen Schlüssel</string>
<string name="title_encrypt">Verschlüsseln</string>
<string name="title_decrypt">Entschlüsseln</string>
<string name="title_authentication">Passwort</string>
- <string name="title_create_key">Schlüssel erstellen</string>
+ <string name="title_create_key">Erzeuge Deinen Schlüssel</string>
<string name="title_edit_key">Schlüssel bearbeiten</string>
<string name="title_preferences">Einstellungen</string>
<string name="title_api_registered_apps">Apps</string>
- <string name="title_key_server_preference">Schlüsselserver</string>
- <string name="title_change_passphrase">Passphrase ändern</string>
- <string name="title_set_passphrase">Passwort setzen</string>
- <string name="title_share_with">Teilen über...</string>
+ <string name="title_key_server_preference">Schlüsselserver Einstellungen</string>
+ <string name="title_change_passphrase">Passwort ändern</string>
<string name="title_share_fingerprint_with">Teile Fingerabdruck über…</string>
<string name="title_share_key">Teile Schlüssel über...</string>
<string name="title_share_file">Datei teilen mit…</string>
@@ -27,66 +25,43 @@
<string name="title_certify_key">Identitäten beglaubigen</string>
<string name="title_key_details">Schlüsseldetails</string>
<string name="title_help">Hilfe</string>
+ <string name="title_log_display">Log</string>
<!--section-->
<string name="section_user_ids">Identitäten</string>
<string name="section_keys">Unterschlüssel</string>
<string name="section_general">Allgemein</string>
<string name="section_defaults">Standardwerte</string>
<string name="section_advanced">Fortgeschrittene Einstellungen</string>
- <string name="section_master_key">Hauptschlüssel</string>
- <string name="section_master_user_id">Hauptidentität</string>
<string name="section_actions">Aktionen</string>
<string name="section_share_key">Gesamter Schlüssel</string>
<string name="section_certification_key">Mit diesem Schlüssel beglaubigen</string>
<string name="section_upload_key">Schlüssel hochladen</string>
<string name="section_key_server">Schlüsselserver</string>
- <string name="section_encrypt_and_or_sign">Verschlüsseln und/oder Signieren</string>
- <string name="section_decrypt_verify">Entschlüsseln und Verifizieren</string>
<string name="section_fingerprint">Fingerabdruck</string>
<string name="section_key_to_certify">Zu beglaubigender Schlüssel</string>
<!--button-->
- <string name="btn_certify">Beglaubigen</string>
<string name="btn_decrypt_verify_file">Datei entschlüsseln, verifizieren und speichern</string>
<string name="btn_decrypt_verify_message">Entschlüsseln und verifizieren</string>
- <string name="btn_decrypt_verify_clipboard">Aus der Zwischenablage</string>
<string name="btn_encrypt_file">Datei verschlüsseln und speichern</string>
<string name="btn_save">Speichern</string>
<string name="btn_do_not_save">Abbrechen</string>
<string name="btn_delete">Löschen</string>
<string name="btn_no_date">Keine</string>
<string name="btn_okay">Okay</string>
- <string name="btn_change_passphrase">Passwort ändern</string>
- <string name="btn_set_passphrase">Neues Passwort setzen</string>
<string name="btn_export_to_server">Auf Schlüsselserver hochladen</string>
<string name="btn_next">Weiter</string>
<string name="btn_back">Zurück</string>
- <string name="btn_clipboard">Zwischenablage</string>
- <string name="btn_share">Teilen mit…</string>
<string name="btn_lookup_key">Schlüssel nachschlagen</string>
- <string name="btn_encryption_advanced_settings_show">Erweiterte Einstellungen anzeigen</string>
- <string name="btn_encryption_advanced_settings_hide">Erweiterte Einstellungen verbergen</string>
- <string name="btn_share_encrypted_signed">Verschlüsselt/signierte Nachricht teilen…</string>
<string name="btn_view_cert_key">Beglaubigungsschlüssel anzeigen</string>
+ <string name="btn_create_key">Erzeuge Schlüssel</string>
<!--menu-->
<string name="menu_preferences">Einstellungen</string>
<string name="menu_help">Hilfe</string>
<string name="menu_export_key">In Datei exportieren</string>
<string name="menu_delete_key">Schlüssel löschen</string>
- <string name="menu_create_key">Schlüssel erstellen</string>
- <string name="menu_create_key_expert">Schlüssel erstellen (Experte)</string>
+ <string name="menu_create_key">Erzeuge meinen Schlüssel</string>
+ <string name="menu_import_existing_key">Importiere existierenden Schlüssel</string>
<string name="menu_search">Suchen</string>
- <string name="menu_key_server">Schlüsselserver…</string>
- <string name="menu_update_key">Von einem Schlüsselserver aktualisieren</string>
- <string name="menu_export_key_to_server">Auf Schlüsselserver hochladen</string>
- <string name="menu_share">Teilen…</string>
- <string name="menu_share_title_fingerprint">Teile Fingerabdruck…</string>
- <string name="menu_share_title">Teile gesamten Schlüssel…</string>
- <string name="menu_share_default_fingerprint">mit…</string>
- <string name="menu_share_default">mit…</string>
- <string name="menu_share_qr_code">mit QR-Code</string>
- <string name="menu_share_qr_code_fingerprint">mit QR-Code</string>
- <string name="menu_share_nfc">mit NFC</string>
- <string name="menu_copy_to_clipboard">In die Zwischenablage kopieren</string>
<string name="menu_beam_preferences">Beam-Einstellungen</string>
<string name="menu_key_edit_cancel">Abbrechen</string>
<string name="menu_encrypt_to">Verschlüsseln nach…</string>
@@ -95,22 +70,18 @@
<string name="menu_export_all_keys">Alle Schlüssel exportieren</string>
<string name="menu_advanced">Erweiterte Info anzeigen</string>
<!--label-->
- <string name="label_sign">Signieren</string>
<string name="label_message">Nachricht</string>
<string name="label_file">Datei</string>
<string name="label_no_passphrase">Kein Passwort</string>
<string name="label_passphrase">Passwort</string>
- <string name="label_passphrase_again">Wiederholen</string>
+ <string name="label_passphrase_again">Passwort wiederholen</string>
<string name="label_algorithm">Algorithmus</string>
<string name="label_ascii_armor">ASCII-Armor</string>
- <string name="label_select_public_keys">Empfänger</string>
- <string name="label_delete_after_encryption">Nach Verschlüsselung löschen</string>
+ <string name="label_conceal_pgp_application">Lass andere wissen dass du OpenKeychain nutzt</string>
+ <string name="label_conceal_pgp_application_summary">Fügt \'OpenKeychain v2.7\' zu OpenPGP Signaturen, Daten und exportierten Schlüsseln hinzu</string>
<string name="label_delete_after_decryption">Nach Entschlüsselung löschen</string>
- <string name="label_share_after_encryption">Nach Verschlüsselung teilen</string>
<string name="label_encryption_algorithm">Verschlüsselungsalgorithmus</string>
<string name="label_hash_algorithm">Hash-Algorithmus</string>
- <string name="label_asymmetric">mit Öffentlichem Schlüssel</string>
- <string name="label_symmetric">mit Passwort</string>
<string name="label_passphrase_cache_ttl">Passwort-Cache</string>
<string name="label_message_compression">Nachrichten-Komprimierung</string>
<string name="label_file_compression">Datei-Komprimierung</string>
@@ -127,12 +98,7 @@
<string name="label_email">E-Mail</string>
<string name="label_send_key">Schlüssel nach Beglaubigung auf ausgewählten Schlüsselserver hochladen</string>
<string name="label_fingerprint">Fingerabdruck</string>
- <string name="select_keys_button_default">Auswählen</string>
<string name="expiry_date_dialog_title">Ablaufdatum festsetzen</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d ausgewählt</item>
- <item quantity="other">%d ausgewählt</item>
- </plurals>
<string name="user_id_no_name">&lt;kein Name&gt;</string>
<string name="none">&lt;keine&gt;</string>
<string name="no_key">&lt;kein Schlüssel&gt;</string>
@@ -179,7 +145,6 @@
<string name="flag_authenticate">Authentifizieren</string>
<!--sentences-->
<string name="wrong_passphrase">Falsches Passwort.</string>
- <string name="set_a_passphrase">Zuerst muss ein Passwort gesetzt werden.</string>
<string name="no_filemanager_installed">Kein passender Dateimanager installiert.</string>
<string name="passphrases_do_not_match">Die Passwörter stimmten nicht überein.</string>
<string name="passphrase_must_not_be_empty">Bitte ein Passwort eingeben.</string>
@@ -198,15 +163,12 @@
<string name="specify_file_to_export_to">Bitte angeben, in welche Datei exportiert werden soll.\nWARNUNG: Datei wird überschrieben, wenn sie bereits existiert. </string>
<string name="key_deletion_confirmation_multi">Möchtest du wirklich alle ausgewählten öffentlichen Schlüssel löschen?\nDies kann nicht rückgängig gemacht werden!</string>
<string name="secret_key_deletion_confirmation">Soll der PRIVATE Schlüssel \'%s\' wirklich gelöscht werden?\nDies kann nicht rückgängig gemacht werden!</string>
- <string name="ask_save_changed_key">Es wurden am Schlüsselbund Veränderungen vorgenommen. Sollen dies gespeichert werden?</string>
- <string name="ask_empty_id_ok">Es wurde eine leere Identität hinzugefügt. Wirklich fortfahren?</string>
<string name="public_key_deletetion_confirmation">Soll der öffentliche Schlüssel \'%s\' wirklich gelöscht werden?\nDies kann nicht rückgängig gemacht werden! </string>
- <string name="also_export_secret_keys">Private Schlüssel auch exportieren</string>
+ <string name="also_export_secret_keys">Exportiere auch private Schlüssel</string>
<string name="key_exported">1 Schlüssel erfolgreich exportiert.</string>
<string name="keys_exported">%d Schlüssel erfolgreich exportiert.</string>
<string name="no_keys_exported">Keine Schlüssel exportiert.</string>
<string name="key_creation_el_gamal_info">Beachte: Nur Unterschlüssel unterstützen ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Beachte: RSA-Schlüssel mit einer Schlüssellänge von 1024-Bits oder weniger werden als unsicher angesehen und können daher nicht für neue Schlüssel erstellt werden.</string>
<string name="key_not_found">Schlüssel %08X konnte nicht gefunden werden.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d schlechter privater Schlüssel ignoriert. Evtl. wurde er mit folgender Option exportiert:\n --export-secret-subkeys\nUnbedingt mit der Option \n --export-secret-keys\nexportieren.</item>
@@ -218,7 +180,6 @@
<string name="nfc_successful">Schlüssel erfolgreich mit NFC-Beam gesendet!</string>
<string name="key_copied_to_clipboard">Schlüssel wurde in die Zwischenablage kopiert!</string>
<string name="fingerprint_copied_to_clipboard">Fingerabdruck wurde in die Zwischenablage kopiert!</string>
- <string name="key_has_already_been_certified">Schlüssel wurde bereits beglaubigt</string>
<string name="select_key_to_certify">Bitte wähle einen Schlüssel um zu Beglaubigen!</string>
<string name="key_too_big_for_sharing">Schlüssel ist zu groß um so geteilt zu werden!</string>
<!--errors
@@ -229,32 +190,29 @@
<string name="error_no_secret_key_found">kein geeigneter privater Schlüssel gefunden</string>
<string name="error_external_storage_not_ready">Externes Laufwerk ist nicht bereit</string>
<string name="error_key_size_minimum512bit">Schlüssel muss mindestens 512 Bit lang sein</string>
- <string name="error_master_key_must_not_be_el_gamal">Der Hauptschlüssel kann kein ElGamal Schlüssel sein</string>
<string name="error_unknown_algorithm_choice">Unbekannte Auswahl für Algorithmus</string>
<string name="error_user_id_no_email">keine E-Mail gefunden</string>
<string name="error_key_needs_a_user_id">Mindestens eine Identität wird benötigt</string>
- <string name="error_main_user_id_must_not_be_empty">Hauptidentität darf nicht leer sein</string>
- <string name="error_key_needs_master_key">Mindestens ein Hauptschlüssel wird benötigt</string>
<string name="error_no_signature_passphrase">kein Passwort angegeben</string>
<string name="error_no_signature_key">kein Signaturschlüssel angegeben</string>
<string name="error_invalid_data">Verschlüsselte Daten nicht gültig</string>
<string name="error_integrity_check_failed">Integritätscheck fehlgeschlagen! Die Daten wurden modifiziert!</string>
<string name="error_wrong_passphrase">falsches Passwort</string>
- <string name="error_saving_keys">Es trat ein Fehler beim Speichern einiger Schlüssel auf</string>
<string name="error_could_not_extract_private_key">Privater Schlüssel konnte nicht extrahiert werden</string>
- <string name="error_expiry_must_come_after_creation">Ablaufdatum muss später sein als das Erstellungsdatum</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Binäre Daten ohne ohne Datei im Dateisystem werden nicht unterstützt.</string>
<string name="error_jelly_bean_needed">Android 4.1 wird benötigt um Androids NFC Beam nutzen zu können!</string>
<string name="error_nfc_needed">NFC steht auf diesem Gerät nicht zur Verfügung!</string>
- <string name="error_query_too_short">zu kurze Schlüsselanfrage</string>
- <string name="error_too_many_responses">Die Schlüsselanfrage liefert zu viele Ergebnisse. Bitte verfeinern sie sie Anfrage.</string>
+ <string name="error_nothing_import">Keine Schlüssel gefunden!</string>
+ <string name="error_query_too_short">Suchanfrage zu kurz. Bitte ändere deine Andrage!</string>
+ <string name="error_searching_keys">Ein Fehler ist beim Suchen der Schlüssel aufgetreten.</string>
+ <string name="error_too_many_responses">Die Schlüsselsuche ergab zu viele Treffer. Bitte präzisiere deine Anfrage!</string>
+ <string name="error_too_short_or_too_many_responses">Keine oder zu viele Schlüssel wurden gefunden. Bitte verbessere deine Anfrage!</string>
+ <string name="error_import_no_valid_keys">Keine gültigen Schlüssel in Datei/Zwischenablage gefunden!</string>
<string name="error_generic_report_bug">Ein allgemeiner Fehler trat auf, bitte schreiben Sie einen neuen Bugreport für OpenKeychain.</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">Ein Teil der geladenen Datei ist ein gültiges OpenPGP Objekt aber kein OpenPGP Schlüssel</item>
<item quantity="other">Teile der geladenen Dateien sind gültige OpenPGP Objekte aber keine OpenPGP Schlüssel</item>
</plurals>
- <string name="error_change_something_first">Es müssen vorm Speichern erst Veränderungen am Schlüsselbund vorgenommen werden</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Ungültige Signatur!</string>
<string name="decrypt_result_signature_unknown_pub_key">Unbekannter öffentlicher Schlüssel</string>
@@ -270,19 +228,23 @@
<string name="progress_saving">wird gespeichert…</string>
<string name="progress_importing">wird importiert…</string>
<string name="progress_exporting">wird exportiert…</string>
+ <string name="progress_uploading">hochladen...</string>
<string name="progress_building_key">Schlüssel wird erstellt…</string>
- <string name="progress_certifying_master_key">Hauptschlüssel wird beglaubigt…</string>
<string name="progress_building_master_key">Hauptschlüssel wird erstellt…</string>
- <string name="progress_adding_sub_keys">Unterschlüssel wird hinzugefügt…</string>
- <string name="progress_saving_key_ring">Schlüssel wird gespeichert…</string>
+ <string name="progress_generating_rsa">erzeuge neuen RSA Schlüssel...</string>
+ <string name="progress_generating_dsa">erzeuge neuen DSA Schlüssel...</string>
+ <string name="progress_generating_elgamal">erzeuge neuen ElGamal Schlüssel...</string>
+ <string name="progress_modify">verändere Schlüsselbund...</string>
+ <string name="progress_modify_unlock">entsperre Schlüsselbund...</string>
+ <string name="progress_modify_adduid">füge User ID hinzu...</string>
+ <string name="progress_modify_primaryuid">ändere Haupt User ID...</string>
+ <string name="progress_modify_subkeychange">verändere Unterschlüssel...</string>
+ <string name="progress_modify_subkeyadd">füge Unterschlüssel hinzu...</string>
+ <string name="progress_modify_passphrase">ändere Passwort...</string>
<plurals name="progress_exporting_key">
<item quantity="one">Schlüssel wird exportiert…</item>
<item quantity="other">Schlüssel werden exportiert…</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">Schlüssel wird erstellt, das kann bis zu 3 Minuten dauern…</item>
- <item quantity="other">Schlüssel wird erstellt, das kann bis zu 3 Minuten dauern…</item>
- </plurals>
<string name="progress_extracting_signature_key">Signaturschlüssel wird extrahiert…</string>
<string name="progress_extracting_key">Schlüssel wird extrahiert…</string>
<string name="progress_preparing_streams">Datenstrom wird vorbereitet…</string>
@@ -299,8 +261,8 @@
<string name="progress_verifying_integrity">Integrität wird überprüft…</string>
<string name="progress_deleting_securely">\'%s\' wird sicher gelöscht…</string>
<!--action strings-->
- <string name="hint_secret_keys">Private Schlüssel suchen</string>
- <string name="action_share_key_with">Teile Schlüssel über…</string>
+ <string name="hint_public_keys">Name/Email/Schlüssel ID...</string>
+ <string name="hint_keybase_search">Name/Keybase.io Benutzername...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -326,29 +288,38 @@
<string name="help_tab_about">Über</string>
<string name="help_about_version">Version:</string>
<!--Import-->
+ <string name="import_tab_keyserver">Schlüsselserver</string>
+ <string name="import_tab_direct">Datei/Zwischenablage</string>
+ <string name="import_tab_qr_code">QR Kode/NFC</string>
+ <string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Ausgewählte Schlüssel importieren</string>
- <string name="import_from_clipboard">Zwischenablage</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">QR-Codes mit folgender ID fehlt: %s</item>
- <item quantity="other">QR-Codes mit folgenden IDs fehlen: %s</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Bitte fange mit QR-Code der ID 1 an</string>
<string name="import_qr_code_wrong">Falsch formatierter QR-Code! Bitte erneut versuchen!</string>
- <string name="import_qr_code_finished">QR-Code wurde erfolgreich eingescannt!</string>
<string name="import_qr_code_too_short_fingerprint">Der Fingerabdruck ist zu kurz (&lt; 16 Zeichen)</string>
- <string name="import_qr_scan_button">Qr-Code mittels \'Barcode Scanner\' einscannen</string>
- <string name="import_nfc_text">Um Schlüssel über NFC zu erhalten muss das Gerät entsperrt sein.</string>
- <string name="import_nfc_help_button">Hilfe</string>
- <string name="import_clipboard_button">Schlüssel aus der Zwischenablage einfügen</string>
- <string name="import_keybase_button">Schlüssel von Keybase.io erhalten</string>
+ <string name="import_qr_code_button">QR Kode Einlesen...</string>
<!--Import result toast-->
+ <plurals name="import_keys_added_and_updated_1">
+ <item quantity="one">1 Schlüssel erfolgreich importiert</item>
+ <item quantity="other">%1$d Schlüssel erfolgreich importiert</item>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="one">Schlüssel %2$s erfolgreich importiert</item>
+ <item quantity="other">%1$d Schlüssel erfolgreich importiert: %2$s.</item>
+ </plurals>
+ <plurals name="import_keys_updated">
+ <item quantity="one">Schlüssel %2$s erfolgreich aktualisiert.</item>
+ <item quantity="other">%1$d Schlüssel erfolgreich aktualisiert: %2$s.</item>
+ </plurals>
+ <string name="view_log">Log ansehen</string>
+ <string name="import_error_nothing">Nichts zu importieren.</string>
+ <string name="import_error">Fehler bei der Verarbeitung der Schlüssel!</string>
+ <string name="import_with_warnings">, mit Warnungen</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Datei entschlüsseln mit OpenKeychain</string>
<string name="intent_import_key">Schlüssel importieren mit OpenKeychain</string>
<string name="intent_send_encrypt">Verschlüsseln mit OpenKeychain </string>
<string name="intent_send_decrypt">Entschlüsseln mit OpenKeychain </string>
<!--Remote API-->
- <string name="api_no_apps">Keine verknüpften Apps vorhanden\n\nEine Liste von unterstützten Drittanbieter-Apps finden Sie unter \"Hilfe\"!</string>
+ <string name="api_no_apps">Keine registrierten Apps!\n\nEine Liste der unterstützten Anwendungen ist in der \'Hilfe\' verfügbar.</string>
<string name="api_settings_show_info">Erweiterte Informationen anzeigen</string>
<string name="api_settings_hide_info">Erweiterte Informationen ausblenden</string>
<string name="api_settings_show_advanced">Erweiterte Einstellungen anzeigen</string>
@@ -364,9 +335,8 @@
<string name="api_settings_package_name">Paketname</string>
<string name="api_settings_package_signature">SHA-256 der Paketsignatur</string>
<string name="api_settings_accounts">Konten</string>
- <string name="api_settings_accounts_empty">Keine Accounts mit dieser App verknüpft.</string>
- <string name="api_create_account_text">Die Anwendung erfordert die Erstellung eines neuen Accounts. Bitte wähle einen existierenden Schlüssel oder erstelle einen neuen.\nAnwendungen sind auf die Nutzung der Schlüssel beschränkt, die du hier auswählst!</string>
- <string name="api_register_text">Folgende Anwendung beantragt Zugriff auf OpenKeychains API.\nZugriff erlauben?\n\nVORSICHT: Sollten Sie nicht wissen, warum diese Anfrage erscheint, sollten Sie den Zugriff nicht erlauben! Sie können Zugriffe später über das Menü \'Registrierte Anwendungen\' widerrufen.</string>
+ <string name="api_settings_accounts_empty">Keine Konten mit dieser Anwendung verknüpft.</string>
+ <string name="api_register_text">Folgende Anwendung möchte Nachrichten ver-/entschlüsseln und in Ihrem Namen signieren\nZugriff erlauben?\n\nVORSICHT: Sollten Sie nicht wissen warum dieses Fenster erscheint, sollten Sie den Zugriff nicht gewähren! Sie können Zugriffe später über das Menü \'Anwendungen\' widerrufen.</string>
<string name="api_register_allow">Zugriff erlauben</string>
<string name="api_register_disallow">Zugriff verbieten</string>
<string name="api_register_error_select_key">Bitte einen Schlüssel auswählen!</string>
@@ -376,9 +346,6 @@
<string name="api_error_wrong_signature">Signaturüberprüfung fehlgeschlagen! Haben Sie diese Anwendung aus einer anderen Quelle installiert? Wenn Sie eine Attacke ausschliessen können, sollten Sie die Registrierung der App in OpenKeychain widerrufen und die Anwendung erneut registrieren.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Über QR-Code teilen</string>
- <string name="share_qr_code_dialog_start">Mit \'Weiter\' durch alle QR-Codes gehen und diese nacheinander scannen.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Fingerabdruck:</string>
- <string name="share_qr_code_dialog_progress">QR-Code mit ID %1$d von %2$d</string>
<string name="share_nfc_dialog">Über NFC teilen</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -389,7 +356,6 @@
<string name="key_list_empty_text2">Du kannst anfangen OpenKeychain zu benutzen indem du</string>
<string name="key_list_empty_text3">oder</string>
<string name="key_list_empty_button_create">deinen eigenen Schlüssel erstellst</string>
- <string name="key_list_empty_button_import">existierende Schlüssel importierst.</string>
<!--Key view-->
<string name="key_view_action_edit">Schlüssel bearbeiten</string>
<string name="key_view_action_encrypt">Mit diesem Schlüssel verschlüsseln</string>
@@ -400,29 +366,27 @@
<string name="key_view_tab_share">Teilen</string>
<string name="key_view_tab_keys">Unterschlüssel</string>
<string name="key_view_tab_certs">Beglaubigungen</string>
+ <!--Edit key-->
+ <string name="edit_key_action_add_identity">Identität hinzufügen</string>
+ <string name="edit_key_action_add_subkey">Unterschlüssel hinzufügen</string>
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Schlüssel</string>
<string name="nav_encrypt">Signieren und Verschlüsseln</string>
<string name="nav_decrypt">Entschlüsseln und Verifizieren</string>
- <string name="nav_import">Schlüssel Importieren</string>
<string name="nav_apps">Apps</string>
<string name="drawer_open">Menü öffnen</string>
<string name="drawer_close">Menü schließen</string>
- <string name="edit">Bearbeiten</string>
<string name="my_keys">Meine Schlüssel</string>
- <string name="label_secret_key">Private Schlüssel</string>
- <string name="secret_key_yes">verfügbar</string>
- <string name="secret_key_no">nicht verfügbar</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Hier die Nachricht schreiben welche verschlüsselt und/oder signiert werden soll…</string>
- <string name="decrypt_content_edit_text_hint">Hier die verschlüsselte Nachricht eingeben um sie zu entschlüsseln und/oder zu verifzieren…</string>
+ <string name="decrypt_content_edit_text_hint">Hier die verschlüsselte Nachricht eingeben um sie zu entschlüsseln und/oder zu verifizieren…</string>
<!--certs-->
<string name="cert_default">normal</string>
<string name="cert_none">kein</string>
<string name="cert_casual">einfach überprüft</string>
<string name="cert_positive">positiv</string>
<string name="cert_revoke">widerrufen</string>
- <string name="cert_verify_ok">OK</string>
<string name="cert_verify_failed">fehlgeschlagen!</string>
<string name="cert_verify_error">Fehler!</string>
<string name="cert_verify_unavailable">Schlüssel nicht verfügbar</string>
@@ -438,7 +402,9 @@
<string name="msg_is_importing_subkeys">Geheime Unterschlüssel werden bearbeitet</string>
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="section_certifier_id">Beglaubiger</string>
<string name="section_cert">Zertifikatdetails</string>
@@ -451,13 +417,11 @@
<string name="label_cert_type">Typ</string>
<string name="error_key_not_found">Schlüssel nicht gefunden!</string>
<string name="error_key_processing">Fehler bei der Verarbeitung des Schlüssels!</string>
- <string name="no_subkey">Unterschlüssel nicht verfügbar</string>
<string name="key_stripped">nicht verfügbar</string>
- <string name="secret_cannot_multiple">Geheime Schlüssel können nur einzeln gelöscht werden!</string>
<string name="title_view_cert">Zertifikatdetails anzeigen</string>
<string name="unknown_algorithm">unbekannt</string>
<string name="can_sign_not">Kann nicht unterschreiben</string>
- <string name="error_encoding">Kodierungsfehler</string>
<string name="error_no_encrypt_subkey">Kein Unterschlüssel zum Verschlüsseln verfügbar!</string>
<string name="contact_show_key">Schlüssel anzeigen (%s)</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-el/strings.xml b/OpenKeychain/src/main/res/values-el/strings.xml
index 5cd62952b..0ae077242 100644
--- a/OpenKeychain/src/main/res/values-el/strings.xml
+++ b/OpenKeychain/src/main/res/values-el/strings.xml
@@ -1,10 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Επιλογή Δημόσιου Κλειδιού</string>
- <string name="title_select_secret_key">Επιλογή Ιδιωτικού Κλειδιού</string>
<string name="title_authentication">Κωδικός</string>
- <string name="title_create_key">Δημιουργία Κλειδιού</string>
<string name="title_edit_key">Επεξεργασία Κλειδιού</string>
<string name="title_preferences">Επιλογές</string>
<!--section-->
@@ -16,13 +13,10 @@
<string name="btn_okay">ΟΚ</string>
<!--menu-->
<string name="menu_delete_key">Διαγραφής κλειδιού</string>
- <string name="menu_create_key">Δημιουργίας κλειδιού</string>
<!--label-->
- <string name="label_sign">Υπόγραψε</string>
<string name="label_message">Μήνυμα</string>
<string name="label_file">Αρχείο</string>
<string name="label_passphrase">Κωδικός</string>
- <string name="label_passphrase_again">Ξανά</string>
<string name="label_algorithm">Αλγόριθμος</string>
<string name="label_encryption_algorithm">Αλγόριθμος κρυπτογράφησης</string>
<string name="label_key_size">Μέγεθος κλειδιού</string>
@@ -47,6 +41,9 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -54,6 +51,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index 719ddf414..be488f82d 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -1,20 +1,17 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Seleccionar la clave pública</string>
- <string name="title_select_secret_key">Seleccionar la clave secreta</string>
+ <string name="title_select_recipients">Seleccionar claves</string>
+ <string name="title_select_secret_key">Seleccionar su clave</string>
<string name="title_encrypt">Cifrar</string>
<string name="title_decrypt">Descifrar</string>
<string name="title_authentication">Frase de contraseña</string>
- <string name="title_create_key">Crear clave</string>
+ <string name="title_create_key">Crear mi clave</string>
<string name="title_edit_key"> Editar clave</string>
- <string name="title_wizard">Bienvenido a OpenKeychain</string>
<string name="title_preferences"> Preferencias</string>
<string name="title_api_registered_apps">Aplicaciones</string>
<string name="title_key_server_preference">Prioridad del servidor de claves</string>
<string name="title_change_passphrase">Cambiar frase de contraseña</string>
- <string name="title_set_passphrase">Establecer frase de contraseña</string>
- <string name="title_share_with">Compartir con...</string>
<string name="title_share_fingerprint_with">Compartir huella de validación de clave con...</string>
<string name="title_share_key">Compartir clave con...</string>
<string name="title_share_file">Compartir fichero con...</string>
@@ -35,60 +32,39 @@
<string name="section_general">General</string>
<string name="section_defaults">Predeterminados</string>
<string name="section_advanced">Avanzado</string>
- <string name="section_master_key">Clave maestra</string>
- <string name="section_master_user_id">Identidad primaria</string>
<string name="section_actions">Acciones</string>
<string name="section_share_key">Clave completa</string>
<string name="section_certification_key">Tu clave usada para las certificaciones</string>
<string name="section_upload_key">Cargar clave</string>
<string name="section_key_server">Servidor de claves</string>
- <string name="section_encrypt_and_or_sign">Cifrar y/o firmar</string>
- <string name="section_decrypt_verify">Descifrar y verificar</string>
<string name="section_fingerprint">Huella de validación de clave</string>
<string name="section_key_to_certify">Clave a ser certificada</string>
<!--button-->
- <string name="btn_certify">Certificar</string>
<string name="btn_decrypt_verify_file">Descifrar, verificar, y guardar fichero</string>
<string name="btn_decrypt_verify_message">Descifrar y verificar mensaje</string>
- <string name="btn_decrypt_verify_clipboard">Desde el portapapeles</string>
<string name="btn_encrypt_file">Cifrar y guardar fichero</string>
+ <string name="btn_encrypt_share_file">Cifrar y compartir fichero</string>
<string name="btn_save">Guardar</string>
<string name="btn_do_not_save">Cancelar</string>
<string name="btn_delete">Eliminar</string>
<string name="btn_no_date">Ninguno</string>
<string name="btn_okay">De acuerdo</string>
- <string name="btn_change_passphrase">Cambiar nueva frase de contraseña</string>
- <string name="btn_set_passphrase">Establecer nueva frase de contraseña</string>
<string name="btn_export_to_server">Cargar al servidor de claves</string>
<string name="btn_next">Siguiente</string>
<string name="btn_back">Volver</string>
- <string name="btn_clipboard">Portapapeles</string>
- <string name="btn_share">Compartir con...</string>
<string name="btn_lookup_key">Buscar clave</string>
- <string name="btn_encryption_advanced_settings_show">Mostrar ajustes avanzados</string>
- <string name="btn_encryption_advanced_settings_hide">Ocultar ajustes avanzados</string>
- <string name="btn_share_encrypted_signed">Compartir mensaje cifrado/firmado...</string>
+ <string name="btn_share_encrypted_signed">Cifrar y compartir mensaje</string>
<string name="btn_view_cert_key">Ver clave de verificación</string>
+ <string name="btn_create_key">Crear clave</string>
+ <string name="btn_add_files">Añadir fichero(s)</string>
<!--menu-->
<string name="menu_preferences">Ajustes</string>
<string name="menu_help">Ayuda</string>
<string name="menu_export_key">Exportar hacia archivo</string>
<string name="menu_delete_key">Borrar clave</string>
- <string name="menu_create_key">Crear clave</string>
- <string name="menu_create_key_expert">Crear clave (experto)</string>
+ <string name="menu_create_key">Crear mi clave</string>
+ <string name="menu_import_existing_key">Importar clave existente</string>
<string name="menu_search">Buscar</string>
- <string name="menu_key_server">Servidor de claves...</string>
- <string name="menu_update_key">Actualizar desde servidor de claves</string>
- <string name="menu_export_key_to_server">Cargar al servidor de claves</string>
- <string name="menu_share">Compartir...</string>
- <string name="menu_share_title_fingerprint">Compartir la huella digital...</string>
- <string name="menu_share_title">Compartir la clave completa...</string>
- <string name="menu_share_default_fingerprint">con...</string>
- <string name="menu_share_default">con...</string>
- <string name="menu_share_qr_code">con código QR</string>
- <string name="menu_share_qr_code_fingerprint">con código QR</string>
- <string name="menu_share_nfc">con NFC</string>
- <string name="menu_copy_to_clipboard">Copiar al portapapeles</string>
<string name="menu_beam_preferences">Ajustes de Beam</string>
<string name="menu_key_edit_cancel">Cancelar</string>
<string name="menu_encrypt_to">Cifrar hacia...</string>
@@ -97,22 +73,26 @@
<string name="menu_export_all_keys">Exportar todas las claves</string>
<string name="menu_advanced">Mostrar información avanzada</string>
<!--label-->
- <string name="label_sign">Firmar</string>
<string name="label_message">Mensaje</string>
<string name="label_file">Archivo</string>
+ <string name="label_files">Fichero(s)</string>
+ <string name="label_file_colon">Fichero:</string>
<string name="label_no_passphrase">No hay frase de contraseña</string>
<string name="label_passphrase">Frase de contraseña</string>
- <string name="label_passphrase_again">De nuevo</string>
+ <string name="label_passphrase_again">Repeat Passphrase</string>
<string name="label_algorithm">Algoritmo</string>
<string name="label_ascii_armor">Armadura ASCII</string>
- <string name="label_select_public_keys">Destinatarios</string>
- <string name="label_delete_after_encryption">Borrar después del cifrado</string>
+ <string name="label_file_ascii_armor">Ficheros: Armadura ASCII</string>
+ <string name="label_conceal_pgp_application">Permitir a otros saber que está usando OpenKeychain</string>
+ <string name="label_conceal_pgp_application_summary">Escribe \'OpenKeychain v2.7\' en las firmas OpenPGP, el texto cifrado, y las claves exportadas</string>
+ <string name="label_asymmetric_from">Desde:</string>
+ <string name="label_to">Hacia: </string>
+ <string name="label_delete_after_encryption">Ficheros: Borrar después del cifrado</string>
<string name="label_delete_after_decryption">Borrar después del descifrado</string>
- <string name="label_share_after_encryption">Compartir después del cifrado</string>
<string name="label_encryption_algorithm">Algoritmo de cifrado</string>
<string name="label_hash_algorithm">Algoritmo de Hash</string>
- <string name="label_asymmetric">con clave pública</string>
- <string name="label_symmetric">con frase contraseña</string>
+ <string name="label_asymmetric">Con clave pública</string>
+ <string name="label_symmetric">Con frase contraseña</string>
<string name="label_passphrase_cache_ttl">Caché de frase de contraseña</string>
<string name="label_message_compression">Compresión de mensaje</string>
<string name="label_file_compression">Compresión de archivo</string>
@@ -129,12 +109,7 @@
<string name="label_email">Email</string>
<string name="label_send_key">Cargar clave al servidor de claves seleccionado después de la certificación</string>
<string name="label_fingerprint">Huella digital</string>
- <string name="select_keys_button_default">Seleccionar</string>
<string name="expiry_date_dialog_title">Establer la fecha de vencimiento</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d seleccionado</item>
- <item quantity="other">%d seleccionados</item>
- </plurals>
<string name="user_id_no_name">&lt;sin nombre&gt;</string>
<string name="none">&lt;ninguna&gt;</string>
<string name="no_key">&lt;sin clave&gt;</string>
@@ -181,7 +156,6 @@
<string name="flag_authenticate">Autentificar</string>
<!--sentences-->
<string name="wrong_passphrase">Frase de contraseña incorrecta.</string>
- <string name="set_a_passphrase">Establece una frase de contraseña antes.</string>
<string name="no_filemanager_installed">No hay un gestor de archivos compatible instalado.</string>
<string name="passphrases_do_not_match">Las frases de contraseña no coinciden.</string>
<string name="passphrase_must_not_be_empty">Por favor, introduce una frase de contraseña.</string>
@@ -200,15 +174,12 @@
<string name="specify_file_to_export_to">Por favor, especifica hacia qué archivo quieres exportar.\nADVERTENCIA: El archivo se sobreescribirá si ya existiese.</string>
<string name="key_deletion_confirmation_multi">¿De veras quiere borrar todas las claves públicas seleccionadas?\n¡No puede deshacer esto!</string>
<string name="secret_key_deletion_confirmation">¿Quieres realmente borrar la clave SECRETA \'%s\'?\n¡No podrás deshacerlo!</string>
- <string name="ask_save_changed_key">Has hecho cambios en el almacén de claves, ¿quieres guardarlos?</string>
- <string name="ask_empty_id_ok">Ha añadido una identidad vacía, ¿está seguro de que quiere continuar?</string>
<string name="public_key_deletetion_confirmation">¿De veras quiere borrar la clave pública \'%s\'?\n¡No puede deshacer esto!</string>
- <string name="also_export_secret_keys">¿Exportar también las claves secretas?</string>
+ <string name="also_export_secret_keys">Exportar también claves secretas (privadas)</string>
<string name="key_exported">Se ha exportado 1 clave satisfactoriamente.</string>
<string name="keys_exported">%d claves exportadas satisfactoriamente.</string>
<string name="no_keys_exported">No se han exportado claves.</string>
<string name="key_creation_el_gamal_info">Nota: Sólo las subclaves soportan ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Nota: generar una clave RSA de longitud 1024-bit o menos está considerado inseguro y desactivado para generar nuevas claves.</string>
<string name="key_not_found">No se puede encontrar la clave %08X.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d mala clave secreta ignorada. Quizás hayas exportado con la opción\n--export-secret-subkeys\nAsegúrate de que exportas con\n--export-secret-keys\nen su lugar.</item>
@@ -220,7 +191,6 @@
<string name="nfc_successful">¡Clave enviada con éxito vía NFC Beam (haz NFC)!</string>
<string name="key_copied_to_clipboard">¡La clave ha sido copiada al portapapeles!</string>
<string name="fingerprint_copied_to_clipboard">¡La huella de validación de clave se ha copiado al portapapeles!</string>
- <string name="key_has_already_been_certified">¡La clave ya ha sido certificada!</string>
<string name="select_key_to_certify">Por favor ¡seleccione una clave para ser usada en certificación!</string>
<string name="key_too_big_for_sharing">¡La clave es demasiado grande para ser compartida de esta forma!</string>
<!--errors
@@ -231,35 +201,29 @@
<string name="error_no_secret_key_found">no se ha encontrado una clave secreta adecuada</string>
<string name="error_external_storage_not_ready">el almacenamiento externo no está preparado</string>
<string name="error_key_size_minimum512bit">el tamaño de clave debe ser de al menos 512bit</string>
- <string name="error_master_key_must_not_be_el_gamal">la clave maestra no puede ser una clave ElGamal</string>
<string name="error_unknown_algorithm_choice">elegido algoritmo desconocido</string>
<string name="error_user_id_no_email">no se ha encontrado un email</string>
<string name="error_key_needs_a_user_id">necesita al menos una identidad</string>
- <string name="error_main_user_id_must_not_be_empty">la identidad primaria no debe estar vacía</string>
- <string name="error_key_needs_master_key">necesitas al menos una clave maestra</string>
<string name="error_no_signature_passphrase">no has proporcionado una frase de contraseña</string>
<string name="error_no_signature_key">no has proporcionado una clave de firma</string>
<string name="error_invalid_data">cifrado de datos no válido</string>
<string name="error_integrity_check_failed">¡ha fallado la comprobación de integridad! ¡Los datos han sido modificados!</string>
<string name="error_wrong_passphrase">frase de contraseña incorrecta</string>
- <string name="error_saving_keys">error al guardar algunas claves</string>
<string name="error_could_not_extract_private_key">no se puede extraer la clave privada</string>
- <string name="error_expiry_must_come_after_creation">la fecha de caducidad debe ser posterior a la fecha de creación</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Los datos binarios directos sin un fichero existente en el sistema de ficheros no están soportados.</string>
<string name="error_jelly_bean_needed">¡Necesita Android 4.1 para usar la característica NFC Beam (haz NFC) de Android!</string>
<string name="error_nfc_needed">¡NFC no está disponible en tu dispositivo!</string>
<string name="error_nothing_import">¡No se encontraron claves!</string>
- <string name="error_query_too_short">Petición de búsqueda de clave demasiado corta</string>
- <string name="error_searching_keys">Error irrecuperable buscando claves en el servidor</string>
- <string name="error_too_many_responses">La petición de búsqueda de clave devolvió demasiados candidatos; por favor refine su petición</string>
- <string name="error_import_no_valid_keys">El Fichero/Portapapeles está vacío</string>
+ <string name="error_query_too_short">Petición de búsqueda demasiado corta. Por favor, ¡refine su petición!</string>
+ <string name="error_searching_keys">Ocurrió un error al buscar claves.</string>
+ <string name="error_too_many_responses">La petición de búsqueda de claves devolvió demasiados candidatos. Por favor.¡refine su petición!</string>
+ <string name="error_too_short_or_too_many_responses">O no hay claves, o bien se han encontrado demasiadas. Por favor, ¡mejore su petición!</string>
+ <string name="error_import_no_valid_keys">¡No se encontraron claves válidas en Fichero/Portapapeles!</string>
<string name="error_generic_report_bug">Ha ocurrido un error genérico, por favor, informa de este bug a OpenKeychain</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">parte del archivo cargado es un objeto OpenPGP válido pero no una clave OpenPGP</item>
<item quantity="other">partes del archivo cargado son objetos OpenPGP válidos pero no claves OpenPGP</item>
</plurals>
- <string name="error_change_something_first">Debes hacer cambios en el almacén de claves antes de que puedas guardarlo</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">¡Firma no válida!</string>
<string name="decrypt_result_signature_unknown_pub_key">Clave pública desconocida</string>
@@ -275,19 +239,25 @@
<string name="progress_saving">guardando...</string>
<string name="progress_importing">importando...</string>
<string name="progress_exporting">exportando...</string>
+ <string name="progress_uploading">subiendo...</string>
<string name="progress_building_key">construyendo la clave...</string>
- <string name="progress_certifying_master_key">certificando la clave maestra...</string>
<string name="progress_building_master_key">construyendo el anillo maestro...</string>
- <string name="progress_adding_sub_keys">añadiendo las subclaves...</string>
- <string name="progress_saving_key_ring">guardando claves...</string>
+ <string name="progress_generating_rsa">generando nueva clave RSA...</string>
+ <string name="progress_generating_dsa">generando nueva clave DSA...</string>
+ <string name="progress_generating_elgamal">generando nueva clave ElGamal...</string>
+ <string name="progress_modify">modificando juego de claves...</string>
+ <string name="progress_modify_unlock">desbloqueando juego de claves...</string>
+ <string name="progress_modify_adduid">añadiendo identidades de usuario...</string>
+ <string name="progress_modify_revokeuid">revocando identidades de usuario...</string>
+ <string name="progress_modify_primaryuid">cambiando identidad primaria de usuario...</string>
+ <string name="progress_modify_subkeychange">modificando subclaves...</string>
+ <string name="progress_modify_subkeyrevoke">revocando subclaves...</string>
+ <string name="progress_modify_subkeyadd">añadiendo subclaves...</string>
+ <string name="progress_modify_passphrase">cambiando frase contraseña...</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportando clave...</item>
<item quantity="other">exportando claves...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">generando clave, esto puede tardar más de 3 minutos...</item>
- <item quantity="other">generando claves, esto puede tardar más de 3 minutos...</item>
- </plurals>
<string name="progress_extracting_signature_key">extrayendo la clave de firma...</string>
<string name="progress_extracting_key">extrayendo la clave...</string>
<string name="progress_preparing_streams">preparando las transmisiones...</string>
@@ -298,6 +268,7 @@
<string name="progress_processing_signature">procesando la firma...</string>
<string name="progress_verifying_signature">verificando la firma...</string>
<string name="progress_signing">firmando...</string>
+ <string name="progress_certifying">certificando...</string>
<string name="progress_reading_data">leyendo los datos...</string>
<string name="progress_finding_key">localizando la clave...</string>
<string name="progress_decompressing_data">descomprimiendo los datos...</string>
@@ -305,8 +276,6 @@
<string name="progress_deleting_securely">borrando \'%s\' de forma segura…</string>
<!--action strings-->
<string name="hint_public_keys">Identidad de Nombre/Correo/Clave...</string>
- <string name="hint_secret_keys">Buscar claves secretas</string>
- <string name="action_share_key_with">Compartir la clave con...</string>
<string name="hint_keybase_search">Nombre de usuario de Nombre/Keybase.io...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
@@ -338,37 +307,25 @@
<string name="import_tab_qr_code">Código QR/NFC</string>
<string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Importar las claves seleccionadas</string>
- <string name="import_from_clipboard">Importar desde el portapapeles</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">El código QR con ID %s se ha extraviado</item>
- <item quantity="other">Los códigos QR con IDs %s se han extraviado</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Por favor, comienza con el código QR de ID 1</string>
<string name="import_qr_code_wrong">¡El código QR está deformado! ¡Por favor, prueba de nuevo!</string>
- <string name="import_qr_code_finished">¡El escaneo del código QR ha finalizado!</string>
<string name="import_qr_code_too_short_fingerprint">La huella de validación (fingerprint) de clave es demasiado corta (&lt; 16 caracteres)</string>
- <string name="import_qr_scan_button">Escanea el código QR con \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Para recibir las claves a través de NFC, el dispositivo tiene que estar desbloqueado.</string>
- <string name="import_nfc_help_button">Ayuda</string>
<string name="import_qr_code_button">Escaneando código QR...</string>
- <string name="import_clipboard_button">Tomar la clave desde el portapapeles</string>
- <string name="import_keybase_button">Obtener clave desde Keybase.io</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Clave importada con éxito</item>
<item quantity="other">%1$d claves importadas con éxito</item>
</plurals>
<plurals name="import_keys_added_and_updated_2">
- <item quantity="one"> y clave%2$s actualizada.</item>
- <item quantity="other"> y %1$d claves%2$s actualizadas.</item>
+ <item quantity="one">y actualizada clave%2$s.</item>
+ <item quantity="other">y actualizadas %1$d claves%2$s.</item>
</plurals>
<plurals name="import_keys_added">
<item quantity="one">Clave%2$s importada con éxito.</item>
<item quantity="other">%1$d claves%2$s importadas con éxito.</item>
</plurals>
<plurals name="import_keys_updated">
- <item quantity="one">Clave%2$s importada con éxito.</item>
- <item quantity="other">%1$d claves%2$s importadas con éxito.</item>
+ <item quantity="one">Clave%2$s actualizada con éxito.</item>
+ <item quantity="other">%1$d claves%2$s actualizadas con éxito.</item>
</plurals>
<string name="view_log">Ver registro (log)</string>
<string name="import_error_nothing">No hay nada que importar.</string>
@@ -380,7 +337,7 @@
<string name="intent_send_encrypt">Cifrar con OpenKeychain</string>
<string name="intent_send_decrypt">Descifrar con OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">¡No hay aplicaciones registradas!\n\n¡Una lista de aplicaciones soportadas de terceros puede encontrarse en \'Ayuda\'!</string>
+ <string name="api_no_apps">¡No hay aplicaciones registradas!\n\n¡Puede encontrar una lista de aplicaciones de terceros soportadas en la \'Ayuda\'!</string>
<string name="api_settings_show_info">Mostrar información avanzada</string>
<string name="api_settings_hide_info">Ocultar información avanzada</string>
<string name="api_settings_show_advanced">Mostrar la configuración avanzada</string>
@@ -396,9 +353,9 @@
<string name="api_settings_package_name">Nombre de paquete</string>
<string name="api_settings_package_signature">SHA-256 de firma de paquete</string>
<string name="api_settings_accounts">Cuentas</string>
- <string name="api_settings_accounts_empty">No hay cuentas asociadas a esta aplicación.</string>
- <string name="api_create_account_text">La aplicación solicita la creación de una nueva cuenta. Por favor, selecciona una clave privada que ya exista o crea una nueva.\n¡Las aplicaciones tienen restringido el uso de claves a las que tú selecciones aquí!</string>
- <string name="api_register_text">La aplicación mostrada solicita acceso a OpenKeychain.\n¿Permitir el acceso?\n\nAVISO: Si no sabes por qué aparece esta pantalla, ¡deniega el acceso! Puedes revocarlo después usando la pantalla \'Aplicaciones registradas\'.</string>
+ <string name="api_settings_accounts_empty">No hay cuentas adjuntas a esta aplicación</string>
+ <string name="api_create_account_text">La aplicación solicita la creación de una nueva cuenta. Por favor, seleccione una de sus claves existentes o cree una nueva.\n¡Las aplicaciones están restringidas al uso de las claves que usted seleccione aquí!</string>
+ <string name="api_register_text">La aplicación mostrada quiere cifrar, descrifrar y firmar mensajes en su nombre.\n¿Permitir acceso?\n\nADVERTENCIA: Si no sabe por qué apareció esta pantalla, ¡no permita el acceso! Puede revocar el acceso más tarde usando la pantalla de \'Aplicaciones\'.</string>
<string name="api_register_allow">Permitir el acceso</string>
<string name="api_register_disallow">Denegar el acceso</string>
<string name="api_register_error_select_key">¡Por favor, selecciona una clave!</string>
@@ -408,9 +365,6 @@
<string name="api_error_wrong_signature">¡La comprobación de la firma ha fallado! ¿Has instalado esta app desde una fuente distinta? Si estás seguro de que esto no es un ataque, revoca el registro de esta app en OpenKeychain y regístrala de nuevo.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Compartir con código QR</string>
- <string name="share_qr_code_dialog_start">Pasa por todos los códigos QR usando \'Siguiente\', y escanéalos de uno en uno.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Huella digital:</string>
- <string name="share_qr_code_dialog_progress">Código QR con ID %1$d de %2$d</string>
<string name="share_nfc_dialog">Compartir con NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -421,32 +375,54 @@
<string name="key_list_empty_text2">Puedes empezar por</string>
<string name="key_list_empty_text3">o</string>
<string name="key_list_empty_button_create">crear tu propia clave</string>
- <string name="key_list_empty_button_import">importar claves</string>
+ <string name="key_list_empty_button_import">importando una clave existente.</string>
<!--Key view-->
<string name="key_view_action_edit">Editar clave</string>
<string name="key_view_action_encrypt">Cifrar con esta clave</string>
<string name="key_view_action_certify">Certificar identidades</string>
+ <string name="key_view_action_update">Actualizar desde el servidor de claves</string>
<string name="key_view_action_share_with">Compartir con...</string>
<string name="key_view_action_share_nfc">Compartir sobre NFC juntando los dispositivos por el reverso</string>
+ <string name="key_view_action_upload">Actualizar al servidor de claves</string>
<string name="key_view_tab_main">Información principal</string>
<string name="key_view_tab_share">Compartir</string>
<string name="key_view_tab_keys">Subclaves</string>
<string name="key_view_tab_certs">Certificados</string>
+ <!--Edit key-->
+ <string name="edit_key_action_change_passphrase">Cambiar frase contraseña</string>
+ <string name="edit_key_action_add_identity">Añadir identidad</string>
+ <string name="edit_key_action_add_subkey">Añadir subclave</string>
+ <string name="edit_key_edit_user_id_title">¡Seleccione una acción!</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>Cambiar a la identidad primaria</item>
+ <item>Revocar identidad</item>
+ </string-array>
+ <string name="edit_key_edit_subkey_title">¡Seleccione una acción!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Cambiar periodo hasta la expiración</item>
+ <item>Revocar subclave</item>
+ </string-array>
+ <!--Create key-->
+ <string name="create_key_upload">Subir clave al servidor de claves</string>
+ <string name="create_key_empty">Este campo es obligatorio</string>
+ <string name="create_key_passphrases_not_equal">Las frases contraseña no coinciden</string>
+ <string name="create_key_final_text">Ha introducido la siguiente identidad:</string>
+ <string name="create_key_final_robot_text">Crear una clave puede llevar un tiempo, hágase con una taza de café entre tanto...\n(3 subclaves, RSA 4096 bits)</string>
+ <string name="create_key_text">Introduzca su nombre completo, dirección de correo electrónico, y elija una frase contraseña.</string>
+ <string name="create_key_hint_full_name">Nombre completo, ej. Max Mustermann</string>
+ <!--View key-->
+ <string name="view_key_revoked">¡Esta clave ha sido revocada!</string>
+ <string name="view_key_expired">¡Esta clave ha expirado!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Claves</string>
<string name="nav_encrypt">Firmar y cifrar</string>
<string name="nav_decrypt">Descifrar y verificar</string>
- <string name="nav_import">Importar claves</string>
<string name="nav_apps">Aplicaciones</string>
<string name="drawer_open">Abrir el Navigation Drawer</string>
<string name="drawer_close">Cerrar el Navigation Drawer</string>
- <string name="edit">Editar</string>
<string name="my_keys">Mis claves</string>
- <string name="label_secret_key">Claves secretas</string>
- <string name="secret_key_yes">disponible</string>
- <string name="secret_key_no">no disponible</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Escribe aquí el mensaje que quieras cifrar y/o firmar...</string>
+ <string name="encrypt_content_edit_text_hint">El mensaje introducido aquí estará firmado usando la clave seleccionada en \'Desde\' y cifrada para todos los receptores seleccionados en \'Hacia\'.</string>
<string name="decrypt_content_edit_text_hint">Introduce aquí el texto cifrado para descifrarlo y/o verificarlo...</string>
<!--certs-->
<string name="cert_default">predeterminado</string>
@@ -454,7 +430,7 @@
<string name="cert_casual">casual</string>
<string name="cert_positive">positivo</string>
<string name="cert_revoke">revocada</string>
- <string name="cert_verify_ok">correcto</string>
+ <string name="cert_verify_ok">Correcto</string>
<string name="cert_verify_failed">¡falló!</string>
<string name="cert_verify_error">¡error!</string>
<string name="cert_verify_unavailable">clave no disponible</string>
@@ -498,7 +474,7 @@
<string name="msg_ip_reinsert_secret">Re-insertando clave secreta</string>
<string name="msg_ip_uid_cert_bad">¡Se encontró un certificado defectuoso!</string>
<string name="msg_ip_uid_cert_error">¡Error procesando certificado!</string>
- <string name="msg_ip_uid_cert_good">La identificación de usuario está certificada por %1$s (%2$s)</string>
+ <string name="msg_ip_uid_cert_good">La identidad del usuario está certificada por %1$s</string>
<plurals name="msg_ip_uid_certs_unknown">
<item quantity="one">Ignorando un certificado publicado por una clave pública desconocida</item>
<item quantity="other">Ignorando %s certificados publicados por claves públicas desconocidas</item>
@@ -512,6 +488,7 @@
<string name="msg_ip_uid_processing">Procesando identidad (id) de usuario %s</string>
<string name="msg_ip_uid_revoked">La identificación de usuario está revocada</string>
<string name="msg_is_bad_type_public">Se intentó importar un juego de claves (keyring) público como secreto. Esto es un fallo, por favor ¡consigne un informe!</string>
+ <string name="msg_is_bad_type_uncanon">Se intentó importar un juego de claves sin canonicalización. ¡Esto es un fallo, por favor rellene un informe!</string>
<!--Import Secret log entries-->
<string name="msg_is">Importando clave secreta (privada) %s</string>
<string name="msg_is_db_exception">¡Error de base de datos!</string>
@@ -532,6 +509,7 @@
<string name="msg_kc_revoke_bad_local">Eliminando certificado de revocación de juego de claves, con distintivo \"local\"</string>
<string name="msg_kc_revoke_bad_time">Eliminando certificado de revocación de juego de claves, con marca de tiempo futura</string>
<string name="msg_kc_revoke_bad_type">Eliminando certificado de clave maestra, de tipo desconocido (%s)</string>
+ <string name="msg_kc_revoke_bad_type_uid">Eliminando identidad de usuario en posición equivocada</string>
<string name="msg_kc_revoke_bad">Eliminando certificado defectuoso de revocación de juego de claves</string>
<string name="msg_kc_revoke_dup">Eliminando certificado redundante de revocación de juego de claves </string>
<string name="msg_kc_sub">Procesando subclave %s</string>
@@ -569,6 +547,7 @@
<string name="msg_kc_uid_revoke_dup">Eliminando certificado redundate de revocación para la identidad de usuario \"%s\"</string>
<string name="msg_kc_uid_revoke_old">Eliminando certificado desactualizado de revocación para la identidad de usuario \"%s\"</string>
<string name="msg_kc_uid_no_cert">No se encontró ningún auto-certificado válido para la identificación de usuario %s, eliminándola del juego de claves.</string>
+ <string name="msg_kc_uid_remove">Eliminando identidad de usuario %s no válida</string>
<!--Keyring merging log entries-->
<string name="msg_mg_public">Incorporándolas en el juego de claves públicas %s</string>
<string name="msg_mg_secret">Incorporándolas en el juego de claves secretas (privadas) %s</string>
@@ -576,12 +555,29 @@
<string name="msg_mg_heterogeneous">Se intentaron consolidar juegos de claves heterogéneos</string>
<string name="msg_mg_new_subkey">Añadiendo nueva subclave %s</string>
<string name="msg_mg_found_new">Se encontraron %s nuevos certificados en el juego de claves</string>
+ <string name="msg_mg_unchanged">No hay nuevos certificados</string>
+ <!--createSecretKeyRing-->
+ <string name="msg_cr">Generando nueva clave maestra</string>
+ <string name="msg_cr_error_no_master">¡No se especificaron opciones de clave!</string>
+ <string name="msg_cr_error_no_user_id">¡Los juegos de claves tienen que estar creados con al menos una identidad de usuario!</string>
+ <string name="msg_cr_error_no_certify">¡La clave maestra debe tener el indicador de certificado!</string>
+ <string name="msg_cr_error_keysize_512">¡El tamaño de la clave debe ser mayor o igual de 512!</string>
+ <string name="msg_cr_error_internal_pgp">¡Error PGP interno!</string>
+ <string name="msg_cr_error_unknown_algo">¡Seleccionado algoritmo defectuoso!</string>
+ <string name="msg_cr_error_master_elgamal">¡La clave maestra no debe ser del tipo ElGamal!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modificando el juego de claves %s</string>
<string name="msg_mf_error_encode">¡Excepción en la codificación!</string>
+ <string name="msg_mf_error_fingerprint">¡La actual huella de validación de clave no coincide con la esperada!</string>
+ <string name="msg_mf_error_keyid">No hay identidad de clave. Esto es un error interno, por favor ¡consigne un informe de error!</string>
+ <string name="msg_mf_error_integrity">Error interno, ¡fallo en la comprobación de integridad!</string>
+ <string name="msg_mf_error_noexist_primary">¡Especificada identidad de usuario primaria defectuosa!</string>
+ <string name="msg_mf_error_revoked_primary">¡Las identidades de usuario revocadas no pueden ser primarias!</string>
<string name="msg_mf_error_pgp">¡Excepción interna de PGP!</string>
<string name="msg_mf_error_sig">¡Excepción con la firma!</string>
<string name="msg_mf_passphrase">Cambiando frase contraseña</string>
+ <string name="msg_mf_primary_replace_old">Reemplazando certificado de la anterior identidad de usuario primaria </string>
+ <string name="msg_mf_primary_new">Generando nuevo certificado para nueva identidad de usuario primaria</string>
<string name="msg_mf_subkey_change">Modificando subclave %s</string>
<string name="msg_mf_subkey_missing">¡Intentó operar sobre una subclave ausente %s!</string>
<string name="msg_mf_subkey_new">Generando nueva subclave %2$s de %1$s bits</string>
@@ -592,9 +588,17 @@
<string name="msg_mf_uid_add">Añadiendo identidad de usuario %s</string>
<string name="msg_mf_uid_primary">Cambiando identidad de usuario (uid) primaria a %s</string>
<string name="msg_mf_uid_revoke">Revocando identidad de usuario %s</string>
+ <string name="msg_mf_uid_error_empty">¡La identidad de usuario no debe estar vacía!</string>
<string name="msg_mf_unlock_error">¡Error desbloqueando juego de claves!</string>
<string name="msg_mf_unlock">Desbloqueando juego de claves</string>
+ <!--PassphraseCache-->
+ <string name="passp_cache_notif_click_to_clear">Haga clic para limpiar las frases contraseña almacenadas en caché</string>
+ <string name="passp_cache_notif_n_keys">OpenKeychain ha almacenado en caché %d frases contraseña</string>
+ <string name="passp_cache_notif_keys">Frases contraseña almacenadas en caché:</string>
+ <string name="passp_cache_notif_clear">Limpiar caché</string>
+ <string name="passp_cache_notif_pwd">Contraseña</string>
<!--unsorted-->
+ <string name="internal_error">¡Error interno!</string>
<string name="section_certifier_id">Certificador</string>
<string name="section_cert">Detalles del certificado</string>
<string name="label_user_id">Identidad</string>
@@ -606,14 +610,17 @@
<string name="label_cert_type">Tipo</string>
<string name="error_key_not_found">¡Clave no encontrada!</string>
<string name="error_key_processing">¡Error procesando clave!</string>
- <string name="no_subkey">subclave no disponible</string>
<string name="key_stripped">desnudo, sin clave</string>
- <string name="secret_cannot_multiple">¡Las claves privadas (secretas) sólo pueden borrarse individualmente!</string>
+ <string name="secret_cannot_multiple">¡Sus claves propias sólo pueden ser borradas individualmente!</string>
<string name="title_view_cert">Ver detalles del certificado</string>
<string name="unknown_algorithm">desconocido</string>
<string name="can_sign_not">no puede firmarse</string>
- <string name="error_encoding">Error de codificación</string>
<string name="error_no_encrypt_subkey">¡No hay subclave de cifrado disponible!</string>
<string name="info_no_manual_account_creation">No cree Cuentas-OpenKeychain manualmente.\nPara más información, vea la Ayuda.</string>
<string name="contact_show_key">Mostrar clave (%s)</string>
+ <!--First Time-->
+ <string name="first_time_text1">¡Recupere su privacidad con OpenKeychain!</string>
+ <string name="first_time_create_key">Crear mi clave</string>
+ <string name="first_time_import_key">Importar clave existente</string>
+ <string name="first_time_skip">Omitir configuración</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-et/strings.xml b/OpenKeychain/src/main/res/values-et/strings.xml
index 51f30015a..fdd7f026a 100644
--- a/OpenKeychain/src/main/res/values-et/strings.xml
+++ b/OpenKeychain/src/main/res/values-et/strings.xml
@@ -1,16 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Vali avalik võti</string>
- <string name="title_select_secret_key">Vali salajane võti</string>
<string name="title_encrypt">Krüpteeri</string>
<string name="title_decrypt">Dekrüpteeri</string>
<string name="title_authentication">Salasõne</string>
- <string name="title_create_key">Loo võti</string>
<string name="title_edit_key">Muuda võtit</string>
<string name="title_preferences">Seaded</string>
<string name="title_key_server_preference">Võtmeserveri seaded</string>
- <string name="title_set_passphrase">Määra salasõne</string>
<string name="title_import_keys">Impordi võtmeid</string>
<string name="title_export_key">Ekspordi võti</string>
<string name="title_export_keys">Ekspordi võtmed</string>
@@ -30,22 +26,13 @@
<!--menu-->
<string name="menu_preferences">Seaded</string>
<string name="menu_delete_key">Kustuta võti</string>
- <string name="menu_create_key">Loo võti</string>
<string name="menu_search">Otsi</string>
- <string name="menu_key_server">Võtmeserver...</string>
- <string name="menu_update_key">Uuenda võtmeserverist</string>
- <string name="menu_export_key_to_server">Saada võtmeserverisse</string>
- <string name="menu_share">Jaga...</string>
<!--label-->
- <string name="label_sign">Allkirjasta</string>
<string name="label_message">Sõnum</string>
<string name="label_file">Fail</string>
<string name="label_no_passphrase">Salasõnet pole</string>
<string name="label_passphrase">Salasõne</string>
- <string name="label_passphrase_again">Uuesti</string>
<string name="label_algorithm">Algoritm</string>
- <string name="label_select_public_keys">Saajad</string>
- <string name="label_delete_after_encryption">Kustuta peale šifreerimist</string>
<string name="label_hash_algorithm">Räsialgoritm</string>
<string name="label_passphrase_cache_ttl">Salasõne puhverdus</string>
<string name="label_creation">Loodud</string>
@@ -79,7 +66,6 @@
<!--key flags-->
<!--sentences-->
<string name="wrong_passphrase">Vale salasõne</string>
- <string name="set_a_passphrase">Määra enne salasõne.</string>
<string name="passphrases_do_not_match">Salasõned ei ühti.</string>
<string name="passphrase_for_symmetric_encryption">Sümmeetriline krüpteering</string>
<!--errors
@@ -99,6 +85,9 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -106,6 +95,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index 0c5c5de67..2b6405ed5 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -1,20 +1,17 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Choisir la clef publique</string>
- <string name="title_select_secret_key">Choisir la clef secrète</string>
+ <string name="title_select_recipients">Choisir des clefs</string>
+ <string name="title_select_secret_key">Choisir ma clef</string>
<string name="title_encrypt">Chiffrer</string>
<string name="title_decrypt">Déchiffrer</string>
<string name="title_authentication">Phrase de passe</string>
- <string name="title_create_key">Créer une clef</string>
+ <string name="title_create_key">Créer ma clef</string>
<string name="title_edit_key">Modifier une clef</string>
- <string name="title_wizard">Bienvenue à OpenKeychain</string>
<string name="title_preferences">Préférences</string>
<string name="title_api_registered_apps">Applis</string>
<string name="title_key_server_preference">Préférences du serveur de clefs</string>
<string name="title_change_passphrase">Modifier la phrase de passe</string>
- <string name="title_set_passphrase">Définir la phrase de passe</string>
- <string name="title_share_with">Partager avec...</string>
<string name="title_share_fingerprint_with">Partager l\'empreinte avec...</string>
<string name="title_share_key">Partager la clef avec...</string>
<string name="title_share_file">Partager le fichier avec...</string>
@@ -35,60 +32,36 @@
<string name="section_general">Général</string>
<string name="section_defaults">Valeurs par défaut</string>
<string name="section_advanced">Avancé</string>
- <string name="section_master_key">Clef maîtresse</string>
- <string name="section_master_user_id">Identité principale</string>
<string name="section_actions">Actions</string>
<string name="section_share_key">Clef entière</string>
<string name="section_certification_key">Votre clef utilisée pour la certification</string>
<string name="section_upload_key">Téléverser la clef</string>
<string name="section_key_server">Serveur de clefs</string>
- <string name="section_encrypt_and_or_sign">Chiffrer et/ou signer</string>
- <string name="section_decrypt_verify">Déchiffrer et vérifier</string>
<string name="section_fingerprint">Empreinte</string>
<string name="section_key_to_certify">Clef à certifier !</string>
<!--button-->
- <string name="btn_certify">Certifier</string>
<string name="btn_decrypt_verify_file">Déchiffrer, vérifier et enregistrer le fichier</string>
<string name="btn_decrypt_verify_message">Déchiffrer et enregistrer le message</string>
- <string name="btn_decrypt_verify_clipboard">À partir du presse-papiers</string>
<string name="btn_encrypt_file">Chiffrer et enregistrer le fichier</string>
<string name="btn_save">Enregistrer</string>
<string name="btn_do_not_save">Annuler</string>
<string name="btn_delete">Supprimer</string>
<string name="btn_no_date">Aucune</string>
<string name="btn_okay">OK</string>
- <string name="btn_change_passphrase">Changer la nouvelle phrase de passe</string>
- <string name="btn_set_passphrase">Définir la nouvelle phrase de passe</string>
<string name="btn_export_to_server">Téléverser vers le serveur de clefs</string>
<string name="btn_next">Suivant</string>
<string name="btn_back">Retour</string>
- <string name="btn_clipboard">Presse-papiers</string>
- <string name="btn_share">Partager avec...</string>
<string name="btn_lookup_key">Rechercher la clef</string>
- <string name="btn_encryption_advanced_settings_show">Afficher les paramètres avancés</string>
- <string name="btn_encryption_advanced_settings_hide">Masquer les paramètres avancés</string>
- <string name="btn_share_encrypted_signed">Partager le message chiffré/signé...</string>
<string name="btn_view_cert_key">Voir la clef de certification</string>
+ <string name="btn_create_key">Créer la clef</string>
<!--menu-->
<string name="menu_preferences">Paramètres</string>
<string name="menu_help">Aide</string>
<string name="menu_export_key">Exporter vers un fichier</string>
<string name="menu_delete_key">Supprimer la clef</string>
- <string name="menu_create_key">Créer une clef</string>
- <string name="menu_create_key_expert">Créer une clef (expert)</string>
+ <string name="menu_create_key">Créer ma clef</string>
+ <string name="menu_import_existing_key">Importer une clef existante</string>
<string name="menu_search">Rechercher</string>
- <string name="menu_key_server">Serveur de clefs...</string>
- <string name="menu_update_key">Mettre à jour depuis le serveur de clefs</string>
- <string name="menu_export_key_to_server">Téléverser vers le serveur de clefs</string>
- <string name="menu_share">Partager...</string>
- <string name="menu_share_title_fingerprint">Partager l\'empreinte...</string>
- <string name="menu_share_title">Partager la clef entière...</string>
- <string name="menu_share_default_fingerprint">avec...</string>
- <string name="menu_share_default">avec...</string>
- <string name="menu_share_qr_code">par un code QR</string>
- <string name="menu_share_qr_code_fingerprint">par un code QR</string>
- <string name="menu_share_nfc">par la NFC</string>
- <string name="menu_copy_to_clipboard">Copier vers le presse-papiers</string>
<string name="menu_beam_preferences">Paramètres Beam</string>
<string name="menu_key_edit_cancel">Annuler</string>
<string name="menu_encrypt_to">Chiffrer vers...</string>
@@ -97,22 +70,18 @@
<string name="menu_export_all_keys">Exporter toutes les clefs</string>
<string name="menu_advanced">Afficher les infos avancées</string>
<!--label-->
- <string name="label_sign">Signer</string>
<string name="label_message">Message</string>
<string name="label_file">Fichier</string>
<string name="label_no_passphrase">Aucune phrase de passe</string>
<string name="label_passphrase">Phrase de passe</string>
- <string name="label_passphrase_again">Confirmation</string>
+ <string name="label_passphrase_again">Répéter la phrase de passe</string>
<string name="label_algorithm">Algorithme</string>
<string name="label_ascii_armor">Armure ASCII</string>
- <string name="label_select_public_keys">Destinataires</string>
- <string name="label_delete_after_encryption">Supprimer après le chiffrement</string>
+ <string name="label_conceal_pgp_application">Informez les autres de votre utilisation d\'OpenKeychain</string>
+ <string name="label_conceal_pgp_application_summary">Ajoute « OpenKeychain v2.7 » aux signatures OpenPGP, aux cryptogrammes, et aux clefs exportées</string>
<string name="label_delete_after_decryption">Supprimer après le chiffrement</string>
- <string name="label_share_after_encryption">Partager après chiffrement</string>
<string name="label_encryption_algorithm">Algorithme de chiffrement</string>
<string name="label_hash_algorithm">Algorithme de hachage</string>
- <string name="label_asymmetric">avec une clef publique</string>
- <string name="label_symmetric">avec une phrase de passe</string>
<string name="label_passphrase_cache_ttl">Cache de la phrase de passe</string>
<string name="label_message_compression">Compression des messages</string>
<string name="label_file_compression">Compression des fichiers</string>
@@ -129,12 +98,7 @@
<string name="label_email">Courriel</string>
<string name="label_send_key">Téléverser la clef vers le serveur de clefs choisi après certification</string>
<string name="label_fingerprint">Empreinte</string>
- <string name="select_keys_button_default">Choisir</string>
<string name="expiry_date_dialog_title">Définir une date d\'expiration</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d choisie</item>
- <item quantity="other">%d choisies</item>
- </plurals>
<string name="user_id_no_name">&lt;aucun nom&gt;</string>
<string name="none">&lt;aucune&gt;</string>
<string name="no_key">&lt;pas de clef&gt;</string>
@@ -181,7 +145,6 @@
<string name="flag_authenticate">Authentifier</string>
<!--sentences-->
<string name="wrong_passphrase">Phrase de passe erronée</string>
- <string name="set_a_passphrase">Définir d\'abord une phrase de passe.</string>
<string name="no_filemanager_installed">Aucun gestionnaire de fichiers compatible installé.</string>
<string name="passphrases_do_not_match">Les phrases de passe ne correspondent pas.</string>
<string name="passphrase_must_not_be_empty">Veuillez saisir une phrase de passe</string>
@@ -200,15 +163,12 @@
<string name="specify_file_to_export_to">Veuillez spécifier vers quel fichier exporter.\nAVERTISSEMENT ! Le fichier sera écrasé s\'il existe.</string>
<string name="key_deletion_confirmation_multi">Voulez-vous vraiment supprimer toutes les clefs publiques choisies ?\nCeci est irréversible !</string>
<string name="secret_key_deletion_confirmation">Voulez-vous vraiment supprimer la clef SECRÈTE %s ?\nVous ne pourrez pas la restituer !</string>
- <string name="ask_save_changed_key">Vous avez apporté des changements au trousseau, voulez-vous l\'enregistrer ?</string>
- <string name="ask_empty_id_ok">Vous avez ajouté une identité vide, êtes-vous certain de vouloir continuer ?</string>
<string name="public_key_deletetion_confirmation">Voulez-vous vraiment supprimer la clef publique %s ?\nCeci est irréversible !</string>
- <string name="also_export_secret_keys">Exporter aussi les clefs secrètes ?</string>
+ <string name="also_export_secret_keys">Importer aussi les clefs secrètes</string>
<string name="key_exported">1 clef exportée avec succès.</string>
<string name="keys_exported">%d clefs exportées avec succès.</string>
<string name="no_keys_exported">Aucune clef exportée.</string>
<string name="key_creation_el_gamal_info">Note : seules les sous-clefs prennent en charge ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Note : générer des clefs RSA d\'une longueur de 1024 bits ou moins est considéré non sécuritaire et est désactivé pour la génération de nouvelles clefs.</string>
<string name="key_not_found">Clef %08X introuvable.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d mauvaise clef ignorée. Vous avez peut-être exporté avec l\'option\n --export-secret-subkeys\nAssurez-vous d\'exporter plutôt avec\n --export-secret-keys.</item>
@@ -220,7 +180,6 @@
<string name="nfc_successful">Clef envoyée par Beam NFC avec succès |</string>
<string name="key_copied_to_clipboard">La clef a été copié vers le presse-papiers !</string>
<string name="fingerprint_copied_to_clipboard">L\'empreinte a été copié vers le presse-papiers !</string>
- <string name="key_has_already_been_certified">La clef a déjà été certifiée !</string>
<string name="select_key_to_certify">Veuillez choisir une clef à utiliser pour la certification !</string>
<string name="key_too_big_for_sharing">La clef est trop grosse pour être partagée ainsi !</string>
<!--errors
@@ -231,35 +190,29 @@
<string name="error_no_secret_key_found">aucune clefs secrète adéquate n\'a été trouvée</string>
<string name="error_external_storage_not_ready">le stockage externe n\'est pas prêt</string>
<string name="error_key_size_minimum512bit">la taille de la clef doit être d\'au moins 512 bits</string>
- <string name="error_master_key_must_not_be_el_gamal">la clef maîtresse ne peut être une clef ElGama</string>
<string name="error_unknown_algorithm_choice">choix d\'algorhitme inconnu</string>
<string name="error_user_id_no_email">aucun courriel trouvé</string>
<string name="error_key_needs_a_user_id">au moins une identité est nécessaire</string>
- <string name="error_main_user_id_must_not_be_empty">l\'identité principale ne doit pas être vide</string>
- <string name="error_key_needs_master_key">au moins une clef maîtresse est nécessaire</string>
<string name="error_no_signature_passphrase">aucune phrase de passe n\'a été donnée</string>
<string name="error_no_signature_key">aucune clef de signature n\'a été donnée</string>
<string name="error_invalid_data">aucune donnée de chiffrement valide</string>
<string name="error_integrity_check_failed">la vérification de l\'intégrité a échoué ! Les données ont été modifiées !</string>
<string name="error_wrong_passphrase">phrase de passe erronnée</string>
- <string name="error_saving_keys">erreur lors de la sauvegarde de certaines clefs</string>
<string name="error_could_not_extract_private_key">impossible d\'extraire la clef privée</string>
- <string name="error_expiry_must_come_after_creation">la date d\'expiration doit venir après la date de création</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Les données binaires directes sans fichier dans le système de fichiers ne sont pas prises en charge.</string>
<string name="error_jelly_bean_needed">Il vous faut Android 4.1 pour utiliser la fonction Beam NFC d\'Android !</string>
<string name="error_nfc_needed">La NFC n\'est pas disponible sur votre appareil !</string>
<string name="error_nothing_import">Aucune clef trouvée !</string>
- <string name="error_query_too_short">La requête de recherche de clef est trop courte</string>
- <string name="error_searching_keys">Erreur irrécupérable lors de la recherche de clef sur le serveur</string>
- <string name="error_too_many_responses">La requête de recherche de clef a retourné trop de candidats. Veuillez raffiner la requête</string>
- <string name="error_import_no_valid_keys">Le fichier/le presse-papiers est vide</string>
+ <string name="error_query_too_short">La demande de recherche est trop courte. Veuillez la préciser !</string>
+ <string name="error_searching_keys">Une erreur est survenue lors de la recherche de clefs.</string>
+ <string name="error_too_many_responses">La demande de recherche de clef a retourné trop de candidats. Veuillez la préciser !</string>
+ <string name="error_too_short_or_too_many_responses">Soit aucune clef n\'a été trouvée, soit trop de clefs. Veuillez améliorer votre demande !</string>
+ <string name="error_import_no_valid_keys">Aucune clef valide n\'a été trouvée dans le fichier/presse-papiers |</string>
<string name="error_generic_report_bug">Une erreur générique est survenue, veuillez créer un nouveau rapport de bogue pour OpenKeychain.</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">une partie du fichier chargé est un objet OpenPGP valide mais pas une clef OpenPGP</item>
<item quantity="other">certaines parties du fichier chargé sont des objets OpenPGP valides mais pas des clefs OpenPGP</item>
</plurals>
- <string name="error_change_something_first">Vous devez apporter des changements au trousseau avant de pouvoir l\'enregistrer</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Signature invalide !</string>
<string name="decrypt_result_signature_unknown_pub_key">Clef publique inconnue</string>
@@ -275,19 +228,25 @@
<string name="progress_saving">sauvegarde...</string>
<string name="progress_importing">importation...</string>
<string name="progress_exporting">exportation...</string>
+ <string name="progress_uploading">téléversement...</string>
<string name="progress_building_key">assemblage de la clef...</string>
- <string name="progress_certifying_master_key">certification de la clef maîtresse...</string>
<string name="progress_building_master_key">assemblage du trousseau maître...</string>
- <string name="progress_adding_sub_keys">ajout des sous-clefs...</string>
- <string name="progress_saving_key_ring">sauvegarde de la clef...</string>
+ <string name="progress_generating_rsa">génération d\'une nouvelle clef RSA...</string>
+ <string name="progress_generating_dsa">génération d\'une nouvelle clef DSA...</string>
+ <string name="progress_generating_elgamal">génération d\'une nouvelle clef ElGamal...</string>
+ <string name="progress_modify">modification du trousseau...</string>
+ <string name="progress_modify_unlock">déverrouillage du trousseau...</string>
+ <string name="progress_modify_adduid">ajout des IDs d\'utilisateur...</string>
+ <string name="progress_modify_revokeuid">révocation des IDs d\'utilisateur...</string>
+ <string name="progress_modify_primaryuid">changement de l\'ID d\'utilisateur principale...</string>
+ <string name="progress_modify_subkeychange">modification des sous-clefs...</string>
+ <string name="progress_modify_subkeyrevoke">révocation des sous-clefs...</string>
+ <string name="progress_modify_subkeyadd">ajout des sous-clefs...</string>
+ <string name="progress_modify_passphrase">changement de la phrase de passe...</string>
<plurals name="progress_exporting_key">
<item quantity="one">exportation de la clef...</item>
<item quantity="other">exportation des clefs...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">génération de la clef, ceci peut prendre jusqu\'à 3 min...</item>
- <item quantity="other">génération des clefs, ceci peut prendre jusqu\'à 3 min...</item>
- </plurals>
<string name="progress_extracting_signature_key">extraction de la clef de signature...</string>
<string name="progress_extracting_key">extraction de la clef...</string>
<string name="progress_preparing_streams">préparation des flux...</string>
@@ -298,6 +257,7 @@
<string name="progress_processing_signature">traitement de la signature...</string>
<string name="progress_verifying_signature">vérification de la signature...</string>
<string name="progress_signing">signature...</string>
+ <string name="progress_certifying">certification...</string>
<string name="progress_reading_data">lecture des données...</string>
<string name="progress_finding_key">recherche de la clef...</string>
<string name="progress_decompressing_data">décompression des données...</string>
@@ -305,8 +265,6 @@
<string name="progress_deleting_securely">suppression sûre de « %s »...</string>
<!--action strings-->
<string name="hint_public_keys">Nom/courriel/ ID clef...</string>
- <string name="hint_secret_keys">Rechercher des clefs secrètes</string>
- <string name="action_share_key_with">Partager la clef avec...</string>
<string name="hint_keybase_search">Nom/nom d\'utilisateur keybase.io...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
@@ -338,26 +296,26 @@
<string name="import_tab_qr_code">Code QR/NFC</string>
<string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Importer les clefs choisies</string>
- <string name="import_from_clipboard">Importer à partir du presse-papiers</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Le code QR avec l\'ID %s est manquant</item>
- <item quantity="other">Les codes QR avec les IDs %s sont manquants</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Veuillez commencer par le code QR avec l\'ID 1</string>
<string name="import_qr_code_wrong">Code QR incorrecte ! Veuillez réessayer !</string>
- <string name="import_qr_code_finished">Balayage de code QR terminé !</string>
<string name="import_qr_code_too_short_fingerprint">L\'empreinte est trop courte (&lt; 16 caractères)</string>
- <string name="import_qr_scan_button">Numériser le code QR avec le lecteur de code-barres</string>
- <string name="import_nfc_text">Pour recevoir des clefs par la NFC, les appareils doivent être déverrouillés.</string>
- <string name="import_nfc_help_button">Aide</string>
<string name="import_qr_code_button">Balayer le code QR...</string>
- <string name="import_clipboard_button">Obtenir la clef depuis le presse-papiers</string>
- <string name="import_keybase_button">Obtenir la clef depuis Keybase.io</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Clef importée avec succès</item>
<item quantity="other">%1$d clefs importées avec succès</item>
</plurals>
+ <plurals name="import_keys_added_and_updated_2">
+ <item quantity="one">et mise à jour de la clef%2$s.</item>
+ <item quantity="other">et mise à jour de %1$d clefs%2$s.</item>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="one">Une clef%2$s importée avec succès.</item>
+ <item quantity="other">%1$d clefs%2$s importées avec succès.</item>
+ </plurals>
+ <plurals name="import_keys_updated">
+ <item quantity="one">Une clef%2$s mise à jour avec succès.</item>
+ <item quantity="other">%1$d clefs%2$s mises à jour avec succès</item>
+ </plurals>
<string name="view_log">Consulter le journal</string>
<string name="import_error_nothing">Rien à importer.</string>
<string name="import_error">Erreur lors de l\'importation des clefs !</string>
@@ -384,9 +342,9 @@
<string name="api_settings_package_name">Nom du paquet</string>
<string name="api_settings_package_signature">SHA-256 de la signature du paquet</string>
<string name="api_settings_accounts">Comptes</string>
- <string name="api_settings_accounts_empty">Aucun compte n\'est attaché à cette application.</string>
- <string name="api_create_account_text">L\'application demande la création d\'un nouveau compte. Veuillez choisir un clef privée existante ou en créer une.\nLes applications sont restreintes à l\'utilisation de clefs choisies ici.</string>
- <string name="api_register_text">L\'application affichée demande l\'accès à OpenKeychain.\nPermettre l\'accès ?\n\nAvertissement : si vous ne savez pas pourquoi cet écran est apparu, refusez l\'accès ! Vous pourrez révoquer l\'accès plus tard en utilisant l\'écran « Applications enregistrées ».</string>
+ <string name="api_settings_accounts_empty">Aucun compte n\'est attaché à cette appli.</string>
+ <string name="api_create_account_text">L\'appli demande la création d\'un nouveau compte. Veuillez choisir une de vos clefs existantes ou en créer une nouvelle.\nLes applis ne peuvent utiliser que les clefs que vous choisissez ici !</string>
+ <string name="api_register_text">L\'application affichée veut chiffrer/déchiffrer des messages et les signer en votre nom.\nPermettre l\'accès ?\n\nAVERTISSEMENT : si vous ne savez pas pourquoi cet écran est apparu, refusez l\'accès ! Vous pourrez révoquer l\'accès plus tard en utilisant l\'écran « Applis ».</string>
<string name="api_register_allow">Permettre l\'accès</string>
<string name="api_register_disallow">Enlever l\'accès</string>
<string name="api_register_error_select_key">Veuillez choisir une clef !</string>
@@ -396,9 +354,6 @@
<string name="api_error_wrong_signature">La vérification de la signature a échoué ! Avez-vous installé cette appli à partir d\'une source différente ? Si vous êtes sûr que ce n\'est pas une attaque, révoquez l\'enregistrement de cette appli dans OpenKeychain et enregistrez-la à nouveau.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Partager par un code QR</string>
- <string name="share_qr_code_dialog_start">Balayer tous les codes QR un par un en utilisant « Suivant ».</string>
- <string name="share_qr_code_dialog_fingerprint_text">Empreinte :</string>
- <string name="share_qr_code_dialog_progress">Code QR avec l\'ID %1$d de %2$d</string>
<string name="share_nfc_dialog">Partager par la NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -409,32 +364,53 @@
<string name="key_list_empty_text2">Vous pouvez commencer par</string>
<string name="key_list_empty_text3">ou</string>
<string name="key_list_empty_button_create">créer votre propre clef</string>
- <string name="key_list_empty_button_import">Importer des clefs.</string>
+ <string name="key_list_empty_button_import">importation d\'une clef existante.</string>
<!--Key view-->
<string name="key_view_action_edit">Modifier la clef</string>
<string name="key_view_action_encrypt">Chiffrer avec cette clef</string>
<string name="key_view_action_certify">Certifier les identités</string>
+ <string name="key_view_action_update">Mise à jour depuis le serveur de clefs</string>
<string name="key_view_action_share_with">Partager avec...</string>
<string name="key_view_action_share_nfc">Partager par NFC en tenant les appareils dos à dos</string>
+ <string name="key_view_action_upload">Téléverser vers le serveur de clefs</string>
<string name="key_view_tab_main">Infos principales</string>
<string name="key_view_tab_share">Partager</string>
<string name="key_view_tab_keys">Sous-clefs</string>
<string name="key_view_tab_certs">Certificats</string>
+ <!--Edit key-->
+ <string name="edit_key_action_change_passphrase">Changer la phrase de passe</string>
+ <string name="edit_key_action_add_identity">Ajouter une identité</string>
+ <string name="edit_key_action_add_subkey">Ajouter une sous-clef</string>
+ <string name="edit_key_edit_user_id_title">Choisir une action !</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>Changer en identité principale</item>
+ <item>Révoquer l\'identité</item>
+ </string-array>
+ <string name="edit_key_edit_subkey_title">Choisissez une action !</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Changer l\'expiration</item>
+ <item>Révoquer la sous-clef</item>
+ </string-array>
+ <!--Create key-->
+ <string name="create_key_upload">Téléverser la clef vers le serveur de clefs</string>
+ <string name="create_key_empty">Ce champ est exigé</string>
+ <string name="create_key_passphrases_not_equal">Les phrases de passe ne correspondent pas</string>
+ <string name="create_key_final_text">Vous avez saisie l\'identité suivante :</string>
+ <string name="create_key_final_robot_text">Créer une clef peut prendre du temps, prenez donc un café en attendant...\n(3 sous-clefs, RSA 4096 bits)</string>
+ <string name="create_key_text">Saisissez votre nom complet, votre adresse courriel et choisissez votre phrase de passe.</string>
+ <string name="create_key_hint_full_name">Nom complet, p. ex. Marc-Olivier Lagacé</string>
+ <!--View key-->
+ <string name="view_key_revoked">Cette clef a été révoquée !</string>
+ <string name="view_key_expired">Cette clef est expirée !</string>
<!--Navigation Drawer-->
<string name="nav_keys">Clefs</string>
<string name="nav_encrypt">Signer et chiffrer</string>
<string name="nav_decrypt">Déchiffrer et vérifier</string>
- <string name="nav_import">Importer les clefs</string>
<string name="nav_apps">Applis</string>
<string name="drawer_open">Ouvrir le tiroir de navigation</string>
<string name="drawer_close">Fermer le tiroir de navigation</string>
- <string name="edit">Modifier</string>
<string name="my_keys">Mes clefs</string>
- <string name="label_secret_key">Clef secrète</string>
- <string name="secret_key_yes">disponible</string>
- <string name="secret_key_no">non disponible</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Écrire ici le message à chiffrer et/ou signer...</string>
<string name="decrypt_content_edit_text_hint">Saisir le cryptogramme à déchiffrer et/ou à vérifier ici...</string>
<!--certs-->
<string name="cert_default">valeur par défaut</string>
@@ -442,7 +418,7 @@
<string name="cert_casual">rapide</string>
<string name="cert_positive">positif</string>
<string name="cert_revoke">révoqué</string>
- <string name="cert_verify_ok">ok</string>
+ <string name="cert_verify_ok">OK</string>
<string name="cert_verify_failed">échec!</string>
<string name="cert_verify_error">erreur!</string>
<string name="cert_verify_unavailable">clef non disponible</string>
@@ -486,20 +462,21 @@
<string name="msg_ip_reinsert_secret">Réinsertion de la clef secrète</string>
<string name="msg_ip_uid_cert_bad">Un mauvais certificat a été rencontré !</string>
<string name="msg_ip_uid_cert_error">Erreur lors du traitement du certificat !</string>
- <string name="msg_ip_uid_cert_good">L\'ID utilisateur est certifié par %1$s (%2$s)</string>
+ <string name="msg_ip_uid_cert_good">L\'ID d\'utilisateur est certifié par %1$s</string>
<plurals name="msg_ip_uid_certs_unknown">
<item quantity="one">Un certificat ignoré provenant d\'une clef publique inconnue</item>
<item quantity="other">%s certificats ignorés provenant de clefs publiques inconnues</item>
</plurals>
- <string name="msg_ip_uid_classifying_zero">Classification des ID utilisateurs (aucune clef de confiance disponible)</string>
+ <string name="msg_ip_uid_classifying_zero">Classification des ID d\'utilisateurs (aucune clef de confiance disponible)</string>
<plurals name="msg_ip_uid_classifying">
- <item quantity="one">Classification des ID utilisateurs (en utilisant une clef de confiance)</item>
- <item quantity="other">Classification des ID utilisateurs (en utilisant %s clefs de confiance)</item>
+ <item quantity="one">Classification des ID d\'utilisateurs (en utilisant une clef de confiance)</item>
+ <item quantity="other">Classification des ID d\'utilisateurs (en utilisant %s clefs de confiance)</item>
</plurals>
- <string name="msg_ip_uid_reorder">Réorganisation des ID utilisateurs</string>
- <string name="msg_ip_uid_processing">Traitement de l\'ID utilisateur %s</string>
- <string name="msg_ip_uid_revoked">L\'ID utilisateur est révoqué</string>
+ <string name="msg_ip_uid_reorder">Réorganisation des ID d\'utilisateurs</string>
+ <string name="msg_ip_uid_processing">Traitement de l\'ID d\'utilisateur %s</string>
+ <string name="msg_ip_uid_revoked">L\'ID d\'utilisateur est révoqué</string>
<string name="msg_is_bad_type_public">Tentative d\'importer le trousseau public comme secret. Ceci est un bogue, veuillez remplir un rapport !</string>
+ <string name="msg_is_bad_type_uncanon">Tentative d\'importer un trousseau sans canonicalisation. Ceci est un bogue, veuillez remplir un rapport !</string>
<!--Import Secret log entries-->
<string name="msg_is">Importation de la clef secrète %s</string>
<string name="msg_is_db_exception">Erreur de base de données!</string>
@@ -514,12 +491,13 @@
<!--Keyring Canonicalization log entries-->
<string name="msg_kc_public">Canonicalisation du trousseau public %s</string>
<string name="msg_kc_secret">Canonicalisation du trousseau secret %s</string>
- <string name="msg_kc_fatal_no_uid">La canonicalisation du trousseau a échoué : le trousseau n\'a pas d\'ID utilisateur valides</string>
+ <string name="msg_kc_fatal_no_uid">La canonicalisation du trousseau a échoué : le trousseau n\'a pas d\'ID d\'utilisateur valides</string>
<string name="msg_kc_master">Traitement de la clef maîtresse</string>
<string name="msg_kc_revoke_bad_err">Suppression du mauvais certificat de révocation du trousseau</string>
<string name="msg_kc_revoke_bad_local">Suppression du certificat de révocation du trousseau ayant le drapeau « local »</string>
<string name="msg_kc_revoke_bad_time">Suppression du certificat de révocation du trousseau ayant une estampille temporelle dans le futur</string>
<string name="msg_kc_revoke_bad_type">Suppression du certificat de clef maîtresse de type inconnu (%s)</string>
+ <string name="msg_kc_revoke_bad_type_uid">Suppression de la certification de l\'ID d\'utilisateur en mauvaise position</string>
<string name="msg_kc_revoke_bad">Suppression du mauvais certificat de révocation du trousseau</string>
<string name="msg_kc_revoke_dup"> Suppression du certificat redondant de révocation du trousseau</string>
<string name="msg_kc_sub">Traitement de la sous-clef %s</string>
@@ -530,9 +508,9 @@
<string name="msg_kc_sub_bad_time">Suppression du certificat de liaison de la sous-clef ayant une estampille temporelle dans le futur</string>
<string name="msg_kc_sub_bad_type">Type de certificat de sous-clef inconnu : %s</string>
<string name="msg_kc_sub_dup">Suppression du certificat redondant de liaison de sous-clef</string>
- <string name="msg_kc_sub_primary_bad">Suppression du certificat de liaison de la sous-clef à cause d\'un certificat de liaison primaire invalide</string>
- <string name="msg_kc_sub_primary_bad_err">Suppression du certificat de liaison de la sous-clef due à un mauvais certificat de liaison</string>
- <string name="msg_kc_sub_primary_none">Suppression du certificat de liaison de la sous-clef due à un certificat de liaison primaire manquant</string>
+ <string name="msg_kc_sub_primary_bad">Suppression du certificat de liaison de la sous-clef à cause d\'un certificat de liaison principal invalide</string>
+ <string name="msg_kc_sub_primary_bad_err">Suppression du certificat de liaison de la sous-clef due à un mauvais certificat principal de liaison</string>
+ <string name="msg_kc_sub_primary_none">Suppression du certificat de liaison de la sous-clef due à un certificat principal de liaison manquant</string>
<string name="msg_kc_sub_no_cert">Aucun certificat valide trouvé pour %s, qui est maintenant enlevé du trousseau</string>
<string name="msg_kc_sub_revoke_bad_err">Suppression du certificat de révocation de la mauvaise sous-clef</string>
<string name="msg_kc_sub_revoke_bad">Suppression du certificat de révocation de la mauvaise sous-clef</string>
@@ -547,16 +525,17 @@
<item quantity="one">Canonicalisation du trousseau réussie, un certificat redondant supprimé</item>
<item quantity="other">Canonicalisation du trousseau réussie, %d certificats redondants supprimés</item>
</plurals>
- <string name="msg_kc_uid_bad_err">Suppression du mauvais auto-certificat pour l\'ID utilisateur %s</string>
- <string name="msg_kc_uid_bad_local">Suppression du certificat d\'ID utilisateur ayant le drapeau « local »</string>
- <string name="msg_kc_uid_bad_time">Suppression de l\'ID utilisateur ayant une estampille temporelle dans le futur</string>
- <string name="msg_kc_uid_bad_type">Suppression du certificat d\'ID utilisateur de type inconnu (%s)</string>
- <string name="msg_kc_uid_bad">Suppression du mauvais auto-certificat pour l\'ID utilisateur « %s »</string>
- <string name="msg_kc_uid_dup">Suppression de l\'auto-certificat périmé pour l\'ID utilisateur « %s »</string>
- <string name="msg_kc_uid_foreign">Suppression du certificat étranger d\'ID utilisateur par %s</string>
- <string name="msg_kc_uid_revoke_dup">Suppression du certificat de révocation redondant pour l\'ID utilisateur « %s »</string>
- <string name="msg_kc_uid_revoke_old">Suppression du certificat de révocation périmé pour l\'ID utilisateur « %s »</string>
- <string name="msg_kc_uid_no_cert">Aucun auto-certificat valide trouvé pour l\'ID utilisateur %s, qui est maintenant enlevé du trousseau</string>
+ <string name="msg_kc_uid_bad_err">Suppression du mauvais auto-certificat pour l\'ID d\'utilisateur %s</string>
+ <string name="msg_kc_uid_bad_local">Suppression du certificat d\'ID d\'utilisateur ayant le drapeau « local »</string>
+ <string name="msg_kc_uid_bad_time">Suppression de l\'ID d\'utilisateur ayant une estampille temporelle dans le futur</string>
+ <string name="msg_kc_uid_bad_type">Suppression du certificat d\'ID d\'utilisateur de type inconnu (%s)</string>
+ <string name="msg_kc_uid_bad">Suppression du mauvais auto-certificat pour l\'ID d\'utilisateur « %s »</string>
+ <string name="msg_kc_uid_dup">Suppression de l\'auto-certificat périmé pour l\'ID d\'utilisateur « %s »</string>
+ <string name="msg_kc_uid_foreign">Suppression du certificat étranger d\'ID d\'utilisateur par %s</string>
+ <string name="msg_kc_uid_revoke_dup">Suppression du certificat de révocation redondant pour l\'ID d\'utilisateur « %s »</string>
+ <string name="msg_kc_uid_revoke_old">Suppression du certificat de révocation périmé pour l\'ID d\'utilisateur « %s »</string>
+ <string name="msg_kc_uid_no_cert">Aucun auto-certificat valide trouvé pour l\'ID d\'utilisateur %s, qui est maintenant enlevé du trousseau</string>
+ <string name="msg_kc_uid_remove">Suppression de l\'ID d\'utilisateur invalide %s</string>
<!--Keyring merging log entries-->
<string name="msg_mg_public">Fusion vers le trousseau public %s</string>
<string name="msg_mg_secret">Fusion vers le trousseau secret %s</string>
@@ -564,16 +543,29 @@
<string name="msg_mg_heterogeneous">Il a été tenté de consolider les trousseaux hétérogènes</string>
<string name="msg_mg_new_subkey">Ajout de la nouvelle sous-clef %s</string>
<string name="msg_mg_found_new">%s nouveaux certificats trouvés dans le trousseau</string>
+ <string name="msg_mg_unchanged">Aucun nouveau certificat</string>
+ <!--createSecretKeyRing-->
+ <string name="msg_cr">Génération d\'une nouvelle clef maîtresse</string>
+ <string name="msg_cr_error_no_master">Aucune option de clef maîtresse n\'a été spécifiée !</string>
+ <string name="msg_cr_error_no_user_id">Les trousseaux doivent être créés avec au moins un ID d\'utilisateur !</string>
+ <string name="msg_cr_error_no_certify">La clef maîtresse doit avoir le drapeau « certifié » !</string>
+ <string name="msg_cr_error_keysize_512">La taille de la clef doit être supérieure ou égale à 512 !</string>
+ <string name="msg_cr_error_internal_pgp">Erreur interne PGP !</string>
+ <string name="msg_cr_error_unknown_algo">Mauvais choix d’algorithme !</string>
+ <string name="msg_cr_error_master_elgamal">La clef maîtresse ne doit pas être de type ElGamal !</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modification du trousseau %s</string>
<string name="msg_mf_error_encode">Exception d\'encodage !</string>
<string name="msg_mf_error_fingerprint">L\'empreinte de clef effective ne correspond pas à celle attendue !</string>
- <string name="msg_mf_error_keyid">Aucune ID de clef. Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_mf_error_keyid">Aucune ID de clef. Ceci est une erreur interne, veuillez remplir un rapport de bogue !</string>
<string name="msg_mf_error_integrity">Erreur interne, le contrôle d\'intégrité a échoué !</string>
- <string name="msg_mf_error_revoked_primary">Les IDs d\'un utilisateur révoqué ne peuvent pas être primaires !</string>
+ <string name="msg_mf_error_noexist_primary">Mauvais ID principal spécifié !</string>
+ <string name="msg_mf_error_revoked_primary">Les IDs d\'utilisateurs révoqués ne peuvent pas être principaux !</string>
<string name="msg_mf_error_pgp">Exception interne PGP !</string>
<string name="msg_mf_error_sig">Exception de signature !</string>
<string name="msg_mf_passphrase">Changement de la phrase de passe</string>
+ <string name="msg_mf_primary_replace_old">Remplacement du certificat de l\'ID d\'utilisateur principal précédent</string>
+ <string name="msg_mf_primary_new">Génération d\'un nouveau certificat pour le nouvel ID d\'utilisateur principal</string>
<string name="msg_mf_subkey_change">Modification de la sous-clef %s</string>
<string name="msg_mf_subkey_missing">Une action a été tentée sur la sous-clef manquante %s !</string>
<string name="msg_mf_subkey_new">Génération d\'une nouvelle sous-clef %2$s de %1$s bit</string>
@@ -581,12 +573,20 @@
<string name="msg_mf_subkey_past_expiry">La date d\'expiration ne peut pas être dans le passé !</string>
<string name="msg_mf_subkey_revoke">Révocation de la sous-clef %s</string>
<string name="msg_mf_success">Trousseau modifié avec succès</string>
- <string name="msg_mf_uid_add">Ajout de l\'ID utilisateur %s</string>
- <string name="msg_mf_uid_primary">Changement de l\'UID primaire en %s</string>
- <string name="msg_mf_uid_revoke">Révocation de l\'ID utilisateur %s</string>
+ <string name="msg_mf_uid_add">Ajout de l\'ID d\'utilisateur %s</string>
+ <string name="msg_mf_uid_primary">Changement de l\'UID principal en %s</string>
+ <string name="msg_mf_uid_revoke">Révocation de l\'ID d\'utilisateur %s</string>
+ <string name="msg_mf_uid_error_empty">L\'ID d\'utilisateur ne peut pas être vide !</string>
<string name="msg_mf_unlock_error">Erreur lors du déverrouillage du trousseau !</string>
<string name="msg_mf_unlock">Déverrouillage du trousseau</string>
+ <!--PassphraseCache-->
+ <string name="passp_cache_notif_click_to_clear">Cliquer ici pour effacer les phrases de passe mises en cache</string>
+ <string name="passp_cache_notif_n_keys">OpenKeychain a mis en cache %d phrases de passe</string>
+ <string name="passp_cache_notif_keys">Phrases de passe mises en cache :</string>
+ <string name="passp_cache_notif_clear">Effacer le cache</string>
+ <string name="passp_cache_notif_pwd">Mot de passe</string>
<!--unsorted-->
+ <string name="internal_error">Erreur interne !</string>
<string name="section_certifier_id">Certificateur</string>
<string name="section_cert">Détails du certificat</string>
<string name="label_user_id">identité</string>
@@ -598,14 +598,17 @@
<string name="label_cert_type">Type</string>
<string name="error_key_not_found">Clef introuvable !</string>
<string name="error_key_processing">Erreur lors du traitement de la clef !</string>
- <string name="no_subkey">sous-clef non disponible</string>
<string name="key_stripped">dépouillée</string>
- <string name="secret_cannot_multiple">Les clefs secrètes ne peuvent être supprimées qu\'individuellement !</string>
+ <string name="secret_cannot_multiple">Vos propres clefs ne peuvent être supprimées qu\'individuellement !</string>
<string name="title_view_cert">Voir les détails du certificat</string>
<string name="unknown_algorithm">inconnu</string>
<string name="can_sign_not">impossible de signer</string>
- <string name="error_encoding">Erreur d\'encodage</string>
<string name="error_no_encrypt_subkey">Aucune sous-clef de chiffrement n\'est disponible !</string>
<string name="info_no_manual_account_creation">Ne pas créer de comptes-OpenKeychain manuellement.\nPour plus d\'informations, consultez l\'aide.</string>
<string name="contact_show_key">Montrer la clef (%s)</string>
+ <!--First Time-->
+ <string name="first_time_text1">Reprenez le contrôle de votre confidentialité avec OpenKeychain |</string>
+ <string name="first_time_create_key">Créer ma clef</string>
+ <string name="first_time_import_key">Importer une clef existante</string>
+ <string name="first_time_skip">Ignorer le paramétrage</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml
index 074efb78b..d31d1cc87 100644
--- a/OpenKeychain/src/main/res/values-it/strings.xml
+++ b/OpenKeychain/src/main/res/values-it/strings.xml
@@ -1,20 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Seleziona Chiave Pubblica</string>
- <string name="title_select_secret_key">Seleziona Chiave Privata</string>
<string name="title_encrypt">Codifica</string>
<string name="title_decrypt">Decodifica</string>
<string name="title_authentication">Frase di accesso</string>
- <string name="title_create_key">Crea Chiave</string>
<string name="title_edit_key">Modifica Chiave</string>
- <string name="title_wizard">Benvenuto in OpenKeychain</string>
<string name="title_preferences">Preferenze</string>
<string name="title_api_registered_apps">Apps</string>
<string name="title_key_server_preference">Preferenze Server delle Chiavi</string>
<string name="title_change_passphrase">Cambia Frase Di Accesso</string>
- <string name="title_set_passphrase">Imposta Frase di Accesso</string>
- <string name="title_share_with">Condividi con...</string>
<string name="title_share_fingerprint_with">Condivi impronta con...</string>
<string name="title_share_key">Condividi chiave con...</string>
<string name="title_share_file">Condividi file con...</string>
@@ -35,60 +29,33 @@
<string name="section_general">Generale</string>
<string name="section_defaults">Predefiniti</string>
<string name="section_advanced">Avanzato</string>
- <string name="section_master_key">Chiave Principale</string>
- <string name="section_master_user_id">Identità Primaria</string>
<string name="section_actions">Azioni</string>
<string name="section_share_key">Intera chiave</string>
<string name="section_certification_key">La Tua Chiave usata per la certificazione</string>
<string name="section_upload_key">Carica Chiave</string>
<string name="section_key_server">Server delle Chiavi</string>
- <string name="section_encrypt_and_or_sign">Codifica e/o Firma</string>
- <string name="section_decrypt_verify">Decodifica e Verifica</string>
<string name="section_fingerprint">Impronta</string>
<string name="section_key_to_certify">Chiave da certificare</string>
<!--button-->
- <string name="btn_certify">Certifica</string>
<string name="btn_decrypt_verify_file">Decodifica, verifica e salva su file</string>
<string name="btn_decrypt_verify_message">Decodifica e verifica messaggio</string>
- <string name="btn_decrypt_verify_clipboard">Dagli Appunti</string>
<string name="btn_encrypt_file">Codifica e salva file</string>
<string name="btn_save">Salva</string>
<string name="btn_do_not_save">Annulla</string>
<string name="btn_delete">Elimina</string>
<string name="btn_no_date">Nessuno</string>
<string name="btn_okay">OK</string>
- <string name="btn_change_passphrase">Cambia Nuova Frase di Accesso</string>
- <string name="btn_set_passphrase">Imposta Nuova Frase di Accesso</string>
<string name="btn_export_to_server">Carica sul Server delle Chiavi</string>
<string name="btn_next">Prossimo</string>
<string name="btn_back">Precedente</string>
- <string name="btn_clipboard">Appunti</string>
- <string name="btn_share">Condividi...</string>
<string name="btn_lookup_key">Chiave di ricerca</string>
- <string name="btn_encryption_advanced_settings_show">Mostra impostazioni avanzate</string>
- <string name="btn_encryption_advanced_settings_hide">Nascondi impostazioni avanzate</string>
- <string name="btn_share_encrypted_signed">Condividi messaggio codificato/firmato...</string>
<string name="btn_view_cert_key">Mostra chiave di certificazione</string>
<!--menu-->
<string name="menu_preferences">Impostazioni</string>
<string name="menu_help">Aiuto</string>
<string name="menu_export_key">Esporta su un file</string>
<string name="menu_delete_key">Cancella chiave</string>
- <string name="menu_create_key">Crea chiave</string>
- <string name="menu_create_key_expert">Crea chiave (avanzato)</string>
<string name="menu_search">Cerca</string>
- <string name="menu_key_server">Server delle Chiavi...</string>
- <string name="menu_update_key">Aggiorna dal server delle chiavi</string>
- <string name="menu_export_key_to_server">Carica chiave nel server</string>
- <string name="menu_share">Condividi...</string>
- <string name="menu_share_title_fingerprint">Condivi impronta...</string>
- <string name="menu_share_title">Condividi intera chiave...</string>
- <string name="menu_share_default_fingerprint">con..</string>
- <string name="menu_share_default">con...</string>
- <string name="menu_share_qr_code">con Codice QR</string>
- <string name="menu_share_qr_code_fingerprint">con Codice QR</string>
- <string name="menu_share_nfc">con NFC</string>
- <string name="menu_copy_to_clipboard">Copia negli appunti</string>
<string name="menu_beam_preferences">Impostazioni Beam</string>
<string name="menu_key_edit_cancel">Annulla</string>
<string name="menu_encrypt_to">Codifica su...</string>
@@ -97,22 +64,18 @@
<string name="menu_export_all_keys">Esporta tutte le chiavi</string>
<string name="menu_advanced">Mostra informazioni avanzate</string>
<!--label-->
- <string name="label_sign">Firma</string>
<string name="label_message">Messaggio</string>
<string name="label_file">File</string>
<string name="label_no_passphrase">Nessuna Frase di Accesso</string>
<string name="label_passphrase">Frase di Accesso</string>
- <string name="label_passphrase_again">Di nuovo</string>
+ <string name="label_passphrase_again">Ripeti Frase di Accesso</string>
<string name="label_algorithm">Algortimo</string>
<string name="label_ascii_armor">Armatura ASCII</string>
- <string name="label_select_public_keys">Destinatari</string>
- <string name="label_delete_after_encryption">Cancella Dopo Codifica</string>
+ <string name="label_conceal_pgp_application">Fai sapere agli altri che utilizzi OpenKeychain</string>
+ <string name="label_conceal_pgp_application_summary">Scrive \'OpenKeychain v2.7\' nelle firme OpenPGP, testi cifrati e chiavi esportate</string>
<string name="label_delete_after_decryption">Cancella Dopo Decodifica</string>
- <string name="label_share_after_encryption">Condividi Dopo la Codifica</string>
<string name="label_encryption_algorithm">Algoritmo di Codifica</string>
<string name="label_hash_algorithm">Algoritmo di Hash</string>
- <string name="label_asymmetric">con Chiave Pubblica</string>
- <string name="label_symmetric">con Frase di Accesso</string>
<string name="label_passphrase_cache_ttl">Cache Frase di Accesso</string>
<string name="label_message_compression">Compressione Messaggio</string>
<string name="label_file_compression">Compressione File</string>
@@ -129,12 +92,7 @@
<string name="label_email">Email</string>
<string name="label_send_key">Carica chiave nel server delle chiavi selezionati dopo la certificazione</string>
<string name="label_fingerprint">Impronta</string>
- <string name="select_keys_button_default">Seleziona</string>
<string name="expiry_date_dialog_title">Impostare la data di scadenza</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d selezionato</item>
- <item quantity="other">%d selezionati</item>
- </plurals>
<string name="user_id_no_name">&lt;nessun nome&gt;</string>
<string name="none">&lt;nessuno&gt;</string>
<string name="no_key">&lt;nessuna chiave&gt;</string>
@@ -181,7 +139,6 @@
<string name="flag_authenticate">Convalida</string>
<!--sentences-->
<string name="wrong_passphrase">Frase di Accesso errata</string>
- <string name="set_a_passphrase">Imposta prima una frase di accesso.</string>
<string name="no_filemanager_installed">Nessun gestore file compatibile installato.</string>
<string name="passphrases_do_not_match">Le frasi di accesso non corrispondono.</string>
<string name="passphrase_must_not_be_empty">Si prega di inserire una frase di accesso.</string>
@@ -200,15 +157,11 @@
<string name="specify_file_to_export_to">Perfavore specifica su quale file esportare.\nATTENZIONE: Il file sara\' sovrascritto se esistente.</string>
<string name="key_deletion_confirmation_multi">Vuoi veramente eliminare tutte le chiavi pubbliche selezionate?\nNon potrai annullare!</string>
<string name="secret_key_deletion_confirmation">Vuoi veramente eliminare la chiave PRIVATA \'%s\'?\nNon potrai annullare!</string>
- <string name="ask_save_changed_key">Hai apportato modifiche al tuo portachiavi, vuoi salvarlo?</string>
- <string name="ask_empty_id_ok">Hai aggiunto una identità vuota, sei sicuro di voler continuare?</string>
<string name="public_key_deletetion_confirmation">Vuoi veramente eliminare la chiave pubblica \'%s\'?\nNon potrai annullare!</string>
- <string name="also_export_secret_keys">Esportare anche le chiavi segrete?</string>
<string name="key_exported">1 chiave esportata correttamente.</string>
<string name="keys_exported">%d chiavi esportate correttamente.</string>
<string name="no_keys_exported">Nessuna chiave esportata.</string>
<string name="key_creation_el_gamal_info">Nota: supporto sottochiavi solo per ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Nota: la generazione di chiavi RSA con lunghezza pari a 1024 bit o inferiore è considerata non sicura ed è disabilitata per la generazione di nuove chiavi.</string>
<string name="key_not_found">Impossibile trovare la chiave %08X.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d chiave segreta non valida ignorata. Forse hai esportato con opzione\n--export-secret-subkeys\nAssicurati di esportare con\n--export-secret-keys\ninvece.</item>
@@ -220,7 +173,6 @@
<string name="nfc_successful">Chiave correttamente inviata tramite NFC Beam!</string>
<string name="key_copied_to_clipboard">Chiave copiata negli appunti!</string>
<string name="fingerprint_copied_to_clipboard">Impronta copiata negli appunti!</string>
- <string name="key_has_already_been_certified">La chiave è già certificata!</string>
<string name="select_key_to_certify">Per favore seleziona una chiave per la certificazione!</string>
<string name="key_too_big_for_sharing">Chiave troppo grande per essere condivisa in questo modo!</string>
<!--errors
@@ -231,35 +183,24 @@
<string name="error_no_secret_key_found">nessuna chiave privata adatta trovata</string>
<string name="error_external_storage_not_ready">memoria esterna non pronta</string>
<string name="error_key_size_minimum512bit">La grandezza della chiave deve essere almeno di 512bit</string>
- <string name="error_master_key_must_not_be_el_gamal">La chiave principale non puo\' essere ElGamal</string>
<string name="error_unknown_algorithm_choice">opzione algoritmo sconosciuta</string>
<string name="error_user_id_no_email">Nessuna email trovata</string>
<string name="error_key_needs_a_user_id">neccessaria almeno una identità</string>
- <string name="error_main_user_id_must_not_be_empty">L\'identità primaria non può essere vuota</string>
- <string name="error_key_needs_master_key">necessaria almeno una chiave principale</string>
<string name="error_no_signature_passphrase">nessuna frase di accesso inserita</string>
<string name="error_no_signature_key">nessuna chiave di firma inserita</string>
<string name="error_invalid_data">dati di codifica non validi</string>
<string name="error_integrity_check_failed">Controllo di integrita\' fallito! I dati sono stati modificati!</string>
<string name="error_wrong_passphrase">frase di accesso errata</string>
- <string name="error_saving_keys">errore nel salvataggio di alcune chiavi</string>
<string name="error_could_not_extract_private_key">impossibile estrarre la chiave privata</string>
- <string name="error_expiry_must_come_after_creation">La data di scadenza deve essere postuma quella di creazione</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Flusso di dati diretto senza file corrispettivo nel filesystem non e\' supportato.</string>
<string name="error_jelly_bean_needed">Devi avere Android 4.1 per usare Android NFC Beam!</string>
<string name="error_nfc_needed">NFC non disponibile nel tuo dispositivo!</string>
<string name="error_nothing_import">Nessuna chiave trovata!</string>
- <string name="error_query_too_short">Chiave della query di ricerca troppo corta</string>
- <string name="error_searching_keys">Errore irreversibile nella ricerca di chiavi sul server</string>
- <string name="error_too_many_responses">Chiave della query di ricerca ha generato troppi candidati; Si prega di perfezionare la ricerca</string>
- <string name="error_import_no_valid_keys">File/Appunti vuoti</string>
<string name="error_generic_report_bug">Si è verificato un errore generico, si prega di creare una nuova segnalazione di errore per OpenKeychain.</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">parte del file caricato e\' un oggetto OpenPGP valido, ma non una chave OpenPGP</item>
<item quantity="other">parti del file caricato sono oggetti OpenPGP validi, ma non chavi OpenPGP</item>
</plurals>
- <string name="error_change_something_first">È necessario apportare modifiche al portachiavi prima prima che sia possibile salvarlo</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Firma non valida!</string>
<string name="decrypt_result_signature_unknown_pub_key">Chiave pubblica sconosciuta</string>
@@ -276,18 +217,11 @@
<string name="progress_importing">importazione...</string>
<string name="progress_exporting">esportazione...</string>
<string name="progress_building_key">fabbricazione chiave...</string>
- <string name="progress_certifying_master_key">certificazione chiave principale...</string>
<string name="progress_building_master_key">fabbricazione portachiavi principale...</string>
- <string name="progress_adding_sub_keys">aggiunta sottochiavi...</string>
- <string name="progress_saving_key_ring">salvataggio chiavi...</string>
<plurals name="progress_exporting_key">
<item quantity="one">esportazione chiave...</item>
<item quantity="other">esportazione chiavi...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">generazione chiave, sono necessari fino a 3 minuti...</item>
- <item quantity="other">generazione chiavi, sono necessari fino a 3 minuti...</item>
- </plurals>
<string name="progress_extracting_signature_key">estrazione chiavi di firma...</string>
<string name="progress_extracting_key">estrazione chiave...</string>
<string name="progress_preparing_streams">preparazione flussi...</string>
@@ -305,8 +239,6 @@
<string name="progress_deleting_securely">eliminazione sicura di \'%s\'...</string>
<!--action strings-->
<string name="hint_public_keys">Nome/Email/ID Chiave...</string>
- <string name="hint_secret_keys">Cerca Chiave Privata</string>
- <string name="action_share_key_with">Condividi chiave con...</string>
<string name="hint_keybase_search">Nome/Keybase.io nome utente...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
@@ -338,22 +270,22 @@
<string name="import_tab_qr_code">Codice QR/NFC</string>
<string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Importa chiavi selezionate</string>
- <string name="import_from_clipboard">Importa dagli appunti</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Codice QR con ID %s mancante</item>
- <item quantity="other">Codici QR con ID %s mancanti</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Perfavore inizia col Codice QR con ID 1</string>
<string name="import_qr_code_wrong">Codica QR deformato! Prova di nuovo!</string>
- <string name="import_qr_code_finished">Scansione codice QR completata!</string>
<string name="import_qr_code_too_short_fingerprint">Impronta troppo corta (&lt; 16 caratteri)</string>
- <string name="import_qr_scan_button">Scansiona il Codice QR con \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Per ricevere le chiavi via NFC, il dispositivo deve essere sbloccato.</string>
- <string name="import_nfc_help_button">Aiuto</string>
<string name="import_qr_code_button">Scansione Codice QR</string>
- <string name="import_clipboard_button">Ottieni chiave dagli appunti</string>
- <string name="import_keybase_button">Ottieni chiave da Keybase.io</string>
<!--Import result toast-->
+ <plurals name="import_keys_added_and_updated_1">
+ <item quantity="one">Chiave importata correttamente.</item>
+ <item quantity="other">%1$d chiavi importate correttamente.</item>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="one">Chiave%2$s importata correttamente.</item>
+ <item quantity="other">%1$d chiavi%2$s importate correttamente.</item>
+ </plurals>
+ <plurals name="import_keys_updated">
+ <item quantity="one">Chiave%2$s aggiornata con successo.</item>
+ <item quantity="other">Aggiornate %1$d chiavi%2$s con successo.</item>
+ </plurals>
<string name="view_log">Mostra registro</string>
<string name="import_error_nothing">Niente da importare</string>
<string name="import_error">Errore di importazione chiavi!</string>
@@ -381,7 +313,6 @@
<string name="api_settings_package_signature">SHA-256 della Firma del Pacchetto</string>
<string name="api_settings_accounts">Account</string>
<string name="api_settings_accounts_empty">Nessun account collegato a questa applicazione</string>
- <string name="api_create_account_text">L\'applicazione richiede la creazione di un nuovo account. Si prega di selezionare una chiave privata esistente o crearne una nuova.\nLe applicazioni sono limitate all\'utilizzo delle chiavi selezionate qui!</string>
<string name="api_register_text">Le app visualizzate hanno richiesto l\'accesso a OpenKeychain.\nPermetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' apparsa, nega l\'accesso! Puoi revocare l\'accesso dopo, usando la schermata \'App Registrate\'.</string>
<string name="api_register_allow">Permetti accesso</string>
<string name="api_register_disallow">Nega accesso</string>
@@ -392,9 +323,6 @@
<string name="api_error_wrong_signature">Controllo della firma fallito! Hai installato questa app da una fonte diversa? Se sei sicuro che non sia un attacco, revoca la registrazione di questa app in OpenKeychain e dopo registra di nuovo l\'app.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Condividi tramite Codice QR</string>
- <string name="share_qr_code_dialog_start">Scorri tutti i Codici QR usando \'Prossimo\', a scansionali uno ad uno.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Impronta:</string>
- <string name="share_qr_code_dialog_progress">Codice QR con ID %1$d di %2$d</string>
<string name="share_nfc_dialog">Condividi tramite NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -405,7 +333,6 @@
<string name="key_list_empty_text2">Puoi iniziare da</string>
<string name="key_list_empty_text3">o</string>
<string name="key_list_empty_button_create">creazione della tua chiave</string>
- <string name="key_list_empty_button_import">importazione chiavi.</string>
<!--Key view-->
<string name="key_view_action_edit">Modifica chiave</string>
<string name="key_view_action_encrypt">Codifica con questa chiave</string>
@@ -416,21 +343,35 @@
<string name="key_view_tab_share">Condividi</string>
<string name="key_view_tab_keys">Sottochiavi</string>
<string name="key_view_tab_certs">Certificati</string>
+ <!--Edit key-->
+ <string name="edit_key_action_change_passphrase">Cambia Frase Di Accesso</string>
+ <string name="edit_key_action_add_identity">Aggiungi Identità</string>
+ <string name="edit_key_action_add_subkey">Aggiungi Sottochiave</string>
+ <string name="edit_key_edit_user_id_title">Seleziona un azione!</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>Cambia in Identita\' Primaria</item>
+ <item>Revoca identita\'</item>
+ </string-array>
+ <string name="edit_key_edit_subkey_title">Seleziona un azione!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Cambia Scadenza</item>
+ <item>Revoca Sottochiave</item>
+ </string-array>
+ <!--Create key-->
+ <string name="create_key_upload">Carica chiave nel server delle chiavi</string>
+ <string name="create_key_empty">Questo campo è necessario</string>
+ <!--View key-->
+ <string name="view_key_revoked">Questa chiave è stata revocata!</string>
+ <string name="view_key_expired">Questa chiave è scaduta</string>
<!--Navigation Drawer-->
<string name="nav_keys">Chiavi</string>
<string name="nav_encrypt">Firma e Codifica</string>
<string name="nav_decrypt">Decodifica e Verifica</string>
- <string name="nav_import">Importa Chiavi</string>
<string name="nav_apps">Apps</string>
<string name="drawer_open">Apri drawer di navigazione</string>
<string name="drawer_close">Chiudi drawer di navigazione</string>
- <string name="edit">Modifica</string>
<string name="my_keys">Le Mie Chiavi</string>
- <string name="label_secret_key">Chiave Segreta</string>
- <string name="secret_key_yes">disponibile</string>
- <string name="secret_key_no">non disponibile</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Scrivi qui il messaggio da codificare e/o firmare...</string>
<string name="decrypt_content_edit_text_hint">Inserisci il testo cifrato qui per la decodifica e/o verifica...</string>
<!--certs-->
<string name="cert_default">predefiniti</string>
@@ -438,7 +379,7 @@
<string name="cert_casual">casuale</string>
<string name="cert_positive">positivo</string>
<string name="cert_revoke">revocato</string>
- <string name="cert_verify_ok">ok</string>
+ <string name="cert_verify_ok">OK</string>
<string name="cert_verify_failed">fallito!</string>
<string name="cert_verify_error">errore!</string>
<string name="cert_verify_unavailable">chiave non disponibile</string>
@@ -482,11 +423,21 @@
<string name="msg_ip_reinsert_secret">Reinserimento chiave segreta</string>
<string name="msg_ip_uid_cert_bad">Riscontrato certificato sbagliato!</string>
<string name="msg_ip_uid_cert_error">Errore elaborazione certificato!</string>
- <string name="msg_ip_uid_cert_good">ID utente certificato da %1$s (%2$s)</string>
+ <string name="msg_ip_uid_cert_good">ID utente certificato da %1$s</string>
+ <plurals name="msg_ip_uid_certs_unknown">
+ <item quantity="one">Ignoro un certificato rilasciato da chiavi pubbliche sconosciute</item>
+ <item quantity="other">Ignoro %s certificati rilasciati da chiavi pubbliche sconosciute</item>
+ </plurals>
+ <string name="msg_ip_uid_classifying_zero">Classificazione ID utenti(nessuna firma affidabile disponibile)</string>
+ <plurals name="msg_ip_uid_classifying">
+ <item quantity="one">Classificazione ID utenti (uso di una chiave verificata)</item>
+ <item quantity="other">Classificazione ID utenti (uso di %s chiavi verificate)</item>
+ </plurals>
<string name="msg_ip_uid_reorder">Riordinamento ID utenti</string>
<string name="msg_ip_uid_processing">Elaborazione ID utente %s</string>
<string name="msg_ip_uid_revoked">ID utente revocato</string>
<string name="msg_is_bad_type_public">Ho cercato di importare portachiavi pubblico come privato. Questo è un bug, per cortesia inviateci un rapporto!</string>
+ <string name="msg_is_bad_type_uncanon">Tentativo di importare un portachiavi senza canonicalizzazione. Questo è un bug, per cortesia inviateci un rapporto!</string>
<!--Import Secret log entries-->
<string name="msg_is">Importazione chiave segreta %s</string>
<string name="msg_is_db_exception">Errore Banca Dati!</string>
@@ -507,6 +458,7 @@
<string name="msg_kc_revoke_bad_local">Rimozione certificato di revoca del portachiavi con caratteristica \"locale\"</string>
<string name="msg_kc_revoke_bad_time">Rimozione certificato di revoca del portachiavi con marca temporale futura</string>
<string name="msg_kc_revoke_bad_type">Rimozione certificato della chiave principale di tipo sconosciuto (%s)</string>
+ <string name="msg_kc_revoke_bad_type_uid">Rimozione certificazione ID Utente in posizione errata</string>
<string name="msg_kc_revoke_bad">Rimozione certificato di revoca del portachiavi corrotto</string>
<string name="msg_kc_revoke_dup">Rimozione certificato di revoca del portachiavi ridondante</string>
<string name="msg_kc_sub">Elaborazione sottochiave %s</string>
@@ -525,7 +477,15 @@
<string name="msg_kc_sub_revoke_bad">Rimozione certificato di revoca corrotto della sottochiave</string>
<string name="msg_kc_sub_revoke_dup">Rimozione certificato di revoca ridondante della sottochiave</string>
<string name="msg_kc_success">Canonicalizzazione del portachiavi avvenuta con successo, nessuna modifica</string>
+ <plurals name="msg_kc_success_bad">
+ <item quantity="one">Canonicalizzazione portachiavi con successo, rimosso un certificato errato</item>
+ <item quantity="other">Canonicalizzazione portachiavi con successo, rimossi %d certificati errati</item>
+ </plurals>
<string name="msg_kc_success_bad_and_red">Canonicalizzazione portachiavi con successo, rimossi %1$s certificati errati e %2$s certificati ridondanti</string>
+ <plurals name="msg_kc_success_redundant">
+ <item quantity="one">Canonicalizzazione portachiavi con successo, rimosso un certificato ridondante</item>
+ <item quantity="other">Canonicalizzazione portachiavi con successo, rimossi %d certificati ridondanti</item>
+ </plurals>
<string name="msg_kc_uid_bad_err">Rimozione autocertificazione corrotta per ID utente %s</string>
<string name="msg_kc_uid_bad_local">Rimozione certificato ID utente con caratteristica \"locale\"</string>
<string name="msg_kc_uid_bad_time">Rimozione ID utente con marca temporale futura</string>
@@ -536,6 +496,7 @@
<string name="msg_kc_uid_revoke_dup">Rimozione certificato di revoca ridondante per ID utente \"%s\"</string>
<string name="msg_kc_uid_revoke_old">Rimozione certificato di revoca scaduto per ID utente \"%s\"</string>
<string name="msg_kc_uid_no_cert">Nessuna autocertificazione valida trovata per ID utente %s, rimozione dal portachiavi</string>
+ <string name="msg_kc_uid_remove">Rimozione ID Utente %s non valido</string>
<!--Keyring merging log entries-->
<string name="msg_mg_public">Fusione nel portachiavi pubblico %s</string>
<string name="msg_mg_secret">Fusione nel portachiavi privato %s</string>
@@ -543,12 +504,29 @@
<string name="msg_mg_heterogeneous">Tentativo di consolidare portachiavi eterogenei</string>
<string name="msg_mg_new_subkey">Aggiunta nuova sottochiave %s</string>
<string name="msg_mg_found_new">Trovati %s nuovi certificati nel portachiavi</string>
+ <string name="msg_mg_unchanged">Nessun nuovo certificato</string>
+ <!--createSecretKeyRing-->
+ <string name="msg_cr">Generazione nuova chiave principale</string>
+ <string name="msg_cr_error_no_master">Nessuna opzione della chiave principale specificata!</string>
+ <string name="msg_cr_error_no_user_id">I portachiavi devono essere creati con almeno un ID utente!</string>
+ <string name="msg_cr_error_no_certify">La chiave principale deve avere la caratteristica di certificazione!</string>
+ <string name="msg_cr_error_keysize_512">La grandezza della chiave deve essere di 512bit o maggiore</string>
+ <string name="msg_cr_error_internal_pgp">Errore PGP interno!</string>
+ <string name="msg_cr_error_unknown_algo">Pessima opzione di algortimo!</string>
+ <string name="msg_cr_error_master_elgamal">La chiave principale non deve essere del tipo ElGamal!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modifica del portachiavi %s</string>
<string name="msg_mf_error_encode">Eccezione di codifica!</string>
+ <string name="msg_mf_error_fingerprint">Impronta chiave attuale non corrispondente!</string>
+ <string name="msg_mf_error_keyid">Nessun ID chiave. Questo è un errore di programmazione, per favore invia una segnalazione!</string>
+ <string name="msg_mf_error_integrity">Errore interno, controllo di integrità fallito!</string>
+ <string name="msg_mf_error_noexist_primary">ID utente primario specificato non valido!</string>
+ <string name="msg_mf_error_revoked_primary">ID utente revocato non può essere primario!</string>
<string name="msg_mf_error_pgp">Eccezione interna di PGP!</string>
<string name="msg_mf_error_sig">Eccezione di firma!</string>
<string name="msg_mf_passphrase">Cambio frase di accesso</string>
+ <string name="msg_mf_primary_replace_old">Sostituzione certificato del ID utente primario precedente</string>
+ <string name="msg_mf_primary_new">Generazione di un nuovo certificato per il nuovo ID utente primario</string>
<string name="msg_mf_subkey_change">Modifica sottochiave %s</string>
<string name="msg_mf_subkey_missing">Tentativo di operare su sottochiave mancante %s!</string>
<string name="msg_mf_subkey_new">Generazione nuovi %1$s bit %2$s sottochiave</string>
@@ -559,9 +537,17 @@
<string name="msg_mf_uid_add">Aggiunta id utente %s</string>
<string name="msg_mf_uid_primary">Cambio UID primario in %s</string>
<string name="msg_mf_uid_revoke">Revoca ID utente %s</string>
+ <string name="msg_mf_uid_error_empty">ID Utente non può essere vuoto!</string>
<string name="msg_mf_unlock_error">Errore di apertura portachiavi!</string>
<string name="msg_mf_unlock">Apertura portachiavi</string>
+ <!--PassphraseCache-->
+ <string name="passp_cache_notif_click_to_clear">Clicca per rimuovere la frase di accesso nella cache</string>
+ <string name="passp_cache_notif_n_keys">OpenKeychain ha memorizzato nella cache %d frasi di accesso</string>
+ <string name="passp_cache_notif_keys">Frasi di accesso memorizzate:</string>
+ <string name="passp_cache_notif_clear">Pulisci Cache</string>
+ <string name="passp_cache_notif_pwd">Password</string>
<!--unsorted-->
+ <string name="internal_error">Errore interno!</string>
<string name="section_certifier_id">Certificatore</string>
<string name="section_cert">Dettagli Certificato</string>
<string name="label_user_id">Identit</string>
@@ -573,14 +559,14 @@
<string name="label_cert_type">Tipo</string>
<string name="error_key_not_found">Chiave non trovata!</string>
<string name="error_key_processing">Errore di elaborazione chiave!</string>
- <string name="no_subkey">sottochiave non disponibile</string>
<string name="key_stripped">ripulito</string>
- <string name="secret_cannot_multiple">Le chiavi segrete possono essere cancellate solo individualmente!</string>
<string name="title_view_cert">Visualizza Dettagli Certificati</string>
<string name="unknown_algorithm">sconosciuto</string>
<string name="can_sign_not">non può firmare</string>
- <string name="error_encoding">Errore di codifica</string>
<string name="error_no_encrypt_subkey">Nessuna sottochiave di codifica disponibile!</string>
<string name="info_no_manual_account_creation">Non creare account OpenKeychain manualmente\nPer ulteriori informazioni, vedere la Guida.</string>
<string name="contact_show_key">Mostra chiave (%s)</string>
+ <!--First Time-->
+ <string name="first_time_text1">Riappropriati della tua riservatezza con OpenKeychain!</string>
+ <string name="first_time_skip">Salta Installazione</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml
index 070ee7f5a..de22a8f7c 100644
--- a/OpenKeychain/src/main/res/values-ja/strings.xml
+++ b/OpenKeychain/src/main/res/values-ja/strings.xml
@@ -1,20 +1,17 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">公開鍵の選択</string>
- <string name="title_select_secret_key">秘密鍵の選択</string>
+ <string name="title_select_recipients">鍵を選択</string>
+ <string name="title_select_secret_key">あなたの鍵を選択</string>
<string name="title_encrypt">暗号化</string>
<string name="title_decrypt">復号化</string>
<string name="title_authentication">パスフレーズ</string>
- <string name="title_create_key">鍵の生成</string>
+ <string name="title_create_key">自分の鍵の生成</string>
<string name="title_edit_key">鍵の編集</string>
- <string name="title_wizard">OpenKeychainへようこそ</string>
<string name="title_preferences">設定</string>
<string name="title_api_registered_apps">アプリ</string>
<string name="title_key_server_preference">鍵サーバ設定</string>
<string name="title_change_passphrase">パスフレーズの変更</string>
- <string name="title_set_passphrase">パスフレーズの設定</string>
- <string name="title_share_with">...で共有</string>
<string name="title_share_fingerprint_with">...で指紋の共有</string>
<string name="title_share_key">...で鍵の共有</string>
<string name="title_share_file">...でファイルの共有</string>
@@ -35,60 +32,39 @@
<string name="section_general">一般</string>
<string name="section_defaults">デフォルト</string>
<string name="section_advanced">拡張</string>
- <string name="section_master_key">主鍵</string>
- <string name="section_master_user_id">メインのユーザID</string>
<string name="section_actions">アクション</string>
<string name="section_share_key">すべての鍵</string>
<string name="section_certification_key">あなたの鍵を証明に利用します</string>
<string name="section_upload_key">鍵のアップロード</string>
<string name="section_key_server">鍵サーバ</string>
- <string name="section_encrypt_and_or_sign">暗号化/署名</string>
- <string name="section_decrypt_verify">復号化と検証</string>
<string name="section_fingerprint">指紋</string>
<string name="section_key_to_certify">鍵は検証されています。</string>
<!--button-->
- <string name="btn_certify">証明</string>
<string name="btn_decrypt_verify_file">復号化と検証、そしてファイルの保存</string>
<string name="btn_decrypt_verify_message">メッセージの復号化と検証</string>
- <string name="btn_decrypt_verify_clipboard">クリップボードから</string>
<string name="btn_encrypt_file">暗号化してファイルを保存</string>
+ <string name="btn_encrypt_share_file">暗号化してファイルを共有</string>
<string name="btn_save">保存</string>
<string name="btn_do_not_save">キャンセル</string>
<string name="btn_delete">削除</string>
<string name="btn_no_date">無し</string>
<string name="btn_okay">OK</string>
- <string name="btn_change_passphrase">新しいパスフレーズに変更</string>
- <string name="btn_set_passphrase">新しいパスフレーズを設定</string>
<string name="btn_export_to_server">鍵サーバへアップロード</string>
<string name="btn_next">次</string>
<string name="btn_back">戻る</string>
- <string name="btn_clipboard">クリップボード</string>
- <string name="btn_share">...で共有</string>
<string name="btn_lookup_key">鍵検出</string>
- <string name="btn_encryption_advanced_settings_show">拡張設定を表示</string>
- <string name="btn_encryption_advanced_settings_hide">拡張設定を隠す</string>
- <string name="btn_share_encrypted_signed">暗号化/署名メッセージの共有...</string>
+ <string name="btn_share_encrypted_signed">暗号化してメッセージを共有</string>
<string name="btn_view_cert_key">検証した鍵を見る</string>
+ <string name="btn_create_key">鍵の生成</string>
+ <string name="btn_add_files">ファイルの追加</string>
<!--menu-->
<string name="menu_preferences">設定</string>
<string name="menu_help">ヘルプ</string>
<string name="menu_export_key">ファイルへのエクスポート</string>
<string name="menu_delete_key">鍵の削除</string>
- <string name="menu_create_key">鍵の生成</string>
- <string name="menu_create_key_expert">鍵の生成(上級)</string>
+ <string name="menu_create_key">自分の鍵の生成</string>
+ <string name="menu_import_existing_key">既存の鍵のインポート</string>
<string name="menu_search">検索</string>
- <string name="menu_key_server">鍵サーバ...</string>
- <string name="menu_update_key">鍵サーバからの更新</string>
- <string name="menu_export_key_to_server">鍵サーバへのアップロード</string>
- <string name="menu_share">共有...</string>
- <string name="menu_share_title_fingerprint">指紋の共有...</string>
- <string name="menu_share_title">すべての鍵の共有...</string>
- <string name="menu_share_default_fingerprint">...(指紋)</string>
- <string name="menu_share_default">...(鍵)</string>
- <string name="menu_share_qr_code">QRコードで共有(鍵)</string>
- <string name="menu_share_qr_code_fingerprint">QRコードで共有(指紋)</string>
- <string name="menu_share_nfc">NFCで共有</string>
- <string name="menu_copy_to_clipboard">クリップボードへコピー</string>
<string name="menu_beam_preferences">Beamの設定</string>
<string name="menu_key_edit_cancel">キャンセル</string>
<string name="menu_encrypt_to">暗号化...</string>
@@ -97,18 +73,22 @@
<string name="menu_export_all_keys">すべての鍵のエクスポート</string>
<string name="menu_advanced">詳細情報を表示</string>
<!--label-->
- <string name="label_sign">署名</string>
<string name="label_message">メッセージ</string>
<string name="label_file">ファイル</string>
+ <string name="label_files">ファイル</string>
+ <string name="label_file_colon">ファイル:</string>
<string name="label_no_passphrase">パスフレーズなし</string>
<string name="label_passphrase">パスフレーズ</string>
- <string name="label_passphrase_again">もう一度</string>
+ <string name="label_passphrase_again">再度パスフレーズを入力</string>
<string name="label_algorithm">アルゴリズム</string>
<string name="label_ascii_armor">アスキー形式</string>
- <string name="label_select_public_keys">受信者</string>
- <string name="label_delete_after_encryption">暗号化後に削除</string>
+ <string name="label_file_ascii_armor">ファイル: アスキー形式</string>
+ <string name="label_conceal_pgp_application">他の人にあなたがOpenKeychain使用していることを知ってもらいましょう</string>
+ <string name="label_conceal_pgp_application_summary">OpenPGPの 署名、暗号文、そしてエクスポートした鍵に \'OpenKeychain v2.7\' と書くようになりました</string>
+ <string name="label_asymmetric_from">差出人:</string>
+ <string name="label_to">宛先</string>
+ <string name="label_delete_after_encryption">ファイル: 暗号化後に削除</string>
<string name="label_delete_after_decryption">復号化後に削除</string>
- <string name="label_share_after_encryption">暗号化して共有</string>
<string name="label_encryption_algorithm">暗号化アルゴリズム</string>
<string name="label_hash_algorithm">ハッシュアルゴリズム</string>
<string name="label_asymmetric">公開鍵で</string>
@@ -123,17 +103,13 @@
<string name="label_expiry">満了</string>
<string name="label_usage">使い方</string>
<string name="label_key_size">鍵サイズ</string>
- <string name="label_main_user_id">メインのユーザID</string>
+ <string name="label_main_user_id">主ユーザID</string>
<string name="label_name">名前</string>
<string name="label_comment">コメント</string>
<string name="label_email">Eメールアドレス</string>
<string name="label_send_key">証明後選択した鍵サーバに鍵をアップロード</string>
<string name="label_fingerprint">指紋</string>
- <string name="select_keys_button_default">選択</string>
<string name="expiry_date_dialog_title">期限日時を設定</string>
- <plurals name="select_keys_button">
- <item quantity="other">%d を選択</item>
- </plurals>
<string name="user_id_no_name">&lt;名前なし&gt;</string>
<string name="none">&lt;無し&gt;</string>
<string name="no_key">&lt;鍵無し&gt;</string>
@@ -178,7 +154,6 @@
<string name="flag_authenticate">認証</string>
<!--sentences-->
<string name="wrong_passphrase">良くないパスフレーズ</string>
- <string name="set_a_passphrase">最初にパスフレーズを設定してください。</string>
<string name="no_filemanager_installed">互換性のないファイルマネージャがインストールされています。</string>
<string name="passphrases_do_not_match">パスフレーズが一致しません。</string>
<string name="passphrase_must_not_be_empty">パスフレーズを入れてください。</string>
@@ -197,15 +172,12 @@
<string name="specify_file_to_export_to">どのファイルをエクスポートするか決めてください。\n注意: 既存のファイルがあると上書きされます。</string>
<string name="key_deletion_confirmation_multi">選択したすべての公開鍵を削除して本当に良いのですか?\nこれは元に戻せません!</string>
<string name="secret_key_deletion_confirmation">秘密鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string>
- <string name="ask_save_changed_key">あなたは鍵輪に変更を加えました、これを保存しますか?</string>
- <string name="ask_empty_id_ok">あなたは空のユーザIDを追加しました、このまま続けますか?</string>
<string name="public_key_deletetion_confirmation">公開鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string>
- <string name="also_export_secret_keys">秘密鍵もエクスポートしますか?</string>
+ <string name="also_export_secret_keys">秘密鍵もエクスポートします</string>
<string name="key_exported">1つの鍵をエクスポートしました。</string>
<string name="keys_exported">%d の鍵をエクスポートしました。</string>
<string name="no_keys_exported">鍵をエクスポートしていません。</string>
<string name="key_creation_el_gamal_info">ノート: 副鍵はElGamalでのみサポートされます。</string>
- <string name="key_creation_weak_rsa_info">付記: 長さ1024bitかそれ以下で生成されたRSA鍵は安全とはみなされず、新な鍵の生成は無効にされています。</string>
<string name="key_not_found">鍵 %08X は見付かりませんでした。</string>
<plurals name="bad_keys_encountered">
<item quantity="other">%d の問題ある鍵を無視しました。 おそらく次のオプションでエクスポートしています\n --export-secret-subkeys\n代りに次のオプションでエクスポートしてください。\n --export-secret-keys</item>
@@ -216,7 +188,6 @@
<string name="nfc_successful">NFCビームで鍵を送信しました!</string>
<string name="key_copied_to_clipboard">鍵はクリプボードにコピーされました!</string>
<string name="fingerprint_copied_to_clipboard">指紋はクリプボードにコピーされました!</string>
- <string name="key_has_already_been_certified">鍵はすでに検証されています!</string>
<string name="select_key_to_certify">検証に使う鍵を選択して下さい!</string>
<string name="key_too_big_for_sharing">この共有方法では鍵が大きすぎます!</string>
<!--errors
@@ -227,34 +198,28 @@
<string name="error_no_secret_key_found">組になっている秘密鍵が見付かりません</string>
<string name="error_external_storage_not_ready">外部ストレージが準備できていません</string>
<string name="error_key_size_minimum512bit">鍵サイズは最低でも512bit必要です</string>
- <string name="error_master_key_must_not_be_el_gamal">主鍵を ElGamal にすることはできません</string>
<string name="error_unknown_algorithm_choice">未知のアルゴリズムを選択しています</string>
<string name="error_user_id_no_email">メールが見付かりません</string>
<string name="error_key_needs_a_user_id">最低でも1つのユーザIDが必要です</string>
- <string name="error_main_user_id_must_not_be_empty">メインのユーザIDは空にすることはできません</string>
- <string name="error_key_needs_master_key">主鍵が最低でも1つ必要です</string>
<string name="error_no_signature_passphrase">パスフレーズが与えられていません</string>
<string name="error_no_signature_key">署名鍵を与えられていません</string>
<string name="error_invalid_data">暗号化データが不正です</string>
<string name="error_integrity_check_failed">完全性チェックが失敗しました! データに変更があります!</string>
<string name="error_wrong_passphrase">正しくないパスフレーズです</string>
- <string name="error_saving_keys">鍵の保存エラー</string>
<string name="error_could_not_extract_private_key">秘密鍵を取り出すことができません</string>
- <string name="error_expiry_must_come_after_creation">期限日時は生成日時より後である必要があります</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">ファイルシステムに存在するファイルではないバイナリデータはサポートされません。</string>
<string name="error_jelly_bean_needed">Android NFC Beam機能を使うにはAndroid 4.1 が必要です!</string>
<string name="error_nfc_needed">あなたのデバイスにはNFCが存在しません!</string>
<string name="error_nothing_import">鍵が見当りません!</string>
- <string name="error_query_too_short">鍵検索のクエリが短かすぎます</string>
- <string name="error_searching_keys">サーバでの鍵の検索が回復不可能なエラーになりました</string>
- <string name="error_too_many_responses">鍵検索のクエリが沢山の候補を返しました; クエリを精密化してください</string>
- <string name="error_import_no_valid_keys">ファイル/クリップボードが空です</string>
+ <string name="error_query_too_short">鍵検索のクエリが短かすぎます。クエリを精密化してください!</string>
+ <string name="error_searching_keys">鍵の検索時にエラーが発生しました。</string>
+ <string name="error_too_many_responses">鍵検索のクエリが沢山の候補を返しました。クエリを精密化してください!</string>
+ <string name="error_too_short_or_too_many_responses">鍵がまったく無いか、多すぎる鍵が見付かりました。クエリを改善してください!</string>
+ <string name="error_import_no_valid_keys">ファイル/クリップボードにて正しい鍵が見付かりません!</string>
<string name="error_generic_report_bug">一般エラーが発生しました、この新しいバグの情報をOpenKeychainプロジェクトに送ってください</string>
<plurals name="error_import_non_pgp_part">
<item quantity="other">読み込んだファイルのOpenPGPオブジェクト部分は正しいですが、OpenPGPの鍵ではありません</item>
</plurals>
- <string name="error_change_something_first">あなたは鍵輪を保存する前に変更を加えなくてはなりません</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">不正な署名です!</string>
<string name="decrypt_result_signature_unknown_pub_key">不明な公開鍵</string>
@@ -270,17 +235,24 @@
<string name="progress_saving">保存...</string>
<string name="progress_importing">インポート...</string>
<string name="progress_exporting">エクスポート...</string>
+ <string name="progress_uploading">アップロード中...</string>
<string name="progress_building_key">鍵の構築中...</string>
- <string name="progress_certifying_master_key">主鍵の証明中...</string>
<string name="progress_building_master_key">主鍵輪の構築中...</string>
- <string name="progress_adding_sub_keys">副鍵の追加中...</string>
- <string name="progress_saving_key_ring">鍵の保存...</string>
+ <string name="progress_generating_rsa">新しいRSA鍵を生成中...</string>
+ <string name="progress_generating_dsa">新しいDSA鍵を生成中...</string>
+ <string name="progress_generating_elgamal">新しいElGamal鍵を生成中...</string>
+ <string name="progress_modify">鍵輪を変更中...</string>
+ <string name="progress_modify_unlock">鍵輪のロック解除中...</string>
+ <string name="progress_modify_adduid">ユーザIDを追加中...</string>
+ <string name="progress_modify_revokeuid">ユーザIDを破棄中...</string>
+ <string name="progress_modify_primaryuid">主ユーザIDを変更中...</string>
+ <string name="progress_modify_subkeychange">副鍵の変更中...</string>
+ <string name="progress_modify_subkeyrevoke">副鍵の破棄中...</string>
+ <string name="progress_modify_subkeyadd">副鍵を追加中...</string>
+ <string name="progress_modify_passphrase">パスフレーズの変更中...</string>
<plurals name="progress_exporting_key">
<item quantity="other">鍵のエクスポート...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="other">鍵の生成中、最大3分ほどかかります...</item>
- </plurals>
<string name="progress_extracting_signature_key">署名鍵の取り出し中...</string>
<string name="progress_extracting_key">鍵の取り出し中...</string>
<string name="progress_preparing_streams">ストリームの準備中...</string>
@@ -291,6 +263,7 @@
<string name="progress_processing_signature">署名処理中...</string>
<string name="progress_verifying_signature">署名の検証中...</string>
<string name="progress_signing">署名中...</string>
+ <string name="progress_certifying">検証中...</string>
<string name="progress_reading_data">データ読み込み中...</string>
<string name="progress_finding_key">鍵検索中...</string>
<string name="progress_decompressing_data">データの展開中...</string>
@@ -298,8 +271,6 @@
<string name="progress_deleting_securely">\'%s\' を完全に削除中…</string>
<!--action strings-->
<string name="hint_public_keys">名前/メール/鍵ID...</string>
- <string name="hint_secret_keys">秘密鍵の検索</string>
- <string name="action_share_key_with">...で鍵の共有</string>
<string name="hint_keybase_search">名前/Keybase.io名...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
@@ -331,26 +302,15 @@
<string name="import_tab_qr_code">QRコード/NFC</string>
<string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">選択した鍵のインポート</string>
- <string name="import_from_clipboard">クリップボードからインポート</string>
- <plurals name="import_qr_code_missing">
- <item quantity="other">ID %s のQRコードがありません</item>
- </plurals>
- <string name="import_qr_code_start_with_one">QRコードをID 1で始めてください</string>
<string name="import_qr_code_wrong">不適QRコード! もう一度!</string>
- <string name="import_qr_code_finished">QRコードの読み取り完了!</string>
<string name="import_qr_code_too_short_fingerprint">指紋が短かすぎます (&lt; 16 文字)</string>
- <string name="import_qr_scan_button">\'バーコードスキャナー\'でQRコードをスキャンする</string>
- <string name="import_nfc_text">NFCで鍵を受信しました、デバイスのロックを解除する必要があります。</string>
- <string name="import_nfc_help_button">ヘルプ</string>
<string name="import_qr_code_button">QCコードのスキャン...</string>
- <string name="import_clipboard_button">クリップボードから鍵を取得</string>
- <string name="import_keybase_button">Keybase.ioから鍵を取得</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="other">%1$d の鍵のインポートに成功</item>
</plurals>
<plurals name="import_keys_added_and_updated_2">
- <item quantity="other">そして%1$d の鍵%2$s をアップデート。</item>
+ <item quantity="other">そして、%1$d の鍵を %2$s アップデートした。</item>
</plurals>
<plurals name="import_keys_added">
<item quantity="other">%1$d の鍵%2$sのインポートに成功。</item>
@@ -368,7 +328,7 @@
<string name="intent_send_encrypt">OpenKeychainで暗号化</string>
<string name="intent_send_decrypt">OpenKeychainで復号化</string>
<!--Remote API-->
- <string name="api_no_apps">未登録のアプリケーションです!\n\n\"ヘルプ\"のサードパーティ製アプリケーションのサポートリストにあるかを見てください!</string>
+ <string name="api_no_apps">未登録のアプリです!\n\n\"ヘルプ\"のサードパーティ製アプリケーションのサポートリストにあるかを見てください!</string>
<string name="api_settings_show_info">詳細情報を表示</string>
<string name="api_settings_hide_info">詳細情報を非表示</string>
<string name="api_settings_show_advanced">拡張設定を表示</string>
@@ -384,9 +344,9 @@
<string name="api_settings_package_name">パッケージ名</string>
<string name="api_settings_package_signature">パッケージの署名 SHA-256</string>
<string name="api_settings_accounts">アカウント</string>
- <string name="api_settings_accounts_empty">このアプリケーションに接続されてるアカウントはありません。</string>
- <string name="api_create_account_text">このアプリケーションは新しいアカウントの生成を要求しています。すでにある秘密鍵を選択するか、新しく生成してください。\nここであなたが選択する鍵の使い道についてアプリケーションには制約があります!</string>
- <string name="api_register_text">表示されているアプリケーションはOpenKeychainへのアクセスを要求しています。\nアクセスを許可しますか?\n\n注意: もしなぜスクリーンに表れたかわからないなら、アクセスを許可しないでください! あなたは\'登録済みアプリケーション\'スクリーンを使って、以降のアクセスを破棄するこもできます。</string>
+ <string name="api_settings_accounts_empty">このアプリに接続されてるアカウントはありません。</string>
+ <string name="api_create_account_text">このアプリは新しいアカウントの生成を要求しています。すでにある鍵1つを選択するか、新たに生成してください。\nここであなたが選択する鍵の使い道についてアプリケーションには制約があります!</string>
+ <string name="api_register_text">表示されているアプリはメッセージの暗号/復号化とあなたの名前での署名付けを要求しています。\nアクセスを許可しますか?\n\n注意: もしなぜスクリーンに表れたかわからないなら、アクセスを許可しないでください! あなたは後で\'アプリ\'スクリーンを使い、アクセスを破棄するこもできます。</string>
<string name="api_register_allow">許可されたアクセス</string>
<string name="api_register_disallow">許可されないアクセス</string>
<string name="api_register_error_select_key">鍵を選択してください!</string>
@@ -396,9 +356,6 @@
<string name="api_error_wrong_signature">署名チェックが失敗! 違うところからこのアプリをインストールしましたか? もし攻撃されてでなくそうであるなら、OpenKeychainにあるこのアプリの登録を破棄し、再度アプリを登録してください。</string>
<!--Share-->
<string name="share_qr_code_dialog_title">QRコードで共有</string>
- <string name="share_qr_code_dialog_start">すべてのQRコードを見る場合、\'次\' を押して一つ一つスキャンしてください。</string>
- <string name="share_qr_code_dialog_fingerprint_text">指紋:</string>
- <string name="share_qr_code_dialog_progress">%2$d の ID %1$d のQRコード</string>
<string name="share_nfc_dialog">NFCで共有</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -408,32 +365,54 @@
<string name="key_list_empty_text2">で始める</string>
<string name="key_list_empty_text3">もしくは</string>
<string name="key_list_empty_button_create">あなた所有の鍵を作る</string>
- <string name="key_list_empty_button_import">鍵のインポート。</string>
+ <string name="key_list_empty_button_import">既存の鍵のインポート。</string>
<!--Key view-->
<string name="key_view_action_edit">鍵の編集</string>
<string name="key_view_action_encrypt">この鍵で暗号化</string>
<string name="key_view_action_certify">ユーザID検証</string>
+ <string name="key_view_action_update">鍵サーバからの更新</string>
<string name="key_view_action_share_with">...で共有</string>
<string name="key_view_action_share_nfc">デバイスの後ろ同士を固定してNFC経由で共有</string>
+ <string name="key_view_action_upload">鍵サーバへのアップロード</string>
<string name="key_view_tab_main">情報</string>
<string name="key_view_tab_share">共有</string>
<string name="key_view_tab_keys">副鍵</string>
<string name="key_view_tab_certs">証明</string>
+ <!--Edit key-->
+ <string name="edit_key_action_change_passphrase">パスフレーズの変更</string>
+ <string name="edit_key_action_add_identity">ユーザIDの追加</string>
+ <string name="edit_key_action_add_subkey">副鍵の追加</string>
+ <string name="edit_key_edit_user_id_title">アクションを選んでください!</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>主IDを変更</item>
+ <item>IDを破棄</item>
+ </string-array>
+ <string name="edit_key_edit_subkey_title">アクションを選んでください!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>期限を変更</item>
+ <item>副鍵を破棄</item>
+ </string-array>
+ <!--Create key-->
+ <string name="create_key_upload">鍵サーバへアップロード</string>
+ <string name="create_key_empty">このフィールドは必須です</string>
+ <string name="create_key_passphrases_not_equal">パスフレーズが一致しない</string>
+ <string name="create_key_final_text">あたなが入力したIDは以下です:</string>
+ <string name="create_key_final_robot_text">しばらくの間鍵を生成しています、その間はコーヒーでもどうぞ....\n(3つの副鍵、RSA、4096bit)</string>
+ <string name="create_key_text">フルネーム、Eメールアドレスを入力そしてパスフレーズを選択してください。</string>
+ <string name="create_key_hint_full_name">フルネーム、例えば Max Mustermann</string>
+ <!--View key-->
+ <string name="view_key_revoked">この鍵は破棄されています!</string>
+ <string name="view_key_expired">この鍵は期限切れです!</string>
<!--Navigation Drawer-->
<string name="nav_keys">鍵</string>
<string name="nav_encrypt">署名と暗号化</string>
<string name="nav_decrypt">復号化と検証</string>
- <string name="nav_import">鍵のインポート</string>
<string name="nav_apps">アプリ</string>
<string name="drawer_open">ナビゲーションドロワーを開く</string>
<string name="drawer_close">ナビゲーションドロワーを閉める</string>
- <string name="edit">編集</string>
<string name="my_keys">自分の鍵</string>
- <string name="label_secret_key">秘密鍵</string>
- <string name="secret_key_yes">存在する</string>
- <string name="secret_key_no">存在しない</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">ここに書いたメッセージを暗号化/署名..</string>
+ <string name="encrypt_content_edit_text_hint">ここで入力したメッセージは、「差出人」で選択した鍵で署名され、「宛先」で選択したすべての受信者に対してその鍵で暗号化します。</string>
<string name="decrypt_content_edit_text_hint">ここに入力された暗号化テキストを復号化/検証...</string>
<!--certs-->
<string name="cert_default">デフォルト</string>
@@ -485,7 +464,7 @@
<string name="msg_ip_reinsert_secret">秘密鍵を再挿入中</string>
<string name="msg_ip_uid_cert_bad">問題のある検証と遭遇しました!</string>
<string name="msg_ip_uid_cert_error">検証の処理中にエラーしました!</string>
- <string name="msg_ip_uid_cert_good">ユーザIDは %1$s (%2$s) によって検証されました</string>
+ <string name="msg_ip_uid_cert_good">ユーザIDは %1$s によって検証されました</string>
<plurals name="msg_ip_uid_certs_unknown">
<item quantity="other">不明な公開鍵から %s の検証を無視</item>
</plurals>
@@ -497,6 +476,7 @@
<string name="msg_ip_uid_processing">ユーザID %s の処理中</string>
<string name="msg_ip_uid_revoked">ユーザIDは破棄されました</string>
<string name="msg_is_bad_type_public">公開鍵の鍵輪を秘密鍵としてインポートを試行しました。これはバグで、ファイルをレポートしてください\"</string>
+ <string name="msg_is_bad_type_uncanon">正規化せずに鍵輪へインポートを試行した。これはバグで、ファイルをレポートしてください!</string>
<!--Import Secret log entries-->
<string name="msg_is">秘密鍵 %s のインポート中</string>
<string name="msg_is_db_exception">データベースエラー!</string>
@@ -517,6 +497,7 @@
<string name="msg_kc_revoke_bad_local">鍵輪のローカルフラグ付き破棄証明を破棄中</string>
<string name="msg_kc_revoke_bad_time">鍵輪の未来にタイムスタンプがある破棄証明を破棄中</string>
<string name="msg_kc_revoke_bad_type">問題のある主鍵の不明な型 (%s) の証明を破棄中</string>
+ <string name="msg_kc_revoke_bad_type_uid">不正な位置のユーザID検証を破棄中</string>
<string name="msg_kc_revoke_bad">問題のある鍵輪の破棄証明を破棄中</string>
<string name="msg_kc_revoke_dup">重複している鍵輪の破棄証明を破棄中</string>
<string name="msg_kc_sub">副鍵 %s の処理中</string>
@@ -552,6 +533,7 @@
<string name="msg_kc_uid_revoke_dup">ユーザID \"%s\" による重複した破棄証明を破棄中</string>
<string name="msg_kc_uid_revoke_old">ユーザID \"%s\" による期限切れ破棄証明を破棄中</string>
<string name="msg_kc_uid_no_cert">ユーザID %s の正常な自己署名が見付かりませんでした、鍵輪から除去しました</string>
+ <string name="msg_kc_uid_remove">正しくないユーザID %s を破棄中</string>
<!--Keyring merging log entries-->
<string name="msg_mg_public">公開鍵の鍵輪 %s にマージ中</string>
<string name="msg_mg_secret">秘密鍵の鍵輪 %s にマージ中</string>
@@ -559,16 +541,29 @@
<string name="msg_mg_heterogeneous">種類の異なる鍵輪を統合しようとした</string>
<string name="msg_mg_new_subkey">新しい副鍵 %s を追加中</string>
<string name="msg_mg_found_new">鍵輪に新しい検証を %s 発見</string>
+ <string name="msg_mg_unchanged">新しい証明がない</string>
+ <!--createSecretKeyRing-->
+ <string name="msg_cr">新しい主鍵を生成中</string>
+ <string name="msg_cr_error_no_master">主鍵オプション特有ではありません!</string>
+ <string name="msg_cr_error_no_user_id">鍵輪は最低でも1つのユーザIDの生成が必要です!</string>
+ <string name="msg_cr_error_no_certify">主鍵は検証フラグが必須です!</string>
+ <string name="msg_cr_error_keysize_512">鍵サイズは512かそれ以上が必須です!</string>
+ <string name="msg_cr_error_internal_pgp">PGP内部エラー!</string>
+ <string name="msg_cr_error_unknown_algo">悪いアルゴリズムを選択しています!</string>
+ <string name="msg_cr_error_master_elgamal">主鍵を ElGamal にすることはできません</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">鍵輪 %s を変更中</string>
<string name="msg_mf_error_encode">エンコード例外!</string>
- <string name="msg_mf_error_fingerprint">現実の鍵指紋が予想と合致しませんでした!</string>
- <string name="msg_mf_error_keyid">鍵IDがない。 これはプログラミングのエラーで、バグレポートの提出をお願いします!</string>
+ <string name="msg_mf_error_fingerprint">現実の鍵指紋が想定の1つと合致しませんでした!</string>
+ <string name="msg_mf_error_keyid">鍵IDがない。 これは内部エラーで、バグレポートの提出をお願いします!</string>
<string name="msg_mf_error_integrity">内部エラー、完全性チェックが失敗!</string>
+ <string name="msg_mf_error_noexist_primary">問題のある主ユーザIDが指定された!</string>
<string name="msg_mf_error_revoked_primary">主ユーザIDの破棄はできません!</string>
<string name="msg_mf_error_pgp">PGP内部例外!</string>
<string name="msg_mf_error_sig">署名例外!</string>
<string name="msg_mf_passphrase">パスフレーズの変更中</string>
+ <string name="msg_mf_primary_replace_old">以前の主ユーザIDで証明を入れ替え中</string>
+ <string name="msg_mf_primary_new">新しい主ユーザIDで新しい証明を生成中</string>
<string name="msg_mf_subkey_change">副鍵 %s を変更中</string>
<string name="msg_mf_subkey_missing">遺失した副鍵 %s の操作をしようとした!</string>
<string name="msg_mf_subkey_new">新しい %1$s ビットの %2$s 副鍵の生成中</string>
@@ -579,9 +574,17 @@
<string name="msg_mf_uid_add">ユーザID %s を追加中</string>
<string name="msg_mf_uid_primary">主UIDを %s に変更中</string>
<string name="msg_mf_uid_revoke">ユーザID %s を破棄中</string>
+ <string name="msg_mf_uid_error_empty">ユーザIDは空にすることはできません!</string>
<string name="msg_mf_unlock_error">鍵輪のロック解除エラー!</string>
<string name="msg_mf_unlock">鍵輪のロック解除中</string>
+ <!--PassphraseCache-->
+ <string name="passp_cache_notif_click_to_clear">クリックしてパスフレーズのキャッシュをクリア</string>
+ <string name="passp_cache_notif_n_keys">OpenKeychainは %d のパスフレーズをキャッシュしています</string>
+ <string name="passp_cache_notif_keys">パスフレーズのキャッシュ:</string>
+ <string name="passp_cache_notif_clear">キャッシュクリア</string>
+ <string name="passp_cache_notif_pwd">パスワード</string>
<!--unsorted-->
+ <string name="internal_error">内部エラー!</string>
<string name="section_certifier_id">検証者</string>
<string name="section_cert">証明の詳細</string>
<string name="label_user_id">ユーザID</string>
@@ -593,14 +596,17 @@
<string name="label_cert_type">種別</string>
<string name="error_key_not_found">鍵が見当りません!</string>
<string name="error_key_processing">鍵処理中のエラー!</string>
- <string name="no_subkey">副鍵がありません</string>
<string name="key_stripped">スリム化</string>
- <string name="secret_cannot_multiple">秘密鍵は個別にしか削除できません!</string>
+ <string name="secret_cannot_multiple">あなたが所有者の鍵は個別にしか削除できません!</string>
<string name="title_view_cert">証明の詳細を見る</string>
<string name="unknown_algorithm">不明</string>
<string name="can_sign_not">署名不可</string>
- <string name="error_encoding">エンコードエラー</string>
<string name="error_no_encrypt_subkey">暗号化の副鍵がありません!</string>
<string name="info_no_manual_account_creation">OpenKeychainのアカウントを手動では生成できません.\nより詳細は、ヘルプを参照のこと。</string>
<string name="contact_show_key">鍵 (%s) を表示</string>
+ <!--First Time-->
+ <string name="first_time_text1">OpenKeychainであなたのプライバシーを取り戻しましょう!</string>
+ <string name="first_time_create_key">自分の鍵の生成</string>
+ <string name="first_time_import_key">既存の鍵のインポート</string>
+ <string name="first_time_skip">セットアップをスキップ</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-ko/strings.xml b/OpenKeychain/src/main/res/values-ko/strings.xml
index 593fc2d11..4cf33460a 100644
--- a/OpenKeychain/src/main/res/values-ko/strings.xml
+++ b/OpenKeychain/src/main/res/values-ko/strings.xml
@@ -25,6 +25,9 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -32,6 +35,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml
index 11b6c9673..640ac777d 100644
--- a/OpenKeychain/src/main/res/values-nl/strings.xml
+++ b/OpenKeychain/src/main/res/values-nl/strings.xml
@@ -1,18 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Publieke sleutel selecteren</string>
- <string name="title_select_secret_key">Privésleutel selecteren</string>
<string name="title_encrypt">Versleutelen</string>
<string name="title_decrypt">Ontsleutelen</string>
<string name="title_authentication">Wachtwoord</string>
- <string name="title_create_key">Sleutel aanmaken</string>
<string name="title_edit_key">Sleutel bewerken</string>
<string name="title_preferences">Instellingen</string>
<string name="title_key_server_preference">Sleutelserver Voorkeur</string>
<string name="title_change_passphrase">Wachtwoord wijzigen</string>
- <string name="title_set_passphrase">Wachtwoord instellen</string>
- <string name="title_share_with">Delen met...</string>
<string name="title_share_fingerprint_with">Vingerafdruk delen met...</string>
<string name="title_share_key">Sleutel delen met...</string>
<string name="title_share_file">Bestand delen met...</string>
@@ -32,60 +27,33 @@
<string name="section_general">Algemeen</string>
<string name="section_defaults">Standaard</string>
<string name="section_advanced">Geavanceerd</string>
- <string name="section_master_key">Master Sleutel</string>
- <string name="section_master_user_id">Primaire Identiteit</string>
<string name="section_actions">Acties</string>
<string name="section_share_key">Hele sleutel</string>
<string name="section_certification_key">Uw Sleutel die u gebruikt voor certificatie</string>
<string name="section_upload_key">Upload Sleutel</string>
<string name="section_key_server">Sleutelserver</string>
- <string name="section_encrypt_and_or_sign">Versleutel en/of Signeer</string>
- <string name="section_decrypt_verify">Decodeer en Verifiëer</string>
<string name="section_fingerprint">Vingerafdruk</string>
<string name="section_key_to_certify">Sleutel om te certificeren</string>
<!--button-->
- <string name="btn_certify">Certifiëer</string>
<string name="btn_decrypt_verify_file">Decodeer, verifiëer en sla bestand op</string>
<string name="btn_decrypt_verify_message">Decodeer en verifiëer bericht</string>
- <string name="btn_decrypt_verify_clipboard">Van Klembord</string>
<string name="btn_encrypt_file">Codeer en sla bestanden op</string>
<string name="btn_save">Opslaan</string>
<string name="btn_do_not_save">Annuleren</string>
<string name="btn_delete">Verwijderen</string>
<string name="btn_no_date">Geen</string>
<string name="btn_okay">OK</string>
- <string name="btn_change_passphrase">Verander Nieuw Wachtwoord</string>
- <string name="btn_set_passphrase">Bepaal Nieuwe Wachtwoord</string>
<string name="btn_export_to_server">Upload Naar Sleutelserver</string>
<string name="btn_next">Volgende</string>
<string name="btn_back">Terug</string>
- <string name="btn_clipboard">Klembord</string>
- <string name="btn_share">Delen met...</string>
<string name="btn_lookup_key">Opzoeksleutel</string>
- <string name="btn_encryption_advanced_settings_show">Toon geavanceerde instellingen</string>
- <string name="btn_encryption_advanced_settings_hide">Verberg geavanceerde instellingen</string>
- <string name="btn_share_encrypted_signed">Gecodeerd/ondertekend bericht delen...</string>
<string name="btn_view_cert_key">Toon certificatiesleutel</string>
<!--menu-->
<string name="menu_preferences">Instellingen</string>
<string name="menu_help">Help</string>
<string name="menu_export_key">Exporteren naar bestand</string>
<string name="menu_delete_key">Sleutel verwijderen</string>
- <string name="menu_create_key">Sleutel aanmaken</string>
- <string name="menu_create_key_expert">Sleutel aanmaken (expert)</string>
<string name="menu_search">Zoeken</string>
- <string name="menu_key_server">Sleutelserver...</string>
- <string name="menu_update_key">Update van sleutelserver</string>
- <string name="menu_export_key_to_server">Upload naar sleutelserver</string>
- <string name="menu_share">Delen...</string>
- <string name="menu_share_title_fingerprint">Deel vingerafdruk...</string>
- <string name="menu_share_title">Hele sleutel delen...</string>
- <string name="menu_share_default_fingerprint">met...</string>
- <string name="menu_share_default">met...</string>
- <string name="menu_share_qr_code">met QR Code</string>
- <string name="menu_share_qr_code_fingerprint">met QR Code</string>
- <string name="menu_share_nfc">met NFC</string>
- <string name="menu_copy_to_clipboard">Kopieer naar klembord</string>
<string name="menu_beam_preferences">Beam-instellingen</string>
<string name="menu_key_edit_cancel">Annuleren</string>
<string name="menu_encrypt_to">Versleutelen naar...</string>
@@ -93,22 +61,15 @@
<string name="menu_add_keys">Sleutels toevoegen</string>
<string name="menu_export_all_keys">Alle sleutels exporteren</string>
<!--label-->
- <string name="label_sign">Ondertekenen</string>
<string name="label_message">Bericht</string>
<string name="label_file">Bestand</string>
<string name="label_no_passphrase">Geen wachtwoord</string>
<string name="label_passphrase">Wachtwoord</string>
- <string name="label_passphrase_again">Opnieuw</string>
<string name="label_algorithm">Algoritme</string>
<string name="label_ascii_armor">ASCII-armor</string>
- <string name="label_select_public_keys">Ontvangers</string>
- <string name="label_delete_after_encryption">Verwijderen na versleuteling</string>
<string name="label_delete_after_decryption">Verwijderen na ontsleuteling</string>
- <string name="label_share_after_encryption">Delen Na Versleuteling</string>
<string name="label_encryption_algorithm">Versleutelingsalgoritme</string>
<string name="label_hash_algorithm">Verificatie-algoritme</string>
- <string name="label_asymmetric">met Publieke Sleutel</string>
- <string name="label_symmetric">met Wachtwoord</string>
<string name="label_passphrase_cache_ttl">Wachtwoordcache</string>
<string name="label_message_compression">Berichtcompressie</string>
<string name="label_file_compression">Bestandscompressie</string>
@@ -125,12 +86,7 @@
<string name="label_email">E-mailadres</string>
<string name="label_send_key">Upload sleutel naar geselecteerde sleutelserver na bevestiging</string>
<string name="label_fingerprint">Vingerafdruk</string>
- <string name="select_keys_button_default">Selecteren</string>
<string name="expiry_date_dialog_title">Bepaal verloopdatum</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d geselecteerd</item>
- <item quantity="other">%d geselecteerd</item>
- </plurals>
<string name="user_id_no_name">&lt;no naam&gt;</string>
<string name="none">&lt;geen&gt;</string>
<string name="no_key">&lt;geen sleutel&gt;</string>
@@ -177,7 +133,6 @@
<string name="flag_authenticate">Legitimeren</string>
<!--sentences-->
<string name="wrong_passphrase">Wachtwoord verkeerd.</string>
- <string name="set_a_passphrase">Stel eerst een wachtwoord in.</string>
<string name="no_filemanager_installed">Geen compatibele bestandsbeheerder geïnstalleerd.</string>
<string name="passphrases_do_not_match">De wachtwoorden komen niet overeen.</string>
<string name="passphrase_must_not_be_empty">Vul een wachtwoord in.</string>
@@ -196,15 +151,11 @@
<string name="specify_file_to_export_to">Specifieer naar welk bestand er geëxporteerd moet worden.\nWAARSCHUWING: Bestand zal vervangen worden als het bestaat.</string>
<string name="key_deletion_confirmation_multi">Weet u zeker dat u alle weergegeven publieke sleutels wilt verwijderen?\nU kunt dit niet ongedaan maken!</string>
<string name="secret_key_deletion_confirmation">Weet u zeker dat u de privésleutel \'%s\' wilt verwijderen?\nDit kan niet ongedaan worden gemaakt.</string>
- <string name="ask_save_changed_key">U heeft veranderingen aangebracht tot de sleutelring, wilt u deze opslaan?</string>
- <string name="ask_empty_id_ok">U heeft een lege identiteit toegevoegd, weet u zeker dat u wilt doorgaan?</string>
<string name="public_key_deletetion_confirmation">Wilt u echt de publieke sleutel \'%s\' verwijderen?\nDit kunt u niet ongedaan maken!</string>
- <string name="also_export_secret_keys">Ook geheime sleutels exporteren?</string>
<string name="key_exported">1 sleutel succesvol geëxporteerd.</string>
<string name="keys_exported">Succesvol %d sleutels geëxporteerd.</string>
<string name="no_keys_exported">Geen sleutels geëxporteerd.</string>
<string name="key_creation_el_gamal_info">Opmerking: alleen subsleutels ondersteunen ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Opmerking: RSA sleutel met lengte 1024-bit en minder genereren wordt als onveilig beschouwd en is uitgeschakeld voor het genereren van nieuwe sleutels.</string>
<string name="key_not_found">Kan de sleutel %08X niet vinden.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d slechte geheime sleutel genegeerd. Misschien heeft u geëxporteerd met de optie\n --export-secret-subkeys\nZorg ervoor dat u in plaats daarvan met\n --export-secret-keys\nexporteert.</item>
@@ -216,7 +167,6 @@
<string name="nfc_successful">Succesvol sleutel verstuurd met NFC Beam!</string>
<string name="key_copied_to_clipboard">Sleutel is gekopieerd naar het klembord!</string>
<string name="fingerprint_copied_to_clipboard">Sleutel is gekopieerd naar het klembord!</string>
- <string name="key_has_already_been_certified">Sleutel is al gecertificeerd!</string>
<string name="select_key_to_certify">Selecteer een sleutel die gebruikt moet worden voor certificatie!</string>
<string name="key_too_big_for_sharing">Sleutel is te groot om op deze manier gedeeld te worden!</string>
<!--errors
@@ -227,22 +177,16 @@
<string name="error_no_secret_key_found">geen geschikte privésleutel gevonden</string>
<string name="error_external_storage_not_ready">externe opslag niet gereed</string>
<string name="error_key_size_minimum512bit">sleutelgrootte moet minstens 512-bits zijn</string>
- <string name="error_master_key_must_not_be_el_gamal">de hoofdsleutel kan geen ElGamal-sleutel zijn</string>
<string name="error_unknown_algorithm_choice">onbekende algoritmekeuze</string>
<string name="error_user_id_no_email">geen e-mail gevonden</string>
<string name="error_key_needs_a_user_id">minstens een identiteit vereist</string>
- <string name="error_main_user_id_must_not_be_empty">primaire identiteit mag niet leeg zijn</string>
- <string name="error_key_needs_master_key">ten minste een hoofdsleutel is vereist</string>
<string name="error_no_signature_passphrase">geen wachtwoord opgegeven</string>
<string name="error_no_signature_key">geen ondertekeningssleutel opgegeven</string>
<string name="error_invalid_data">geen geldige versleutelingsgegevens</string>
<string name="error_integrity_check_failed">integriteitcheck niet geslaagd! Data is bewerkt!</string>
<string name="error_wrong_passphrase">wachtwoord verekerd</string>
- <string name="error_saving_keys">fout bij het opslaan van bepaalde sleutels</string>
<string name="error_could_not_extract_private_key">kan privésleutel niet uitpakken</string>
- <string name="error_expiry_must_come_after_creation">vervaldatum moet na de aanmaakdatum zijn</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Directe binaire data zonder eigenlijke bestand in bestandssysteem wordt niet ondersteund.</string>
<string name="error_jelly_bean_needed">U heeft minstens Android 4.1 nodig om Androids NFC Beam eigenschap te gebruiken!</string>
<string name="error_nfc_needed">Uw apparaat biedt geen ondersteuning voor NFC</string>
<string name="error_generic_report_bug">Een algemene fout is opgetreden, maak alstublieft een nieuwe bug report voor OpenKeychain.</string>
@@ -250,7 +194,6 @@
<item quantity="one">Deel van het geladen bestand is geldig OpenPGP object maar niet een OpenPGP sleutel</item>
<item quantity="other">Delen van het geladen bestand zijn geldige OpenPGP objecten maar niet OpenPGP sleutels</item>
</plurals>
- <string name="error_change_something_first">U moet veranderingen maken aan de sleutelring voor u het kunt opslaan.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Ongeldige handtekening!</string>
<string name="decrypt_result_signature_unknown_pub_key">Onbekende publieke sleutel</string>
@@ -267,18 +210,11 @@
<string name="progress_importing">importeren...</string>
<string name="progress_exporting">exporteren...</string>
<string name="progress_building_key">sleutel maken...</string>
- <string name="progress_certifying_master_key">hoofdsleutel certificeren...</string>
<string name="progress_building_master_key">hoofdsleutelbos maken...</string>
- <string name="progress_adding_sub_keys">sub-sleutels toevoegen...</string>
- <string name="progress_saving_key_ring">sleutel opslaan...</string>
<plurals name="progress_exporting_key">
<item quantity="one">sleutel exporteren...</item>
<item quantity="other">sleutels exporteren...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">sleutel genereren, dit kan tot 3 minuten duren...</item>
- <item quantity="other">sleutels genereren, dit kan tot 3 minuten duren...</item>
- </plurals>
<string name="progress_extracting_signature_key">ondertekeningssleutel uitpakken...</string>
<string name="progress_extracting_key">sleutel uitpakken...</string>
<string name="progress_preparing_streams">streams voorbereiden...</string>
@@ -295,8 +231,6 @@
<string name="progress_verifying_integrity">integriteit verifiëren...</string>
<string name="progress_deleting_securely">\'%s\' veilig verwijderen...</string>
<!--action strings-->
- <string name="hint_secret_keys">Privésleutels zoeken</string>
- <string name="action_share_key_with">Sleutel delen met...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -323,20 +257,8 @@
<string name="help_about_version">Versie:</string>
<!--Import-->
<string name="import_import">Geselecteerde sleutels importeren</string>
- <string name="import_from_clipboard">Importeren uit klembord</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Missende QR code met ID %s</item>
- <item quantity="other">Missende QR Codes met ID\'s %s</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Begin met QR Code met ID 1</string>
<string name="import_qr_code_wrong">QR-code ongeldig. Probeer het opnieuw</string>
- <string name="import_qr_code_finished">QR-code gescand</string>
<string name="import_qr_code_too_short_fingerprint">Vingerafdruk is te kort (&lt; 16 tekens)</string>
- <string name="import_qr_scan_button">Scan QR Code met \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Om sleutels via NFC te ontvangen moet het apparaat ontgrendeld zijn.</string>
- <string name="import_nfc_help_button">Help</string>
- <string name="import_clipboard_button">Verkrijg sleutel uit klembord</string>
- <string name="import_keybase_button">Verkrijg sleutel uit Keybase.io</string>
<!--Import result toast-->
<!--Intent labels-->
<string name="intent_decrypt_file">Decodeer bestand met OpenKeychain</string>
@@ -344,7 +266,6 @@
<string name="intent_send_encrypt">Codeer met OpenKeychain</string>
<string name="intent_send_decrypt">Decodeer met OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Geen geregistreerde applicaties!\n\nEen lijst van ondersteunde derde-partij applicaties kan gevonden worden in \'Help\'!</string>
<string name="api_settings_show_info">Toon geavanceerde informatie</string>
<string name="api_settings_hide_info">Verberg geavanceerde informatie</string>
<string name="api_settings_show_advanced">Toon geavanceerde instellingen</string>
@@ -360,9 +281,6 @@
<string name="api_settings_package_name">Pakketnaam</string>
<string name="api_settings_package_signature">SHA-256 van Pakkethandtekening</string>
<string name="api_settings_accounts">Accounts</string>
- <string name="api_settings_accounts_empty">Geen accounts verbonden aan deze applicatie.</string>
- <string name="api_create_account_text">Deze applicatie vraagt de aanmaak van een nieuw account aan. Selecteer een bestaande privésleutel of maak een nieuwe.\nApplicaties zijn gelimiteerd tot het gebruik van sleutels die u hier selecteert!</string>
- <string name="api_register_text">De weergegeven applicatie vraagt toegang tot OpenKeychain.\nSta toegang toe?\n\nWAARSCHUWING: Als u niet weet waarom dit scherm verscheen, sta dan geen toegang toe! U kunt toegang later weghalen door het \'Geregistreerde Applicaties\' scherm te gebruiken.</string>
<string name="api_register_allow">Toegang toestaan</string>
<string name="api_register_disallow">Toegang weigeren</string>
<string name="api_register_error_select_key">Selecteert u a.u.b. een sleutel</string>
@@ -372,9 +290,6 @@
<string name="api_error_wrong_signature">Handtekening check mislukt! Hebt u deze app van een andere bron geïnstalleerd? Als u zeker weet dat dit geen aanval is, haal dan de registratie van deze app in OpenKeychain weg en registreer de app opnieuw.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Delen met QR-code</string>
- <string name="share_qr_code_dialog_start">U gaat door alle QR-codes met \'Volgende\', en scant ze een voor een.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Vingerafdruk:</string>
- <string name="share_qr_code_dialog_progress">QR Code met ID %1$d van %2$d</string>
<string name="share_nfc_dialog">Deel met NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -385,7 +300,6 @@
<string name="key_list_empty_text2">U kunt beginnen door</string>
<string name="key_list_empty_text3">of</string>
<string name="key_list_empty_button_create">uw eigen sleutel aanmaken</string>
- <string name="key_list_empty_button_import">sleutels importeren.</string>
<!--Key view-->
<string name="key_view_action_edit">Sleutel bewerken</string>
<string name="key_view_action_encrypt">Codeer met deze sleutel</string>
@@ -396,20 +310,17 @@
<string name="key_view_tab_share">Delen</string>
<string name="key_view_tab_keys">Subsleutels</string>
<string name="key_view_tab_certs">Certificaten</string>
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Sleutels</string>
<string name="nav_encrypt">Ondertekenen en Versleutelen</string>
<string name="nav_decrypt">Decoderen en Verifiëren</string>
- <string name="nav_import">Importeer Sleutels</string>
<string name="drawer_open">Open navigatiemenu</string>
<string name="drawer_close">Sluit navigatiemenu</string>
- <string name="edit">Bewerken</string>
<string name="my_keys">Mijn Sleutels</string>
- <string name="label_secret_key">Geheime Sleutel</string>
- <string name="secret_key_yes">beschikbaar</string>
- <string name="secret_key_no">onbeschikbaar</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Schrijf bericht hier om te versleutelen en/of ondertekenen...</string>
<string name="decrypt_content_edit_text_hint">Voer cijfertekst hier in om te decoderen en/of verifiëren...</string>
<!--certs-->
<string name="cert_default">standaard</string>
@@ -417,7 +328,6 @@
<string name="cert_casual">eenvoudig</string>
<string name="cert_positive">positief</string>
<string name="cert_revoke">ingetrokken</string>
- <string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">mislukt!</string>
<string name="cert_verify_error">fout!</string>
<string name="cert_verify_unavailable">sleutel onbeschikbaar</string>
@@ -425,7 +335,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="section_certifier_id">Certificeer</string>
<string name="section_cert">Certificaat Details</string>
@@ -438,11 +350,10 @@
<string name="label_cert_type">Type</string>
<string name="error_key_not_found">Sleutel niet gevonden!</string>
<string name="error_key_processing">Fout bij verwerken sleutel!</string>
- <string name="no_subkey">subsleutel onbeschikbaar</string>
<string name="key_stripped">gestript</string>
- <string name="secret_cannot_multiple">Geheime sleutels kunnen alleen individueel verwijderd worden!</string>
<string name="title_view_cert">Toon Certificaat Details</string>
<string name="unknown_algorithm">onbekend</string>
<string name="can_sign_not">kan niet ondertekenen</string>
<string name="error_no_encrypt_subkey">Geen codeer-subsleutel beschikbaar!</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml
index 9e41373f4..69179d509 100644
--- a/OpenKeychain/src/main/res/values-pl/strings.xml
+++ b/OpenKeychain/src/main/res/values-pl/strings.xml
@@ -1,17 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Wybierz Klucz Publiczny</string>
- <string name="title_select_secret_key">Wybierz Klucz Prywatny</string>
<string name="title_encrypt">Zaszyfruj</string>
<string name="title_decrypt">Odszyfruj</string>
<string name="title_authentication">Hasło</string>
- <string name="title_create_key">Utwórz Klucz</string>
<string name="title_edit_key">Edytuj Klucz</string>
<string name="title_preferences">Właściwości</string>
<string name="title_key_server_preference">Właściwości serwera kluczy</string>
<string name="title_change_passphrase">Zmień hasło</string>
- <string name="title_set_passphrase">Ustaw hasło</string>
<string name="title_share_file">Udostępnij plik...</string>
<string name="title_encrypt_to_file">Zaszyfruj do pliku</string>
<string name="title_decrypt_to_file">Odszyfruj do pliku</string>
@@ -26,51 +22,26 @@
<string name="section_general">Ogólne</string>
<string name="section_defaults">Domyślne</string>
<string name="section_advanced">Zaawansowane</string>
- <string name="section_master_key">Klucz główny</string>
<string name="section_actions">Działania</string>
<string name="section_certification_key">Twój klucz użyty do certyfikacji</string>
<string name="section_upload_key">Wyślij klucz</string>
<string name="section_key_server">Serwer kluczy</string>
- <string name="section_encrypt_and_or_sign">Zaszyfruj i/lub podpisz</string>
- <string name="section_decrypt_verify">Deszyfruj i weryfikuj</string>
<!--button-->
- <string name="btn_certify">Certyfikuj</string>
- <string name="btn_decrypt_verify_clipboard">Ze schowka</string>
<string name="btn_save">Zapisz</string>
<string name="btn_do_not_save">Anuluj</string>
<string name="btn_delete">Usuń</string>
<string name="btn_no_date">Żaden</string>
<string name="btn_okay">Ok</string>
- <string name="btn_change_passphrase">Zmień nowe hasło</string>
- <string name="btn_set_passphrase">Ustaw nowe hasło</string>
<string name="btn_export_to_server">Wyślij do serwera kluczy</string>
<string name="btn_next">Dalej</string>
<string name="btn_back">Wstecz</string>
- <string name="btn_clipboard">Schowek</string>
- <string name="btn_share">Podziel się z...</string>
<string name="btn_lookup_key">Klucz wyszukiwania</string>
- <string name="btn_encryption_advanced_settings_show">Pokaż zaawanowane ustawienia</string>
- <string name="btn_encryption_advanced_settings_hide">Ukryj zaawansowane ustawienia</string>
<!--menu-->
<string name="menu_preferences">Ustawienia</string>
<string name="menu_help">Pomoc</string>
<string name="menu_export_key">Eksportuj do pliku</string>
<string name="menu_delete_key">Usuń klucz</string>
- <string name="menu_create_key">Stwórz klucz</string>
- <string name="menu_create_key_expert">Stwórz klucz (tryb zaawansowany)</string>
<string name="menu_search">Znajdź</string>
- <string name="menu_key_server">Serwer kluczy...</string>
- <string name="menu_update_key">Aktualizuj z serwera kluczy</string>
- <string name="menu_export_key_to_server">Wyślij do serwera kluczy</string>
- <string name="menu_share">Udostepnij...</string>
- <string name="menu_share_title_fingerprint">Udostepnij odcisk...</string>
- <string name="menu_share_title">Udostępnij cały klucz...</string>
- <string name="menu_share_default_fingerprint">z...</string>
- <string name="menu_share_default">z...</string>
- <string name="menu_share_qr_code">za pomocą kodu QR</string>
- <string name="menu_share_qr_code_fingerprint">za pomocą kodu QR</string>
- <string name="menu_share_nfc">za pomocą NFC</string>
- <string name="menu_copy_to_clipboard">Kopiuj do schowka</string>
<string name="menu_beam_preferences">Ustawienia Beam</string>
<string name="menu_key_edit_cancel">Anuluj</string>
<string name="menu_encrypt_to">Zaszyfruj do...</string>
@@ -78,22 +49,15 @@
<string name="menu_add_keys">Dodaj klucze</string>
<string name="menu_export_all_keys">Eksportuj wszystkie klucze</string>
<!--label-->
- <string name="label_sign">Podpis</string>
<string name="label_message">Wiadomość</string>
<string name="label_file">Plik</string>
<string name="label_no_passphrase">Brak hasła</string>
<string name="label_passphrase">Hasło</string>
- <string name="label_passphrase_again">Ponów</string>
<string name="label_algorithm">Algorytm</string>
<string name="label_ascii_armor">ASCII Armor</string>
- <string name="label_select_public_keys">Odbiorcy</string>
- <string name="label_delete_after_encryption">Usuń po zaszyfrowaniu</string>
<string name="label_delete_after_decryption">Usuń po odszyfrowaniu</string>
- <string name="label_share_after_encryption">Udostępnij po zaszyfrowaniu</string>
<string name="label_encryption_algorithm">Algorytm szyfrujący</string>
<string name="label_hash_algorithm">Algorytm funkcji skrótu</string>
- <string name="label_asymmetric">za pomocą klucza publicznego</string>
- <string name="label_symmetric">za pomocą hasła</string>
<string name="label_passphrase_cache_ttl">Bufor haseł</string>
<string name="label_message_compression">Kompresja wiadomości</string>
<string name="label_file_compression">Kompresja plików</string>
@@ -109,13 +73,7 @@
<string name="label_email">Adres email</string>
<string name="label_send_key">Wyślij klucz do serwera kluczy po certyfikacji</string>
<string name="label_fingerprint">Odcisk</string>
- <string name="select_keys_button_default">Wybierz</string>
<string name="expiry_date_dialog_title">Ustaw datę wygaśnięcia</string>
- <plurals name="select_keys_button">
- <item quantity="one">wybrano %d</item>
- <item quantity="few">wybrano %d</item>
- <item quantity="other">wybrano %d</item>
- </plurals>
<string name="user_id_no_name">&lt;bez nazwy&gt;</string>
<string name="none">&lt;żaden&gt;</string>
<string name="no_key">&lt;brak klucza&gt;</string>
@@ -164,7 +122,6 @@
<string name="flag_authenticate">Autentykuj</string>
<!--sentences-->
<string name="wrong_passphrase">Nieprawidłowe hasło.</string>
- <string name="set_a_passphrase">Najpierw ustaw hasło.</string>
<string name="no_filemanager_installed">Nie zainstalowano żadnego kompatybilnego menadżera plików.</string>
<string name="passphrases_do_not_match">Hasła nie pasują do siebie</string>
<string name="passphrase_must_not_be_empty">Podaj hasło.</string>
@@ -183,14 +140,11 @@
<string name="specify_file_to_export_to">Wskaż, do którego pliku wyeksportować dane.\nOSTRZEŻENIE: Plik zostanie nadpisany, jeżeli istnieje.</string>
<string name="key_deletion_confirmation_multi">Czy na pewno chcesz usunąć wszystkie zaznaczone klucze publiczne?\nTej operacji nie można cofnąć!</string>
<string name="secret_key_deletion_confirmation">Czy na pewno chcesz usunąć klucz prywatny \'%s\'?\nNie można cofnąć tej operacji!</string>
- <string name="ask_save_changed_key">Zostały dokonane zmiany w pęku kluczy, czy chcesz je zachować?</string>
<string name="public_key_deletetion_confirmation">Czy na pewno chcesz usunąć klucz publiczny \'%s\'?\nNie można cofnąć tej operacji!</string>
- <string name="also_export_secret_keys">Czy wyeksportować również klucze prywatne?</string>
<string name="key_exported">Pomyślnie wyeksportowano 1 klucz.</string>
<string name="keys_exported">Pomyślnie wyeksportowano %d kluczy.</string>
<string name="no_keys_exported">Nie wyeksportowano żadnych kluczy.</string>
<string name="key_creation_el_gamal_info">Informacja: tylko podklucze mogą być tworzone przy użyciu algorytmu ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Uwaga: generowanie klucza RSA o długości 1024 bity i mniejszej jest uważane za niebezpieczne i wyłączone dla tworzenia nowych kluczy.</string>
<string name="key_not_found">Nie można znaleźć klucza %08X.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">Zignorowano %d niepoprawny klucz prywatny. Prawdopodobnie został wyeksportowany przy uzyciu opcji\n --export-secret-subkeys\nUpewnij się że eksportujesz go z opcją\n --export-secret-keys\nktóra jest poprawna.</item>
@@ -201,7 +155,6 @@
<string name="list_empty">Lista jest pusta!</string>
<string name="nfc_successful">Pomyślnie wysłano klucz przez NFC Beam!</string>
<string name="key_copied_to_clipboard">Klucz został skopiowany do schowka!</string>
- <string name="key_has_already_been_certified">Klucz został już wcześniej certyfikowany!</string>
<string name="key_too_big_for_sharing">Klucz ma za duży rozmiar by być udostępniony w ten sposób!</string>
<!--errors
no punctuation, all lowercase,
@@ -211,20 +164,15 @@
<string name="error_no_secret_key_found">nie znaleziono pasującego klucza prywatnego</string>
<string name="error_external_storage_not_ready">zewnętrzne urządzenie jest niegotowe</string>
<string name="error_key_size_minimum512bit">klucz musi mieć rozmiar co najmniej 512 bitów</string>
- <string name="error_master_key_must_not_be_el_gamal">klucz EnGamal nie może być kluczem głównym</string>
<string name="error_unknown_algorithm_choice">wybrano nieznany algorytm</string>
<string name="error_user_id_no_email">nie znaleziono adresu email</string>
- <string name="error_key_needs_master_key">potrzeba co najmniej klucza głównego</string>
<string name="error_no_signature_passphrase">nie podano hasła</string>
<string name="error_no_signature_key">nie podano klucza podpisu</string>
<string name="error_invalid_data">nieprawidłowe dane</string>
<string name="error_integrity_check_failed">Sprawdzanie spójności zakończone niepowodzeniem! Dane były modyfikowane!</string>
<string name="error_wrong_passphrase">nieprawidłowe hasło</string>
- <string name="error_saving_keys">błąd przy zapisywaniu kluczy</string>
<string name="error_could_not_extract_private_key">nie można wyodrębnić klucza prywatnego</string>
- <string name="error_expiry_must_come_after_creation">data wygaśnięcia musi być późniejsza niż data stworzenia</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Dane binarne pozbawione pliku nie są obsługiwane.</string>
<string name="error_jelly_bean_needed">Potrzebujesz Androida 4.1 aby korzystać z Android NFC Beam</string>
<string name="error_nfc_needed">NCF jest niedostępne na twoim urządzeniu</string>
<string name="error_generic_report_bug">Wystąpił błąd ogólny, proszę zgłoś go autorom OpenKeychain.</string>
@@ -233,7 +181,6 @@
<item quantity="few">Część wczytanego pliku to poprawne obiekty OpenPGP, ale nie są kluczami OpenPGP</item>
<item quantity="other">Część wczytanego pliku to poprawne obiekty OpenPGP, ale nie są kluczami OpenPGP</item>
</plurals>
- <string name="error_change_something_first">Musisz dokonać zmian w pęku kluczy zanim będziesz mógł go zachować</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Nieprawidłowy podpis!</string>
<string name="decrypt_result_signature_unknown_pub_key">Nieznany klucz publiczny</string>
@@ -250,20 +197,12 @@
<string name="progress_importing">importowanie...</string>
<string name="progress_exporting">eksportowanie...</string>
<string name="progress_building_key">budowanie klucza...</string>
- <string name="progress_certifying_master_key">podpisywanie klucza głównego...</string>
<string name="progress_building_master_key">budowanie głównego zbioru kluczy...</string>
- <string name="progress_adding_sub_keys">dodawanie podkluczy...</string>
- <string name="progress_saving_key_ring">zapisywanie klucza...</string>
<plurals name="progress_exporting_key">
<item quantity="one">eksportowanie klucza...</item>
<item quantity="few">eksportowanie kluczy...</item>
<item quantity="other">eksportowanie kluczy...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">generowanie klucza, może to potrwać do 3 minut...</item>
- <item quantity="few">generowanie kluczy, może to potrwać do 3 minut...</item>
- <item quantity="other">generowanie kluczy, może to potrwać do 3 minut...</item>
- </plurals>
<string name="progress_extracting_signature_key">wyodrębnianie klucza podpisu...</string>
<string name="progress_extracting_key">wyodrębnianie klucza...</string>
<string name="progress_preparing_streams">przygotowywanie strumieni...</string>
@@ -280,8 +219,6 @@
<string name="progress_verifying_integrity">weryfikacja spójności...</string>
<string name="progress_deleting_securely">usuwanie \'%s\' bezpiecznie…</string>
<!--action strings-->
- <string name="hint_secret_keys">Wyszukaj klucze prywatne</string>
- <string name="action_share_key_with">Udostępnij klucz...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -308,20 +245,8 @@
<string name="help_about_version">Wersja:</string>
<!--Import-->
<string name="import_import">Zaimportuj wybrane klucze</string>
- <string name="import_from_clipboard">Importuj ze schowka</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Brakuje kodu QR o identyfikatorze %s</item>
- <item quantity="few">Brakuje kodów QR o identyfikatorach %s</item>
- <item quantity="other">Brakuje kodów QR o identyfikatorach %s</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Zacznij od kodu QR o identyfikatorze 1</string>
<string name="import_qr_code_wrong">Kod QR zniekształcony! Spróbuj jeszcze raz!</string>
- <string name="import_qr_code_finished">Skanowanie kodu QR zakończone!</string>
<string name="import_qr_code_too_short_fingerprint">Odcisk klucza jest za krótki (&lt; 16 znaków)</string>
- <string name="import_qr_scan_button">Odczytaj kod QR przy pomocy \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Aby odbierać klucze przez NFC, urządzenie musi być odblokowane.</string>
- <string name="import_nfc_help_button">Pomoc</string>
- <string name="import_clipboard_button">Odczytaj klucz ze schowka</string>
<!--Import result toast-->
<!--Intent labels-->
<string name="intent_decrypt_file">Deszyfruj plik korzystając z OpenKeychain</string>
@@ -343,9 +268,6 @@
<string name="api_settings_package_name">Nazwa paczki</string>
<string name="api_settings_package_signature">Skrót SHA-256 podpisu paczki</string>
<string name="api_settings_accounts">Konta</string>
- <string name="api_settings_accounts_empty">Nie przypisano żadnych kont do tej aplikacji</string>
- <string name="api_create_account_text">Aplikacja prosi o zgodę na utworzenie nowego konta. Wskaż istniejący klucz prywatny lub wygeneruj nowy.\nAplikacje mogą używać wyłącznie klucze które tutaj wskażesz!</string>
- <string name="api_register_text">Wyświetlona aplikacja prosi o dostęp do OpenKeychain.\nZezwolić?\n\nOSTRZEZENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezwalaj na dostęp! Możesz to również zrobić później, korzystając z ekranu \'Zarejestrowane aplikacje\'.</string>
<string name="api_register_allow">Zezwól na dostęp</string>
<string name="api_register_disallow">Odmów dostępu</string>
<string name="api_register_error_select_key">Wybierz klucz!</string>
@@ -353,9 +275,6 @@
<string name="api_error_wrong_signature">Sprawdzanie podpisu zakończone niepowodzeniem! Czy zainstalowałeś tę aplikację z innego źródła? Jeżeli jesteś pewien, że nie jest to atak, odwołaj rejestrację teg aplikacji w OpenKeychain, a następnie zarejestruj ją ponownie.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Udostępnij przez kod QR</string>
- <string name="share_qr_code_dialog_start">Przejdź przez wszystkiego kody QR korzystając z przycisku \'Nastepny\' i skanuj je pojedynczo.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Odcisk:</string>
- <string name="share_qr_code_dialog_progress">Kod QR o identyfikatorze %1$d z %2$d</string>
<string name="share_nfc_dialog">Udostępnij przez NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -367,30 +286,25 @@
<string name="key_list_empty_text2">Możesz zacząć od</string>
<string name="key_list_empty_text3">lub</string>
<string name="key_list_empty_button_create">tworzenie własnego klucza</string>
- <string name="key_list_empty_button_import">importowanie kluczy.</string>
<!--Key view-->
<string name="key_view_action_encrypt">Zaszyfruj korzystając z tego klucza</string>
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Klucze</string>
<string name="nav_encrypt">Podpisz i zaszyfruj</string>
<string name="nav_decrypt">Deszyfruj i weryfikuj</string>
- <string name="nav_import">Importuj klucze</string>
<string name="drawer_open">Otwórz panel nawigacji</string>
<string name="drawer_close">Zamknij panel nawigacji</string>
- <string name="edit">Edytuj</string>
<string name="my_keys">Moje klucze</string>
- <string name="label_secret_key">Klucz prywatny</string>
- <string name="secret_key_yes">dostępny</string>
- <string name="secret_key_no">niedostepny</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Wpisz tutaj wiadomość do zaszyfrowania i/lub podpisania...</string>
<string name="decrypt_content_edit_text_hint">Wpisz tutaj tekst do zaszyfrowania i/lub zweryfikowania...</string>
<!--certs-->
<string name="cert_default">domyślny</string>
<string name="cert_none">żaden</string>
<string name="cert_casual">typowy</string>
<string name="cert_positive">pozytywny</string>
- <string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">niepowodzenie!</string>
<string name="cert_verify_error">błąd!</string>
<string name="cert_verify_unavailable">klucz niedostępny</string>
@@ -398,7 +312,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="section_cert">Szczegóły certyfikatu</string>
<string name="unknown_uid">&lt;nieznany&gt;</string>
@@ -408,10 +324,9 @@
<string name="label_cert_type">Typ</string>
<string name="error_key_not_found">Nie znaleziono klucza!</string>
<string name="error_key_processing">Błąd przy przetwarzaniu klucza!</string>
- <string name="no_subkey">podklucz niedostępny</string>
<string name="key_stripped">zredukowany</string>
- <string name="secret_cannot_multiple">Klucze prywatne mogą być usuwane tylko pojedynczo</string>
<string name="title_view_cert">Zweryfikuj szczegóły certyfikatu</string>
<string name="unknown_algorithm">nieznany</string>
<string name="can_sign_not">nie może podpisać</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-ro/strings.xml b/OpenKeychain/src/main/res/values-ro/strings.xml
new file mode 100644
index 000000000..4cf33460a
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-ro/strings.xml
@@ -0,0 +1,43 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--title-->
+ <!--section-->
+ <!--button-->
+ <!--menu-->
+ <!--label-->
+ <!--choice-->
+ <!--key flags-->
+ <!--sentences-->
+ <!--errors
+ no punctuation, all lowercase,
+ they will be put after "error_message", e.g. "Error: file not found"-->
+ <!--errors without preceeding Error:-->
+ <!--results shown after decryption/verification-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Import result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
+ <!--unsorted-->
+ <!--First Time-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml
index 1e697c8db..7e6516abe 100644
--- a/OpenKeychain/src/main/res/values-ru/strings.xml
+++ b/OpenKeychain/src/main/res/values-ru/strings.xml
@@ -1,20 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Выбрать Публичный ключ</string>
- <string name="title_select_secret_key">Выбрать Секретный ключ</string>
<string name="title_encrypt">Зашифровать</string>
<string name="title_decrypt">Расшифровать</string>
<string name="title_authentication">Пароль</string>
- <string name="title_create_key">Создать ключ</string>
<string name="title_edit_key">Изменить ключ</string>
- <string name="title_wizard">Добро пожаловать в OpenKeychain</string>
<string name="title_preferences">Настройки</string>
<string name="title_api_registered_apps">Приложения</string>
<string name="title_key_server_preference">Настройки сервера ключей</string>
<string name="title_change_passphrase">Изменить пароль</string>
- <string name="title_set_passphrase">Задать пароль</string>
- <string name="title_share_with">Отправить...</string>
<string name="title_share_fingerprint_with">Отправить отпечаток...</string>
<string name="title_share_key">Отправить ключ...</string>
<string name="title_share_file">Отправить файл...</string>
@@ -35,60 +29,33 @@
<string name="section_general">Приложение</string>
<string name="section_defaults">Алгоритмы</string>
<string name="section_advanced">Дополнительно</string>
- <string name="section_master_key">Основной ключ</string>
- <string name="section_master_user_id">Основной идентификатор</string>
<string name="section_actions">Действия</string>
<string name="section_share_key">Ключ</string>
<string name="section_certification_key">Ваш ключ для сертификации</string>
<string name="section_upload_key">Загрузить ключ</string>
<string name="section_key_server">Сервер ключей</string>
- <string name="section_encrypt_and_or_sign">Зашифровать и/или Подписать</string>
- <string name="section_decrypt_verify">Расшифровать и проверить</string>
<string name="section_fingerprint">Отпечаток ключа</string>
<string name="section_key_to_certify">Сертифицируемый ключ</string>
<!--button-->
- <string name="btn_certify">Сертифицировать</string>
<string name="btn_decrypt_verify_file">Расшифровать, проверить и сохранить файл</string>
<string name="btn_decrypt_verify_message">Расшифровать и проверить сообщение</string>
- <string name="btn_decrypt_verify_clipboard">Из буфера обмена</string>
<string name="btn_encrypt_file">Зашифровать и сохранить файл</string>
<string name="btn_save">Сохранить</string>
<string name="btn_do_not_save">Отмена</string>
<string name="btn_delete">Удалить</string>
<string name="btn_no_date">Нет</string>
<string name="btn_okay">Да</string>
- <string name="btn_change_passphrase">Изменить новый пароль</string>
- <string name="btn_set_passphrase">Задать новый пароль</string>
<string name="btn_export_to_server">Загрузить на сервер ключей</string>
<string name="btn_next">Далее</string>
<string name="btn_back">Назад</string>
- <string name="btn_clipboard">Буфер обмена</string>
- <string name="btn_share">Поделиться...</string>
<string name="btn_lookup_key">Найти ключ</string>
- <string name="btn_encryption_advanced_settings_show">Показать расширенные настройки</string>
- <string name="btn_encryption_advanced_settings_hide">Скрыть расширенные настройки</string>
- <string name="btn_share_encrypted_signed">Отправить зашифрованное/подписанное сообщение...</string>
<string name="btn_view_cert_key">Просмотр ключа</string>
<!--menu-->
<string name="menu_preferences">Настройки</string>
<string name="menu_help">Помощь</string>
<string name="menu_export_key">Экспорт в файл</string>
<string name="menu_delete_key">Удалить ключ</string>
- <string name="menu_create_key">Создать ключ</string>
- <string name="menu_create_key_expert">Создать ключ (эксперт)</string>
<string name="menu_search">Поиск</string>
- <string name="menu_key_server">Сервер ключей...</string>
- <string name="menu_update_key">Обновить с сервера ключей</string>
- <string name="menu_export_key_to_server">Загрузить на сервер ключей</string>
- <string name="menu_share">Отправить...</string>
- <string name="menu_share_title_fingerprint">Отправить отпечаток...</string>
- <string name="menu_share_title">Отправить ключ...</string>
- <string name="menu_share_default_fingerprint">Отправить</string>
- <string name="menu_share_default">Отправить</string>
- <string name="menu_share_qr_code">QR код</string>
- <string name="menu_share_qr_code_fingerprint">QR код</string>
- <string name="menu_share_nfc">через NFC</string>
- <string name="menu_copy_to_clipboard">Копировать в буфер</string>
<string name="menu_beam_preferences">Настройки Beam</string>
<string name="menu_key_edit_cancel">Отмена</string>
<string name="menu_encrypt_to">Зашифровать....</string>
@@ -97,22 +64,15 @@
<string name="menu_export_all_keys">Экспорт всех ключей</string>
<string name="menu_advanced">Подробные данные</string>
<!--label-->
- <string name="label_sign">Подписать</string>
<string name="label_message">Сообщение</string>
<string name="label_file">Файл</string>
<string name="label_no_passphrase">Без пароля</string>
<string name="label_passphrase">Пароль</string>
- <string name="label_passphrase_again">Еще раз</string>
<string name="label_algorithm">Алгоритм</string>
<string name="label_ascii_armor">ASCII формат</string>
- <string name="label_select_public_keys">Получатели</string>
- <string name="label_delete_after_encryption">Удалить после шифрования</string>
<string name="label_delete_after_decryption">Удалить после расшифровки</string>
- <string name="label_share_after_encryption">Отправить после шифрования</string>
<string name="label_encryption_algorithm">Алгоритм шифрования</string>
<string name="label_hash_algorithm">Hash-алгоритм</string>
- <string name="label_asymmetric">Публичным ключом</string>
- <string name="label_symmetric">Паролем</string>
<string name="label_passphrase_cache_ttl">Помнить пароль</string>
<string name="label_message_compression">Сжатие сообщения</string>
<string name="label_file_compression">Сжатие файла</string>
@@ -129,13 +89,7 @@
<string name="label_email">Email</string>
<string name="label_send_key">После сертификации загрузить ключ на сервер</string>
<string name="label_fingerprint">Отпечаток</string>
- <string name="select_keys_button_default">Выбрать</string>
<string name="expiry_date_dialog_title">Срок годности</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d выбран</item>
- <item quantity="few">%d выбрано</item>
- <item quantity="other">%d выбрано</item>
- </plurals>
<string name="user_id_no_name">&lt;нет имени&gt;</string>
<string name="none">&lt;нет&gt;</string>
<string name="no_key">&lt;нет ключа&gt;</string>
@@ -184,7 +138,6 @@
<string name="flag_authenticate">Аутентификация</string>
<!--sentences-->
<string name="wrong_passphrase">Неправ. пароль</string>
- <string name="set_a_passphrase">Сначала задайте пароль</string>
<string name="no_filemanager_installed">Нет совместимого менеджера файлов.</string>
<string name="passphrases_do_not_match">Пароли не совпадают.</string>
<string name="passphrase_must_not_be_empty">Пожалуйста, введите пароль.</string>
@@ -203,15 +156,11 @@
<string name="specify_file_to_export_to">Пожалуйста, выберите файл для экспорта.\nВНИМАНИЕ! Если файл существует, он будет перезаписан.</string>
<string name="key_deletion_confirmation_multi">Вы уверены, что хотите удалить выбранные ключи?\nЭто действие нельзя отменить!</string>
<string name="secret_key_deletion_confirmation">Вы уверены, что ходите удалить СЕКРЕТНЫЙ ключ \'%s\'?\nЭто действие нельзя отменить!</string>
- <string name="ask_save_changed_key">Изменения внесены. Сохранить?</string>
- <string name="ask_empty_id_ok">Вы добавили пустой идентификатор. Вы уверены, что хотите продолжить?</string>
<string name="public_key_deletetion_confirmation">Вы правда хотите удалить публичный ключ \'%s\'?\nЭто действие нельзя отменить!</string>
- <string name="also_export_secret_keys">Экспортировать секретные ключи?</string>
<string name="key_exported">Успешный экспорт 1 ключа.</string>
<string name="keys_exported">Экспортировано %d ключей.</string>
<string name="no_keys_exported">Ключи не были экспортированы.</string>
<string name="key_creation_el_gamal_info">Прим.: только вторичные ключи поддерживают ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Внимание: создание ключей RSA длиной 1024 бита и менее признано небезопасным. Данная возможность отключена.</string>
<string name="key_not_found">Не удается найти ключ %08X.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d плохой секретный ключ проигнорирован. Возможно, вы экспортируете с параметром\n--export-secret-subkeys\nВместо этого используйте\n--export-secret-keys</item>
@@ -224,7 +173,6 @@
<string name="nfc_successful">Ключ успешно передан через NFC!</string>
<string name="key_copied_to_clipboard">Ключ скопирован в буфер обмена!</string>
<string name="fingerprint_copied_to_clipboard">Отпечаток ключа скопирован в буфер обмена!</string>
- <string name="key_has_already_been_certified">Ключ уже был сертифицирован ранее!</string>
<string name="select_key_to_certify">Выберите ключ, используемый для сертификации!</string>
<string name="key_too_big_for_sharing">Ключ слишком большой для этого способа передачи!</string>
<!--errors
@@ -235,36 +183,25 @@
<string name="error_no_secret_key_found">нет подходящего секретного ключа</string>
<string name="error_external_storage_not_ready">внешняя память не готова</string>
<string name="error_key_size_minimum512bit">размер ключа должен быть не менее 512бит</string>
- <string name="error_master_key_must_not_be_el_gamal">ключ ElGamal не может быть основным</string>
<string name="error_unknown_algorithm_choice">выбран неизвестный алгоритм</string>
<string name="error_user_id_no_email">email не найден</string>
<string name="error_key_needs_a_user_id">необходим хотя бы один идентификатор</string>
- <string name="error_main_user_id_must_not_be_empty">основной идентификатор не может быть пуст</string>
- <string name="error_key_needs_master_key">необходим основной ключ</string>
<string name="error_no_signature_passphrase">пароль не задан</string>
<string name="error_no_signature_key">ключ для подписи не задан</string>
<string name="error_invalid_data">некорректное шифрование</string>
<string name="error_integrity_check_failed">Проверка целостности не удалась! Данные изменились!</string>
<string name="error_wrong_passphrase">неправильный пароль</string>
- <string name="error_saving_keys">ошибка сохранения ключей</string>
<string name="error_could_not_extract_private_key">не удалось извлечь личный ключ</string>
- <string name="error_expiry_must_come_after_creation">срок годности не может быть раньше даты создания</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Прямая передача данных без использования файла в памяти устройства не поддерживается.</string>
<string name="error_jelly_bean_needed">Для использования NFC Beam требуется Android 4.1+ !</string>
<string name="error_nfc_needed">Ваше устройство не поддерживает NFC!</string>
<string name="error_nothing_import">Ключи не найдены!</string>
- <string name="error_query_too_short">Запрос слишком короткий</string>
- <string name="error_searching_keys">Ошибка поиска ключей на сервере</string>
- <string name="error_too_many_responses">Поиск ключа вернул слишком много вариантов; Пожалуйста, уточните запрос</string>
- <string name="error_import_no_valid_keys">Файл/Буфер пуст</string>
<string name="error_generic_report_bug">Выявлена ошибка. Пожалуйста, сообщите о ней разработчику.</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">часть загруженного файла содержит данные OpenPGP, но это не ключ</item>
<item quantity="few">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
<item quantity="other">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
</plurals>
- <string name="error_change_something_first">Перед сохранением внесите изменения</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Неверная подпись!</string>
<string name="decrypt_result_signature_unknown_pub_key">Неизвестный ключ</string>
@@ -281,20 +218,12 @@
<string name="progress_importing">импорт...</string>
<string name="progress_exporting">экспорт...</string>
<string name="progress_building_key">создание ключа...</string>
- <string name="progress_certifying_master_key">сертификация основного ключа...</string>
<string name="progress_building_master_key">создание основной связки...</string>
- <string name="progress_adding_sub_keys">добавление доп. ключей...</string>
- <string name="progress_saving_key_ring">сохранение ключа...</string>
<plurals name="progress_exporting_key">
<item quantity="one">экспорт ключа...</item>
<item quantity="few">экспорт ключей...</item>
<item quantity="other">экспорт ключей...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">создание ключа. это может занять до 3 минут...</item>
- <item quantity="few">создание ключей. это может занять до 3 минут...</item>
- <item quantity="other">создание ключей. это может занять до 3 минут...</item>
- </plurals>
<string name="progress_extracting_signature_key">извлечение подписи ключа...</string>
<string name="progress_extracting_key">извлечение ключа...</string>
<string name="progress_preparing_streams">подготовка к передаче...</string>
@@ -312,8 +241,6 @@
<string name="progress_deleting_securely">безопасное удаление \'%s\'...</string>
<!--action strings-->
<string name="hint_public_keys">Имя/Email/ID ключа…</string>
- <string name="hint_secret_keys">Найти секретные ключи</string>
- <string name="action_share_key_with">Отправить...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -344,34 +271,15 @@
<string name="import_tab_qr_code">QR код/NFC</string>
<string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Импорт выбранных ключей</string>
- <string name="import_from_clipboard">Импорт из буфера обмена</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Не найдены QR код с ID %s</item>
- <item quantity="few">Не найдены QR коды с ID %s</item>
- <item quantity="other">Не найдены QR коды с ID %s</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Пожалуйста, начните с QR кода с id 1</string>
<string name="import_qr_code_wrong">Некорректный QR код. Попробуйте снова!</string>
- <string name="import_qr_code_finished">Сканирование QR завершено!</string>
<string name="import_qr_code_too_short_fingerprint">Отпечаток слишком коротнкий (&lt; 16 символов)</string>
- <string name="import_qr_scan_button">Сканировать QR код с \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Разблокируйте устройство, что бы получить ключ через NFC.</string>
- <string name="import_nfc_help_button">Помощь</string>
<string name="import_qr_code_button">Сканировать QR код...</string>
- <string name="import_clipboard_button">Получить ключ из буфера</string>
- <string name="import_keybase_button">Получить ключ с сервера Keybase.io</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Ключ успешно импортирован</item>
<item quantity="few">Успешно добавлено %1$d ключей</item>
<item quantity="other">Успешно добавлено %1$d ключей</item>
</plurals>
- <plurals name="import_keys_added_and_updated_2">
- <item quantity="one">и обновлен ключ%2$s.</item>
- <item quantity="few">и обновлено %1$d ключей%2$s.</item>
- <item quantity="other">и обновлено %1$d ключей%2$s.</item>
- </plurals>
- <string name="view_log">Смотреть журнал</string>
<string name="import_error_nothing">Нет данных для импорта.</string>
<string name="import_error">Ошибка импорта ключей!</string>
<string name="import_with_warnings">, с предупреждениями</string>
@@ -381,7 +289,6 @@
<string name="intent_send_encrypt">OpenKeychain: Зашифровать</string>
<string name="intent_send_decrypt">OpenKeychain: Расшифровать</string>
<!--Remote API-->
- <string name="api_no_apps">Нет связанных приложений!\n\nСписок приложений, поддерживающих интеграцию, доступен в разделе \'Помощь\'!</string>
<string name="api_settings_show_info">Показать подробную информацию</string>
<string name="api_settings_hide_info">Скрыть подробную информацию</string>
<string name="api_settings_show_advanced">Показать расширенные настройки</string>
@@ -397,9 +304,6 @@
<string name="api_settings_package_name">Наименование пакета</string>
<string name="api_settings_package_signature">SHA-256 подписи пакета</string>
<string name="api_settings_accounts">Аккаунты</string>
- <string name="api_settings_accounts_empty">Нет аккаунтов, связанных с этим приложением.</string>
- <string name="api_create_account_text">Приложение запрашивает создание нового аккаунта. Выберите секретный ключ или создайте новый.\nПриложения ограничены в доступе только к выбраным здесь ключам!</string>
- <string name="api_register_text">Данное приложение запрашивает доступ к OpenKeychain.\nРазрешить доступ?\n\nВНИМАНИЕ: Если вы не знаете почему возник этот запрос, откажите в доступе!\nПозже вы можете отозвать право доступа в разделе \"Зарегистрированные программы\".</string>
<string name="api_register_allow">Разрешить доступ</string>
<string name="api_register_disallow">Запретить доступ</string>
<string name="api_register_error_select_key">Пожалуйста, выберите ключ!</string>
@@ -409,9 +313,6 @@
<string name="api_error_wrong_signature">Проверка подписи пакета не удалась! Если вы установили программу из другого источника, отзовите для неё доступ к этой программе или обновите право доступа.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Отправить как QR код</string>
- <string name="share_qr_code_dialog_start">Сканируйте несколько QR подряд, нажимая \'Далее\' после каждого кода.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Отпечаток:</string>
- <string name="share_qr_code_dialog_progress">QR код с id %1$d из %2$d</string>
<string name="share_nfc_dialog">Отправить через NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -423,7 +324,6 @@
<string name="key_list_empty_text2">Но Вы можете</string>
<string name="key_list_empty_text3">или</string>
<string name="key_list_empty_button_create">создать свой ключ</string>
- <string name="key_list_empty_button_import">Импортировать ключи</string>
<!--Key view-->
<string name="key_view_action_edit">Изменить ключ</string>
<string name="key_view_action_encrypt">Зашифровать этим ключом</string>
@@ -434,27 +334,23 @@
<string name="key_view_tab_share">Отправить...</string>
<string name="key_view_tab_keys">Доп. ключи</string>
<string name="key_view_tab_certs">Сертификация</string>
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Ключи</string>
<string name="nav_encrypt">Подписать и зашифровать</string>
<string name="nav_decrypt">Расшифровать и проверить</string>
- <string name="nav_import">Импорт ключей</string>
<string name="nav_apps">Приложения</string>
<string name="drawer_open">Открыть панель навигации</string>
<string name="drawer_close">Закрыть панель навигации</string>
- <string name="edit">Изменить</string>
<string name="my_keys">Мои ключи</string>
- <string name="label_secret_key">Секретный ключ</string>
- <string name="secret_key_yes">доступен</string>
- <string name="secret_key_no">не доступен</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Напишите сообщение здесь, что бы зашифровать и/или подписать...</string>
<string name="decrypt_content_edit_text_hint">Введите сюда шифр для расшифровки и/или проверки...</string>
<!--certs-->
<string name="cert_default">по умолчанию</string>
<string name="cert_none">нет</string>
<string name="cert_revoke">отозван</string>
- <string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">сбой!</string>
<string name="cert_verify_error">ошибка!</string>
<string name="cert_verify_unavailable">ключ не доступен</string>
@@ -483,9 +379,9 @@
<!--Keyring Canonicalization log entries-->
<string name="msg_kc_master">Подготовка основного ключа</string>
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<string name="msg_mf_error_encode">Ошибка кодирования!</string>
- <string name="msg_mf_error_keyid">Нет ID ключа. Это программная ошибка. Пожалуйста, сообщите об этом!</string>
<string name="msg_mf_error_integrity">Внутренняя ошибка, сбой проверки целостности!</string>
<string name="msg_mf_error_revoked_primary">Аннулированные идентификаторы не могут быть основными!</string>
<string name="msg_mf_error_pgp">Внутренняя ошибка PGP!</string>
@@ -498,6 +394,7 @@
<string name="msg_mf_uid_revoke">Аннулирование id %s</string>
<string name="msg_mf_unlock_error">Ошибка разблокирования связки!</string>
<string name="msg_mf_unlock">Разблокирование связки</string>
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="section_certifier_id">Кем подписан</string>
<string name="section_cert">Детали сертификации</string>
@@ -510,13 +407,11 @@
<string name="label_cert_type">Тип</string>
<string name="error_key_not_found">Ключ не найден!</string>
<string name="error_key_processing">Ошибка обработки ключа!</string>
- <string name="no_subkey">вторичный ключ не доступен</string>
- <string name="secret_cannot_multiple">Секретные ключи можно удалять только по одному!</string>
<string name="title_view_cert">Просмотреть детали сертификации</string>
<string name="unknown_algorithm">неизв.</string>
<string name="can_sign_not">не для подписания</string>
- <string name="error_encoding">Ошибка кодировки</string>
<string name="error_no_encrypt_subkey">Нет доп. ключа для шифрования!</string>
<string name="info_no_manual_account_creation">Не создавать аккаунт OpenKeychain вручную.\nДля подробной информации, смотрите раздел Помощь.</string>
<string name="contact_show_key">Показать ключ (%s)</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-sk/strings.xml b/OpenKeychain/src/main/res/values-sk/strings.xml
index 593fc2d11..4cf33460a 100644
--- a/OpenKeychain/src/main/res/values-sk/strings.xml
+++ b/OpenKeychain/src/main/res/values-sk/strings.xml
@@ -25,6 +25,9 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<!--hints-->
<!--certs-->
@@ -32,6 +35,9 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index b9a0c4cb9..a6426b3e8 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -1,18 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Izberi javni ključ</string>
- <string name="title_select_secret_key">Izberi zasebni ključ</string>
<string name="title_encrypt">Šifriraj</string>
<string name="title_decrypt">Dešifriraj</string>
<string name="title_authentication">Geslo</string>
- <string name="title_create_key">Ustvari kluč</string>
<string name="title_edit_key">Uredi ključ</string>
<string name="title_preferences">Nastavitve</string>
+ <string name="title_api_registered_apps">Aplikacije</string>
<string name="title_key_server_preference">Nastavitve strežnikov</string>
<string name="title_change_passphrase">Spremeni geslo</string>
- <string name="title_set_passphrase">Določi geslo</string>
- <string name="title_share_with">Deli z...</string>
<string name="title_share_fingerprint_with">Deli prstni odtis z...</string>
<string name="title_share_key">Deli ključ z...</string>
<string name="title_share_file">Deli datoteko z...</string>
@@ -26,66 +22,40 @@
<string name="title_certify_key">Overi identiteto</string>
<string name="title_key_details">Podrobnosti o ključu</string>
<string name="title_help">Pomoč</string>
+ <string name="title_log_display">Dnevnik</string>
<!--section-->
<string name="section_user_ids">Identitete</string>
<string name="section_keys">Podključi</string>
<string name="section_general">Splošno</string>
<string name="section_defaults">Privzeto</string>
<string name="section_advanced">Napredno</string>
- <string name="section_master_key">Glavni ključ</string>
- <string name="section_master_user_id">Glavna identiteta</string>
<string name="section_actions">Ravnanja</string>
<string name="section_share_key">Cel ključ</string>
<string name="section_certification_key">Vaš ključ, uporabljan za overitev</string>
<string name="section_upload_key">Naloži ključ</string>
<string name="section_key_server">Strežnik</string>
- <string name="section_encrypt_and_or_sign">Šifriraj in/ali podpiši</string>
- <string name="section_decrypt_verify">Dešifriraj in preveri</string>
<string name="section_fingerprint">Prstnim odtisom</string>
<string name="section_key_to_certify">Ključi za overjanje</string>
<!--button-->
- <string name="btn_certify">Overi</string>
<string name="btn_decrypt_verify_file">Dešifriraj, preveri in shrani</string>
<string name="btn_decrypt_verify_message">Dešifriraj in preveri sporočilo</string>
- <string name="btn_decrypt_verify_clipboard">Iz odložišča</string>
<string name="btn_encrypt_file">Šifriraj in shrani datoteko</string>
<string name="btn_save">Shrani</string>
<string name="btn_do_not_save">Prekliči</string>
<string name="btn_delete">Izbriši</string>
<string name="btn_no_date">Brez</string>
<string name="btn_okay">OK</string>
- <string name="btn_change_passphrase">Spremeni novo geslo</string>
- <string name="btn_set_passphrase">Nastavi novo geslo</string>
<string name="btn_export_to_server">Naloži na strežnik</string>
<string name="btn_next">Naprej</string>
<string name="btn_back">Nazaj</string>
- <string name="btn_clipboard">Odložišče</string>
- <string name="btn_share">Deli z...</string>
<string name="btn_lookup_key">Išči ključ</string>
- <string name="btn_encryption_advanced_settings_show">Prikaži napredne nstavitve</string>
- <string name="btn_encryption_advanced_settings_hide">Skrij napredne nastavitve</string>
- <string name="btn_share_encrypted_signed">Deli šifrirano/podpisano sporočilo...</string>
<string name="btn_view_cert_key">Poglej ključ za overjanje</string>
<!--menu-->
<string name="menu_preferences">Nastavitve</string>
<string name="menu_help">Pomoč</string>
<string name="menu_export_key">Izvozi v datoteko</string>
<string name="menu_delete_key">Izbriši ključ</string>
- <string name="menu_create_key">Ustvari ključ</string>
- <string name="menu_create_key_expert">Ustvari ključ (napredno)</string>
<string name="menu_search">Išči</string>
- <string name="menu_key_server">Strežnik...</string>
- <string name="menu_update_key">Posodobi s strežnika</string>
- <string name="menu_export_key_to_server">Naloži na strežnik</string>
- <string name="menu_share">Deli...</string>
- <string name="menu_share_title_fingerprint">Deli prstni odtis...</string>
- <string name="menu_share_title">Deli celotni ključ...</string>
- <string name="menu_share_default_fingerprint">z...</string>
- <string name="menu_share_default">z...</string>
- <string name="menu_share_qr_code">s kodo QR</string>
- <string name="menu_share_qr_code_fingerprint">s kodo QR</string>
- <string name="menu_share_nfc">preko NFC</string>
- <string name="menu_copy_to_clipboard">Kopiraj na odložišče</string>
<string name="menu_beam_preferences">Nastavitve Beam</string>
<string name="menu_key_edit_cancel">Prekliči</string>
<string name="menu_encrypt_to">Šifriraj v...</string>
@@ -94,22 +64,15 @@
<string name="menu_export_all_keys">Izvozi vse ključe</string>
<string name="menu_advanced">Prikaži dodatne informacije</string>
<!--label-->
- <string name="label_sign">Podpiši</string>
<string name="label_message">Sporočilo</string>
<string name="label_file">Datoteka</string>
<string name="label_no_passphrase">Brez gesla</string>
<string name="label_passphrase">Geslo</string>
- <string name="label_passphrase_again">Ponovno</string>
<string name="label_algorithm">Algoritem</string>
<string name="label_ascii_armor">ASCII Armor</string>
- <string name="label_select_public_keys">Prejemniki</string>
- <string name="label_delete_after_encryption">Po šifriranju izbriši</string>
<string name="label_delete_after_decryption">Po dešifriranju izbriši</string>
- <string name="label_share_after_encryption">Deli po šifriranju</string>
<string name="label_encryption_algorithm">Šifrirni algoritem</string>
<string name="label_hash_algorithm">Zgostitveni algoritem</string>
- <string name="label_asymmetric">z javnim ključem</string>
- <string name="label_symmetric">z geslom</string>
<string name="label_passphrase_cache_ttl">Hranjenje gesla v spominu</string>
<string name="label_message_compression">Stiskanje sporočil</string>
<string name="label_file_compression">Stiskanje datotek</string>
@@ -126,14 +89,7 @@
<string name="label_email">E-pošta</string>
<string name="label_send_key">Po overitvi naloži ključ na izbrani strežnik</string>
<string name="label_fingerprint">Prstni odtis</string>
- <string name="select_keys_button_default">Izberi</string>
<string name="expiry_date_dialog_title">Določi datum poteka veljavnosti</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d izbran</item>
- <item quantity="two">%d izbrana</item>
- <item quantity="few">%d izbrani</item>
- <item quantity="other">%d izbranih</item>
- </plurals>
<string name="user_id_no_name">&lt;brez imena&gt;</string>
<string name="none">&lt;nič&gt;</string>
<string name="no_key">&lt;brez ključa&gt;</string>
@@ -184,7 +140,6 @@
<string name="flag_authenticate">Preveri avtentičnost</string>
<!--sentences-->
<string name="wrong_passphrase">Napačno geslo.</string>
- <string name="set_a_passphrase">Najprej določite geslo.</string>
<string name="no_filemanager_installed">Nimate nameščenega združljivega upravljalnika datotek.</string>
<string name="passphrases_do_not_match">Gesli se ne ujemata.</string>
<string name="passphrase_must_not_be_empty">Vnesite geslo.</string>
@@ -203,15 +158,11 @@
<string name="specify_file_to_export_to">Določite datoteko, kamor želite izvoziti vsebino.\nPOZOR: če datoteka že obstaja, bo prepisana.</string>
<string name="key_deletion_confirmation_multi">Ali res želite izbrisati vse izbrane javne ključe?\nTega koraka ne boste mogli preklicati!</string>
<string name="secret_key_deletion_confirmation">Ali res želite izbrisati ZASEBNI ključ \'%s\'?\nTega koraka ne boste mogli preklicati!</string>
- <string name="ask_save_changed_key">Vnesli ste spremembe v zbirko ključev. Jih želite shraniti?</string>
- <string name="ask_empty_id_ok">Dodali ste prazno identiteto, ali res želite nadaljevati?</string>
<string name="public_key_deletetion_confirmation">Ali res želite izbrisati javni ključ \'%s\'?\nTega koraka ne boste mogli preklicati!</string>
- <string name="also_export_secret_keys">Želite izvoziti tudi zasebne ključe?</string>
<string name="key_exported">Uspešno izvožen 1 ključ.</string>
<string name="keys_exported">Uspešno izvoženih ključev: %d</string>
<string name="no_keys_exported">Noben ključ ni bil izvožen.</string>
<string name="key_creation_el_gamal_info">Pozor: ELGamal podpirajo samo podključi.</string>
- <string name="key_creation_weak_rsa_info">Pozor: ključi RSA dolžine 1024 bitov ali manj ne veljajo več za varne, zato je njihovo ustvarjanje onemogočeno.</string>
<string name="key_not_found">Ne najdem ključa %08X.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">Neupoštevan %d slab zasebni ključ. Morda je bil izvožen na način\n --export-secret-subkeys\nPoskrbite, da bo izvožen z\n --export-secret-keys</item>
@@ -225,7 +176,6 @@
<string name="nfc_successful">Ključ uspešno poslan preko NFC Beam!</string>
<string name="key_copied_to_clipboard">Ključ je bil prekopiran v odložišče!</string>
<string name="fingerprint_copied_to_clipboard">Prstni odtis je bil prekopiran v odložišče!</string>
- <string name="key_has_already_been_certified">Ključ je že bil overjen!</string>
<string name="select_key_to_certify">Izberite ključ, ki ga boste uporabljali za overjanje!</string>
<string name="key_too_big_for_sharing">Ključ je prevelik za delitev na ta način!</string>
<!--errors
@@ -236,27 +186,19 @@
<string name="error_no_secret_key_found">ne najdem ustreznega zasebnega ključa</string>
<string name="error_external_storage_not_ready">zunanja shramba ni na voljo</string>
<string name="error_key_size_minimum512bit">velikost ključa mora biti najmanj 512bit</string>
- <string name="error_master_key_must_not_be_el_gamal">glavni ključ ne more biti ElGamal</string>
<string name="error_unknown_algorithm_choice">neznana izbira algoritma</string>
<string name="error_user_id_no_email">najti ni nobene e-pošte</string>
<string name="error_key_needs_a_user_id">potrebujete vsaj eno identiteto</string>
- <string name="error_main_user_id_must_not_be_empty">glavna identiteta ne more biti prazna</string>
- <string name="error_key_needs_master_key">potrebujem vsaj glavni ključ</string>
<string name="error_no_signature_passphrase">dano ni bilo nobeno geslo</string>
<string name="error_no_signature_key">dan ni bil noben podpisni ključ</string>
<string name="error_invalid_data">neveljavni šifrirni podatki</string>
<string name="error_integrity_check_failed">Preverba neokrnjenosti ni bila uspešna! Podatki so bili spremenjeni!</string>
<string name="error_wrong_passphrase">napačno geslo</string>
- <string name="error_saving_keys">napaka pri shranjevanju nekaterih ključev</string>
<string name="error_could_not_extract_private_key">ne morem izvleči zasebnega ključa</string>
- <string name="error_expiry_must_come_after_creation">datum poteka mora biti kasnejši od datuma stvaritve</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Neposredni binarni podatki brez dejanske datoteke v datotečnem sistemu niso podprti.</string>
<string name="error_jelly_bean_needed">Za uporabo storitve NFC Beam potrebujete najmanj Android 4.1!</string>
<string name="error_nfc_needed">NFC ni na voljo na vaši napravi!</string>
- <string name="error_query_too_short">Iskalni pojem je prekratek</string>
- <string name="error_searching_keys">Nepremostljiva napaka pri iskanju ključev na strežniku</string>
- <string name="error_too_many_responses">Iskanje ključev je vrnilo preveč zadetkov; prosimo redefinirajte iskalni pojem</string>
+ <string name="error_nothing_import">Najden ni bil noben ključ!</string>
<string name="error_generic_report_bug">Pripetila se je splošna napaka, prosimo ustvarite poročilo o \'hrošču\'.</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">Del naložene datoteke je veljavnen objekt OpenPGP a ni ključ.</item>
@@ -264,7 +206,6 @@
<item quantity="few">Deli naložene datoteke so veljavni objekti OpenPGP a niso ključi.</item>
<item quantity="other">Deli naložene datoteke so veljavni objekti OpenPGP a niso ključi.</item>
</plurals>
- <string name="error_change_something_first">V zbirko ključev morate najprej vnesti spremembe, šele nato jo lahko shranite</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Neveljaven podpis!</string>
<string name="decrypt_result_signature_unknown_pub_key">Neznan javni ključ</string>
@@ -281,22 +222,13 @@
<string name="progress_importing">uvažam...</string>
<string name="progress_exporting">izvažam...</string>
<string name="progress_building_key">ustvarjam ključ...</string>
- <string name="progress_certifying_master_key">overjam glavni ključ...</string>
<string name="progress_building_master_key">ustvarjam glavni prstan...</string>
- <string name="progress_adding_sub_keys">dodajam podključe...</string>
- <string name="progress_saving_key_ring">shranjujem ključ...</string>
<plurals name="progress_exporting_key">
<item quantity="one">izvažam ključ...</item>
<item quantity="two">izvažam ključa...</item>
<item quantity="few">izvažam ključe...</item>
<item quantity="other">izvažam ključe...</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">ustvarjam ključ, to lahko traja okoli 3 minute...</item>
- <item quantity="two">ustvarjam ključa, to lahko traja okoli 3 minute...</item>
- <item quantity="few">ustvarjam ključe, to lahko traja okoli 3 minute...</item>
- <item quantity="other">ustvarjam ključe, to lahko traja okoli 3 minute...</item>
- </plurals>
<string name="progress_extracting_signature_key">izvlačim ključ za podpisovanje...</string>
<string name="progress_extracting_key">izvlačim ključ...</string>
<string name="progress_preparing_streams">pripravljam tokove...</string>
@@ -313,8 +245,8 @@
<string name="progress_verifying_integrity">preverjam neokrnjenost...</string>
<string name="progress_deleting_securely">varno brišem \'%s\'…</string>
<!--action strings-->
- <string name="hint_secret_keys">Iskanje zasebnih ključev</string>
- <string name="action_share_key_with">Deli ključ z...</string>
+ <string name="hint_public_keys">Ime/e-pošta/ID ključa</string>
+ <string name="hint_keybase_search">Ime/Keybase.io uporabniško ime...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -341,30 +273,19 @@
<string name="help_about_version">Različica:</string>
<!--Import-->
<string name="import_import">Uvozi izbrane ključe</string>
- <string name="import_from_clipboard">Uvozi iz odložišča</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Manjka koda QR z ID-jem %s</item>
- <item quantity="two">Manjkata kodi QR z ID-jema %s</item>
- <item quantity="few">Manjkajo kode QR z ID-ji %s</item>
- <item quantity="other">Manjkajo kode QR z ID-ji %s</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Začnite s kodo QR z ID-jem 1</string>
<string name="import_qr_code_wrong">Koda QR je deformirana! Poskusite znova!</string>
- <string name="import_qr_code_finished">Skeniranje kode QR zaključeno!</string>
<string name="import_qr_code_too_short_fingerprint">Prstni odtis je prekratek (&lt; 16 znakov)</string>
- <string name="import_qr_scan_button">Skenirajte kodo QR z aplikacijo \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Za prejem ključev preko NFC mora biti naprava odklenjena.</string>
- <string name="import_nfc_help_button">Pomoč</string>
- <string name="import_clipboard_button">Pridobi ključ iz odložišča</string>
- <string name="import_keybase_button">Pridobi ključ iz Keybase.io</string>
<!--Import result toast-->
+ <string name="import_error_nothing">Nič za uvoziti.</string>
+ <string name="import_error">Napaka pri uvozu ključev!</string>
+ <string name="import_with_warnings">, z opozorilom</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Dešifriraj datoteko z OpenKeychain</string>
<string name="intent_import_key">Uvozi ključ z OpenKeychain</string>
<string name="intent_send_encrypt">Šifriraj z OpenKeychain</string>
<string name="intent_send_decrypt">Dešifriraj z OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Ni nobene prijavljene aplikacije!\n\nSeznam podprtih aplikacij drugih avtorjev lahko najdete v Pomoči!</string>
+ <string name="api_no_apps">Ni nobene registrirane aplikacije!\n\nSeznam podprtih aplikacij najdete v poglavju \'Pomoč\'!</string>
<string name="api_settings_show_info">Pokaži dodatne informacije</string>
<string name="api_settings_hide_info">Skrij dodatne informacije</string>
<string name="api_settings_show_advanced">Pokaži napredne nastavitve</string>
@@ -380,9 +301,8 @@
<string name="api_settings_package_name">Ime paketa</string>
<string name="api_settings_package_signature">SHA-256 podpisa paketa</string>
<string name="api_settings_accounts">Računi</string>
- <string name="api_settings_accounts_empty">Noben račun ni vezan na to aplikacijo</string>
- <string name="api_create_account_text">Aplikacija zahteva stvaritev novega računa. Izberite obstoječ zasebni ključ ali ustvarite novega.\nAplikacije so omejene na uporabo tu izbranih ključev.</string>
- <string name="api_register_text">Navedena aplikacija zahteva dostop do aplikacije OpenKeychain.\nDovolim dostop?\n\nPOZOR: Če ne veste zakaj se je pojavilo to obvestilo, ne dovolite dostopa! Dostop lahko prekličete tudi kasneje, v oknu \'Prijavljene aplikacije\'.</string>
+ <string name="api_settings_accounts_empty">S to aplikacijo ni povezan noben račun</string>
+ <string name="api_register_text">Prikazane aplikacije želijo šifrirati/dešifrirati sporočila ter jih podpisovati v vašem imenu.\nDovolim dostop?\n\nPOZOR: Če ne veste zakaj se je pojavilo to obvestilo, ne dovolite dostopa! Dostop lahko prekličete tudi kasneje, v oknu \'Aplikacije\'.</string>
<string name="api_register_allow">Dovoli dostop</string>
<string name="api_register_disallow">Zavrni dostop</string>
<string name="api_register_error_select_key">Izberite ključ!</string>
@@ -392,9 +312,6 @@
<string name="api_error_wrong_signature">Preverjanje podpisa ni uspelo! Ste namestili to aplikacijo iz drugega vira? Če ste prepričani, da to ni napad, prekličite registracijo te aplikacije v OpenKeychain in jo izvedite znova.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Deli s kodo QR</string>
- <string name="share_qr_code_dialog_start">Z uporabo tipke \'Naprej\' se sprehodite skozi vse kode QR in jih skenirajte eno za drugo.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Prstni odtis:</string>
- <string name="share_qr_code_dialog_progress">Koda QR z ID-jem %1$d of %2$d</string>
<string name="share_nfc_dialog">Deli preko NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -407,7 +324,6 @@
<string name="key_list_empty_text2">Lahko začnete z</string>
<string name="key_list_empty_text3">ali</string>
<string name="key_list_empty_button_create">stvaritvijo lastnega ključa</string>
- <string name="key_list_empty_button_import">uvozom obstoječih ključev.</string>
<!--Key view-->
<string name="key_view_action_edit">Uredi ključ</string>
<string name="key_view_action_encrypt">Šifriraj s tem ključem</string>
@@ -418,20 +334,18 @@
<string name="key_view_tab_share">Deli</string>
<string name="key_view_tab_keys">Podključi</string>
<string name="key_view_tab_certs">Certifikati</string>
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Ključi</string>
<string name="nav_encrypt">Podpiši in šifriraj</string>
<string name="nav_decrypt">Dešifriraj in preveri</string>
- <string name="nav_import">Uvozi ključe</string>
+ <string name="nav_apps">Aplikacije</string>
<string name="drawer_open">Odprite navigacijski poteznik</string>
<string name="drawer_close">Zaprite navigacijski poteznik</string>
- <string name="edit">Uredi</string>
<string name="my_keys">Moji ključi</string>
- <string name="label_secret_key">Zasebni ključ</string>
- <string name="secret_key_yes">na voljo</string>
- <string name="secret_key_no">ni na voljo</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Tu zapišite sporočilo, ki ga želite šifrirati in/ali podpisati...</string>
<string name="decrypt_content_edit_text_hint">Tu vnesite tajnopis za dešifriranje in/ali overbo...</string>
<!--certs-->
<string name="cert_default">privzeto</string>
@@ -439,7 +353,6 @@
<string name="cert_casual">navadno</string>
<string name="cert_positive">pozitivno</string>
<string name="cert_revoke">preklicano</string>
- <string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">neuspešno!</string>
<string name="cert_verify_error">napaka!</string>
<string name="cert_verify_unavailable">ključ ni na voljo</string>
@@ -451,19 +364,52 @@
<string name="msg_ip_encode_fail">Operacija ni uspela zaradi napake</string>
<string name="msg_ip_fail_io_exc">Operacija ni uspela zaradi napake pri branju/pisanju</string>
<string name="msg_ip_fail_remote_ex">Operacija ni uspela zaradi notranje napake</string>
+ <string name="msg_ip">Uvažam javno zbirko ključev %s</string>
+ <string name="msg_ip_insert_keyring">Šifriram podatke zbirke klučev</string>
+ <string name="msg_ip_prepare">Pripravljam </string>
+ <string name="msg_ip_subkey">Obdelujem podključ %s</string>
+ <string name="msg_ip_subkey_expired">Podključ je potekel %s</string>
+ <string name="msg_ip_subkey_expires">Podključ poteče %s</string>
+ <string name="msg_ip_subkey_flags_ces">Oznake podključa: overja, šifrira, podpisuje</string>
+ <string name="msg_ip_subkey_flags_cex">Oznake podključa: overja, šifrira</string>
+ <string name="msg_ip_subkey_flags_cxs">Oznake podključa: overja, podpisuje</string>
+ <string name="msg_ip_subkey_flags_xes">Oznake podključa: šifrira, podpisuje</string>
+ <string name="msg_ip_subkey_flags_cxx">Oznake podključa: overja</string>
+ <string name="msg_ip_subkey_flags_xex">Oznake podključa: šifrira</string>
+ <string name="msg_ip_subkey_flags_xxs">Oznake podključa: podpisuje</string>
+ <string name="msg_ip_subkey_flags_xxx">Oznake podključa: brez</string>
+ <string name="msg_ip_success">Uspešno uvožena javna zbirka klučev </string>
<string name="msg_ip_reinsert_secret">Ponovno vnašam zasebni ključ</string>
<string name="msg_ip_uid_cert_bad">Naleteli ste na slab certifikat!</string>
<string name="msg_ip_uid_cert_error">Napaka pri obdelavi certifikata!</string>
+ <string name="msg_ip_uid_reorder">Prerazporejam uporabniške ID-je</string>
<string name="msg_ip_uid_processing">Procesiram uporabniško identiteto %s</string>
+ <string name="msg_ip_uid_revoked">Uporabniški ID je preklican</string>
<string name="msg_is_bad_type_public">Poskus uvoza javne zbirke ključev kot zasebne. Prosimo prijavite dogodek kot \'hrošč\' (napako).</string>
<!--Import Secret log entries-->
+ <string name="msg_is">Uvažam zasebni ključ %s</string>
<string name="msg_is_importing_subkeys">Procesiram zasebne podključe</string>
<string name="msg_is_subkey_nonexistent">Podključ %s ni na voljo v javnem ključu</string>
<string name="msg_is_subkey_ok">%s označen kot razpoložljiv</string>
<string name="msg_is_subkey_stripped">%s označen kot slečen</string>
+ <string name="msg_is_success">Zasebna zbirka ključev uspešno uvožena</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_master">Obdelujem glavni ključ...</string>
+ <string name="msg_kc_revoke_bad_err">Umikam slab certifikat za preklic zbirk ključev</string>
+ <string name="msg_kc_revoke_bad_local">Umikam certifikat za preklic zbirk ključev z oznako \"lokalno\"</string>
+ <string name="msg_kc_revoke_bad_time">Umikam certifikat za preklic zbirk ključev s časovno znamko v prihodnosti</string>
+ <string name="msg_kc_revoke_bad_type">Umikam certifikat glavnega ključa neznanega tipa (%s)</string>
+ <string name="msg_kc_revoke_bad">Umikam slab certifikat za preklic zbirk ključev</string>
+ <string name="msg_kc_revoke_dup">Umikam odvečen certifikat za preklic zbirk ključev</string>
+ <string name="msg_kc_sub">Obdelujem podključ %s</string>
+ <string name="msg_kc_sub_bad">Umikam neveljaven certifikat za povezovanje podključev</string>
+ <string name="msg_kc_sub_bad_err">Umikam slab certifikat za povezovanje podključev</string>
+ <string name="msg_kc_sub_bad_local">Umikam certifikat za povezovanje podključev z oznako \"lokalno\"</string>
+ <string name="msg_kc_sub_bad_time">Umikam certifikat za povezovanje podključev z časovno znamko v prihodnosti</string>
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="section_certifier_id">Overovitelj</string>
<string name="section_cert">Podrobnosti potrdil</string>
@@ -476,14 +422,12 @@
<string name="label_cert_type">Vrsta</string>
<string name="error_key_not_found">Ključ ni bil najden!</string>
<string name="error_key_processing">Napaka pri obdelavi ključa!</string>
- <string name="no_subkey">podključ ni na voljo</string>
<string name="key_stripped">slečen</string>
- <string name="secret_cannot_multiple">Zasebne ključe je mogoče izbrisati zgolj posamično!</string>
<string name="title_view_cert">Preglej podrobosti certifikata</string>
<string name="unknown_algorithm">neznan</string>
<string name="can_sign_not">ne more podpisati</string>
- <string name="error_encoding">Napaka pri šifriranju</string>
<string name="error_no_encrypt_subkey">Ni nobenega podključa za šifriranje!</string>
<string name="info_no_manual_account_creation">Ne ustvari računov OpenKeychain ročno.\nZa več informacij poglej poglavje Pomoč.</string>
<string name="contact_show_key">Prikaži ključ (%s)</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml
index bae2b55ad..f8c26f140 100644
--- a/OpenKeychain/src/main/res/values-tr/strings.xml
+++ b/OpenKeychain/src/main/res/values-tr/strings.xml
@@ -1,10 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Açık Anahtar Seç</string>
- <string name="title_select_secret_key">Özel Anahtar Seç</string>
<string name="title_encrypt">Şifrele</string>
- <string name="title_create_key">Anahtar oluştur</string>
<string name="title_edit_key">Anahtarı düzenle</string>
<string name="title_preferences">Seçenekler</string>
<string name="title_key_server_preference">Anahtar Sunucusu Seçenekleri</string>
@@ -21,36 +18,25 @@
<string name="section_upload_key">Anahtar Yükle</string>
<string name="section_key_server">Anahtar Sunucusu</string>
<!--button-->
- <string name="btn_decrypt_verify_clipboard">Panodan</string>
<string name="btn_save">Kaydet</string>
<string name="btn_do_not_save">İptal</string>
<string name="btn_delete">Sil</string>
<string name="btn_okay">Tamam</string>
<string name="btn_next">İleri</string>
<string name="btn_back">Geri</string>
- <string name="btn_clipboard">Pano</string>
<!--menu-->
<string name="menu_preferences">Ayarlar</string>
<string name="menu_help">Yardım</string>
<string name="menu_export_key">Dosyaya ver</string>
<string name="menu_delete_key">Anahtar sil</string>
- <string name="menu_create_key">Anahtar oluştur</string>
- <string name="menu_create_key_expert">Anahtar oluştur (uzman)</string>
<string name="menu_search">Ara</string>
- <string name="menu_share">Paylaş...</string>
- <string name="menu_share_qr_code">QR Kod ile</string>
- <string name="menu_share_nfc">NFC ile</string>
- <string name="menu_copy_to_clipboard">Panoya kopyala</string>
<string name="menu_key_edit_cancel">İptal</string>
<string name="menu_select_all">Hepsini seç</string>
<string name="menu_add_keys">Anahtar ekle</string>
<!--label-->
- <string name="label_sign">İmzala</string>
<string name="label_message">Mesaj</string>
<string name="label_file">Dosya</string>
- <string name="label_passphrase_again">Tekrar</string>
<string name="label_algorithm">Algoritma</string>
- <string name="label_select_public_keys">Alıcılar</string>
<string name="label_keyservers">Anahtar Sunucuları</string>
<string name="label_key_id">Anahtar ID</string>
<string name="label_creation">Oluşturma</string>
@@ -60,7 +46,6 @@
<string name="label_name">İsim</string>
<string name="label_comment">Yorum</string>
<string name="label_email">Eposta</string>
- <string name="select_keys_button_default">Seç</string>
<plurals name="n_keys">
<item quantity="one">1 anahtar</item>
<item quantity="other">%d anahtar</item>
@@ -110,7 +95,6 @@
<string name="progress_importing">alıyor...</string>
<string name="progress_exporting">veriyor...</string>
<string name="progress_building_key">anahtar oluşturuluyor...</string>
- <string name="progress_saving_key_ring">anahtar kaydediliyor...</string>
<plurals name="progress_exporting_key">
<item quantity="one">anahtar veriliyor...</item>
<item quantity="other">anahtarlar veriliyor...</item>
@@ -142,7 +126,6 @@
<string name="help_about_version">Sürüm:</string>
<!--Import-->
<string name="import_import">Seçili anahtarları al</string>
- <string name="import_nfc_help_button">Yardım</string>
<!--Import result toast-->
<!--Intent labels-->
<!--Remote API-->
@@ -161,17 +144,15 @@
<!--Key list-->
<string name="key_list_empty_text3">ya da</string>
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Anahtarlar</string>
- <string name="edit">Düzenle</string>
<string name="my_keys">Anahtarlarım</string>
- <string name="label_secret_key">Özel Anahtar</string>
- <string name="secret_key_yes">mevcut</string>
- <string name="secret_key_no">mevcut değil</string>
<!--hints-->
<!--certs-->
<string name="cert_default">varsayılan</string>
- <string name="cert_verify_ok">tamam</string>
<string name="cert_verify_failed">başarısız!</string>
<string name="cert_verify_error">hata!</string>
<string name="cert_verify_unavailable">anahtar mevcut değil</string>
@@ -179,7 +160,10 @@
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="can_sign_not">imzalanamadı</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml
index 4e267e431..74713ca33 100644
--- a/OpenKeychain/src/main/res/values-uk/strings.xml
+++ b/OpenKeychain/src/main/res/values-uk/strings.xml
@@ -1,18 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">Виберіть публічний ключ</string>
- <string name="title_select_secret_key">Виберіть секретний ключ</string>
<string name="title_encrypt">Зашифрувати</string>
<string name="title_decrypt">Розшифрувати</string>
<string name="title_authentication">Парольна фраза</string>
- <string name="title_create_key">Створити ключ</string>
<string name="title_edit_key">Редагувати ключ</string>
<string name="title_preferences">Налаштування</string>
+ <string name="title_api_registered_apps">Програми</string>
<string name="title_key_server_preference">Налаштування сервера ключів</string>
<string name="title_change_passphrase">Змінити парольну фразу</string>
- <string name="title_set_passphrase">Задати парольну фразу</string>
- <string name="title_share_with">Поділитися через…</string>
<string name="title_share_fingerprint_with">Поділитися відбитком із…</string>
<string name="title_share_key">Поділитися ключем з…</string>
<string name="title_share_file">Поширити файл з…</string>
@@ -33,60 +29,33 @@
<string name="section_general">Загальне</string>
<string name="section_defaults">Типове</string>
<string name="section_advanced">Додаткове</string>
- <string name="section_master_key">Основний ключ</string>
- <string name="section_master_user_id">Первинна сутність</string>
<string name="section_actions">Дії</string>
<string name="section_share_key">Цілий ключ</string>
<string name="section_certification_key">Ваш ключ використаний для сертифікації</string>
<string name="section_upload_key">Завантажити ключ</string>
<string name="section_key_server">Сервер ключів</string>
- <string name="section_encrypt_and_or_sign">Шифрувати і/або підписати</string>
- <string name="section_decrypt_verify">Розшифрувати і Перевірити</string>
<string name="section_fingerprint">Відбиток</string>
<string name="section_key_to_certify">Ключ для сертикації</string>
<!--button-->
- <string name="btn_certify">Сертифікувати</string>
<string name="btn_decrypt_verify_file">Розшифрувати, перевірити та зберегти файл</string>
<string name="btn_decrypt_verify_message">Розшифрувати і перевірити повідомлення</string>
- <string name="btn_decrypt_verify_clipboard">З буфера обміну</string>
<string name="btn_encrypt_file">Шифрувати і зберегти файл</string>
<string name="btn_save">Зберегти</string>
<string name="btn_do_not_save">Скасувати</string>
<string name="btn_delete">Вилучити</string>
<string name="btn_no_date">Жоден</string>
<string name="btn_okay">Гаразд</string>
- <string name="btn_change_passphrase">Змінити нову парольну фразу</string>
- <string name="btn_set_passphrase">Задати нову парольну фразу</string>
<string name="btn_export_to_server">Завантажити на сервер ключів</string>
<string name="btn_next">Далі</string>
<string name="btn_back">Назад</string>
- <string name="btn_clipboard">Буфер обміну</string>
- <string name="btn_share">Поділитися через…</string>
<string name="btn_lookup_key">Шукати ключ</string>
- <string name="btn_encryption_advanced_settings_show">Показати додаткові налаштування</string>
- <string name="btn_encryption_advanced_settings_hide">Приховати додаткові налаштування</string>
- <string name="btn_share_encrypted_signed">Поширити зашифроване/підписане повідомлення…</string>
<string name="btn_view_cert_key">Переглянути ключ сертифікації</string>
<!--menu-->
<string name="menu_preferences">Параметри</string>
<string name="menu_help">Довідка</string>
<string name="menu_export_key">Експорт до файлу</string>
<string name="menu_delete_key">Вилучити ключ</string>
- <string name="menu_create_key">Створити ключ</string>
- <string name="menu_create_key_expert">Створити ключ (експерт)</string>
<string name="menu_search">Пошук</string>
- <string name="menu_key_server">Сервер ключів…</string>
- <string name="menu_update_key">Оновити з сервера ключів</string>
- <string name="menu_export_key_to_server">Завантажити на сервер ключів</string>
- <string name="menu_share">Поділитися…</string>
- <string name="menu_share_title_fingerprint">Поділитися відбитком…</string>
- <string name="menu_share_title">Поділитися цілим ключем…</string>
- <string name="menu_share_default_fingerprint">з…</string>
- <string name="menu_share_default">з…</string>
- <string name="menu_share_qr_code">з QR кодом</string>
- <string name="menu_share_qr_code_fingerprint">з QR кодом</string>
- <string name="menu_share_nfc">з NFC</string>
- <string name="menu_copy_to_clipboard">Копіювати у буфер обміну</string>
<string name="menu_beam_preferences">Налаштування променя</string>
<string name="menu_key_edit_cancel">Скасувати</string>
<string name="menu_encrypt_to">Зашифрувати…</string>
@@ -95,22 +64,15 @@
<string name="menu_export_all_keys">Експортувати усі ключі</string>
<string name="menu_advanced">Показати додаткову інформацію</string>
<!--label-->
- <string name="label_sign">Підпис</string>
<string name="label_message">Повідомлення</string>
<string name="label_file">Файл</string>
<string name="label_no_passphrase">Без парольної фрази</string>
<string name="label_passphrase">Парольна фраза</string>
- <string name="label_passphrase_again">Знову</string>
<string name="label_algorithm">Алгоритм</string>
<string name="label_ascii_armor">ASCII Броня</string>
- <string name="label_select_public_keys">Отримувачі</string>
- <string name="label_delete_after_encryption">Вилучити після шифрування</string>
<string name="label_delete_after_decryption">Вилучити після розшифрування</string>
- <string name="label_share_after_encryption">Поширити після шифрування</string>
<string name="label_encryption_algorithm">Алгоритм шифрування</string>
<string name="label_hash_algorithm">Хеш алгоритм</string>
- <string name="label_asymmetric">з публічним ключем</string>
- <string name="label_symmetric">з парольною фразою</string>
<string name="label_passphrase_cache_ttl">Кеш парольної фрази</string>
<string name="label_message_compression">Стиснення повідомлення</string>
<string name="label_file_compression">Стиснення файлу</string>
@@ -127,13 +89,7 @@
<string name="label_email">Ел. пошта</string>
<string name="label_send_key">Завантажити ключ до вибраного сервера ключів після сертифікації</string>
<string name="label_fingerprint">Відбиток</string>
- <string name="select_keys_button_default">Вибрати</string>
<string name="expiry_date_dialog_title">Задати термін дії</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d вибраний</item>
- <item quantity="few">%d вибрані</item>
- <item quantity="other">%d вибраних</item>
- </plurals>
<string name="user_id_no_name">&lt;без імені&gt;</string>
<string name="none">&lt;жоден&gt;</string>
<string name="no_key">&lt;без ключа&gt;</string>
@@ -182,7 +138,6 @@
<string name="flag_authenticate">Перевірити справжність</string>
<!--sentences-->
<string name="wrong_passphrase">Невірна парольна фраза.</string>
- <string name="set_a_passphrase">Спершу задайте парольну фразу.</string>
<string name="no_filemanager_installed">Нема встановленого сумісного менеджера файлів.</string>
<string name="passphrases_do_not_match">Парольні фрази не збігаються.</string>
<string name="passphrase_must_not_be_empty">Будь ласка, введіть парольну фразу.</string>
@@ -201,15 +156,11 @@
<string name="specify_file_to_export_to">Будь ласка, виберіть файл для експорту.\nУВАГА! Якщо файл існує, то він буде переписаний.</string>
<string name="key_deletion_confirmation_multi">Ви справді хочете вилучити усі вибрані відкриті ключі?\nВи не зможете це відмінити!</string>
<string name="secret_key_deletion_confirmation">Ви справді хочете вилучити секретний ключ \'%s\'?\nВи не зможете це відмінити!</string>
- <string name="ask_save_changed_key">Ви внесли зміни до в\'язки ключів, ви б хотіли. Волієте їх зберегти?</string>
- <string name="ask_empty_id_ok">Ви вже додали порожню сутність. Ви справді хочете продовжити?</string>
<string name="public_key_deletetion_confirmation">Ви справді хочете вилучити відкритий ключ \'%s\'?\nВи не зможете це відмінити!</string>
- <string name="also_export_secret_keys">Також експортувати секретні ключі?</string>
<string name="key_exported">Успішно експортовано 1 ключ.</string>
<string name="keys_exported">Успішно експортовано %d ключів.</string>
<string name="no_keys_exported">Жодного ключа не експортовано.</string>
<string name="key_creation_el_gamal_info">Примітка: лише підключі підтримують ElGamal.</string>
- <string name="key_creation_weak_rsa_info">Примітка: генерація ключа RSA з довжиною 1024 біти і менше вважається небезпечною і вона вимкнена для генерації нових ключів.</string>
<string name="key_not_found">Не можливо знайти ключ %08X.</string>
<plurals name="bad_keys_encountered">
<item quantity="one">%d поганий секретний ключ проігнорований. Можливо ви експортували з параметром\n --export-secret-subkeys\nЗробіть ваш експорт з \n --export-secret-keys\nнатомість.</item>
@@ -222,7 +173,6 @@
<string name="nfc_successful">Успішно надіслано ключ через промінь NFC!</string>
<string name="key_copied_to_clipboard">Ключ вже скопійовано у буфер обміну!</string>
<string name="fingerprint_copied_to_clipboard">Відбиток вже скопійовано до буфера обміну!</string>
- <string name="key_has_already_been_certified">Ключ вже сертифіковано!</string>
<string name="select_key_to_certify">Будь ласка, виберіть ключ для використання у сертифікації!</string>
<string name="key_too_big_for_sharing">Ключ надто великий для цього способу поширення!</string>
<!--errors
@@ -233,35 +183,25 @@
<string name="error_no_secret_key_found">відповідного секретного ключа не знайдено</string>
<string name="error_external_storage_not_ready">зовнішній носій не готовий</string>
<string name="error_key_size_minimum512bit">ключ має мати хоча б 512 біт</string>
- <string name="error_master_key_must_not_be_el_gamal">основний ключ не може бути ключем ElGamal</string>
<string name="error_unknown_algorithm_choice">вибір невідомого алгоритму</string>
<string name="error_user_id_no_email">жодного листа не знайдено</string>
<string name="error_key_needs_a_user_id">хоча б одна сутність</string>
- <string name="error_main_user_id_must_not_be_empty">первинна сутність повинна бути порожньою</string>
- <string name="error_key_needs_master_key">потрібний хоча б один основний ключ</string>
<string name="error_no_signature_passphrase">не подано парольної фрази</string>
<string name="error_no_signature_key">не подано ключ підпису</string>
<string name="error_invalid_data">недійсні дані шифрування</string>
<string name="error_integrity_check_failed">Невдала перевірка цілісності! Дані вже змінено!</string>
<string name="error_wrong_passphrase">помилкова парольна фраза</string>
- <string name="error_saving_keys">помилка збереження деяких ключів</string>
<string name="error_could_not_extract_private_key">не можна витягти секретний ключ</string>
- <string name="error_expiry_must_come_after_creation">дата завершення дії має йти після дати створення</string>
<!--errors without preceeding Error:-->
- <string name="error_only_files_are_supported">Пряма передача даних без використання файлу в пам\'яті пристрою не підтримується.</string>
<string name="error_jelly_bean_needed">Вам потрібний Android 4.1 для використання функції Androids NFC промінь!</string>
<string name="error_nfc_needed">NFC недоступний на вашому пристрої!</string>
<string name="error_nothing_import">Ключ не знайдено!</string>
- <string name="error_query_too_short">Запит пошуку ключа надто короткий</string>
- <string name="error_searching_keys">Невиправна помилка пошуку ключів в сервері</string>
- <string name="error_too_many_responses">Запит пошуку ключа видав надто багато варіантів. Уточніть пошуковий запит</string>
<string name="error_generic_report_bug">Трапилася загальна помилка, будь ласка, створіть новий звіт про помилку для OpenKeychain.</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">частина завантаженого файлу є вірним об\'єктом OpenPGP, але не ключем OpenPGP</item>
<item quantity="few">частини завантаженого файлу є вірним об\'єктом OpenPGP, але не ключем OpenPGP</item>
<item quantity="other">частин завантаженого файлу є вірним об\'єктом OpenPGP, але не ключем OpenPGP</item>
</plurals>
- <string name="error_change_something_first">Вам потрібно внести зміни до в\'язки ключів перед тим, як зможете їх зберегти.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_invalid_signature">Невірний підпис!</string>
<string name="decrypt_result_signature_unknown_pub_key">Невідомий відкритий ключ</string>
@@ -278,20 +218,12 @@
<string name="progress_importing">імпортується…</string>
<string name="progress_exporting">експортується…</string>
<string name="progress_building_key">будується ключ…</string>
- <string name="progress_certifying_master_key">сертифікація основного ключа…</string>
<string name="progress_building_master_key">побудова основного кільця…</string>
- <string name="progress_adding_sub_keys">додавання підключів…</string>
- <string name="progress_saving_key_ring">зберігається ключ…</string>
<plurals name="progress_exporting_key">
<item quantity="one">експортується ключ…</item>
<item quantity="few">експортуються ключі…</item>
<item quantity="other">експортуються ключі…</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">генерується ключ, це може тривати до 3 хвилини</item>
- <item quantity="few">генеруються ключі, це може тривати до 3 хвилини</item>
- <item quantity="other">генеруються ключі, це може тривати до 3 хвилини</item>
- </plurals>
<string name="progress_extracting_signature_key">видобування ключа підпису…</string>
<string name="progress_extracting_key">видобувається ключа…</string>
<string name="progress_preparing_streams">підготовка потоків…</string>
@@ -308,8 +240,7 @@
<string name="progress_verifying_integrity">перевірка цілісності…</string>
<string name="progress_deleting_securely">вилучення безпечно \'%s\'…</string>
<!--action strings-->
- <string name="hint_secret_keys">Пошук секретних ключів</string>
- <string name="action_share_key_with">Поділитися ключем з…</string>
+ <string name="hint_public_keys">Назва/Ел. пошта/ІД ключа…</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -335,33 +266,34 @@
<string name="help_tab_about">Про</string>
<string name="help_about_version">Версія:</string>
<!--Import-->
+ <string name="import_tab_keyserver">Сервер ключів</string>
+ <string name="import_tab_direct">Файл/Буфер обміну</string>
+ <string name="import_tab_qr_code">Код QR/NFC</string>
+ <string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Імпортувати вибрані ключі</string>
- <string name="import_from_clipboard">Імпорт з буфера обміну</string>
- <plurals name="import_qr_code_missing">
- <item quantity="one">Пропущений QR код із ID %s</item>
- <item quantity="few">Пропущені QR коди із ID %s</item>
- <item quantity="other">Пропущені QR коди із ID %s</item>
- </plurals>
- <string name="import_qr_code_start_with_one">Будь ласка, почніть з QR коду із ІД 1</string>
<string name="import_qr_code_wrong">Невірний штрих-код! Спробуйте знову!</string>
- <string name="import_qr_code_finished">Сканування штрих-коду завершено!</string>
<string name="import_qr_code_too_short_fingerprint">Відбиток надто короткий (&lt; 16 символів)</string>
- <string name="import_qr_scan_button">Сканувати QR код з \'Barcode Scanner\'</string>
- <string name="import_nfc_text">Розблокуйте пристрій, щоб отримати ключ через NFC.</string>
- <string name="import_nfc_help_button">Довідка</string>
- <string name="import_clipboard_button">Отримати ключ з буфера обміну</string>
- <string name="import_keybase_button">Отримати ключ із Keybase.io</string>
+ <string name="import_qr_code_button">Сканувати штрих-код…</string>
<!--Import result toast-->
- <string name="view_log">Переглянути журнал</string>
+ <plurals name="import_keys_added_and_updated_1">
+ <item quantity="one">Успішно імпортовано ключ.</item>
+ <item quantity="few">Успішно імпортовано %1$d ключі.</item>
+ <item quantity="other">Успішно імпортовано %1$d ключів.</item>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="one">Успішно імпортований ключ%2$s.</item>
+ <item quantity="few">Успішно імпортовано %1$d ключі%2$s.</item>
+ <item quantity="other">Успішно імпортовано %1$d ключів%2$s.</item>
+ </plurals>
<string name="import_error_nothing">Нема що імпортувати.</string>
<string name="import_error">Помилка імпорту ключів!</string>
+ <string name="import_with_warnings">, із застереженнями</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Розшифрувати файл з OpenKeychain</string>
<string name="intent_import_key">Імпортувати ключ з OpenKeychain</string>
<string name="intent_send_encrypt">Зашифрувати з OpenKeychain</string>
<string name="intent_send_decrypt">Розшифрувати з OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Немає зареєстрованих програм!\n\nСписок підтримуваних сторонніх програм можна знайти у „Довідці“!</string>
<string name="api_settings_show_info">Показати додаткову інформацію</string>
<string name="api_settings_hide_info">Приховати додаткову інформацію</string>
<string name="api_settings_show_advanced">Показати додаткові налаштування</string>
@@ -377,9 +309,6 @@
<string name="api_settings_package_name">Назва пакунку</string>
<string name="api_settings_package_signature">SHA-256 підписку пакунку</string>
<string name="api_settings_accounts">Облікові записи</string>
- <string name="api_settings_accounts_empty">Немає облікового запису приєднаного до цієї програми.</string>
- <string name="api_create_account_text">Ця програма вимагає створення нового профілю. Будь ласка, виберіть наявний приватний ключ або створіть інший.\nПрограми обмежені використання ключів, які ви тут оберете!</string>
- <string name="api_register_text">Показана програма запитує доступ до OpenPGP Keychain.\nДозволити доступ?\n\nУВАГА: якщо ви не знаєте, чому цей екран появився, не дозволяйте доступ! Ви можете відкликати доступ пізніше, використовуючи екран \'Зареєстровані програми\'.</string>
<string name="api_register_allow">Дозволити доступ</string>
<string name="api_register_disallow">Не дозволити доступ</string>
<string name="api_register_error_select_key">Будь ласка, виберіть ключ!</string>
@@ -389,9 +318,6 @@
<string name="api_error_wrong_signature">Перевірка підпису пакету не вдалася! Може ви встановили програму з іншого джерела? Якщо ви впевнені, що це не атака, то відкличте реєстрацію програми у OpenKeychain та знову зареєструйте її.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Відправити як штрих-код</string>
- <string name="share_qr_code_dialog_start">Пройдіть через усі штрих-коди за допомогою \"Далі\", а також проскануйте їх по одному.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Відбиток:</string>
- <string name="share_qr_code_dialog_progress">Штрих-код з ID %1$d із %2$d</string>
<string name="share_nfc_dialog">Поділитися з NFC</string>
<!--Key list-->
<plurals name="key_list_selected_keys">
@@ -403,7 +329,6 @@
<string name="key_list_empty_text2">Ви можете розпочати за</string>
<string name="key_list_empty_text3">чи</string>
<string name="key_list_empty_button_create">створюється ваш власний ключ</string>
- <string name="key_list_empty_button_import">імпортуюся ключі.</string>
<!--Key view-->
<string name="key_view_action_edit">Редагувати ключ</string>
<string name="key_view_action_encrypt">Шифрувати з цим ключем</string>
@@ -414,20 +339,18 @@
<string name="key_view_tab_share">Поділитися</string>
<string name="key_view_tab_keys">Підключі</string>
<string name="key_view_tab_certs">Сертифікати</string>
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
<string name="nav_keys">Ключі</string>
<string name="nav_encrypt">Підписати і зашифрувати</string>
<string name="nav_decrypt">Розшифрувати і Перевірити</string>
- <string name="nav_import">Імпортувати ключі</string>
+ <string name="nav_apps">Програми</string>
<string name="drawer_open">Відкрити панель навігації</string>
<string name="drawer_close">Закрити панель навігації</string>
- <string name="edit">Редагувати</string>
<string name="my_keys">Мої ключі</string>
- <string name="label_secret_key">Секретний ключ</string>
- <string name="secret_key_yes">доступний</string>
- <string name="secret_key_no">недоступний</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Напишіть повідомлення для шифрування та/або підпису…</string>
<string name="decrypt_content_edit_text_hint">Уведіть зашифрований текст тут для його розшифрування та/або перевірки…</string>
<!--certs-->
<string name="cert_default">типово</string>
@@ -435,7 +358,6 @@
<string name="cert_casual">випадковий</string>
<string name="cert_positive">додатний</string>
<string name="cert_revoke">відкликано</string>
- <string name="cert_verify_ok">Гаразд</string>
<string name="cert_verify_failed">Невдача!</string>
<string name="cert_verify_error">Помилка!</string>
<string name="cert_verify_unavailable">Недоступний ключ</string>
@@ -446,19 +368,37 @@
<string name="msg_ip_encode_fail">Операція не вдалася через помилку кодування</string>
<string name="msg_ip_fail_io_exc">Операція не вдалася через помилку вводу/виводу</string>
<string name="msg_ip_fail_remote_ex">Операція не вдалася через внутрішню помилку</string>
+ <string name="msg_ip_insert_keyring">Шифруються дані із в\'язки</string>
+ <string name="msg_ip_insert_keys">Аналізуються ключі</string>
<string name="msg_ip_prepare">Підготовка операцій з базою даних</string>
+ <string name="msg_ip_master">Обробляється основний ключа %s</string>
<string name="msg_ip_subkey">Опрацьовується підключ %s</string>
+ <string name="msg_ip_success">Успішно імпортована публічна в\'язка</string>
<string name="msg_ip_reinsert_secret">Повторне вставлення секретного ключа</string>
<string name="msg_ip_uid_cert_bad">Виявлено поганий сертифікат!</string>
<string name="msg_ip_uid_cert_error">Помилка опрацювання сертифікату!</string>
<string name="msg_ip_uid_processing">Обробляється ІД користувача %s</string>
<!--Import Secret log entries-->
+ <string name="msg_is">Імпортується секретний ключ %s</string>
+ <string name="msg_is_db_exception">Помилка бази даних!</string>
<string name="msg_is_importing_subkeys">Опрацьовуються секретні підключі</string>
+ <string name="msg_is_io_exc">Помилка шифрування в’язки</string>
<string name="msg_is_subkey_nonexistent">Підключ %s недоступний у публічному ключі</string>
<string name="msg_is_subkey_ok">Позначено %s як доступно</string>
+ <string name="msg_is_success">Успішно імпортована секретна в\'язка</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_master">Обробляється основний ключ…</string>
+ <string name="msg_kc_sub">Опрацьовується підключ %s</string>
<!--Keyring merging log entries-->
+ <string name="msg_mg_new_subkey">Додається новий підключ %s</string>
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <string name="msg_mf_error_integrity">Внутрішня помилка - збій перевірки цілісності!</string>
+ <string name="msg_mf_error_revoked_primary">ІД відхилених користувачів не може бути первинним!</string>
+ <string name="msg_mf_error_pgp">Внутрішній виняток PGP!</string>
+ <string name="msg_mf_passphrase">Змінюється парольна фраза</string>
+ <string name="msg_mf_unlock">Розблоковується в\'язка</string>
+ <!--PassphraseCache-->
<!--unsorted-->
<string name="section_certifier_id">Ким підписаний</string>
<string name="section_cert">Дані сертифікату</string>
@@ -471,14 +411,12 @@
<string name="label_cert_type">Тип</string>
<string name="error_key_not_found">Ключ не знайдено!</string>
<string name="error_key_processing">Помилка опрацювання ключа!</string>
- <string name="no_subkey">підключ недоступний</string>
<string name="key_stripped">голий</string>
- <string name="secret_cannot_multiple">Секретні ключі можна вилучити лише окремо!</string>
<string name="title_view_cert">Переглянути дані сертифікату</string>
<string name="unknown_algorithm">невідомий</string>
<string name="can_sign_not">не можна підписати</string>
- <string name="error_encoding">Помилка шифрування</string>
<string name="error_no_encrypt_subkey">Жодний підключ шифрування недоступний!</string>
<string name="info_no_manual_account_creation">Вручну не створюються профілі OpenKeychain.\nЗа подробицями дивіться Довідку.</string>
<string name="contact_show_key">Показати ключ (%s)</string>
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml
index f661ca058..7f0ec99fd 100644
--- a/OpenKeychain/src/main/res/values-zh/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh/strings.xml
@@ -1,16 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--title-->
- <string name="title_select_recipients">选择公钥</string>
- <string name="title_select_secret_key">选择私钥</string>
<string name="title_encrypt">加密</string>
<string name="title_decrypt">解密</string>
<string name="title_authentication">密码短语</string>
- <string name="title_create_key">创建密钥</string>
<string name="title_edit_key">编辑密钥</string>
<string name="title_preferences">参数</string>
<string name="title_key_server_preference">密钥服务器偏好</string>
- <string name="title_set_passphrase">设置密码短语</string>
<string name="title_encrypt_to_file">加密至文件</string>
<string name="title_decrypt_to_file">解密至文件</string>
<string name="title_import_keys">导入密钥</string>
@@ -23,33 +19,24 @@
<string name="section_general">常规</string>
<string name="section_defaults">缺省</string>
<string name="section_advanced">高级</string>
- <string name="section_master_key">主密钥</string>
<string name="section_key_server">密钥服务器</string>
- <string name="section_decrypt_verify">解密并验证</string>
<!--button-->
<string name="btn_save">保存</string>
<string name="btn_do_not_save">取消</string>
<string name="btn_delete">删除</string>
<string name="btn_no_date">无</string>
- <string name="btn_clipboard">剪贴板</string>
<!--menu-->
<string name="menu_help">帮助</string>
<string name="menu_delete_key">删除密钥</string>
- <string name="menu_create_key">创建密钥</string>
- <string name="menu_create_key_expert">创建密钥(专家)</string>
<string name="menu_search">搜索</string>
- <string name="menu_copy_to_clipboard">复制到剪贴板</string>
<string name="menu_key_edit_cancel">取消</string>
<string name="menu_encrypt_to">加密到...</string>
<!--label-->
- <string name="label_sign">签署</string>
<string name="label_message">讯息</string>
<string name="label_file">文件</string>
<string name="label_no_passphrase">没有密语</string>
<string name="label_passphrase">密语</string>
<string name="label_algorithm">算法</string>
- <string name="label_select_public_keys">收件人</string>
- <string name="label_delete_after_encryption">加密后删除</string>
<string name="label_delete_after_decryption">解密后删除</string>
<string name="label_encryption_algorithm">加密算法</string>
<string name="label_hash_algorithm">哈希算法</string>
@@ -79,7 +66,6 @@
<string name="error">错误</string>
<!--key flags-->
<!--sentences-->
- <string name="set_a_passphrase">先设置密钥</string>
<string name="no_filemanager_installed">安装了不匹配的文件管理器</string>
<string name="passphrases_do_not_match">密钥不匹配</string>
<string name="passphrase_for_symmetric_encryption">对称加密</string>
@@ -99,7 +85,6 @@
<string name="error_external_storage_not_ready">外置存储没有准备好</string>
<string name="error_key_size_minimum512bit">密钥的大小必须至少512位</string>
<string name="error_unknown_algorithm_choice">位置的算法选择</string>
- <string name="error_key_needs_master_key">需要至少一个主密钥</string>
<string name="error_no_signature_passphrase">没有提供密语</string>
<string name="error_no_signature_key">没有提供密钥</string>
<string name="error_invalid_data">不是有效的加密数据</string>
@@ -130,9 +115,6 @@
<string name="help_tab_about">关于</string>
<string name="help_about_version">版本:</string>
<!--Import-->
- <string name="import_from_clipboard">从剪贴板导入</string>
- <string name="import_qr_code_finished">二维码扫描完成!</string>
- <string name="import_nfc_help_button">帮助</string>
<!--Import result toast-->
<!--Intent labels-->
<!--Remote API-->
@@ -147,19 +129,23 @@
<string name="api_register_error_select_key">请选择一个密钥</string>
<string name="api_select_pub_keys_text">请重审收件人列表</string>
<!--Share-->
- <string name="share_qr_code_dialog_fingerprint_text">指纹:</string>
<string name="share_nfc_dialog">使用NFC分享</string>
<!--Key list-->
<string name="key_list_empty_text3">或者</string>
<!--Key view-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
<!--Navigation Drawer-->
- <string name="nav_import">导入密钥</string>
<!--hints-->
<!--certs-->
<!--Import Public log entries-->
<!--Import Secret log entries-->
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
+ <!--PassphraseCache-->
<!--unsorted-->
+ <!--First Time-->
</resources>
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index f4738f1da..952e315cf 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -7,17 +7,16 @@
<string name="title_encrypt">Encrypt</string>
<string name="title_decrypt">Decrypt</string>
<string name="title_authentication">Passphrase</string>
- <string name="title_create_key">Create My Key</string>
+ <string name="title_add_subkey">Add subkey</string>
<string name="title_edit_key">Edit Key</string>
<string name="title_preferences">Preferences</string>
<string name="title_api_registered_apps">Apps</string>
<string name="title_key_server_preference">Keyserver Preference</string>
<string name="title_change_passphrase">Change Passphrase</string>
- <string name="title_set_passphrase">Set Passphrase</string>
- <string name="title_share_with">Share with…</string>
<string name="title_share_fingerprint_with">Share fingerprint with…</string>
<string name="title_share_key">Share key with…</string>
<string name="title_share_file">Share file with…</string>
+ <string name="title_share_message">Share message with…</string>
<string name="title_encrypt_to_file">Encrypt To File</string>
<string name="title_decrypt_to_file">Decrypt To File</string>
<string name="title_import_keys">Import Keys</string>
@@ -36,42 +35,32 @@
<string name="section_general">General</string>
<string name="section_defaults">Defaults</string>
<string name="section_advanced">Advanced</string>
- <string name="section_master_key">Master Key</string>
- <string name="section_master_user_id">Primary Identity</string>
<string name="section_actions">Actions</string>
<string name="section_share_key">Whole key</string>
<string name="section_certification_key">Your Key used for certification</string>
<string name="section_upload_key">Upload Key</string>
<string name="section_key_server">Keyserver</string>
- <string name="section_encrypt_and_or_sign">Encrypt and/or Sign</string>
- <string name="section_decrypt_verify">Decrypt and Verify</string>
<string name="section_fingerprint">Fingerprint</string>
<string name="section_key_to_certify">Key to be certified</string>
<!-- button -->
- <string name="btn_certify">Certify</string>
<string name="btn_decrypt_verify_file">Decrypt, verify, and save file</string>
<string name="btn_decrypt_verify_message">Decrypt and verify message</string>
- <string name="btn_decrypt_verify_clipboard">From Clipboard</string>
<string name="btn_encrypt_file">Encrypt and save file</string>
+ <string name="btn_encrypt_share_file">Encrypt and share file</string>
<string name="btn_save">Save</string>
<string name="btn_do_not_save">Cancel</string>
<string name="btn_delete">Delete</string>
- <string name="btn_no_date">None</string>
+ <string name="btn_no_date">No Expiry</string>
<string name="btn_okay">Okay</string>
- <string name="btn_change_passphrase">Change New Passphrase</string>
- <string name="btn_set_passphrase">Set New Passphrase</string>
<string name="btn_export_to_server">Upload To Keyserver</string>
<string name="btn_next">Next</string>
<string name="btn_back">Back</string>
- <string name="btn_clipboard">Clipboard</string>
- <string name="btn_share">Share with…</string>
<string name="btn_lookup_key">Lookup key</string>
- <string name="btn_encryption_advanced_settings_show">Show advanced settings</string>
- <string name="btn_encryption_advanced_settings_hide">Hide advanced settings</string>
- <string name="btn_share_encrypted_signed">Share encrypted/signed message…</string>
+ <string name="btn_share_encrypted_signed">Encrypt and share message</string>
<string name="btn_view_cert_key">View certification key</string>
<string name="btn_create_key">Create key</string>
+ <string name="btn_add_files">Add file(s)</string>
<!-- menu -->
<string name="menu_preferences">Settings</string>
@@ -81,16 +70,6 @@
<string name="menu_create_key">Create my key</string>
<string name="menu_import_existing_key">Import existing key</string>
<string name="menu_search">Search</string>
- <string name="menu_key_server">Keyserver…</string>
- <string name="menu_share">Share…</string>
- <string name="menu_share_title_fingerprint">Share fingerprint…</string>
- <string name="menu_share_title">Share whole key…</string>
- <string name="menu_share_default_fingerprint">with…</string>
- <string name="menu_share_default">with…</string>
- <string name="menu_share_qr_code">with QR Code</string>
- <string name="menu_share_qr_code_fingerprint">with QR Code</string>
- <string name="menu_share_nfc">with NFC</string>
- <string name="menu_copy_to_clipboard">Copy to clipboard</string>
<string name="menu_beam_preferences">Beam settings</string>
<string name="menu_key_edit_cancel">Cancel</string>
<string name="menu_encrypt_to">Encrypt to…</string>
@@ -100,24 +79,26 @@
<string name="menu_advanced">Show advanced info</string>
<!-- label -->
- <string name="label_sign">Sign</string>
<string name="label_message">Message</string>
<string name="label_file">File</string>
+ <string name="label_files">File(s)</string>
+ <string name="label_file_colon">File:</string>
<string name="label_no_passphrase">No Passphrase</string>
<string name="label_passphrase">Passphrase</string>
<string name="label_passphrase_again">Repeat Passphrase</string>
<string name="label_algorithm">Algorithm</string>
- <string name="label_ascii_armor">ASCII Armor</string>
+ <string name="label_ascii_armor">File ASCII Armor</string>
+ <string name="label_file_ascii_armor">Files: ASCII Armor</string>
<string name="label_conceal_pgp_application">Let others know that you\'re using OpenKeychain</string>
<string name="label_conceal_pgp_application_summary">Writes \'OpenKeychain v2.7\' to OpenPGP signatures, ciphertext, and exported keys</string>
- <string name="label_select_public_keys">Recipients</string>
- <string name="label_delete_after_encryption">Delete After Encryption</string>
+ <string name="label_asymmetric_from">From:</string>
+ <string name="label_to">To:</string>
+ <string name="label_delete_after_encryption">Files: Delete After Encryption</string>
<string name="label_delete_after_decryption">Delete After Decryption</string>
- <string name="label_share_after_encryption">Share After Encryption</string>
<string name="label_encryption_algorithm">Encryption Algorithm</string>
<string name="label_hash_algorithm">Hash Algorithm</string>
- <string name="label_asymmetric">with Public Key</string>
- <string name="label_symmetric">with Passphrase</string>
+ <string name="label_asymmetric">With Public Key</string>
+ <string name="label_symmetric">With Passphrase</string>
<string name="label_passphrase_cache_ttl">Passphrase Cache</string>
<string name="label_message_compression">Message Compression</string>
<string name="label_file_compression">File Compression</string>
@@ -133,14 +114,8 @@
<string name="label_email">Email</string>
<string name="label_send_key">Upload key to selected keyserver after certification</string>
<string name="label_fingerprint">Fingerprint</string>
- <string name="select_keys_button_default">Select</string>
<string name="expiry_date_dialog_title">Set expiry date</string>
- <plurals name="select_keys_button">
- <item quantity="one">%d selected</item>
- <item quantity="other">%d selected</item>
- </plurals>
-
<string name="user_id_no_name">&lt;no name&gt;</string>
<string name="none">&lt;none&gt;</string>
<string name="no_key">&lt;no key&gt;</string>
@@ -193,7 +168,6 @@
<!-- sentences -->
<string name="wrong_passphrase">Wrong passphrase.</string>
- <string name="set_a_passphrase">Set a passphrase first.</string>
<string name="no_filemanager_installed">No compatible file manager installed.</string>
<string name="passphrases_do_not_match">The passphrases didn\'t match.</string>
<string name="passphrase_must_not_be_empty">Please enter a passphrase.</string>
@@ -212,8 +186,6 @@
<string name="specify_file_to_export_to">Please specify which file to export to.\nWARNING: File will be overwritten if it exists.</string>
<string name="key_deletion_confirmation_multi">Do you really want to delete all selected public keys?\nYou can\'t undo this!</string>
<string name="secret_key_deletion_confirmation">Do you really want to delete the SECRET key \'%s\'?\nYou can\'t undo this!</string>
- <string name="ask_save_changed_key">You have made changes to the keyring, would you like to save it?</string>
- <string name="ask_empty_id_ok">You have added an empty identity, are you sure you want to continue?</string>
<string name="public_key_deletetion_confirmation">Do you really want to delete the public key \'%s\'?\nYou can\'t undo this!</string>
<string name="also_export_secret_keys">Also export secret keys</string>
@@ -234,7 +206,6 @@
<string name="nfc_successful">Successfully sent key with NFC Beam!</string>
<string name="key_copied_to_clipboard">Key has been copied to the clipboard!</string>
<string name="fingerprint_copied_to_clipboard">Fingerprint has been copied to the clipboard!</string>
- <string name="key_has_already_been_certified">Key has already been certified!</string>
<string name="select_key_to_certify">Please select a key to be used for certification!</string>
<string name="key_too_big_for_sharing">Key is too big to be shared this way!</string>
@@ -248,23 +219,17 @@
<string name="error_no_secret_key_found">no suitable secret key found</string>
<string name="error_external_storage_not_ready">external storage not ready</string>
<string name="error_key_size_minimum512bit">key size must be at least 512bit</string>
- <string name="error_master_key_must_not_be_el_gamal">the master key cannot be an ElGamal key</string>
<string name="error_unknown_algorithm_choice">unknown algorithm choice</string>
<string name="error_user_id_no_email">no email found</string>
<string name="error_key_needs_a_user_id">need at least one identity</string>
- <string name="error_main_user_id_must_not_be_empty">primary identity must not be empty</string>
- <string name="error_key_needs_master_key">need at least a master key</string>
<string name="error_no_signature_passphrase">no passphrase given</string>
<string name="error_no_signature_key">no signature key given</string>
<string name="error_invalid_data">not valid encryption data</string>
<string name="error_integrity_check_failed">integrity check failed! Data has been modified!</string>
<string name="error_wrong_passphrase">wrong passphrase</string>
- <string name="error_saving_keys">error saving some keys</string>
<string name="error_could_not_extract_private_key">could not extract private key</string>
- <string name="error_expiry_must_come_after_creation">expiry date must come after creation date</string>
<!-- errors without preceeding Error: -->
- <string name="error_only_files_are_supported">Direct binary data without actual file in filesystem is not supported.</string>
<string name="error_jelly_bean_needed">You need Android 4.1 to use Android\'s NFC Beam feature!</string>
<string name="error_nfc_needed">NFC is not available on your device!</string>
<string name="error_nothing_import">No keys found!</string>
@@ -279,7 +244,6 @@
<item quantity="one">part of the loaded file is a valid OpenPGP object but not a OpenPGP key</item>
<item quantity="other">parts of the loaded file are valid OpenPGP objects but not OpenPGP keys</item>
</plurals>
- <string name="error_change_something_first">You must make changes to the keyring before you can save it</string>
<!-- results shown after decryption/verification -->
<string name="decrypt_result_invalid_signature">Invalid signature!</string>
@@ -299,10 +263,7 @@
<string name="progress_exporting">exporting…</string>
<string name="progress_uploading">uploading…</string>
<string name="progress_building_key">building key…</string>
- <string name="progress_certifying_master_key">certifying master key…</string>
<string name="progress_building_master_key">building master ring…</string>
- <string name="progress_adding_sub_keys">adding sub keys…</string>
- <string name="progress_saving_key_ring">saving key…</string>
<string name="progress_generating_rsa">generating new RSA key…</string>
<string name="progress_generating_dsa">generating new DSA key…</string>
<string name="progress_generating_elgamal">generating new ElGamal key…</string>
@@ -323,11 +284,6 @@
<item quantity="other">exporting keys…</item>
</plurals>
- <plurals name="progress_generating">
- <item quantity="one">generating key, this can take up to 3 minutes…</item>
- <item quantity="other">generating keys, this can take up to 3 minutes…</item>
- </plurals>
-
<string name="progress_extracting_signature_key">extracting signature key…</string>
<string name="progress_extracting_key">extracting key…</string>
<string name="progress_preparing_streams">preparing streams…</string>
@@ -347,7 +303,6 @@
<!-- action strings -->
<string name="hint_public_keys">Name/Email/Key ID…</string>
- <string name="action_share_key_with">Share Key with…</string>
<string name="hint_keybase_search">Name/Keybase.io username…</string>
<!-- key bit length selections -->
@@ -361,7 +316,7 @@
<string name="key_size_8192">8192</string>
<string name="key_size_custom">Custom key size</string>
<string name="key_size_custom_info">Type custom key length (in bits):</string>
- <string name="key_size_custom_info_rsa">RSA key length must be greater than 1024 and at most 8192. Also it must be multiplicity of 8.</string>
+ <string name="key_size_custom_info_rsa">RSA key length must be greater than 1024 and at most 16384. Also it must be multiplicity of 8.</string>
<string name="key_size_custom_info_dsa">DSA key length must be at least 512 and at most 1024. Also it must be multiplicity of 64.</string>
<!-- compression -->
@@ -383,23 +338,9 @@
<string name="import_tab_qr_code">QR Code/NFC</string>
<string name="import_tab_keybase">Keybase.io</string>
<string name="import_import">Import selected keys</string>
- <string name="import_from_clipboard">Import from clipboard</string>
-
- <plurals name="import_qr_code_missing">
- <item quantity="one">Missing QR Code with ID %s</item>
- <item quantity="other">Missing QR Codes with IDs %s</item>
- </plurals>
-
- <string name="import_qr_code_start_with_one">Please start with QR Code with ID 1</string>
<string name="import_qr_code_wrong">QR Code malformed! Please try again!</string>
- <string name="import_qr_code_finished">QR Code scanning finished!</string>
<string name="import_qr_code_too_short_fingerprint">Fingerprint is too short (&lt; 16 characters)</string>
- <string name="import_qr_scan_button">Scan QR Code with \'Barcode Scanner\'</string>
- <string name="import_nfc_text">To receive keys via NFC, the device needs to be unlocked.</string>
- <string name="import_nfc_help_button">Help</string>
<string name="import_qr_code_button">Scan QR Code…</string>
- <string name="import_clipboard_button">Get key from clipboard</string>
- <string name="import_keybase_button">Get key from Keybase.io</string>
<!-- Import result toast -->
<plurals name="import_keys_added_and_updated_1">
@@ -459,9 +400,6 @@
<!-- Share -->
<string name="share_qr_code_dialog_title">Share with QR Code</string>
- <string name="share_qr_code_dialog_start">Go through all QR Codes using \'Next\', and scan them one by one.</string>
- <string name="share_qr_code_dialog_fingerprint_text">Fingerprint:</string>
- <string name="share_qr_code_dialog_progress">QR Code with ID %1$d of %2$d</string>
<string name="share_nfc_dialog">Share with NFC</string>
<!-- Key list -->
@@ -498,11 +436,16 @@
<item>Change to Primary Identity</item>
<item>Revoke Identity</item>
</string-array>
+ <string-array name="edit_key_edit_user_id_revert_revocation">
+ <item>Revert revocation</item>
+ </string-array>
+ <string name="edit_key_edit_user_id_revoked">This identity has been revoked. This cannot be undone.</string>
<string name="edit_key_edit_subkey_title">Select an action!</string>
<string-array name="edit_key_edit_subkey">
<item>Change Expiry</item>
<item>Revoke Subkey</item>
</string-array>
+ <string name="edit_key_new_subkey">new</string>
<!-- Create key -->
<string name="create_key_upload">Upload key to keyserver</string>
@@ -521,15 +464,13 @@
<string name="nav_keys">Keys</string>
<string name="nav_encrypt">Sign and Encrypt</string>
<string name="nav_decrypt">Decrypt and Verify</string>
- <string name="nav_import">Import Keys</string>
<string name="nav_apps">Apps</string>
<string name="drawer_open">Open navigation drawer</string>
<string name="drawer_close">Close navigation drawer</string>
- <string name="edit">Edit</string>
<string name="my_keys">My Keys</string>
<!-- hints -->
- <string name="encrypt_content_edit_text_hint">Write message here to encrypt and/or sign…</string>
+ <string name="encrypt_content_edit_text_hint">The message entered here will be signed using the key selected in \'From\' and encrypted for all recipients selected in \'To\'.</string>
<string name="decrypt_content_edit_text_hint">Enter ciphertext here to decrypt and/or verify…</string>
<!-- certs -->
@@ -726,13 +667,11 @@
<string name="label_cert_type">Type</string>
<string name="error_key_not_found">Key not found!</string>
<string name="error_key_processing">Error processing key!</string>
- <string name="no_subkey">subkey unavailable</string>
<string name="key_stripped">stripped</string>
<string name="secret_cannot_multiple">Your own keys can only be deleted individually!</string>
<string name="title_view_cert">View Certificate Details</string>
<string name="unknown_algorithm">unknown</string>
<string name="can_sign_not">cannot sign</string>
- <string name="error_encoding">Encoding error</string>
<string name="error_no_encrypt_subkey">No encryption subkey available!</string>
<string name="info_no_manual_account_creation">Do not create OpenKeychain-Accounts manually.\nFor more information, see Help.</string>
<string name="contact_show_key">Show key (%s)</string>
diff --git a/README.md b/README.md
index 509c57e63..c91b2127e 100644
--- a/README.md
+++ b/README.md
@@ -132,6 +132,10 @@ When changing build files or dependencies, respect the following requirements:
* https://www.timroes.de/2013/09/12/speed-up-gradle/
* Disable Lint checking if it is enabled in build.gradle
+### Error:Configuration with name 'default' not found.
+
+Gradle project dependencies are missing. Do a ``git submodule init && git submodule update``
+
### Translations
Translations are hosted on Transifex, which is configured by ".tx/config".
@@ -216,10 +220,6 @@ Some parts and some libraries are Apache License v2, MIT X11 License (see below)
* StickyListHeaders
https://github.com/emilsjolander/StickyListHeaders
Apache License v2
-
-* Android-Bootstrap
- https://github.com/Bearded-Hen/Android-Bootstrap
- MIT License
### Images
* icon.svg
@@ -231,5 +231,8 @@ Some parts and some libraries are Apache License v2, MIT X11 License (see below)
* QR Code Actionbar icon
https://github.com/openintents/openintents/blob/master/extensions/qrcode_ext/icons/ic_menu_qr_code/ic_menu_qr_code_holo_light/ic_menu_qr_code.svg
+* Key status icons by the ModernPGP working group
+ https://github.com/ModernPGP
+
* Purple color scheme
http://android-holo-colors.com/
diff --git a/extern/TokenAutoComplete b/extern/TokenAutoComplete
new file mode 160000
+Subproject 0056270cec6a91893b853844ebe99f6cd5c1534
diff --git a/extern/openkeychain-api-lib b/extern/openkeychain-api-lib
-Subproject 48941ca6ec58c4583cdcf9d647ad5174925e2f2
+Subproject 02cb8ad24b780f3b97073f2526f83057c99d424
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
-Subproject 869ab96e6dcd4821fd5360248429e49dae6fbac
+Subproject fab79b605f0317891fe4260dcec0dea1a76fa04
diff --git a/extern/openpgp-card-nfc-lib b/extern/openpgp-card-nfc-lib
-Subproject b293af0bd27739d4dcfe964819cf7eebddf1f2b
+Subproject 1531e38c30a9c3e072e302c1931fef2999fe08d
diff --git a/extern/spongycastle b/extern/spongycastle
-Subproject a68ebd1ffc5af880903b2905c17e4f6ac0f1398
+Subproject 9e4fb80c4f8efb8a0f8fd0c1cc1e74a421d1eb7
diff --git a/settings.gradle b/settings.gradle
index d568e09ce..7b9bb577a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -12,4 +12,5 @@ include ':extern:spongycastle:prov'
include ':extern:SuperToasts:supertoasts'
include ':extern:minidns'
include ':extern:KeybaseLib:Lib'
+include ':extern:TokenAutoComplete:library'
include ':extern:openpgp-card-nfc-lib:library'