aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-03-02 14:39:28 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-03-02 14:39:28 +0100
commit2f83291920e024b0f8038fe0caa747051b41cf1c (patch)
tree780fc0975e56b3dbd8a1eb4cb2988ac3e2e23ea1 /OpenKeychain/src/main
parentaa22a0defcf94d5f734d3a00288f5c8d916d2e57 (diff)
parent4e29d027af05fc574dc5398d2fb3afcdf3defc70 (diff)
downloadopen-keychain-2f83291920e024b0f8038fe0caa747051b41cf1c.tar.gz
open-keychain-2f83291920e024b0f8038fe0caa747051b41cf1c.tar.bz2
open-keychain-2f83291920e024b0f8038fe0caa747051b41cf1c.zip
NON-WORKING Merge branch 'development' into linked-identities
Conflicts: OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedUserAttribute.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java OpenKeychain/src/main/res/layout/view_key_main_fragment.xml OpenKeychain/src/main/res/values/strings.xml extern/spongycastle
Diffstat (limited to 'OpenKeychain/src/main')
-rw-r--r--OpenKeychain/src/main/AndroidManifest.xml110
-rw-r--r--OpenKeychain/src/main/java/android/support/v4/widget/FixedDrawerLayout.java49
-rw-r--r--OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragment.java55
-rw-r--r--OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragmentOld.java926
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java18
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java58
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java103
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java136
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/CertifyResult.java66
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DecryptVerifyResult.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java66
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/ImportKeyResult.java72
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java150
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PgpSignEncryptResult.java139
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PromoteKeyResult.java53
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SignEncryptResult.java90
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SingletonResult.java34
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java82
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java490
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java132
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInput.java176
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java)488
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java135
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java16
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java99
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedUserAttribute.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java62
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java124
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java609
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java35
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java140
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java292
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsHeaderFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsFragment.java)2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListActivity.java36
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java350
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java404
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java599
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java15
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java67
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java131
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvancedActivity.java)55
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java198
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java88
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java125
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java19
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java306
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java36
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java38
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java150
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java69
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java73
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/FirstTimeActivity.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java29
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java229
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeScanActivity.java)161
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java229
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java458
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayActivity.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java86
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java71
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcIntentActivity.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java24
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseWizardActivity.java53
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeViewActivity.java66
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java70
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java145
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java)56
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesKeyServerActivity.java)25
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java716
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java257
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvancedFragment.java)72
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java)77
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java125
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java184
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java232
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java369
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java460
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java14
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java23
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyValueSpinnerAdapter.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java16
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAddedAdapter.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/TabsAdapter.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java)49
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java34
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java97
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ActionBarHelper.java99
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java101
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java149
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/AspectRatioImageView.java138
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java17
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/FoldableLinearLayout.java39
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ListAwareSwipeRefreshLayout.java104
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java318
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java211
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java42
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FabContainer.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Iso7816TLV.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java15
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Log.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareHelper.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java11
-rw-r--r--OpenKeychain/src/main/res/anim/rotate.xml8
-rw-r--r--OpenKeychain/src/main/res/anim/rotate_spin.xml8
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.pngbin260 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin467 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/create_key_robot.pngbin2259 -> 2299 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_collapse.pngbin467 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_file.pngbin0 -> 623 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_text.pngbin0 -> 787 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_expand.pngbin415 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_nfc.pngbin1660 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.pngbin2134 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_safeslinger.pngbin2616 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_verified_cutout.pngbin0 -> 1080 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_apps_black_24dp.pngbin0 -> 182 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.pngbin0 -> 287 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_check_white_24dp.pngbin0 -> 309 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_close_white_24dp.pngbin0 -> 324 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_cloud_search_24px.pngbin0 -> 1025 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_expand_less_black_24dp.pngbin0 -> 234 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_expand_more_black_24dp.pngbin0 -> 244 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_folder_white_24dp.pngbin0 -> 224 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_help_black_24dp.pngbin0 -> 559 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_launcher.pngbin4563 -> 6885 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_lock_black_24dp.pngbin0 -> 397 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_lock_white_24dp.pngbin0 -> 399 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.pngbin0 -> 351 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_nfc_white_24dp.pngbin0 -> 740 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.pngbin0 -> 282 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_qrcode_white_24dp.pngbin0 -> 427 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_refresh_white_24dp.pngbin0 -> 531 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_grey_24dp.pngbin0 -> 297 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_white_24dp.pngbin0 -> 296 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_search_white_24dp.pngbin0 -> 504 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_settings_black_24dp.pngbin0 -> 561 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_vpn_key_black_24dp.pngbin0 -> 381 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate.png)bin1302 -> 1302 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify.png)bin2289 -> 2289 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt.png)bin1530 -> 1530 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign.png)bin1751 -> 1751 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin402 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin361 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin413 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_holo_light.pngbin242 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin423 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin800 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin624 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin1699 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_holo_light.pngbin1519 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin803 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin330 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin422 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin400 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin406 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin390 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin1398 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin717 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin1467 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_holo_light.pngbin736 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin1574 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin2383 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin1169 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin2199 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_holo_light.pngbin1402 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin1908 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_activated_holo.9.pngbin115 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_focused_holo.9.pngbin139 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_longpressed_holo.9.pngbin115 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_pressed_holo_light.9.pngbin115 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin189 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_bg_holo_light.9.pngbin175 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_primary_holo_light.9.pngbin381 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_secondary_holo_light.9.pngbin149 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin729 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin810 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin913 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin954 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin840 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin960 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin761 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin832 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_default_holo_light.9.pngbin304 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin378 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_focused_holo_light.9.pngbin499 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin359 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_activated_holo_light.9.pngbin199 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_default_holo_light.9.pngbin187 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin1208 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin1116 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_focused_holo_light.9.pngbin298 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_lock_closed_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_lock_closed.png)bin675 -> 675 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_lock_error_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_lock_error.png)bin748 -> 748 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_lock_open_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_lock_open.png)bin675 -> 675 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired.pngbin723 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout.png)bin789 -> 789 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_96px.pngbin0 -> 3241 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid.pngbin528 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout.png)bin444 -> 444 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_96px.pngbin0 -> 1656 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked.pngbin714 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout.png)bin861 -> 861 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_96px.pngbin0 -> 3638 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown.pngbin640 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout.png)bin740 -> 740 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_96px.pngbin0 -> 2878 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified.pngbin536 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout.png)bin813 -> 813 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_96px.pngbin0 -> 3257 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified.pngbin541 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout.png)bin695 -> 695 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_96px.pngbin0 -> 3277 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-ldpi/ic_launcher.pngbin1966 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-ldpi/uid_mail_bad.pngbin531 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-ldpi/uid_mail_ok.pngbin646 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.pngbin169 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin306 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/create_key_robot.pngbin1766 -> 1767 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_collapse.pngbin404 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_file.pngbin0 -> 480 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_text.pngbin0 -> 572 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_expand.pngbin345 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_nfc.pngbin1147 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.pngbin1314 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_safeslinger.pngbin1457 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_verified_cutout.pngbin0 -> 751 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_apps_black_24dp.pngbin0 -> 173 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.pngbin0 -> 240 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_check_white_24dp.pngbin0 -> 243 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_close_white_24dp.pngbin0 -> 279 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_cloud_search_24px.pngbin0 -> 712 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_expand_less_black_24dp.pngbin0 -> 206 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_expand_more_black_24dp.pngbin0 -> 206 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_folder_white_24dp.pngbin0 -> 206 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_help_black_24dp.pngbin0 -> 390 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_launcher.pngbin2867 -> 4641 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_lock_black_24dp.pngbin0 -> 291 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_lock_white_24dp.pngbin0 -> 296 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.pngbin0 -> 272 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_nfc_white_24dp.pngbin0 -> 485 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.pngbin0 -> 257 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_qrcode_white_24dp.pngbin0 -> 231 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_refresh_white_24dp.pngbin0 -> 346 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_grey_24dp.pngbin0 -> 238 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_white_24dp.pngbin0 -> 236 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_search_white_24dp.pngbin0 -> 346 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_settings_black_24dp.pngbin0 -> 416 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_vpn_key_black_24dp.pngbin0 -> 293 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_flag_authenticate_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/key_flag_authenticate.png)bin897 -> 897 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_flag_certify_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/key_flag_certify.png)bin1746 -> 1746 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_flag_encrypt_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/key_flag_encrypt.png)bin1153 -> 1153 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_flag_sign_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/key_flag_sign.png)bin1353 -> 1353 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin300 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin329 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin319 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_holo_light.pngbin183 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin289 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin592 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin508 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin1100 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_holo_light.pngbin1004 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin554 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin232 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin313 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin286 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin276 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin265 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin778 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin479 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin802 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_holo_light.pngbin451 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin962 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin1278 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin736 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin1184 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_holo_light.pngbin847 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin1118 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_activated_holo.9.pngbin110 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_focused_holo.9.pngbin117 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_longpressed_holo.9.pngbin110 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_pressed_holo_light.9.pngbin110 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin171 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_bg_holo_light.9.pngbin161 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_primary_holo_light.9.pngbin270 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_secondary_holo_light.9.pngbin135 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin413 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin485 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin539 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin521 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin506 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin538 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin489 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin507 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_default_holo_light.9.pngbin237 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin274 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_focused_holo_light.9.pngbin390 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin279 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_activated_holo_light.9.pngbin165 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_default_holo_light.9.pngbin151 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin1133 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin1094 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_focused_holo_light.9.pngbin264 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_lock_closed_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_lock_closed.png)bin528 -> 528 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_lock_error_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_lock_error.png)bin622 -> 622 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_lock_open_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_lock_open.png)bin522 -> 522 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired.pngbin601 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout.png)bin643 -> 643 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_96px.pngbin0 -> 2411 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid.pngbin463 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout.png)bin410 -> 410 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_96px.pngbin0 -> 958 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked.pngbin613 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout.png)bin685 -> 685 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_96px.pngbin0 -> 2475 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown.pngbin517 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout.png)bin589 -> 589 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_96px.pngbin0 -> 2105 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified.pngbin469 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout.png)bin667 -> 667 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_96px.pngbin0 -> 2314 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified.pngbin476 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout.png)bin557 -> 557 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_96px.pngbin0 -> 2148 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.pngbin324 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin613 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/create_key_robot.pngbin3176 -> 3153 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collapse.pngbin631 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_file.pngbin0 -> 836 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_text.pngbin0 -> 976 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_expand.pngbin582 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_nfc.pngbin2297 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.pngbin2959 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_safeslinger.pngbin4012 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_verified_cutout.pngbin0 -> 1455 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_apps_black_24dp.pngbin0 -> 193 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.pngbin0 -> 336 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_check_white_24dp.pngbin0 -> 363 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_close_white_24dp.pngbin0 -> 402 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_cloud_search_24px.pngbin0 -> 1428 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_less_black_24dp.pngbin0 -> 259 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_more_black_24dp.pngbin0 -> 272 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_folder_white_24dp.pngbin0 -> 273 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_help_black_24dp.pngbin0 -> 700 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_launcher.pngbin6328 -> 8916 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_black_24dp.pngbin0 -> 498 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_white_24dp.pngbin0 -> 465 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.pngbin0 -> 378 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_nfc_white_24dp.pngbin0 -> 943 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.pngbin0 -> 318 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_qrcode_white_24dp.pngbin0 -> 284 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.pngbin0 -> 637 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_grey_24dp.pngbin0 -> 317 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_white_24dp.pngbin0 -> 314 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_search_white_24dp.pngbin0 -> 591 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_settings_black_24dp.pngbin0 -> 691 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_vpn_key_black_24dp.pngbin0 -> 446 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate.png)bin2161 -> 2161 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify.png)bin3713 -> 3713 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt.png)bin2310 -> 2310 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign.png)bin2705 -> 2705 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin462 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin375 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin479 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_holo_light.pngbin293 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin549 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin1059 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin762 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin2921 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_holo_light.pngbin2651 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin1134 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin390 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin541 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin443 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin520 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin507 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin2082 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin919 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin2161 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_holo_light.pngbin950 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin2235 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin3484 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin1643 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin3568 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_holo_light.pngbin2467 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin2683 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_activated_holo.9.pngbin121 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_focused_holo.9.pngbin154 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_longpressed_holo.9.pngbin121 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_pressed_holo_light.9.pngbin121 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin188 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_bg_holo_light.9.pngbin178 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_primary_holo_light.9.pngbin477 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_secondary_holo_light.9.pngbin150 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin821 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin989 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin1187 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin1135 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin1083 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin1190 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin1069 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin1055 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_default_holo_light.9.pngbin392 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin420 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_focused_holo_light.9.pngbin659 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin507 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_activated_holo_light.9.pngbin237 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_default_holo_light.9.pngbin220 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin1176 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin1116 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_focused_holo_light.9.pngbin434 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_lock_closed_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_lock_closed.png)bin911 -> 911 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_lock_error_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_lock_error.png)bin1008 -> 1008 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_lock_open_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_lock_open.png)bin911 -> 911 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired.pngbin1049 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout.png)bin1179 -> 1179 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_96px.pngbin0 -> 4973 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid.pngbin736 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout.png)bin676 -> 676 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_96px.pngbin0 -> 2306 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked.pngbin1033 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout.png)bin1218 -> 1218 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_96px.pngbin0 -> 5757 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown.pngbin906 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout.png)bin1043 -> 1043 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_96px.pngbin0 -> 4395 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified.pngbin706 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout.png)bin1166 -> 1166 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_96px.pngbin0 -> 4908 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified.pngbin784 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout.png)bin1017 -> 1017 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_96px.pngbin0 -> 5309 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.pngbin600 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin911 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/create_key_robot.pngbin4039 -> 4030 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collapse.pngbin901 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_file.pngbin0 -> 1095 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_text.pngbin0 -> 1331 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_expand.pngbin974 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_nfc.pngbin2378 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.pngbin4129 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_safeslinger.pngbin6626 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_verified_cutout.pngbin0 -> 2168 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_apps_black_24dp.pngbin0 -> 213 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.pngbin0 -> 410 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_white_24dp.pngbin0 -> 460 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_close_white_24dp.pngbin0 -> 492 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_cloud_search_24px.pngbin0 -> 2128 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_less_black_24dp.pngbin0 -> 304 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_more_black_24dp.pngbin0 -> 316 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.pngbin0 -> 342 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_help_black_24dp.pngbin0 -> 986 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_launcher.pngbin10207 -> 13548 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_black_24dp.pngbin0 -> 636 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.pngbin0 -> 760 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.pngbin0 -> 490 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_nfc_white_24dp.pngbin0 -> 1476 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.pngbin0 -> 399 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_qrcode_white_24dp.pngbin0 -> 352 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.pngbin0 -> 875 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_grey_24dp.pngbin0 -> 400 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_white_24dp.pngbin0 -> 397 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_search_white_24dp.pngbin0 -> 871 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.pngbin0 -> 969 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_vpn_key_black_24dp.pngbin0 -> 622 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate.png)bin3073 -> 3073 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify.png)bin5303 -> 5303 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt.png)bin3158 -> 3158 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign.png)bin3765 -> 3765 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin455 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin1177 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin538 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_holo_light.pngbin329 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin598 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin1117 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin1574 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin3942 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_holo_light.pngbin3606 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin1155 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin544 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin1643 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin834 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin890 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin823 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin2511 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin2208 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin2720 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_holo_light.pngbin1490 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin3039 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin4515 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin3894 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin4895 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_holo_light.pngbin3657 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin3544 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_activated_holo.9.pngbin133 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_focused_holo.9.pngbin158 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_longpressed_holo.9.pngbin133 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_pressed_holo_light.9.pngbin133 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin280 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_bg_holo_light.9.pngbin1084 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_primary_holo_light.9.pngbin847 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_secondary_holo_light.9.pngbin147 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin1328 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin1631 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin1909 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin1906 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin1801 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin1947 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin1745 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin1748 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_default_holo_light.9.pngbin443 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin1326 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_focused_holo_light.9.pngbin696 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin630 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_activated_holo_light.9.pngbin338 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_default_holo_light.9.pngbin325 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin464 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin315 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_focused_holo_light.9.pngbin513 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_closed_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_closed.png)bin1160 -> 1160 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_error_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_error.png)bin1316 -> 1316 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_open_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_open.png)bin1165 -> 1165 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired.pngbin1429 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout.png)bin1590 -> 1590 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_96px.pngbin0 -> 6986 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid.pngbin840 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout.png)bin694 -> 694 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_96px.pngbin0 -> 3701 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked.pngbin1353 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout.png)bin1660 -> 1660 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_96px.pngbin0 -> 7922 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown.pngbin1231 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout.png)bin1377 -> 1377 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_96px.pngbin0 -> 5952 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified.pngbin946 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout.png)bin1555 -> 1555 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_96px.pngbin0 -> 6544 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified.pngbin1012 -> 0 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_24px.png (renamed from OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout.png)bin1319 -> 1319 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_96px.pngbin0 -> 7353 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_apps_black_24dp.pngbin0 -> 236 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.pngbin0 -> 530 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.pngbin0 -> 587 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.pngbin0 -> 662 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_less_black_24dp.pngbin0 -> 360 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_more_black_24dp.pngbin0 -> 379 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.pngbin0 -> 504 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.pngbin0 -> 1323 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_launcher.pngbin14135 -> 16742 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_black_24dp.pngbin0 -> 830 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.pngbin0 -> 971 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.pngbin0 -> 632 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_nfc_white_24dp.pngbin0 -> 1938 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.pngbin0 -> 477 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_qrcode_white_24dp.pngbin0 -> 414 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.pngbin0 -> 1148 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_grey_24dp.pngbin0 -> 481 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_white_24dp.pngbin0 -> 478 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.pngbin0 -> 1090 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.pngbin0 -> 1257 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/ic_vpn_key_black_24dp.pngbin0 -> 789 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml20
-rw-r--r--OpenKeychain/src/main/res/drawable/cardview_header.xml11
-rw-r--r--OpenKeychain/src/main/res/drawable/drawer_header.pngbin0 -> 49186 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable/fab_label_background.xml11
-rw-r--r--OpenKeychain/src/main/res/drawable/first_time_1.pngbin43898 -> 40232 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_activated_background_holo_light.xml20
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_btn_check_holo_light.xml65
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_btn_default_holo_light.xml32
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_btn_radio_holo_light.xml59
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_edit_text_holo_light.xml25
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_item_background_holo_light.xml26
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_background_transition_holo_light.xml20
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_holo_light.xml28
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_progress_horizontal_holo_light.xml32
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_progress_indeterminate_horizontal_holo_light.xml30
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_searchview_holo_light.xml7
-rw-r--r--OpenKeychain/src/main/res/drawable/keychaintheme_spinner_background_holo_light.xml25
-rw-r--r--OpenKeychain/src/main/res/drawable/section_header.xml2
-rw-r--r--OpenKeychain/src/main/res/layout-land/qr_code_activity.xml39
-rw-r--r--OpenKeychain/src/main/res/layout-large/api_apps_list_activity.xml18
-rw-r--r--OpenKeychain/src/main/res/layout-large/decrypt_activity.xml18
-rw-r--r--OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml17
-rw-r--r--OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml17
-rw-r--r--OpenKeychain/src/main/res/layout-large/key_list_activity.xml18
-rw-r--r--OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml75
-rw-r--r--OpenKeychain/src/main/res/layout/actionbar_custom_view_done.xml26
-rw-r--r--OpenKeychain/src/main/res/layout/actionbar_custom_view_done_cancel.xml28
-rw-r--r--OpenKeychain/src/main/res/layout/add_subkey_dialog.xml8
-rw-r--r--OpenKeychain/src/main/res/layout/add_user_id_dialog.xml8
-rw-r--r--OpenKeychain/src/main/res/layout/alp_42447968_lock_pattern_fragment.xml15
-rw-r--r--OpenKeychain/src/main/res/layout/api_account_settings_activity.xml39
-rw-r--r--OpenKeychain/src/main/res/layout/api_app_settings_activity.xml132
-rw-r--r--OpenKeychain/src/main/res/layout/api_app_settings_fragment.xml12
-rw-r--r--OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml20
-rw-r--r--OpenKeychain/src/main/res/layout/api_apps_list_activity.xml11
-rw-r--r--OpenKeychain/src/main/res/layout/api_apps_list_content.xml14
-rw-r--r--OpenKeychain/src/main/res/layout/api_remote_create_account.xml60
-rw-r--r--OpenKeychain/src/main/res/layout/api_remote_error_message.xml36
-rw-r--r--OpenKeychain/src/main/res/layout/api_remote_register_app.xml50
-rw-r--r--OpenKeychain/src/main/res/layout/api_remote_select_pub_keys.xml44
-rw-r--r--OpenKeychain/src/main/res/layout/certify_fingerprint_activity.xml32
-rw-r--r--OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml154
-rw-r--r--OpenKeychain/src/main/res/layout/certify_key_activity.xml36
-rw-r--r--OpenKeychain/src/main/res/layout/certify_key_fragment.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/create_key_activity.xml26
-rw-r--r--OpenKeychain/src/main/res/layout/create_key_final_fragment.xml9
-rw-r--r--OpenKeychain/src/main/res/layout/create_key_input_fragment.xml6
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_activity.xml11
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_content.xml109
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_files_activity.xml32
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_result_include.xml4
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_text_activity.xml34
-rw-r--r--OpenKeychain/src/main/res/layout/drawer_custom_header.xml16
-rw-r--r--OpenKeychain/src/main/res/layout/drawer_list.xml18
-rw-r--r--OpenKeychain/src/main/res/layout/drawer_list_item.xml31
-rw-r--r--OpenKeychain/src/main/res/layout/edit_key_activity.xml26
-rw-r--r--OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml7
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml31
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml135
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_files_activity.xml40
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_files_content.xml23
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_text_activity.xml40
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_text_content.xml24
-rw-r--r--OpenKeychain/src/main/res/layout/file_dialog.xml17
-rw-r--r--OpenKeychain/src/main/res/layout/first_time_activity.xml9
-rw-r--r--OpenKeychain/src/main/res/layout/foldable_linearlayout.xml52
-rw-r--r--OpenKeychain/src/main/res/layout/full_screen_dialog.xml10
-rw-r--r--OpenKeychain/src/main/res/layout/full_screen_dialog_2.xml12
-rw-r--r--OpenKeychain/src/main/res/layout/full_screen_dialog_2_cancel_button.xml (renamed from OpenKeychain/src/main/res/layout/actionbar_include_cancel_button.xml)20
-rw-r--r--OpenKeychain/src/main/res/layout/full_screen_dialog_2_done_button.xml (renamed from OpenKeychain/src/main/res/layout/actionbar_include_done_button.xml)20
-rw-r--r--OpenKeychain/src/main/res/layout/full_screen_dialog_done_button.xml25
-rw-r--r--OpenKeychain/src/main/res/layout/full_screen_dialog_old.xml10
-rw-r--r--OpenKeychain/src/main/res/layout/help_activity.xml38
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_activity.xml118
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_cloud_fragment.xml1
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_list_item.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml4
-rw-r--r--OpenKeychain/src/main/res/layout/indeterminate_progress.xml9
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_activity.xml11
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_content.xml68
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_fragment.xml63
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_item.xml4
-rw-r--r--OpenKeychain/src/main/res/layout/key_server_preference.xml142
-rw-r--r--OpenKeychain/src/main/res/layout/keyspinner_item.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/log_display_activity.xml32
-rw-r--r--OpenKeychain/src/main/res/layout/nfc_activity.xml49
-rw-r--r--OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml6
-rw-r--r--OpenKeychain/src/main/res/layout/passphrase_wizard_fragment_passphrase.xml64
-rw-r--r--OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml10
-rw-r--r--OpenKeychain/src/main/res/layout/qr_code_activity.xml41
-rw-r--r--OpenKeychain/src/main/res/layout/safe_slinger_activity.xml122
-rw-r--r--OpenKeychain/src/main/res/layout/select_key_item.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/select_public_key_activity.xml20
-rw-r--r--OpenKeychain/src/main/res/layout/toolbar_standalone.xml31
-rw-r--r--OpenKeychain/src/main/res/layout/upload_key_activity.xml112
-rw-r--r--OpenKeychain/src/main/res/layout/view_cert_activity.xml423
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_activity.xml211
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_activity.xml41
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml (renamed from OpenKeychain/src/main/res/layout/view_key_advanced_fragment.xml)45
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_certs_header.xml (renamed from OpenKeychain/src/main/res/layout/view_key_certs_header.xml)0
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_certs_item.xml (renamed from OpenKeychain/src/main/res/layout/view_key_certs_item.xml)0
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml126
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_keybase_proof.xml19
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml33
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_share_fragment.xml (renamed from OpenKeychain/src/main/res/layout/view_key_share_fragment.xml)72
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_subkey_item.xml (renamed from OpenKeychain/src/main/res/layout/view_key_subkey_item.xml)10
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml34
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml (renamed from OpenKeychain/src/main/res/layout/view_key_user_id_item.xml)0
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_advanced_activity.xml22
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_delete_fragment.xml5
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_fragment.xml47
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_main_fragment.xml186
-rw-r--r--OpenKeychain/src/main/res/menu/api_account_settings.xml4
-rw-r--r--OpenKeychain/src/main/res/menu/api_app_settings.xml10
-rw-r--r--OpenKeychain/src/main/res/menu/key_list.xml43
-rw-r--r--OpenKeychain/src/main/res/menu/key_list_multi.xml5
-rw-r--r--OpenKeychain/src/main/res/menu/key_view.xml20
-rw-r--r--OpenKeychain/src/main/res/menu/key_view2.xml11
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_about.html57
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_changelog.html232
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_nfc_beam.html12
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_start.html19
-rw-r--r--OpenKeychain/src/main/res/raw-bg/help_wot.html17
-rw-r--r--OpenKeychain/src/main/res/raw-bg/nfc_beam_share.html11
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-cs/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_changelog.html6
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_changelog.html4
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_wot.html6
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_about.html57
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_changelog.html232
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_nfc_beam.html12
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_start.html19
-rw-r--r--OpenKeychain/src/main/res/raw-eu/help_wot.html17
-rw-r--r--OpenKeychain/src/main/res/raw-eu/nfc_beam_share.html11
-rw-r--r--OpenKeychain/src/main/res/raw-fi/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-fi/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-fi/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_changelog.html12
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_wot.html8
-rw-r--r--OpenKeychain/src/main/res/raw-is/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-is/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-is/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_changelog.html24
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-it/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_changelog.html6
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_wot.html4
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_about.html14
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_changelog.html270
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_nfc_beam.html8
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_start.html6
-rw-r--r--OpenKeychain/src/main/res/raw-nl/help_wot.html14
-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-pl/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-pt/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-pt/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-pt/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_about.html57
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_changelog.html232
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_nfc_beam.html12
-rw-r--r--OpenKeychain/src/main/res/raw-ro/help_start.html19
-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_changelog.html276
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_nfc_beam.html2
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_start.html4
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sr/help_changelog.html4
-rw-r--r--OpenKeychain/src/main/res/raw-sr/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sr/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_changelog.html58
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_nfc_beam.html8
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_start.html8
-rw-r--r--OpenKeychain/src/main/res/raw-sv/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-sv/nfc_beam_share.html8
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_about.html24
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.html18
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh-rTW/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_changelog.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_wot.html2
-rw-r--r--OpenKeychain/src/main/res/raw/help_start.html2
-rw-r--r--OpenKeychain/src/main/res/values-bg/strings.xml69
-rw-r--r--OpenKeychain/src/main/res/values-cs/strings.xml90
-rw-r--r--OpenKeychain/src/main/res/values-de/strings.xml333
-rw-r--r--OpenKeychain/src/main/res/values-es/strings.xml317
-rw-r--r--OpenKeychain/src/main/res/values-et/strings.xml15
-rw-r--r--OpenKeychain/src/main/res/values-eu/strings.xml69
-rw-r--r--OpenKeychain/src/main/res/values-fi/strings.xml190
-rw-r--r--OpenKeychain/src/main/res/values-fr/strings.xml337
-rw-r--r--OpenKeychain/src/main/res/values-is/strings.xml12
-rw-r--r--OpenKeychain/src/main/res/values-it/strings.xml66
-rw-r--r--OpenKeychain/src/main/res/values-ja/strings.xml328
-rw-r--r--OpenKeychain/src/main/res/values-large/dimens.xml1
-rw-r--r--OpenKeychain/src/main/res/values-nl/strings.xml902
-rw-r--r--OpenKeychain/src/main/res/values-pl/strings.xml106
-rw-r--r--OpenKeychain/src/main/res/values-pt/strings.xml12
-rw-r--r--OpenKeychain/src/main/res/values-ro/strings.xml69
-rw-r--r--OpenKeychain/src/main/res/values-ru/strings.xml403
-rw-r--r--OpenKeychain/src/main/res/values-sl/strings.xml37
-rw-r--r--OpenKeychain/src/main/res/values-sr/strings.xml246
-rw-r--r--OpenKeychain/src/main/res/values-sv/strings.xml268
-rw-r--r--OpenKeychain/src/main/res/values-tr/strings.xml257
-rw-r--r--OpenKeychain/src/main/res/values-uk/strings.xml135
-rw-r--r--OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml35
-rw-r--r--OpenKeychain/src/main/res/values-v11/themes_keychaintheme.xml32
-rw-r--r--OpenKeychain/src/main/res/values-v21/dimens.xml11
-rw-r--r--OpenKeychain/src/main/res/values-v21/themes.xml15
-rw-r--r--OpenKeychain/src/main/res/values-zh-rTW/strings.xml251
-rw-r--r--OpenKeychain/src/main/res/values-zh/strings.xml16
-rw-r--r--OpenKeychain/src/main/res/values/attr.xml9
-rw-r--r--OpenKeychain/src/main/res/values/colors.xml63
-rw-r--r--OpenKeychain/src/main/res/values/dimens.xml6
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml184
-rw-r--r--OpenKeychain/src/main/res/values/styles.xml32
-rw-r--r--OpenKeychain/src/main/res/values/themes.xml52
-rw-r--r--OpenKeychain/src/main/res/xml/preference_headers.xml4
-rw-r--r--OpenKeychain/src/main/res/xml/preference_headers_legacy.xml12
860 files changed, 15723 insertions, 9738 deletions
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index ff04420d4..efe4b8926 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -31,10 +31,7 @@
For OI Filemanager it makes no difference, gpg files can't be associated
-->
- <!-- Specified in build.gradle -->
- <!--<uses-sdk-->
- <!--android:minSdkVersion="9"-->
- <!--android:targetSdkVersion="19" />-->
+ <!-- SDK levels are specified in build.gradle -->
<uses-feature
android:name="android.hardware.wifi"
@@ -70,15 +67,17 @@
<uses-permission android:name="android.permission.READ_PROFILE" />
<!-- android:allowBackup="false": Don't allow backup over adb backup or other apps! -->
+ <!-- tools:replace="android:allowBackup" is a workaround for https://github.com/geftimov/android-patternview/pull/2 -->
<application
android:name=".KeychainApplication"
+ tools:replace="android:allowBackup"
android:allowBackup="false"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:theme="@style/KeychainTheme"
android:label="@string/app_name">
<activity
- android:name=".ui.KeyListActivity"
+ android:name=".ui.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/app_name"
android:launchMode="singleTop">
@@ -96,33 +95,33 @@
<activity
android:name=".ui.CreateKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:windowSoftInputMode="stateHidden"
+ android:windowSoftInputMode="stateHidden|adjustResize"
android:label="@string/title_create_key"
- android:parentActivityName=".ui.KeyListActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".ui.EditKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_edit_key" />
+ <!-- NOTE: Dont use configChanges for QR Code view! We use a different layout for landscape -->
<activity
android:name=".ui.linked.LinkedIdWizard"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_linked_create" />
<activity
android:name=".ui.QrCodeViewActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/share_qr_code_dialog_title" />
<activity
android:name=".ui.ViewKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_key_details"
- android:parentActivityName=".ui.KeyListActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
@@ -143,21 +142,20 @@
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_exchange_keys"
android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.KeyListActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
- android:name=".ui.SelectPublicKeyActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_select_recipients"
- android:launchMode="singleTop" />
- <activity
android:name=".ui.EncryptFilesActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_encrypt_files"
- android:windowSoftInputMode="stateHidden">
+ android:windowSoftInputMode="stateHidden"
+ android:parentActivityName=".ui.MainActivity">
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".ui.MainActivity" />
<!-- Keychain's own Actions -->
<!-- ENCRYPT with data Uri -->
@@ -186,7 +184,11 @@
android:name=".ui.EncryptTextActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_encrypt_text"
- android:windowSoftInputMode="stateHidden">
+ android:windowSoftInputMode="stateHidden"
+ android:parentActivityName=".ui.MainActivity">
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".ui.MainActivity" />
<!-- Keychain's own Actions -->
<!-- ENCRYPT with text as extra -->
@@ -206,19 +208,14 @@
</intent-filter>
</activity>
<activity
- android:name=".ui.DecryptActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_decrypt"
- android:windowSoftInputMode="stateHidden" />
- <activity
android:name=".ui.DecryptTextActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_decrypt"
android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.DecryptActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.DecryptActivity" />
+ android:value=".ui.MainActivity" />
<!-- Keychain's own Actions -->
<!-- DECRYPT with text as extra -->
@@ -242,10 +239,10 @@
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_decrypt"
android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.DecryptActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.DecryptActivity" />
+ android:value=".ui.MainActivity" />
<!-- VIEW with mimeType application/octet-stream, application/pgp and text/pgp -->
<intent-filter android:label="@string/intent_send_decrypt">
@@ -420,12 +417,11 @@
android:value=".ui.ViewKeyActivity" />
</activity>
<activity
- android:name=".ui.ViewKeyAdvancedActivity"
+ android:name=".ui.ViewKeyAdvActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_advanced_key_info">
- </activity>
+ android:label="@string/title_advanced_key_info"/>
<activity
- android:name=".ui.PreferencesActivity"
+ android:name=".ui.SettingsActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_preferences">
<intent-filter>
@@ -438,7 +434,7 @@
</intent-filter>
</activity>
<activity
- android:name=".ui.PreferencesKeyServerActivity"
+ android:name=".ui.SettingsKeyServerActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_key_server_preference"
android:windowSoftInputMode="stateHidden" />
@@ -448,10 +444,18 @@
android:label="@string/title_certify_key">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
+ </activity>
+ <activity
+ android:name=".ui.CertifyFingerprintActivity"
+ android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
+ android:label="@string/title_certify_key">
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".ui.MainActivity" />
</activity>
<activity
- android:name=".ui.QrCodeScanActivity"
+ android:name=".ui.ImportKeysProxyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoDisplay"
@@ -478,6 +482,14 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
+ <!-- NFC: Handle NFC tags detected from outside our application -->
+ <intent-filter>
+ <action android:name="android.nfc.action.NDEF_DISCOVERED" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ <!-- MIME type as defined in http://tools.ietf.org/html/rfc3156 -->
+ <data android:mimeType="application/pgp-keys" />
+ </intent-filter>
</activity>
<activity
@@ -502,14 +514,6 @@
-->
<data android:mimeType="text/plain" />
</intent-filter>
- <!-- NFC: Handle NFC tags detected from outside our application -->
- <intent-filter>
- <action android:name="android.nfc.action.NDEF_DISCOVERED" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <!-- MIME type as defined in http://tools.ietf.org/html/rfc3156 -->
- <data android:mimeType="application/pgp-keys" />
- </intent-filter>
<!-- VIEW with file endings: *.gpg (e.g. to import from OI File Manager) -->
<intent-filter android:label="@string/intent_import_key">
<action android:name="android.intent.action.VIEW" />
@@ -655,7 +659,7 @@
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".ui.ConsolidateDialogActivity"
@@ -663,14 +667,7 @@
<activity
android:name=".ui.PassphraseDialogActivity"
android:theme="@android:style/Theme.NoDisplay" />
- <activity
- android:name="com.haibison.android.lockpattern.LockPatternActivity"
- android:label="@string/title_unlock"
- android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
- android:screenOrientation="user"
- android:theme="@style/Alp.42447968.Theme.Dialog.Light" />
- <activity
- android:name=".ui.PassphraseWizardActivity" />
+ <activity android:name=".ui.PassphraseWizardActivity" />
<!--
NOTE: singleTop is set to get NFC foreground dispatch to work.
Then, all NFC intents will be broadcasted to onNewIntent() of this activity!
@@ -721,18 +718,13 @@
android:launchMode="singleTop"
android:process=":remote_api" />
<activity
- android:name=".remote.ui.AppsListActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:exported="false"
- android:label="@string/title_api_registered_apps" />
- <activity
android:name=".remote.ui.AppSettingsActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:exported="false">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".remote.ui.AppsListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".remote.ui.AccountSettingsActivity"
diff --git a/OpenKeychain/src/main/java/android/support/v4/widget/FixedDrawerLayout.java b/OpenKeychain/src/main/java/android/support/v4/widget/FixedDrawerLayout.java
deleted file mode 100644
index 6924e0b06..000000000
--- a/OpenKeychain/src/main/java/android/support/v4/widget/FixedDrawerLayout.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.widget;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-
-/**
- * Fix for NullPointerException at android.support.v4.widget.DrawerLayout.isContentView(DrawerLayout.java:840)
- * <p/>
- * http://stackoverflow.com/a/18107942
- */
-public class FixedDrawerLayout extends DrawerLayout {
- public FixedDrawerLayout(Context context) {
- super(context);
- }
-
- public FixedDrawerLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public FixedDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- @Override
- boolean isContentView(View child) {
- if (child == null) {
- return false;
- }
- return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY;
- }
-}
diff --git a/OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragment.java b/OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragment.java
deleted file mode 100644
index 318a7c2e5..000000000
--- a/OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragment.java
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-package com.haibison.android.lockpattern;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.haibison.android.lockpattern.widget.LockPatternUtils;
-import com.haibison.android.lockpattern.widget.LockPatternView;
-
-
-public class LockPatternFragment extends Fragment {
- public static final String NUMBER_OF_MEASUREMENTS = "number_of_measurements";
- public static final String PATTERN_STRING = "pattern_string";
-
- private String mPatternString;
- private LockPatternView.OnPatternListener mEvents;
-
- public static LockPatternFragment newInstance(String pattern) {
- LockPatternFragment fragment = new LockPatternFragment();
- Bundle args = new Bundle();
- args.putString(PATTERN_STRING, pattern);
- fragment.setArguments(args);
- return fragment;
- }
-
- public LockPatternFragment() {
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- mEvents = (LockPatternView.OnPatternListener) activity;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- // Get the number of measurements from the bundle, or load the default:
- mPatternString = getArguments().getString(PATTERN_STRING);
-
- View rootView = inflater.inflate(R.layout.alp_42447968_lock_pattern_activity, container, false);
-
- final LockPatternView lpv = (LockPatternView) rootView.findViewById(R.id.alp_42447968_view_lock_pattern);
- lpv.setPattern(LockPatternView.DisplayMode.Correct, LockPatternUtils.stringToPattern(mPatternString));
-
- lpv.setOnPatternListener(mEvents);
-
- return rootView;
- }
-}
diff --git a/OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragmentOld.java b/OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragmentOld.java
deleted file mode 100644
index 439cf3562..000000000
--- a/OpenKeychain/src/main/java/com/haibison/android/lockpattern/LockPatternFragmentOld.java
+++ /dev/null
@@ -1,926 +0,0 @@
-/*
- * Copyright 2012 Hai Bison
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use getActivity() file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.haibison.android.lockpattern;
-
-import android.app.Activity;
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.haibison.android.lockpattern.util.IEncrypter;
-import com.haibison.android.lockpattern.util.InvalidEncrypterException;
-import com.haibison.android.lockpattern.util.LoadingDialog;
-import com.haibison.android.lockpattern.util.Settings;
-import com.haibison.android.lockpattern.util.UI;
-import com.haibison.android.lockpattern.widget.LockPatternUtils;
-import com.haibison.android.lockpattern.widget.LockPatternView;
-import com.haibison.android.lockpattern.widget.LockPatternView.Cell;
-import com.haibison.android.lockpattern.widget.LockPatternView.DisplayMode;
-
-import org.sufficientlysecure.keychain.ui.PassphraseWizardActivity;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static com.haibison.android.lockpattern.util.Settings.Display.METADATA_CAPTCHA_WIRED_DOTS;
-import static com.haibison.android.lockpattern.util.Settings.Display.METADATA_MAX_RETRIES;
-import static com.haibison.android.lockpattern.util.Settings.Display.METADATA_MIN_WIRED_DOTS;
-import static com.haibison.android.lockpattern.util.Settings.Display.METADATA_STEALTH_MODE;
-import static com.haibison.android.lockpattern.util.Settings.Security.METADATA_AUTO_SAVE_PATTERN;
-import static com.haibison.android.lockpattern.util.Settings.Security.METADATA_ENCRYPTER_CLASS;
-
-/**
- * Main activity for getActivity() library.
- * <p>
- * You can deliver result to {@link android.app.PendingIntent}'s and/ or
- * {@link android.os.ResultReceiver} too. See {@link #EXTRA_PENDING_INTENT_OK},
- * {@link #EXTRA_PENDING_INTENT_CANCELLED} and {@link #EXTRA_RESULT_RECEIVER}
- * for more details.
- * </p>
- *
- * <h1>NOTES</h1>
- * <ul>
- * <li>
- * You must use one of built-in actions when calling getActivity() activity. They start
- * with {@code ACTION_*}. Otherwise the library might behave strangely (we don't
- * cover those cases).</li>
- * <li>You must use one of the themes that getActivity() library supports. They start
- * with {@code R.style.Alp_42447968_Theme_*}. The reason is the themes contain
- * resources that the library needs.</li>
- * <li>With {@link #ACTION_COMPARE_PATTERN}, there are <b><i>4 possible result
- * codes</i></b>: {@link android.app.Activity#RESULT_OK}, {@link android.app.Activity#RESULT_CANCELED},
- * {@link #RESULT_FAILED} and {@link #RESULT_FORGOT_PATTERN}.</li>
- * <li>With {@link #ACTION_VERIFY_CAPTCHA}, there are <b><i>3 possible result
- * codes</i></b>: {@link android.app.Activity#RESULT_OK}, {@link android.app.Activity#RESULT_CANCELED},
- * and {@link #RESULT_FAILED}.</li>
- * </ul>
- *
- * @author Hai Bison
- * @since v1.0
- */
-public class LockPatternFragmentOld extends Fragment {
-
- private static final String CLASSNAME = LockPatternFragmentOld.class.getName();
-
- public static final String ACTION_CREATE_PATTERN = "create";
-
- /**
- * Use getSelectedMethod() to compare pattern. You provide the pattern to be
- * compared with {@link #EXTRA_PATTERN}.
- * <p/>
- * If you enabled feature auto-save pattern before (with
- * {@link com.haibison.android.lockpattern.util.Settings.Security#setAutoSavePattern(android.content.Context, boolean)} ),
- * then you don't need {@link #EXTRA_PATTERN} at getActivity() time.
- * <p/>
- * You can use {@link #EXTRA_PENDING_INTENT_FORGOT_PATTERN} to help your
- * users in case they forgot the patterns.
- * <p/>
- * If the user passes, {@link android.app.Activity#RESULT_OK} returns. If not,
- * {@link #RESULT_FAILED} returns.
- * <p/>
- * If the user cancels the task, {@link android.app.Activity#RESULT_CANCELED} returns.
- * <p/>
- * In any case, there will have extra {@link #EXTRA_RETRY_COUNT} available
- * in the intent result.
- *
- * @see #EXTRA_PATTERN
- * @see #EXTRA_PENDING_INTENT_OK
- * @see #EXTRA_PENDING_INTENT_CANCELLED
- * @see #RESULT_FAILED
- * @see #EXTRA_RETRY_COUNT
- * @since v2.4 beta
- */
- public static final String ACTION_COMPARE_PATTERN = "authenticate";//CLASSNAME + ".compare_pattern";
-
- /**
- * Use getActivity() action to let the activity generate a random pattern and ask the
- * user to re-draw it to verify.
- * <p/>
- * The default length of the auto-generated pattern is {@code 4}. You can
- * change it with
- * {@link com.haibison.android.lockpattern.util.Settings.Display#setCaptchaWiredDots(android.content.Context, int)}.
- *
- * @since v2.7 beta
- */
- public static final String ACTION_VERIFY_CAPTCHA = CLASSNAME + ".verify_captcha";
-
- /**
- * If you use {@link #ACTION_COMPARE_PATTERN} and the user fails to "login"
- * after a number of tries, getActivity() activity will finish with getActivity() result code.
- *
- * @see #ACTION_COMPARE_PATTERN
- * @see #EXTRA_RETRY_COUNT
- */
- public final int RESULT_FAILED = Activity.RESULT_FIRST_USER + 1;
-
- /**
- * If you use {@link #ACTION_COMPARE_PATTERN} and the user forgot his/ her
- * pattern and decided to ask for your help with recovering the pattern (
- * {@link #EXTRA_PENDING_INTENT_FORGOT_PATTERN}), getActivity() activity will finish
- * with getActivity() result code.
- *
- * @see #ACTION_COMPARE_PATTERN
- * @see #EXTRA_RETRY_COUNT
- * @see #EXTRA_PENDING_INTENT_FORGOT_PATTERN
- * @since v2.8 beta
- */
- public static final int RESULT_FORGOT_PATTERN = Activity.RESULT_FIRST_USER + 2;
-
- /**
- * For actions {@link #ACTION_COMPARE_PATTERN} and
- * {@link #ACTION_VERIFY_CAPTCHA}, getActivity() key holds the number of tries that
- * the user attempted to verify the input pattern.
- */
- public static final String EXTRA_RETRY_COUNT = CLASSNAME + ".retry_count";
-
- /**
- * Sets value of getActivity() key to a theme in {@code R.style.Alp_42447968_Theme_*}
- * . Default is the one you set in your {@code AndroidManifest.xml}. Note
- * that theme {@link R.style#Alp_42447968_Theme_Light_DarkActionBar} is
- * available in API 4+, but it only works in API 14+.
- *
- * @since v1.5.3 beta
- */
- public static final String EXTRA_THEME = CLASSNAME + ".theme";
-
- /**
- * Key to hold the pattern. It must be a {@code char[]} array.
- * <p/>
- * <ul>
- * <li>If you use encrypter, it should be an encrypted array.</li>
- * <li>If you don't use encrypter, it should be the SHA-1 value of the
- * actual pattern. You can generate the value by
- * {@link com.haibison.android.lockpattern.widget.LockPatternUtils#patternToSha1(java.util.List)}.</li>
- * </ul>
- *
- * @since v2 beta
- */
- public static final String EXTRA_PATTERN = CLASSNAME + ".pattern";
-
- /**
- * You can provide an {@link android.os.ResultReceiver} with getActivity() key. The activity
- * will notify your receiver the same result code and intent data as you
- * will receive them in {@link #onActivityResult(int, int, android.content.Intent)}.
- *
- * @since v2.4 beta
- */
- public static final String EXTRA_RESULT_RECEIVER = CLASSNAME
- + ".result_receiver";
-
- /**
- * Put a {@link android.app.PendingIntent} into getActivity() key. It will be sent before
- * {@link android.app.Activity#RESULT_OK} will be returning. If you were calling getActivity()
- * activity with {@link #ACTION_CREATE_PATTERN}, key {@link #EXTRA_PATTERN}
- * will be attached to the original intent which the pending intent holds.
- *
- * <h1>Notes</h1>
- * <ul>
- * <li>If you're going to use an activity, you don't need
- * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} for the intent, since the library
- * will call it inside {@link LockPatternFragmentOld} .</li>
- * </ul>
- */
- public static final String EXTRA_PENDING_INTENT_OK = CLASSNAME
- + ".pending_intent_ok";
-
- /**
- * Put a {@link android.app.PendingIntent} into getActivity() key. It will be sent before
- * {@link android.app.Activity#RESULT_CANCELED} will be returning.
- *
- * <h1>Notes</h1>
- * <ul>
- * <li>If you're going to use an activity, you don't need
- * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} for the intent, since the library
- * will call it inside {@link LockPatternFragmentOld} .</li>
- * </ul>
- */
- public static final String EXTRA_PENDING_INTENT_CANCELLED = CLASSNAME
- + ".pending_intent_cancelled";
-
- /**
- * You put a {@link android.app.PendingIntent} into getActivity() extra. The library will show a
- * button <i>"Forgot pattern?"</i> and call your intent later when the user
- * taps it.
- * <p/>
- * <h1>Notes</h1>
- * <ul>
- * <li>If you use an activity, you don't need
- * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} for the intent, since the library
- * will call it inside {@link LockPatternFragmentOld} .</li>
- * <li>{@link LockPatternFragmentOld} will finish with
- * {@link #RESULT_FORGOT_PATTERN} <i><b>after</b> making a call</i> to start
- * your pending intent.</li>
- * <li>It is your responsibility to make sure the Intent is good. The
- * library doesn't cover any errors when calling your intent.</li>
- * </ul>
- *
- * @see #ACTION_COMPARE_PATTERN
- * @since v2.8 beta
- */
- public static final String EXTRA_PENDING_INTENT_FORGOT_PATTERN = CLASSNAME
- + ".pending_intent_forgot_pattern";
-
- /**
- * Helper enum for button OK commands. (Because we use only one "OK" button
- * for different commands).
- *
- * @author Hai Bison
- */
- private static enum ButtonOkCommand {
- CONTINUE,DONE
- }// ButtonOkCommand
-
- /**
- * Delay time to reload the lock pattern view after a wrong pattern.
- */
- private static final long DELAY_TIME_TO_RELOAD_LOCK_PATTERN_VIEW = DateUtils.SECOND_IN_MILLIS;
-
- /*
- * FIELDS
- */
- private int mMaxRetries, mMinWiredDots, mRetryCount = 0, mCaptchaWiredDots;
- private boolean mAutoSave, mStealthMode;
- private IEncrypter mEncrypter;
- private ButtonOkCommand mBtnOkCmd;
- private Intent mIntentResult;
-
- /*
- * CONTROLS
- */
- private TextView mTextInfo;
- private LockPatternView mLockPatternView;
- private Button mBtnConfirm;
-
- /*
- * FRAGMENTS
- */
- private FragmentActivity fa;
-
- /**
- * Called when the activity is first created.
- */
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-
- fa = getActivity();
-
- /*
- * EXTRA_THEME
- */
- if (fa.getIntent().hasExtra(EXTRA_THEME))
- fa.setTheme(fa.getIntent().getIntExtra(EXTRA_THEME,
- R.style.Alp_42447968_Theme_Dark));
- View view = inflater.inflate(R.layout.alp_42447968_lock_pattern_activity, container, false);
- loadSettings();
-
- mIntentResult = new Intent();
- fa.setResult(Activity.RESULT_CANCELED, mIntentResult);
- initContentView(view);
- return view;
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- }
-
- /**
- * Loads settings, either from manifest or {@link com.haibison.android.lockpattern.util.Settings}.
- */
- private void loadSettings() {
- Bundle metaData = null;
- try {
- metaData = fa.getPackageManager().getActivityInfo(fa.getComponentName(),
- PackageManager.GET_META_DATA).metaData;
- } catch (NameNotFoundException e) {
- /*
- * Never catch getActivity().
- */
- e.printStackTrace();
- }
-
- if (metaData != null && metaData.containsKey(METADATA_MIN_WIRED_DOTS))
- mMinWiredDots = Settings.Display.validateMinWiredDots(getActivity(),
- metaData.getInt(METADATA_MIN_WIRED_DOTS));
- else
- mMinWiredDots = Settings.Display.getMinWiredDots(getActivity());
-
- if (metaData != null && metaData.containsKey(METADATA_MAX_RETRIES))
- mMaxRetries = Settings.Display.validateMaxRetries(getActivity(),
- metaData.getInt(METADATA_MAX_RETRIES));
- else
- mMaxRetries = Settings.Display.getMaxRetries(getActivity());
-
- if (metaData != null
- && metaData.containsKey(METADATA_AUTO_SAVE_PATTERN))
- mAutoSave = metaData.getBoolean(METADATA_AUTO_SAVE_PATTERN);
- else
- mAutoSave = Settings.Security.isAutoSavePattern(getActivity());
-
- if (metaData != null
- && metaData.containsKey(METADATA_CAPTCHA_WIRED_DOTS))
- mCaptchaWiredDots = Settings.Display.validateCaptchaWiredDots(getActivity(),
- metaData.getInt(METADATA_CAPTCHA_WIRED_DOTS));
- else
- mCaptchaWiredDots = Settings.Display.getCaptchaWiredDots(getActivity());
-
- if (metaData != null && metaData.containsKey(METADATA_STEALTH_MODE))
- mStealthMode = metaData.getBoolean(METADATA_STEALTH_MODE);
- else
- mStealthMode = Settings.Display.isStealthMode(getActivity());
-
- /*
- * Encrypter.
- */
- char[] encrypterClass;
- if (metaData != null && metaData.containsKey(METADATA_ENCRYPTER_CLASS))
- encrypterClass = metaData.getString(METADATA_ENCRYPTER_CLASS)
- .toCharArray();
- else
- encrypterClass = Settings.Security.getEncrypterClass(getActivity());
-
- if (encrypterClass != null) {
- try {
- mEncrypter = (IEncrypter) Class.forName(
- new String(encrypterClass), false, fa.getClassLoader())
- .newInstance();
- } catch (Throwable t) {
- throw new InvalidEncrypterException();
- }
- }
- }
-
- /**
- * Initializes UI...
- */
- private void initContentView(View view) {
-
- /*
- * Save all controls' state to restore later.
- */
- CharSequence infoText = mTextInfo != null ? mTextInfo.getText() : null;
- Boolean btnOkEnabled = mBtnConfirm != null ? mBtnConfirm.isEnabled()
- : null;
- DisplayMode lastDisplayMode = mLockPatternView != null ? mLockPatternView
- .getDisplayMode() : null;
- List<Cell> lastPattern = mLockPatternView != null ? mLockPatternView
- .getPattern() : null;
-
- UI.adjustDialogSizeForLargeScreens(fa.getWindow());
-
- View mFooter;
- Button mBtnCancel;
-
- mTextInfo = (TextView) view.findViewById(R.id.alp_42447968_textview_info);
- mLockPatternView = (LockPatternView) view.findViewById(R.id.alp_42447968_view_lock_pattern);
-
- mFooter = view.findViewById(R.id.alp_42447968_viewgroup_footer);
- mBtnCancel = (Button) view.findViewById(R.id.alp_42447968_button_cancel);
- mBtnConfirm = (Button) view.findViewById(R.id.alp_42447968_button_confirm);
-
- /*
- * LOCK PATTERN VIEW
- */
-
- switch (getResources().getConfiguration().screenLayout
- & Configuration.SCREENLAYOUT_SIZE_MASK) {
- case Configuration.SCREENLAYOUT_SIZE_LARGE:
- case Configuration.SCREENLAYOUT_SIZE_XLARGE: {
- final int size = getResources().getDimensionPixelSize(
- R.dimen.alp_42447968_lockpatternview_size);
- LayoutParams lp = mLockPatternView.getLayoutParams();
- lp.width = size;
- lp.height = size;
- mLockPatternView.setLayoutParams(lp);
-
- break;
- }
- }
-
- /*
- * Haptic feedback.
- */
- boolean hapticFeedbackEnabled = false;
- try {
- hapticFeedbackEnabled = android.provider.Settings.System
- .getInt(fa.getContentResolver(),
- android.provider.Settings.System.HAPTIC_FEEDBACK_ENABLED,
- 0) != 0;
- } catch (Throwable t) {
- /*
- * Ignore it.
- */
- }
- mLockPatternView.setTactileFeedbackEnabled(hapticFeedbackEnabled);
-
- mLockPatternView.setInStealthMode(mStealthMode
- && !ACTION_VERIFY_CAPTCHA.equals(fa.getIntent().getAction()));
- mLockPatternView.setOnPatternListener(mLockPatternViewListener);
- if (lastPattern != null && lastDisplayMode != null
- && !ACTION_VERIFY_CAPTCHA.equals(fa.getIntent().getAction()))
- mLockPatternView.setPattern(lastDisplayMode, lastPattern);
- /*
- * COMMAND BUTTONS
- */
-
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod())) {
- mBtnCancel.setOnClickListener(mBtnCancelOnClickListener);
- mBtnConfirm.setOnClickListener(mBtnConfirmOnClickListener);
-
- mBtnCancel.setVisibility(View.VISIBLE);
- mFooter.setVisibility(View.VISIBLE);
- mTextInfo.setVisibility(View.VISIBLE);
- if (infoText != null)
- mTextInfo.setText(infoText);
- else
- mTextInfo //TODO nfc text glaube ich hier oder so
- .setText(R.string.alp_42447968_msg_draw_an_unlock_pattern);
-
- /*
- * BUTTON OK
- */
- if (mBtnOkCmd == null)
- mBtnOkCmd = ButtonOkCommand.CONTINUE;
- switch (mBtnOkCmd) {
- case CONTINUE:
- mBtnConfirm.setText(R.string.alp_42447968_cmd_continue);
- break;
- case DONE:
- mBtnConfirm.setText(R.string.alp_42447968_cmd_confirm);
- break;
- default:
- break;
- }
- if (btnOkEnabled != null)
- mBtnConfirm.setEnabled(btnOkEnabled);
- }
- else if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- if (TextUtils.isEmpty(infoText))
- mTextInfo
- .setText(R.string.alp_42447968_msg_draw_pattern_to_unlock);
- else
- mTextInfo.setText(infoText);
- if (fa.getIntent().hasExtra(EXTRA_PENDING_INTENT_FORGOT_PATTERN)) {
- mBtnConfirm.setOnClickListener(mBtnConfirmOnClickListener);
- mBtnConfirm.setText(R.string.alp_42447968_cmd_forgot_pattern);
- mBtnConfirm.setEnabled(true);
- mFooter.setVisibility(View.VISIBLE);
- }
- }
- else if (ACTION_VERIFY_CAPTCHA.equals(fa.getIntent().getAction())) {
- mTextInfo
- .setText(R.string.alp_42447968_msg_redraw_pattern_to_confirm);
-
- /*
- * NOTE: EXTRA_PATTERN should hold a char[] array. In getActivity() case we
- * use it as a temporary variable to hold a list of Cell.
- */
-
- final ArrayList<Cell> pattern;
- if (fa.getIntent().hasExtra(EXTRA_PATTERN))
- pattern = fa.getIntent()
- .getParcelableArrayListExtra(EXTRA_PATTERN);
- else
- fa.getIntent().putParcelableArrayListExtra(
- EXTRA_PATTERN,
- pattern = LockPatternUtils
- .genCaptchaPattern(mCaptchaWiredDots));
-
- mLockPatternView.setPattern(DisplayMode.Animate, pattern);
- }
- }
-
- /**
- * Compares {@code pattern} to the given pattern (
- * {@link #ACTION_COMPARE_PATTERN}) or to the generated "CAPTCHA" pattern (
- * {@link #ACTION_VERIFY_CAPTCHA}). Then finishes the activity if they
- * match.
- *
- * @param pattern
- * the pattern to be compared.
- */
- private void doComparePattern(final List<Cell> pattern) {
- if (pattern == null)
- return;
-
- /*
- * Use a LoadingDialog because decrypting pattern might take time...
- */
- new LoadingDialog<Void, Void, Boolean>(getActivity(), false) {
-
- @Override
- protected Boolean doInBackground(Void... params) {
- if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- char[] currentPattern = PassphraseWizardActivity.pattern;
- if (currentPattern == null)
- currentPattern = Settings.Security
- .getPattern(getActivity());
- if (currentPattern != null) {
- if (mEncrypter != null) {
- return pattern.equals(mEncrypter.decrypt(
- getActivity(), currentPattern));
- } else
- return Arrays.equals(currentPattern,
- LockPatternUtils.patternToSha1(pattern)
- .toCharArray());
- }
- }
- else if (ACTION_VERIFY_CAPTCHA.equals(fa.getIntent().getAction())) {
- return pattern.equals(fa.getIntent()
- .getParcelableArrayListExtra(EXTRA_PATTERN));
- }
- return false;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- if (result) {
- Toast.makeText(getActivity(), "unlocked", Toast.LENGTH_SHORT).show();
- finishWithResultOk(null);
- }else {
- mRetryCount++;
- mIntentResult.putExtra(EXTRA_RETRY_COUNT, mRetryCount);
-
- if (mRetryCount >= mMaxRetries)
- finishWithNegativeResult(RESULT_FAILED);
- else {
- mLockPatternView.setDisplayMode(DisplayMode.Wrong);
- mTextInfo.setText(R.string.alp_42447968_msg_try_again);
- mLockPatternView.postDelayed(mLockPatternViewReloader,
- DELAY_TIME_TO_RELOAD_LOCK_PATTERN_VIEW);
- }
- }
- }
-
- }.execute();
- }
-
- /**
- * Checks and creates the pattern.
- *
- * @param pattern
- * the current pattern of lock pattern view.
- */
- private void doCheckAndCreatePattern(final List<Cell> pattern) {
- if (pattern.size() < mMinWiredDots) {
- mLockPatternView.setDisplayMode(DisplayMode.Wrong);
- mTextInfo.setText(getResources().getQuantityString(
- R.plurals.alp_42447968_pmsg_connect_x_dots, mMinWiredDots,
- mMinWiredDots));
- mLockPatternView.postDelayed(mLockPatternViewReloader,
- DELAY_TIME_TO_RELOAD_LOCK_PATTERN_VIEW);
- return;
- }
-
- if (fa.getIntent().hasExtra(EXTRA_PATTERN)) {
- /*
- * Use a LoadingDialog because decrypting pattern might take time...
- */
- new LoadingDialog<Void, Void, Boolean>(getActivity(), false) {
-
- @Override
- protected Boolean doInBackground(Void... params) {
- if (mEncrypter != null)
- return pattern.equals(mEncrypter.decrypt(
- getActivity(), fa.getIntent()
- .getCharArrayExtra(EXTRA_PATTERN)));
- else
- return Arrays.equals(
- fa.getIntent().getCharArrayExtra(EXTRA_PATTERN),
- LockPatternUtils.patternToSha1(pattern)
- .toCharArray());
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
-
- if (result) {
- mTextInfo
- .setText(R.string.alp_42447968_msg_your_new_unlock_pattern);
- mBtnConfirm.setEnabled(true);
- PassphraseWizardActivity.pattern = fa.getIntent()
- .getCharArrayExtra(EXTRA_PATTERN);
- } else {
- mTextInfo
- .setText(R.string.alp_42447968_msg_redraw_pattern_to_confirm);
- mBtnConfirm.setEnabled(false);
- mLockPatternView.setDisplayMode(DisplayMode.Wrong);
- mLockPatternView.postDelayed(mLockPatternViewReloader,
- DELAY_TIME_TO_RELOAD_LOCK_PATTERN_VIEW);
- }
- }
- }.execute();
- } else {
- /*
- * Use a LoadingDialog because encrypting pattern might take time...
- */
- new LoadingDialog<Void, Void, char[]>(getActivity(), false) {
-
- @Override
- protected char[] doInBackground(Void... params) {
- return mEncrypter != null ? mEncrypter.encrypt(
- getActivity(), pattern)
- : LockPatternUtils.patternToSha1(pattern)
- .toCharArray();
- }
-
- @Override
- protected void onPostExecute(char[] result) {
- super.onPostExecute(result);
-
- fa.getIntent().putExtra(EXTRA_PATTERN, result);
- mTextInfo
- .setText(R.string.alp_42447968_msg_pattern_recorded);
- mBtnConfirm.setEnabled(true);
- }
-
- }.execute();
- }
- }
-
- /**
- * Finishes activity with {@link android.app.Activity#RESULT_OK}.
- *
- * @param pattern
- * the pattern, if getActivity() is in mode creating pattern. In any
- * cases, it can be set to {@code null}.
- */
- private void finishWithResultOk(char[] pattern) {
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod()))
- mIntentResult.putExtra(EXTRA_PATTERN, pattern);
- else {
- /*
- * If the user was "logging in", minimum try count can not be zero.
- */
- mIntentResult.putExtra(EXTRA_RETRY_COUNT, mRetryCount + 1);
- }
-
- fa.setResult(fa.RESULT_OK, mIntentResult);
-
- /*
- * ResultReceiver
- */
- ResultReceiver receiver = fa.getIntent().getParcelableExtra(
- EXTRA_RESULT_RECEIVER);
- if (receiver != null) {
- Bundle bundle = new Bundle();
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod()))
- bundle.putCharArray(EXTRA_PATTERN, pattern);
- else {
- /*
- * If the user was "logging in", minimum try count can not be
- * zero.
- */
- bundle.putInt(EXTRA_RETRY_COUNT, mRetryCount + 1);
- }
- receiver.send(fa.RESULT_OK, bundle);
- }
-
- /*
- * PendingIntent
- */
- PendingIntent pi = fa.getIntent().getParcelableExtra(
- EXTRA_PENDING_INTENT_OK);
- if (pi != null) {
- try {
- pi.send(getActivity(), fa.RESULT_OK, mIntentResult);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- fa.finish();
- }
-
- /**
- * Finishes the activity with negative result (
- * {@link android.app.Activity#RESULT_CANCELED}, {@link #RESULT_FAILED} or
- * {@link #RESULT_FORGOT_PATTERN}).
- */
- private void finishWithNegativeResult(int resultCode) {
- if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod()))
- mIntentResult.putExtra(EXTRA_RETRY_COUNT, mRetryCount);
-
- fa.setResult(resultCode, mIntentResult);
-
- /*
- * ResultReceiver
- */
- ResultReceiver receiver = fa.getIntent().getParcelableExtra(
- EXTRA_RESULT_RECEIVER);
- if (receiver != null) {
- Bundle resultBundle = null;
- if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- resultBundle = new Bundle();
- resultBundle.putInt(EXTRA_RETRY_COUNT, mRetryCount);
- }
- receiver.send(resultCode, resultBundle);
- }
-
- /*
- * PendingIntent
- */
- PendingIntent pi = fa.getIntent().getParcelableExtra(
- EXTRA_PENDING_INTENT_CANCELLED);
- if (pi != null) {
- try {
- pi.send(getActivity(), resultCode, mIntentResult);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- fa.finish();
- }
-
- /*
- * LISTENERS
- */
-
- private final LockPatternView.OnPatternListener mLockPatternViewListener = new LockPatternView.OnPatternListener() {
-
- @Override
- public void onPatternStart() {
- mLockPatternView.removeCallbacks(mLockPatternViewReloader);
- mLockPatternView.setDisplayMode(DisplayMode.Correct);
-
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod())) {
- mTextInfo
- .setText(R.string.alp_42447968_msg_release_finger_when_done);
- mBtnConfirm.setEnabled(false);
- if (mBtnOkCmd == ButtonOkCommand.CONTINUE)
- fa.getIntent().removeExtra(EXTRA_PATTERN);
- }
- else if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- mTextInfo
- .setText(R.string.alp_42447968_msg_draw_pattern_to_unlock);
- }
- else if (ACTION_VERIFY_CAPTCHA.equals(getSelectedMethod())) {
- mTextInfo
- .setText(R.string.alp_42447968_msg_redraw_pattern_to_confirm);
- }
- }
-
- @Override
- public void onPatternDetected(List<Cell> pattern) {
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod())) {
- doCheckAndCreatePattern(pattern);
- }
- else if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- doComparePattern(pattern);
- }
- else if (ACTION_VERIFY_CAPTCHA.equals(getSelectedMethod())) {
- if (!DisplayMode.Animate.equals(mLockPatternView
- .getDisplayMode()))
- doComparePattern(pattern);
- }
- }
-
- @Override
- public void onPatternCleared() {
- mLockPatternView.removeCallbacks(mLockPatternViewReloader);
-
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod())) {
- mLockPatternView.setDisplayMode(DisplayMode.Correct);
- mBtnConfirm.setEnabled(false);
- if (mBtnOkCmd == ButtonOkCommand.CONTINUE) {
- fa.getIntent().removeExtra(EXTRA_PATTERN);
- mTextInfo
- .setText(R.string.alp_42447968_msg_draw_an_unlock_pattern);
- } else
- mTextInfo
- .setText(R.string.alp_42447968_msg_redraw_pattern_to_confirm);
- }
- else if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- mLockPatternView.setDisplayMode(DisplayMode.Correct);
- mTextInfo
- .setText(R.string.alp_42447968_msg_draw_pattern_to_unlock);
- }
- else if (ACTION_VERIFY_CAPTCHA.equals(fa.getIntent().getAction())) {
- mTextInfo
- .setText(R.string.alp_42447968_msg_redraw_pattern_to_confirm);
- List<Cell> pattern = fa.getIntent().getParcelableArrayListExtra(
- EXTRA_PATTERN);
- mLockPatternView.setPattern(DisplayMode.Animate, pattern);
- }
- }
-
- @Override
- public void onPatternCellAdded(List<Cell> pattern) {
- }
- };
-
- private final View.OnClickListener mBtnCancelOnClickListener = new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- finishWithNegativeResult(fa.RESULT_CANCELED);
- }
- };
-
- private final View.OnClickListener mBtnConfirmOnClickListener = new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- if (ACTION_CREATE_PATTERN.equals(getSelectedMethod())) {
- if (mBtnOkCmd == ButtonOkCommand.CONTINUE) {
- mBtnOkCmd = ButtonOkCommand.DONE;
- mLockPatternView.clearPattern();
- mTextInfo
- .setText(R.string.alp_42447968_msg_redraw_pattern_to_confirm);
- mBtnConfirm.setText(R.string.alp_42447968_cmd_confirm);
- mBtnConfirm.setEnabled(false);
- } else {
- final char[] pattern = fa.getIntent().getCharArrayExtra(
- EXTRA_PATTERN);
- if (mAutoSave)
- Settings.Security.setPattern(getActivity(),
- pattern);
- finishWithResultOk(pattern);
- }
- }
- else if (ACTION_COMPARE_PATTERN.equals(getSelectedMethod())) {
- /*
- * We don't need to verify the extra. First, getActivity() button is only
- * visible if there is getActivity() extra in the intent. Second, it is
- * the responsibility of the caller to make sure the extra is
- * good.
- */
- PendingIntent pi;
- try {
- pi = fa.getIntent().getParcelableExtra(
- EXTRA_PENDING_INTENT_FORGOT_PATTERN);
- pi.send();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- finishWithNegativeResult(RESULT_FORGOT_PATTERN);
- }
- }
- };
-
- /**
- * getActivity() reloads the {@link #mLockPatternView} after a wrong pattern.
- */
- private final Runnable mLockPatternViewReloader = new Runnable() {
-
- @Override
- public void run() {
- mLockPatternView.clearPattern();
- mLockPatternViewListener.onPatternCleared();
- }
- };
-
- /**
- * Fragment constructor allowing to add a bundle with all necessary information to the fragment
- * @param method contains information about which method to choose (set
- * @return LockPatternFragment with bundle
- */
- public static LockPatternFragmentOld newInstance(String method){
- LockPatternFragmentOld fragment = new LockPatternFragmentOld();
- Bundle args = new Bundle();
- args.putString("ACTION", method);
- fragment.setArguments(args);
- return fragment;
- }
-
- /**
- * Getter for the method string saved in fragment arguments
- * @return String telling which method was selected
- */
- public String getSelectedMethod () {
- return getArguments().getString("ACTION");
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
index 04a932658..67fa30a44 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
@@ -20,11 +20,6 @@ package org.sufficientlysecure.keychain;
import android.os.Environment;
import org.spongycastle.jce.provider.BouncyCastleProvider;
-import org.sufficientlysecure.keychain.remote.ui.AppsListActivity;
-import org.sufficientlysecure.keychain.ui.DecryptActivity;
-import org.sufficientlysecure.keychain.ui.EncryptFilesActivity;
-import org.sufficientlysecure.keychain.ui.EncryptTextActivity;
-import org.sufficientlysecure.keychain.ui.KeyListActivity;
import java.io.File;
@@ -91,21 +86,6 @@ public final class Constants {
public static final int PREF_VERSION = 4;
}
- public static final class DrawerItems {
- public static final Class KEY_LIST = KeyListActivity.class;
- public static final Class ENCRYPT_TEXT = EncryptTextActivity.class;
- public static final Class ENCRYPT_FILE = EncryptFilesActivity.class;
- public static final Class DECRYPT = DecryptActivity.class;
- public static final Class REGISTERED_APPS_LIST = AppsListActivity.class;
- public static final Class[] ARRAY = new Class[]{
- KEY_LIST,
- ENCRYPT_TEXT,
- ENCRYPT_FILE,
- DECRYPT,
- REGISTERED_APPS_LIST
- };
- }
-
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 446699a81..01f6735ea 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
@@ -32,12 +32,12 @@ import android.provider.ContactsContract;
import android.widget.Toast;
import org.spongycastle.jce.provider.BouncyCastleProvider;
-import org.sufficientlysecure.keychain.util.Preferences;
-import org.sufficientlysecure.keychain.util.TlsHelper;
import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
import org.sufficientlysecure.keychain.ui.ConsolidateDialogActivity;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.PRNGFixes;
+import org.sufficientlysecure.keychain.util.Preferences;
+import org.sufficientlysecure.keychain.util.TlsHelper;
import java.security.Security;
@@ -86,7 +86,7 @@ public class KeychainApplication extends Application {
}
brandGlowEffect(getApplicationContext(),
- getApplicationContext().getResources().getColor(R.color.emphasis));
+ getApplicationContext().getResources().getColor(R.color.primary));
setupAccountAsNeeded(this);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java
index 255ca1cde..c0221fad3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/CloudSearch.java
@@ -17,8 +17,8 @@
package org.sufficientlysecure.keychain.keyimport;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.util.ArrayList;
import java.util.Vector;
@@ -32,10 +32,10 @@ public class CloudSearch {
public static ArrayList<ImportKeysListEntry> search(final String query, Preferences.CloudSearchPrefs cloudPrefs)
throws Keyserver.CloudSearchFailureException {
- final ArrayList<Keyserver> servers = new ArrayList<Keyserver>();
+ final ArrayList<Keyserver> servers = new ArrayList<>();
// it's a Vector for sync, multiple threads might report problems
- final Vector<Keyserver.CloudSearchFailureException> problems = new Vector<Keyserver.CloudSearchFailureException>();
+ final Vector<Keyserver.CloudSearchFailureException> problems = new Vector<>();
if (cloudPrefs.searchKeyserver) {
servers.add(new HkpKeyserver(cloudPrefs.keyserver));
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 7f07b8162..480319081 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java
@@ -19,10 +19,10 @@
package org.sufficientlysecure.keychain.keyimport;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.util.TlsHelper;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.TlsHelper;
import java.io.BufferedWriter;
import java.io.IOException;
@@ -234,7 +234,7 @@ public class HkpKeyserver extends Keyserver {
@Override
public ArrayList<ImportKeysListEntry> search(String query) throws QueryFailedException,
QueryNeedsRepairException {
- ArrayList<ImportKeysListEntry> results = new ArrayList<ImportKeysListEntry>();
+ ArrayList<ImportKeysListEntry> results = new ArrayList<>();
if (query.length() < 3) {
throw new QueryTooShortException();
@@ -305,7 +305,7 @@ public class HkpKeyserver extends Keyserver {
entry.setRevoked(matcher.group(6).contains("r"));
entry.setExpired(matcher.group(6).contains("e"));
- ArrayList<String> userIds = new ArrayList<String>();
+ ArrayList<String> userIds = new ArrayList<>();
final String uidLines = matcher.group(7);
final Matcher uidMatcher = UID_LINE.matcher(uidLines);
while (uidMatcher.find()) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
index d60d7757b..79065604a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
@@ -23,9 +23,9 @@ import android.os.Parcelable;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.io.Serializable;
import java.util.ArrayList;
@@ -89,7 +89,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
public ImportKeysListEntry createFromParcel(final Parcel source) {
ImportKeysListEntry vr = new ImportKeysListEntry();
vr.mPrimaryUserId = source.readString();
- vr.mUserIds = new ArrayList<String>();
+ vr.mUserIds = new ArrayList<>();
source.readStringList(vr.mUserIds);
vr.mMergedUserIds = (HashMap<String, HashSet<String>>) source.readSerializable();
vr.mKeyId = source.readLong();
@@ -103,7 +103,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
vr.mSecretKey = source.readByte() == 1;
vr.mSelected = source.readByte() == 1;
vr.mExtraData = source.readString();
- vr.mOrigins = new ArrayList<String>();
+ vr.mOrigins = new ArrayList<>();
source.readStringList(vr.mOrigins);
return vr;
@@ -265,8 +265,8 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
mSecretKey = false;
// do not select by default
mSelected = false;
- mUserIds = new ArrayList<String>();
- mOrigins = new ArrayList<String>();
+ mUserIds = new ArrayList<>();
+ mOrigins = new ArrayList<>();
}
/**
@@ -294,8 +294,8 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
mKeyId = key.getKeyId();
mKeyIdHex = KeyFormattingUtils.convertKeyIdToHex(mKeyId);
- mRevoked = key.isRevoked();
- mExpired = key.isExpired();
+ mRevoked = key.isMaybeRevoked();
+ mExpired = key.isMaybeExpired();
mFingerprintHex = KeyFormattingUtils.convertFingerprintToHex(key.getFingerprint());
mBitStrength = key.getBitStrength();
mCurveOid = key.getCurveOid();
@@ -304,7 +304,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
}
public void updateMergedUserIds() {
- mMergedUserIds = new HashMap<String, HashSet<String>>();
+ mMergedUserIds = new HashMap<>();
for (String userId : mUserIds) {
String[] userIdSplit = KeyRing.splitUserId(userId);
@@ -315,7 +315,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
// email
if (userIdSplit[1] != null) {
if (!mMergedUserIds.containsKey(userIdSplit[0])) {
- HashSet<String> emails = new HashSet<String>();
+ HashSet<String> emails = new HashSet<>();
emails.add(userIdSplit[1]);
mMergedUserIds.put(userIdSplit[0], emails);
} else {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java
index 2363a40b3..e310e9a3f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyserver.java
@@ -36,7 +36,7 @@ public class KeybaseKeyserver extends Keyserver {
@Override
public ArrayList<ImportKeysListEntry> search(String query) throws QueryFailedException,
QueryNeedsRepairException {
- ArrayList<ImportKeysListEntry> results = new ArrayList<ImportKeysListEntry>();
+ ArrayList<ImportKeysListEntry> results = new ArrayList<>();
if (query.startsWith("0x")) {
// cut off "0x" if a user is searching for a key id
@@ -81,7 +81,7 @@ public class KeybaseKeyserver extends Keyserver {
final int algorithmId = match.getAlgorithmId();
entry.setAlgorithm(KeyFormattingUtils.getAlgorithmInfo(algorithmId, bitStrength, null));
- ArrayList<String> userIds = new ArrayList<String>();
+ ArrayList<String> userIds = new ArrayList<>();
String name = "<keybase.io/" + username + ">";
if (fullName != null) {
name = fullName + " " + name;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java
index c400eb813..e796bdc91 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BaseOperation.java
@@ -77,6 +77,12 @@ public abstract class BaseOperation implements PassphraseCacheInterface {
return mCancelled != null && mCancelled.get();
}
+ protected void setPreventCancel () {
+ if (mProgressable != null) {
+ mProgressable.setPreventCancel();
+ }
+ }
+
@Override
public String getCachedPassphrase(long subKeyId) throws NoSecretKeyException {
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
index a5eb95b07..025f45f7f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/CertifyOperation.java
@@ -5,6 +5,10 @@ import android.content.Context;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
+import org.sufficientlysecure.keychain.operations.results.CertifyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
@@ -16,10 +20,6 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction;
-import org.sufficientlysecure.keychain.operations.results.CertifyResult;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
-import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
@@ -78,7 +78,7 @@ public class CertifyOperation extends BaseOperation {
return new CertifyResult(CertifyResult.RESULT_ERROR, log);
}
- ArrayList<UncachedKeyRing> certifiedKeys = new ArrayList<UncachedKeyRing>();
+ ArrayList<UncachedKeyRing> certifiedKeys = new ArrayList<>();
log.add(LogType.MSG_CRT_CERTIFYING, 1);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java
index 4d466593b..7f14b08d9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/EditKeyOperation.java
@@ -4,17 +4,16 @@ import android.content.Context;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
+import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
-import org.sufficientlysecure.keychain.service.CertifyActionsParcel;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
-import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
@@ -29,7 +28,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* create key operations in PgpKeyOperation. It takes care of fetching
* and saving the key before and after the operation.
*
- * @see CertifyActionsParcel
+ * @see SaveKeyringParcel
*
*/
public class EditKeyOperation extends BaseOperation {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
index 6ca28142f..8f10377cd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
@@ -30,7 +30,12 @@ import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
import org.sufficientlysecure.keychain.keyimport.Keyserver;
import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
import org.sufficientlysecure.keychain.operations.results.ExportResult;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
@@ -40,13 +45,12 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
-import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
-import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
+import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.FileHelper;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
import org.sufficientlysecure.keychain.util.ProgressScaler;
import java.io.BufferedOutputStream;
@@ -58,6 +62,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/** An operation class which implements high level import and export
@@ -123,6 +128,35 @@ public class ImportExportOperation extends BaseOperation {
}
}
+ public ImportKeyResult importKeyRings(List<ParcelableKeyRing> entries, String keyServerUri) {
+
+ Iterator<ParcelableKeyRing> it = entries.iterator();
+ int numEntries = entries.size();
+
+ return importKeyRings(it, numEntries, keyServerUri);
+
+ }
+
+ public ImportKeyResult importKeyRings(ParcelableFileCache<ParcelableKeyRing> cache, String keyServerUri) {
+
+ // get entries from cached file
+ try {
+ IteratorWithSize<ParcelableKeyRing> it = cache.readCache();
+ int numEntries = it.getSize();
+
+ return importKeyRings(it, numEntries, keyServerUri);
+ } catch (IOException e) {
+
+ // Special treatment here, we need a lot
+ OperationLog log = new OperationLog();
+ log.add(LogType.MSG_IMPORT, 0, 0);
+ log.add(LogType.MSG_IMPORT_ERROR_IO, 0, 0);
+
+ return new ImportKeyResult(ImportKeyResult.RESULT_ERROR, log);
+ }
+
+ }
+
public ImportKeyResult importKeyRings(Iterator<ParcelableKeyRing> entries, int num, String keyServerUri) {
updateProgress(R.string.progress_importing, 0, 100);
@@ -131,13 +165,11 @@ public class ImportExportOperation extends BaseOperation {
// If there aren't even any keys, do nothing here.
if (entries == null || !entries.hasNext()) {
- return new ImportKeyResult(
- ImportKeyResult.RESULT_FAIL_NOTHING, log, 0, 0, 0, 0,
- new long[]{});
+ return new ImportKeyResult(ImportKeyResult.RESULT_FAIL_NOTHING, log);
}
int newKeys = 0, oldKeys = 0, badKeys = 0, secret = 0;
- ArrayList<Long> importedMasterKeyIds = new ArrayList<Long>();
+ ArrayList<Long> importedMasterKeyIds = new ArrayList<>();
boolean cancelled = false;
int position = 0;
@@ -293,6 +325,16 @@ public class ImportExportOperation extends BaseOperation {
position++;
}
+ // Special: consolidate on secret key import (cannot be cancelled!)
+ if (secret > 0) {
+ setPreventCancel();
+ ConsolidateResult result = mProviderHelper.consolidateDatabaseStep1(mProgressable);
+ log.add(result, 1);
+ }
+
+ // Special: make sure new data is synced into contacts
+ ContactSyncAdapterService.requestSync();
+
// convert to long array
long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()];
for (int i = 0; i < importedMasterKeyIds.size(); ++i) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
new file mode 100644
index 000000000..783b32477
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
@@ -0,0 +1,103 @@
+package org.sufficientlysecure.keychain.operations;
+
+import android.content.Context;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
+import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
+import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
+import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
+import org.sufficientlysecure.keychain.pgp.Progressable;
+import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.ProgressScaler;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/** An operation which promotes a public key ring to a secret one.
+ *
+ * This operation can only be applied to public key rings where no secret key
+ * is available. Doing this "promotes" the public key ring to a secret one
+ * without secret key material, using a GNU_DUMMY s2k type.
+ *
+ */
+public class PromoteKeyOperation extends BaseOperation {
+
+ public PromoteKeyOperation(Context context, ProviderHelper providerHelper,
+ Progressable progressable, AtomicBoolean cancelled) {
+ super(context, providerHelper, progressable, cancelled);
+ }
+
+ public PromoteKeyResult execute(long masterKeyId) {
+
+ OperationLog log = new OperationLog();
+ log.add(LogType.MSG_PR, 0);
+
+ // Perform actual type change
+ UncachedKeyRing promotedRing;
+ {
+
+ try {
+
+ // This operation is only allowed for pure public keys
+ // TODO delete secret keys if they are stripped, or have been moved to the card?
+ if (mProviderHelper.getCachedPublicKeyRing(masterKeyId).hasAnySecret()) {
+ log.add(LogType.MSG_PR_ERROR_ALREADY_SECRET, 2);
+ return new PromoteKeyResult(PromoteKeyResult.RESULT_ERROR, log, null);
+ }
+
+ log.add(LogType.MSG_PR_FETCHING, 1,
+ KeyFormattingUtils.convertKeyIdToHex(masterKeyId));
+ CanonicalizedPublicKeyRing pubRing =
+ mProviderHelper.getCanonicalizedPublicKeyRing(masterKeyId);
+
+ // create divert-to-card secret key from public key
+ promotedRing = pubRing.createDummySecretRing();
+
+ } catch (PgpKeyNotFoundException e) {
+ log.add(LogType.MSG_PR_ERROR_KEY_NOT_FOUND, 2);
+ return new PromoteKeyResult(PromoteKeyResult.RESULT_ERROR, log, null);
+ } catch (NotFoundException e) {
+ log.add(LogType.MSG_PR_ERROR_KEY_NOT_FOUND, 2);
+ return new PromoteKeyResult(PromoteKeyResult.RESULT_ERROR, log, null);
+ }
+ }
+
+ // If the edit operation didn't succeed, exit here
+ if (promotedRing == null) {
+ // error is already logged by modification
+ return new PromoteKeyResult(PromoteKeyResult.RESULT_ERROR, log, null);
+ }
+
+ // Check if the action was cancelled
+ if (checkCancelled()) {
+ log.add(LogType.MSG_OPERATION_CANCELLED, 0);
+ return new PromoteKeyResult(PgpEditKeyResult.RESULT_CANCELLED, log, null);
+ }
+
+ // Cannot cancel from here on out!
+ setPreventCancel();
+
+ // Save the new keyring.
+ SaveKeyringResult saveResult = mProviderHelper
+ .saveSecretKeyRing(promotedRing, new ProgressScaler(mProgressable, 60, 95, 100));
+ log.add(saveResult, 1);
+
+ // If the save operation didn't succeed, exit here
+ if (!saveResult.success()) {
+ return new PromoteKeyResult(PromoteKeyResult.RESULT_ERROR, log, null);
+ }
+
+ updateProgress(R.string.progress_done, 100, 100);
+
+ log.add(LogType.MSG_PR_SUCCESS, 0);
+ return new PromoteKeyResult(PromoteKeyResult.RESULT_OK, log, promotedRing.getMasterKeyId());
+
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
new file mode 100644
index 000000000..e98f6b150
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java
@@ -0,0 +1,136 @@
+package org.sufficientlysecure.keychain.operations;
+
+import android.content.Context;
+import android.net.Uri;
+
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
+import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
+import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
+import org.sufficientlysecure.keychain.pgp.Progressable;
+import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.util.FileHelper;
+import org.sufficientlysecure.keychain.util.InputData;
+import org.sufficientlysecure.keychain.util.ProgressScaler;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/** This is a high-level operation, which encapsulates one or more sign/encrypt
+ * operations, using URIs or byte arrays as input and output.
+ *
+ * This operation is fail-fast: If any sign/encrypt sub-operation fails or returns
+ * a pending result, it will terminate.
+ *
+ */
+public class SignEncryptOperation extends BaseOperation {
+
+ public SignEncryptOperation(Context context, ProviderHelper providerHelper,
+ Progressable progressable, AtomicBoolean cancelled) {
+ super(context, providerHelper, progressable, cancelled);
+ }
+
+ public SignEncryptResult execute(SignEncryptParcel input) {
+
+ OperationLog log = new OperationLog();
+ log.add(LogType.MSG_SE, 0);
+
+ ArrayDeque<Uri> inputUris = new ArrayDeque<>(input.getInputUris());
+ ArrayDeque<Uri> outputUris = new ArrayDeque<>(input.getOutputUris());
+ byte[] inputBytes = input.getBytes();
+ byte[] outputBytes = null;
+
+ ArrayList<PgpSignEncryptResult> results = new ArrayList<>();
+
+ do {
+
+ if (checkCancelled()) {
+ log.add(LogType.MSG_OPERATION_CANCELLED, 0);
+ return new SignEncryptResult(SignEncryptResult.RESULT_CANCELLED, log, results);
+ }
+
+ InputData inputData;
+ {
+ if (inputBytes != null) {
+ log.add(LogType.MSG_SE_INPUT_BYTES, 1);
+ InputStream is = new ByteArrayInputStream(inputBytes);
+ inputData = new InputData(is, inputBytes.length);
+ inputBytes = null;
+ } else {
+ if (inputUris.isEmpty()) {
+ log.add(LogType.MSG_SE_ERROR_NO_INPUT, 1);
+ return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log, results);
+ }
+
+ log.add(LogType.MSG_SE_INPUT_URI, 1);
+ Uri uri = inputUris.removeFirst();
+ try {
+ InputStream is = mContext.getContentResolver().openInputStream(uri);
+ long fileSize = FileHelper.getFileSize(mContext, uri, 0);
+ String filename = FileHelper.getFilename(mContext, uri);
+ inputData = new InputData(is, fileSize, filename);
+ } catch (FileNotFoundException e) {
+ log.add(LogType.MSG_SE_ERROR_INPUT_URI_NOT_FOUND, 1);
+ return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log, results);
+ }
+ }
+ }
+
+ OutputStream outStream;
+ {
+ if (!outputUris.isEmpty()) {
+ try {
+ Uri outputUri = outputUris.removeFirst();
+ outStream = mContext.getContentResolver().openOutputStream(outputUri);
+ } catch (FileNotFoundException e) {
+ log.add(LogType.MSG_SE_ERROR_OUTPUT_URI_NOT_FOUND, 1);
+ return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log, results);
+ }
+ } else {
+ if (outputBytes != null) {
+ log.add(LogType.MSG_SE_ERROR_TOO_MANY_INPUTS, 1);
+ return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log, results);
+ }
+ outStream = new ByteArrayOutputStream();
+ }
+ }
+
+ PgpSignEncryptOperation op = new PgpSignEncryptOperation(mContext, mProviderHelper,
+ new ProgressScaler(), mCancelled);
+ PgpSignEncryptResult result = op.execute(input, inputData, outStream);
+ results.add(result);
+ log.add(result, 2);
+
+ if (result.isPending()) {
+ return new SignEncryptResult(SignEncryptResult.RESULT_PENDING, log, results);
+ }
+
+ if (!result.success()) {
+ return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log, results);
+ }
+
+ if (outStream instanceof ByteArrayOutputStream) {
+ outputBytes = ((ByteArrayOutputStream) outStream).toByteArray();
+ }
+
+ } while (!inputUris.isEmpty());
+
+ if (!outputUris.isEmpty()) {
+ // Any output URIs left are indicative of a programming error
+ log.add(LogType.MSG_SE_WARN_OUTPUT_LEFT, 1);
+ }
+
+ log.add(LogType.MSG_SE_SUCCESS, 1);
+ return new SignEncryptResult(SignEncryptResult.RESULT_OK, log, results, outputBytes);
+
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/CertifyResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/CertifyResult.java
index 7b38cd244..94684851a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/CertifyResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/CertifyResult.java
@@ -21,18 +21,14 @@ package org.sufficientlysecure.keychain.operations.results;
import android.app.Activity;
import android.content.Intent;
import android.os.Parcel;
-import android.os.Parcelable;
-import android.view.View;
-
-import com.github.johnpersano.supertoasts.SuperCardToast;
-import com.github.johnpersano.supertoasts.SuperToast;
-import com.github.johnpersano.supertoasts.SuperToast.Duration;
-import com.github.johnpersano.supertoasts.util.OnClickWrapper;
-import com.github.johnpersano.supertoasts.util.Style;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.LogDisplayActivity;
import org.sufficientlysecure.keychain.ui.LogDisplayFragment;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
+import org.sufficientlysecure.keychain.ui.util.Notify.Showable;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
public class CertifyResult extends OperationResult {
@@ -78,30 +74,31 @@ public class CertifyResult extends OperationResult {
}
};
- public SuperCardToast createNotify(final Activity activity) {
+ public Showable createNotify(final Activity activity) {
int resultType = getResult();
String str;
- int duration, color;
+ int duration;
+ Style style;
// Not an overall failure
if ((resultType & OperationResult.RESULT_ERROR) == 0) {
String withWarnings;
- duration = Duration.EXTRA_LONG;
- color = Style.GREEN;
+ duration = Notify.LENGTH_LONG;
+ style = Style.OK;
withWarnings = "";
// Any warnings?
if ((resultType & ImportKeyResult.RESULT_WARNINGS) > 0) {
duration = 0;
- color = Style.ORANGE;
+ style = Style.WARN;
withWarnings += activity.getString(R.string.with_warnings);
}
if ((resultType & ImportKeyResult.RESULT_CANCELLED) > 0) {
duration = 0;
- color = Style.ORANGE;
+ style = Style.WARN;
withWarnings += activity.getString(R.string.with_cancelled);
}
@@ -111,46 +108,27 @@ public class CertifyResult extends OperationResult {
if (mCertifyError > 0) {
// definitely switch to warning-style message in this case!
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
str += " " + activity.getResources().getQuantityString(
R.plurals.certify_keys_with_errors, mCertifyError, mCertifyError);
}
} else {
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
str = activity.getResources().getQuantityString(R.plurals.certify_error,
mCertifyError, mCertifyError);
}
- boolean button = getLog() != null && !getLog().isEmpty();
- SuperCardToast toast = new SuperCardToast(activity,
- button ? SuperToast.Type.BUTTON : SuperToast.Type.STANDARD,
- Style.getStyle(color, SuperToast.Animations.POPUP));
- toast.setText(str);
- toast.setDuration(duration);
- toast.setIndeterminate(duration == 0);
- toast.setSwipeToDismiss(true);
- // If we have a log and it's non-empty, show a View Log button
- if (button) {
- toast.setButtonIcon(R.drawable.ic_action_view_as_list,
- activity.getResources().getString(R.string.view_log));
- toast.setButtonTextColor(activity.getResources().getColor(R.color.black));
- toast.setTextColor(activity.getResources().getColor(R.color.black));
- toast.setOnClickWrapper(new OnClickWrapper("supercardtoast",
- new SuperToast.OnClickListener() {
- @Override
- public void onClick(View view, Parcelable token) {
- Intent intent = new Intent(
- activity, LogDisplayActivity.class);
- intent.putExtra(LogDisplayFragment.EXTRA_RESULT, CertifyResult.this);
- activity.startActivity(intent);
- }
- }
- ));
- }
-
- return toast;
+ return Notify.createNotify(activity, str, duration, style, new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ activity, LogDisplayActivity.class);
+ intent.putExtra(LogDisplayFragment.EXTRA_RESULT, CertifyResult.this);
+ activity.startActivity(intent);
+ }
+ }, R.string.view_log);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DecryptVerifyResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DecryptVerifyResult.java
index d81577102..86b37fea6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DecryptVerifyResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DecryptVerifyResult.java
@@ -41,6 +41,9 @@ public class DecryptVerifyResult extends OperationResult {
OpenPgpSignatureResult mSignatureResult;
OpenPgpMetadata mDecryptMetadata;
+ // This holds the charset which was specified in the ascii armor, if specified
+ // https://tools.ietf.org/html/rfc4880#page56
+ String mCharset;
public long getKeyIdPassphraseNeeded() {
return mKeyIdPassphraseNeeded;
@@ -84,6 +87,14 @@ public class DecryptVerifyResult extends OperationResult {
mDecryptMetadata = decryptMetadata;
}
+ public String getCharset () {
+ return mCharset;
+ }
+
+ public void setCharset(String charset) {
+ mCharset = charset;
+ }
+
public boolean isPending() {
return (mResult & RESULT_PENDING) == RESULT_PENDING;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java
index 1ca5ad20a..62197541a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/DeleteResult.java
@@ -21,18 +21,14 @@ package org.sufficientlysecure.keychain.operations.results;
import android.app.Activity;
import android.content.Intent;
import android.os.Parcel;
-import android.os.Parcelable;
-import android.view.View;
-
-import com.github.johnpersano.supertoasts.SuperCardToast;
-import com.github.johnpersano.supertoasts.SuperToast;
-import com.github.johnpersano.supertoasts.SuperToast.Duration;
-import com.github.johnpersano.supertoasts.util.OnClickWrapper;
-import com.github.johnpersano.supertoasts.util.Style;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.LogDisplayActivity;
import org.sufficientlysecure.keychain.ui.LogDisplayFragment;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
+import org.sufficientlysecure.keychain.ui.util.Notify.Showable;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
public class DeleteResult extends OperationResult {
@@ -68,31 +64,32 @@ public class DeleteResult extends OperationResult {
}
};
- public SuperCardToast createNotify(final Activity activity) {
+ public Showable createNotify(final Activity activity) {
int resultType = getResult();
String str;
- int duration, color;
+ int duration;
+ Style style;
// Not an overall failure
if ((resultType & OperationResult.RESULT_ERROR) == 0) {
String untilCancelled;
- duration = Duration.EXTRA_LONG;
- color = Style.GREEN;
+ duration = Notify.LENGTH_LONG;
+ style = Style.OK;
untilCancelled = "";
// Any warnings?
if ((resultType & ImportKeyResult.RESULT_CANCELLED) > 0) {
duration = 0;
- color = Style.ORANGE;
+ style = Style.WARN;
untilCancelled += activity.getString(R.string.with_cancelled);
}
// New and updated keys
if (mOk > 0 && mFail > 0) {
- color = Style.ORANGE;
+ style = Style.WARN;
duration = 0;
str = activity.getResources().getQuantityString(
R.plurals.delete_ok_but_fail_1, mOk, mOk);
@@ -105,13 +102,13 @@ public class DeleteResult extends OperationResult {
str = activity.getString(R.string.delete_cancelled);
} else {
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
str = "internal error";
}
} else {
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
if (mFail == 0) {
str = activity.getString(R.string.delete_nothing);
} else {
@@ -119,34 +116,15 @@ public class DeleteResult extends OperationResult {
}
}
- boolean button = getLog() != null && !getLog().isEmpty();
- SuperCardToast toast = new SuperCardToast(activity,
- button ? SuperToast.Type.BUTTON : SuperToast.Type.STANDARD,
- Style.getStyle(color, SuperToast.Animations.POPUP));
- toast.setText(str);
- toast.setDuration(duration);
- toast.setIndeterminate(duration == 0);
- toast.setSwipeToDismiss(true);
- // If we have a log and it's non-empty, show a View Log button
- if (button) {
- toast.setButtonIcon(R.drawable.ic_action_view_as_list,
- activity.getResources().getString(R.string.view_log));
- toast.setButtonTextColor(activity.getResources().getColor(R.color.black));
- toast.setTextColor(activity.getResources().getColor(R.color.black));
- toast.setOnClickWrapper(new OnClickWrapper("supercardtoast",
- new SuperToast.OnClickListener() {
- @Override
- public void onClick(View view, Parcelable token) {
- Intent intent = new Intent(
- activity, LogDisplayActivity.class);
- intent.putExtra(LogDisplayFragment.EXTRA_RESULT, DeleteResult.this);
- activity.startActivity(intent);
- }
- }
- ));
- }
-
- return toast;
+ return Notify.createNotify(activity, str, duration, style, new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ activity, LogDisplayActivity.class);
+ intent.putExtra(LogDisplayFragment.EXTRA_RESULT, DeleteResult.this);
+ activity.startActivity(intent);
+ }
+ }, R.string.view_log);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/ImportKeyResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/ImportKeyResult.java
index 1dd038a23..2d533ed16 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/ImportKeyResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/ImportKeyResult.java
@@ -21,18 +21,14 @@ package org.sufficientlysecure.keychain.operations.results;
import android.app.Activity;
import android.content.Intent;
import android.os.Parcel;
-import android.os.Parcelable;
-import android.view.View;
-
-import com.github.johnpersano.supertoasts.SuperCardToast;
-import com.github.johnpersano.supertoasts.SuperToast;
-import com.github.johnpersano.supertoasts.SuperToast.Duration;
-import com.github.johnpersano.supertoasts.util.OnClickWrapper;
-import com.github.johnpersano.supertoasts.util.Style;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.LogDisplayActivity;
import org.sufficientlysecure.keychain.ui.LogDisplayFragment;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
+import org.sufficientlysecure.keychain.ui.util.Notify.Showable;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
public class ImportKeyResult extends OperationResult {
@@ -83,6 +79,10 @@ public class ImportKeyResult extends OperationResult {
mImportedMasterKeyIds = source.createLongArray();
}
+ public ImportKeyResult(int result, OperationLog log) {
+ this(result, log, 0, 0, 0, 0, new long[] { });
+ }
+
public ImportKeyResult(int result, OperationLog log,
int newKeys, int updatedKeys, int badKeys, int secret,
long[] importedMasterKeyIds) {
@@ -114,30 +114,31 @@ public class ImportKeyResult extends OperationResult {
}
};
- public SuperCardToast createNotify(final Activity activity) {
+ public Showable createNotify(final Activity activity) {
int resultType = getResult();
String str;
- int duration, color;
+ int duration;
+ Style style;
// Not an overall failure
if ((resultType & OperationResult.RESULT_ERROR) == 0) {
String withWarnings;
- duration = Duration.EXTRA_LONG;
- color = Style.GREEN;
+ duration = Notify.LENGTH_LONG;
+ style = Style.OK;
withWarnings = "";
// Any warnings?
if ((resultType & ImportKeyResult.RESULT_WARNINGS) > 0) {
duration = 0;
- color = Style.ORANGE;
+ style = Style.WARN;
withWarnings += activity.getString(R.string.with_warnings);
}
if ((resultType & ImportKeyResult.RESULT_CANCELLED) > 0) {
duration = 0;
- color = Style.ORANGE;
+ style = Style.WARN;
withWarnings += activity.getString(R.string.with_cancelled);
}
@@ -155,20 +156,20 @@ public class ImportKeyResult extends OperationResult {
R.plurals.import_keys_added, mNewKeys, mNewKeys, withWarnings);
} else {
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
str = "internal error";
}
if (isOkWithErrors()) {
// definitely switch to warning-style message in this case!
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
str += " " + activity.getResources().getQuantityString(
R.plurals.import_keys_with_errors, mBadKeys, mBadKeys);
}
} else {
duration = 0;
- color = Style.RED;
+ style = Style.ERROR;
if (isFailNothing()) {
str = activity.getString((resultType & ImportKeyResult.RESULT_CANCELLED) > 0
? R.string.import_error_nothing_cancelled
@@ -178,34 +179,15 @@ public class ImportKeyResult extends OperationResult {
}
}
- boolean button = getLog() != null && !getLog().isEmpty();
- SuperCardToast toast = new SuperCardToast(activity,
- button ? SuperToast.Type.BUTTON : SuperToast.Type.STANDARD,
- Style.getStyle(color, SuperToast.Animations.POPUP));
- toast.setText(str);
- toast.setDuration(duration);
- toast.setIndeterminate(duration == 0);
- toast.setSwipeToDismiss(true);
- // If we have a log and it's non-empty, show a View Log button
- if (button) {
- toast.setButtonIcon(R.drawable.ic_action_view_as_list,
- activity.getResources().getString(R.string.view_log));
- toast.setButtonTextColor(activity.getResources().getColor(R.color.black));
- toast.setTextColor(activity.getResources().getColor(R.color.black));
- toast.setOnClickWrapper(new OnClickWrapper("supercardtoast",
- new SuperToast.OnClickListener() {
- @Override
- public void onClick(View view, Parcelable token) {
- Intent intent = new Intent(
- activity, LogDisplayActivity.class);
- intent.putExtra(LogDisplayFragment.EXTRA_RESULT, ImportKeyResult.this);
- activity.startActivity(intent);
- }
- }
- ));
- }
-
- return toast;
+ return Notify.createNotify(activity, str, duration, style, new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ activity, LogDisplayActivity.class);
+ intent.putExtra(LogDisplayFragment.EXTRA_RESULT, ImportKeyResult.this);
+ activity.startActivity(intent);
+ }
+ }, R.string.view_log);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java
index af401b05a..ea4fedc56 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java
@@ -22,17 +22,15 @@ import android.app.Activity;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
-import android.view.View;
-
-import com.github.johnpersano.supertoasts.SuperCardToast;
-import com.github.johnpersano.supertoasts.SuperToast;
-import com.github.johnpersano.supertoasts.util.OnClickWrapper;
-import com.github.johnpersano.supertoasts.util.Style;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.LogDisplayActivity;
import org.sufficientlysecure.keychain.ui.LogDisplayFragment;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
+import org.sufficientlysecure.keychain.ui.util.Notify.Showable;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
@@ -195,58 +193,44 @@ public abstract class OperationResult implements Parcelable {
}
- public SuperCardToast createNotify(final Activity activity) {
-
- int color;
+ public Showable createNotify(final Activity activity) {
Log.d(Constants.TAG, "mLog.getLast()"+mLog.getLast());
Log.d(Constants.TAG, "mLog.getLast().mType"+mLog.getLast().mType);
Log.d(Constants.TAG, "mLog.getLast().mType.getMsgId()"+mLog.getLast().mType.getMsgId());
// Take the last message as string
- String str = activity.getString(mLog.getLast().mType.getMsgId());
+ int msgId = mLog.getLast().mType.getMsgId();
+
+ Style style;
// Not an overall failure
if (cancelled()) {
- color = Style.RED;
+ style = Style.ERROR;
} else if (success()) {
if (getLog().containsWarnings()) {
- color = Style.ORANGE;
+ style = Style.WARN;
} else {
- color = Style.GREEN;
+ style = Style.OK;
}
} else {
- color = Style.RED;
+ style = Style.ERROR;
}
- boolean button = getLog() != null && !getLog().isEmpty();
- SuperCardToast toast = new SuperCardToast(activity,
- button ? SuperToast.Type.BUTTON : SuperToast.Type.STANDARD,
- Style.getStyle(color, SuperToast.Animations.POPUP));
- toast.setText(str);
- toast.setDuration(SuperToast.Duration.EXTRA_LONG);
- toast.setIndeterminate(false);
- toast.setSwipeToDismiss(true);
- // If we have a log and it's non-empty, show a View Log button
- if (button) {
- toast.setButtonIcon(R.drawable.ic_action_view_as_list,
- activity.getResources().getString(R.string.view_log));
- toast.setButtonTextColor(activity.getResources().getColor(R.color.black));
- toast.setTextColor(activity.getResources().getColor(R.color.black));
- toast.setOnClickWrapper(new OnClickWrapper("supercardtoast",
- new SuperToast.OnClickListener() {
- @Override
- public void onClick(View view, Parcelable token) {
- Intent intent = new Intent(
- activity, LogDisplayActivity.class);
- intent.putExtra(LogDisplayFragment.EXTRA_RESULT, OperationResult.this);
- activity.startActivity(intent);
- }
- }
- ));
+ if (getLog() == null || getLog().isEmpty()) {
+ return Notify.createNotify(activity, msgId, Notify.LENGTH_LONG, style);
}
- return toast;
+ return Notify.createNotify(activity, msgId, Notify.LENGTH_LONG, style,
+ new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ activity, LogDisplayActivity.class);
+ intent.putExtra(LogDisplayFragment.EXTRA_RESULT, OperationResult.this);
+ activity.startActivity(intent);
+ }
+ }, R.string.view_log);
}
@@ -473,6 +457,7 @@ public abstract class OperationResult implements Parcelable {
// secret key modify
MSG_MF (LogLevel.START, R.string.msg_mr),
+ MSG_MF_ERROR_DIVERT_SERIAL (LogLevel.ERROR, R.string.msg_mf_error_divert_serial),
MSG_MF_ERROR_ENCODE (LogLevel.ERROR, R.string.msg_mf_error_encode),
MSG_MF_ERROR_FINGERPRINT (LogLevel.ERROR, R.string.msg_mf_error_fingerprint),
MSG_MF_ERROR_KEYID (LogLevel.ERROR, R.string.msg_mf_error_keyid),
@@ -485,6 +470,7 @@ public abstract class OperationResult implements Parcelable {
MSG_MF_ERROR_PASSPHRASE_MASTER(LogLevel.ERROR, R.string.msg_mf_error_passphrase_master),
MSG_MF_ERROR_PAST_EXPIRY(LogLevel.ERROR, R.string.msg_mf_error_past_expiry),
MSG_MF_ERROR_PGP (LogLevel.ERROR, R.string.msg_mf_error_pgp),
+ MSG_MF_ERROR_RESTRICTED(LogLevel.ERROR, R.string.msg_mf_error_restricted),
MSG_MF_ERROR_REVOKED_PRIMARY (LogLevel.ERROR, R.string.msg_mf_error_revoked_primary),
MSG_MF_ERROR_SIG (LogLevel.ERROR, R.string.msg_mf_error_sig),
MSG_MF_ERROR_SUBKEY_MISSING(LogLevel.ERROR, R.string.msg_mf_error_subkey_missing),
@@ -527,6 +513,7 @@ public abstract class OperationResult implements Parcelable {
MSG_CON_ERROR_PUBLIC (LogLevel.ERROR, R.string.msg_con_error_public),
MSG_CON_ERROR_SECRET (LogLevel.ERROR, R.string.msg_con_error_secret),
MSG_CON_RECOVER (LogLevel.DEBUG, R.string.msg_con_recover),
+ MSG_CON_RECURSIVE (LogLevel.OK, R.string.msg_con_recursive),
MSG_CON_REIMPORT_PUBLIC (LogLevel.DEBUG, R.plurals.msg_con_reimport_public),
MSG_CON_REIMPORT_PUBLIC_SKIP (LogLevel.DEBUG, R.string.msg_con_reimport_public_skip),
MSG_CON_REIMPORT_SECRET (LogLevel.DEBUG, R.plurals.msg_con_reimport_secret),
@@ -546,6 +533,13 @@ public abstract class OperationResult implements Parcelable {
MSG_ED_FETCHING (LogLevel.DEBUG, R.string.msg_ed_fetching),
MSG_ED_SUCCESS (LogLevel.OK, R.string.msg_ed_success),
+ // promote key
+ MSG_PR (LogLevel.START, R.string.msg_pr),
+ MSG_PR_ERROR_ALREADY_SECRET (LogLevel.ERROR, R.string.msg_pr_error_already_secret),
+ MSG_PR_ERROR_KEY_NOT_FOUND (LogLevel.ERROR, R.string.msg_pr_error_key_not_found),
+ MSG_PR_FETCHING (LogLevel.DEBUG, R.string.msg_pr_fetching),
+ MSG_PR_SUCCESS (LogLevel.OK, R.string.msg_pr_success),
+
// messages used in UI code
MSG_EK_ERROR_DIVERT (LogLevel.ERROR, R.string.msg_ek_error_divert),
MSG_EK_ERROR_DUMMY (LogLevel.ERROR, R.string.msg_ek_error_dummy),
@@ -555,11 +549,13 @@ public abstract class OperationResult implements Parcelable {
MSG_DC_ASKIP_NO_KEY (LogLevel.DEBUG, R.string.msg_dc_askip_no_key),
MSG_DC_ASKIP_NOT_ALLOWED (LogLevel.DEBUG, R.string.msg_dc_askip_not_allowed),
MSG_DC_ASYM (LogLevel.DEBUG, R.string.msg_dc_asym),
+ MSG_DC_CHARSET (LogLevel.DEBUG, R.string.msg_dc_charset),
MSG_DC_CLEAR_DATA (LogLevel.DEBUG, R.string.msg_dc_clear_data),
MSG_DC_CLEAR_DECOMPRESS (LogLevel.DEBUG, R.string.msg_dc_clear_decompress),
MSG_DC_CLEAR_META_FILE (LogLevel.DEBUG, R.string.msg_dc_clear_meta_file),
MSG_DC_CLEAR_META_MIME (LogLevel.DEBUG, R.string.msg_dc_clear_meta_mime),
MSG_DC_CLEAR_META_SIZE (LogLevel.DEBUG, R.string.msg_dc_clear_meta_size),
+ MSG_DC_CLEAR_META_SIZE_UNKNOWN (LogLevel.DEBUG, R.string.msg_dc_clear_meta_size_unknown),
MSG_DC_CLEAR_META_TIME (LogLevel.DEBUG, R.string.msg_dc_clear_meta_time),
MSG_DC_CLEAR (LogLevel.DEBUG, R.string.msg_dc_clear),
MSG_DC_CLEAR_SIGNATURE_BAD (LogLevel.WARN, R.string.msg_dc_clear_signature_bad),
@@ -590,29 +586,52 @@ public abstract class OperationResult implements Parcelable {
MSG_DC_TRAIL_UNKNOWN (LogLevel.DEBUG, R.string.msg_dc_trail_unknown),
MSG_DC_UNLOCKING (LogLevel.INFO, R.string.msg_dc_unlocking),
+ // verify signed literal data
+ MSG_VL (LogLevel.INFO, R.string.msg_vl),
+ MSG_VL_ERROR_MISSING_SIGLIST (LogLevel.ERROR, R.string.msg_vl_error_no_siglist),
+ MSG_VL_ERROR_MISSING_LITERAL (LogLevel.ERROR, R.string.msg_vl_error_missing_literal),
+ MSG_VL_ERROR_MISSING_KEY (LogLevel.ERROR, R.string.msg_vl_error_wrong_key),
+ MSG_VL_CLEAR_SIGNATURE_CHECK (LogLevel.DEBUG, R.string.msg_vl_clear_signature_check),
+ MSG_VL_ERROR_INTEGRITY_CHECK (LogLevel.ERROR, R.string.msg_vl_error_integrity_check),
+ MSG_VL_OK (LogLevel.OK, R.string.msg_vl_ok),
+
// signencrypt
- MSG_SE_ASYMMETRIC (LogLevel.INFO, R.string.msg_se_asymmetric),
- MSG_SE_CLEARSIGN_ONLY (LogLevel.DEBUG, R.string.msg_se_clearsign_only),
- MSG_SE_COMPRESSING (LogLevel.DEBUG, R.string.msg_se_compressing),
- MSG_SE_ENCRYPTING (LogLevel.DEBUG, R.string.msg_se_encrypting),
- MSG_SE_ERROR_BAD_PASSPHRASE (LogLevel.ERROR, R.string.msg_se_error_bad_passphrase),
- MSG_SE_ERROR_IO (LogLevel.ERROR, R.string.msg_se_error_io),
- MSG_SE_ERROR_SIGN_KEY(LogLevel.ERROR, R.string.msg_se_error_sign_key),
- MSG_SE_ERROR_KEY_SIGN (LogLevel.ERROR, R.string.msg_se_error_key_sign),
- MSG_SE_ERROR_NFC (LogLevel.ERROR, R.string.msg_se_error_nfc),
- MSG_SE_ERROR_PGP (LogLevel.ERROR, R.string.msg_se_error_pgp),
- MSG_SE_ERROR_SIG (LogLevel.ERROR, R.string.msg_se_error_sig),
- MSG_SE_ERROR_UNLOCK (LogLevel.ERROR, R.string.msg_se_error_unlock),
- MSG_SE_KEY_OK (LogLevel.OK, R.string.msg_se_key_ok),
- MSG_SE_KEY_UNKNOWN (LogLevel.DEBUG, R.string.msg_se_key_unknown),
- MSG_SE_KEY_WARN (LogLevel.WARN, R.string.msg_se_key_warn),
- MSG_SE_OK (LogLevel.OK, R.string.msg_se_ok),
- MSG_SE_PENDING_NFC (LogLevel.INFO, R.string.msg_se_pending_nfc),
- MSG_SE_PENDING_PASSPHRASE (LogLevel.INFO, R.string.msg_se_pending_passphrase),
- MSG_SE (LogLevel.DEBUG, R.string.msg_se),
- MSG_SE_SIGNING (LogLevel.DEBUG, R.string.msg_se_signing),
- MSG_SE_SIGCRYPTING (LogLevel.DEBUG, R.string.msg_se_sigcrypting),
- MSG_SE_SYMMETRIC (LogLevel.INFO, R.string.msg_se_symmetric),
+ MSG_SE (LogLevel.START, R.string.msg_se),
+ MSG_SE_INPUT_BYTES (LogLevel.INFO, R.string.msg_se_input_bytes),
+ MSG_SE_INPUT_URI (LogLevel.INFO, R.string.msg_se_input_uri),
+ MSG_SE_ERROR_NO_INPUT (LogLevel.DEBUG, R.string.msg_se_error_no_input),
+ MSG_SE_ERROR_INPUT_URI_NOT_FOUND (LogLevel.ERROR, R.string.msg_se_error_input_uri_not_found),
+ MSG_SE_ERROR_OUTPUT_URI_NOT_FOUND (LogLevel.ERROR, R.string.msg_se_error_output_uri_not_found),
+ MSG_SE_ERROR_TOO_MANY_INPUTS (LogLevel.ERROR, R.string.msg_se_error_too_many_inputs),
+ MSG_SE_WARN_OUTPUT_LEFT (LogLevel.WARN, R.string.msg_se_warn_output_left),
+ MSG_SE_SUCCESS (LogLevel.OK, R.string.msg_se_success),
+
+ // pgpsignencrypt
+ MSG_PSE_ASYMMETRIC (LogLevel.INFO, R.string.msg_pse_asymmetric),
+ MSG_PSE_CLEARSIGN_ONLY (LogLevel.DEBUG, R.string.msg_pse_clearsign_only),
+ MSG_PSE_COMPRESSING (LogLevel.DEBUG, R.string.msg_pse_compressing),
+ MSG_PSE_ENCRYPTING (LogLevel.DEBUG, R.string.msg_pse_encrypting),
+ MSG_PSE_ERROR_BAD_PASSPHRASE (LogLevel.ERROR, R.string.msg_pse_error_bad_passphrase),
+ MSG_PSE_ERROR_HASH_ALGO (LogLevel.ERROR, R.string.msg_pse_error_hash_algo),
+ MSG_PSE_ERROR_IO (LogLevel.ERROR, R.string.msg_pse_error_io),
+ MSG_PSE_ERROR_SIGN_KEY(LogLevel.ERROR, R.string.msg_pse_error_sign_key),
+ MSG_PSE_ERROR_KEY_SIGN (LogLevel.ERROR, R.string.msg_pse_error_key_sign),
+ MSG_PSE_ERROR_NFC (LogLevel.ERROR, R.string.msg_pse_error_nfc),
+ MSG_PSE_ERROR_PGP (LogLevel.ERROR, R.string.msg_pse_error_pgp),
+ MSG_PSE_ERROR_SIG (LogLevel.ERROR, R.string.msg_pse_error_sig),
+ MSG_PSE_ERROR_UNLOCK (LogLevel.ERROR, R.string.msg_pse_error_unlock),
+ MSG_PSE_KEY_OK (LogLevel.OK, R.string.msg_pse_key_ok),
+ MSG_PSE_KEY_UNKNOWN (LogLevel.DEBUG, R.string.msg_pse_key_unknown),
+ MSG_PSE_KEY_WARN (LogLevel.WARN, R.string.msg_pse_key_warn),
+ MSG_PSE_OK (LogLevel.OK, R.string.msg_pse_ok),
+ MSG_PSE_PENDING_NFC (LogLevel.INFO, R.string.msg_pse_pending_nfc),
+ MSG_PSE_PENDING_PASSPHRASE (LogLevel.INFO, R.string.msg_pse_pending_passphrase),
+ MSG_PSE (LogLevel.DEBUG, R.string.msg_pse),
+ MSG_PSE_SIGNING (LogLevel.DEBUG, R.string.msg_pse_signing),
+ MSG_PSE_SIGNING_CLEARTEXT (LogLevel.DEBUG, R.string.msg_pse_signing_cleartext),
+ MSG_PSE_SIGNING_DETACHED (LogLevel.DEBUG, R.string.msg_pse_signing_detached),
+ MSG_PSE_SIGCRYPTING (LogLevel.DEBUG, R.string.msg_pse_sigcrypting),
+ MSG_PSE_SYMMETRIC (LogLevel.INFO, R.string.msg_pse_symmetric),
MSG_CRT_CERTIFYING (LogLevel.DEBUG, R.string.msg_crt_certifying),
MSG_CRT_CERTIFY_ALL (LogLevel.DEBUG, R.string.msg_crt_certify_all),
@@ -645,6 +664,7 @@ public abstract class OperationResult implements Parcelable {
MSG_IMPORT_FINGERPRINT_ERROR (LogLevel.ERROR, R.string.msg_import_fingerprint_error),
MSG_IMPORT_FINGERPRINT_OK (LogLevel.DEBUG, R.string.msg_import_fingerprint_ok),
MSG_IMPORT_ERROR (LogLevel.ERROR, R.string.msg_import_error),
+ MSG_IMPORT_ERROR_IO (LogLevel.ERROR, R.string.msg_import_error_io),
MSG_IMPORT_PARTIAL (LogLevel.ERROR, R.string.msg_import_partial),
MSG_IMPORT_SUCCESS (LogLevel.OK, R.string.msg_import_success),
@@ -742,7 +762,7 @@ public abstract class OperationResult implements Parcelable {
public static class OperationLog implements Iterable<LogEntryParcel> {
- private final List<LogEntryParcel> mParcels = new ArrayList<LogEntryParcel>();
+ private final List<LogEntryParcel> mParcels = new ArrayList<>();
/// Simple convenience method
public void add(LogType type, int indent, Object... parameters) {
@@ -767,7 +787,7 @@ public abstract class OperationResult implements Parcelable {
}
public boolean containsType(LogType type) {
- for(LogEntryParcel entry : new IterableIterator<LogEntryParcel>(mParcels.iterator())) {
+ for(LogEntryParcel entry : new IterableIterator<>(mParcels.iterator())) {
if (entry.mType == type) {
return true;
}
@@ -776,7 +796,7 @@ public abstract class OperationResult implements Parcelable {
}
public boolean containsWarnings() {
- for(LogEntryParcel entry : new IterableIterator<LogEntryParcel>(mParcels.iterator())) {
+ for(LogEntryParcel entry : new IterableIterator<>(mParcels.iterator())) {
if (entry.mType.mLevel == LogLevel.WARN || entry.mType.mLevel == LogLevel.ERROR) {
return true;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PgpSignEncryptResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PgpSignEncryptResult.java
new file mode 100644
index 000000000..de2f64404
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PgpSignEncryptResult.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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.operations.results;
+
+import android.os.Parcel;
+
+import java.util.Date;
+
+public class PgpSignEncryptResult extends OperationResult {
+
+ // the fourth bit indicates a "data pending" result! (it's also a form of non-success)
+ public static final int RESULT_PENDING = RESULT_ERROR + 8;
+
+ // fifth to sixth bit in addition indicate specific type of pending
+ public static final int RESULT_PENDING_PASSPHRASE = RESULT_PENDING + 16;
+ public static final int RESULT_PENDING_NFC = RESULT_PENDING + 32;
+
+ long mKeyIdPassphraseNeeded;
+
+ long mNfcKeyId;
+ byte[] mNfcHash;
+ int mNfcAlgo;
+ Date mNfcTimestamp;
+ String mNfcPassphrase;
+ byte[] mDetachedSignature;
+
+ public long getKeyIdPassphraseNeeded() {
+ return mKeyIdPassphraseNeeded;
+ }
+
+ public void setKeyIdPassphraseNeeded(long keyIdPassphraseNeeded) {
+ mKeyIdPassphraseNeeded = keyIdPassphraseNeeded;
+ }
+
+ public void setNfcData(long nfcKeyId, byte[] nfcHash, int nfcAlgo, Date nfcTimestamp, String passphrase) {
+ mNfcKeyId = nfcKeyId;
+ mNfcHash = nfcHash;
+ mNfcAlgo = nfcAlgo;
+ mNfcTimestamp = nfcTimestamp;
+ mNfcPassphrase = passphrase;
+ }
+
+ public void setDetachedSignature(byte[] detachedSignature) {
+ mDetachedSignature = detachedSignature;
+ }
+
+ public long getNfcKeyId() {
+ return mNfcKeyId;
+ }
+
+ public byte[] getNfcHash() {
+ return mNfcHash;
+ }
+
+ public int getNfcAlgo() {
+ return mNfcAlgo;
+ }
+
+ public Date getNfcTimestamp() {
+ return mNfcTimestamp;
+ }
+
+ public String getNfcPassphrase() {
+ return mNfcPassphrase;
+ }
+
+ public byte[] getDetachedSignature() {
+ return mDetachedSignature;
+ }
+
+ public boolean isPending() {
+ return (mResult & RESULT_PENDING) == RESULT_PENDING;
+ }
+
+ public PgpSignEncryptResult(int result, OperationLog log) {
+ super(result, log);
+ }
+
+ public PgpSignEncryptResult(Parcel source) {
+ super(source);
+ mNfcHash = source.readInt() != 0 ? source.createByteArray() : null;
+ mNfcAlgo = source.readInt();
+ mNfcTimestamp = source.readInt() != 0 ? new Date(source.readLong()) : null;
+ mDetachedSignature = source.readInt() != 0 ? source.createByteArray() : null;
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ if (mNfcHash != null) {
+ dest.writeInt(1);
+ dest.writeByteArray(mNfcHash);
+ } else {
+ dest.writeInt(0);
+ }
+ dest.writeInt(mNfcAlgo);
+ if (mNfcTimestamp != null) {
+ dest.writeInt(1);
+ dest.writeLong(mNfcTimestamp.getTime());
+ } else {
+ dest.writeInt(0);
+ }
+ if (mDetachedSignature != null) {
+ dest.writeInt(1);
+ dest.writeByteArray(mDetachedSignature);
+ } else {
+ dest.writeInt(0);
+ }
+ }
+
+ public static final Creator<PgpSignEncryptResult> CREATOR = new Creator<PgpSignEncryptResult>() {
+ public PgpSignEncryptResult createFromParcel(final Parcel source) {
+ return new PgpSignEncryptResult(source);
+ }
+
+ public PgpSignEncryptResult[] newArray(final int size) {
+ return new PgpSignEncryptResult[size];
+ }
+ };
+
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PromoteKeyResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PromoteKeyResult.java
new file mode 100644
index 000000000..af9aff84a
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/PromoteKeyResult.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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.operations.results;
+
+import android.os.Parcel;
+
+public class PromoteKeyResult extends OperationResult {
+
+ public final Long mMasterKeyId;
+
+ public PromoteKeyResult(int result, OperationLog log, Long masterKeyId) {
+ super(result, log);
+ mMasterKeyId = masterKeyId;
+ }
+
+ public PromoteKeyResult(Parcel source) {
+ super(source);
+ mMasterKeyId = source.readLong();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeLong(mMasterKeyId);
+ }
+
+ public static Creator<PromoteKeyResult> CREATOR = new Creator<PromoteKeyResult>() {
+ public PromoteKeyResult createFromParcel(final Parcel source) {
+ return new PromoteKeyResult(source);
+ }
+
+ public PromoteKeyResult[] newArray(final int size) {
+ return new PromoteKeyResult[size];
+ }
+ };
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SignEncryptResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SignEncryptResult.java
index 57daf3430..ed0de65b0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SignEncryptResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SignEncryptResult.java
@@ -19,74 +19,42 @@ package org.sufficientlysecure.keychain.operations.results;
import android.os.Parcel;
-import java.util.Date;
+import java.util.ArrayList;
public class SignEncryptResult extends OperationResult {
- // the fourth bit indicates a "data pending" result! (it's also a form of non-success)
- public static final int RESULT_PENDING = RESULT_ERROR + 8;
-
- // fifth to sixth bit in addition indicate specific type of pending
- public static final int RESULT_PENDING_PASSPHRASE = RESULT_PENDING + 16;
- public static final int RESULT_PENDING_NFC = RESULT_PENDING + 32;
-
- long mKeyIdPassphraseNeeded;
-
- long mNfcKeyId;
- byte[] mNfcHash;
- int mNfcAlgo;
- Date mNfcTimestamp;
- String mNfcPassphrase;
-
- public long getKeyIdPassphraseNeeded() {
- return mKeyIdPassphraseNeeded;
- }
-
- public void setKeyIdPassphraseNeeded(long keyIdPassphraseNeeded) {
- mKeyIdPassphraseNeeded = keyIdPassphraseNeeded;
- }
-
- public void setNfcData(long nfcKeyId, byte[] nfcHash, int nfcAlgo, Date nfcTimestamp, String passphrase) {
- mNfcKeyId = nfcKeyId;
- mNfcHash = nfcHash;
- mNfcAlgo = nfcAlgo;
- mNfcTimestamp = nfcTimestamp;
- mNfcPassphrase = passphrase;
- }
-
- public long getNfcKeyId() {
- return mNfcKeyId;
- }
+ ArrayList<PgpSignEncryptResult> mResults;
+ byte[] mResultBytes;
- public byte[] getNfcHash() {
- return mNfcHash;
- }
-
- public int getNfcAlgo() {
- return mNfcAlgo;
- }
-
- public Date getNfcTimestamp() {
- return mNfcTimestamp;
- }
+ public static final int RESULT_PENDING = RESULT_ERROR + 8;
- public String getNfcPassphrase() {
- return mNfcPassphrase;
+ public PgpSignEncryptResult getPending() {
+ for (PgpSignEncryptResult sub : mResults) {
+ if (sub.isPending()) {
+ return sub;
+ }
+ }
+ return null;
}
- public boolean isPending() {
- return (mResult & RESULT_PENDING) == RESULT_PENDING;
+ public SignEncryptResult(int result, OperationLog log, ArrayList<PgpSignEncryptResult> results) {
+ super(result, log);
+ mResults = results;
}
- public SignEncryptResult(int result, OperationLog log) {
+ public SignEncryptResult(int result, OperationLog log, ArrayList<PgpSignEncryptResult> results, byte[] resultBytes) {
super(result, log);
+ mResults = results;
+ mResultBytes = resultBytes;
}
public SignEncryptResult(Parcel source) {
super(source);
- mNfcHash = source.readInt() != 0 ? source.createByteArray() : null;
- mNfcAlgo = source.readInt();
- mNfcTimestamp = source.readInt() != 0 ? new Date(source.readLong()) : null;
+ mResults = source.createTypedArrayList(PgpSignEncryptResult.CREATOR);
+ }
+
+ public byte[] getResultBytes() {
+ return mResultBytes;
}
public int describeContents() {
@@ -95,19 +63,7 @@ public class SignEncryptResult extends OperationResult {
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
- if (mNfcHash != null) {
- dest.writeInt(1);
- dest.writeByteArray(mNfcHash);
- } else {
- dest.writeInt(0);
- }
- dest.writeInt(mNfcAlgo);
- if (mNfcTimestamp != null) {
- dest.writeInt(1);
- dest.writeLong(mNfcTimestamp.getTime());
- } else {
- dest.writeInt(0);
- }
+ dest.writeTypedList(mResults);
}
public static final Creator<SignEncryptResult> CREATOR = new Creator<SignEncryptResult>() {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SingletonResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SingletonResult.java
index 43cc85522..04cb241f9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SingletonResult.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/SingletonResult.java
@@ -18,13 +18,8 @@
package org.sufficientlysecure.keychain.operations.results;
-import android.app.Activity;
import android.os.Parcel;
-import com.github.johnpersano.supertoasts.SuperCardToast;
-import com.github.johnpersano.supertoasts.SuperToast;
-import com.github.johnpersano.supertoasts.util.Style;
-
/** This is a simple subclass meant to contain only a single log message. This log
* message is also shown without a log button in the createNotify SuperToast. */
public class SingletonResult extends OperationResult {
@@ -41,35 +36,6 @@ public class SingletonResult extends OperationResult {
}
@Override
- public SuperCardToast createNotify(final Activity activity) {
-
- // there is exactly one error msg - use that one
- String str = activity.getString(mLog.iterator().next().mType.getMsgId());
- int color;
-
- // Determine color by result type
- if (cancelled()) {
- color = Style.RED;
- } else if (success()) {
- if (getLog().containsWarnings()) {
- color = Style.ORANGE;
- } else {
- color = Style.GREEN;
- }
- } else {
- color = Style.RED;
- }
-
- SuperCardToast toast = new SuperCardToast(activity, SuperToast.Type.STANDARD,
- Style.getStyle(color, SuperToast.Animations.POPUP));
- toast.setText(str);
- toast.setDuration(SuperToast.Duration.EXTRA_LONG);
- toast.setIndeterminate(false);
- toast.setSwipeToDismiss(true);
- return toast;
- }
-
- @Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
}
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 db0a9b137..4adacaf23 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedKeyRing.java
@@ -19,7 +19,6 @@
package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.openpgp.PGPKeyRing;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.util.IterableIterator;
@@ -80,9 +79,8 @@ public abstract class CanonicalizedKeyRing extends KeyRing {
public boolean isExpired() {
// Is the master key expired?
- Date creationDate = getRing().getPublicKey().getCreationTime();
- Date expiryDate = getRing().getPublicKey().getValidSeconds() > 0
- ? new Date(creationDate.getTime() + getRing().getPublicKey().getValidSeconds() * 1000) : null;
+ Date creationDate = getPublicKey().getCreationTime();
+ Date expiryDate = getPublicKey().getExpiryTime();
Date now = new Date();
return creationDate.after(now) || (expiryDate != null && expiryDate.before(now));
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 3539a4ceb..303070333 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKey.java
@@ -20,8 +20,16 @@ package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.spongycastle.openpgp.PGPPublicKey;
+import org.spongycastle.openpgp.PGPSignature;
import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
+import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.util.IterableIterator;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
/** Wrapper for a PGPPublicKey.
*
@@ -53,7 +61,7 @@ public class CanonicalizedPublicKey extends UncachedPublicKey {
public boolean canSign() {
// if key flags subpacket is available, honor it!
- if (getKeyUsage() != null) {
+ if (getKeyUsage() != 0) {
return (getKeyUsage() & KeyFlags.SIGN_DATA) != 0;
}
@@ -66,7 +74,7 @@ public class CanonicalizedPublicKey extends UncachedPublicKey {
public boolean canCertify() {
// if key flags subpacket is available, honor it!
- if (getKeyUsage() != null) {
+ if (getKeyUsage() != 0) {
return (getKeyUsage() & KeyFlags.CERTIFY_OTHER) != 0;
}
@@ -79,7 +87,7 @@ public class CanonicalizedPublicKey extends UncachedPublicKey {
public boolean canEncrypt() {
// if key flags subpacket is available, honor it!
- if (getKeyUsage() != null) {
+ if (getKeyUsage() != 0) {
return (getKeyUsage() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0;
}
@@ -93,13 +101,79 @@ public class CanonicalizedPublicKey extends UncachedPublicKey {
public boolean canAuthenticate() {
// if key flags subpacket is available, honor it!
- if (getKeyUsage() != null) {
+ if (getKeyUsage() != 0) {
return (getKeyUsage() & KeyFlags.AUTHENTICATION) != 0;
}
return false;
}
+ public boolean isRevoked() {
+ return mPublicKey.getSignaturesOfType(isMasterKey()
+ ? PGPSignature.KEY_REVOCATION
+ : PGPSignature.SUBKEY_REVOCATION).hasNext();
+ }
+
+ public boolean isExpired () {
+ Date expiry = getExpiryTime();
+ return expiry != null && expiry.before(new Date());
+ }
+
+ public long getValidSeconds() {
+
+ long seconds;
+
+ // the getValidSeconds method is unreliable for master keys. we need to iterate all
+ // user ids, then use the most recent certification from a non-revoked user id
+ if (isMasterKey()) {
+ Date latestCreation = null;
+ seconds = 0;
+
+ for (byte[] rawUserId : getUnorderedRawUserIds()) {
+ Iterator<WrappedSignature> sigs = getSignaturesForRawId(rawUserId);
+
+ // there is always a certification, so this call is safe
+ WrappedSignature sig = sigs.next();
+
+ // we know a user id has at most two sigs: one certification, one revocation.
+ // if the sig is a revocation, or there is another sig (which is a revocation),
+ // the data in this uid is not relevant
+ if (sig.isRevocation() || sigs.hasNext()) {
+ continue;
+ }
+
+ // this is our revocation, UNLESS there is a newer certificate!
+ if (latestCreation == null || latestCreation.before(sig.getCreationTime())) {
+ latestCreation = sig.getCreationTime();
+ seconds = sig.getKeyExpirySeconds();
+ }
+ }
+ } else {
+ seconds = mPublicKey.getValidSeconds();
+ }
+
+ return seconds;
+ }
+
+ public Date getExpiryTime() {
+ long seconds = getValidSeconds();
+
+ if (seconds > Integer.MAX_VALUE) {
+ Log.e(Constants.TAG, "error, expiry time too large");
+ return null;
+ }
+ if (seconds == 0) {
+ // no expiry
+ return null;
+ }
+ Date creationDate = getCreationTime();
+ Calendar calendar = GregorianCalendar.getInstance();
+ calendar.setTime(creationDate);
+ calendar.add(Calendar.SECOND, (int) seconds);
+
+ return calendar.getTime();
+ }
+
/** Same method as superclass, but we make it public. */
public Integer getKeyUsage() {
return super.getKeyUsage();
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 85ef3eaa4..c2506685d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
@@ -18,9 +18,11 @@
package org.sufficientlysecure.keychain.pgp;
+import org.spongycastle.bcpg.S2K;
import org.spongycastle.openpgp.PGPObjectFactory;
import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyRing;
+import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.util.IterableIterator;
@@ -76,7 +78,7 @@ public class CanonicalizedPublicKeyRing extends CanonicalizedKeyRing {
public IterableIterator<CanonicalizedPublicKey> publicKeyIterator() {
@SuppressWarnings("unchecked")
final Iterator<PGPPublicKey> it = getRing().getPublicKeys();
- return new IterableIterator<CanonicalizedPublicKey>(new Iterator<CanonicalizedPublicKey>() {
+ return new IterableIterator<>(new Iterator<CanonicalizedPublicKey>() {
@Override
public boolean hasNext() {
return it.hasNext();
@@ -94,4 +96,13 @@ public class CanonicalizedPublicKeyRing extends CanonicalizedKeyRing {
});
}
+ /** Create a dummy secret ring from this key */
+ public UncachedKeyRing createDummySecretRing () {
+
+ PGPSecretKeyRing secRing = PGPSecretKeyRing.constructDummyFromPublic(getRing(),
+ S2K.GNU_PROTECTION_MODE_NO_PRIVATE_KEY);
+ return new UncachedKeyRing(secRing);
+
+ }
+
} \ No newline at end of file
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 6ccadac2e..40f2f48ad 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKey.java
@@ -182,7 +182,7 @@ public class CanonicalizedSecretKey extends CanonicalizedPublicKey {
* @return
*/
public LinkedList<Integer> getSupportedHashAlgorithms() {
- LinkedList<Integer> supported = new LinkedList<Integer>();
+ LinkedList<Integer> supported = new LinkedList<>();
if (mPrivateKeyState == PRIVATE_KEY_STATE_DIVERT_TO_CARD) {
// No support for MD5
@@ -247,7 +247,7 @@ public class CanonicalizedSecretKey extends CanonicalizedPublicKey {
int signatureType;
if (cleartext) {
- // for sign-only ascii text
+ // for sign-only ascii text (cleartext signature)
signatureType = PGPSignature.CANONICAL_TEXT_DOCUMENT;
} else {
signatureType = PGPSignature.BINARY_DOCUMENT;
@@ -262,11 +262,9 @@ public class CanonicalizedSecretKey extends CanonicalizedPublicKey {
spGen.setSignatureCreationTime(false, nfcCreationTimestamp);
signatureGenerator.setHashedSubpackets(spGen.generate());
return signatureGenerator;
- } catch (PgpKeyNotFoundException e) {
+ } catch (PgpKeyNotFoundException | PGPException e) {
// TODO: simply throw PGPException!
throw new PgpGeneralException("Error initializing signature!", e);
- } catch (PGPException e) {
- throw new PgpGeneralException("Error initializing signature!", e);
}
}
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 eb589c3f9..b5f6a5b09 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedSecretKeyRing.java
@@ -18,27 +18,19 @@
package org.sufficientlysecure.keychain.pgp;
-import org.spongycastle.bcpg.S2K;
-import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.PGPKeyRing;
import org.spongycastle.openpgp.PGPObjectFactory;
-import org.spongycastle.openpgp.PGPPrivateKey;
import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.spongycastle.openpgp.PGPSignature;
-import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
-import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Iterator;
public class CanonicalizedSecretKeyRing extends CanonicalizedKeyRing {
@@ -94,7 +86,7 @@ public class CanonicalizedSecretKeyRing extends CanonicalizedKeyRing {
public IterableIterator<CanonicalizedSecretKey> secretKeyIterator() {
final Iterator<PGPSecretKey> it = mRing.getSecretKeys();
- return new IterableIterator<CanonicalizedSecretKey>(new Iterator<CanonicalizedSecretKey>() {
+ return new IterableIterator<>(new Iterator<CanonicalizedSecretKey>() {
@Override
public boolean hasNext() {
return it.hasNext();
@@ -114,7 +106,7 @@ public class CanonicalizedSecretKeyRing extends CanonicalizedKeyRing {
public IterableIterator<CanonicalizedPublicKey> publicKeyIterator() {
final Iterator<PGPPublicKey> it = getRing().getPublicKeys();
- return new IterableIterator<CanonicalizedPublicKey>(new Iterator<CanonicalizedPublicKey>() {
+ return new IterableIterator<>(new Iterator<CanonicalizedPublicKey>() {
@Override
public boolean hasNext() {
return it.hasNext();
@@ -133,7 +125,7 @@ public class CanonicalizedSecretKeyRing extends CanonicalizedKeyRing {
}
public HashMap<String,String> getLocalNotationData() {
- HashMap<String,String> result = new HashMap<String,String>();
+ HashMap<String,String> result = new HashMap<>();
Iterator<PGPSignature> it = getRing().getPublicKey().getKeySignatures();
while (it.hasNext()) {
WrappedSignature sig = new WrappedSignature(it.next());
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java
index aa324c7ed..46defebf7 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java
@@ -19,7 +19,6 @@ package org.sufficientlysecure.keychain.pgp;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.util.Log;
@@ -33,7 +32,7 @@ public class OpenPgpSignatureResultBuilder {
// OpenPgpSignatureResult
private boolean mSignatureOnly = false;
private String mPrimaryUserId;
- private ArrayList<String> mUserIds = new ArrayList<String>();
+ private ArrayList<String> mUserIds = new ArrayList<>();
private long mKeyId;
// builder
@@ -105,8 +104,8 @@ public class OpenPgpSignatureResultBuilder {
setUserIds(signingRing.getUnorderedUserIds());
// either master key is expired/revoked or this specific subkey is expired/revoked
- setKeyExpired(signingRing.isExpired() || signingKey.isExpired());
- setKeyRevoked(signingRing.isRevoked() || signingKey.isRevoked());
+ setKeyExpired(signingRing.isExpired() || signingKey.isMaybeExpired());
+ setKeyRevoked(signingRing.isRevoked() || signingKey.isMaybeRevoked());
}
public OpenPgpSignatureResult build() {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
index b58df085f..2ba0b6231 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
@@ -22,13 +22,13 @@ import android.content.Context;
import android.webkit.MimeTypeMap;
import org.openintents.openpgp.OpenPgpMetadata;
+import org.openintents.openpgp.OpenPgpSignatureResult;
import org.spongycastle.bcpg.ArmoredInputStream;
import org.spongycastle.openpgp.PGPCompressedData;
import org.spongycastle.openpgp.PGPEncryptedData;
import org.spongycastle.openpgp.PGPEncryptedDataList;
import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.PGPLiteralData;
-import org.spongycastle.openpgp.PGPObjectFactory;
import org.spongycastle.openpgp.PGPOnePassSignature;
import org.spongycastle.openpgp.PGPOnePassSignatureList;
import org.spongycastle.openpgp.PGPPBEEncryptedData;
@@ -36,10 +36,10 @@ import org.spongycastle.openpgp.PGPPublicKeyEncryptedData;
import org.spongycastle.openpgp.PGPSignature;
import org.spongycastle.openpgp.PGPSignatureList;
import org.spongycastle.openpgp.PGPUtil;
+import org.spongycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.spongycastle.openpgp.operator.PBEDataDecryptorFactory;
import org.spongycastle.openpgp.operator.PGPDigestCalculatorProvider;
import org.spongycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
-import org.spongycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
import org.spongycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
import org.spongycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
import org.spongycastle.openpgp.operator.jcajce.JcePBEDataDecryptorFactoryBuilder;
@@ -48,11 +48,15 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.BaseOperation;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
@@ -83,6 +87,9 @@ public class PgpDecryptVerify extends BaseOperation {
private Set<Long> mAllowedKeyIds;
private boolean mDecryptMetadataOnly;
private byte[] mDecryptedSessionKey;
+ private byte[] mDetachedSignature;
+ private String mRequiredSignerFingerprint;
+ private boolean mSignedLiteralData;
protected PgpDecryptVerify(Builder builder) {
super(builder.mContext, builder.mProviderHelper, builder.mProgressable);
@@ -96,6 +103,9 @@ public class PgpDecryptVerify extends BaseOperation {
this.mAllowedKeyIds = builder.mAllowedKeyIds;
this.mDecryptMetadataOnly = builder.mDecryptMetadataOnly;
this.mDecryptedSessionKey = builder.mDecryptedSessionKey;
+ this.mDetachedSignature = builder.mDetachedSignature;
+ this.mSignedLiteralData = builder.mSignedLiteralData;
+ this.mRequiredSignerFingerprint = builder.mRequiredSignerFingerprint;
}
public static class Builder {
@@ -103,15 +113,18 @@ public class PgpDecryptVerify extends BaseOperation {
private Context mContext;
private ProviderHelper mProviderHelper;
private InputData mData;
- private OutputStream mOutStream;
// optional
+ private OutputStream mOutStream = null;
private Progressable mProgressable = null;
private boolean mAllowSymmetricDecryption = true;
private String mPassphrase = null;
private Set<Long> mAllowedKeyIds = null;
private boolean mDecryptMetadataOnly = false;
private byte[] mDecryptedSessionKey = null;
+ private byte[] mDetachedSignature = null;
+ private String mRequiredSignerFingerprint = null;
+ private boolean mSignedLiteralData = false;
public Builder(Context context, ProviderHelper providerHelper,
Progressable progressable,
@@ -123,6 +136,24 @@ public class PgpDecryptVerify extends BaseOperation {
mOutStream = outStream;
}
+ /**
+ * This is used when verifying signed literals to check that they are signed with
+ * the required key
+ */
+ public Builder setRequiredSignerFingerprint(String fingerprint) {
+ mRequiredSignerFingerprint = fingerprint;
+ return this;
+ }
+
+ /**
+ * This is to force a mode where the message is just the signature key id and
+ * then a literal data packet; used in Keybase.io proofs
+ */
+ public Builder setSignedLiteralData(boolean signedLiteralData) {
+ mSignedLiteralData = signedLiteralData;
+ return this;
+ }
+
public Builder setAllowSymmetricDecryption(boolean allowSymmetricDecryption) {
mAllowSymmetricDecryption = allowSymmetricDecryption;
return this;
@@ -156,6 +187,14 @@ public class PgpDecryptVerify extends BaseOperation {
return this;
}
+ /**
+ * If detachedSignature != null, it will be used exclusively to verify the signature
+ */
+ public Builder setDetachedSignature(byte[] detachedSignature) {
+ mDetachedSignature = detachedSignature;
+ return this;
+ }
+
public PgpDecryptVerify build() {
return new PgpDecryptVerify(this);
}
@@ -166,22 +205,32 @@ public class PgpDecryptVerify extends BaseOperation {
*/
public DecryptVerifyResult execute() {
try {
- // automatically works with ascii armor input and binary
- InputStream in = PGPUtil.getDecoderStream(mData.getInputStream());
-
- if (in instanceof ArmoredInputStream) {
- ArmoredInputStream aIn = (ArmoredInputStream) in;
- // it is ascii armored
- Log.d(Constants.TAG, "ASCII Armor Header Line: " + aIn.getArmorHeaderLine());
+ if (mDetachedSignature != null) {
+ Log.d(Constants.TAG, "Detached signature present, verifying with this signature only");
- if (aIn.isClearText()) {
- // a cleartext signature, verify it with the other method
- return verifyCleartextSignature(aIn, 0);
+ return verifyDetachedSignature(mData.getInputStream(), 0);
+ } else {
+ // automatically works with PGP ascii armor and PGP binary
+ InputStream in = PGPUtil.getDecoderStream(mData.getInputStream());
+
+ if (in instanceof ArmoredInputStream) {
+ ArmoredInputStream aIn = (ArmoredInputStream) in;
+ // it is ascii armored
+ Log.d(Constants.TAG, "ASCII Armor Header Line: " + aIn.getArmorHeaderLine());
+
+ if (mSignedLiteralData) {
+ return verifySignedLiteralData(aIn, 0);
+ } else if (aIn.isClearText()) {
+ // a cleartext signature, verify it with the other method
+ return verifyCleartextSignature(aIn, 0);
+ } else {
+ // else: ascii armored encryption! go on...
+ return decryptVerify(in, 0);
+ }
+ } else {
+ return decryptVerify(in, 0);
}
- // else: ascii armored encryption! go on...
}
-
- return decryptVerify(in, 0);
} catch (PGPException e) {
Log.d(Constants.TAG, "PGPException", e);
OperationLog log = new OperationLog();
@@ -196,6 +245,136 @@ public class PgpDecryptVerify extends BaseOperation {
}
/**
+ * Verify Keybase.io style signed literal data
+ */
+ private DecryptVerifyResult verifySignedLiteralData(InputStream in, int indent) throws IOException, PGPException {
+ OperationLog log = new OperationLog();
+ log.add(LogType.MSG_VL, indent);
+
+ // thinking that the proof-fetching operation is going to take most of the time
+ updateProgress(R.string.progress_reading_data, 75, 100);
+
+ JcaPGPObjectFactory pgpF = new JcaPGPObjectFactory(in);
+ Object o = pgpF.nextObject();
+ if (o instanceof PGPCompressedData) {
+ log.add(LogType.MSG_DC_CLEAR_DECOMPRESS, indent + 1);
+
+ pgpF = new JcaPGPObjectFactory(((PGPCompressedData) o).getDataStream());
+ o = pgpF.nextObject();
+ updateProgress(R.string.progress_decompressing_data, 80, 100);
+ }
+
+ // all we want to see is a OnePassSignatureList followed by LiteralData
+ if (!(o instanceof PGPOnePassSignatureList)) {
+ log.add(LogType.MSG_VL_ERROR_MISSING_SIGLIST, indent);
+ return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
+ }
+ PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) o;
+
+ // go through all signatures (should be just one), make sure we have
+ // the key and it matches the one we’re looking for
+ CanonicalizedPublicKeyRing signingRing = null;
+ CanonicalizedPublicKey signingKey = null;
+ int signatureIndex = -1;
+ for (int i = 0; i < sigList.size(); ++i) {
+ try {
+ long sigKeyId = sigList.get(i).getKeyID();
+ signingRing = mProviderHelper.getCanonicalizedPublicKeyRing(
+ KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(sigKeyId)
+ );
+ signingKey = signingRing.getPublicKey(sigKeyId);
+ signatureIndex = i;
+ } catch (ProviderHelper.NotFoundException e) {
+ Log.d(Constants.TAG, "key not found, trying next signature...");
+ }
+ }
+
+ // there has to be a key, and it has to be the right one
+ if (signingKey == null) {
+ log.add(LogType.MSG_VL_ERROR_MISSING_KEY, indent);
+ Log.d(Constants.TAG, "Failed to find key in signed-literal message");
+ return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
+ }
+
+ String fingerprint = KeyFormattingUtils.convertFingerprintToHex(signingRing.getFingerprint());
+ if (!(mRequiredSignerFingerprint.equals(fingerprint))) {
+ log.add(LogType.MSG_VL_ERROR_MISSING_KEY, indent);
+ Log.d(Constants.TAG, "Fingerprint mismatch; wanted " + mRequiredSignerFingerprint +
+ " got " + fingerprint + "!");
+ return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
+ }
+
+ OpenPgpSignatureResultBuilder signatureResultBuilder = new OpenPgpSignatureResultBuilder();
+
+ PGPOnePassSignature signature = sigList.get(signatureIndex);
+ signatureResultBuilder.initValid(signingRing, signingKey);
+
+ JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider =
+ new JcaPGPContentVerifierBuilderProvider()
+ .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
+ signature.init(contentVerifierBuilderProvider, signingKey.getPublicKey());
+
+ o = pgpF.nextObject();
+
+ if (!(o instanceof PGPLiteralData)) {
+ log.add(LogType.MSG_VL_ERROR_MISSING_LITERAL, indent);
+ return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
+ }
+
+ PGPLiteralData literalData = (PGPLiteralData) o;
+
+ log.add(LogType.MSG_DC_CLEAR_DATA, indent + 1);
+ updateProgress(R.string.progress_decrypting, 85, 100);
+
+ InputStream dataIn = literalData.getInputStream();
+
+ int length;
+ byte[] buffer = new byte[1 << 16];
+ while ((length = dataIn.read(buffer)) > 0) {
+ mOutStream.write(buffer, 0, length);
+ signature.update(buffer, 0, length);
+ }
+
+ updateProgress(R.string.progress_verifying_signature, 95, 100);
+ log.add(LogType.MSG_VL_CLEAR_SIGNATURE_CHECK, indent + 1);
+
+ PGPSignatureList signatureList = (PGPSignatureList) pgpF.nextObject();
+ PGPSignature messageSignature = signatureList.get(signatureIndex);
+
+ // these are not cleartext signatures!
+ // TODO: what about binary signatures?
+ signatureResultBuilder.setSignatureOnly(false);
+
+ // Verify signature and check binding signatures
+ boolean validSignature = signature.verify(messageSignature);
+ if (validSignature) {
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_OK, indent + 1);
+ } else {
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_BAD, indent + 1);
+ }
+ signatureResultBuilder.setValidSignature(validSignature);
+
+ OpenPgpSignatureResult signatureResult = signatureResultBuilder.build();
+
+ if (signatureResult.getStatus() != OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED
+ && signatureResult.getStatus() != OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED) {
+ log.add(LogType.MSG_VL_ERROR_INTEGRITY_CHECK, indent);
+ return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
+ }
+
+ updateProgress(R.string.progress_done, 100, 100);
+
+ log.add(LogType.MSG_VL_OK, indent);
+
+ // Return a positive result, with metadata and verification info
+ DecryptVerifyResult result =
+ new DecryptVerifyResult(DecryptVerifyResult.RESULT_OK, log);
+ result.setSignatureResult(signatureResult);
+ return result;
+ }
+
+
+ /**
* Decrypt and/or verifies binary or ascii armored pgp
*/
private DecryptVerifyResult decryptVerify(InputStream in, int indent) throws IOException, PGPException {
@@ -205,7 +384,7 @@ public class PgpDecryptVerify extends BaseOperation {
log.add(LogType.MSG_DC, indent);
indent += 1;
- PGPObjectFactory pgpF = new PGPObjectFactory(in, new JcaKeyFingerprintCalculator());
+ JcaPGPObjectFactory pgpF = new JcaPGPObjectFactory(in);
PGPEncryptedDataList enc;
Object o = pgpF.nextObject();
@@ -234,6 +413,25 @@ public class PgpDecryptVerify extends BaseOperation {
boolean symmetricPacketFound = false;
boolean anyPacketFound = false;
+ // If the input stream is armored, and there is a charset specified, take a note for later
+ // https://tools.ietf.org/html/rfc4880#page56
+ String charset = null;
+ if (in instanceof ArmoredInputStream) {
+ ArmoredInputStream aIn = (ArmoredInputStream) in;
+ if (aIn.getArmorHeaders() != null) {
+ for (String header : aIn.getArmorHeaders()) {
+ String[] pieces = header.split(":", 2);
+ if (pieces.length == 2 && "charset".equalsIgnoreCase(pieces[0])) {
+ charset = pieces[1].trim();
+ break;
+ }
+ }
+ if (charset != null) {
+ log.add(LogType.MSG_DC_CHARSET, indent, charset);
+ }
+ }
+ }
+
// go through all objects and find one we can decrypt
while (it.hasNext()) {
Object obj = it.next();
@@ -257,19 +455,19 @@ public class PgpDecryptVerify extends BaseOperation {
);
} catch (ProviderHelper.NotFoundException e) {
// continue with the next packet in the while loop
- log.add(LogType.MSG_DC_ASKIP_NO_KEY, indent +1);
+ log.add(LogType.MSG_DC_ASKIP_NO_KEY, indent + 1);
continue;
}
if (secretKeyRing == null) {
// continue with the next packet in the while loop
- log.add(LogType.MSG_DC_ASKIP_NO_KEY, indent +1);
+ log.add(LogType.MSG_DC_ASKIP_NO_KEY, indent + 1);
continue;
}
// get subkey which has been used for this encryption packet
secretEncryptionKey = secretKeyRing.getSecretKey(subKeyId);
if (secretEncryptionKey == null) {
// should actually never happen, so no need to be more specific.
- log.add(LogType.MSG_DC_ASKIP_NO_KEY, indent +1);
+ log.add(LogType.MSG_DC_ASKIP_NO_KEY, indent + 1);
continue;
}
@@ -283,7 +481,7 @@ public class PgpDecryptVerify extends BaseOperation {
if (!mAllowedKeyIds.contains(masterKeyId)) {
// this key is in our db, but NOT allowed!
// continue with the next packet in the while loop
- log.add(LogType.MSG_DC_ASKIP_NOT_ALLOWED, indent +1);
+ log.add(LogType.MSG_DC_ASKIP_NOT_ALLOWED, indent + 1);
continue;
}
}
@@ -298,15 +496,15 @@ public class PgpDecryptVerify extends BaseOperation {
try {
// returns "" if key has no passphrase
mPassphrase = getCachedPassphrase(subKeyId);
- log.add(LogType.MSG_DC_PASS_CACHED, indent +1);
+ log.add(LogType.MSG_DC_PASS_CACHED, indent + 1);
} catch (PassphraseCacheInterface.NoSecretKeyException e) {
- log.add(LogType.MSG_DC_ERROR_NO_KEY, indent +1);
+ log.add(LogType.MSG_DC_ERROR_NO_KEY, indent + 1);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
}
// if passphrase was not cached, return here indicating that a passphrase is missing!
if (mPassphrase == null) {
- log.add(LogType.MSG_DC_PENDING_PASSPHRASE, indent +1);
+ log.add(LogType.MSG_DC_PENDING_PASSPHRASE, indent + 1);
DecryptVerifyResult result =
new DecryptVerifyResult(DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE, log);
result.setKeyIdPassphraseNeeded(subKeyId);
@@ -322,8 +520,8 @@ public class PgpDecryptVerify extends BaseOperation {
log.add(LogType.MSG_DC_SYM, indent);
- if (! mAllowSymmetricDecryption) {
- log.add(LogType.MSG_DC_SYM_SKIP, indent +1);
+ if (!mAllowSymmetricDecryption) {
+ log.add(LogType.MSG_DC_SYM_SKIP, indent + 1);
continue;
}
@@ -338,7 +536,7 @@ public class PgpDecryptVerify extends BaseOperation {
// if no passphrase is given, return here
// indicating that a passphrase is missing!
if (mPassphrase == null) {
- log.add(LogType.MSG_DC_PENDING_PASSPHRASE, indent +1);
+ log.add(LogType.MSG_DC_PENDING_PASSPHRASE, indent + 1);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE, log);
}
@@ -383,13 +581,13 @@ public class PgpDecryptVerify extends BaseOperation {
updateProgress(R.string.progress_extracting_key, currentProgress, 100);
try {
- log.add(LogType.MSG_DC_UNLOCKING, indent +1);
+ log.add(LogType.MSG_DC_UNLOCKING, indent + 1);
if (!secretEncryptionKey.unlock(mPassphrase)) {
- log.add(LogType.MSG_DC_ERROR_BAD_PASSPHRASE, indent +1);
+ log.add(LogType.MSG_DC_ERROR_BAD_PASSPHRASE, indent + 1);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
}
} catch (PgpGeneralException e) {
- log.add(LogType.MSG_DC_ERROR_EXTRACT_KEY, indent +1);
+ log.add(LogType.MSG_DC_ERROR_EXTRACT_KEY, indent + 1);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
}
@@ -401,7 +599,7 @@ public class PgpDecryptVerify extends BaseOperation {
= secretEncryptionKey.getDecryptorFactory(mDecryptedSessionKey);
clear = encryptedDataAsymmetric.getDataStream(decryptorFactory);
} catch (NfcSyncPublicKeyDataDecryptorFactoryBuilder.NfcInteractionNeeded e) {
- log.add(LogType.MSG_DC_PENDING_NFC, indent +1);
+ log.add(LogType.MSG_DC_PENDING_NFC, indent + 1);
DecryptVerifyResult result =
new DecryptVerifyResult(DecryptVerifyResult.RESULT_PENDING_NFC, log);
result.setNfcState(secretEncryptionKey.getKeyId(), e.encryptedSessionKey, mPassphrase);
@@ -412,11 +610,11 @@ public class PgpDecryptVerify extends BaseOperation {
// If we didn't find any useful data, error out
// no packet has been found where we have the corresponding secret key in our db
log.add(
- anyPacketFound ? LogType.MSG_DC_ERROR_NO_KEY : LogType.MSG_DC_ERROR_NO_DATA, indent +1);
+ anyPacketFound ? LogType.MSG_DC_ERROR_NO_KEY : LogType.MSG_DC_ERROR_NO_DATA, indent + 1);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
}
- PGPObjectFactory plainFact = new PGPObjectFactory(clear, new JcaKeyFingerprintCalculator());
+ JcaPGPObjectFactory plainFact = new JcaPGPObjectFactory(clear);
Object dataChunk = plainFact.nextObject();
OpenPgpSignatureResultBuilder signatureResultBuilder = new OpenPgpSignatureResultBuilder();
int signatureIndex = -1;
@@ -427,25 +625,27 @@ public class PgpDecryptVerify extends BaseOperation {
indent += 1;
if (dataChunk instanceof PGPCompressedData) {
- log.add(LogType.MSG_DC_CLEAR_DECOMPRESS, indent +1);
+ log.add(LogType.MSG_DC_CLEAR_DECOMPRESS, indent + 1);
currentProgress += 2;
updateProgress(R.string.progress_decompressing_data, currentProgress, 100);
PGPCompressedData compressedData = (PGPCompressedData) dataChunk;
- PGPObjectFactory fact = new PGPObjectFactory(compressedData.getDataStream(), new JcaKeyFingerprintCalculator());
+ JcaPGPObjectFactory fact = new JcaPGPObjectFactory(compressedData.getDataStream());
dataChunk = fact.nextObject();
plainFact = fact;
}
PGPOnePassSignature signature = null;
if (dataChunk instanceof PGPOnePassSignatureList) {
- log.add(LogType.MSG_DC_CLEAR_SIGNATURE, indent +1);
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE, indent + 1);
currentProgress += 2;
updateProgress(R.string.progress_processing_signature, currentProgress, 100);
PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk;
+ // NOTE: following code is similar to processSignature, but for PGPOnePassSignature
+
// go through all signatures
// and find out for which signature we have a key in our database
for (int i = 0; i < sigList.size(); ++i) {
@@ -491,19 +691,15 @@ public class PgpDecryptVerify extends BaseOperation {
OpenPgpMetadata metadata;
if (dataChunk instanceof PGPLiteralData) {
- log.add(LogType.MSG_DC_CLEAR_DATA, indent +1);
+ log.add(LogType.MSG_DC_CLEAR_DATA, indent + 1);
indent += 2;
currentProgress += 4;
updateProgress(R.string.progress_decrypting, currentProgress, 100);
PGPLiteralData literalData = (PGPLiteralData) dataChunk;
- // TODO: how to get the real original size?
- // this is the encrypted size so if we enable compression this value is wrong!
- long originalSize = mData.getSize() - mData.getStreamPosition();
- if (originalSize < 0) {
- originalSize = 0;
- }
+ // reported size may be null if partial packets are involved (highly unlikely though)
+ Long originalSize = literalData.getDataLengthIfAvailable();
String originalFilename = literalData.getFileName();
String mimeType = null;
@@ -531,18 +727,20 @@ public class PgpDecryptVerify extends BaseOperation {
originalFilename,
mimeType,
literalData.getModificationTime().getTime(),
- originalSize);
+ originalSize == null ? 0 : originalSize);
- if ( ! originalFilename.equals("")) {
+ if (!"".equals(originalFilename)) {
log.add(LogType.MSG_DC_CLEAR_META_FILE, indent + 1, originalFilename);
}
- log.add(LogType.MSG_DC_CLEAR_META_MIME, indent +1,
+ log.add(LogType.MSG_DC_CLEAR_META_MIME, indent + 1,
mimeType);
- log.add(LogType.MSG_DC_CLEAR_META_TIME, indent +1,
+ log.add(LogType.MSG_DC_CLEAR_META_TIME, indent + 1,
new Date(literalData.getModificationTime().getTime()).toString());
- if (originalSize != 0) {
+ if (originalSize != null) {
log.add(LogType.MSG_DC_CLEAR_META_SIZE, indent + 1,
Long.toString(originalSize));
+ } else {
+ log.add(LogType.MSG_DC_CLEAR_META_SIZE_UNKNOWN, indent + 1);
}
// return here if we want to decrypt the metadata only
@@ -550,6 +748,7 @@ public class PgpDecryptVerify extends BaseOperation {
log.add(LogType.MSG_DC_OK_META_ONLY, indent);
DecryptVerifyResult result =
new DecryptVerifyResult(DecryptVerifyResult.RESULT_OK, log);
+ result.setCharset(charset);
result.setDecryptMetadata(metadata);
return result;
}
@@ -572,7 +771,10 @@ public class PgpDecryptVerify extends BaseOperation {
int length;
byte[] buffer = new byte[1 << 16];
while ((length = dataIn.read(buffer)) > 0) {
- mOutStream.write(buffer, 0, length);
+ Log.d(Constants.TAG, "read bytes: " + length);
+ if (mOutStream != null) {
+ mOutStream.write(buffer, 0, length);
+ }
// update signature buffer if signature is also present
if (signature != null) {
@@ -587,9 +789,8 @@ public class PgpDecryptVerify extends BaseOperation {
progress = 100;
}
progressScaler.setProgress((int) progress, 100);
- } else {
- // TODO: slow annealing to fake a progress?
}
+ // TODO: slow annealing to fake a progress?
}
if (signature != null) {
@@ -606,9 +807,9 @@ public class PgpDecryptVerify extends BaseOperation {
// Verify signature and check binding signatures
boolean validSignature = signature.verify(messageSignature);
if (validSignature) {
- log.add(LogType.MSG_DC_CLEAR_SIGNATURE_OK, indent +1);
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_OK, indent + 1);
} else {
- log.add(LogType.MSG_DC_CLEAR_SIGNATURE_BAD, indent +1);
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_BAD, indent + 1);
}
signatureResultBuilder.setValidSignature(validSignature);
}
@@ -632,6 +833,7 @@ public class PgpDecryptVerify extends BaseOperation {
// If no valid signature is present:
// Handle missing integrity protection like failed integrity protection!
// The MDC packet can be stripped by an attacker!
+ Log.d(Constants.TAG, "MDC fail");
if (!signatureResultBuilder.isValidSignature()) {
log.add(LogType.MSG_DC_ERROR_INTEGRITY_MISSING, indent);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
@@ -647,6 +849,7 @@ public class PgpDecryptVerify extends BaseOperation {
new DecryptVerifyResult(DecryptVerifyResult.RESULT_OK, log);
result.setDecryptMetadata(metadata);
result.setSignatureResult(signatureResultBuilder.build());
+ result.setCharset(charset);
return result;
}
@@ -669,7 +872,7 @@ public class PgpDecryptVerify extends BaseOperation {
ByteArrayOutputStream out = new ByteArrayOutputStream();
- updateProgress(R.string.progress_done, 0, 100);
+ updateProgress(R.string.progress_reading_data, 0, 100);
ByteArrayOutputStream lineOut = new ByteArrayOutputStream();
int lookAhead = readInputLine(lineOut, aIn);
@@ -689,10 +892,12 @@ public class PgpDecryptVerify extends BaseOperation {
out.close();
byte[] clearText = out.toByteArray();
- mOutStream.write(clearText);
+ if (mOutStream != null) {
+ mOutStream.write(clearText);
+ }
updateProgress(R.string.progress_processing_signature, 60, 100);
- PGPObjectFactory pgpFact = new PGPObjectFactory(aIn, new JcaKeyFingerprintCalculator());
+ JcaPGPObjectFactory pgpFact = new JcaPGPObjectFactory(aIn);
PGPSignatureList sigList = (PGPSignatureList) pgpFact.nextObject();
if (sigList == null) {
@@ -700,45 +905,7 @@ public class PgpDecryptVerify extends BaseOperation {
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
}
- CanonicalizedPublicKeyRing signingRing = null;
- CanonicalizedPublicKey signingKey = null;
- int signatureIndex = -1;
-
- // go through all signatures
- // and find out for which signature we have a key in our database
- for (int i = 0; i < sigList.size(); ++i) {
- try {
- long sigKeyId = sigList.get(i).getKeyID();
- signingRing = mProviderHelper.getCanonicalizedPublicKeyRing(
- KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(sigKeyId)
- );
- signingKey = signingRing.getPublicKey(sigKeyId);
- signatureIndex = i;
- } catch (ProviderHelper.NotFoundException e) {
- Log.d(Constants.TAG, "key not found, trying next signature...");
- }
- }
-
- PGPSignature signature = null;
-
- if (signingKey != null) {
- // key found in our database!
- signature = sigList.get(signatureIndex);
-
- signatureResultBuilder.initValid(signingRing, signingKey);
-
- JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider =
- new JcaPGPContentVerifierBuilderProvider()
- .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
- signature.init(contentVerifierBuilderProvider, signingKey.getPublicKey());
- } else {
- // no key in our database -> return "unknown pub key" status including the first key id
- if (!sigList.isEmpty()) {
- signatureResultBuilder.setSignatureAvailable(true);
- signatureResultBuilder.setKnownKey(false);
- signatureResultBuilder.setKeyId(sigList.get(0).getKeyID());
- }
- }
+ PGPSignature signature = processPGPSignatureList(sigList, signatureResultBuilder);
if (signature != null) {
try {
@@ -786,6 +953,133 @@ public class PgpDecryptVerify extends BaseOperation {
return result;
}
+ private DecryptVerifyResult verifyDetachedSignature(InputStream in, int indent)
+ throws IOException, PGPException {
+
+ OperationLog log = new OperationLog();
+
+ OpenPgpSignatureResultBuilder signatureResultBuilder = new OpenPgpSignatureResultBuilder();
+ // detached signatures are never encrypted
+ signatureResultBuilder.setSignatureOnly(true);
+
+ updateProgress(R.string.progress_processing_signature, 0, 100);
+ InputStream detachedSigIn = new ByteArrayInputStream(mDetachedSignature);
+ detachedSigIn = PGPUtil.getDecoderStream(detachedSigIn);
+
+ JcaPGPObjectFactory pgpFact = new JcaPGPObjectFactory(detachedSigIn);
+
+ PGPSignatureList sigList;
+ Object o = pgpFact.nextObject();
+ if (o instanceof PGPCompressedData) {
+ PGPCompressedData c1 = (PGPCompressedData) o;
+ pgpFact = new JcaPGPObjectFactory(c1.getDataStream());
+ sigList = (PGPSignatureList) pgpFact.nextObject();
+ } else if (o instanceof PGPSignatureList) {
+ sigList = (PGPSignatureList) o;
+ } else {
+ log.add(LogType.MSG_DC_ERROR_INVALID_SIGLIST, 0);
+ return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
+ }
+
+ PGPSignature signature = processPGPSignatureList(sigList, signatureResultBuilder);
+
+ if (signature != null) {
+ updateProgress(R.string.progress_reading_data, 60, 100);
+
+ ProgressScaler progressScaler = new ProgressScaler(mProgressable, 60, 90, 100);
+ long alreadyWritten = 0;
+ long wholeSize = mData.getSize() - mData.getStreamPosition();
+ int length;
+ byte[] buffer = new byte[1 << 16];
+ while ((length = in.read(buffer)) > 0) {
+ if (mOutStream != null) {
+ mOutStream.write(buffer, 0, length);
+ }
+
+ // update signature buffer if signature is also present
+ signature.update(buffer, 0, length);
+
+ alreadyWritten += length;
+ if (wholeSize > 0) {
+ long progress = 100 * alreadyWritten / wholeSize;
+ // stop at 100% for wrong file sizes...
+ if (progress > 100) {
+ progress = 100;
+ }
+ progressScaler.setProgress((int) progress, 100);
+ }
+ // TODO: slow annealing to fake a progress?
+ }
+
+ updateProgress(R.string.progress_verifying_signature, 90, 100);
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_CHECK, indent);
+
+ // these are not cleartext signatures!
+ signatureResultBuilder.setSignatureOnly(false);
+
+ // Verify signature and check binding signatures
+ boolean validSignature = signature.verify();
+ if (validSignature) {
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_OK, indent + 1);
+ } else {
+ log.add(LogType.MSG_DC_CLEAR_SIGNATURE_BAD, indent + 1);
+ }
+ signatureResultBuilder.setValidSignature(validSignature);
+ }
+
+ updateProgress(R.string.progress_done, 100, 100);
+
+ log.add(LogType.MSG_DC_OK, indent);
+
+ DecryptVerifyResult result = new DecryptVerifyResult(DecryptVerifyResult.RESULT_OK, log);
+ result.setSignatureResult(signatureResultBuilder.build());
+ return result;
+ }
+
+ private PGPSignature processPGPSignatureList(PGPSignatureList sigList, OpenPgpSignatureResultBuilder signatureResultBuilder) throws PGPException {
+ CanonicalizedPublicKeyRing signingRing = null;
+ CanonicalizedPublicKey signingKey = null;
+ int signatureIndex = -1;
+
+ // go through all signatures
+ // and find out for which signature we have a key in our database
+ for (int i = 0; i < sigList.size(); ++i) {
+ try {
+ long sigKeyId = sigList.get(i).getKeyID();
+ signingRing = mProviderHelper.getCanonicalizedPublicKeyRing(
+ KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(sigKeyId)
+ );
+ signingKey = signingRing.getPublicKey(sigKeyId);
+ signatureIndex = i;
+ } catch (ProviderHelper.NotFoundException e) {
+ Log.d(Constants.TAG, "key not found, trying next signature...");
+ }
+ }
+
+ PGPSignature signature = null;
+
+ if (signingKey != null) {
+ // key found in our database!
+ signature = sigList.get(signatureIndex);
+
+ signatureResultBuilder.initValid(signingRing, signingKey);
+
+ JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider =
+ new JcaPGPContentVerifierBuilderProvider()
+ .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
+ signature.init(contentVerifierBuilderProvider, signingKey.getPublicKey());
+ } else {
+ // no key in our database -> return "unknown pub key" status including the first key id
+ if (!sigList.isEmpty()) {
+ signatureResultBuilder.setSignatureAvailable(true);
+ signatureResultBuilder.setKnownKey(false);
+ signatureResultBuilder.setKeyId(sigList.get(0).getKeyID());
+ }
+ }
+
+ return signature;
+ }
+
/**
* Mostly taken from ClearSignedFileProcessor in Bouncy Castle
*/
@@ -807,7 +1101,7 @@ public class PgpDecryptVerify extends BaseOperation {
while ((ch = fIn.read()) >= 0) {
bOut.write(ch);
if (ch == '\r' || ch == '\n') {
- lookAhead = readPassedEOL(bOut, ch, fIn);
+ lookAhead = readPastEOL(bOut, ch, fIn);
break;
}
}
@@ -824,7 +1118,7 @@ public class PgpDecryptVerify extends BaseOperation {
do {
bOut.write(ch);
if (ch == '\r' || ch == '\n') {
- lookAhead = readPassedEOL(bOut, ch, fIn);
+ lookAhead = readPastEOL(bOut, ch, fIn);
break;
}
} while ((ch = fIn.read()) >= 0);
@@ -836,7 +1130,7 @@ public class PgpDecryptVerify extends BaseOperation {
return lookAhead;
}
- private static int readPassedEOL(ByteArrayOutputStream bOut, int lastCh, InputStream fIn)
+ private static int readPastEOL(ByteArrayOutputStream bOut, int lastCh, InputStream fIn)
throws IOException {
int lookAhead = fIn.read();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java
index 0a15fd98f..12de2f637 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java
@@ -24,8 +24,8 @@ import android.content.pm.PackageManager.NameNotFoundException;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.io.File;
import java.io.IOException;
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 4bab7f2b9..1a251eb79 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
@@ -135,7 +135,7 @@ public class PgpKeyOperation {
public PgpKeyOperation(Progressable progress) {
super();
if (progress != null) {
- mProgress = new Stack<Progressable>();
+ mProgress = new Stack<>();
mProgress.push(progress);
}
}
@@ -288,13 +288,11 @@ public class PgpKeyOperation {
// build new key pair
return new JcaPGPKeyPair(algorithm, keyGen.generateKeyPair(), new Date());
- } catch(NoSuchProviderException e) {
+ } catch(NoSuchProviderException | InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
} catch(NoSuchAlgorithmException e) {
log.add(LogType.MSG_CR_ERROR_UNKNOWN_ALGO, indent);
return null;
- } catch(InvalidAlgorithmParameterException e) {
- throw new RuntimeException(e);
} catch(PGPException e) {
Log.e(Constants.TAG, "internal pgp error", e);
log.add(LogType.MSG_CR_ERROR_INTERNAL_PGP, indent);
@@ -389,6 +387,9 @@ public class PgpKeyOperation {
* with a passphrase fails, the operation will fail with an unlocking error. More specific
* handling of errors should be done in UI code!
*
+ * If the passphrase is null, only a restricted subset of operations will be available,
+ * namely stripping of subkeys and changing the protection mode of dummy keys.
+ *
*/
public PgpEditKeyResult modifySecretKeyRing(CanonicalizedSecretKeyRing wsKR, SaveKeyringParcel saveParcel,
String passphrase) {
@@ -429,12 +430,17 @@ public class PgpKeyOperation {
return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
}
+ // If we have no passphrase, only allow restricted operation
+ if (passphrase == null) {
+ return internalRestricted(sKR, saveParcel, log);
+ }
+
// read masterKeyFlags, and use the same as before.
// since this is the master key, this contains at least CERTIFY_OTHER
PGPPublicKey masterPublicKey = masterSecretKey.getPublicKey();
int masterKeyFlags = readKeyFlags(masterPublicKey) | KeyFlags.CERTIFY_OTHER;
- long masterKeyExpiry = masterPublicKey.getValidSeconds() == 0L ? 0L :
- masterPublicKey.getCreationTime().getTime() / 1000 + masterPublicKey.getValidSeconds();
+ Date expiryTime = wsKR.getPublicKey().getExpiryTime();
+ long masterKeyExpiry = expiryTime != null ? expiryTime.getTime() / 1000 : 0L;
return internal(sKR, masterSecretKey, masterKeyFlags, masterKeyExpiry, saveParcel, passphrase, log);
@@ -496,7 +502,7 @@ public class PgpKeyOperation {
@SuppressWarnings("unchecked")
Iterator<PGPSignature> it = modifiedPublicKey.getSignaturesForID(userId);
if (it != null) {
- for (PGPSignature cert : new IterableIterator<PGPSignature>(it)) {
+ for (PGPSignature cert : new IterableIterator<>(it)) {
if (cert.getKeyID() != masterPublicKey.getKeyID()) {
// foreign certificate?! error error error
log.add(LogType.MSG_MF_ERROR_INTEGRITY, indent);
@@ -715,6 +721,27 @@ public class PgpKeyOperation {
return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
}
+ if (change.mDummyStrip || change.mDummyDivert != null) {
+ // IT'S DANGEROUS~
+ // no really, it is. this operation irrevocably removes the private key data from the key
+ if (change.mDummyStrip) {
+ sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey());
+ } else {
+ // the serial number must be 16 bytes in length
+ if (change.mDummyDivert.length != 16) {
+ log.add(LogType.MSG_MF_ERROR_DIVERT_SERIAL,
+ indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId));
+ return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
+ }
+ }
+ sKR = PGPSecretKeyRing.insertSecretKey(sKR, sKey);
+ }
+
+ // This doesn't concern us any further
+ if (!change.mRecertify && (change.mExpiry == null && change.mFlags == null)) {
+ continue;
+ }
+
// expiry must not be in the past
if (change.mExpiry != null && change.mExpiry != 0 &&
new Date(change.mExpiry*1000).before(new Date())) {
@@ -805,30 +832,6 @@ public class PgpKeyOperation {
}
subProgressPop();
- // 4c. For each subkey to be stripped... do so
- subProgressPush(65, 70);
- for (int i = 0; i < saveParcel.mStripSubKeys.size(); i++) {
-
- progress(R.string.progress_modify_subkeystrip, (i-1) * (100 / saveParcel.mStripSubKeys.size()));
- long strip = saveParcel.mStripSubKeys.get(i);
- log.add(LogType.MSG_MF_SUBKEY_STRIP,
- indent, KeyFormattingUtils.convertKeyIdToHex(strip));
-
- PGPSecretKey sKey = sKR.getSecretKey(strip);
- if (sKey == null) {
- log.add(LogType.MSG_MF_ERROR_SUBKEY_MISSING,
- indent+1, KeyFormattingUtils.convertKeyIdToHex(strip));
- return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
- }
-
- // IT'S DANGEROUS~
- // no really, it is. this operation irrevocably removes the private key data from the key
- sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey());
- sKR = PGPSecretKeyRing.insertSecretKey(sKR, sKey);
-
- }
- subProgressPop();
-
// 5. Generate and add new subkeys
subProgressPush(70, 90);
for (int i = 0; i < saveParcel.mAddSubKeys.size(); i++) {
@@ -937,6 +940,73 @@ public class PgpKeyOperation {
}
+ /** This method does the actual modifications in a keyring just like internal, except it
+ * supports only the subset of operations which require no passphrase, and will error
+ * otherwise.
+ */
+ private PgpEditKeyResult internalRestricted(PGPSecretKeyRing sKR, SaveKeyringParcel saveParcel,
+ OperationLog log) {
+
+ int indent = 1;
+
+ progress(R.string.progress_modify, 0);
+
+ // Make sure the saveParcel includes only operations available without passphrae!
+ if (!saveParcel.isRestrictedOnly()) {
+ log.add(LogType.MSG_MF_ERROR_RESTRICTED, indent);
+ return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
+ }
+
+ // Check if we were cancelled
+ if (checkCancelled()) {
+ log.add(LogType.MSG_OPERATION_CANCELLED, indent);
+ return new PgpEditKeyResult(PgpEditKeyResult.RESULT_CANCELLED, log, null);
+ }
+
+ // The only operation we can do here:
+ // 4a. Strip secret keys, or change their protection mode (stripped/divert-to-card)
+ subProgressPush(50, 60);
+ for (int i = 0; i < saveParcel.mChangeSubKeys.size(); i++) {
+
+ progress(R.string.progress_modify_subkeychange, (i - 1) * (100 / saveParcel.mChangeSubKeys.size()));
+ SaveKeyringParcel.SubkeyChange change = saveParcel.mChangeSubKeys.get(i);
+ log.add(LogType.MSG_MF_SUBKEY_CHANGE,
+ indent, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId));
+
+ PGPSecretKey sKey = sKR.getSecretKey(change.mKeyId);
+ if (sKey == null) {
+ log.add(LogType.MSG_MF_ERROR_SUBKEY_MISSING,
+ indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId));
+ return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
+ }
+
+ if (change.mDummyStrip || change.mDummyDivert != null) {
+ // IT'S DANGEROUS~
+ // no really, it is. this operation irrevocably removes the private key data from the key
+ if (change.mDummyStrip) {
+ sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey());
+ } else {
+ // the serial number must be 16 bytes in length
+ if (change.mDummyDivert.length != 16) {
+ log.add(LogType.MSG_MF_ERROR_DIVERT_SERIAL,
+ indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId));
+ return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null);
+ }
+ sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey(), change.mDummyDivert);
+ }
+ sKR = PGPSecretKeyRing.insertSecretKey(sKR, sKey);
+ }
+
+ }
+
+ // And we're done!
+ progress(R.string.progress_done, 100);
+ log.add(LogType.MSG_MF_SUCCESS, indent);
+ return new PgpEditKeyResult(OperationResult.RESULT_OK, log, new UncachedKeyRing(sKR));
+
+ }
+
+
private static PGPSecretKeyRing applyNewUnlock(
PGPSecretKeyRing sKR,
PGPPublicKey masterPublicKey,
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInput.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInput.java
new file mode 100644
index 000000000..9318be006
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInput.java
@@ -0,0 +1,176 @@
+package org.sufficientlysecure.keychain.pgp;
+
+import org.spongycastle.bcpg.CompressionAlgorithmTags;
+import org.sufficientlysecure.keychain.Constants;
+
+import java.util.Date;
+
+public class PgpSignEncryptInput {
+
+ protected String mVersionHeader = null;
+ protected boolean mEnableAsciiArmorOutput = false;
+ protected int mCompressionId = CompressionAlgorithmTags.UNCOMPRESSED;
+ protected long[] mEncryptionMasterKeyIds = null;
+ protected String mSymmetricPassphrase = null;
+ protected int mSymmetricEncryptionAlgorithm = 0;
+ protected long mSignatureMasterKeyId = Constants.key.none;
+ protected Long mSignatureSubKeyId = null;
+ protected int mSignatureHashAlgorithm = 0;
+ protected String mSignaturePassphrase = null;
+ protected long mAdditionalEncryptId = Constants.key.none;
+ protected byte[] mNfcSignedHash = null;
+ protected Date mNfcCreationTimestamp = null;
+ protected boolean mFailOnMissingEncryptionKeyIds = false;
+ protected String mCharset;
+ protected boolean mCleartextSignature;
+ protected boolean mDetachedSignature;
+
+ public String getCharset() {
+ return mCharset;
+ }
+
+ public void setCharset(String mCharset) {
+ this.mCharset = mCharset;
+ }
+
+ public boolean ismFailOnMissingEncryptionKeyIds() {
+ return mFailOnMissingEncryptionKeyIds;
+ }
+
+ public Date getNfcCreationTimestamp() {
+ return mNfcCreationTimestamp;
+ }
+
+ public byte[] getNfcSignedHash() {
+ return mNfcSignedHash;
+ }
+
+ public long getAdditionalEncryptId() {
+ return mAdditionalEncryptId;
+ }
+
+ public PgpSignEncryptInput setAdditionalEncryptId(long additionalEncryptId) {
+ mAdditionalEncryptId = additionalEncryptId;
+ return this;
+ }
+
+ public String getSignaturePassphrase() {
+ return mSignaturePassphrase;
+ }
+
+ public PgpSignEncryptInput setSignaturePassphrase(String signaturePassphrase) {
+ mSignaturePassphrase = signaturePassphrase;
+ return this;
+ }
+
+ public int getSignatureHashAlgorithm() {
+ return mSignatureHashAlgorithm;
+ }
+
+ public PgpSignEncryptInput setSignatureHashAlgorithm(int signatureHashAlgorithm) {
+ mSignatureHashAlgorithm = signatureHashAlgorithm;
+ return this;
+ }
+
+ public Long getSignatureSubKeyId() {
+ return mSignatureSubKeyId;
+ }
+
+ public PgpSignEncryptInput setSignatureSubKeyId(long signatureSubKeyId) {
+ mSignatureSubKeyId = signatureSubKeyId;
+ return this;
+ }
+
+ public long getSignatureMasterKeyId() {
+ return mSignatureMasterKeyId;
+ }
+
+ public PgpSignEncryptInput setSignatureMasterKeyId(long signatureMasterKeyId) {
+ mSignatureMasterKeyId = signatureMasterKeyId;
+ return this;
+ }
+
+ public int getSymmetricEncryptionAlgorithm() {
+ return mSymmetricEncryptionAlgorithm;
+ }
+
+ public PgpSignEncryptInput setSymmetricEncryptionAlgorithm(int symmetricEncryptionAlgorithm) {
+ mSymmetricEncryptionAlgorithm = symmetricEncryptionAlgorithm;
+ return this;
+ }
+
+ public String getSymmetricPassphrase() {
+ return mSymmetricPassphrase;
+ }
+
+ public PgpSignEncryptInput setSymmetricPassphrase(String symmetricPassphrase) {
+ mSymmetricPassphrase = symmetricPassphrase;
+ return this;
+ }
+
+ public long[] getEncryptionMasterKeyIds() {
+ return mEncryptionMasterKeyIds;
+ }
+
+ public PgpSignEncryptInput setEncryptionMasterKeyIds(long[] encryptionMasterKeyIds) {
+ mEncryptionMasterKeyIds = encryptionMasterKeyIds;
+ return this;
+ }
+
+ public int getCompressionId() {
+ return mCompressionId;
+ }
+
+ public PgpSignEncryptInput setCompressionId(int compressionId) {
+ mCompressionId = compressionId;
+ return this;
+ }
+
+ public boolean ismEnableAsciiArmorOutput() {
+ return mEnableAsciiArmorOutput;
+ }
+
+ public String getVersionHeader() {
+ return mVersionHeader;
+ }
+
+ public PgpSignEncryptInput setVersionHeader(String versionHeader) {
+ mVersionHeader = versionHeader;
+ return this;
+ }
+
+ public PgpSignEncryptInput setEnableAsciiArmorOutput(boolean enableAsciiArmorOutput) {
+ mEnableAsciiArmorOutput = enableAsciiArmorOutput;
+ return this;
+ }
+
+ public PgpSignEncryptInput setFailOnMissingEncryptionKeyIds(boolean failOnMissingEncryptionKeyIds) {
+ mFailOnMissingEncryptionKeyIds = failOnMissingEncryptionKeyIds;
+ return this;
+ }
+
+ public PgpSignEncryptInput setNfcState(byte[] signedHash, Date creationTimestamp) {
+ mNfcSignedHash = signedHash;
+ mNfcCreationTimestamp = creationTimestamp;
+ return this;
+ }
+
+ public PgpSignEncryptInput setCleartextSignature(boolean cleartextSignature) {
+ this.mCleartextSignature = cleartextSignature;
+ return this;
+ }
+
+ public boolean isCleartextSignature() {
+ return mCleartextSignature;
+ }
+
+ public PgpSignEncryptInput setDetachedSignature(boolean detachedSignature) {
+ this.mDetachedSignature = detachedSignature;
+ return this;
+ }
+
+ public boolean isDetachedSignature() {
+ return mDetachedSignature;
+ }
+}
+
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
index 3c3bcc890..2fa01d241 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java
@@ -25,6 +25,7 @@ import org.spongycastle.bcpg.ArmoredOutputStream;
import org.spongycastle.bcpg.BCPGOutputStream;
import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.openpgp.PGPCompressedDataGenerator;
+import org.spongycastle.openpgp.PGPEncryptedData;
import org.spongycastle.openpgp.PGPEncryptedDataGenerator;
import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.PGPLiteralData;
@@ -37,19 +38,20 @@ import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.BaseOperation;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
-import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressScaler;
import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -59,31 +61,23 @@ import java.security.SignatureException;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
+import java.util.concurrent.atomic.AtomicBoolean;
-/**
- * This class uses a Builder pattern!
+/** This class supports a single, low-level, sign/encrypt operation.
+ *
+ * The operation of this class takes an Input- and OutputStream plus a
+ * PgpSignEncryptInput, and signs and/or encrypts the stream as
+ * parametrized in the PgpSignEncryptInput object. It returns its status
+ * and a possible detached signature as a SignEncryptResult.
+ *
+ * For a high-level operation based on URIs, see SignEncryptOperation.
+ *
+ * @see org.sufficientlysecure.keychain.pgp.PgpSignEncryptInput
+ * @see org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult
+ * @see org.sufficientlysecure.keychain.operations.SignEncryptOperation
+ *
*/
-public class PgpSignEncrypt extends BaseOperation {
- private String mVersionHeader;
- private InputData mData;
- private OutputStream mOutStream;
-
- private boolean mEnableAsciiArmorOutput;
- private int mCompressionId;
- private long[] mEncryptionMasterKeyIds;
- private String mSymmetricPassphrase;
- private int mSymmetricEncryptionAlgorithm;
- private long mSignatureMasterKeyId;
- private Long mSignatureSubKeyId;
- private int mSignatureHashAlgorithm;
- private String mSignaturePassphrase;
- private long mAdditionalEncryptId;
- private boolean mCleartextInput;
- private String mOriginalFilename;
- private boolean mFailOnMissingEncryptionKeyIds;
-
- private byte[] mNfcSignedHash = null;
- private Date mNfcCreationTimestamp = null;
+public class PgpSignEncryptOperation extends BaseOperation {
private static byte[] NEW_LINE;
@@ -95,241 +89,107 @@ public class PgpSignEncrypt extends BaseOperation {
}
}
- protected PgpSignEncrypt(Builder builder) {
- super(builder.mContext, builder.mProviderHelper, builder.mProgressable);
-
- // private Constructor can only be called from Builder
- this.mVersionHeader = builder.mVersionHeader;
- this.mData = builder.mData;
- this.mOutStream = builder.mOutStream;
-
- this.mEnableAsciiArmorOutput = builder.mEnableAsciiArmorOutput;
- this.mCompressionId = builder.mCompressionId;
- this.mEncryptionMasterKeyIds = builder.mEncryptionMasterKeyIds;
- this.mSymmetricPassphrase = builder.mSymmetricPassphrase;
- this.mSymmetricEncryptionAlgorithm = builder.mSymmetricEncryptionAlgorithm;
- this.mSignatureMasterKeyId = builder.mSignatureMasterKeyId;
- this.mSignatureSubKeyId = builder.mSignatureSubKeyId;
- this.mSignatureHashAlgorithm = builder.mSignatureHashAlgorithm;
- this.mSignaturePassphrase = builder.mSignaturePassphrase;
- this.mAdditionalEncryptId = builder.mAdditionalEncryptId;
- this.mCleartextInput = builder.mCleartextInput;
- this.mNfcSignedHash = builder.mNfcSignedHash;
- this.mNfcCreationTimestamp = builder.mNfcCreationTimestamp;
- this.mOriginalFilename = builder.mOriginalFilename;
- this.mFailOnMissingEncryptionKeyIds = builder.mFailOnMissingEncryptionKeyIds;
+ public PgpSignEncryptOperation(Context context, ProviderHelper providerHelper, Progressable progressable, AtomicBoolean cancelled) {
+ super(context, providerHelper, progressable, cancelled);
}
- public static class Builder {
- // mandatory parameter
- private Context mContext;
- private ProviderHelper mProviderHelper;
- private Progressable mProgressable;
- private InputData mData;
- private OutputStream mOutStream;
-
- // optional
- private String mVersionHeader = null;
- private boolean mEnableAsciiArmorOutput = false;
- private int mCompressionId = CompressionAlgorithmTags.UNCOMPRESSED;
- private long[] mEncryptionMasterKeyIds = null;
- private String mSymmetricPassphrase = null;
- private int mSymmetricEncryptionAlgorithm = 0;
- private long mSignatureMasterKeyId = Constants.key.none;
- private Long mSignatureSubKeyId = null;
- private int mSignatureHashAlgorithm = 0;
- private String mSignaturePassphrase = null;
- private long mAdditionalEncryptId = Constants.key.none;
- private boolean mCleartextInput = false;
- private String mOriginalFilename = "";
- private byte[] mNfcSignedHash = null;
- private Date mNfcCreationTimestamp = null;
- private boolean mFailOnMissingEncryptionKeyIds = false;
-
- public Builder(Context context, ProviderHelper providerHelper, Progressable progressable,
- InputData data, OutputStream outStream) {
- mContext = context;
- mProviderHelper = providerHelper;
- mProgressable = progressable;
-
- mData = data;
- mOutStream = outStream;
- }
-
- public Builder setVersionHeader(String versionHeader) {
- mVersionHeader = versionHeader;
- return this;
- }
-
- public Builder setEnableAsciiArmorOutput(boolean enableAsciiArmorOutput) {
- mEnableAsciiArmorOutput = enableAsciiArmorOutput;
- return this;
- }
-
- public Builder setCompressionId(int compressionId) {
- mCompressionId = compressionId;
- return this;
- }
-
- public Builder setEncryptionMasterKeyIds(long[] encryptionMasterKeyIds) {
- mEncryptionMasterKeyIds = encryptionMasterKeyIds;
- return this;
- }
-
- public Builder setSymmetricPassphrase(String symmetricPassphrase) {
- mSymmetricPassphrase = symmetricPassphrase;
- return this;
- }
-
- public Builder setSymmetricEncryptionAlgorithm(int symmetricEncryptionAlgorithm) {
- mSymmetricEncryptionAlgorithm = symmetricEncryptionAlgorithm;
- return this;
- }
-
- public Builder setSignatureMasterKeyId(long signatureMasterKeyId) {
- mSignatureMasterKeyId = signatureMasterKeyId;
- return this;
- }
-
- public Builder setSignatureSubKeyId(long signatureSubKeyId) {
- mSignatureSubKeyId = signatureSubKeyId;
- return this;
- }
-
- public Builder setSignatureHashAlgorithm(int signatureHashAlgorithm) {
- mSignatureHashAlgorithm = signatureHashAlgorithm;
- return this;
- }
-
- public Builder setSignaturePassphrase(String signaturePassphrase) {
- mSignaturePassphrase = signaturePassphrase;
- return this;
- }
-
- public Builder setFailOnMissingEncryptionKeyIds(boolean failOnMissingEncryptionKeyIds) {
- mFailOnMissingEncryptionKeyIds = failOnMissingEncryptionKeyIds;
- return this;
- }
-
- /**
- * Also encrypt with the signing keyring
- *
- * @param additionalEncryptId
- * @return
- */
- public Builder setAdditionalEncryptId(long additionalEncryptId) {
- mAdditionalEncryptId = additionalEncryptId;
- return this;
- }
-
- /**
- * TODO: test this option!
- *
- * @param cleartextInput
- * @return
- */
- public Builder setCleartextInput(boolean cleartextInput) {
- mCleartextInput = cleartextInput;
- return this;
- }
-
- public Builder setOriginalFilename(String originalFilename) {
- mOriginalFilename = originalFilename;
- return this;
- }
-
- public Builder setNfcState(byte[] signedHash, Date creationTimestamp) {
- mNfcSignedHash = signedHash;
- mNfcCreationTimestamp = creationTimestamp;
- return this;
- }
-
- public PgpSignEncrypt build() {
- return new PgpSignEncrypt(this);
- }
+ public PgpSignEncryptOperation(Context context, ProviderHelper providerHelper, Progressable progressable) {
+ super(context, providerHelper, progressable);
}
/**
* Signs and/or encrypts data based on parameters of class
*/
- public SignEncryptResult execute() {
+ public PgpSignEncryptResult execute(PgpSignEncryptInput input,
+ InputData inputData, OutputStream outputStream) {
int indent = 0;
OperationLog log = new OperationLog();
- log.add(LogType.MSG_SE, indent);
+ log.add(LogType.MSG_PSE, indent);
indent += 1;
- boolean enableSignature = mSignatureMasterKeyId != Constants.key.none;
- boolean enableEncryption = ((mEncryptionMasterKeyIds != null && mEncryptionMasterKeyIds.length > 0)
- || mSymmetricPassphrase != null);
- boolean enableCompression = (mCompressionId != CompressionAlgorithmTags.UNCOMPRESSED);
+ boolean enableSignature = input.getSignatureMasterKeyId() != Constants.key.none;
+ boolean enableEncryption = ((input.getEncryptionMasterKeyIds() != null && input.getEncryptionMasterKeyIds().length > 0)
+ || input.getSymmetricPassphrase() != null);
+ boolean enableCompression = (input.getCompressionId() != CompressionAlgorithmTags.UNCOMPRESSED);
Log.d(Constants.TAG, "enableSignature:" + enableSignature
+ "\nenableEncryption:" + enableEncryption
+ "\nenableCompression:" + enableCompression
- + "\nenableAsciiArmorOutput:" + mEnableAsciiArmorOutput);
+ + "\nenableAsciiArmorOutput:" + input.ismEnableAsciiArmorOutput());
// add additional key id to encryption ids (mostly to do self-encryption)
- if (enableEncryption && mAdditionalEncryptId != Constants.key.none) {
- mEncryptionMasterKeyIds = Arrays.copyOf(mEncryptionMasterKeyIds, mEncryptionMasterKeyIds.length + 1);
- mEncryptionMasterKeyIds[mEncryptionMasterKeyIds.length - 1] = mAdditionalEncryptId;
+ if (enableEncryption && input.getAdditionalEncryptId() != Constants.key.none) {
+ input.setEncryptionMasterKeyIds(Arrays.copyOf(input.getEncryptionMasterKeyIds(), input.getEncryptionMasterKeyIds().length + 1));
+ input.getEncryptionMasterKeyIds()[input.getEncryptionMasterKeyIds().length - 1] = input.getAdditionalEncryptId();
}
ArmoredOutputStream armorOut = null;
OutputStream out;
- if (mEnableAsciiArmorOutput) {
- armorOut = new ArmoredOutputStream(mOutStream);
- if (mVersionHeader != null) {
- armorOut.setHeader("Version", mVersionHeader);
+ if (input.ismEnableAsciiArmorOutput()) {
+ armorOut = new ArmoredOutputStream(outputStream);
+ if (input.getVersionHeader() != null) {
+ armorOut.setHeader("Version", input.getVersionHeader());
+ }
+ // if we have a charset, put it in the header
+ if (input.getCharset() != null) {
+ armorOut.setHeader("Charset", input.getCharset());
}
out = armorOut;
} else {
- out = mOutStream;
+ out = outputStream;
}
/* Get keys for signature generation for later usage */
CanonicalizedSecretKey signingKey = null;
- long signKeyId;
if (enableSignature) {
try {
// fetch the indicated master key id (the one whose name we sign in)
CanonicalizedSecretKeyRing signingKeyRing =
- mProviderHelper.getCanonicalizedSecretKeyRing(mSignatureMasterKeyId);
+ mProviderHelper.getCanonicalizedSecretKeyRing(input.getSignatureMasterKeyId());
+
+ long signKeyId;
+ // use specified signing subkey, or find the one to use
+ if (input.getSignatureSubKeyId() == null) {
+ signKeyId = signingKeyRing.getSecretSignId();
+ } else {
+ signKeyId = input.getSignatureSubKeyId();
+ }
+
// fetch the specific subkey to sign with, or just use the master key if none specified
- signKeyId = mSignatureSubKeyId != null ? mSignatureSubKeyId : mSignatureMasterKeyId;
signingKey = signingKeyRing.getSecretKey(signKeyId);
- // make sure it's a signing key alright!
- } catch (ProviderHelper.NotFoundException e) {
- log.add(LogType.MSG_SE_ERROR_SIGN_KEY, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+
+ } catch (ProviderHelper.NotFoundException | PgpGeneralException e) {
+ log.add(LogType.MSG_PSE_ERROR_SIGN_KEY, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
// Make sure we are allowed to sign here!
if (!signingKey.canSign()) {
- log.add(LogType.MSG_SE_ERROR_KEY_SIGN, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ log.add(LogType.MSG_PSE_ERROR_KEY_SIGN, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
// if no passphrase was explicitly set try to get it from the cache service
- if (mSignaturePassphrase == null) {
+ if (input.getSignaturePassphrase() == null) {
try {
// returns "" if key has no passphrase
- mSignaturePassphrase = getCachedPassphrase(signKeyId);
+ input.setSignaturePassphrase(getCachedPassphrase(signingKey.getKeyId()));
// TODO
// log.add(LogType.MSG_DC_PASS_CACHED, indent + 1);
} catch (PassphraseCacheInterface.NoSecretKeyException e) {
// TODO
// log.add(LogType.MSG_DC_ERROR_NO_KEY, indent + 1);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
// if passphrase was not cached, return here indicating that a passphrase is missing!
- if (mSignaturePassphrase == null) {
- log.add(LogType.MSG_SE_PENDING_PASSPHRASE, indent + 1);
- SignEncryptResult result = new SignEncryptResult(SignEncryptResult.RESULT_PENDING_PASSPHRASE, log);
- result.setKeyIdPassphraseNeeded(signKeyId);
+ if (input.getSignaturePassphrase() == null) {
+ log.add(LogType.MSG_PSE_PENDING_PASSPHRASE, indent + 1);
+ PgpSignEncryptResult result = new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE, log);
+ result.setKeyIdPassphraseNeeded(signingKey.getKeyId());
return result;
}
}
@@ -337,20 +197,24 @@ public class PgpSignEncrypt extends BaseOperation {
updateProgress(R.string.progress_extracting_signature_key, 0, 100);
try {
- if (!signingKey.unlock(mSignaturePassphrase)) {
- log.add(LogType.MSG_SE_ERROR_BAD_PASSPHRASE, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ if (!signingKey.unlock(input.getSignaturePassphrase())) {
+ log.add(LogType.MSG_PSE_ERROR_BAD_PASSPHRASE, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
} catch (PgpGeneralException e) {
- log.add(LogType.MSG_SE_ERROR_UNLOCK, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ log.add(LogType.MSG_PSE_ERROR_UNLOCK, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
// check if hash algo is supported
+ int requestedAlgorithm = input.getSignatureHashAlgorithm();
LinkedList<Integer> supported = signingKey.getSupportedHashAlgorithms();
- if (!supported.contains(mSignatureHashAlgorithm)) {
+ if (requestedAlgorithm == 0) {
// get most preferred
- mSignatureHashAlgorithm = supported.getLast();
+ input.setSignatureHashAlgorithm(supported.getLast());
+ } else if (!supported.contains(requestedAlgorithm)) {
+ log.add(LogType.MSG_PSE_ERROR_HASH_ALGO, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
}
updateProgress(R.string.progress_preparing_streams, 2, 100);
@@ -358,44 +222,48 @@ public class PgpSignEncrypt extends BaseOperation {
/* Initialize PGPEncryptedDataGenerator for later usage */
PGPEncryptedDataGenerator cPk = null;
if (enableEncryption) {
+ int algo = input.getSymmetricEncryptionAlgorithm();
+ if (algo == 0) {
+ algo = PGPEncryptedData.AES_128;
+ }
// has Integrity packet enabled!
JcePGPDataEncryptorBuilder encryptorBuilder =
- new JcePGPDataEncryptorBuilder(mSymmetricEncryptionAlgorithm)
+ new JcePGPDataEncryptorBuilder(algo)
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME)
.setWithIntegrityPacket(true);
cPk = new PGPEncryptedDataGenerator(encryptorBuilder);
- if (mSymmetricPassphrase != null) {
+ if (input.getSymmetricPassphrase() != null) {
// Symmetric encryption
- log.add(LogType.MSG_SE_SYMMETRIC, indent);
+ log.add(LogType.MSG_PSE_SYMMETRIC, indent);
JcePBEKeyEncryptionMethodGenerator symmetricEncryptionGenerator =
- new JcePBEKeyEncryptionMethodGenerator(mSymmetricPassphrase.toCharArray());
+ new JcePBEKeyEncryptionMethodGenerator(input.getSymmetricPassphrase().toCharArray());
cPk.addMethod(symmetricEncryptionGenerator);
} else {
- log.add(LogType.MSG_SE_ASYMMETRIC, indent);
+ log.add(LogType.MSG_PSE_ASYMMETRIC, indent);
// Asymmetric encryption
- for (long id : mEncryptionMasterKeyIds) {
+ for (long id : input.getEncryptionMasterKeyIds()) {
try {
CanonicalizedPublicKeyRing keyRing = mProviderHelper.getCanonicalizedPublicKeyRing(
KeyRings.buildUnifiedKeyRingUri(id));
CanonicalizedPublicKey key = keyRing.getEncryptionSubKey();
cPk.addMethod(key.getPubKeyEncryptionGenerator());
- log.add(LogType.MSG_SE_KEY_OK, indent + 1,
+ log.add(LogType.MSG_PSE_KEY_OK, indent + 1,
KeyFormattingUtils.convertKeyIdToHex(id));
} catch (PgpKeyNotFoundException e) {
- log.add(LogType.MSG_SE_KEY_WARN, indent + 1,
+ log.add(LogType.MSG_PSE_KEY_WARN, indent + 1,
KeyFormattingUtils.convertKeyIdToHex(id));
- if (mFailOnMissingEncryptionKeyIds) {
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ if (input.ismFailOnMissingEncryptionKeyIds()) {
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
} catch (ProviderHelper.NotFoundException e) {
- log.add(LogType.MSG_SE_KEY_UNKNOWN, indent + 1,
+ log.add(LogType.MSG_PSE_KEY_UNKNOWN, indent + 1,
KeyFormattingUtils.convertKeyIdToHex(id));
- if (mFailOnMissingEncryptionKeyIds) {
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ if (input.ismFailOnMissingEncryptionKeyIds()) {
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
}
}
@@ -408,12 +276,12 @@ public class PgpSignEncrypt extends BaseOperation {
updateProgress(R.string.progress_preparing_signature, 4, 100);
try {
- boolean cleartext = mCleartextInput && mEnableAsciiArmorOutput && !enableEncryption;
+ boolean cleartext = input.isCleartextSignature() && input.ismEnableAsciiArmorOutput() && !enableEncryption;
signatureGenerator = signingKey.getSignatureGenerator(
- mSignatureHashAlgorithm, cleartext, mNfcSignedHash, mNfcCreationTimestamp);
+ input.getSignatureHashAlgorithm(), cleartext, input.getNfcSignedHash(), input.getNfcCreationTimestamp());
} catch (PgpGeneralException e) {
- log.add(LogType.MSG_SE_ERROR_NFC, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ log.add(LogType.MSG_PSE_ERROR_NFC, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
}
@@ -424,14 +292,18 @@ public class PgpSignEncrypt extends BaseOperation {
OutputStream encryptionOut = null;
BCPGOutputStream bcpgOut;
+ ByteArrayOutputStream detachedByteOut = null;
+ ArmoredOutputStream detachedArmorOut = null;
+ BCPGOutputStream detachedBcpgOut = null;
+
try {
if (enableEncryption) {
/* actual encryption */
updateProgress(R.string.progress_encrypting, 8, 100);
log.add(enableSignature
- ? LogType.MSG_SE_SIGCRYPTING
- : LogType.MSG_SE_ENCRYPTING,
+ ? LogType.MSG_PSE_SIGCRYPTING
+ : LogType.MSG_PSE_ENCRYPTING,
indent
);
indent += 1;
@@ -439,8 +311,8 @@ public class PgpSignEncrypt extends BaseOperation {
encryptionOut = cPk.open(out, new byte[1 << 16]);
if (enableCompression) {
- log.add(LogType.MSG_SE_COMPRESSING, indent);
- compressGen = new PGPCompressedDataGenerator(mCompressionId);
+ log.add(LogType.MSG_PSE_COMPRESSING, indent);
+ compressGen = new PGPCompressedDataGenerator(input.getCompressionId());
bcpgOut = new BCPGOutputStream(compressGen.open(encryptionOut));
} else {
bcpgOut = new BCPGOutputStream(encryptionOut);
@@ -452,18 +324,18 @@ public class PgpSignEncrypt extends BaseOperation {
PGPLiteralDataGenerator literalGen = new PGPLiteralDataGenerator();
char literalDataFormatTag;
- if (mCleartextInput) {
+ if (input.isCleartextSignature()) {
literalDataFormatTag = PGPLiteralData.UTF8;
} else {
literalDataFormatTag = PGPLiteralData.BINARY;
}
- pOut = literalGen.open(bcpgOut, literalDataFormatTag, mOriginalFilename, new Date(),
- new byte[1 << 16]);
+ pOut = literalGen.open(bcpgOut, literalDataFormatTag,
+ inputData.getOriginalFilename(), new Date(), new byte[1 << 16]);
long alreadyWritten = 0;
int length;
byte[] buffer = new byte[1 << 16];
- InputStream in = mData.getInputStream();
+ InputStream in = inputData.getInputStream();
while ((length = in.read(buffer)) > 0) {
pOut.write(buffer, 0, length);
@@ -473,8 +345,8 @@ public class PgpSignEncrypt extends BaseOperation {
}
alreadyWritten += length;
- if (mData.getSize() > 0) {
- long progress = 100 * alreadyWritten / mData.getSize();
+ if (inputData.getSize() > 0) {
+ long progress = 100 * alreadyWritten / inputData.getSize();
progressScaler.setProgress((int) progress, 100);
}
}
@@ -482,16 +354,16 @@ public class PgpSignEncrypt extends BaseOperation {
literalGen.close();
indent -= 1;
- } else if (enableSignature && mCleartextInput && mEnableAsciiArmorOutput) {
+ } else if (enableSignature && input.isCleartextSignature() && input.ismEnableAsciiArmorOutput()) {
/* cleartext signature: sign-only of ascii text */
updateProgress(R.string.progress_signing, 8, 100);
- log.add(LogType.MSG_SE_SIGNING, indent);
+ log.add(LogType.MSG_PSE_SIGNING_CLEARTEXT, indent);
// write -----BEGIN PGP SIGNED MESSAGE-----
- armorOut.beginClearText(mSignatureHashAlgorithm);
+ armorOut.beginClearText(input.getSignatureHashAlgorithm());
- InputStream in = mData.getInputStream();
+ InputStream in = inputData.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// update signature buffer with first line
@@ -517,16 +389,53 @@ public class PgpSignEncrypt extends BaseOperation {
armorOut.endClearText();
pOut = new BCPGOutputStream(armorOut);
- } else if (enableSignature && !mCleartextInput) {
+ } else if (enableSignature && input.isDetachedSignature()) {
+ /* detached signature */
+
+ updateProgress(R.string.progress_signing, 8, 100);
+ log.add(LogType.MSG_PSE_SIGNING_DETACHED, indent);
+
+ InputStream in = inputData.getInputStream();
+
+ // handle output stream separately for detached signatures
+ detachedByteOut = new ByteArrayOutputStream();
+ OutputStream detachedOut = detachedByteOut;
+ if (input.ismEnableAsciiArmorOutput()) {
+ detachedArmorOut = new ArmoredOutputStream(detachedOut);
+ if (input.getVersionHeader() != null) {
+ detachedArmorOut.setHeader("Version", input.getVersionHeader());
+ }
+
+ detachedOut = detachedArmorOut;
+ }
+ detachedBcpgOut = new BCPGOutputStream(detachedOut);
+
+ long alreadyWritten = 0;
+ int length;
+ byte[] buffer = new byte[1 << 16];
+ while ((length = in.read(buffer)) > 0) {
+ // no output stream is written, no changed to original data!
+
+ signatureGenerator.update(buffer, 0, length);
+
+ alreadyWritten += length;
+ if (inputData.getSize() > 0) {
+ long progress = 100 * alreadyWritten / inputData.getSize();
+ progressScaler.setProgress((int) progress, 100);
+ }
+ }
+
+ pOut = null;
+ } else if (enableSignature && !input.isCleartextSignature() && !input.isDetachedSignature()) {
/* sign-only binary (files/data stream) */
updateProgress(R.string.progress_signing, 8, 100);
- log.add(LogType.MSG_SE_ENCRYPTING, indent);
+ log.add(LogType.MSG_PSE_SIGNING, indent);
- InputStream in = mData.getInputStream();
+ InputStream in = inputData.getInputStream();
if (enableCompression) {
- compressGen = new PGPCompressedDataGenerator(mCompressionId);
+ compressGen = new PGPCompressedDataGenerator(input.getCompressionId());
bcpgOut = new BCPGOutputStream(compressGen.open(out));
} else {
bcpgOut = new BCPGOutputStream(out);
@@ -535,7 +444,8 @@ public class PgpSignEncrypt extends BaseOperation {
signatureGenerator.generateOnePassVersion(false).encode(bcpgOut);
PGPLiteralDataGenerator literalGen = new PGPLiteralDataGenerator();
- pOut = literalGen.open(bcpgOut, PGPLiteralData.BINARY, mOriginalFilename, new Date(),
+ pOut = literalGen.open(bcpgOut, PGPLiteralData.BINARY,
+ inputData.getOriginalFilename(), new Date(),
new byte[1 << 16]);
long alreadyWritten = 0;
@@ -547,8 +457,8 @@ public class PgpSignEncrypt extends BaseOperation {
signatureGenerator.update(buffer, 0, length);
alreadyWritten += length;
- if (mData.getSize() > 0) {
- long progress = 100 * alreadyWritten / mData.getSize();
+ if (inputData.getSize() > 0) {
+ long progress = 100 * alreadyWritten / inputData.getSize();
progressScaler.setProgress((int) progress, 100);
}
}
@@ -556,61 +466,89 @@ public class PgpSignEncrypt extends BaseOperation {
literalGen.close();
} else {
pOut = null;
- log.add(LogType.MSG_SE_CLEARSIGN_ONLY, indent);
+ // TODO: Is this log right?
+ log.add(LogType.MSG_PSE_CLEARSIGN_ONLY, indent);
}
if (enableSignature) {
updateProgress(R.string.progress_generating_signature, 95, 100);
try {
- signatureGenerator.generate().encode(pOut);
+ if (detachedBcpgOut != null) {
+ signatureGenerator.generate().encode(detachedBcpgOut);
+ } else {
+ signatureGenerator.generate().encode(pOut);
+ }
} catch (NfcSyncPGPContentSignerBuilder.NfcInteractionNeeded e) {
// this secret key diverts to a OpenPGP card, throw exception with hash that will be signed
- log.add(LogType.MSG_SE_PENDING_NFC, indent);
- SignEncryptResult result =
- new SignEncryptResult(SignEncryptResult.RESULT_PENDING_NFC, log);
+ log.add(LogType.MSG_PSE_PENDING_NFC, indent);
+ PgpSignEncryptResult result =
+ new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_PENDING_NFC, log);
// Note that the checked key here is the master key, not the signing key
// (although these are always the same on Yubikeys)
- result.setNfcData(mSignatureSubKeyId, e.hashToSign, e.hashAlgo, e.creationTimestamp, mSignaturePassphrase);
- Log.d(Constants.TAG, "e.hashToSign"+ Hex.toHexString(e.hashToSign));
+ result.setNfcData(input.getSignatureSubKeyId(), e.hashToSign, e.hashAlgo, e.creationTimestamp, input.getSignaturePassphrase());
+ Log.d(Constants.TAG, "e.hashToSign" + Hex.toHexString(e.hashToSign));
return result;
}
}
// closing outputs
// NOTE: closing needs to be done in the correct order!
- // TODO: closing bcpgOut and pOut???
- if (enableEncryption) {
- if (enableCompression) {
+ if (encryptionOut != null) {
+ if (compressGen != null) {
compressGen.close();
}
encryptionOut.close();
}
- if (mEnableAsciiArmorOutput) {
+ // Note: Closing ArmoredOutputStream does not close the underlying stream
+ if (armorOut != null) {
armorOut.close();
}
-
- out.close();
- mOutStream.close();
+ // Note: Closing ArmoredOutputStream does not close the underlying stream
+ if (detachedArmorOut != null) {
+ detachedArmorOut.close();
+ }
+ // Also closes detachedBcpgOut
+ if (detachedByteOut != null) {
+ detachedByteOut.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ if (outputStream != null) {
+ outputStream.close();
+ }
} catch (SignatureException e) {
- log.add(LogType.MSG_SE_ERROR_SIG, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ log.add(LogType.MSG_PSE_ERROR_SIG, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
} catch (PGPException e) {
- log.add(LogType.MSG_SE_ERROR_PGP, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ log.add(LogType.MSG_PSE_ERROR_PGP, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
} catch (IOException e) {
- log.add(LogType.MSG_SE_ERROR_IO, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ log.add(LogType.MSG_PSE_ERROR_IO, indent);
+ return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log);
}
updateProgress(R.string.progress_done, 100, 100);
- log.add(LogType.MSG_SE_OK, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_OK, log);
-
+ log.add(LogType.MSG_PSE_OK, indent);
+ PgpSignEncryptResult result = new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_OK, log);
+ if (detachedByteOut != null) {
+ try {
+ detachedByteOut.flush();
+ detachedByteOut.close();
+ } catch (IOException e) {
+ // silently catch
+ }
+ result.setDetachedSignature(detachedByteOut.toByteArray());
+ }
+ return result;
}
+ /**
+ * Remove whitespaces on line endings
+ */
private static void processLine(final String pLine, final ArmoredOutputStream pArmoredOutput,
final PGPSignatureGenerator pSignatureGenerator)
throws IOException, SignatureException {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java
new file mode 100644
index 000000000..a4ed33397
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SignEncryptParcel.java
@@ -0,0 +1,135 @@
+package org.sufficientlysecure.keychain.pgp;
+
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/** This parcel stores the input of one or more PgpSignEncrypt operations.
+ * All operations will use the same general paramters, differing only in
+ * input and output. Each input/output set depends on the paramters:
+ *
+ * - Each input uri is individually encrypted/signed
+ * - If a byte array is supplied, it is treated as an input before uris are processed
+ * - The number of output uris must match the number of input uris, plus one more
+ * if there is a byte array present.
+ * - Once the output uris are empty, there must be exactly one input (uri xor bytes)
+ * left, which will be returned in a byte array as part of the result parcel.
+ *
+ */
+public class SignEncryptParcel extends PgpSignEncryptInput implements Parcelable {
+
+ public ArrayList<Uri> mInputUris = new ArrayList<>();
+ public ArrayList<Uri> mOutputUris = new ArrayList<>();
+ public byte[] mBytes;
+
+ public SignEncryptParcel() {
+ super();
+ }
+
+ public SignEncryptParcel(Parcel src) {
+
+ // we do all of those here, so the PgpSignEncryptInput class doesn't have to be parcelable
+ mVersionHeader = src.readString();
+ mEnableAsciiArmorOutput = src.readInt() == 1;
+ mCompressionId = src.readInt();
+ mEncryptionMasterKeyIds = src.createLongArray();
+ mSymmetricPassphrase = src.readString();
+ mSymmetricEncryptionAlgorithm = src.readInt();
+ mSignatureMasterKeyId = src.readLong();
+ mSignatureSubKeyId = src.readInt() == 1 ? src.readLong() : null;
+ mSignatureHashAlgorithm = src.readInt();
+ mSignaturePassphrase = src.readString();
+ mAdditionalEncryptId = src.readLong();
+ mNfcSignedHash = src.createByteArray();
+ mNfcCreationTimestamp = src.readInt() == 1 ? new Date(src.readLong()) : null;
+ mFailOnMissingEncryptionKeyIds = src.readInt() == 1;
+ mCharset = src.readString();
+ mCleartextSignature = src.readInt() == 1;
+ mDetachedSignature = src.readInt() == 1;
+
+ mInputUris = src.createTypedArrayList(Uri.CREATOR);
+ mOutputUris = src.createTypedArrayList(Uri.CREATOR);
+ mBytes = src.createByteArray();
+
+ }
+
+ public byte[] getBytes() {
+ return mBytes;
+ }
+
+ public void setBytes(byte[] bytes) {
+ mBytes = bytes;
+ }
+
+ public List<Uri> getInputUris() {
+ return Collections.unmodifiableList(mInputUris);
+ }
+
+ public void addInputUris(Collection<Uri> inputUris) {
+ mInputUris.addAll(inputUris);
+ }
+
+ public List<Uri> getOutputUris() {
+ return Collections.unmodifiableList(mOutputUris);
+ }
+
+ public void addOutputUris(ArrayList<Uri> outputUris) {
+ mOutputUris.addAll(outputUris);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mVersionHeader);
+ dest.writeInt(mEnableAsciiArmorOutput ? 1 : 0);
+ dest.writeInt(mCompressionId);
+ dest.writeLongArray(mEncryptionMasterKeyIds);
+ dest.writeString(mSymmetricPassphrase);
+ dest.writeInt(mSymmetricEncryptionAlgorithm);
+ dest.writeLong(mSignatureMasterKeyId);
+ if (mSignatureSubKeyId != null) {
+ dest.writeInt(1);
+ dest.writeLong(mSignatureSubKeyId);
+ } else {
+ dest.writeInt(0);
+ }
+ dest.writeInt(mSignatureHashAlgorithm);
+ dest.writeString(mSignaturePassphrase);
+ dest.writeLong(mAdditionalEncryptId);
+ dest.writeByteArray(mNfcSignedHash);
+ if (mNfcCreationTimestamp != null) {
+ dest.writeInt(1);
+ dest.writeLong(mNfcCreationTimestamp.getTime());
+ } else {
+ dest.writeInt(0);
+ }
+ dest.writeInt(mFailOnMissingEncryptionKeyIds ? 1 : 0);
+ dest.writeString(mCharset);
+ dest.writeInt(mCleartextSignature ? 1 : 0);
+ dest.writeInt(mDetachedSignature ? 1 : 0);
+
+ dest.writeTypedList(mInputUris);
+ dest.writeTypedList(mOutputUris);
+ dest.writeByteArray(mBytes);
+ }
+
+ public static final Creator<SignEncryptParcel> CREATOR = new Creator<SignEncryptParcel>() {
+ public SignEncryptParcel createFromParcel(final Parcel source) {
+ return new SignEncryptParcel(source);
+ }
+
+ public SignEncryptParcel[] newArray(final int size) {
+ return new SignEncryptParcel[size];
+ }
+ };
+
+}
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 04fb955fa..681aff56d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java
@@ -35,9 +35,9 @@ import org.spongycastle.openpgp.PGPUserAttributeSubpacketVector;
import org.spongycastle.openpgp.PGPUtil;
import org.spongycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
@@ -445,7 +445,7 @@ public class UncachedKeyRing {
}
}
- ArrayList<String> processedUserIds = new ArrayList<String>();
+ ArrayList<String> processedUserIds = new ArrayList<>();
for (byte[] rawUserId : new IterableIterator<byte[]>(masterKey.getRawUserIDs())) {
String userId = Utf8Util.fromUTF8ByteArrayReplaceBadEncoding(rawUserId);
@@ -470,7 +470,7 @@ public class UncachedKeyRing {
@SuppressWarnings("unchecked")
Iterator<PGPSignature> signaturesIt = masterKey.getSignaturesForID(rawUserId);
if (signaturesIt != null) {
- for (PGPSignature zert : new IterableIterator<PGPSignature>(signaturesIt)) {
+ for (PGPSignature zert : new IterableIterator<>(signaturesIt)) {
WrappedSignature cert = new WrappedSignature(zert);
long certId = cert.getKeyId();
@@ -635,7 +635,7 @@ public class UncachedKeyRing {
@SuppressWarnings("unchecked")
Iterator<PGPSignature> signaturesIt = masterKey.getSignaturesForUserAttribute(userAttribute);
if (signaturesIt != null) {
- for (PGPSignature zert : new IterableIterator<PGPSignature>(signaturesIt)) {
+ for (PGPSignature zert : new IterableIterator<>(signaturesIt)) {
WrappedSignature cert = new WrappedSignature(zert);
long certId = cert.getKeyId();
@@ -778,7 +778,7 @@ public class UncachedKeyRing {
}
// Keep track of ids we encountered so far
- Set<Long> knownIds = new HashSet<Long>();
+ Set<Long> knownIds = new HashSet<>();
// Process all keys
for (PGPPublicKey key : new IterableIterator<PGPPublicKey>(ring.getPublicKeys())) {
@@ -1042,7 +1042,7 @@ public class UncachedKeyRing {
}
// remember which certs we already added. this is cheaper than semantic deduplication
- Set<byte[]> certs = new TreeSet<byte[]>(new Comparator<byte[]>() {
+ Set<byte[]> certs = new TreeSet<>(new Comparator<byte[]>() {
public int compare(byte[] left, byte[] right) {
// check for length equality
if (left.length != right.length) {
@@ -1124,7 +1124,7 @@ public class UncachedKeyRing {
if (signaturesIt == null) {
continue;
}
- for (PGPSignature cert : new IterableIterator<PGPSignature>(signaturesIt)) {
+ for (PGPSignature cert : new IterableIterator<>(signaturesIt)) {
// Don't merge foreign stuff into secret keys
if (cert.getKeyID() != masterKeyId && isSecret()) {
continue;
@@ -1149,7 +1149,7 @@ public class UncachedKeyRing {
if (signaturesIt == null) {
continue;
}
- for (PGPSignature cert : new IterableIterator<PGPSignature>(signaturesIt)) {
+ for (PGPSignature cert : new IterableIterator<>(signaturesIt)) {
// Don't merge foreign stuff into secret keys
if (cert.getKeyID() != masterKeyId && isSecret()) {
continue;
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 9e3528515..0173a1d83 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedPublicKey.java
@@ -20,7 +20,6 @@ package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.ECPublicBCPGKey;
import org.spongycastle.bcpg.SignatureSubpacketTags;
-import org.spongycastle.bcpg.sig.KeyFlags;
import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPSignature;
import org.spongycastle.openpgp.PGPSignatureSubpacketVector;
@@ -51,7 +50,7 @@ public class UncachedPublicKey {
}
/** The revocation signature is NOT checked here, so this may be false! */
- public boolean isRevoked() {
+ public boolean isMaybeRevoked() {
return mPublicKey.getSignaturesOfType(isMasterKey()
? PGPSignature.KEY_REVOCATION
: PGPSignature.SUBKEY_REVOCATION).hasNext();
@@ -61,25 +60,8 @@ public class UncachedPublicKey {
return mPublicKey.getCreationTime();
}
- public Date getExpiryTime() {
- long seconds = mPublicKey.getValidSeconds();
- if (seconds > Integer.MAX_VALUE) {
- Log.e(Constants.TAG, "error, expiry time too large");
- return null;
- }
- if (seconds == 0) {
- // no expiry
- return null;
- }
- Date creationDate = getCreationTime();
- Calendar calendar = GregorianCalendar.getInstance();
- calendar.setTime(creationDate);
- calendar.add(Calendar.SECOND, (int) seconds);
-
- return calendar.getTime();
- }
-
- public boolean isExpired() {
+ /** The revocation signature is NOT checked here, so this may be false! */
+ public boolean isMaybeExpired() {
Date creationDate = mPublicKey.getCreationTime();
Date expiryDate = mPublicKey.getValidSeconds() > 0
? new Date(creationDate.getTime() + mPublicKey.getValidSeconds() * 1000) : null;
@@ -136,7 +118,7 @@ public class UncachedPublicKey {
continue;
}
- for (PGPSignature sig : new IterableIterator<PGPSignature>(signaturesIt)) {
+ for (PGPSignature sig : new IterableIterator<>(signaturesIt)) {
try {
// if this is a revocation, this is not the user id
@@ -200,7 +182,7 @@ public class UncachedPublicKey {
}
public ArrayList<String> getUnorderedUserIds() {
- ArrayList<String> userIds = new ArrayList<String>();
+ ArrayList<String> userIds = new ArrayList<>();
for (byte[] rawUserId : new IterableIterator<byte[]>(mPublicKey.getRawUserIDs())) {
// use our decoding method
userIds.add(Utf8Util.fromUTF8ByteArrayReplaceBadEncoding(rawUserId));
@@ -209,7 +191,7 @@ public class UncachedPublicKey {
}
public ArrayList<byte[]> getUnorderedRawUserIds() {
- ArrayList<byte[]> userIds = new ArrayList<byte[]>();
+ ArrayList<byte[]> userIds = new ArrayList<>();
for (byte[] userId : new IterableIterator<byte[]>(mPublicKey.getRawUserIDs())) {
userIds.add(userId);
}
@@ -217,7 +199,7 @@ public class UncachedPublicKey {
}
public ArrayList<WrappedUserAttribute> getUnorderedUserAttributes() {
- ArrayList<WrappedUserAttribute> userAttributes = new ArrayList<WrappedUserAttribute>();
+ ArrayList<WrappedUserAttribute> userAttributes = new ArrayList<>();
for (PGPUserAttributeSubpacketVector userAttribute :
new IterableIterator<PGPUserAttributeSubpacketVector>(mPublicKey.getUserAttributes())) {
userAttributes.add(new WrappedUserAttribute(userAttribute));
@@ -305,28 +287,79 @@ public class UncachedPublicKey {
*
* Note that this method has package visiblity because it is used in test
* cases. Certificates of UncachedPublicKey instances can NOT be assumed to
- * be verified, so the result of this method should not be used in other
- * places!
+ * be verified or even by the correct key, so the result of this method
+ * should never be used in other places!
*/
@SuppressWarnings("unchecked")
Integer getKeyUsage() {
if (mCacheUsage == null) {
+ PGPSignature mostRecentSig = null;
for (PGPSignature sig : new IterableIterator<PGPSignature>(mPublicKey.getSignatures())) {
if (mPublicKey.isMasterKey() && sig.getKeyID() != mPublicKey.getKeyID()) {
continue;
}
- PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();
+ switch (sig.getSignatureType()) {
+ case PGPSignature.DEFAULT_CERTIFICATION:
+ case PGPSignature.POSITIVE_CERTIFICATION:
+ case PGPSignature.CASUAL_CERTIFICATION:
+ case PGPSignature.NO_CERTIFICATION:
+ case PGPSignature.SUBKEY_BINDING:
+ break;
+ // if this is not one of the above types, don't care
+ default:
+ continue;
+ }
+
+ // If we have no sig yet, take the first we can get
+ if (mostRecentSig == null) {
+ mostRecentSig = sig;
+ continue;
+ }
+
+ // If the new sig is less recent, skip it
+ if (mostRecentSig.getCreationTime().after(sig.getCreationTime())) {
+ continue;
+ }
+
+ // Otherwise, note it down as the new "most recent" one
+ mostRecentSig = sig;
+ }
+
+ // Initialize to 0 as cached but empty value, if there is no sig (can't happen
+ // for canonicalized keyring), or there is no KEY_FLAGS packet in the sig
+ mCacheUsage = 0;
+ if (mostRecentSig != null) {
+ // If a mostRecentSig has been found, (cache and) return its flags
+ PGPSignatureSubpacketVector hashed = mostRecentSig.getHashedSubPackets();
if (hashed != null && hashed.getSubpacket(SignatureSubpacketTags.KEY_FLAGS) != null) {
- // init if at least one key flag subpacket has been found
- if (mCacheUsage == null) {
- mCacheUsage = 0;
- }
- mCacheUsage |= hashed.getKeyFlags();
+ mCacheUsage = hashed.getKeyFlags();
}
}
+
}
return mCacheUsage;
}
+ // this method relies on UNSAFE assumptions about the keyring, and should ONLY be used for
+ // TEST CASES!!
+ Date getUnsafeExpiryTimeForTesting () {
+ long valid = mPublicKey.getValidSeconds();
+
+ if (valid > Integer.MAX_VALUE) {
+ Log.e(Constants.TAG, "error, expiry time too large");
+ return null;
+ }
+ if (valid == 0) {
+ // no expiry
+ return null;
+ }
+ Date creationDate = getCreationTime();
+ Calendar calendar = GregorianCalendar.getInstance();
+ calendar.setTime(creationDate);
+ calendar.add(Calendar.SECOND, (int) valid);
+
+ return calendar.getTime();
+ }
+
}
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 cb03970e2..c6fad1a73 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedSignature.java
@@ -36,7 +36,6 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
-import java.security.SignatureException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -79,8 +78,12 @@ public class WrappedSignature {
return mSig.getCreationTime();
}
+ public long getKeyExpirySeconds() {
+ return mSig.getHashedSubPackets().getKeyExpirationTime();
+ }
+
public ArrayList<WrappedSignature> getEmbeddedSignatures() {
- ArrayList<WrappedSignature> sigs = new ArrayList<WrappedSignature>();
+ ArrayList<WrappedSignature> sigs = new ArrayList<>();
if (!mSig.hasSubpackets()) {
return sigs;
}
@@ -255,7 +258,7 @@ public class WrappedSignature {
}
public HashMap<String,String> getNotation() {
- HashMap<String,String> result = new HashMap<String,String>();
+ HashMap<String,String> result = new HashMap<>();
// If there is any notation data
if (mSig.getHashedSubPackets() != null
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedUserAttribute.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedUserAttribute.java
index 370c3f89d..8f967499e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedUserAttribute.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/WrappedUserAttribute.java
@@ -1,5 +1,8 @@
/*
+<<<<<<< HEAD
* Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+=======
+>>>>>>> development
* Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
*
* This program is free software: you can redistribute it and/or modify
@@ -33,7 +36,6 @@ import java.io.IOException;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Arrays;
public class WrappedUserAttribute implements Serializable {
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 f4e00c36c..5856589c4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
@@ -85,6 +85,11 @@ public class KeychainContract {
String PACKAGE_NAME = "package_name"; // foreign key to api_apps.package_name
}
+ interface ApiAppsAllowedKeysColumns {
+ String KEY_ID = "key_id"; // not a database id
+ String PACKAGE_NAME = "package_name"; // foreign key to api_apps.package_name
+ }
+
public static final String CONTENT_AUTHORITY = Constants.PACKAGE_NAME + ".provider";
private static final Uri BASE_CONTENT_URI_INTERNAL = Uri
@@ -106,6 +111,7 @@ public class KeychainContract {
public static final String BASE_API_APPS = "api_apps";
public static final String PATH_ACCOUNTS = "accounts";
+ public static final String PATH_ALLOWED_KEYS = "allowed_keys";
public static class KeyRings implements BaseColumns, KeysColumns, UserPacketsColumns {
public static final String MASTER_KEY_ID = KeysColumns.MASTER_KEY_ID;
@@ -305,6 +311,22 @@ public class KeychainContract {
}
}
+ public static class ApiAllowedKeys implements ApiAppsAllowedKeysColumns, BaseColumns {
+ public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
+ .appendPath(BASE_API_APPS).build();
+
+ /**
+ * Use if multiple items get returned
+ */
+ public static final String CONTENT_TYPE
+ = "vnd.android.cursor.dir/vnd.org.sufficientlysecure.keychain.provider.api_apps.allowed_keys";
+
+ public static Uri buildBaseUri(String packageName) {
+ return CONTENT_URI.buildUpon().appendEncodedPath(packageName).appendPath(PATH_ALLOWED_KEYS)
+ .build();
+ }
+ }
+
public static class Certs implements CertsColumns, BaseColumns {
public static final String USER_ID = UserPacketsColumns.USER_ID;
public static final String SIGNER_UID = "signer_user_id";
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 5ce5eec17..b88cd6006 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -29,6 +29,7 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAccountsColumns;
+import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAllowedKeysColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingsColumns;
@@ -52,7 +53,7 @@ import java.io.IOException;
*/
public class KeychainDatabase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "openkeychain.db";
- private static final int DATABASE_VERSION = 7;
+ private static final int DATABASE_VERSION = 8;
static Boolean apgHack = false;
private Context mContext;
@@ -64,6 +65,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
String CERTS = "certs";
String API_APPS = "api_apps";
String API_ACCOUNTS = "api_accounts";
+ String API_ALLOWED_KEYS = "api_allowed_keys";
}
private static final String CREATE_KEYRINGS_PUBLIC =
@@ -166,6 +168,18 @@ public class KeychainDatabase extends SQLiteOpenHelper {
+ Tables.API_APPS + "(" + ApiAppsColumns.PACKAGE_NAME + ") ON DELETE CASCADE"
+ ")";
+ private static final String CREATE_API_APPS_ALLOWED_KEYS =
+ "CREATE TABLE IF NOT EXISTS " + Tables.API_ALLOWED_KEYS + " ("
+ + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ + ApiAppsAllowedKeysColumns.KEY_ID + " INTEGER, "
+ + ApiAppsAllowedKeysColumns.PACKAGE_NAME + " TEXT NOT NULL, "
+
+ + "UNIQUE(" + ApiAppsAllowedKeysColumns.KEY_ID + ", "
+ + ApiAppsAllowedKeysColumns.PACKAGE_NAME + "), "
+ + "FOREIGN KEY(" + ApiAppsAllowedKeysColumns.PACKAGE_NAME + ") REFERENCES "
+ + Tables.API_APPS + "(" + ApiAppsAllowedKeysColumns.PACKAGE_NAME + ") ON DELETE CASCADE"
+ + ")";
+
KeychainDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
@@ -195,6 +209,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
db.execSQL(CREATE_CERTS);
db.execSQL(CREATE_API_APPS);
db.execSQL(CREATE_API_APPS_ACCOUNTS);
+ db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
}
@Override
@@ -243,6 +258,15 @@ public class KeychainDatabase extends SQLiteOpenHelper {
case 6:
db.execSQL("ALTER TABLE user_ids ADD COLUMN type INTEGER");
db.execSQL("ALTER TABLE user_ids ADD COLUMN attribute_data BLOB");
+ case 7:
+ // consolidate
+ case 8:
+ // new table for allowed key ids in API
+ try {
+ db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
+ } catch (Exception e) {
+ // never mind, the column probably already existed
+ }
}
// always do consolidate after upgrade
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
index 29b9c5f9f..3aa156a8e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
@@ -32,6 +32,7 @@ import android.text.TextUtils;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAccounts;
+import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAllowedKeys;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
@@ -63,9 +64,10 @@ public class KeychainProvider extends ContentProvider {
private static final int KEY_RING_CERTS_SPECIFIC = 206;
private static final int API_APPS = 301;
- private static final int API_APPS_BY_PACKAGE_NAME = 303;
- private static final int API_ACCOUNTS = 304;
- private static final int API_ACCOUNTS_BY_ACCOUNT_NAME = 306;
+ private static final int API_APPS_BY_PACKAGE_NAME = 302;
+ private static final int API_ACCOUNTS = 303;
+ private static final int API_ACCOUNTS_BY_ACCOUNT_NAME = 304;
+ private static final int API_ALLOWED_KEYS = 305;
private static final int KEY_RINGS_FIND_BY_EMAIL = 400;
private static final int KEY_RINGS_FIND_BY_SUBKEY = 401;
@@ -162,6 +164,8 @@ public class KeychainProvider extends ContentProvider {
*
* api_apps/_/accounts
* api_apps/_/accounts/_ (account name)
+ *
+ * api_apps/_/allowed_keys
* </pre>
*/
matcher.addURI(authority, KeychainContract.BASE_API_APPS, API_APPS);
@@ -172,6 +176,9 @@ public class KeychainProvider extends ContentProvider {
matcher.addURI(authority, KeychainContract.BASE_API_APPS + "/*/"
+ KeychainContract.PATH_ACCOUNTS + "/*", API_ACCOUNTS_BY_ACCOUNT_NAME);
+ matcher.addURI(authority, KeychainContract.BASE_API_APPS + "/*/"
+ + KeychainContract.PATH_ALLOWED_KEYS, API_ALLOWED_KEYS);
+
return matcher;
}
@@ -223,6 +230,9 @@ public class KeychainProvider extends ContentProvider {
case API_ACCOUNTS_BY_ACCOUNT_NAME:
return ApiAccounts.CONTENT_ITEM_TYPE;
+ case API_ALLOWED_KEYS:
+ return ApiAllowedKeys.CONTENT_TYPE;
+
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
@@ -248,7 +258,7 @@ public class KeychainProvider extends ContentProvider {
case KEY_RINGS_UNIFIED:
case KEY_RINGS_FIND_BY_EMAIL:
case KEY_RINGS_FIND_BY_SUBKEY: {
- HashMap<String, String> projectionMap = new HashMap<String, String>();
+ HashMap<String, String> projectionMap = new HashMap<>();
projectionMap.put(KeyRings._ID, Tables.KEYS + ".oid AS _id");
projectionMap.put(KeyRings.MASTER_KEY_ID, Tables.KEYS + "." + Keys.MASTER_KEY_ID);
projectionMap.put(KeyRings.KEY_ID, Tables.KEYS + "." + Keys.KEY_ID);
@@ -432,7 +442,7 @@ public class KeychainProvider extends ContentProvider {
}
case KEY_RING_KEYS: {
- HashMap<String, String> projectionMap = new HashMap<String, String>();
+ HashMap<String, String> projectionMap = new HashMap<>();
projectionMap.put(Keys._ID, Tables.KEYS + ".oid AS _id");
projectionMap.put(Keys.MASTER_KEY_ID, Tables.KEYS + "." + Keys.MASTER_KEY_ID);
projectionMap.put(Keys.RANK, Tables.KEYS + "." + Keys.RANK);
@@ -460,7 +470,7 @@ public class KeychainProvider extends ContentProvider {
case KEY_RINGS_USER_IDS:
case KEY_RING_USER_IDS: {
- HashMap<String, String> projectionMap = new HashMap<String, String>();
+ HashMap<String, String> projectionMap = new HashMap<>();
projectionMap.put(UserPackets._ID, Tables.USER_PACKETS + ".oid AS _id");
projectionMap.put(UserPackets.MASTER_KEY_ID, Tables.USER_PACKETS + "." + UserPackets.MASTER_KEY_ID);
projectionMap.put(UserPackets.TYPE, Tables.USER_PACKETS + "." + UserPackets.TYPE);
@@ -507,7 +517,7 @@ public class KeychainProvider extends ContentProvider {
case KEY_RINGS_PUBLIC:
case KEY_RING_PUBLIC: {
- HashMap<String, String> projectionMap = new HashMap<String, String>();
+ HashMap<String, String> projectionMap = new HashMap<>();
projectionMap.put(KeyRingData._ID, Tables.KEY_RINGS_PUBLIC + ".oid AS _id");
projectionMap.put(KeyRingData.MASTER_KEY_ID, KeyRingData.MASTER_KEY_ID);
projectionMap.put(KeyRingData.KEY_RING_DATA, KeyRingData.KEY_RING_DATA);
@@ -525,7 +535,7 @@ public class KeychainProvider extends ContentProvider {
case KEY_RINGS_SECRET:
case KEY_RING_SECRET: {
- HashMap<String, String> projectionMap = new HashMap<String, String>();
+ HashMap<String, String> projectionMap = new HashMap<>();
projectionMap.put(KeyRingData._ID, Tables.KEY_RINGS_SECRET + ".oid AS _id");
projectionMap.put(KeyRingData.MASTER_KEY_ID, KeyRingData.MASTER_KEY_ID);
projectionMap.put(KeyRingData.KEY_RING_DATA, KeyRingData.KEY_RING_DATA);
@@ -543,7 +553,7 @@ public class KeychainProvider extends ContentProvider {
case KEY_RING_CERTS:
case KEY_RING_CERTS_SPECIFIC: {
- HashMap<String, String> projectionMap = new HashMap<String, String>();
+ HashMap<String, String> projectionMap = new HashMap<>();
projectionMap.put(Certs._ID, Tables.CERTS + ".oid AS " + Certs._ID);
projectionMap.put(Certs.MASTER_KEY_ID, Tables.CERTS + "." + Certs.MASTER_KEY_ID);
projectionMap.put(Certs.RANK, Tables.CERTS + "." + Certs.RANK);
@@ -614,6 +624,12 @@ public class KeychainProvider extends ContentProvider {
qb.appendWhereEscapeString(uri.getLastPathSegment());
break;
+ case API_ALLOWED_KEYS:
+ qb.setTables(Tables.API_ALLOWED_KEYS);
+ qb.appendWhere(Tables.API_ALLOWED_KEYS + "." + ApiAccounts.PACKAGE_NAME + " = ");
+ qb.appendWhereEscapeString(uri.getPathSegments().get(1));
+
+ break;
default:
throw new IllegalArgumentException("Unknown URI " + uri + " (" + match + ")");
@@ -701,7 +717,7 @@ public class KeychainProvider extends ContentProvider {
db.insertOrThrow(Tables.API_APPS, null, values);
break;
- case API_ACCOUNTS:
+ case API_ACCOUNTS: {
// set foreign key automatically based on given uri
// e.g., api_apps/com.example.app/accounts/
String packageName = uri.getPathSegments().get(1);
@@ -709,12 +725,21 @@ public class KeychainProvider extends ContentProvider {
db.insertOrThrow(Tables.API_ACCOUNTS, null, values);
break;
+ }
+ case API_ALLOWED_KEYS: {
+ // set foreign key automatically based on given uri
+ // e.g., api_apps/com.example.app/allowed_keys/
+ String packageName = uri.getPathSegments().get(1);
+ values.put(ApiAllowedKeys.PACKAGE_NAME, packageName);
+ db.insertOrThrow(Tables.API_ALLOWED_KEYS, null, values);
+ break;
+ }
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
- if(keyId != null) {
+ if (keyId != null) {
uri = KeyRings.buildGenericKeyRingUri(keyId);
rowUri = uri;
}
@@ -777,6 +802,10 @@ public class KeychainProvider extends ContentProvider {
count = db.delete(Tables.API_ACCOUNTS, buildDefaultApiAccountsSelection(uri, additionalSelection),
selectionArgs);
break;
+ case API_ALLOWED_KEYS:
+ count = db.delete(Tables.API_ALLOWED_KEYS, buildDefaultApiAllowedKeysSelection(uri, additionalSelection),
+ selectionArgs);
+ break;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
@@ -869,4 +898,15 @@ public class KeychainProvider extends ContentProvider {
+ andSelection;
}
+ private String buildDefaultApiAllowedKeysSelection(Uri uri, String selection) {
+ String packageName = DatabaseUtils.sqlEscapeString(uri.getPathSegments().get(1));
+
+ String andSelection = "";
+ if (!TextUtils.isEmpty(selection)) {
+ andSelection = " AND (" + selection + ")";
+ }
+
+ return ApiAllowedKeys.PACKAGE_NAME + "=" + packageName + andSelection;
+ }
+
}
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 c3990229d..8a9f36c03 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -37,6 +37,12 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.ImportExportOperation;
+import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey;
@@ -44,26 +50,27 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
-import org.sufficientlysecure.keychain.operations.ImportExportOperation;
import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
+import org.sufficientlysecure.keychain.pgp.WrappedUserAttribute;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAllowedKeys;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
+import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.remote.AccountSettings;
import org.sufficientlysecure.keychain.remote.AppSettings;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
-import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
-import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
-import org.sufficientlysecure.keychain.util.ParcelableFileCache;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
+import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.ProgressFixedScaler;
import org.sufficientlysecure.keychain.util.ProgressScaler;
import org.sufficientlysecure.keychain.util.Utf8Util;
@@ -170,7 +177,7 @@ public class ProviderHelper {
Cursor cursor = mContentResolver.query(uri, proj, selection, null, null);
try {
- HashMap<String, Object> result = new HashMap<String, Object>(proj.length);
+ HashMap<String, Object> result = new HashMap<>(proj.length);
if (cursor != null && cursor.moveToFirst()) {
int pos = 0;
for (String p : proj) {
@@ -221,7 +228,7 @@ public class ProviderHelper {
}, KeyRings.HAS_ANY_SECRET + " = 1", null, null);
try {
- LongSparseArray<CanonicalizedPublicKey> result = new LongSparseArray<CanonicalizedPublicKey>();
+ LongSparseArray<CanonicalizedPublicKey> result = new LongSparseArray<>();
if (cursor != null && cursor.moveToFirst()) do {
long masterKeyId = cursor.getLong(0);
@@ -350,7 +357,7 @@ public class ProviderHelper {
mIndent += 1;
// save all keys and userIds included in keyRing object in database
- operations = new ArrayList<ContentProviderOperation>();
+ operations = new ArrayList<>();
log(LogType.MSG_IP_INSERT_KEYRING);
{ // insert keyring
@@ -440,7 +447,7 @@ public class ProviderHelper {
// classify and order user ids. primary are moved to the front, revoked to the back,
// otherwise the order in the keyfile is preserved.
- List<UserPacketItem> uids = new ArrayList<UserPacketItem>();
+ List<UserPacketItem> uids = new ArrayList<>();
if (trustedKeys.size() == 0) {
log(LogType.MSG_IP_UID_CLASSIFYING_ZERO);
@@ -460,7 +467,7 @@ public class ProviderHelper {
log(LogType.MSG_IP_UID_PROCESSING, userId);
mIndent += 1;
// look through signatures for this specific key
- for (WrappedSignature cert : new IterableIterator<WrappedSignature>(
+ for (WrappedSignature cert : new IterableIterator<>(
masterKey.getSignaturesForRawId(rawUserId))) {
long certId = cert.getKeyId();
// self signature
@@ -472,7 +479,7 @@ public class ProviderHelper {
item.selfCert = cert;
item.isPrimary = cert.isPrimaryUserId();
} else {
- item.isRevoked = true;
+ item.selfRevocation = cert;
log(LogType.MSG_IP_UID_REVOKED);
}
continue;
@@ -560,7 +567,7 @@ public class ProviderHelper {
}
mIndent += 1;
// look through signatures for this specific key
- for (WrappedSignature cert : new IterableIterator<WrappedSignature>(
+ for (WrappedSignature cert : new IterableIterator<>(
masterKey.getSignaturesForUserAttribute(userAttribute))) {
long certId = cert.getKeyId();
// self signature
@@ -568,10 +575,11 @@ public class ProviderHelper {
// NOTE self-certificates are already verified during canonicalization,
// AND we know there is at most one cert plus at most one revocation
+ // AND the revocation only exists if there is no newer certification
if (!cert.isRevocation()) {
item.selfCert = cert;
} else {
- item.isRevoked = true;
+ item.selfRevocation = cert;
log(LogType.MSG_IP_UAT_REVOKED);
}
continue;
@@ -642,16 +650,21 @@ public class ProviderHelper {
for (int userIdRank = 0; userIdRank < uids.size(); userIdRank++) {
UserPacketItem item = uids.get(userIdRank);
operations.add(buildUserIdOperations(masterKeyId, item, userIdRank));
- if (item.selfCert != null) {
- // TODO get rid of "self verified" status? this cannot even happen anymore!
- operations.add(buildCertOperations(masterKeyId, userIdRank, item.selfCert,
- selfCertsAreTrusted ? Certs.VERIFIED_SECRET : Certs.VERIFIED_SELF));
+
+ if (item.selfCert == null) {
+ throw new AssertionError("User ids MUST be self-certified at this point!!");
}
- // don't bother with trusted certs if the uid is revoked, anyways
- if (item.isRevoked) {
+
+ if (item.selfRevocation != null) {
+ operations.add(buildCertOperations(masterKeyId, userIdRank, item.selfRevocation,
+ Certs.VERIFIED_SELF));
+ // don't bother with trusted certs if the uid is revoked, anyways
continue;
}
+ operations.add(buildCertOperations(masterKeyId, userIdRank, item.selfCert,
+ selfCertsAreTrusted ? Certs.VERIFIED_SECRET : Certs.VERIFIED_SELF));
+
// iterate over signatures
for (int i = 0; i < item.trustedCerts.size() ; i++) {
WrappedSignature sig = item.trustedCerts.valueAt(i);
@@ -710,12 +723,17 @@ public class ProviderHelper {
String userId;
byte[] attributeData;
boolean isPrimary = false;
- boolean isRevoked = false;
WrappedSignature selfCert;
- LongSparseArray<WrappedSignature> trustedCerts = new LongSparseArray<WrappedSignature>();
+ WrappedSignature selfRevocation;
+ LongSparseArray<WrappedSignature> trustedCerts = new LongSparseArray<>();
@Override
public int compareTo(UserPacketItem o) {
+ // revoked keys always come last!
+ //noinspection DoubleNegation
+ if ( (selfRevocation != null) != (o.selfRevocation != null)) {
+ return selfRevocation != null ? 1 : -1;
+ }
// if one is a user id, but the other isn't, the user id always comes first.
// we compare for null values here, so != is the correct operator!
// noinspection NumberEquality
@@ -726,10 +744,6 @@ public class ProviderHelper {
if (isPrimary != o.isPrimary) {
return isPrimary ? -1 : 1;
}
- // revoked keys always come last!
- if (isRevoked != o.isRevoked) {
- return isRevoked ? 1 : -1;
- }
return 0;
}
}
@@ -1053,6 +1067,11 @@ public class ProviderHelper {
log.add(LogType.MSG_CON, indent);
indent += 1;
+ if (mConsolidateCritical) {
+ log.add(LogType.MSG_CON_RECURSIVE, indent);
+ return new ConsolidateResult(ConsolidateResult.RESULT_OK, log);
+ }
+
progress.setProgress(R.string.progress_con_saving, 0, 100);
// The consolidate operation can never be cancelled!
@@ -1075,7 +1094,7 @@ public class ProviderHelper {
// No keys existing might be a legitimate option, we write an empty file in that case
cursor.moveToFirst();
ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_secret.pcl");
+ new ParcelableFileCache<>(mContext, "consolidate_secret.pcl");
cache.writeCache(cursor.getCount(), new Iterator<ParcelableKeyRing>() {
ParcelableKeyRing ring;
@@ -1137,7 +1156,7 @@ public class ProviderHelper {
// No keys existing might be a legitimate option, we write an empty file in that case
cursor.moveToFirst();
ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_public.pcl");
+ new ParcelableFileCache<>(mContext, "consolidate_public.pcl");
cache.writeCache(cursor.getCount(), new Iterator<ParcelableKeyRing>() {
ParcelableKeyRing ring;
@@ -1219,13 +1238,11 @@ public class ProviderHelper {
log.add(LogType.MSG_CON_DB_CLEAR, indent);
mContentResolver.delete(KeyRings.buildUnifiedKeyRingsUri(), null, null);
- ParcelableFileCache<ParcelableKeyRing> cacheSecret =
- new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_secret.pcl");
- ParcelableFileCache<ParcelableKeyRing> cachePublic =
- new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_public.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cacheSecret, cachePublic;
// Set flag that we have a cached consolidation here
try {
+ cacheSecret = new ParcelableFileCache<>(mContext, "consolidate_secret.pcl");
IteratorWithSize<ParcelableKeyRing> itSecrets = cacheSecret.readCache(false);
int numSecrets = itSecrets.getSize();
@@ -1253,6 +1270,7 @@ public class ProviderHelper {
try {
+ cachePublic = new ParcelableFileCache<>(mContext, "consolidate_public.pcl");
IteratorWithSize<ParcelableKeyRing> itPublics = cachePublic.readCache();
int numPublics = itPublics.getSize();
@@ -1308,7 +1326,6 @@ public class ProviderHelper {
progress.setProgress(100, 100);
log.add(LogType.MSG_CON_SUCCESS, indent);
- indent -= 1;
return new ConsolidateResult(ConsolidateResult.RESULT_OK, log);
@@ -1349,7 +1366,7 @@ public class ProviderHelper {
values.put(UserPackets.USER_ID, item.userId);
values.put(UserPackets.ATTRIBUTE_DATA, item.attributeData);
values.put(UserPackets.IS_PRIMARY, item.isPrimary);
- values.put(UserPackets.IS_REVOKED, item.isRevoked);
+ values.put(UserPackets.IS_REVOKED, item.selfRevocation != null);
values.put(UserPackets.RANK, rank);
Uri uri = UserPackets.buildUserIdsUri(masterKeyId);
@@ -1380,7 +1397,7 @@ public class ProviderHelper {
public ArrayList<String> getRegisteredApiApps() {
Cursor cursor = mContentResolver.query(ApiApps.CONTENT_URI, null, null, null, null);
- ArrayList<String> packageNames = new ArrayList<String>();
+ ArrayList<String> packageNames = new ArrayList<>();
try {
if (cursor != null) {
int packageNameCol = cursor.getColumnIndex(ApiApps.PACKAGE_NAME);
@@ -1485,7 +1502,7 @@ public class ProviderHelper {
}
public Set<Long> getAllKeyIdsForApp(Uri uri) {
- Set<Long> keyIds = new HashSet<Long>();
+ Set<Long> keyIds = new HashSet<>();
Cursor cursor = mContentResolver.query(uri, null, null, null, null);
try {
@@ -1504,8 +1521,41 @@ public class ProviderHelper {
return keyIds;
}
+ public Set<Long> getAllowedKeyIdsForApp(Uri uri) {
+ Set<Long> keyIds = new HashSet<>();
+
+ Cursor cursor = mContentResolver.query(uri, null, null, null, null);
+ try {
+ if (cursor != null) {
+ int keyIdColumn = cursor.getColumnIndex(KeychainContract.ApiAllowedKeys.KEY_ID);
+ while (cursor.moveToNext()) {
+ keyIds.add(cursor.getLong(keyIdColumn));
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ return keyIds;
+ }
+
+ public void saveAllowedKeyIdsForApp(Uri uri, Set<Long> allowedKeyIds)
+ throws RemoteException, OperationApplicationException {
+ // wipe whole table of allowed keys for this account
+ mContentResolver.delete(uri, null, null);
+
+ // re-insert allowed key ids
+ for (Long keyId : allowedKeyIds) {
+ ContentValues values = new ContentValues();
+ values.put(ApiAllowedKeys.KEY_ID, keyId);
+ mContentResolver.insert(uri, values);
+ }
+ }
+
public Set<String> getAllFingerprints(Uri uri) {
- Set<String> fingerprints = new HashSet<String>();
+ Set<String> fingerprints = new HashSet<>();
String[] projection = new String[]{KeyRings.FINGERPRINT};
Cursor cursor = mContentResolver.query(uri, projection, null, null, null);
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
index a5813567a..1a65b1bee 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -26,35 +26,34 @@ import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import org.openintents.openpgp.IOpenPgpService;
-import org.openintents.openpgp.OpenPgpMetadata;
import org.openintents.openpgp.OpenPgpError;
+import org.openintents.openpgp.OpenPgpMetadata;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.openintents.openpgp.util.OpenPgpApi;
import org.spongycastle.util.encoders.Hex;
-import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
-import org.sufficientlysecure.keychain.ui.NfcActivity;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
-import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
-import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel;
+import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
+import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
-import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt;
+import org.sufficientlysecure.keychain.pgp.PgpSignEncryptInput;
+import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAccounts;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity;
-import org.sufficientlysecure.keychain.service.PassphraseCacheService;
-import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel;
-import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
import org.sufficientlysecure.keychain.ui.ImportKeysActivity;
+import org.sufficientlysecure.keychain.ui.NfcActivity;
import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity;
import org.sufficientlysecure.keychain.ui.ViewKeyActivity;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
+import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
@@ -85,9 +84,9 @@ public class OpenPgpService extends RemoteService {
boolean missingUserIdsCheck = false;
boolean duplicateUserIdsCheck = false;
- ArrayList<Long> keyIds = new ArrayList<Long>();
- ArrayList<String> missingUserIds = new ArrayList<String>();
- ArrayList<String> duplicateUserIds = new ArrayList<String>();
+ ArrayList<Long> keyIds = new ArrayList<>();
+ ArrayList<String> missingUserIds = new ArrayList<>();
+ ArrayList<String> duplicateUserIds = new ArrayList<>();
if (!noUserIdsCheck) {
for (String email : encryptionUserIds) {
// try to find the key for this specific email
@@ -222,9 +221,12 @@ public class OpenPgpService extends RemoteService {
}
private Intent signImpl(Intent data, ParcelFileDescriptor input,
- ParcelFileDescriptor output, AccountSettings accSettings) {
+ ParcelFileDescriptor output, AccountSettings accSettings,
+ boolean cleartextSign) {
+ InputStream is = null;
+ OutputStream os = null;
try {
- boolean asciiArmor = data.getBooleanExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
+ boolean asciiArmor = cleartextSign || data.getBooleanExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
byte[] nfcSignedHash = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_SIGNED_HASH);
if (nfcSignedHash != null) {
@@ -242,91 +244,55 @@ public class OpenPgpService extends RemoteService {
}
// Get Input- and OutputStream from ParcelFileDescriptor
- InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
- OutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
- try {
- long inputLength = is.available();
- InputData inputData = new InputData(is, inputLength);
-
- // Find the appropriate subkey to sign with
- long sigSubKeyId;
- try {
- CachedPublicKeyRing signingRing =
- new ProviderHelper(this).getCachedPublicKeyRing(accSettings.getKeyId());
- sigSubKeyId = signingRing.getSecretSignId();
- } catch (PgpKeyNotFoundException e) {
- // secret key that is set for this account is deleted?
- // show account config again!
- return getCreateAccountIntent(data, getAccountName(data));
- }
-
- // get passphrase from cache, if key has "no" passphrase, this returns an empty String
- String passphrase;
- if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
- passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
+ is = new ParcelFileDescriptor.AutoCloseInputStream(input);
+ if (cleartextSign) {
+ // output stream only needed for cleartext signatures,
+ // detached signatures are returned as extra
+ os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
+ }
+ long inputLength = is.available();
+ InputData inputData = new InputData(is, inputLength);
+
+ // sign-only
+ PgpSignEncryptInput pseInput = new PgpSignEncryptInput()
+ .setEnableAsciiArmorOutput(asciiArmor)
+ .setCleartextSignature(cleartextSign)
+ .setDetachedSignature(!cleartextSign)
+ .setVersionHeader(PgpHelper.getVersionForHeader(this))
+ .setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
+ .setSignatureMasterKeyId(accSettings.getKeyId())
+ .setNfcState(nfcSignedHash, nfcCreationDate);
+
+ // execute PGP operation!
+ PgpSignEncryptOperation pse = new PgpSignEncryptOperation(this, new ProviderHelper(getContext()), null);
+ PgpSignEncryptResult pgpResult = pse.execute(pseInput, inputData, os);
+
+ if (pgpResult.isPending()) {
+ if ((pgpResult.getResult() & PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
+ PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE) {
+ return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
+ } else if ((pgpResult.getResult() & PgpSignEncryptResult.RESULT_PENDING_NFC) ==
+ PgpSignEncryptResult.RESULT_PENDING_NFC) {
+ // return PendingIntent to execute NFC activity
+ // pass through the signature creation timestamp to be used again on second execution
+ // of PgpSignEncrypt when we have the signed hash!
+ data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
+ return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
} else {
- try {
- passphrase = PassphraseCacheService.getCachedPassphrase(getContext(),
- accSettings.getKeyId(), sigSubKeyId);
- } catch (PassphraseCacheService.KeyNotFoundException e) {
- // should happen earlier, but return again here if it happens
- return getCreateAccountIntent(data, getAccountName(data));
- }
+ throw new PgpGeneralException(
+ "Encountered unhandled type of pending action not supported by API!");
}
- if (passphrase == null) {
- // get PendingIntent for passphrase input, add it to given params and return to client
- return getPassphraseIntent(data, sigSubKeyId);
- }
-
- // sign-only
- PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
- this, new ProviderHelper(getContext()), null,
- inputData, os
- );
- builder.setEnableAsciiArmorOutput(asciiArmor)
- .setVersionHeader(PgpHelper.getVersionForHeader(this))
- .setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
- .setSignatureMasterKeyId(accSettings.getKeyId())
- .setSignatureSubKeyId(sigSubKeyId)
- .setSignaturePassphrase(passphrase)
- .setNfcState(nfcSignedHash, nfcCreationDate);
-
- // TODO: currently always assume cleartext input, no sign-only of binary currently!
- builder.setCleartextInput(true);
-
- // execute PGP operation!
- SignEncryptResult pgpResult = builder.build().execute();
-
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
- SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
- return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
- SignEncryptResult.RESULT_PENDING_NFC) {
- // return PendingIntent to execute NFC activity
- // pass through the signature creation timestamp to be used again on second execution
- // of PgpSignEncrypt when we have the signed hash!
- data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
- return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
- } else {
- throw new PgpGeneralException(
- "Encountered unhandled type of pending action not supported by API!");
- }
- } else if (pgpResult.success()) {
- // see end of method
- } else {
- LogEntryParcel errorMsg = pgpResult.getLog().getLast();
- throw new Exception(getString(errorMsg.mType.getMsgId()));
+ } else if (pgpResult.success()) {
+ Intent result = new Intent();
+ if (!cleartextSign) {
+ result.putExtra(OpenPgpApi.RESULT_DETACHED_SIGNATURE, pgpResult.getDetachedSignature());
}
-
- } finally {
- is.close();
- os.close();
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
+ return result;
+ } else {
+ LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+ throw new Exception(getString(errorMsg.mType.getMsgId()));
}
-
- Intent result = new Intent();
- result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- return result;
} catch (Exception e) {
Log.d(Constants.TAG, "signImpl", e);
Intent result = new Intent();
@@ -334,12 +300,29 @@ public class OpenPgpService extends RemoteService {
new OpenPgpError(OpenPgpError.GENERIC_ERROR, e.getMessage()));
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing InputStream", e);
+ }
+ }
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing OutputStream", e);
+ }
+ }
}
}
private Intent encryptAndSignImpl(Intent data, ParcelFileDescriptor input,
ParcelFileDescriptor output, AccountSettings accSettings,
boolean sign) {
+ InputStream is = null;
+ OutputStream os = null;
try {
boolean asciiArmor = data.getBooleanExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
String originalFilename = data.getStringExtra(OpenPgpApi.EXTRA_ORIGINAL_FILENAME);
@@ -365,99 +348,65 @@ public class OpenPgpService extends RemoteService {
// build InputData and write into OutputStream
// Get Input- and OutputStream from ParcelFileDescriptor
- InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
- OutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
- try {
- long inputLength = is.available();
- InputData inputData = new InputData(is, inputLength);
-
- PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
- this, new ProviderHelper(getContext()), null, inputData, os
- );
- builder.setEnableAsciiArmorOutput(asciiArmor)
- .setVersionHeader(PgpHelper.getVersionForHeader(this))
- .setCompressionId(accSettings.getCompression())
- .setSymmetricEncryptionAlgorithm(accSettings.getEncryptionAlgorithm())
- .setEncryptionMasterKeyIds(keyIds)
- .setFailOnMissingEncryptionKeyIds(true)
- .setOriginalFilename(originalFilename)
- .setAdditionalEncryptId(accSettings.getKeyId()); // add acc key for encryption
-
- if (sign) {
-
- // Find the appropriate subkey to sign with
- long sigSubKeyId;
- try {
- CachedPublicKeyRing signingRing =
- new ProviderHelper(this).getCachedPublicKeyRing(accSettings.getKeyId());
- sigSubKeyId = signingRing.getSecretSignId();
- } catch (PgpKeyNotFoundException e) {
- // secret key that is set for this account is deleted?
- // show account config again!
- return getCreateAccountIntent(data, getAccountName(data));
- }
-
- String passphrase;
- if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
- passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
- } else {
- passphrase = PassphraseCacheService.getCachedPassphrase(getContext(),
- accSettings.getKeyId(), sigSubKeyId);
- }
- if (passphrase == null) {
- // get PendingIntent for passphrase input, add it to given params and return to client
- return getPassphraseIntent(data, sigSubKeyId);
- }
-
- byte[] nfcSignedHash = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_SIGNED_HASH);
- // carefully: only set if timestamp exists
- Date nfcCreationDate = null;
- long nfcCreationTimestamp = data.getLongExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, -1);
- if (nfcCreationTimestamp != -1) {
- nfcCreationDate = new Date(nfcCreationTimestamp);
- }
-
- // sign and encrypt
- builder.setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
- .setSignatureMasterKeyId(accSettings.getKeyId())
- .setSignatureSubKeyId(sigSubKeyId)
- .setSignaturePassphrase(passphrase)
- .setNfcState(nfcSignedHash, nfcCreationDate);
+ is = new ParcelFileDescriptor.AutoCloseInputStream(input);
+ os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
+
+ long inputLength = is.available();
+ InputData inputData = new InputData(is, inputLength, originalFilename);
+
+ PgpSignEncryptInput pseInput = new PgpSignEncryptInput();
+ pseInput.setEnableAsciiArmorOutput(asciiArmor)
+ .setVersionHeader(PgpHelper.getVersionForHeader(this))
+ .setCompressionId(accSettings.getCompression())
+ .setSymmetricEncryptionAlgorithm(accSettings.getEncryptionAlgorithm())
+ .setEncryptionMasterKeyIds(keyIds)
+ .setFailOnMissingEncryptionKeyIds(true)
+ .setAdditionalEncryptId(accSettings.getKeyId()); // add acc key for encryption
+
+ if (sign) {
+
+ byte[] nfcSignedHash = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_SIGNED_HASH);
+ // carefully: only set if timestamp exists
+ Date nfcCreationDate = null;
+ long nfcCreationTimestamp = data.getLongExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, -1);
+ if (nfcCreationTimestamp != -1) {
+ nfcCreationDate = new Date(nfcCreationTimestamp);
}
- // execute PGP operation!
- SignEncryptResult pgpResult = builder.build().execute();
-
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
- SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
- return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
- SignEncryptResult.RESULT_PENDING_NFC) {
- // return PendingIntent to execute NFC activity
- // pass through the signature creation timestamp to be used again on second execution
- // of PgpSignEncrypt when we have the signed hash!
- data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
- return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
- } else {
- throw new PgpGeneralException(
- "Encountered unhandled type of pending action not supported by API!");
- }
- } else if (pgpResult.success()) {
- // see end of method
+ // sign and encrypt
+ pseInput.setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
+ .setSignatureMasterKeyId(accSettings.getKeyId())
+ .setNfcState(nfcSignedHash, nfcCreationDate);
+ }
+
+ PgpSignEncryptOperation op = new PgpSignEncryptOperation(this, new ProviderHelper(getContext()), null);
+
+ // execute PGP operation!
+ PgpSignEncryptResult pgpResult = op.execute(pseInput, inputData, os);
+
+ if (pgpResult.isPending()) {
+ if ((pgpResult.getResult() & PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
+ PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE) {
+ return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
+ } else if ((pgpResult.getResult() & PgpSignEncryptResult.RESULT_PENDING_NFC) ==
+ PgpSignEncryptResult.RESULT_PENDING_NFC) {
+ // return PendingIntent to execute NFC activity
+ // pass through the signature creation timestamp to be used again on second execution
+ // of PgpSignEncrypt when we have the signed hash!
+ data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
+ return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
} else {
- LogEntryParcel errorMsg = pgpResult.getLog().getLast();
- throw new Exception(getString(errorMsg.mType.getMsgId()));
+ throw new PgpGeneralException(
+ "Encountered unhandled type of pending action not supported by API!");
}
-
- } finally {
- is.close();
- os.close();
+ } else if (pgpResult.success()) {
+ Intent result = new Intent();
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
+ return result;
+ } else {
+ LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+ throw new Exception(getString(errorMsg.mType.getMsgId()));
}
-
- Intent result = new Intent();
- result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- return result;
} catch (Exception e) {
Log.d(Constants.TAG, "encryptAndSignImpl", e);
Intent result = new Intent();
@@ -465,111 +414,129 @@ public class OpenPgpService extends RemoteService {
new OpenPgpError(OpenPgpError.GENERIC_ERROR, e.getMessage()));
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing InputStream", e);
+ }
+ }
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing OutputStream", e);
+ }
+ }
}
}
private Intent decryptAndVerifyImpl(Intent data, ParcelFileDescriptor input,
ParcelFileDescriptor output, Set<Long> allowedKeyIds,
boolean decryptMetadataOnly) {
+ InputStream is = null;
+ OutputStream os = null;
try {
// Get Input- and OutputStream from ParcelFileDescriptor
- InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
+ is = new ParcelFileDescriptor.AutoCloseInputStream(input);
- OutputStream os;
- if (decryptMetadataOnly) {
+ // output is optional, e.g., for verifying detached signatures
+ if (decryptMetadataOnly || output == null) {
os = null;
} else {
os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
}
- Intent result = new Intent();
- try {
- String passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
- long inputLength = is.available();
- InputData inputData = new InputData(is, inputLength);
-
- PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
- this, new ProviderHelper(getContext()), null, inputData, os
- );
-
- byte[] nfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY);
-
- // allow only private keys associated with accounts of this app
- // no support for symmetric encryption
- builder.setPassphrase(passphrase)
- .setAllowSymmetricDecryption(false)
- .setAllowedKeyIds(allowedKeyIds)
- .setDecryptMetadataOnly(decryptMetadataOnly)
- .setNfcState(nfcDecryptedSessionKey);
-
- // TODO: currently does not support binary signed-only content
- DecryptVerifyResult pgpResult = builder.build().execute();
-
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) ==
- DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) {
- return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) ==
- DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) {
- throw new PgpGeneralException(
- "Decryption of symmetric content not supported by API!");
- } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) ==
- DecryptVerifyResult.RESULT_PENDING_NFC) {
- return getNfcDecryptIntent(
- data, pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey());
- } else {
- throw new PgpGeneralException(
- "Encountered unhandled type of pending action not supported by API!");
- }
- } else if (pgpResult.success()) {
-
- OpenPgpSignatureResult signatureResult = pgpResult.getSignatureResult();
- if (signatureResult != null) {
- result.putExtra(OpenPgpApi.RESULT_SIGNATURE, signatureResult);
-
- if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) < 5) {
- // SIGNATURE_KEY_REVOKED and SIGNATURE_KEY_EXPIRED have been added in version 5
- if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED
- || signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED) {
- signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR);
- }
+ String passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
+ long inputLength = is.available();
+ InputData inputData = new InputData(is, inputLength);
+
+ PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
+ this, new ProviderHelper(getContext()), null, inputData, os
+ );
+
+ byte[] nfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY);
+
+ byte[] detachedSignature = data.getByteArrayExtra(OpenPgpApi.EXTRA_DETACHED_SIGNATURE);
+
+ // allow only private keys associated with accounts of this app
+ // no support for symmetric encryption
+ builder.setPassphrase(passphrase)
+ .setAllowSymmetricDecryption(false)
+ .setAllowedKeyIds(allowedKeyIds)
+ .setDecryptMetadataOnly(decryptMetadataOnly)
+ .setNfcState(nfcDecryptedSessionKey)
+ .setDetachedSignature(detachedSignature);
+
+ DecryptVerifyResult pgpResult = builder.build().execute();
+
+ if (pgpResult.isPending()) {
+ if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) ==
+ DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) {
+ return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
+ } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) ==
+ DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) {
+ throw new PgpGeneralException(
+ "Decryption of symmetric content not supported by API!");
+ } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) ==
+ DecryptVerifyResult.RESULT_PENDING_NFC) {
+ return getNfcDecryptIntent(
+ data, pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey());
+ } else {
+ throw new PgpGeneralException(
+ "Encountered unhandled type of pending action not supported by API!");
+ }
+ } else if (pgpResult.success()) {
+ Intent result = new Intent();
+
+ OpenPgpSignatureResult signatureResult = pgpResult.getSignatureResult();
+ if (signatureResult != null) {
+ result.putExtra(OpenPgpApi.RESULT_SIGNATURE, signatureResult);
+
+ if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) < 5) {
+ // SIGNATURE_KEY_REVOKED and SIGNATURE_KEY_EXPIRED have been added in version 5
+ if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED
+ || signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED) {
+ signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR);
}
+ }
- if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_MISSING) {
- // If signature is unknown we return an _additional_ PendingIntent
- // to retrieve the missing key
- Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class);
- intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE);
- intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, signatureResult.getKeyId());
- intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data);
+ if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_MISSING) {
+ // If signature is unknown we return an _additional_ PendingIntent
+ // to retrieve the missing key
+ Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class);
+ intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE);
+ intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, signatureResult.getKeyId());
+ intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data);
- PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
- intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
+ intent,
+ PendingIntent.FLAG_CANCEL_CURRENT);
- result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
- }
+ result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
}
+ }
- if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) >= 4) {
- OpenPgpMetadata metadata = pgpResult.getDecryptMetadata();
- if (metadata != null) {
- result.putExtra(OpenPgpApi.RESULT_METADATA, metadata);
- }
+ if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) >= 4) {
+ OpenPgpMetadata metadata = pgpResult.getDecryptMetadata();
+ if (metadata != null) {
+ result.putExtra(OpenPgpApi.RESULT_METADATA, metadata);
}
- } else {
- LogEntryParcel errorMsg = pgpResult.getLog().getLast();
- throw new Exception(getString(errorMsg.mType.getMsgId()));
}
- } finally {
- is.close();
- if (os != null) {
- os.close();
+
+ String charset = pgpResult.getCharset();
+ if (charset != null) {
+ result.putExtra(OpenPgpApi.RESULT_CHARSET, charset);
}
+
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
+ return result;
+ } else {
+ LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+ throw new Exception(getString(errorMsg.mType.getMsgId()));
}
- result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- return result;
} catch (Exception e) {
Log.d(Constants.TAG, "decryptAndVerifyImpl", e);
Intent result = new Intent();
@@ -577,6 +544,21 @@ public class OpenPgpService extends RemoteService {
new OpenPgpError(OpenPgpError.GENERIC_ERROR, e.getMessage()));
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing InputStream", e);
+ }
+ }
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing OutputStream", e);
+ }
+ }
}
}
@@ -668,15 +650,16 @@ public class OpenPgpService extends RemoteService {
// version code is required and needs to correspond to version code of service!
// History of versions in org.openintents.openpgp.util.OpenPgpApi
- // we support 3, 4, 5
+ // we support 3, 4, 5, 6
if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) != 3
&& data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) != 4
- && data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) != 5) {
+ && data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) != 5
+ && data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) != 6) {
Intent result = new Intent();
OpenPgpError error = new OpenPgpError
(OpenPgpError.INCOMPATIBLE_API_VERSIONS, "Incompatible API versions!\n"
+ "used API version: " + data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) + "\n"
- + "supported API versions: 3, 4");
+ + "supported API versions: 3, 4, 5, 6");
result.putExtra(OpenPgpApi.RESULT_ERROR, error);
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
@@ -706,42 +689,66 @@ public class OpenPgpService extends RemoteService {
@Override
public Intent execute(Intent data, ParcelFileDescriptor input, ParcelFileDescriptor output) {
- Intent errorResult = checkRequirements(data);
- if (errorResult != null) {
- return errorResult;
- }
+ try {
+ Intent errorResult = checkRequirements(data);
+ if (errorResult != null) {
+ return errorResult;
+ }
- String accName = getAccountName(data);
- final AccountSettings accSettings = getAccSettings(accName);
- if (accSettings == null) {
- return getCreateAccountIntent(data, accName);
- }
+ String accName = getAccountName(data);
+ final AccountSettings accSettings = getAccSettings(accName);
+ if (accSettings == null) {
+ return getCreateAccountIntent(data, accName);
+ }
- String action = data.getAction();
- if (OpenPgpApi.ACTION_SIGN.equals(action)) {
- return signImpl(data, input, output, accSettings);
- } else if (OpenPgpApi.ACTION_ENCRYPT.equals(action)) {
- return encryptAndSignImpl(data, input, output, accSettings, false);
- } else if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(action)) {
- return encryptAndSignImpl(data, input, output, accSettings, true);
- } else if (OpenPgpApi.ACTION_DECRYPT_VERIFY.equals(action)) {
- String currentPkg = getCurrentCallingPackage();
- Set<Long> allowedKeyIds =
- mProviderHelper.getAllKeyIdsForApp(
- ApiAccounts.buildBaseUri(currentPkg));
- return decryptAndVerifyImpl(data, input, output, allowedKeyIds, false);
- } else if (OpenPgpApi.ACTION_DECRYPT_METADATA.equals(action)) {
- String currentPkg = getCurrentCallingPackage();
- Set<Long> allowedKeyIds =
- mProviderHelper.getAllKeyIdsForApp(
- ApiAccounts.buildBaseUri(currentPkg));
- return decryptAndVerifyImpl(data, input, output, allowedKeyIds, true);
- } else if (OpenPgpApi.ACTION_GET_KEY.equals(action)) {
- return getKeyImpl(data);
- } else if (OpenPgpApi.ACTION_GET_KEY_IDS.equals(action)) {
- return getKeyIdsImpl(data);
- } else {
- return null;
+ String action = data.getAction();
+ if (OpenPgpApi.ACTION_CLEARTEXT_SIGN.equals(action)) {
+ return signImpl(data, input, output, accSettings, true);
+ } else if (OpenPgpApi.ACTION_SIGN.equals(action)) {
+ // DEPRECATED: same as ACTION_CLEARTEXT_SIGN
+ Log.w(Constants.TAG, "You are using a deprecated API call, please use ACTION_CLEARTEXT_SIGN instead of ACTION_SIGN!");
+ return signImpl(data, input, output, accSettings, true);
+ } else if (OpenPgpApi.ACTION_DETACHED_SIGN.equals(action)) {
+ return signImpl(data, input, output, accSettings, false);
+ } else if (OpenPgpApi.ACTION_ENCRYPT.equals(action)) {
+ return encryptAndSignImpl(data, input, output, accSettings, false);
+ } else if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(action)) {
+ return encryptAndSignImpl(data, input, output, accSettings, true);
+ } else if (OpenPgpApi.ACTION_DECRYPT_VERIFY.equals(action)) {
+ String currentPkg = getCurrentCallingPackage();
+ Set<Long> allowedKeyIds =
+ mProviderHelper.getAllKeyIdsForApp(
+ ApiAccounts.buildBaseUri(currentPkg));
+ return decryptAndVerifyImpl(data, input, output, allowedKeyIds, false);
+ } else if (OpenPgpApi.ACTION_DECRYPT_METADATA.equals(action)) {
+ String currentPkg = getCurrentCallingPackage();
+ Set<Long> allowedKeyIds =
+ mProviderHelper.getAllKeyIdsForApp(
+ ApiAccounts.buildBaseUri(currentPkg));
+ return decryptAndVerifyImpl(data, input, output, allowedKeyIds, true);
+ } else if (OpenPgpApi.ACTION_GET_KEY.equals(action)) {
+ return getKeyImpl(data);
+ } else if (OpenPgpApi.ACTION_GET_KEY_IDS.equals(action)) {
+ return getKeyIdsImpl(data);
+ } else {
+ return null;
+ }
+ } finally {
+ // always close input and output file descriptors even in error cases
+ if (input != null) {
+ try {
+ input.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing input ParcelFileDescriptor", e);
+ }
+ }
+ if (output != null) {
+ try {
+ output.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing output ParcelFileDescriptor", e);
+ }
+ }
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java
index e71b52ccd..672f59285 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/RemoteService.java
@@ -27,7 +27,6 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.net.Uri;
import android.os.Binder;
-import android.text.TextUtils;
import org.openintents.openpgp.OpenPgpError;
import org.openintents.openpgp.util.OpenPgpApi;
@@ -216,9 +215,7 @@ public abstract class RemoteService extends Service {
String[] callingPackages = getPackageManager().getPackagesForUid(uid);
// is calling package allowed to use this service?
- for (int i = 0; i < callingPackages.length; i++) {
- String currentPkg = callingPackages[i];
-
+ for (String currentPkg : callingPackages) {
if (isPackageAllowed(currentPkg)) {
return true;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java
index 0e9678980..4d6df24d2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java
@@ -20,22 +20,21 @@ package org.sufficientlysecure.keychain.remote.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.remote.AccountSettings;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
import org.sufficientlysecure.keychain.operations.results.SingletonResult;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.remote.AccountSettings;
+import org.sufficientlysecure.keychain.ui.BaseActivity;
import org.sufficientlysecure.keychain.util.Log;
-public class AccountSettingsActivity extends ActionBarActivity {
+public class AccountSettingsActivity extends BaseActivity {
private Uri mAccountUri;
private AccountSettingsFragment mAccountSettingsFragment;
@@ -45,17 +44,20 @@ public class AccountSettingsActivity extends ActionBarActivity {
super.onCreate(savedInstanceState);
// Inflate a "Done" custom action bar
- ActionBarHelper.setOneButtonView(getSupportActionBar(),
- R.string.api_settings_save, R.drawable.ic_action_done,
+ setFullScreenDialogDoneClose(R.string.api_settings_save,
new View.OnClickListener() {
@Override
public void onClick(View v) {
- // "Done"
save();
}
+ },
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
});
-
- setContentView(R.layout.api_account_settings_activity);
+ setTitle(null);
mAccountSettingsFragment = (AccountSettingsFragment) getSupportFragmentManager().findFragmentById(
R.id.api_account_settings_fragment);
@@ -73,6 +75,11 @@ public class AccountSettingsActivity extends ActionBarActivity {
}
@Override
+ protected void initLayout() {
+ setContentView(R.layout.api_account_settings_activity);
+ }
+
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.api_account_settings, menu);
@@ -85,9 +92,6 @@ public class AccountSettingsActivity extends ActionBarActivity {
case R.id.menu_account_settings_delete:
deleteAccount();
return true;
- case R.id.menu_account_settings_cancel:
- finish();
- return true;
}
return super.onOptionsItemSelected(item);
}
@@ -125,9 +129,4 @@ public class AccountSettingsActivity extends ActionBarActivity {
}
}
- @Override
- public void onBackPressed() {
- save();
- super.onBackPressed();
- }
}
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 a3027f728..a5bc05ba8 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
@@ -31,10 +31,10 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.remote.AccountSettings;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.remote.AccountSettings;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity;
import org.sufficientlysecure.keychain.ui.adapter.KeyValueSpinnerAdapter;
import org.sufficientlysecure.keychain.ui.widget.KeySpinner;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
index 56e3b22e2..407480c98 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
@@ -17,29 +17,54 @@
package org.sufficientlysecure.keychain.remote.ui;
+import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+import com.getbase.floatingactionbutton.FloatingActionButton;
+
+import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.AppSettings;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
+import org.sufficientlysecure.keychain.ui.BaseActivity;
+import org.sufficientlysecure.keychain.ui.dialog.AddSubkeyDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.AdvancedAppSettingsDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
-public class AppSettingsActivity extends ActionBarActivity {
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class AppSettingsActivity extends BaseActivity {
private Uri mAppUri;
- private AppSettingsFragment mSettingsFragment;
+ private AppSettingsAllowedKeysListFragment mAllowedKeysFragment;
+
+ private TextView mAppNameView;
+ private ImageView mAppIconView;
+ private TextView mPackageName;
+ private TextView mPackageSignature;
+
+ private FloatingActionButton mStartFab;
+
+ // deprecated API
private AccountsListFragment mAccountsListFragment;
+ private TextView mAccountsLabel;
+
// model
AppSettings mAppSettings;
@@ -48,16 +73,27 @@ public class AppSettingsActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // let the actionbar look like Android's contact app
- ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setIcon(android.R.color.transparent);
- actionBar.setHomeButtonEnabled(true);
+ mAccountsLabel = (TextView) findViewById(R.id.api_accounts_label);
+ mAppNameView = (TextView) findViewById(R.id.api_app_settings_app_name);
+ mAppIconView = (ImageView) findViewById(R.id.api_app_settings_app_icon);
+ mPackageName = (TextView) findViewById(R.id.api_app_settings_package_name);
+ mPackageSignature = (TextView) findViewById(R.id.api_app_settings_package_signature);
+ mStartFab = (FloatingActionButton) findViewById(R.id.fab);
- setContentView(R.layout.api_app_settings_activity);
+ mStartFab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startApp();
+ }
+ });
- mSettingsFragment = (AppSettingsFragment) getSupportFragmentManager().findFragmentById(
- R.id.api_app_settings_fragment);
+ setFullScreenDialogClose(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ cancel();
+ }
+ });
+ setTitle(null);
Intent intent = getIntent();
mAppUri = intent.getData();
@@ -71,6 +107,22 @@ public class AppSettingsActivity extends ActionBarActivity {
}
}
+ private void save() {
+ mAllowedKeysFragment.saveAllowedKeys();
+ setResult(Activity.RESULT_OK);
+ finish();
+ }
+
+ private void cancel() {
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ }
+
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.api_app_settings_activity);
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
@@ -81,16 +133,40 @@ public class AppSettingsActivity extends ActionBarActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case R.id.menu_api_settings_revoke:
+ case R.id.menu_api_save: {
+ save();
+ return true;
+ }
+ case R.id.menu_api_settings_revoke: {
revokeAccess();
return true;
- case R.id.menu_api_settings_start:
- startApp();
+ }
+ case R.id.menu_api_settings_advanced: {
+ showAdvancedInfo();
return true;
+ }
}
return super.onOptionsItemSelected(item);
}
+ private void showAdvancedInfo() {
+ String signature = null;
+ // advanced info: package signature SHA-256
+ try {
+ MessageDigest md = MessageDigest.getInstance("SHA-256");
+ md.update(mAppSettings.getPackageSignature());
+ byte[] digest = md.digest();
+ signature = new String(Hex.encode(digest));
+ } catch (NoSuchAlgorithmException e) {
+ Log.e(Constants.TAG, "Should not happen!", e);
+ }
+
+ AdvancedAppSettingsDialogFragment dialogFragment =
+ AdvancedAppSettingsDialogFragment.newInstance(mAppSettings.getPackageName(), signature);
+
+ dialogFragment.show(getSupportFragmentManager(), "advancedDialog");
+ }
+
private void startApp() {
Intent i;
PackageManager manager = getPackageManager();
@@ -109,25 +185,31 @@ public class AppSettingsActivity extends ActionBarActivity {
private void loadData(Bundle savedInstanceState, Uri appUri) {
mAppSettings = new ProviderHelper(this).getApiAppSettings(appUri);
- mSettingsFragment.setAppSettings(mAppSettings);
+ // get application name and icon from package manager
String appName;
- PackageManager pm = getPackageManager();
+ Drawable appIcon = null;
+ PackageManager pm = getApplicationContext().getPackageManager();
try {
ApplicationInfo ai = pm.getApplicationInfo(mAppSettings.getPackageName(), 0);
+
appName = (String) pm.getApplicationLabel(ai);
+ appIcon = pm.getApplicationIcon(ai);
} catch (PackageManager.NameNotFoundException e) {
// fallback
appName = mAppSettings.getPackageName();
}
- setTitle(appName);
+ mAppNameView.setText(appName);
+ mAppIconView.setImageDrawable(appIcon);
Uri accountsUri = appUri.buildUpon().appendPath(KeychainContract.PATH_ACCOUNTS).build();
Log.d(Constants.TAG, "accountsUri: " + accountsUri);
- startListFragment(savedInstanceState, accountsUri);
+ Uri allowedKeysUri = appUri.buildUpon().appendPath(KeychainContract.PATH_ALLOWED_KEYS).build();
+ Log.d(Constants.TAG, "allowedKeysUri: " + allowedKeysUri);
+ startListFragments(savedInstanceState, accountsUri, allowedKeysUri);
}
- private void startListFragment(Bundle savedInstanceState, Uri dataUri) {
+ private void startListFragments(Bundle savedInstanceState, Uri accountsUri, Uri allowedKeysUri) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
@@ -135,13 +217,23 @@ public class AppSettingsActivity extends ActionBarActivity {
return;
}
- // Create an instance of the fragment
- mAccountsListFragment = AccountsListFragment.newInstance(dataUri);
+ // show accounts only if available (deprecated API)
+ Cursor cursor = getContentResolver().query(accountsUri, null, null, null, null);
+ if (cursor.moveToFirst()) {
+ mAccountsLabel.setVisibility(View.VISIBLE);
+ mAccountsListFragment = AccountsListFragment.newInstance(accountsUri);
+ // Create an instance of the fragments
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.api_accounts_list_fragment, mAccountsListFragment)
+ .commitAllowingStateLoss();
+ }
+ // Create an instance of the fragments
+ mAllowedKeysFragment = AppSettingsAllowedKeysListFragment.newInstance(allowedKeysUri);
// Add the fragment to the 'fragment_container' FrameLayout
// NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
getSupportFragmentManager().beginTransaction()
- .replace(R.id.api_accounts_list_fragment, mAccountsListFragment)
+ .replace(R.id.api_allowed_keys_list_fragment, mAllowedKeysFragment)
.commitAllowingStateLoss();
// do it immediately!
getSupportFragmentManager().executePendingTransactions();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java
new file mode 100644
index 000000000..13b242a5e
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2015 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.remote.ui;
+
+import android.content.Context;
+import android.content.OperationApplicationException;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.ListFragmentWorkaround;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.adapter.SelectKeyCursorAdapter;
+import org.sufficientlysecure.keychain.ui.widget.FixedListView;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround implements LoaderManager.LoaderCallbacks<Cursor> {
+ private static final String ARG_DATA_URI = "uri";
+
+ private SelectKeyCursorAdapter mAdapter;
+ private Set<Long> mSelectedMasterKeyIds;
+ private ProviderHelper mProviderHelper;
+
+ private Uri mDataUri;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static AppSettingsAllowedKeysListFragment newInstance(Uri dataUri) {
+ AppSettingsAllowedKeysListFragment frag = new AppSettingsAllowedKeysListFragment();
+ Bundle args = new Bundle();
+
+ args.putParcelable(ARG_DATA_URI, dataUri);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mProviderHelper = new ProviderHelper(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View layout = super.onCreateView(inflater, container,
+ savedInstanceState);
+ ListView lv = (ListView) layout.findViewById(android.R.id.list);
+ ViewGroup parent = (ViewGroup) lv.getParent();
+
+ /*
+ * http://stackoverflow.com/a/15880684
+ * Remove ListView and add FixedListView in its place.
+ * This is done here programatically to be still able to use the progressBar of ListFragment.
+ *
+ * We want FixedListView to be able to put this ListFragment inside a ScrollView
+ */
+ int lvIndex = parent.indexOfChild(lv);
+ parent.removeViewAt(lvIndex);
+ FixedListView newLv = new FixedListView(getActivity());
+ newLv.setId(android.R.id.list);
+ parent.addView(newLv, lvIndex, lv.getLayoutParams());
+ return layout;
+ }
+
+ /**
+ * Define Adapter and Loader on create of Activity
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mDataUri = getArguments().getParcelable(ARG_DATA_URI);
+
+ getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+
+ // Give some text to display if there is no data. In a real
+ // application this would come from a resource.
+ setEmptyText(getString(R.string.list_empty));
+
+ mAdapter = new SecretKeyCursorAdapter(getActivity(), null, 0, getListView());
+
+ setListAdapter(mAdapter);
+
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ mSelectedMasterKeyIds = mProviderHelper.getAllKeyIdsForApp(mDataUri);
+ Log.d(Constants.TAG, "allowed: " + mSelectedMasterKeyIds.toString());
+
+ // Prepare the loader. Either re-connect with an existing one,
+ // or start a new one.
+ getLoaderManager().initLoader(0, null, this);
+ }
+
+ /**
+ * Selects items based on master key ids in list view
+ *
+ * @param masterKeyIds
+ */
+ private void preselectMasterKeyIds(Set<Long> masterKeyIds) {
+ for (int i = 0; i < getListView().getCount(); ++i) {
+ long listKeyId = mAdapter.getMasterKeyId(i);
+ for (long keyId : masterKeyIds) {
+ if (listKeyId == keyId) {
+ getListView().setItemChecked(i, true);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns all selected master key ids
+ *
+ * @return
+ */
+ public Set<Long> getSelectedMasterKeyIds() {
+ // mListView.getCheckedItemIds() would give the row ids of the KeyRings not the master key
+ // ids!
+ Set<Long> keyIds = new HashSet<>();
+ for (int i = 0; i < getListView().getCount(); ++i) {
+ if (getListView().isItemChecked(i)) {
+ keyIds.add(mAdapter.getMasterKeyId(i));
+ }
+ }
+
+ return keyIds;
+ }
+
+ /**
+ * Returns all selected user ids
+ *
+ * @return
+ */
+ public String[] getSelectedUserIds() {
+ Vector<String> userIds = new Vector<>();
+ for (int i = 0; i < getListView().getCount(); ++i) {
+ if (getListView().isItemChecked(i)) {
+ userIds.add(mAdapter.getUserId(i));
+ }
+ }
+
+ // make empty array to not return null
+ String userIdArray[] = new String[0];
+ return userIds.toArray(userIdArray);
+ }
+
+ public void saveAllowedKeys() {
+ try {
+ mProviderHelper.saveAllowedKeyIdsForApp(mDataUri, getSelectedMasterKeyIds());
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.e(Constants.TAG, "Problem saving allowed key ids!", e);
+ }
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingsUri();
+
+ // These are the rows that we will retrieve.
+ String[] projection = new String[]{
+ KeyRings._ID,
+ KeyRings.MASTER_KEY_ID,
+ KeyRings.USER_ID,
+ KeyRings.IS_EXPIRED,
+ KeyRings.IS_REVOKED,
+ KeyRings.HAS_ENCRYPT,
+ KeyRings.VERIFIED,
+ KeyRings.HAS_ANY_SECRET,
+ };
+
+ String inMasterKeyList = null;
+ if (mSelectedMasterKeyIds != null && mSelectedMasterKeyIds.size() > 0) {
+ inMasterKeyList = Tables.KEYS + "." + KeyRings.MASTER_KEY_ID + " IN (";
+ Iterator iter = mSelectedMasterKeyIds.iterator();
+ while (iter.hasNext()) {
+ inMasterKeyList += DatabaseUtils.sqlEscapeString("" + iter.next());
+ if (iter.hasNext()) {
+ inMasterKeyList += ", ";
+ }
+ }
+ inMasterKeyList += ")";
+ }
+
+ String selection = KeyRings.HAS_ANY_SECRET + " != 0";
+
+ String orderBy = KeyRings.USER_ID + " ASC";
+ if (inMasterKeyList != null) {
+ // sort by selected master keys
+ orderBy = inMasterKeyList + " DESC, " + orderBy;
+ }
+ // 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, selection, null, orderBy);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ mAdapter.swapCursor(data);
+
+ // The list should now be shown.
+ if (isResumed()) {
+ setListShown(true);
+ } else {
+ setListShownNoAnimation(true);
+ }
+
+ // preselect given master keys
+ preselectMasterKeyIds(mSelectedMasterKeyIds);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ // This is called when the last Cursor provided to onLoadFinished()
+ // above is about to be closed. We need to make sure we are no
+ // longer using it.
+ mAdapter.swapCursor(null);
+ }
+
+ private class SecretKeyCursorAdapter extends SelectKeyCursorAdapter {
+
+ public SecretKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) {
+ super(context, c, flags, listView);
+ }
+
+ @Override
+ protected void initIndex(Cursor cursor) {
+ super.initIndex(cursor);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ super.bindView(view, context, cursor);
+ ViewHolderItem h = (ViewHolderItem) view.getTag();
+
+ // We care about the checkbox
+ h.selected.setVisibility(View.VISIBLE);
+ // the getListView works because this is not a static subclass!
+ h.selected.setChecked(getListView().isItemChecked(cursor.getPosition()));
+
+ boolean enabled = false;
+ if ((Boolean) h.statusIcon.getTag()) {
+ h.statusIcon.setVisibility(View.GONE);
+ enabled = true;
+ }
+
+ h.setEnabled(enabled);
+ }
+
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsHeaderFragment.java
index a6db02708..7beac8973 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsHeaderFragment.java
@@ -38,7 +38,7 @@ import org.sufficientlysecure.keychain.util.Log;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-public class AppSettingsFragment extends Fragment {
+public class AppSettingsHeaderFragment extends Fragment {
// model
private AppSettings mAppSettings;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListActivity.java
deleted file mode 100644
index 11b0deb33..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2013-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.remote.ui;
-
-import android.os.Bundle;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.DrawerActivity;
-
-public class AppsListActivity extends DrawerActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.api_apps_list_activity);
-
- activateDrawerNavigation(savedInstanceState);
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java
index 976ce20d6..2deb33a67 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppsListFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2013-2015 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
@@ -48,82 +48,83 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
import org.sufficientlysecure.keychain.util.Log;
public class AppsListFragment extends ListFragment implements
- LoaderManager.LoaderCallbacks<Cursor> {
+ LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
- // This is the Adapter being used to display the list's data.
- RegisteredAppsAdapter mAdapter;
+ AppsAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- getListView().setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
- String selectedPackageName = mAdapter.getItemPackageName(position);
- boolean installed = mAdapter.getItemIsInstalled(position);
- boolean registered = mAdapter.getItemIsRegistered(position);
-
- if (installed) {
- if (registered) {
- // edit app settings
- Intent intent = new Intent(getActivity(), AppSettingsActivity.class);
- intent.setData(KeychainContract.ApiApps.buildByPackageNameUri(selectedPackageName));
- startActivity(intent);
- } else {
- Intent i;
- PackageManager manager = getActivity().getPackageManager();
- try {
- i = manager.getLaunchIntentForPackage(selectedPackageName);
- if (i == null)
- throw new PackageManager.NameNotFoundException();
- // start like the Android launcher would do
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- i.addCategory(Intent.CATEGORY_LAUNCHER);
- startActivity(i);
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(Constants.TAG, "startApp", e);
- }
- }
- } else {
- try {
- startActivity(new Intent(Intent.ACTION_VIEW,
- Uri.parse("market://details?id=" + selectedPackageName)));
- } catch (ActivityNotFoundException anfe) {
- startActivity(new Intent(Intent.ACTION_VIEW,
- Uri.parse("http://play.google.com/store/apps/details?id=" + selectedPackageName)));
- }
- }
- }
- });
+ getListView().setOnItemClickListener(this);
- // Give some text to display if there is no data. In a real
- // application this would come from a resource.
- setEmptyText(getString(R.string.api_no_apps));
+ // NOTE: No setEmptyText(), we always have the default entries
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
// Create an empty adapter we will use to display the loaded data.
- mAdapter = new RegisteredAppsAdapter(getActivity(), null, 0);
+ mAdapter = new AppsAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
- // Loader is started in onResume!
+ // NOTE: Loader is started in onResume!
}
@Override
public void onResume() {
super.onResume();
- // after coming back from Google Play -> reload
+
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ // After coming back from Google Play -> reload
getLoaderManager().restartLoader(0, null, this);
}
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ String selectedPackageName = mAdapter.getItemPackageName(position);
+ boolean installed = mAdapter.getItemIsInstalled(position);
+ boolean registered = mAdapter.getItemIsRegistered(position);
+
+ if (installed) {
+ if (registered) {
+ // Edit app settings
+ Intent intent = new Intent(getActivity(), AppSettingsActivity.class);
+ intent.setData(KeychainContract.ApiApps.buildByPackageNameUri(selectedPackageName));
+ startActivity(intent);
+ } else {
+ Intent i;
+ PackageManager manager = getActivity().getPackageManager();
+ try {
+ i = manager.getLaunchIntentForPackage(selectedPackageName);
+ if (i == null) {
+ throw new PackageManager.NameNotFoundException();
+ }
+ // Start like the Android launcher would do
+ i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ i.addCategory(Intent.CATEGORY_LAUNCHER);
+ startActivity(i);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(Constants.TAG, "startApp", e);
+ }
+ }
+ } else {
+ try {
+ startActivity(new Intent(Intent.ACTION_VIEW,
+ Uri.parse("market://details?id=" + selectedPackageName)));
+ } catch (ActivityNotFoundException anfe) {
+ startActivity(new Intent(Intent.ACTION_VIEW,
+ Uri.parse("https://play.google.com/store/apps/details?id=" + selectedPackageName)));
+ }
+ }
+ }
+
private static final String TEMP_COLUMN_NAME = "NAME";
private static final String TEMP_COLUMN_INSTALLED = "INSTALLED";
private static final String TEMP_COLUMN_REGISTERED = "REGISTERED";
private static final String TEMP_COLUMN_ICON_RES_ID = "ICON_RES_ID";
- // These are the Contacts rows that we will retrieve.
static final String[] PROJECTION = new String[]{
ApiApps._ID, // 0
ApiApps.PACKAGE_NAME, // 1
@@ -149,106 +150,17 @@ public class AppsListFragment extends ListFragment implements
// 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, null, null,
+ return new AppsLoader(getActivity(), baseUri, PROJECTION, null, null,
ApiApps.PACKAGE_NAME + " COLLATE LOCALIZED ASC");
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- MatrixCursor availableAppsCursor = new MatrixCursor(new String[]{
- ApiApps._ID,
- ApiApps.PACKAGE_NAME,
- TEMP_COLUMN_NAME,
- TEMP_COLUMN_INSTALLED,
- TEMP_COLUMN_REGISTERED,
- TEMP_COLUMN_ICON_RES_ID
- });
- // NOTE: SORT ascending by package name, this is REQUIRED for CursorJoiner!
- // Drawables taken from projects res/drawables-xxhdpi/ic_launcher.png
- availableAppsCursor.addRow(new Object[]{1, "com.fsck.k9", "K-9 Mail", 0, 0, R.drawable.apps_k9});
- availableAppsCursor.addRow(new Object[]{1, "com.zeapo.pwdstore", "Password Store", 0, 0, R.drawable.apps_password_store});
- availableAppsCursor.addRow(new Object[]{1, "eu.siacs.conversations", "Conversations (Instant Messaging)", 0, 0, R.drawable.apps_conversations});
-
- MatrixCursor mergedCursor = new MatrixCursor(new String[]{
- ApiApps._ID,
- ApiApps.PACKAGE_NAME,
- TEMP_COLUMN_NAME,
- TEMP_COLUMN_INSTALLED,
- TEMP_COLUMN_REGISTERED,
- TEMP_COLUMN_ICON_RES_ID
- });
-
- CursorJoiner joiner = new CursorJoiner(
- availableAppsCursor,
- new String[]{ApiApps.PACKAGE_NAME},
- data,
- new String[]{ApiApps.PACKAGE_NAME});
- for (CursorJoiner.Result joinerResult : joiner) {
- switch (joinerResult) {
- case LEFT: {
- // handle case where a row in availableAppsCursor is unique
- String packageName = availableAppsCursor.getString(INDEX_PACKAGE_NAME);
-
- mergedCursor.addRow(new Object[]{
- 1, // no need for unique _ID
- packageName,
- availableAppsCursor.getString(INDEX_NAME),
- isInstalled(packageName),
- 0,
- availableAppsCursor.getInt(INDEX_ICON_RES_ID)
- });
- break;
- }
- case RIGHT: {
- // handle case where a row in data is unique
- String packageName = data.getString(INDEX_PACKAGE_NAME);
-
- mergedCursor.addRow(new Object[]{
- 1, // no need for unique _ID
- packageName,
- null,
- isInstalled(packageName),
- 1, // registered!
- R.drawable.ic_launcher // icon is retrieved later
- });
- break;
- }
- case BOTH: {
- // handle case where a row with the same key is in both cursors
- String packageName = data.getString(INDEX_PACKAGE_NAME);
-
- String name;
- if (isInstalled(packageName) == 1) {
- name = data.getString(INDEX_NAME);
- } else {
- // if not installed take name from available apps list
- name = availableAppsCursor.getString(INDEX_NAME);
- }
-
- mergedCursor.addRow(new Object[]{
- 1, // no need for unique _ID
- packageName,
- name,
- isInstalled(packageName),
- 1, // registered!
- R.drawable.ic_launcher // icon is retrieved later
- });
- break;
- }
- }
- }
-
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
- mAdapter.swapCursor(mergedCursor);
- }
+ mAdapter.swapCursor(data);
- private int isInstalled(String packageName) {
- try {
- getActivity().getPackageManager().getApplicationInfo(packageName, 0);
- return 1;
- } catch (final PackageManager.NameNotFoundException e) {
- return 0;
- }
+ // The list should now be shown.
+ setListShown(true);
}
public void onLoaderReset(Loader<Cursor> loader) {
@@ -258,12 +170,127 @@ public class AppsListFragment extends ListFragment implements
mAdapter.swapCursor(null);
}
- private class RegisteredAppsAdapter extends CursorAdapter {
+ /**
+ * Besides the queried cursor with all registered apps, this loader also returns non-installed
+ * proposed apps using a MatrixCursor.
+ */
+ private static class AppsLoader extends CursorLoader {
+
+ public AppsLoader(Context context) {
+ super(context);
+ }
+
+ public AppsLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ super(context, uri, projection, selection, selectionArgs, sortOrder);
+ }
+
+ @Override
+ public Cursor loadInBackground() {
+ // Load registered apps from content provider
+ Cursor data = super.loadInBackground();
+
+ MatrixCursor availableAppsCursor = new MatrixCursor(new String[]{
+ ApiApps._ID,
+ ApiApps.PACKAGE_NAME,
+ TEMP_COLUMN_NAME,
+ TEMP_COLUMN_INSTALLED,
+ TEMP_COLUMN_REGISTERED,
+ TEMP_COLUMN_ICON_RES_ID
+ });
+ // NOTE: SORT ascending by package name, this is REQUIRED for CursorJoiner!
+ // Drawables taken from projects res/drawables-xxhdpi/ic_launcher.png
+ availableAppsCursor.addRow(new Object[]{1, "com.fsck.k9", "K-9 Mail", 0, 0, R.drawable.apps_k9});
+ availableAppsCursor.addRow(new Object[]{1, "com.zeapo.pwdstore", "Password Store", 0, 0, R.drawable.apps_password_store});
+ availableAppsCursor.addRow(new Object[]{1, "eu.siacs.conversations", "Conversations (Instant Messaging)", 0, 0, R.drawable.apps_conversations});
+
+ MatrixCursor mergedCursor = new MatrixCursor(new String[]{
+ ApiApps._ID,
+ ApiApps.PACKAGE_NAME,
+ TEMP_COLUMN_NAME,
+ TEMP_COLUMN_INSTALLED,
+ TEMP_COLUMN_REGISTERED,
+ TEMP_COLUMN_ICON_RES_ID
+ });
+
+ CursorJoiner joiner = new CursorJoiner(
+ availableAppsCursor,
+ new String[]{ApiApps.PACKAGE_NAME},
+ data,
+ new String[]{ApiApps.PACKAGE_NAME});
+ for (CursorJoiner.Result joinerResult : joiner) {
+ switch (joinerResult) {
+ case LEFT: {
+ // handle case where a row in availableAppsCursor is unique
+ String packageName = availableAppsCursor.getString(INDEX_PACKAGE_NAME);
+
+ mergedCursor.addRow(new Object[]{
+ 1, // no need for unique _ID
+ packageName,
+ availableAppsCursor.getString(INDEX_NAME),
+ isInstalled(packageName),
+ 0,
+ availableAppsCursor.getInt(INDEX_ICON_RES_ID)
+ });
+ break;
+ }
+ case RIGHT: {
+ // handle case where a row in data is unique
+ String packageName = data.getString(INDEX_PACKAGE_NAME);
+
+ mergedCursor.addRow(new Object[]{
+ 1, // no need for unique _ID
+ packageName,
+ null,
+ isInstalled(packageName),
+ 1, // registered!
+ R.drawable.ic_launcher // icon is retrieved later
+ });
+ break;
+ }
+ case BOTH: {
+ // handle case where a row with the same key is in both cursors
+ String packageName = data.getString(INDEX_PACKAGE_NAME);
+
+ String name;
+ if (isInstalled(packageName) == 1) {
+ name = data.getString(INDEX_NAME);
+ } else {
+ // if not installed take name from available apps list
+ name = availableAppsCursor.getString(INDEX_NAME);
+ }
+
+ mergedCursor.addRow(new Object[]{
+ 1, // no need for unique _ID
+ packageName,
+ name,
+ isInstalled(packageName),
+ 1, // registered!
+ R.drawable.ic_launcher // icon is retrieved later
+ });
+ break;
+ }
+ }
+ }
+
+ return mergedCursor;
+ }
+
+ private int isInstalled(String packageName) {
+ try {
+ getContext().getPackageManager().getApplicationInfo(packageName, 0);
+ return 1;
+ } catch (final PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+ }
+ }
+
+ private class AppsAdapter extends CursorAdapter {
private LayoutInflater mInflater;
private PackageManager mPM;
- public RegisteredAppsAdapter(Context context, Cursor c, int flags) {
+ public AppsAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
@@ -273,44 +300,23 @@ public class AppsListFragment extends ListFragment implements
/**
* Similar to CursorAdapter.getItemId().
* Required to build Uris for api apps, which are not based on row ids
- *
- * @param position
- * @return
*/
public String getItemPackageName(int position) {
- if (mDataValid && mCursor != null) {
- if (mCursor.moveToPosition(position)) {
- return mCursor.getString(INDEX_PACKAGE_NAME);
- } else {
- return null;
- }
+ if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) {
+ return mCursor.getString(INDEX_PACKAGE_NAME);
} else {
return null;
}
}
public boolean getItemIsInstalled(int position) {
- if (mDataValid && mCursor != null) {
- if (mCursor.moveToPosition(position)) {
- return (mCursor.getInt(INDEX_INSTALLED) == 1);
- } else {
- return false;
- }
- } else {
- return false;
- }
+ return mDataValid && mCursor != null
+ && mCursor.moveToPosition(position) && (mCursor.getInt(INDEX_INSTALLED) == 1);
}
public boolean getItemIsRegistered(int position) {
- if (mDataValid && mCursor != null) {
- if (mCursor.moveToPosition(position)) {
- return (mCursor.getInt(INDEX_REGISTERED) == 1);
- } else {
- return false;
- }
- } else {
- return false;
- }
+ return mDataValid && mCursor != null
+ && mCursor.moveToPosition(position) && (mCursor.getInt(INDEX_REGISTERED) == 1);
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
index d7b723eb0..2c5c78161 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
@@ -22,7 +22,6 @@ import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
@@ -39,14 +38,14 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.AccountSettings;
import org.sufficientlysecure.keychain.remote.AppSettings;
+import org.sufficientlysecure.keychain.ui.BaseActivity;
import org.sufficientlysecure.keychain.ui.SelectPublicKeyFragment;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
import java.util.ArrayList;
-public class RemoteServiceActivity extends ActionBarActivity {
+public class RemoteServiceActivity extends BaseActivity {
public static final String ACTION_REGISTER = Constants.INTENT_PREFIX + "API_ACTIVITY_REGISTER";
public static final String ACTION_CREATE_ACCOUNT = Constants.INTENT_PREFIX
@@ -76,7 +75,7 @@ public class RemoteServiceActivity extends ActionBarActivity {
public static final String EXTRA_ERROR_MESSAGE = "error_message";
// register view
- private AppSettingsFragment mAppSettingsFragment;
+ private AppSettingsHeaderFragment mAppSettingsHeaderFragment;
// create acc view
private AccountSettingsFragment mAccSettingsFragment;
// select pub keys view
@@ -96,235 +95,250 @@ public class RemoteServiceActivity extends ActionBarActivity {
handleActions(getIntent(), savedInstanceState);
}
+ @Override
+ protected void initLayout() {
+ // done in handleActions()
+ }
+
protected void handleActions(Intent intent, Bundle savedInstanceState) {
String action = intent.getAction();
final Bundle extras = intent.getExtras();
- if (ACTION_REGISTER.equals(action)) {
- final String packageName = extras.getString(EXTRA_PACKAGE_NAME);
- final byte[] packageSignature = extras.getByteArray(EXTRA_PACKAGE_SIGNATURE);
- Log.d(Constants.TAG, "ACTION_REGISTER packageName: " + packageName);
+ switch (action) {
+ case ACTION_REGISTER: {
+ final String packageName = extras.getString(EXTRA_PACKAGE_NAME);
+ final byte[] packageSignature = extras.getByteArray(EXTRA_PACKAGE_SIGNATURE);
+ Log.d(Constants.TAG, "ACTION_REGISTER packageName: " + packageName);
- setContentView(R.layout.api_remote_register_app);
+ setContentView(R.layout.api_remote_register_app);
+ initToolbar();
- mAppSettingsFragment = (AppSettingsFragment) getSupportFragmentManager().findFragmentById(
- R.id.api_app_settings_fragment);
+ mAppSettingsHeaderFragment = (AppSettingsHeaderFragment) getSupportFragmentManager().findFragmentById(
+ R.id.api_app_settings_fragment);
- AppSettings settings = new AppSettings(packageName, packageSignature);
- mAppSettingsFragment.setAppSettings(settings);
+ AppSettings settings = new AppSettings(packageName, packageSignature);
+ mAppSettingsHeaderFragment.setAppSettings(settings);
- // Inflate a "Done"/"Cancel" custom action bar view
- ActionBarHelper.setTwoButtonView(getSupportActionBar(),
- R.string.api_register_allow, R.drawable.ic_action_done,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Allow
+ // Inflate a "Done"/"Cancel" custom action bar view
+ setFullScreenDialogTwoButtons(
+ R.string.api_register_allow, R.drawable.ic_check_white_24dp,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Allow
- mProviderHelper.insertApiApp(mAppSettingsFragment.getAppSettings());
+ mProviderHelper.insertApiApp(mAppSettingsHeaderFragment.getAppSettings());
- // give data through for new service call
- Intent resultData = extras.getParcelable(EXTRA_DATA);
- RemoteServiceActivity.this.setResult(RESULT_OK, resultData);
- RemoteServiceActivity.this.finish();
- }
- }, R.string.api_register_disallow, R.drawable.ic_action_cancel,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Disallow
- RemoteServiceActivity.this.setResult(RESULT_CANCELED);
- RemoteServiceActivity.this.finish();
+ // give data through for new service call
+ Intent resultData = extras.getParcelable(EXTRA_DATA);
+ RemoteServiceActivity.this.setResult(RESULT_OK, resultData);
+ RemoteServiceActivity.this.finish();
+ }
+ }, R.string.api_register_disallow, R.drawable.ic_close_white_24dp,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Disallow
+ RemoteServiceActivity.this.setResult(RESULT_CANCELED);
+ RemoteServiceActivity.this.finish();
+ }
}
- }
- );
- } else if (ACTION_CREATE_ACCOUNT.equals(action)) {
- final String packageName = extras.getString(EXTRA_PACKAGE_NAME);
- final String accName = extras.getString(EXTRA_ACC_NAME);
+ );
+ break;
+ }
+ case ACTION_CREATE_ACCOUNT: {
+ final String packageName = extras.getString(EXTRA_PACKAGE_NAME);
+ final String accName = extras.getString(EXTRA_ACC_NAME);
- setContentView(R.layout.api_remote_create_account);
+ setContentView(R.layout.api_remote_create_account);
+ initToolbar();
- mAccSettingsFragment = (AccountSettingsFragment) getSupportFragmentManager().findFragmentById(
- R.id.api_account_settings_fragment);
+ mAccSettingsFragment = (AccountSettingsFragment) getSupportFragmentManager().findFragmentById(
+ R.id.api_account_settings_fragment);
- TextView text = (TextView) findViewById(R.id.api_remote_create_account_text);
+ TextView text = (TextView) findViewById(R.id.api_remote_create_account_text);
- // update existing?
- Uri uri = KeychainContract.ApiAccounts.buildByPackageAndAccountUri(packageName, accName);
- AccountSettings settings = mProviderHelper.getApiAccountSettings(uri);
- if (settings == null) {
- // create new account
- settings = new AccountSettings(accName);
- mUpdateExistingAccount = false;
+ // update existing?
+ Uri uri = KeychainContract.ApiAccounts.buildByPackageAndAccountUri(packageName, accName);
+ AccountSettings settings = mProviderHelper.getApiAccountSettings(uri);
+ if (settings == null) {
+ // create new account
+ settings = new AccountSettings(accName);
+ mUpdateExistingAccount = false;
- text.setText(R.string.api_create_account_text);
- } else {
- // update existing account
- mUpdateExistingAccount = true;
+ text.setText(R.string.api_create_account_text);
+ } else {
+ // update existing account
+ mUpdateExistingAccount = true;
- text.setText(R.string.api_update_account_text);
- }
- mAccSettingsFragment.setAccSettings(settings);
-
- // Inflate a "Done"/"Cancel" custom action bar view
- ActionBarHelper.setTwoButtonView(getSupportActionBar(),
- R.string.api_settings_save, R.drawable.ic_action_done,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Save
-
- // user needs to select a key if it has explicitly requested (None is only allowed for new accounts)
- if (mUpdateExistingAccount && mAccSettingsFragment.getAccSettings().getKeyId() == Constants.key.none) {
- Notify.showNotify(RemoteServiceActivity.this, getString(R.string.api_register_error_select_key), Notify.Style.ERROR);
- } else {
- if (mUpdateExistingAccount) {
- Uri baseUri = KeychainContract.ApiAccounts.buildBaseUri(packageName);
- Uri accountUri = baseUri.buildUpon().appendEncodedPath(accName).build();
- mProviderHelper.updateApiAccount(
- accountUri,
- mAccSettingsFragment.getAccSettings());
+ text.setText(R.string.api_update_account_text);
+ }
+ mAccSettingsFragment.setAccSettings(settings);
+
+ // Inflate a "Done"/"Cancel" custom action bar view
+ setFullScreenDialogDoneClose(R.string.api_settings_save,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Save
+
+ // user needs to select a key if it has explicitly requested (None is only allowed for new accounts)
+ if (mUpdateExistingAccount && mAccSettingsFragment.getAccSettings().getKeyId() == Constants.key.none) {
+ Notify.showNotify(RemoteServiceActivity.this, getString(R.string.api_register_error_select_key), Notify.Style.ERROR);
} else {
- mProviderHelper.insertApiAccount(
- KeychainContract.ApiAccounts.buildBaseUri(packageName),
- mAccSettingsFragment.getAccSettings());
+ if (mUpdateExistingAccount) {
+ Uri baseUri = KeychainContract.ApiAccounts.buildBaseUri(packageName);
+ Uri accountUri = baseUri.buildUpon().appendEncodedPath(accName).build();
+ mProviderHelper.updateApiAccount(
+ accountUri,
+ mAccSettingsFragment.getAccSettings());
+ } else {
+ mProviderHelper.insertApiAccount(
+ KeychainContract.ApiAccounts.buildBaseUri(packageName),
+ mAccSettingsFragment.getAccSettings());
+ }
+
+ // give data through for new service call
+ Intent resultData = extras.getParcelable(EXTRA_DATA);
+ RemoteServiceActivity.this.setResult(RESULT_OK, resultData);
+ RemoteServiceActivity.this.finish();
}
-
- // give data through for new service call
- Intent resultData = extras.getParcelable(EXTRA_DATA);
- RemoteServiceActivity.this.setResult(RESULT_OK, resultData);
+ }
+ },
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Cancel
+ RemoteServiceActivity.this.setResult(RESULT_CANCELED);
RemoteServiceActivity.this.finish();
}
- }
- }, R.string.api_settings_cancel, R.drawable.ic_action_cancel,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Cancel
- RemoteServiceActivity.this.setResult(RESULT_CANCELED);
- RemoteServiceActivity.this.finish();
- }
+ });
+
+ break;
+ }
+ case ACTION_SELECT_PUB_KEYS: {
+ long[] selectedMasterKeyIds = intent.getLongArrayExtra(EXTRA_SELECTED_MASTER_KEY_IDS);
+ boolean noUserIdsCheck = intent.getBooleanExtra(EXTRA_NO_USER_IDS_CHECK, true);
+ ArrayList<String> missingUserIds = intent
+ .getStringArrayListExtra(EXTRA_MISSING_USER_IDS);
+ ArrayList<String> dublicateUserIds = intent
+ .getStringArrayListExtra(EXTRA_DUPLICATE_USER_IDS);
+
+ SpannableStringBuilder ssb = new SpannableStringBuilder();
+ final SpannableString textIntro = new SpannableString(
+ noUserIdsCheck ? getString(R.string.api_select_pub_keys_text_no_user_ids)
+ : getString(R.string.api_select_pub_keys_text)
+ );
+ textIntro.setSpan(new StyleSpan(Typeface.BOLD), 0, textIntro.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append(textIntro);
+
+ if (missingUserIds != null && missingUserIds.size() > 0) {
+ ssb.append("\n\n");
+ ssb.append(getString(R.string.api_select_pub_keys_missing_text));
+ ssb.append("\n");
+ for (String userId : missingUserIds) {
+ SpannableString ss = new SpannableString(userId + "\n");
+ ss.setSpan(new BulletSpan(15, Color.BLACK), 0, ss.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append(ss);
}
- );
-
- } else if (ACTION_SELECT_PUB_KEYS.equals(action)) {
- long[] selectedMasterKeyIds = intent.getLongArrayExtra(EXTRA_SELECTED_MASTER_KEY_IDS);
- boolean noUserIdsCheck = intent.getBooleanExtra(EXTRA_NO_USER_IDS_CHECK, true);
- ArrayList<String> missingUserIds = intent
- .getStringArrayListExtra(EXTRA_MISSING_USER_IDS);
- ArrayList<String> dublicateUserIds = intent
- .getStringArrayListExtra(EXTRA_DUPLICATE_USER_IDS);
-
- SpannableStringBuilder ssb = new SpannableStringBuilder();
- final SpannableString textIntro = new SpannableString(
- noUserIdsCheck ? getString(R.string.api_select_pub_keys_text_no_user_ids)
- : getString(R.string.api_select_pub_keys_text)
- );
- textIntro.setSpan(new StyleSpan(Typeface.BOLD), 0, textIntro.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(textIntro);
-
- if (missingUserIds != null && missingUserIds.size() > 0) {
- ssb.append("\n\n");
- ssb.append(getString(R.string.api_select_pub_keys_missing_text));
- ssb.append("\n");
- for (String userId : missingUserIds) {
- SpannableString ss = new SpannableString(userId + "\n");
- ss.setSpan(new BulletSpan(15, Color.BLACK), 0, ss.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(ss);
}
- }
- if (dublicateUserIds != null && dublicateUserIds.size() > 0) {
- ssb.append("\n\n");
- ssb.append(getString(R.string.api_select_pub_keys_dublicates_text));
- ssb.append("\n");
- for (String userId : dublicateUserIds) {
- SpannableString ss = new SpannableString(userId + "\n");
- ss.setSpan(new BulletSpan(15, Color.BLACK), 0, ss.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append(ss);
+ if (dublicateUserIds != null && dublicateUserIds.size() > 0) {
+ ssb.append("\n\n");
+ ssb.append(getString(R.string.api_select_pub_keys_dublicates_text));
+ ssb.append("\n");
+ for (String userId : dublicateUserIds) {
+ SpannableString ss = new SpannableString(userId + "\n");
+ ss.setSpan(new BulletSpan(15, Color.BLACK), 0, ss.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append(ss);
+ }
}
- }
- // Inflate a "Done"/"Cancel" custom action bar view
- ActionBarHelper.setTwoButtonView(getSupportActionBar(),
- R.string.btn_okay, R.drawable.ic_action_done,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // add key ids to params Bundle for new request
- Intent resultData = extras.getParcelable(EXTRA_DATA);
- resultData.putExtra(OpenPgpApi.EXTRA_KEY_IDS,
- mSelectFragment.getSelectedMasterKeyIds());
-
- RemoteServiceActivity.this.setResult(RESULT_OK, resultData);
- RemoteServiceActivity.this.finish();
- }
- }, R.string.btn_do_not_save, R.drawable.ic_action_cancel, new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // cancel
- RemoteServiceActivity.this.setResult(RESULT_CANCELED);
- RemoteServiceActivity.this.finish();
- }
- }
- );
+ setContentView(R.layout.api_remote_select_pub_keys);
+ initToolbar();
- setContentView(R.layout.api_remote_select_pub_keys);
+ // Inflate a "Done"/"Cancel" custom action bar view
+ setFullScreenDialogDoneClose(R.string.btn_okay,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // add key ids to params Bundle for new request
+ Intent resultData = extras.getParcelable(EXTRA_DATA);
+ resultData.putExtra(OpenPgpApi.EXTRA_KEY_IDS,
+ mSelectFragment.getSelectedMasterKeyIds());
- // set text on view
- TextView textView = (TextView) findViewById(R.id.api_select_pub_keys_text);
- textView.setText(ssb, TextView.BufferType.SPANNABLE);
+ RemoteServiceActivity.this.setResult(RESULT_OK, resultData);
+ RemoteServiceActivity.this.finish();
+ }
+ },
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // cancel
+ RemoteServiceActivity.this.setResult(RESULT_CANCELED);
+ RemoteServiceActivity.this.finish();
+ }
+ });
+
+ // set text on view
+ TextView textView = (TextView) findViewById(R.id.api_select_pub_keys_text);
+ textView.setText(ssb, TextView.BufferType.SPANNABLE);
+
+ /* Load select pub keys fragment */
+ // Check that the activity is using the layout version with
+ // the fragment_container FrameLayout
+ if (findViewById(R.id.api_select_pub_keys_fragment_container) != null) {
+
+ // However, if we're being restored from a previous state,
+ // then we don't need to do anything and should return or else
+ // we could end up with overlapping fragments.
+ if (savedInstanceState != null) {
+ return;
+ }
- /* Load select pub keys fragment */
- // Check that the activity is using the layout version with
- // the fragment_container FrameLayout
- if (findViewById(R.id.api_select_pub_keys_fragment_container) != null) {
+ // Create an instance of the fragment
+ mSelectFragment = SelectPublicKeyFragment.newInstance(selectedMasterKeyIds);
- // However, if we're being restored from a previous state,
- // then we don't need to do anything and should return or else
- // we could end up with overlapping fragments.
- if (savedInstanceState != null) {
- return;
+ // Add the fragment to the 'fragment_container' FrameLayout
+ getSupportFragmentManager().beginTransaction()
+ .add(R.id.api_select_pub_keys_fragment_container, mSelectFragment).commit();
}
-
- // Create an instance of the fragment
- mSelectFragment = SelectPublicKeyFragment.newInstance(selectedMasterKeyIds);
-
- // Add the fragment to the 'fragment_container' FrameLayout
- getSupportFragmentManager().beginTransaction()
- .add(R.id.api_select_pub_keys_fragment_container, mSelectFragment).commit();
+ break;
}
- } else if (ACTION_ERROR_MESSAGE.equals(action)) {
- String errorMessage = intent.getStringExtra(EXTRA_ERROR_MESSAGE);
+ case ACTION_ERROR_MESSAGE: {
+ String errorMessage = intent.getStringExtra(EXTRA_ERROR_MESSAGE);
- Spannable redErrorMessage = new SpannableString(errorMessage);
- redErrorMessage.setSpan(new ForegroundColorSpan(Color.RED), 0, errorMessage.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ Spannable redErrorMessage = new SpannableString(errorMessage);
+ redErrorMessage.setSpan(new ForegroundColorSpan(Color.RED), 0, errorMessage.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- // Inflate a "Done" custom action bar view
- ActionBarHelper.setOneButtonView(getSupportActionBar(),
- R.string.btn_okay, R.drawable.ic_action_done,
- new View.OnClickListener() {
+ setContentView(R.layout.api_remote_error_message);
+ initToolbar();
- @Override
- public void onClick(View v) {
- RemoteServiceActivity.this.setResult(RESULT_CANCELED);
- RemoteServiceActivity.this.finish();
- }
- }
- );
+ // Inflate a "Done" custom action bar view
+ setFullScreenDialogClose(
+ new View.OnClickListener() {
- setContentView(R.layout.api_remote_error_message);
+ @Override
+ public void onClick(View v) {
+ RemoteServiceActivity.this.setResult(RESULT_CANCELED);
+ RemoteServiceActivity.this.finish();
+ }
+ }
+ );
- // set text on view
- TextView textView = (TextView) findViewById(R.id.api_app_error_message_text);
- textView.setText(redErrorMessage);
- } else {
- Log.e(Constants.TAG, "Action does not exist!");
- setResult(RESULT_CANCELED);
- finish();
+ // set text on view
+ TextView textView = (TextView) findViewById(R.id.api_app_error_message_text);
+ textView.setText(redErrorMessage);
+ break;
+ }
+ default:
+ Log.e(Constants.TAG, "Action does not exist!");
+ setResult(RESULT_CANCELED);
+ finish();
+ break;
}
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java
index dd9c0d769..f0dbf0820 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java
@@ -34,7 +34,7 @@ public class CertifyActionsParcel implements Parcelable {
final public long mMasterKeyId;
public CertifyLevel mLevel;
- public ArrayList<CertifyAction> mCertifyActions = new ArrayList<CertifyAction>();
+ public ArrayList<CertifyAction> mCertifyActions = new ArrayList<>();
public CertifyActionsParcel(long masterKeyId) {
mMasterKeyId = masterKeyId;
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 447f413ef..7688b9252 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ContactSyncAdapterService.java
@@ -53,7 +53,7 @@ public class ContactSyncAdapterService extends Service {
// new Handler.Callback() {
// @Override
// public boolean handleMessage(Message msg) {
-// Bundle data = msg.getData();
+// Bundle data = msg.getInputData();
// switch (msg.arg1) {
// case KeychainIntentServiceHandler.MESSAGE_OKAY:
// Log.d(Constants.TAG, "Syncing... Done.");
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 3626076b7..0ddf0c76d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -26,10 +26,25 @@ import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
+import com.textuality.keybase.lib.Proof;
+import com.textuality.keybase.lib.prover.Prover;
+
+import org.json.JSONObject;
+import org.spongycastle.openpgp.PGPUtil;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
+import org.sufficientlysecure.keychain.keyimport.Keyserver;
+import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.CertifyOperation;
import org.sufficientlysecure.keychain.operations.DeleteOperation;
import org.sufficientlysecure.keychain.operations.EditKeyOperation;
+import org.sufficientlysecure.keychain.operations.ImportExportOperation;
+import org.sufficientlysecure.keychain.operations.PromoteKeyOperation;
+import org.sufficientlysecure.keychain.operations.SignEncryptOperation;
+import org.sufficientlysecure.keychain.operations.results.CertifyResult;
+import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.DeleteResult;
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
import org.sufficientlysecure.keychain.operations.results.ExportResult;
@@ -41,35 +56,40 @@ import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
import org.sufficientlysecure.keychain.keyimport.Keyserver;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
+import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
+import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
-import org.sufficientlysecure.keychain.pgp.PgpHelper;
-import org.sufficientlysecure.keychain.operations.ImportExportOperation;
-import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt;
import org.sufficientlysecure.keychain.pgp.Progressable;
+import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException;
-import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
-import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
-import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
-import org.sufficientlysecure.keychain.util.ParcelableFileCache;
+import org.sufficientlysecure.keychain.util.FileHelper;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
+import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
+import de.measite.minidns.Client;
+import de.measite.minidns.DNSMessage;
+import de.measite.minidns.Question;
+import de.measite.minidns.Record;
+import de.measite.minidns.record.Data;
+import de.measite.minidns.record.TXT;
+
/**
* This Service contains all important long lasting operations for OpenKeychain. It receives Intents with
* data from the activities or other apps, queues these intents, executes them, and stops itself
@@ -86,10 +106,14 @@ public class KeychainIntentService extends IntentService implements Progressable
public static final String ACTION_DECRYPT_VERIFY = Constants.INTENT_PREFIX + "DECRYPT_VERIFY";
+ public static final String ACTION_VERIFY_KEYBASE_PROOF = Constants.INTENT_PREFIX + "VERIFY_KEYBASE_PROOF";
+
public static final String ACTION_DECRYPT_METADATA = Constants.INTENT_PREFIX + "DECRYPT_METADATA";
public static final String ACTION_EDIT_KEYRING = Constants.INTENT_PREFIX + "EDIT_KEYRING";
+ public static final String ACTION_PROMOTE_KEYRING = Constants.INTENT_PREFIX + "PROMOTE_KEYRING";
+
public static final String ACTION_IMPORT_KEYRING = Constants.INTENT_PREFIX + "IMPORT_KEYRING";
public static final String ACTION_EXPORT_KEYRING = Constants.INTENT_PREFIX + "EXPORT_KEYRING";
@@ -108,33 +132,25 @@ public class KeychainIntentService extends IntentService implements Progressable
// encrypt, decrypt, import export
public static final String TARGET = "target";
public static final String SOURCE = "source";
+
// possible targets:
public static final int IO_BYTES = 1;
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_MASTER_ID = "secret_key_id";
- public static final String ENCRYPT_SIGNATURE_KEY_PASSPHRASE = "secret_key_passphrase";
- public static final String ENCRYPT_SIGNATURE_NFC_TIMESTAMP = "signature_nfc_timestamp";
- public static final String ENCRYPT_SIGNATURE_NFC_HASH = "signature_nfc_hash";
- public static final String ENCRYPT_USE_ASCII_ARMOR = "use_ascii_armor";
- public static final String ENCRYPT_ENCRYPTION_KEYS_IDS = "encryption_keys_ids";
- public static final String ENCRYPT_COMPRESSION_ID = "compression_id";
- public static final String ENCRYPT_MESSAGE_BYTES = "message_bytes";
public static final String ENCRYPT_DECRYPT_INPUT_URI = "input_uri";
- public static final String ENCRYPT_INPUT_URIS = "input_uris";
public static final String ENCRYPT_DECRYPT_OUTPUT_URI = "output_uri";
- public static final String ENCRYPT_OUTPUT_URIS = "output_uris";
- public static final String ENCRYPT_SYMMETRIC_PASSPHRASE = "passphrase";
+ public static final String SIGN_ENCRYPT_PARCEL = "sign_encrypt_parcel";
// decrypt/verify
public static final String DECRYPT_CIPHERTEXT_BYTES = "ciphertext_bytes";
public static final String DECRYPT_PASSPHRASE = "passphrase";
public static final String DECRYPT_NFC_DECRYPTED_SESSION_KEY = "nfc_decrypted_session_key";
+ // keybase proof
+ public static final String KEYBASE_REQUIRED_FINGERPRINT = "keybase_required_fingerprint";
+ public static final String KEYBASE_PROOF = "keybase_proof";
+
// save keyring
public static final String EDIT_KEYRING_PARCEL = "save_parcel";
public static final String EDIT_KEYRING_PASSPHRASE = "passphrase";
@@ -160,6 +176,10 @@ public class KeychainIntentService extends IntentService implements Progressable
// certify key
public static final String CERTIFY_PARCEL = "certify_parcel";
+ // promote key
+ public static final String PROMOTE_MASTER_KEY_ID = "promote_master_key_id";
+ public static final String PROMOTE_TYPE = "promote_type";
+
// consolidate
public static final String CONSOLIDATE_RECOVERY = "consolidate_recovery";
@@ -168,9 +188,6 @@ public class KeychainIntentService extends IntentService implements Progressable
* possible data keys as result send over messenger
*/
- // encrypt
- public static final String RESULT_BYTES = "encrypted_data";
-
// decrypt/verify
public static final String RESULT_DECRYPTED_BYTES = "decrypted_data";
@@ -223,303 +240,357 @@ public class KeychainIntentService extends IntentService implements Progressable
String action = intent.getAction();
// executeServiceMethod action from extra bundle
- if (ACTION_CERTIFY_KEYRING.equals(action)) {
+ switch (action) {
+ case ACTION_CERTIFY_KEYRING: {
- // Input
- CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL);
- String keyServerUri = data.getString(UPLOAD_KEY_SERVER);
-
- // Operation
- CertifyOperation op = new CertifyOperation(this, providerHelper, this, mActionCanceled);
- CertifyResult result = op.certify(parcel, keyServerUri);
+ // Input
+ CertifyActionsParcel parcel = data.getParcelable(CERTIFY_PARCEL);
+ String keyServerUri = data.getString(UPLOAD_KEY_SERVER);
- // Result
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
+ // Operation
+ CertifyOperation op = new CertifyOperation(this, providerHelper, this, mActionCanceled);
+ CertifyResult result = op.certify(parcel, keyServerUri);
- } else if (ACTION_CONSOLIDATE.equals(action)) {
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- // Operation
- ConsolidateResult result;
- if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) {
- result = new ProviderHelper(this).consolidateDatabaseStep2(this);
- } else {
- result = new ProviderHelper(this).consolidateDatabaseStep1(this);
+ break;
}
+ case ACTION_CONSOLIDATE: {
- // Result
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
+ // Operation
+ ConsolidateResult result;
+ if (data.containsKey(CONSOLIDATE_RECOVERY) && data.getBoolean(CONSOLIDATE_RECOVERY)) {
+ result = new ProviderHelper(this).consolidateDatabaseStep2(this);
+ } else {
+ result = new ProviderHelper(this).consolidateDatabaseStep1(this);
+ }
- } else if (ACTION_DECRYPT_METADATA.equals(action)) {
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- try {
+ break;
+ }
+ case ACTION_DECRYPT_METADATA: {
+
+ try {
/* Input */
- String passphrase = data.getString(DECRYPT_PASSPHRASE);
- byte[] nfcDecryptedSessionKey = data.getByteArray(DECRYPT_NFC_DECRYPTED_SESSION_KEY);
+ String passphrase = data.getString(DECRYPT_PASSPHRASE);
+ byte[] nfcDecryptedSessionKey = data.getByteArray(DECRYPT_NFC_DECRYPTED_SESSION_KEY);
- InputData inputData = createDecryptInputData(data);
+ InputData inputData = createDecryptInputData(data);
/* Operation */
- Bundle resultData = new Bundle();
+ Bundle resultData = new Bundle();
+
+ // verifyText and decrypt returning additional resultData values for the
+ // verification of signatures
+ PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
+ this, new ProviderHelper(this), this, inputData, null
+ );
+ builder.setAllowSymmetricDecryption(true)
+ .setPassphrase(passphrase)
+ .setDecryptMetadataOnly(true)
+ .setNfcState(nfcDecryptedSessionKey);
- // verifyText and decrypt returning additional resultData values for the
- // verification of signatures
- PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
- this, new ProviderHelper(this), this, inputData, null
- );
- builder.setAllowSymmetricDecryption(true)
- .setPassphrase(passphrase)
- .setDecryptMetadataOnly(true)
- .setNfcState(nfcDecryptedSessionKey);
+ DecryptVerifyResult decryptVerifyResult = builder.build().execute();
- DecryptVerifyResult decryptVerifyResult = builder.build().execute();
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, decryptVerifyResult);
+ } catch (Exception e) {
+ sendErrorToHandler(e);
+ }
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, decryptVerifyResult);
- } catch (Exception e) {
- sendErrorToHandler(e);
+ break;
}
+ case ACTION_VERIFY_KEYBASE_PROOF: {
- } else if (ACTION_DECRYPT_VERIFY.equals(action)) {
+ try {
+ Proof proof = new Proof(new JSONObject(data.getString(KEYBASE_PROOF)));
+ setProgress(R.string.keybase_message_fetching_data, 0, 100);
- try {
- /* Input */
- String passphrase = data.getString(DECRYPT_PASSPHRASE);
- byte[] nfcDecryptedSessionKey = data.getByteArray(DECRYPT_NFC_DECRYPTED_SESSION_KEY);
+ Prover prover = Prover.findProverFor(proof);
- InputData inputData = createDecryptInputData(data);
- OutputStream outStream = createCryptOutputStream(data);
+ if (prover == null) {
+ sendProofError(getString(R.string.keybase_no_prover_found) + ": " + proof.getPrettyName());
+ return;
+ }
- /* Operation */
+ if (!prover.fetchProofData()) {
+ sendProofError(prover.getLog(), getString(R.string.keybase_problem_fetching_evidence));
+ return;
+ }
+ String requiredFingerprint = data.getString(KEYBASE_REQUIRED_FINGERPRINT);
+ if (!prover.checkFingerprint(requiredFingerprint)) {
+ sendProofError(getString(R.string.keybase_key_mismatch));
+ return;
+ }
- Bundle resultData = new Bundle();
+ String domain = prover.dnsTxtCheckRequired();
+ if (domain != null) {
+ DNSMessage dnsQuery = new Client().query(new Question(domain, Record.TYPE.TXT));
+ if (dnsQuery == null) {
+ sendProofError(prover.getLog(), getString(R.string.keybase_dns_query_failure));
+ return;
+ }
+ Record[] records = dnsQuery.getAnswers();
+ List<List<byte[]>> extents = new ArrayList<List<byte[]>>();
+ for (Record r : records) {
+ Data d = r.getPayload();
+ if (d instanceof TXT) {
+ extents.add(((TXT) d).getExtents());
+ }
+ }
+ if (!prover.checkDnsTxt(extents)) {
+ sendProofError(prover.getLog(), null);
+ return;
+ }
+ }
- // verifyText and decrypt returning additional resultData values for the
- // verification of signatures
- PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
- this, new ProviderHelper(this), this,
- inputData, outStream
- );
- builder.setAllowSymmetricDecryption(true)
- .setPassphrase(passphrase)
- .setNfcState(nfcDecryptedSessionKey);
+ byte[] messageBytes = prover.getPgpMessage().getBytes();
+ if (prover.rawMessageCheckRequired()) {
+ InputStream messageByteStream = PGPUtil.getDecoderStream(new ByteArrayInputStream(messageBytes));
+ if (!prover.checkRawMessageBytes(messageByteStream)) {
+ sendProofError(prover.getLog(), null);
+ return;
+ }
+ }
- DecryptVerifyResult decryptVerifyResult = builder.build().execute();
+ // kind of awkward, but this whole class wants to pull bytes out of “data”
+ data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_BYTES);
+ data.putByteArray(KeychainIntentService.DECRYPT_CIPHERTEXT_BYTES, messageBytes);
- outStream.close();
+ InputData inputData = createDecryptInputData(data);
+ OutputStream outStream = createCryptOutputStream(data);
- resultData.putParcelable(DecryptVerifyResult.EXTRA_RESULT, decryptVerifyResult);
+ PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
+ this, new ProviderHelper(this), this,
+ inputData, outStream
+ );
+ builder.setSignedLiteralData(true).setRequiredSignerFingerprint(requiredFingerprint);
- /* Output */
+ DecryptVerifyResult decryptVerifyResult = builder.build().execute();
+ outStream.close();
- finalizeDecryptOutputStream(data, resultData, outStream);
+ if (!decryptVerifyResult.success()) {
+ OperationLog log = decryptVerifyResult.getLog();
+ OperationResult.LogEntryParcel lastEntry = null;
+ for (OperationResult.LogEntryParcel entry : log) {
+ lastEntry = entry;
+ }
+ sendProofError(getString(lastEntry.mType.getMsgId()));
+ return;
+ }
- Log.logDebugBundle(resultData, "resultData");
+ if (!prover.validate(outStream.toString())) {
+ sendProofError(getString(R.string.keybase_message_payload_mismatch));
+ return;
+ }
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, resultData);
- } catch (Exception e) {
- sendErrorToHandler(e);
- }
+ Bundle resultData = new Bundle();
+ resultData.putString(KeychainIntentServiceHandler.DATA_MESSAGE, "OK");
- } else if (ACTION_DELETE.equals(action)) {
+ // these help the handler construct a useful human-readable message
+ resultData.putString(KeychainIntentServiceHandler.KEYBASE_PROOF_URL, prover.getProofUrl());
+ resultData.putString(KeychainIntentServiceHandler.KEYBASE_PRESENCE_URL, prover.getPresenceUrl());
+ resultData.putString(KeychainIntentServiceHandler.KEYBASE_PRESENCE_LABEL, prover.getPresenceLabel());
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, resultData);
+ } catch (Exception e) {
+ sendErrorToHandler(e);
+ }
- // Input
- long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST);
- boolean isSecret = data.getBoolean(DELETE_IS_SECRET);
+ break;
+ }
+ case ACTION_DECRYPT_VERIFY: {
- // Operation
- DeleteOperation op = new DeleteOperation(this, new ProviderHelper(this), this);
- DeleteResult result = op.execute(masterKeyIds, isSecret);
+ try {
+ /* Input */
+ String passphrase = data.getString(DECRYPT_PASSPHRASE);
+ byte[] nfcDecryptedSessionKey = data.getByteArray(DECRYPT_NFC_DECRYPTED_SESSION_KEY);
- // Result
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
+ InputData inputData = createDecryptInputData(data);
+ OutputStream outStream = createCryptOutputStream(data);
- } else if (ACTION_EDIT_KEYRING.equals(action)) {
+ /* Operation */
- // Input
- SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL);
- String passphrase = data.getString(EDIT_KEYRING_PASSPHRASE);
+ Bundle resultData = new Bundle();
- // Operation
- EditKeyOperation op = new EditKeyOperation(this, providerHelper, this, mActionCanceled);
- EditKeyResult result = op.execute(saveParcel, passphrase);
+ // verifyText and decrypt returning additional resultData values for the
+ // verification of signatures
+ PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
+ this, new ProviderHelper(this), this,
+ inputData, outStream
+ );
+ builder.setAllowSymmetricDecryption(true)
+ .setPassphrase(passphrase)
+ .setNfcState(nfcDecryptedSessionKey);
- // Result
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
+ DecryptVerifyResult decryptVerifyResult = builder.build().execute();
- } else if (ACTION_EXPORT_KEYRING.equals(action)) {
+ outStream.close();
- // Input
- boolean exportSecret = data.getBoolean(EXPORT_SECRET, false);
- String outputFile = data.getString(EXPORT_FILENAME);
- Uri outputUri = data.getParcelable(EXPORT_URI);
+ resultData.putParcelable(DecryptVerifyResult.EXTRA_RESULT, decryptVerifyResult);
- boolean exportAll = data.getBoolean(EXPORT_ALL);
- long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID);
+ /* Output */
- // Operation
- ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this);
- ExportResult result;
- if (outputFile != null) {
- result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile);
- } else {
- result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri);
- }
+ finalizeDecryptOutputStream(data, resultData, outStream);
- // Result
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
+ Log.logDebugBundle(resultData, "resultData");
- } else if (ACTION_IMPORT_KEYRING.equals(action)) {
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, resultData);
+ } catch (Exception e) {
+ sendErrorToHandler(e);
+ }
- try {
+ break;
+ }
+ case ACTION_DELETE: {
// Input
- String keyServer = data.getString(IMPORT_KEY_SERVER);
- Iterator<ParcelableKeyRing> entries;
- int numEntries;
- if (data.containsKey(IMPORT_KEY_LIST)) {
- // get entries from intent
- ArrayList<ParcelableKeyRing> list = data.getParcelableArrayList(IMPORT_KEY_LIST);
- entries = list.iterator();
- numEntries = list.size();
- } else {
- // get entries from cached file
- ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<ParcelableKeyRing>(this, "key_import.pcl");
- IteratorWithSize<ParcelableKeyRing> it = cache.readCache();
- entries = it;
- numEntries = it.getSize();
- }
+ long[] masterKeyIds = data.getLongArray(DELETE_KEY_LIST);
+ boolean isSecret = data.getBoolean(DELETE_IS_SECRET);
// Operation
- ImportExportOperation importExportOperation = new ImportExportOperation(
- this, providerHelper, this, mActionCanceled);
- ImportKeyResult result = importExportOperation.importKeyRings(entries, numEntries, keyServer);
+ DeleteOperation op = new DeleteOperation(this, new ProviderHelper(this), this);
+ DeleteResult result = op.execute(masterKeyIds, isSecret);
- // Special: consolidate on secret key import (cannot be cancelled!)
- if (result.mSecret > 0) {
- // TODO move this into the import operation
- providerHelper.consolidateDatabaseStep1(this);
- }
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- // Special: make sure new data is synced into contacts
- ContactSyncAdapterService.requestSync();
+ break;
+ }
+ case ACTION_EDIT_KEYRING: {
+
+ // Input
+ SaveKeyringParcel saveParcel = data.getParcelable(EDIT_KEYRING_PARCEL);
+ String passphrase = data.getString(EDIT_KEYRING_PASSPHRASE);
+
+ // Operation
+ EditKeyOperation op = new EditKeyOperation(this, providerHelper, this, mActionCanceled);
+ EditKeyResult result = op.execute(saveParcel, passphrase);
// Result
sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- } catch (Exception e) {
- sendErrorToHandler(e);
+
+ break;
}
+ case ACTION_PROMOTE_KEYRING: {
- } else if (ACTION_SIGN_ENCRYPT.equals(action)) {
+ // Input
+ long keyRingId = data.getInt(EXPORT_KEY_RING_MASTER_KEY_ID);
- try {
- /* Input */
- int source = data.get(SOURCE) != null ? data.getInt(SOURCE) : data.getInt(TARGET);
- Bundle resultData = new Bundle();
+ // Operation
+ PromoteKeyOperation op = new PromoteKeyOperation(this, providerHelper, this, mActionCanceled);
+ PromoteKeyResult result = op.execute(keyRingId);
- long sigMasterKeyId = data.getLong(ENCRYPT_SIGNATURE_MASTER_ID);
- String sigKeyPassphrase = data.getString(ENCRYPT_SIGNATURE_KEY_PASSPHRASE);
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- byte[] nfcHash = data.getByteArray(ENCRYPT_SIGNATURE_NFC_HASH);
- Date nfcTimestamp = (Date) data.getSerializable(ENCRYPT_SIGNATURE_NFC_TIMESTAMP);
+ break;
+ }
+ case ACTION_EXPORT_KEYRING: {
- String symmetricPassphrase = data.getString(ENCRYPT_SYMMETRIC_PASSPHRASE);
+ // Input
+ boolean exportSecret = data.getBoolean(EXPORT_SECRET, false);
+ String outputFile = data.getString(EXPORT_FILENAME);
+ Uri outputUri = data.getParcelable(EXPORT_URI);
- boolean useAsciiArmor = data.getBoolean(ENCRYPT_USE_ASCII_ARMOR);
- long encryptionKeyIds[] = data.getLongArray(ENCRYPT_ENCRYPTION_KEYS_IDS);
- int compressionId = data.getInt(ENCRYPT_COMPRESSION_ID);
- 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);
- String originalFilename = getOriginalFilename(data);
+ boolean exportAll = data.getBoolean(EXPORT_ALL);
+ long[] masterKeyIds = exportAll ? null : data.getLongArray(EXPORT_KEY_RING_MASTER_KEY_ID);
- /* Operation */
- PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
- this, new ProviderHelper(this), this, inputData, outStream
- );
- builder.setEnableAsciiArmorOutput(useAsciiArmor)
- .setVersionHeader(PgpHelper.getVersionForHeader(this))
- .setCompressionId(compressionId)
- .setSymmetricEncryptionAlgorithm(
- Preferences.getPreferences(this).getDefaultEncryptionAlgorithm())
- .setEncryptionMasterKeyIds(encryptionKeyIds)
- .setSymmetricPassphrase(symmetricPassphrase)
- .setOriginalFilename(originalFilename);
+ // Operation
+ ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this);
+ ExportResult result;
+ if (outputFile != null) {
+ result = importExportOperation.exportToFile(masterKeyIds, exportSecret, outputFile);
+ } else {
+ result = importExportOperation.exportToUri(masterKeyIds, exportSecret, outputUri);
+ }
- try {
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- // Find the appropriate subkey to sign with
- CachedPublicKeyRing signingRing =
- new ProviderHelper(this).getCachedPublicKeyRing(sigMasterKeyId);
- long sigSubKeyId = signingRing.getSecretSignId();
-
- // Set signature settings
- builder.setSignatureMasterKeyId(sigMasterKeyId)
- .setSignatureSubKeyId(sigSubKeyId)
- .setSignaturePassphrase(sigKeyPassphrase)
- .setSignatureHashAlgorithm(
- Preferences.getPreferences(this).getDefaultHashAlgorithm())
- .setAdditionalEncryptId(sigMasterKeyId);
- if (nfcHash != null && nfcTimestamp != null) {
- builder.setNfcState(nfcHash, nfcTimestamp);
- }
+ break;
+ }
+ case ACTION_IMPORT_KEYRING: {
- } catch (PgpKeyNotFoundException e) {
- // encrypt-only
- // TODO Just silently drop the requested signature? Shouldn't we throw here?
- }
+ // Input
+ String keyServer = data.getString(IMPORT_KEY_SERVER);
+ ArrayList<ParcelableKeyRing> list = data.getParcelableArrayList(IMPORT_KEY_LIST);
+ ParcelableFileCache<ParcelableKeyRing> cache =
+ new ParcelableFileCache<>(this, "key_import.pcl");
- // this assumes that the bytes are cleartext (valid for current implementation!)
- if (source == IO_BYTES) {
- builder.setCleartextInput(true);
- }
+ // Operation
+ ImportExportOperation importExportOperation = new ImportExportOperation(
+ this, providerHelper, this, mActionCanceled);
+ // Either list or cache must be null, no guarantees otherwise.
+ ImportKeyResult result = list != null
+ ? importExportOperation.importKeyRings(list, keyServer)
+ : importExportOperation.importKeyRings(cache, keyServer);
- SignEncryptResult result = builder.build().execute();
- resultData.putParcelable(SignEncryptResult.EXTRA_RESULT, result);
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- outStream.close();
+ break;
- /* Output */
+ }
+ case ACTION_SIGN_ENCRYPT: {
- finalizeEncryptOutputStream(data, resultData, outStream);
+ // Input
+ SignEncryptParcel inputParcel = data.getParcelable(SIGN_ENCRYPT_PARCEL);
- }
+ // Operation
+ SignEncryptOperation op = new SignEncryptOperation(
+ this, new ProviderHelper(this), this, mActionCanceled);
+ SignEncryptResult result = op.execute(inputParcel);
- Log.logDebugBundle(resultData, "resultData");
+ // Result
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, resultData);
- } catch (Exception e) {
- sendErrorToHandler(e);
+ break;
}
+ case ACTION_UPLOAD_KEYRING: {
+ try {
- } else if (ACTION_UPLOAD_KEYRING.equals(action)) {
-
- try {
+ /* Input */
+ String keyServer = data.getString(UPLOAD_KEY_SERVER);
+ // and dataUri!
- /* Input */
- String keyServer = data.getString(UPLOAD_KEY_SERVER);
- // and dataUri!
+ /* Operation */
+ HkpKeyserver server = new HkpKeyserver(keyServer);
- /* Operation */
- HkpKeyserver server = new HkpKeyserver(keyServer);
+ CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri);
+ ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this);
- CanonicalizedPublicKeyRing keyring = providerHelper.getCanonicalizedPublicKeyRing(dataUri);
- ImportExportOperation importExportOperation = new ImportExportOperation(this, new ProviderHelper(this), this);
+ try {
+ importExportOperation.uploadKeyRingToServer(server, keyring);
+ } catch (Keyserver.AddKeyException e) {
+ throw new PgpGeneralException("Unable to export key to selected server");
+ }
- try {
- importExportOperation.uploadKeyRingToServer(server, keyring);
- } catch (Keyserver.AddKeyException e) {
- throw new PgpGeneralException("Unable to export key to selected server");
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY);
+ } catch (Exception e) {
+ sendErrorToHandler(e);
}
-
- sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY);
- } catch (Exception e) {
- sendErrorToHandler(e);
+ break;
}
}
+ }
+
+ private void sendProofError(List<String> log, String label) {
+ String msg = null;
+ label = (label == null) ? "" : label + ": ";
+ for (String m : log) {
+ Log.e(Constants.TAG, label + m);
+ msg = m;
+ }
+ sendProofError(label + msg);
+ }
+ private void sendProofError(String msg) {
+ Bundle bundle = new Bundle();
+ bundle.putString(KeychainIntentServiceHandler.DATA_ERROR, msg);
+ sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, bundle);
}
private void sendErrorToHandler(Exception e) {
@@ -532,7 +603,6 @@ public class KeychainIntentService extends IntentService implements Progressable
} else {
message = e.getMessage();
}
-
Log.d(Constants.TAG, "KeychainIntentService Exception: ", e);
Bundle data = new Bundle();
@@ -609,10 +679,6 @@ public class KeychainIntentService extends IntentService implements Progressable
return createCryptInputData(data, DECRYPT_CIPHERTEXT_BYTES);
}
- private InputData createEncryptInputData(Bundle data) throws IOException, PgpGeneralException {
- return createCryptInputData(data, ENCRYPT_MESSAGE_BYTES);
- }
-
private InputData createCryptInputData(Bundle data, String bytesName) throws PgpGeneralException, IOException {
int source = data.get(SOURCE) != null ? data.getInt(SOURCE) : data.getInt(TARGET);
switch (source) {
@@ -626,33 +692,6 @@ public class KeychainIntentService extends IntentService implements Progressable
// InputStream
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!");
- }
- }
-
- private String getOriginalFilename(Bundle data) throws PgpGeneralException, FileNotFoundException {
- int target = data.getInt(TARGET);
- switch (target) {
- case IO_BYTES:
- return "";
-
- case IO_URI:
- Uri providerUri = data.getParcelable(ENCRYPT_DECRYPT_INPUT_URI);
-
- return FileHelper.getFilename(this, providerUri);
-
- case IO_URIS:
- providerUri = data.<Uri>getParcelableArrayList(ENCRYPT_INPUT_URIS).get(data.getInt(SELECTED_URI));
-
- return FileHelper.getFilename(this, providerUri);
-
default:
throw new PgpGeneralException("No target choosen!");
}
@@ -669,20 +708,11 @@ public class KeychainIntentService extends IntentService implements Progressable
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!");
}
}
- private void finalizeEncryptOutputStream(Bundle data, Bundle resultData, OutputStream outStream) {
- finalizeCryptOutputStream(data, resultData, outStream, RESULT_BYTES);
- }
-
private void finalizeDecryptOutputStream(Bundle data, Bundle resultData, OutputStream outStream) {
finalizeCryptOutputStream(data, resultData, outStream, RESULT_DECRYPTED_BYTES);
}
@@ -695,7 +725,6 @@ public class KeychainIntentService extends IntentService implements Progressable
resultData.putByteArray(bytesName, output);
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/KeychainIntentServiceHandler.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java
index 180020d0b..635fe86f1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java
@@ -27,8 +27,8 @@ import android.support.v4.app.FragmentManager;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
-import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.util.Log;
public class KeychainIntentServiceHandler extends Handler {
@@ -45,6 +45,11 @@ public class KeychainIntentServiceHandler extends Handler {
public static final String DATA_MESSAGE = "message";
public static final String DATA_MESSAGE_ID = "message_id";
+ // keybase proof specific
+ public static final String KEYBASE_PROOF_URL = "keybase_proof_url";
+ public static final String KEYBASE_PRESENCE_URL = "keybase_presence_url";
+ public static final String KEYBASE_PRESENCE_LABEL = "keybase_presence_label";
+
Activity mActivity;
ProgressDialogFragment mProgressDialogFragment;
@@ -73,6 +78,10 @@ public class KeychainIntentServiceHandler extends Handler {
}
public void showProgressDialog(FragmentActivity activity) {
+ if (mProgressDialogFragment == null) {
+ return;
+ }
+
// TODO: This is a hack!, see
// http://stackoverflow.com/questions/10114324/show-dialogfragment-from-onactivityresult
final FragmentManager manager = activity.getSupportFragmentManager();
@@ -89,7 +98,8 @@ public class KeychainIntentServiceHandler extends Handler {
Bundle data = message.getData();
if (mProgressDialogFragment == null) {
- Log.e(Constants.TAG, "Progress has not been updated because mProgressDialogFragment was null!");
+ // Log.e(Constants.TAG,
+ // "Progress has not been updated because mProgressDialogFragment was null!");
return;
}
@@ -131,6 +141,7 @@ public class KeychainIntentServiceHandler extends Handler {
case MESSAGE_PREVENT_CANCEL:
mProgressDialogFragment.setPreventCancel(true);
+ break;
default:
Log.e(Constants.TAG, "unknown handler message!");
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 869d2e71b..57881f8ee 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java
@@ -39,12 +39,11 @@ import android.support.v4.util.LongSparseArray;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.util.Date;
@@ -103,7 +102,7 @@ public class PassphraseCacheService extends Service {
private BroadcastReceiver mIntentReceiver;
- private LongSparseArray<CachedPassphrase> mPassphraseCache = new LongSparseArray<CachedPassphrase>();
+ private LongSparseArray<CachedPassphrase> mPassphraseCache = new LongSparseArray<>();
Context mContext;
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 2f2224b24..e2d0c03c9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
@@ -59,7 +59,6 @@ public class SaveKeyringParcel implements Parcelable {
public ArrayList<String> mRevokeUserIds;
public ArrayList<Long> mRevokeSubKeys;
- public ArrayList<Long> mStripSubKeys;
public SaveKeyringParcel() {
reset();
@@ -73,14 +72,30 @@ public class SaveKeyringParcel implements Parcelable {
public void reset() {
mNewUnlock = null;
- mAddUserIds = new ArrayList<String>();
- mAddUserAttribute = new ArrayList<WrappedUserAttribute>();
- mAddSubKeys = new ArrayList<SubkeyAdd>();
+ mAddUserIds = new ArrayList<>();
+ mAddUserAttribute = new ArrayList<>();
+ mAddSubKeys = new ArrayList<>();
mChangePrimaryUserId = null;
- mChangeSubKeys = new ArrayList<SubkeyChange>();
- mRevokeUserIds = new ArrayList<String>();
- mRevokeSubKeys = new ArrayList<Long>();
- mStripSubKeys = new ArrayList<Long>();
+ mChangeSubKeys = new ArrayList<>();
+ mRevokeUserIds = new ArrayList<>();
+ mRevokeSubKeys = new ArrayList<>();
+ }
+
+ /** Returns true iff this parcel does not contain any operations which require a passphrase. */
+ public boolean isRestrictedOnly() {
+ if (mNewUnlock != null || !mAddUserIds.isEmpty() || !mAddUserAttribute.isEmpty()
+ || !mAddSubKeys.isEmpty() || mChangePrimaryUserId != null || !mRevokeSubKeys .isEmpty()
+ || !mRevokeSubKeys.isEmpty()) {
+ return false;
+ }
+
+ for (SubkeyChange change : mChangeSubKeys) {
+ if (change.mRecertify || change.mFlags != null || change.mExpiry != null) {
+ return false;
+ }
+ }
+
+ return true;
}
// performance gain for using Parcelable here would probably be negligible,
@@ -113,26 +128,53 @@ public class SaveKeyringParcel implements Parcelable {
}
public static class SubkeyChange implements Serializable {
- public long mKeyId;
+ public final long mKeyId;
public Integer mFlags;
// this is a long unix timestamp, in seconds (NOT MILLISECONDS!)
public Long mExpiry;
+ // if this flag is true, the key will be recertified even if all above
+ // values are no-ops
+ public boolean mRecertify;
+ // if this flag is true, the subkey should be changed to a stripped key
+ public boolean mDummyStrip;
+ // if this is non-null, the subkey will be changed to a divert-to-card
+ // key for the given serial number
+ public byte[] mDummyDivert;
public SubkeyChange(long keyId) {
mKeyId = keyId;
}
+ public SubkeyChange(long keyId, boolean recertify) {
+ mKeyId = keyId;
+ mRecertify = recertify;
+ }
+
public SubkeyChange(long keyId, Integer flags, Long expiry) {
mKeyId = keyId;
mFlags = flags;
mExpiry = expiry;
}
+ public SubkeyChange(long keyId, boolean dummyStrip, byte[] dummyDivert) {
+ this(keyId, null, null);
+
+ // these flags are mutually exclusive!
+ if (dummyStrip && dummyDivert != null) {
+ throw new AssertionError(
+ "cannot set strip and divert flags at the same time - this is a bug!");
+ }
+ mDummyStrip = dummyStrip;
+ mDummyDivert = dummyDivert;
+ }
+
@Override
public String toString() {
String out = "mKeyId: " + mKeyId + ", ";
out += "mFlags: " + mFlags + ", ";
- out += "mExpiry: " + mExpiry;
+ out += "mExpiry: " + mExpiry + ", ";
+ out += "mDummyStrip: " + mDummyStrip + ", ";
+ out += "mDummyDivert: [" + (mDummyDivert == null ? 0 : mDummyDivert.length) + " bytes]";
return out;
}
@@ -174,7 +216,6 @@ public class SaveKeyringParcel implements Parcelable {
mRevokeUserIds = source.createStringArrayList();
mRevokeSubKeys = (ArrayList<Long>) source.readSerializable();
- mStripSubKeys = (ArrayList<Long>) source.readSerializable();
}
@Override
@@ -197,7 +238,6 @@ public class SaveKeyringParcel implements Parcelable {
destination.writeStringList(mRevokeUserIds);
destination.writeSerializable(mRevokeSubKeys);
- destination.writeSerializable(mStripSubKeys);
}
public static final Creator<SaveKeyringParcel> CREATOR = new Creator<SaveKeyringParcel>() {
@@ -225,8 +265,7 @@ public class SaveKeyringParcel implements Parcelable {
out += "mChangeSubKeys: " + mChangeSubKeys + "\n";
out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n";
out += "mRevokeUserIds: " + mRevokeUserIds + "\n";
- out += "mRevokeSubKeys: " + mRevokeSubKeys + "\n";
- out += "mStripSubKeys: " + mStripSubKeys;
+ out += "mRevokeSubKeys: " + mRevokeSubKeys;
return out;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java
new file mode 100644
index 000000000..e6c2542a2
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/BaseActivity.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.R;
+
+/**
+ * Setups Toolbar
+ */
+public abstract class BaseActivity extends ActionBarActivity {
+ protected Toolbar mToolbar;
+ protected View mStatusBar;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ initLayout();
+ initToolbar();
+ }
+
+ protected abstract void initLayout();
+
+ protected void initToolbar() {
+ mToolbar = (Toolbar) findViewById(R.id.toolbar);
+ if (mToolbar != null) {
+ setSupportActionBar(mToolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ mStatusBar = findViewById(R.id.status_bar);
+ }
+
+ protected void setActionBarIcon(int iconRes) {
+ mToolbar.setNavigationIcon(iconRes);
+ }
+
+ /**
+ * Inflate custom design to look like a full screen dialog, as specified in Material Design Guidelines
+ * see http://www.google.com/design/spec/components/dialogs.html#dialogs-full-screen-dialogs
+ */
+ protected void setFullScreenDialogDoneClose(int doneText, View.OnClickListener doneOnClickListener,
+ View.OnClickListener cancelOnClickListener) {
+ setActionBarIcon(R.drawable.ic_close_white_24dp);
+
+ // Inflate the custom action bar view
+ final LayoutInflater inflater = (LayoutInflater) getSupportActionBar().getThemedContext()
+ .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
+ final View customActionBarView = inflater.inflate(R.layout.full_screen_dialog, null);
+
+ TextView firstTextView = ((TextView) customActionBarView.findViewById(R.id.full_screen_dialog_done_text));
+ firstTextView.setText(doneText);
+ customActionBarView.findViewById(R.id.full_screen_dialog_done).setOnClickListener(
+ doneOnClickListener);
+
+ getSupportActionBar().setDisplayShowCustomEnabled(true);
+ getSupportActionBar().setDisplayShowTitleEnabled(true);
+ getSupportActionBar().setCustomView(customActionBarView, new ActionBar.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT,
+ Gravity.END));
+ mToolbar.setNavigationOnClickListener(cancelOnClickListener);
+ }
+
+ /**
+ * Close button only
+ */
+ protected void setFullScreenDialogClose(View.OnClickListener cancelOnClickListener) {
+ setActionBarIcon(R.drawable.ic_close_white_24dp);
+ getSupportActionBar().setDisplayShowTitleEnabled(true);
+ mToolbar.setNavigationOnClickListener(cancelOnClickListener);
+ }
+
+ /**
+ * Inflate custom design with two buttons using drawables.
+ * This does not conform to the Material Design Guidelines, but we deviate here as this is used
+ * to indicate "Allow access"/"Disallow access" to the API, which must be clearly indicated
+ */
+ protected void setFullScreenDialogTwoButtons(int firstText, int firstDrawableId, View.OnClickListener firstOnClickListener,
+ int secondText, int secondDrawableId, View.OnClickListener secondOnClickListener) {
+
+ // Inflate the custom action bar view
+ final LayoutInflater inflater = (LayoutInflater) getSupportActionBar().getThemedContext()
+ .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
+ final View customActionBarView = inflater.inflate(
+ R.layout.full_screen_dialog_2, null);
+
+ TextView firstTextView = ((TextView) customActionBarView.findViewById(R.id.actionbar_done_text));
+ firstTextView.setText(firstText);
+ firstTextView.setCompoundDrawablesWithIntrinsicBounds(firstDrawableId, 0, 0, 0);
+ customActionBarView.findViewById(R.id.actionbar_done).setOnClickListener(
+ firstOnClickListener);
+ TextView secondTextView = ((TextView) customActionBarView.findViewById(R.id.actionbar_cancel_text));
+ secondTextView.setText(secondText);
+ secondTextView.setCompoundDrawablesWithIntrinsicBounds(secondDrawableId, 0, 0, 0);
+ customActionBarView.findViewById(R.id.actionbar_cancel).setOnClickListener(
+ secondOnClickListener);
+
+ // Show the custom action bar view and hide the normal Home icon and title.
+ getSupportActionBar().setDisplayShowTitleEnabled(false);
+ getSupportActionBar().setDisplayShowHomeEnabled(false);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(false);
+ getSupportActionBar().setDisplayShowCustomEnabled(true);
+ getSupportActionBar().setCustomView(customActionBarView, new ActionBar.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvancedActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java
index f49f8e7cf..b7c80c1ed 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvancedActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintActivity.java
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2013-2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2013 Bahtiar 'kalkin' Gadimov
+ * Copyright (C) 2015 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
@@ -20,55 +19,43 @@ package org.sufficientlysecure.keychain.ui;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
import android.view.View;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
-import org.sufficientlysecure.keychain.util.ExportHelper;
import org.sufficientlysecure.keychain.util.Log;
-public class ViewKeyAdvancedActivity extends ActionBarActivity {
+public class CertifyFingerprintActivity extends BaseActivity {
- ExportHelper mExportHelper;
- ProviderHelper mProviderHelper;
+ protected Uri mDataUri;
@Override
- protected void onCreate(Bundle savedInstanceState) {
+ public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mExportHelper = new ExportHelper(this);
- mProviderHelper = new ProviderHelper(this);
-
- // Inflate a "Done" custom action bar
- ActionBarHelper.setOneButtonView(getSupportActionBar(),
- R.string.btn_okay, R.drawable.ic_action_done,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // "Done"
- finish();
- }
- }
- );
-
- setContentView(R.layout.view_key_advanced_activity);
-
- Uri dataUri = getIntent().getData();
- if (dataUri == null) {
+ mDataUri = getIntent().getData();
+ if (mDataUri == null) {
Log.e(Constants.TAG, "Data missing. Should be uri of key!");
finish();
return;
}
- Log.i(Constants.TAG, "mDataUri: " + dataUri.toString());
+ setFullScreenDialogClose(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
- startFragment(savedInstanceState, dataUri);
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ startFragment(savedInstanceState, mDataUri);
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.certify_fingerprint_activity);
+ }
private void startFragment(Bundle savedInstanceState, Uri dataUri) {
// However, if we're being restored from a previous state,
@@ -79,12 +66,12 @@ public class ViewKeyAdvancedActivity extends ActionBarActivity {
}
// Create an instance of the fragment
- ViewKeyAdvancedFragment frag = ViewKeyAdvancedFragment.newInstance(dataUri);
+ CertifyFingerprintFragment frag = CertifyFingerprintFragment.newInstance(dataUri);
// Add the fragment to the 'fragment_container' FrameLayout
// NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
getSupportFragmentManager().beginTransaction()
- .replace(R.id.view_key_advanced_fragment, frag)
+ .replace(R.id.certify_fingerprint_fragment, frag)
.commitAllowingStateLoss();
// do it immediately!
getSupportFragmentManager().executePendingTransactions();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java
new file mode 100644
index 000000000..a6b8a0e85
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyFingerprintFragment.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+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.pgp.exception.PgpKeyNotFoundException;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.Log;
+
+
+public class CertifyFingerprintFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ static final int REQUEST_CERTIFY = 1;
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private TextView mFingerprint;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+
+ private Uri mDataUri;
+
+ private View mActionNo;
+ private View mActionYes;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static CertifyFingerprintFragment newInstance(Uri dataUri) {
+ CertifyFingerprintFragment frag = new CertifyFingerprintFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_DATA_URI, dataUri);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.certify_fingerprint_fragment, getContainer());
+
+ mActionNo = view.findViewById(R.id.certify_fingerprint_button_no);
+ mActionYes = view.findViewById(R.id.certify_fingerprint_button_yes);
+
+ mFingerprint = (TextView) view.findViewById(R.id.certify_fingerprint_fingerprint);
+
+ mActionNo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().finish();
+ }
+ });
+ mActionYes.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ certify(mDataUri);
+ }
+ });
+
+ return root;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+
+ loadData(dataUri);
+ }
+
+ private void loadData(Uri dataUri) {
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+ }
+
+ static final String[] UNIFIED_PROJECTION = new String[]{
+ KeyRings._ID, KeyRings.FINGERPRINT,
+
+ };
+ static final int INDEX_UNIFIED_FINGERPRINT = 1;
+
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+
+ byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT);
+ String fingerprint = KeyFormattingUtils.convertFingerprintToHex(fingerprintBlob);
+ mFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fingerprint));
+
+ break;
+ }
+ }
+
+ }
+ setContentShown(true);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader<Cursor> loader) {
+ }
+
+ private void certify(Uri dataUri) {
+ long keyId = 0;
+ try {
+ keyId = new ProviderHelper(getActivity())
+ .getCachedPublicKeyRing(dataUri)
+ .extractOrGetMasterKeyId();
+ } catch (PgpKeyNotFoundException e) {
+ Log.e(Constants.TAG, "key not found!", e);
+ }
+ Intent certifyIntent = new Intent(getActivity(), CertifyKeyActivity.class);
+ certifyIntent.putExtras(getActivity().getIntent());
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{keyId});
+ startActivityForResult(certifyIntent, REQUEST_CERTIFY);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // always just pass this one through
+ if (requestCode == REQUEST_CERTIFY) {
+ getActivity().setResult(resultCode, data);
+ getActivity().finish();
+ return;
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
index a97e73934..1fb88b182 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
@@ -18,24 +18,19 @@
package org.sufficientlysecure.keychain.ui;
-import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
-
import org.sufficientlysecure.keychain.R;
/**
* Signs the specified public key with the specified secret master key
*/
-public class CertifyKeyActivity extends ActionBarActivity {
+public class CertifyKeyActivity extends BaseActivity {
public static final String EXTRA_RESULT = "operation_result";
public static final String EXTRA_KEY_IDS = "extra_key_ids";
public static final String EXTRA_CERTIFY_KEY_ID = "certify_key_id";
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
+ protected void initLayout() {
setContentView(R.layout.certify_key_activity);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
index 841485c7c..e1467ec61 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
@@ -31,6 +31,7 @@ import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.Parcel;
+import android.os.Parcelable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -94,6 +95,7 @@ public class CertifyKeyFragment extends LoaderFragment
private static final int INDEX_IS_REVOKED = 4;
private MultiUserIdsAdapter mUserIdsAdapter;
+ private Messenger mPassthroughMessenger;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
@@ -109,6 +111,9 @@ public class CertifyKeyFragment extends LoaderFragment
return;
}
+ mPassthroughMessenger = getActivity().getIntent().getParcelableExtra(
+ KeychainIntentService.EXTRA_MESSENGER);
+
// preselect certify key id if given
long certifyKeyId = getActivity().getIntent().getLongExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, Constants.key.none);
if (certifyKeyId != Constants.key.none) {
@@ -234,7 +239,7 @@ public class CertifyKeyFragment extends LoaderFragment
long lastMasterKeyId = 0;
String lastName = "";
- ArrayList<String> uids = new ArrayList<String>();
+ ArrayList<String> uids = new ArrayList<>();
boolean header = true;
@@ -332,7 +337,6 @@ public class CertifyKeyFragment extends LoaderFragment
}
}
-
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
@@ -362,51 +366,63 @@ public class CertifyKeyFragment extends LoaderFragment
return;
}
+ Bundle data = new Bundle();
+ {
+ // fill values for this action
+ CertifyActionsParcel parcel = new CertifyActionsParcel(mSignMasterKeyId);
+ parcel.mCertifyActions.addAll(certifyActions);
+
+ data.putParcelable(KeychainIntentService.CERTIFY_PARCEL, parcel);
+ if (mUploadKeyCheckbox.isChecked()) {
+ String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver();
+ data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, keyserver);
+ }
+ }
+
// Send all information needed to service to sign key in other thread
Intent intent = new Intent(getActivity(), KeychainIntentService.class);
-
intent.setAction(KeychainIntentService.ACTION_CERTIFY_KEYRING);
-
- // fill values for this action
- CertifyActionsParcel parcel = new CertifyActionsParcel(mSignMasterKeyId);
- parcel.mCertifyActions.addAll(certifyActions);
-
- Bundle data = new Bundle();
- data.putParcelable(KeychainIntentService.CERTIFY_PARCEL, parcel);
- if (mUploadKeyCheckbox.isChecked()) {
- String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver();
- data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, keyserver);
- }
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
- // Message is received after signing is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(),
- getString(R.string.progress_certifying), ProgressDialog.STYLE_SPINNER, true) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- Bundle data = message.getData();
- CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
-
- Intent intent = new Intent();
- intent.putExtra(CertifyResult.EXTRA_RESULT, result);
- getActivity().setResult(Activity.RESULT_OK, intent);
- getActivity().finish();
+ if (mPassthroughMessenger != null) {
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, mPassthroughMessenger);
+ } else {
+
+ // Message is received after signing is done in KeychainIntentService
+ KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(),
+ getString(R.string.progress_certifying), ProgressDialog.STYLE_SPINNER, true) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ Bundle data = message.getData();
+ CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
+
+ Intent intent = new Intent();
+ intent.putExtra(CertifyResult.EXTRA_RESULT, result);
+ getActivity().setResult(Activity.RESULT_OK, intent);
+ getActivity().finish();
+ }
}
- }
- };
+ };
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+ // 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());
+ // show progress dialog
+ saveHandler.showProgressDialog(getActivity());
+ }
// start service with intent
getActivity().startService(intent);
+
+ if (mPassthroughMessenger != null) {
+ getActivity().setResult(Activity.RESULT_OK);
+ getActivity().finish();
+ }
+
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
index 0d8905c5b..f0ef8b9ef 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
@@ -61,7 +61,7 @@ public class ConsolidateDialogActivity extends FragmentActivity {
/* don't care about the results (for now?)
// get returned data bundle
- Bundle returnData = message.getData();
+ Bundle returnData = message.getInputData();
if (returnData == null) {
return;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
index 534ac5811..62c38d136 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
@@ -20,11 +20,10 @@ package org.sufficientlysecure.keychain.ui;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
-import android.support.v7.app.ActionBarActivity;
import org.sufficientlysecure.keychain.R;
-public class CreateKeyActivity extends ActionBarActivity {
+public class CreateKeyActivity extends BaseActivity {
public static final String EXTRA_NAME = "name";
public static final String EXTRA_EMAIL = "email";
@@ -37,8 +36,6 @@ public class CreateKeyActivity extends ActionBarActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.create_key_activity);
-
// pass extras into fragment
CreateKeyInputFragment frag =
CreateKeyInputFragment.newInstance(
@@ -48,6 +45,11 @@ public class CreateKeyActivity extends ActionBarActivity {
loadFragment(null, frag, FRAG_ACTION_START);
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.create_key_activity);
+ }
+
public void loadFragment(Bundle savedInstanceState, Fragment fragment, int action) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
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 2804a5ce6..6e0115342 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
@@ -35,17 +35,16 @@ import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
-import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;
-import org.sufficientlysecure.keychain.util.Preferences;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;
-import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
public class CreateKeyFinalFragment extends Fragment {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java
index 6079062a7..8aa9fa6db 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyInputFragment.java
@@ -89,7 +89,7 @@ public class CreateKeyInputFragment extends Fragment {
mEmailEdit.setThreshold(1); // Start working from first character
mEmailEdit.setAdapter(
- new ArrayAdapter<String>
+ new ArrayAdapter<>
(getActivity(), android.R.layout.simple_spinner_dropdown_item,
ContactHelper.getPossibleUserEmails(getActivity())
)
@@ -124,7 +124,7 @@ public class CreateKeyInputFragment extends Fragment {
mNameEdit.setThreshold(1); // Start working from first character
mNameEdit.setAdapter(
- new ArrayAdapter<String>
+ new ArrayAdapter<>
(getActivity(), android.R.layout.simple_spinner_dropdown_item,
ContactHelper.getPossibleUserNames(getActivity())
)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
deleted file mode 100644
index 681e22e1e..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
- *
- * 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;
-
-import android.annotation.TargetApi;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
-import android.os.Bundle;
-import android.view.View;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
-import org.sufficientlysecure.keychain.pgp.PgpHelper;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.ui.util.SubtleAttentionSeeker;
-
-import java.util.regex.Matcher;
-
-public class DecryptActivity extends DrawerActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.decrypt_activity);
-
- activateDrawerNavigation(savedInstanceState);
-
- View actionFile = findViewById(R.id.decrypt_files);
- View actionFromClipboard = findViewById(R.id.decrypt_from_clipboard);
-
- actionFile.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent filesDecrypt = new Intent(DecryptActivity.this, DecryptFilesActivity.class);
- filesDecrypt.setAction(DecryptFilesActivity.ACTION_DECRYPT_DATA_OPEN);
- startActivity(filesDecrypt);
- }
- });
-
- actionFromClipboard.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent clipboardDecrypt = new Intent(DecryptActivity.this, DecryptTextActivity.class);
- clipboardDecrypt.setAction(DecryptTextActivity.ACTION_DECRYPT_FROM_CLIPBOARD);
- startActivityForResult(clipboardDecrypt, 0);
- }
- });
- }
-
- @TargetApi(VERSION_CODES.HONEYCOMB)
- @Override
- protected void onResume() {
- super.onResume();
-
- // This is an eye candy ice cream sandwich feature, nvm on versions below
- if (Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
-
- // get text from clipboard
- final CharSequence clipboardText =
- ClipboardReflection.getClipboardText(DecryptActivity.this);
-
- // if it's null, nothing to do here /o/
- if (clipboardText == null) {
- return;
- }
-
- new AsyncTask<String, Void, Boolean>() {
- @Override
- protected Boolean doInBackground(String... clipboardText) {
-
- // see if it looks like a pgp thing
- Matcher matcher = PgpHelper.PGP_MESSAGE.matcher(clipboardText[0]);
- boolean animate = matcher.matches();
-
- // see if it looks like another pgp thing
- if (!animate) {
- matcher = PgpHelper.PGP_CLEARTEXT_SIGNATURE.matcher(clipboardText[0]);
- animate = matcher.matches();
- }
- return animate;
- }
-
- @Override
- protected void onPostExecute(Boolean animate) {
- super.onPostExecute(animate);
-
- // if so, animate the clipboard icon just a bit~
- if (animate) {
- SubtleAttentionSeeker.tada(findViewById(R.id.clipboard_icon), 1.5f).start();
- }
- }
- }.execute(clipboardText.toString());
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // if a result has been returned, display a notify
- if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
- OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
- result.createNotify(this).show();
- } else {
- super.onActivityResult(requestCode, resultCode, data);
- }
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java
index 9d972d8c0..89dd4970b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesActivity.java
@@ -20,14 +20,13 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
import org.sufficientlysecure.keychain.util.Log;
-public class DecryptFilesActivity extends ActionBarActivity {
+public class DecryptFilesActivity extends BaseActivity {
/* Intents */
public static final String ACTION_DECRYPT_DATA = OpenKeychainIntents.DECRYPT_DATA;
@@ -41,12 +40,15 @@ public class DecryptFilesActivity extends ActionBarActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.decrypt_files_activity);
-
// Handle intent actions
handleActions(savedInstanceState, getIntent());
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.decrypt_files_activity);
+ }
+
/**
* Handles all actions with this intent
*
@@ -86,7 +88,7 @@ public class DecryptFilesActivity extends ActionBarActivity {
loadFragment(savedInstanceState, null, true);
} else if (ACTION_DECRYPT_DATA.equals(action)) {
Log.e(Constants.TAG,
- "Include an Uri with setData() in your Intent!");
+ "Include an Uri with setInputData() in your Intent!");
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
index 691f1c240..5606523be 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
@@ -35,13 +35,13 @@ import android.widget.TextView;
import org.openintents.openpgp.util.OpenPgpApi;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.FileHelper;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
-import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.util.FileHelper;
+import org.sufficientlysecure.keychain.util.Log;
import java.io.File;
@@ -310,7 +310,7 @@ public class DecryptFilesFragment extends DecryptFragment {
// A future open after decryption feature
if () {
Intent viewFile = new Intent(Intent.ACTION_VIEW);
- viewFile.setData(mOutputUri);
+ viewFile.setInputData(mOutputUri);
startActivity(viewFile);
}
*/
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 7f06d36e8..8723c7255 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
@@ -27,9 +27,9 @@ import android.widget.TextView;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
public abstract class DecryptFragment extends Fragment {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java
index 2da76088a..81a8a2ac4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextActivity.java
@@ -20,22 +20,21 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
-import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.operations.results.SingletonResult;
-import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.util.Log;
import java.util.regex.Matcher;
-public class DecryptTextActivity extends ActionBarActivity {
+public class DecryptTextActivity extends BaseActivity {
/* Intents */
public static final String ACTION_DECRYPT_TEXT = OpenKeychainIntents.DECRYPT_TEXT;
@@ -50,12 +49,15 @@ public class DecryptTextActivity extends ActionBarActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.decrypt_text_activity);
-
// Handle intent actions
handleActions(savedInstanceState, getIntent());
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.decrypt_text_activity);
+ }
+
/**
* Fixing broken PGP MESSAGE Strings coming from GMail/AOSP Mail
*/
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
index fa7abf0f5..a15b23c06 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
@@ -34,13 +34,15 @@ import org.openintents.openpgp.util.OpenPgpApi;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ShareHelper;
+import java.io.UnsupportedEncodingException;
+
public class DecryptTextFragment extends DecryptFragment {
public static final String ARG_CIPHERTEXT = "ciphertext";
@@ -111,7 +113,7 @@ public class DecryptTextFragment extends DecryptFragment {
Intent prototype = createSendIntent(text);
String title = getString(R.string.title_share_file);
- // we don't want to decrypt the decypted, no inception ;)
+ // we don't want to decrypt the decrypted, no inception ;)
String[] blacklist = new String[]{
Constants.PACKAGE_NAME + ".ui.DecryptTextActivity",
"org.thialfihar.android.apg.ui.DecryptActivity"
@@ -194,7 +196,18 @@ public class DecryptTextFragment extends DecryptFragment {
byte[] decryptedMessage = returnData
.getByteArray(KeychainIntentService.RESULT_DECRYPTED_BYTES);
- mText.setText(new String(decryptedMessage));
+ String displayMessage;
+ if (pgpResult.getCharset() != null) {
+ try {
+ displayMessage = new String(decryptedMessage, pgpResult.getCharset());
+ } catch (UnsupportedEncodingException e) {
+ // if we can't decode properly, just fall back to utf-8
+ displayMessage = new String(decryptedMessage);
+ }
+ } else {
+ displayMessage = new String(decryptedMessage);
+ }
+ mText.setText(displayMessage);
pgpResult.createNotify(getActivity()).show();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
deleted file mode 100644
index da46de486..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
+++ /dev/null
@@ -1,306 +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;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.v4.app.ActionBarDrawerToggle;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v4.widget.FixedDrawerLayout;
-import android.support.v7.app.ActionBarActivity;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-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 org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-
-public class DrawerActivity extends ActionBarActivity {
- private FixedDrawerLayout mDrawerLayout;
- private ListView mDrawerList;
- private ActionBarDrawerToggle mDrawerToggle;
-
- private CharSequence mDrawerTitle;
- private CharSequence mTitle;
- private boolean mIsDrawerLocked = false;
-
- private Class mSelectedItem;
-
- private static final int MENU_ID_PREFERENCE = 222;
- private static final int MENU_ID_HELP = 223;
-
- protected void deactivateDrawerNavigation() {
- ((DrawerLayout) findViewById(R.id.drawer_layout)).setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
- }
-
- protected void activateDrawerNavigation(Bundle savedInstanceState) {
- mDrawerTitle = getString(R.string.app_name);
- mDrawerLayout = (FixedDrawerLayout) findViewById(R.id.drawer_layout);
- mDrawerList = (ListView) findViewById(R.id.left_drawer);
- ViewGroup viewGroup = (ViewGroup) findViewById(R.id.content_frame);
- int leftMarginLoaded = ((ViewGroup.MarginLayoutParams) viewGroup.getLayoutParams()).leftMargin;
- int leftMarginInTablets = (int) getResources().getDimension(R.dimen.drawer_size);
- int errorInMarginAllowed = 5;
-
- // if the left margin of the loaded layout is close to the
- // one used in tablets then set drawer as open and locked
- if (Math.abs(leftMarginLoaded - leftMarginInTablets) < errorInMarginAllowed) {
- mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, mDrawerList);
- mDrawerLayout.setScrimColor(Color.TRANSPARENT);
- mIsDrawerLocked = true;
- } else {
- // set a custom shadow that overlays the main content when the drawer opens
- mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
- mIsDrawerLocked = false;
- }
-
- NavItem mItemIconTexts[] = new NavItem[]{
- new NavItem(R.drawable.ic_action_accounts, getString(R.string.nav_keys)),
- new NavItem(R.drawable.ic_action_secure, getString(R.string.nav_encrypt_text)),
- new NavItem(R.drawable.ic_action_secure, getString(R.string.nav_encrypt_files)),
- new NavItem(R.drawable.ic_action_not_secure, getString(R.string.nav_decrypt)),
- new NavItem(R.drawable.ic_action_view_as_list, getString(R.string.nav_apps))};
-
- mDrawerList.setAdapter(new NavigationDrawerAdapter(this, R.layout.drawer_list_item,
- mItemIconTexts));
-
- mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
-
- // enable ActionBar app icon to behave as action to toggle nav drawer
- // if the drawer is not locked
- if (!mIsDrawerLocked) {
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- getSupportActionBar().setHomeButtonEnabled(true);
- }
-
- // ActionBarDrawerToggle ties together the the proper interactions
- // between the sliding drawer and the action bar app icon
- mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
- mDrawerLayout, /* DrawerLayout object */
- R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
- R.string.drawer_open, /* "open drawer" description for accessibility */
- R.string.drawer_close /* "close drawer" description for accessibility */
- ) {
- public void onDrawerClosed(View view) {
- getSupportActionBar().setTitle(mTitle);
-
- callIntentForDrawerItem(mSelectedItem);
- }
-
- public void onDrawerOpened(View drawerView) {
- mTitle = getSupportActionBar().getTitle();
- getSupportActionBar().setTitle(mDrawerTitle);
- // creates call to onPrepareOptionsMenu()
- supportInvalidateOptionsMenu();
- }
- };
-
- if (!mIsDrawerLocked) {
- mDrawerLayout.setDrawerListener(mDrawerToggle);
- } else {
- // If the drawer is locked open make it un-focusable
- // so that it doesn't consume all the Back button presses
- mDrawerLayout.setFocusableInTouchMode(false);
- }
- }
-
- /**
- * Uses startActivity to call the Intent of the given class
- *
- * @param drawerItem the class of the drawer item you want to load. Based on Constants.DrawerItems.*
- */
- public void callIntentForDrawerItem(Class drawerItem) {
- // creates call to onPrepareOptionsMenu()
- supportInvalidateOptionsMenu();
-
- // call intent activity if selected
- if (drawerItem != null) {
- finish();
- overridePendingTransition(0, 0);
-
- Intent intent = new Intent(this, drawerItem);
- startActivity(intent);
-
- // disable animation of activity start
- overridePendingTransition(0, 0);
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- if (mDrawerToggle == null) {
- return super.onCreateOptionsMenu(menu);
- }
-
- menu.add(42, MENU_ID_PREFERENCE, 100, R.string.menu_preferences);
- menu.add(42, MENU_ID_HELP, 101, R.string.menu_help);
-
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (mDrawerToggle == null) {
- return super.onOptionsItemSelected(item);
- }
-
- // The action bar home/up action should open or close the drawer.
- // ActionBarDrawerToggle will take care of this.
- if (mDrawerToggle.onOptionsItemSelected(item)) {
- return true;
- }
-
- switch (item.getItemId()) {
- case MENU_ID_PREFERENCE: {
- Intent intent = new Intent(this, PreferencesActivity.class);
- startActivity(intent);
- return true;
- }
- case MENU_ID_HELP: {
- Intent intent = new Intent(this, HelpActivity.class);
- startActivity(intent);
- return true;
- }
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- /**
- * The click listener for ListView in the navigation drawer
- */
- private class DrawerItemClickListener implements ListView.OnItemClickListener {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- selectItem(position);
- }
- }
-
- private void selectItem(int position) {
- // update selected item and title, then close the drawer
- mDrawerList.setItemChecked(position, true);
- // set selected class
- mSelectedItem = Constants.DrawerItems.ARRAY[position];
-
- // setTitle(mDrawerTitles[position]);
- // If drawer isn't locked just close the drawer and
- // it will move to the selected item by itself (via drawer toggle listener)
- if (!mIsDrawerLocked) {
- mDrawerLayout.closeDrawer(mDrawerList);
- // else move to the selected item yourself
- } else {
- callIntentForDrawerItem(mSelectedItem);
- }
- }
-
- /**
- * When using the ActionBarDrawerToggle, you must call it during onPostCreate() and
- * onConfigurationChanged()...
- */
- @Override
- protected void onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- // Sync the toggle state after onRestoreInstanceState has occurred.
- if (mDrawerToggle != null) {
- mDrawerToggle.syncState();
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- // Pass any configuration change to the drawer toggles
- if (mDrawerToggle != null) {
- mDrawerToggle.onConfigurationChanged(newConfig);
- }
- }
-
- private class NavItem {
- public int icon; // res-id
- public String title;
-
- /**
- * NavItem constructor
- *
- * @param icon The icons resource-id
- * @param title The title of the menu entry
- */
- public NavItem(int icon, String title) {
- super();
- this.icon = icon;
- this.title = title;
- }
- }
-
- private class NavigationDrawerAdapter extends ArrayAdapter<NavItem> {
- Context mContext;
- int mLayoutResourceId;
- NavItem mData[] = null;
-
- public NavigationDrawerAdapter(Context context, int layoutResourceId, NavItem[] data) {
- super(context, layoutResourceId, data);
- this.mLayoutResourceId = layoutResourceId;
- this.mContext = context;
- this.mData = data;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View row = convertView;
- NavItemHolder holder;
-
- if (row == null) {
- LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
- row = inflater.inflate(mLayoutResourceId, parent, false);
-
- holder = new NavItemHolder();
- holder.mImg = (ImageView) row.findViewById(R.id.drawer_item_icon);
- holder.mTxtTitle = (TextView) row.findViewById(R.id.drawer_item_text);
-
- row.setTag(holder);
- } else {
- holder = (NavItemHolder) row.getTag();
- }
-
- NavItem item = mData[position];
- holder.mTxtTitle.setText(item.title);
- holder.mImg.setImageResource(item.icon);
-
- return row;
- }
-
- }
-
- static class NavItemHolder {
- ImageView mImg;
- TextView mTxtTitle;
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
index 98049d89b..6dc2994cf 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
@@ -19,14 +19,13 @@ package org.sufficientlysecure.keychain.ui;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.util.Log;
-public class EditKeyActivity extends ActionBarActivity {
+public class EditKeyActivity extends BaseActivity {
public static final String EXTRA_SAVE_KEYRING_PARCEL = "save_keyring_parcel";
@@ -36,8 +35,6 @@ public class EditKeyActivity extends ActionBarActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.edit_key_activity);
-
Uri dataUri = getIntent().getData();
SaveKeyringParcel saveKeyringParcel = getIntent().getParcelableExtra(EXTRA_SAVE_KEYRING_PARCEL);
if (dataUri == null && saveKeyringParcel == null) {
@@ -49,6 +46,11 @@ public class EditKeyActivity extends ActionBarActivity {
loadFragment(savedInstanceState, dataUri, saveKeyringParcel);
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.edit_key_activity);
+ }
+
private void loadFragment(Bundle savedInstanceState, Uri dataUri, SaveKeyringParcel saveKeyringParcel) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
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 afe6afb3c..25ca6e8fd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
@@ -29,7 +29,6 @@ import android.os.Messenger;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
-import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -55,6 +54,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.ChangeUnlockParcel;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyChange;
import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter;
import org.sufficientlysecure.keychain.ui.adapter.SubkeysAddedAdapter;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
@@ -65,7 +65,6 @@ 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.SetPassphraseDialogFragment;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
@@ -147,10 +146,8 @@ public class EditKeyFragment extends LoaderFragment implements
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
-
- // Inflate a "Done"/"Cancel" custom action bar view
- ActionBarHelper.setTwoButtonView(((ActionBarActivity) getActivity()).getSupportActionBar(),
- R.string.btn_save, R.drawable.ic_action_save,
+ ((EditKeyActivity) getActivity()).setFullScreenDialogDoneClose(
+ R.string.btn_save,
new OnClickListener() {
@Override
public void onClick(View v) {
@@ -161,16 +158,13 @@ public class EditKeyFragment extends LoaderFragment implements
saveInDatabase(mCurrentPassphrase);
}
}
- }, R.string.menu_key_edit_cancel, R.drawable.ic_action_cancel,
- new OnClickListener() {
+ }, new OnClickListener() {
@Override
public void onClick(View v) {
- // cancel
getActivity().setResult(Activity.RESULT_CANCELED);
getActivity().finish();
}
- }
- );
+ });
Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
SaveKeyringParcel saveKeyringParcel = getArguments().getParcelable(ARG_SAVE_KEYRING_PARCEL);
@@ -230,10 +224,7 @@ public class EditKeyFragment extends LoaderFragment implements
mSaveKeyringParcel = new SaveKeyringParcel(masterKeyId, keyRing.getFingerprint());
mPrimaryUserId = keyRing.getPrimaryUserIdWithFallback();
- } catch (PgpKeyNotFoundException e) {
- finishWithError(LogType.MSG_EK_ERROR_NOT_FOUND);
- return;
- } catch (NotFoundException e) {
+ } catch (PgpKeyNotFoundException | NotFoundException e) {
finishWithError(LogType.MSG_EK_ERROR_NOT_FOUND);
return;
}
@@ -395,8 +386,8 @@ public class EditKeyFragment extends LoaderFragment implements
// cache new returned passphrase!
mSaveKeyringParcel.mNewUnlock = new ChangeUnlockParcel(
- data.getString(SetPassphraseDialogFragment.MESSAGE_NEW_PASSPHRASE),
- null
+ data.getString(SetPassphraseDialogFragment.MESSAGE_NEW_PASSPHRASE),
+ null
);
}
}
@@ -478,12 +469,13 @@ public class EditKeyFragment extends LoaderFragment implements
}
break;
case EditSubkeyDialogFragment.MESSAGE_STRIP:
- // toggle
- if (mSaveKeyringParcel.mStripSubKeys.contains(keyId)) {
- mSaveKeyringParcel.mStripSubKeys.remove(keyId);
- } else {
- mSaveKeyringParcel.mStripSubKeys.add(keyId);
+ SubkeyChange change = mSaveKeyringParcel.getSubkeyChange(keyId);
+ if (change == null) {
+ mSaveKeyringParcel.mChangeSubKeys.add(new SubkeyChange(keyId, true, null));
+ break;
}
+ // toggle
+ change.mDummyStrip = !change.mDummyStrip;
break;
}
getLoaderManager().getLoader(LOADER_ID_SUBKEYS).forceLoad();
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 b9058a37d..0d7e6056e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
@@ -8,13 +8,15 @@ import android.os.Messenger;
import org.openintents.openpgp.util.OpenPgpApi;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.PgpSignEncryptResult;
+import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
+import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
import java.util.Date;
-public abstract class EncryptActivity extends DrawerActivity {
+public abstract class EncryptActivity extends BaseActivity {
public static final int REQUEST_CODE_PASSPHRASE = 0x00008001;
public static final int REQUEST_CODE_NFC = 0x00008002;
@@ -82,7 +84,10 @@ public abstract class EncryptActivity extends DrawerActivity {
// Send all information needed to service to edit key in other thread
Intent intent = new Intent(this, KeychainIntentService.class);
intent.setAction(KeychainIntentService.ACTION_SIGN_ENCRYPT);
- intent.putExtra(KeychainIntentService.EXTRA_DATA, createEncryptBundle());
+
+ Bundle data = new Bundle();
+ data.putParcelable(KeychainIntentService.SIGN_ENCRYPT_PARCEL, createEncryptBundle());
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
// Message is received after encrypting is done in KeychainIntentService
KeychainIntentServiceHandler serviceHandler = new KeychainIntentServiceHandler(this,
@@ -92,28 +97,31 @@ public abstract class EncryptActivity extends DrawerActivity {
super.handleMessage(message);
if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- SignEncryptResult pgpResult =
+ SignEncryptResult result =
message.getData().getParcelable(SignEncryptResult.EXTRA_RESULT);
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
- SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
+ PgpSignEncryptResult pgpResult = result.getPending();
+
+ if (pgpResult != null && pgpResult.isPending()) {
+ if ((pgpResult.getResult() & PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
+ PgpSignEncryptResult.RESULT_PENDING_PASSPHRASE) {
startPassphraseDialog(pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
- SignEncryptResult.RESULT_PENDING_NFC) {
+ } else if ((pgpResult.getResult() & PgpSignEncryptResult.RESULT_PENDING_NFC) ==
+ PgpSignEncryptResult.RESULT_PENDING_NFC) {
mNfcTimestamp = pgpResult.getNfcTimestamp();
- startNfcSign(pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
+ startNfcSign(pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(),
+ pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
} else {
throw new RuntimeException("Unhandled pending result!");
}
return;
}
- if (pgpResult.success()) {
- onEncryptSuccess(message, pgpResult);
+ if (result.success()) {
+ onEncryptSuccess(result);
} else {
- pgpResult.createNotify(EncryptActivity.this).show();
+ result.createNotify(EncryptActivity.this).show();
}
// no matter the result, reset parameters
@@ -136,8 +144,8 @@ public abstract class EncryptActivity extends DrawerActivity {
protected abstract boolean inputIsValid();
- protected abstract void onEncryptSuccess(Message message, SignEncryptResult result);
+ protected abstract void onEncryptSuccess(SignEncryptResult result);
- protected abstract Bundle createEncryptBundle();
+ protected abstract SignEncryptParcel createEncryptBundle();
}
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 2d1b66daa..c5404094a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
@@ -28,7 +28,6 @@ import com.tokenautocomplete.TokenCompleteTextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
@@ -164,8 +163,8 @@ public class EncryptAsymmetricFragment extends Fragment implements EncryptActivi
private void updateEncryptionKeys() {
List<Object> objects = mEncryptKeyView.getObjects();
- List<Long> keyIds = new ArrayList<Long>();
- List<String> userIds = new ArrayList<String>();
+ List<Long> keyIds = new ArrayList<>();
+ List<String> userIds = new ArrayList<>();
for (Object object : objects) {
if (object instanceof EncryptKeyCompletionView.EncryptionKey) {
keyIds.add(((EncryptKeyCompletionView.EncryptionKey) object).getKeyId());
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java
new file mode 100644
index 000000000..a498d0763
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptDecryptOverviewFragment.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2014-2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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;
+
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.pgp.PgpHelper;
+import org.sufficientlysecure.keychain.ui.util.SubtleAttentionSeeker;
+
+import java.util.regex.Matcher;
+
+public class EncryptDecryptOverviewFragment extends Fragment {
+
+ View mEncryptFile;
+ View mEncryptText;
+ View mDecryptFile;
+ View mDecryptFromClipboard;
+ View mClipboardIcon;
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.encrypt_decrypt_overview_fragment, container, false);
+
+ mEncryptFile = view.findViewById(R.id.encrypt_files);
+ mEncryptText = view.findViewById(R.id.encrypt_text);
+ mDecryptFile = view.findViewById(R.id.decrypt_files);
+ mDecryptFromClipboard = view.findViewById(R.id.decrypt_from_clipboard);
+ mClipboardIcon = view.findViewById(R.id.clipboard_icon);
+
+ mEncryptFile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent encrypt = new Intent(getActivity(), EncryptFilesActivity.class);
+ startActivity(encrypt);
+ }
+ });
+
+ mEncryptText.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent encrypt = new Intent(getActivity(), EncryptTextActivity.class);
+ startActivity(encrypt);
+ }
+ });
+
+ mDecryptFile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent filesDecrypt = new Intent(getActivity(), DecryptFilesActivity.class);
+ filesDecrypt.setAction(DecryptFilesActivity.ACTION_DECRYPT_DATA_OPEN);
+ startActivity(filesDecrypt);
+ }
+ });
+
+ mDecryptFromClipboard.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent clipboardDecrypt = new Intent(getActivity(), DecryptTextActivity.class);
+ clipboardDecrypt.setAction(DecryptTextActivity.ACTION_DECRYPT_FROM_CLIPBOARD);
+ startActivityForResult(clipboardDecrypt, 0);
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // get text from clipboard
+ final CharSequence clipboardText =
+ ClipboardReflection.getClipboardText(getActivity());
+
+ // if it's null, nothing to do here /o/
+ if (clipboardText == null) {
+ return;
+ }
+
+ new AsyncTask<String, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(String... clipboardText) {
+
+ // see if it looks like a pgp thing
+ Matcher matcher = PgpHelper.PGP_MESSAGE.matcher(clipboardText[0]);
+ boolean animate = matcher.matches();
+
+ // see if it looks like another pgp thing
+ if (!animate) {
+ matcher = PgpHelper.PGP_CLEARTEXT_SIGNATURE.matcher(clipboardText[0]);
+ animate = matcher.matches();
+ }
+ return animate;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean animate) {
+ super.onPostExecute(animate);
+
+ // if so, animate the clipboard icon just a bit~
+ if (animate) {
+ SubtleAttentionSeeker.tada(mClipboardIcon, 1.5f).start();
+ }
+ }
+ }.execute(clipboardText.toString());
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // if a result has been returned, display a notify
+ if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(getActivity()).show();
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
index 054d85323..1286617d3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
@@ -21,7 +21,6 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.Menu;
import android.view.MenuItem;
@@ -29,14 +28,14 @@ import android.view.MenuItem;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
-import org.sufficientlysecure.keychain.util.Preferences;
-import org.sufficientlysecure.keychain.util.ShareHelper;
-import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
-import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
+import org.sufficientlysecure.keychain.util.ShareHelper;
import java.util.ArrayList;
import java.util.HashSet;
@@ -122,13 +121,13 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
@Override
public ArrayList<Uri> getInputUris() {
- if (mInputUris == null) mInputUris = new ArrayList<Uri>();
+ if (mInputUris == null) mInputUris = new ArrayList<>();
return mInputUris;
}
@Override
public ArrayList<Uri> getOutputUris() {
- if (mOutputUris == null) mOutputUris = new ArrayList<Uri>();
+ if (mOutputUris == null) mOutputUris = new ArrayList<>();
return mOutputUris;
}
@@ -170,7 +169,7 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
}
@Override
- public void onEncryptSuccess(Message message, SignEncryptResult pgpResult) {
+ public void onEncryptSuccess(SignEncryptResult result) {
if (mDeleteAfterEncrypt) {
for (Uri inputUri : mInputUris) {
DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(inputUri);
@@ -182,29 +181,25 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
if (mShareAfterEncrypt) {
// Share encrypted message/file
- startActivity(sendWithChooserExcludingEncrypt(message));
+ startActivity(sendWithChooserExcludingEncrypt());
} else {
// Save encrypted file
- pgpResult.createNotify(EncryptFilesActivity.this).show();
+ result.createNotify(EncryptFilesActivity.this).show();
}
}
@Override
- protected Bundle createEncryptBundle() {
+ protected SignEncryptParcel createEncryptBundle() {
// fill values for this action
- Bundle data = new Bundle();
+ SignEncryptParcel data = new SignEncryptParcel();
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URIS);
- data.putParcelableArrayList(KeychainIntentService.ENCRYPT_INPUT_URIS, mInputUris);
+ data.addInputUris(mInputUris);
+ data.addOutputUris(mOutputUris);
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URIS);
- data.putParcelableArrayList(KeychainIntentService.ENCRYPT_OUTPUT_URIS, mOutputUris);
-
- data.putInt(KeychainIntentService.ENCRYPT_COMPRESSION_ID,
- Preferences.getPreferences(this).getDefaultFileCompression());
+ data.setCompressionId(Preferences.getPreferences(this).getDefaultMessageCompression());
// Always use armor for messages
- data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_ARMOR, mUseArmor);
+ data.setEnableAsciiArmorOutput(mUseArmor);
if (isModeSymmetric()) {
Log.d(Constants.TAG, "Symmetric encryption enabled!");
@@ -212,13 +207,12 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
if (passphrase.length() == 0) {
passphrase = null;
}
- data.putString(KeychainIntentService.ENCRYPT_SYMMETRIC_PASSPHRASE, passphrase);
+ data.setSymmetricPassphrase(passphrase);
} else {
- data.putLong(KeychainIntentService.ENCRYPT_SIGNATURE_MASTER_ID, mSigningKeyId);
- data.putLongArray(KeychainIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS, mEncryptionKeyIds);
- data.putString(KeychainIntentService.ENCRYPT_SIGNATURE_KEY_PASSPHRASE, mSigningKeyPassphrase);
- data.putSerializable(KeychainIntentService.ENCRYPT_SIGNATURE_NFC_TIMESTAMP, mNfcTimestamp);
- data.putByteArray(KeychainIntentService.ENCRYPT_SIGNATURE_NFC_HASH, mNfcHash);
+ data.setEncryptionMasterKeyIds(mEncryptionKeyIds);
+ data.setSignatureMasterKeyId(mSigningKeyId);
+ data.setSignaturePassphrase(mSigningKeyPassphrase);
+ data.setNfcState(mNfcHash, mNfcTimestamp);
}
return data;
}
@@ -226,8 +220,8 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
/**
* Create Intent Chooser but exclude OK's EncryptActivity.
*/
- private Intent sendWithChooserExcludingEncrypt(Message message) {
- Intent prototype = createSendIntent(message);
+ private Intent sendWithChooserExcludingEncrypt() {
+ Intent prototype = createSendIntent();
String title = getString(R.string.title_share_file);
// we don't want to encrypt the encrypted, no inception ;)
@@ -239,7 +233,7 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
return new ShareHelper(this).createChooserExcluding(prototype, title, blacklist);
}
- private Intent createSendIntent(Message message) {
+ private Intent createSendIntent() {
Intent sendIntent;
// file
if (mOutputUris.size() == 1) {
@@ -252,7 +246,7 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
sendIntent.setType("application/octet-stream");
if (!isModeSymmetric() && mEncryptionUserIds != null) {
- Set<String> users = new HashSet<String>();
+ Set<String> users = new HashSet<>();
for (String user : mEncryptionUserIds) {
String[] userId = KeyRing.splitUserId(user);
if (userId[1] != null) {
@@ -309,15 +303,13 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.encrypt_files_activity);
-
// if called with an intent action, do not init drawer navigation
if (ACTION_ENCRYPT_DATA.equals(getIntent().getAction())) {
// lock drawer
- deactivateDrawerNavigation();
+// deactivateDrawerNavigation();
// TODO: back button to key?
} else {
- activateDrawerNavigation(savedInstanceState);
+// activateDrawerNavigation(savedInstanceState);
}
// Handle intent actions
@@ -328,6 +320,11 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
}
@Override
+ protected void initLayout() {
+ setContentView(R.layout.encrypt_files_activity);
+ }
+
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.encrypt_file_activity, menu);
menu.findItem(R.id.check_use_armor).setChecked(mUseArmor);
@@ -379,7 +376,7 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
String action = intent.getAction();
Bundle extras = intent.getExtras();
String type = intent.getType();
- ArrayList<Uri> uris = new ArrayList<Uri>();
+ ArrayList<Uri> uris = new ArrayList<>();
if (extras == null) {
extras = new Bundle();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
index 6961f5ee7..860bd8502 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
@@ -36,10 +36,10 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.FileHelper;
-import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;
import java.io.File;
import java.util.HashMap;
@@ -59,7 +59,7 @@ public class EncryptFilesFragment extends Fragment implements EncryptActivityInt
private View mShareFile;
private ListView mSelectedFiles;
private SelectedFilesAdapter mAdapter = new SelectedFilesAdapter();
- private final Map<Uri, Bitmap> thumbnailCache = new HashMap<Uri, Bitmap>();
+ private final Map<Uri, Bitmap> thumbnailCache = new HashMap<>();
@Override
public void onAttach(Activity activity) {
@@ -224,7 +224,7 @@ public class EncryptFilesFragment extends Fragment implements EncryptActivityInt
@Override
public void onNotifyUpdate() {
// Clear cache if needed
- for (Uri uri : new HashSet<Uri>(thumbnailCache.keySet())) {
+ for (Uri uri : new HashSet<>(thumbnailCache.keySet())) {
if (!mEncryptInterface.getInputUris().contains(uri)) {
thumbnailCache.remove(uri);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
index 958daa122..2dd861d07 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
@@ -21,7 +21,6 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.Menu;
import android.view.MenuItem;
@@ -30,13 +29,13 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
-import org.sufficientlysecure.keychain.util.Preferences;
-import org.sufficientlysecure.keychain.util.ShareHelper;
-import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.operations.results.SignEncryptResult;
-import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
+import org.sufficientlysecure.keychain.util.ShareHelper;
import java.util.ArrayList;
import java.util.HashSet;
@@ -121,13 +120,13 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
@Override
public ArrayList<Uri> getInputUris() {
- if (mInputUris == null) mInputUris = new ArrayList<Uri>();
+ if (mInputUris == null) mInputUris = new ArrayList<>();
return mInputUris;
}
@Override
public ArrayList<Uri> getOutputUris() {
- if (mOutputUris == null) mOutputUris = new ArrayList<Uri>();
+ if (mOutputUris == null) mOutputUris = new ArrayList<>();
return mOutputUris;
}
@@ -169,32 +168,31 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
}
@Override
- protected void onEncryptSuccess(Message message, SignEncryptResult pgpResult) {
+ protected void onEncryptSuccess(SignEncryptResult result) {
if (mShareAfterEncrypt) {
// Share encrypted message/file
- startActivity(sendWithChooserExcludingEncrypt(message));
+ startActivity(sendWithChooserExcludingEncrypt(result.getResultBytes()));
} else {
// Copy to clipboard
- copyToClipboard(message);
- pgpResult.createNotify(EncryptTextActivity.this).show();
+ copyToClipboard(result.getResultBytes());
+ result.createNotify(EncryptTextActivity.this).show();
// Notify.showNotify(EncryptTextActivity.this,
// R.string.encrypt_sign_clipboard_successful, Notify.Style.INFO);
}
}
@Override
- protected Bundle createEncryptBundle() {
+ protected SignEncryptParcel createEncryptBundle() {
// fill values for this action
- Bundle data = new Bundle();
+ SignEncryptParcel data = new SignEncryptParcel();
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_BYTES);
- data.putByteArray(KeychainIntentService.ENCRYPT_MESSAGE_BYTES, mMessage.getBytes());
+ data.setBytes(mMessage.getBytes());
+ data.setCleartextSignature(true);
- data.putInt(KeychainIntentService.ENCRYPT_COMPRESSION_ID,
- Preferences.getPreferences(this).getDefaultMessageCompression());
+ data.setCompressionId(Preferences.getPreferences(this).getDefaultMessageCompression());
// Always use armor for messages
- data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_ARMOR, true);
+ data.setEnableAsciiArmorOutput(true);
if (isModeSymmetric()) {
Log.d(Constants.TAG, "Symmetric encryption enabled!");
@@ -202,26 +200,25 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
if (passphrase.length() == 0) {
passphrase = null;
}
- data.putString(KeychainIntentService.ENCRYPT_SYMMETRIC_PASSPHRASE, passphrase);
+ data.setSymmetricPassphrase(passphrase);
} else {
- data.putLong(KeychainIntentService.ENCRYPT_SIGNATURE_MASTER_ID, mSigningKeyId);
- data.putLongArray(KeychainIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS, mEncryptionKeyIds);
- data.putString(KeychainIntentService.ENCRYPT_SIGNATURE_KEY_PASSPHRASE, mSigningKeyPassphrase);
- data.putSerializable(KeychainIntentService.ENCRYPT_SIGNATURE_NFC_TIMESTAMP, mNfcTimestamp);
- data.putByteArray(KeychainIntentService.ENCRYPT_SIGNATURE_NFC_HASH, mNfcHash);
+ data.setEncryptionMasterKeyIds(mEncryptionKeyIds);
+ data.setSignatureMasterKeyId(mSigningKeyId);
+ data.setSignaturePassphrase(mSigningKeyPassphrase);
+ data.setNfcState(mNfcHash, mNfcTimestamp);
}
return data;
}
- private void copyToClipboard(Message message) {
- ClipboardReflection.copyToClipboard(this, new String(message.getData().getByteArray(KeychainIntentService.RESULT_BYTES)));
+ private void copyToClipboard(byte[] resultBytes) {
+ ClipboardReflection.copyToClipboard(this, new String(resultBytes));
}
/**
* Create Intent Chooser but exclude OK's EncryptActivity.
*/
- private Intent sendWithChooserExcludingEncrypt(Message message) {
- Intent prototype = createSendIntent(message);
+ private Intent sendWithChooserExcludingEncrypt(byte[] resultBytes) {
+ Intent prototype = createSendIntent(resultBytes);
String title = getString(R.string.title_share_message);
// we don't want to encrypt the encrypted, no inception ;)
@@ -233,20 +230,21 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
return new ShareHelper(this).createChooserExcluding(prototype, title, blacklist);
}
- private Intent createSendIntent(Message message) {
+ private Intent createSendIntent(byte[] resultBytes) {
Intent sendIntent;
sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
- sendIntent.putExtra(Intent.EXTRA_TEXT, new String(message.getData().getByteArray(KeychainIntentService.RESULT_BYTES)));
+ sendIntent.putExtra(Intent.EXTRA_TEXT, new String(resultBytes));
if (!isModeSymmetric() && mEncryptionUserIds != null) {
- Set<String> users = new HashSet<String>();
+ Set<String> users = new HashSet<>();
for (String user : mEncryptionUserIds) {
String[] userId = KeyRing.splitUserId(user);
if (userId[1] != null) {
users.add(userId[1]);
}
}
+ // pass trough email addresses as extra for email applications
sendIntent.putExtra(Intent.EXTRA_EMAIL, users.toArray(new String[users.size()]));
}
return sendIntent;
@@ -288,15 +286,13 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.encrypt_text_activity);
-
// if called with an intent action, do not init drawer navigation
if (ACTION_ENCRYPT_TEXT.equals(getIntent().getAction())) {
// lock drawer
- deactivateDrawerNavigation();
+// deactivateDrawerNavigation();
// TODO: back button to key?
} else {
- activateDrawerNavigation(savedInstanceState);
+// activateDrawerNavigation(savedInstanceState);
}
// Handle intent actions
@@ -305,6 +301,11 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
}
@Override
+ protected void initLayout() {
+ setContentView(R.layout.encrypt_text_activity);
+ }
+
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.encrypt_text_activity, menu);
return super.onCreateOptionsMenu(menu);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/FirstTimeActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/FirstTimeActivity.java
index d71c9c465..393e15cfa 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/FirstTimeActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/FirstTimeActivity.java
@@ -19,17 +19,16 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
-public class FirstTimeActivity extends ActionBarActivity {
+public class FirstTimeActivity extends BaseActivity {
View mCreateKey;
View mImportKey;
@@ -43,8 +42,6 @@ public class FirstTimeActivity extends ActionBarActivity {
super.onCreate(savedInstanceState);
- setContentView(R.layout.first_time_activity);
-
mCreateKey = findViewById(R.id.first_time_create_key);
mImportKey = findViewById(R.id.first_time_import_key);
mSkipSetup = findViewById(R.id.first_time_cancel);
@@ -72,7 +69,11 @@ public class FirstTimeActivity extends ActionBarActivity {
startActivityForResult(intent, REQUEST_CODE_CREATE_OR_IMPORT_KEY);
}
});
+ }
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.first_time_activity);
}
@Override
@@ -91,7 +92,7 @@ public class FirstTimeActivity extends ActionBarActivity {
private void finishSetup(Intent srcData) {
Preferences prefs = Preferences.getPreferences(this);
prefs.setFirstTime(false);
- Intent intent = new Intent(this, KeyListActivity.class);
+ Intent intent = new Intent(this, MainActivity.class);
// give intent through to display notify
if (srcData != null) {
intent.putExtras(srcData);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java
index bbc1e4b1f..2eb35351e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java
@@ -20,14 +20,14 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
+import android.view.View;
+
+import com.astuetz.PagerSlidingTabStrip;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
-import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;
-public class HelpActivity extends ActionBarActivity {
+public class HelpActivity extends BaseActivity {
public static final String EXTRA_SELECTED_TAB = "selected_tab";
public static final int TAB_START = 0;
@@ -44,16 +44,16 @@ public class HelpActivity extends ActionBarActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- final ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayShowTitleEnabled(true);
- actionBar.setDisplayHomeAsUpEnabled(false);
- actionBar.setHomeButtonEnabled(false);
-
- setContentView(R.layout.help_activity);
+ mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
mViewPager = (ViewPager) findViewById(R.id.pager);
- SlidingTabLayout slidingTabLayout =
- (SlidingTabLayout) findViewById(R.id.sliding_tab_layout);
+ PagerSlidingTabStrip slidingTabLayout =
+ (PagerSlidingTabStrip) findViewById(R.id.sliding_tab_layout);
mTabsAdapter = new PagerTabStripAdapter(this);
mViewPager.setAdapter(mTabsAdapter);
@@ -98,4 +98,9 @@ public class HelpActivity extends ActionBarActivity {
// switch to tab selected by extra
mViewPager.setCurrentItem(selectedTab);
}
+
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.help_activity);
+ }
}
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 dfb7b3056..71f6fd4bf 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -17,19 +17,13 @@
package org.sufficientlysecure.keychain.ui;
-import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
-import android.nfc.NdefMessage;
-import android.nfc.NfcAdapter;
-import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
-import android.os.Parcelable;
import android.support.v4.app.Fragment;
-import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
@@ -51,7 +45,7 @@ import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize
import java.io.IOException;
import java.util.ArrayList;
-public class ImportKeysActivity extends ActionBarActivity {
+public class ImportKeysActivity extends BaseActivity {
public static final String ACTION_IMPORT_KEY = OpenKeychainIntents.IMPORT_KEY;
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER = OpenKeychainIntents.IMPORT_KEY_FROM_KEYSERVER;
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT =
@@ -64,9 +58,6 @@ public class ImportKeysActivity extends ActionBarActivity {
// Actions for internal use only:
public static final String ACTION_IMPORT_KEY_FROM_FILE = Constants.INTENT_PREFIX
+ "IMPORT_KEY_FROM_FILE";
- public static final String ACTION_IMPORT_KEY_FROM_NFC = Constants.INTENT_PREFIX
- + "IMPORT_KEY_FROM_NFC";
-
public static final String EXTRA_RESULT = "result";
// only used by ACTION_IMPORT_KEY
@@ -90,8 +81,6 @@ public class ImportKeysActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.import_keys_activity);
-
mImportButton = findViewById(R.id.import_import);
mImportButton.setOnClickListener(new OnClickListener() {
@Override
@@ -103,6 +92,11 @@ public class ImportKeysActivity extends ActionBarActivity {
handleActions(savedInstanceState, getIntent());
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.import_keys_activity);
+ }
+
protected void handleActions(Bundle savedInstanceState, Intent intent) {
String action = intent.getAction();
Bundle extras = intent.getExtras();
@@ -113,105 +107,114 @@ public class ImportKeysActivity extends ActionBarActivity {
extras = new Bundle();
}
+ if (action == null) {
+ startCloudFragment(savedInstanceState, null, false);
+ startListFragment(savedInstanceState, null, null, null);
+ return;
+ }
+
if (Intent.ACTION_VIEW.equals(action)) {
// Android's Action when opening file associated to Keychain (see AndroidManifest.xml)
// delegate action to ACTION_IMPORT_KEY
action = ACTION_IMPORT_KEY;
}
- if (ACTION_IMPORT_KEY.equals(action)) {
- /* Keychain's own Actions */
- startFileFragment(savedInstanceState);
+ switch (action) {
+ case ACTION_IMPORT_KEY: {
+ /* Keychain's own Actions */
+ startFileFragment(savedInstanceState);
- if (dataUri != null) {
- // action: directly load data
- startListFragment(savedInstanceState, null, dataUri, null);
- } else if (extras.containsKey(EXTRA_KEY_BYTES)) {
- byte[] importData = extras.getByteArray(EXTRA_KEY_BYTES);
+ if (dataUri != null) {
+ // action: directly load data
+ startListFragment(savedInstanceState, null, dataUri, null);
+ } else if (extras.containsKey(EXTRA_KEY_BYTES)) {
+ byte[] importData = extras.getByteArray(EXTRA_KEY_BYTES);
- // action: directly load data
- startListFragment(savedInstanceState, importData, null, null);
+ // action: directly load data
+ startListFragment(savedInstanceState, importData, null, null);
+ }
+ break;
}
- } else if (ACTION_IMPORT_KEY_FROM_KEYSERVER.equals(action)
- || ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE.equals(action)
- || ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(action)) {
+ case ACTION_IMPORT_KEY_FROM_KEYSERVER:
+ case ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE:
+ case ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT: {
- // only used for OpenPgpService
- if (extras.containsKey(EXTRA_PENDING_INTENT_DATA)) {
- mPendingIntentData = extras.getParcelable(EXTRA_PENDING_INTENT_DATA);
- }
- if (extras.containsKey(EXTRA_QUERY) || extras.containsKey(EXTRA_KEY_ID)) {
- /* simple search based on query or key id */
-
- String query = null;
- if (extras.containsKey(EXTRA_QUERY)) {
- query = extras.getString(EXTRA_QUERY);
- } else if (extras.containsKey(EXTRA_KEY_ID)) {
- long keyId = extras.getLong(EXTRA_KEY_ID, 0);
- if (keyId != 0) {
- query = KeyFormattingUtils.convertKeyIdToHex(keyId);
- }
+ // only used for OpenPgpService
+ if (extras.containsKey(EXTRA_PENDING_INTENT_DATA)) {
+ mPendingIntentData = extras.getParcelable(EXTRA_PENDING_INTENT_DATA);
}
+ if (extras.containsKey(EXTRA_QUERY) || extras.containsKey(EXTRA_KEY_ID)) {
+ /* simple search based on query or key id */
+
+ String query = null;
+ if (extras.containsKey(EXTRA_QUERY)) {
+ query = extras.getString(EXTRA_QUERY);
+ } else if (extras.containsKey(EXTRA_KEY_ID)) {
+ long keyId = extras.getLong(EXTRA_KEY_ID, 0);
+ if (keyId != 0) {
+ query = KeyFormattingUtils.convertKeyIdToHex(keyId);
+ }
+ }
- if (query != null && query.length() > 0) {
- // display keyserver fragment with query
- startCloudFragment(savedInstanceState, query, false);
+ if (query != null && query.length() > 0) {
+ // display keyserver fragment with query
+ startCloudFragment(savedInstanceState, query, false);
- // action: search immediately
- startListFragment(savedInstanceState, null, null, query);
- } else {
- Log.e(Constants.TAG, "Query is empty!");
- return;
- }
- } else if (extras.containsKey(EXTRA_FINGERPRINT)) {
- /*
- * search based on fingerprint, here we can enforce a check in the end
- * if the right key has been downloaded
- */
+ // action: search immediately
+ startListFragment(savedInstanceState, null, null, query);
+ } else {
+ Log.e(Constants.TAG, "Query is empty!");
+ return;
+ }
+ } else if (extras.containsKey(EXTRA_FINGERPRINT)) {
+ /*
+ * search based on fingerprint, here we can enforce a check in the end
+ * if the right key has been downloaded
+ */
- String fingerprint = extras.getString(EXTRA_FINGERPRINT);
- if (isFingerprintValid(fingerprint)) {
- String query = "0x" + fingerprint;
+ String fingerprint = extras.getString(EXTRA_FINGERPRINT);
+ if (isFingerprintValid(fingerprint)) {
+ String query = "0x" + fingerprint;
- // display keyserver fragment with query
- startCloudFragment(savedInstanceState, query, true);
+ // display keyserver fragment with query
+ startCloudFragment(savedInstanceState, query, true);
- // action: search immediately
- startListFragment(savedInstanceState, null, null, query);
+ // action: search immediately
+ startListFragment(savedInstanceState, null, null, query);
+ }
+ } else {
+ Log.e(Constants.TAG,
+ "IMPORT_KEY_FROM_KEYSERVER action needs to contain the 'query', 'key_id', or " +
+ "'fingerprint' extra!"
+ );
+ return;
}
- } else {
- Log.e(Constants.TAG,
- "IMPORT_KEY_FROM_KEYSERVER action needs to contain the 'query', 'key_id', or " +
- "'fingerprint' extra!"
- );
- return;
+ break;
}
- } else if (ACTION_IMPORT_KEY_FROM_FILE.equals(action)) {
- // NOTE: this only displays the appropriate fragment, no actions are taken
- startFileFragment(savedInstanceState);
-
- // no immediate actions!
- startListFragment(savedInstanceState, null, null, null);
- } else if (ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(action)) {
- // NOTE: this only displays the appropriate fragment, no actions are taken
- startFileFragment(savedInstanceState);
+ case ACTION_IMPORT_KEY_FROM_FILE: {
+ // NOTE: this only displays the appropriate fragment, no actions are taken
+ startFileFragment(savedInstanceState);
- // no immediate actions!
- startListFragment(savedInstanceState, null, null, null);
- } else if (ACTION_IMPORT_KEY_FROM_NFC.equals(action)) {
- // NOTE: this only displays the appropriate fragment, no actions are taken
- startFileFragment(savedInstanceState);
- // TODO!!!!!
+ // no immediate actions!
+ startListFragment(savedInstanceState, null, null, null);
+ break;
+ }
+ case ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN: {
+ // NOTE: this only displays the appropriate fragment, no actions are taken
+ startFileFragment(savedInstanceState);
- // no immediate actions!
- startListFragment(savedInstanceState, null, null, null);
- } else {
- startCloudFragment(savedInstanceState, null, false);
- startListFragment(savedInstanceState, null, null, null);
+ // no immediate actions!
+ startListFragment(savedInstanceState, null, null, null);
+ break;
+ }
+ default: {
+ startCloudFragment(savedInstanceState, null, false);
+ startListFragment(savedInstanceState, null, null, null);
+ break;
+ }
}
}
-
private void startListFragment(Bundle savedInstanceState, byte[] bytes, Uri dataUri, String serverQuery) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
@@ -353,7 +356,7 @@ public class ImportKeysActivity extends ActionBarActivity {
// We parcel this iteratively into a file - anything we can
// display here, we should be able to import.
ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<ParcelableKeyRing>(this, "key_import.pcl");
+ new ParcelableFileCache<>(this, "key_import.pcl");
cache.writeCache(selectedEntries);
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
@@ -385,7 +388,7 @@ public class ImportKeysActivity extends ActionBarActivity {
data.putString(KeychainIntentService.IMPORT_KEY_SERVER, sls.mCloudPrefs.keyserver);
// get selected key entries
- ArrayList<ParcelableKeyRing> keys = new ArrayList<ParcelableKeyRing>();
+ ArrayList<ParcelableKeyRing> keys = new ArrayList<>();
{
// change the format into ParcelableKeyRing
ArrayList<ImportKeysListEntry> entries = mListFragment.getSelectedEntries();
@@ -413,50 +416,4 @@ public class ImportKeysActivity extends ActionBarActivity {
}
}
- /**
- * NFC
- */
- @Override
- public void onResume() {
- super.onResume();
-
- // Check to see if the Activity started due to an Android Beam
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
- handleActionNdefDiscovered(getIntent());
- } else {
- Log.d(Constants.TAG, "NFC: No NDEF discovered!");
- }
- } else {
- Log.e(Constants.TAG, "Android Beam not supported by Android < 4.1");
- }
- }
-
- /**
- * NFC
- */
- @Override
- public void onNewIntent(Intent intent) {
- // onResume gets called after this to handle the intent
- setIntent(intent);
- }
-
- /**
- * NFC: Parses the NDEF Message from the intent and prints to the TextView
- */
- @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
- void handleActionNdefDiscovered(Intent intent) {
- Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
- // only one message sent during the beam
- NdefMessage msg = (NdefMessage) rawMsgs[0];
- // record 0 contains the MIME type, record 1 is the AAR, if present
- byte[] receivedKeyringBytes = msg.getRecords()[0].getPayload();
-
- Intent importIntent = new Intent(this, ImportKeysActivity.class);
- importIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY);
- importIntent.putExtra(ImportKeysActivity.EXTRA_KEY_BYTES, receivedKeyringBytes);
-
- handleActions(null, importIntent);
- }
-
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java
index 03aba344a..91ca93c36 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysCloudFragment.java
@@ -21,6 +21,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.preference.PreferenceActivity;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -36,8 +37,8 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.util.ContactHelper;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.util.List;
@@ -81,7 +82,7 @@ public class ImportKeysCloudFragment extends Fragment {
namesAndEmails.addAll(ContactHelper.getContactMails(getActivity()));
mQueryEditText.setThreshold(3);
mQueryEditText.setAdapter(
- new ArrayAdapter<String>
+ new ArrayAdapter<>
(getActivity(), android.R.layout.simple_spinner_dropdown_item,
namesAndEmails
)
@@ -110,11 +111,9 @@ public class ImportKeysCloudFragment extends Fragment {
mConfigButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- Intent i = new Intent(mImportActivity, PreferencesActivity.class);
- // GRR, for some reason I can’t set the Action or I get an incomprehensible
- // exception about “modern two-pane layouts”
- // i.setAction(PreferencesActivity.ACTION_PREFS_CLOUD);
- startActivity(i);
+ Intent intent = new Intent(mImportActivity, SettingsActivity.class);
+ intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, SettingsActivity.CloudSearchPrefsFragment.class.getName());
+ startActivity(intent);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index 4fe53fb09..6a6140892 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -113,7 +113,7 @@ public class ImportKeysListFragment extends ListFragment implements
return mAdapter.getSelectedEntries();
} else {
Log.e(Constants.TAG, "Adapter not initialized, returning empty list");
- return new ArrayList<ImportKeysListEntry>();
+ return new ArrayList<>();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeScanActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
index 5966870df..948da94d8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeScanActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
@@ -17,12 +17,17 @@
package org.sufficientlysecure.keychain.ui;
+import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
+import android.nfc.NdefMessage;
+import android.nfc.NfcAdapter;
+import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
+import android.os.Parcelable;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
@@ -48,10 +53,13 @@ import java.util.Locale;
/**
* Proxy activity (just a transparent content view) to scan QR Codes using the Barcode Scanner app
*/
-public class QrCodeScanActivity extends FragmentActivity {
+public class ImportKeysProxyActivity extends FragmentActivity {
public static final String ACTION_QR_CODE_API = OpenKeychainIntents.IMPORT_KEY_FROM_QR_CODE;
public static final String ACTION_SCAN_WITH_RESULT = Constants.INTENT_PREFIX + "SCAN_QR_CODE_WITH_RESULT";
+ public static final String ACTION_SCAN_IMPORT = Constants.INTENT_PREFIX + "SCAN_QR_CODE_IMPORT";
+
+ public static final String EXTRA_FINGERPRINT = "fingerprint";
boolean returnResult;
@@ -73,17 +81,35 @@ public class QrCodeScanActivity extends FragmentActivity {
// Scanning a fingerprint directly with Barcode Scanner, thus we already have scanned
returnResult = false;
- startCertify(dataUri);
+ processScannedContent(dataUri);
+ } else if (ACTION_SCAN_IMPORT.equals(action)) {
+ returnResult = false;
+ IntentIntegrator integrator = new IntentIntegrator(this);
+ integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES)
+ .setPrompt(getString(R.string.import_qr_code_text))
+ .setResultDisplayDuration(0)
+ .initiateScan();
} else if (ACTION_SCAN_WITH_RESULT.equals(action)) {
- // scan using xzing's Barcode Scanner and return result parcel in OpenKeychain
-
returnResult = true;
- new IntentIntegrator(this).initiateScan();
+ IntentIntegrator integrator = new IntentIntegrator(this);
+ integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES)
+ .setPrompt(getString(R.string.import_qr_code_text))
+ .setResultDisplayDuration(0)
+ .initiateScan();
} else if (ACTION_QR_CODE_API.equals(action)) {
// scan using xzing's Barcode Scanner from outside OpenKeychain
returnResult = false;
new IntentIntegrator(this).initiateScan();
+ } else if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
+ // Check to see if the Activity started due to an Android Beam
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ returnResult = false;
+ handleActionNdefDiscovered(getIntent());
+ } else {
+ Log.e(Constants.TAG, "Android Beam not supported by Android < 4.1");
+ finish();
+ }
} else {
Log.e(Constants.TAG, "No valid scheme or action given!");
finish();
@@ -95,16 +121,16 @@ public class QrCodeScanActivity extends FragmentActivity {
if (requestCode == IntentIntegratorSupportV4.REQUEST_CODE) {
IntentResult scanResult = IntentIntegratorSupportV4.parseActivityResult(requestCode,
resultCode, data);
- if (scanResult != null && scanResult.getFormatName() != null) {
- String scannedContent = scanResult.getContents();
- Log.d(Constants.TAG, "scannedContent: " + scannedContent);
- startCertify(Uri.parse(scanResult.getContents()));
- } else {
+ if (scanResult == null || scanResult.getFormatName() == null) {
Log.e(Constants.TAG, "scanResult or formatName null! Should not happen!");
finish();
+ return;
}
+ String scannedContent = scanResult.getContents();
+ processScannedContent(scannedContent);
+
return;
}
// if a result has been returned, return it down to other activity
@@ -112,6 +138,42 @@ public class QrCodeScanActivity extends FragmentActivity {
returnResult(data);
} else {
super.onActivityResult(requestCode, resultCode, data);
+ finish();
+ }
+ }
+
+ private void processScannedContent(String content) {
+ Uri uri = Uri.parse(content);
+ processScannedContent(uri);
+ }
+
+ private void processScannedContent(Uri uri) {
+
+ Log.d(Constants.TAG, "scanned: " + uri);
+
+ String fingerprint = null;
+
+ // example: openpgp4fpr:73EE2314F65FA92EC2390D3A718C070100012282
+ if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals(Constants.FINGERPRINT_SCHEME)) {
+ fingerprint = uri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
+ }
+
+ if (fingerprint == null) {
+ SingletonResult result = new SingletonResult(
+ SingletonResult.RESULT_ERROR, OperationResult.LogType.MSG_WRONG_QR_CODE);
+ Intent intent = new Intent();
+ intent.putExtra(SingletonResult.EXTRA_RESULT, result);
+ returnResult(intent);
+ return;
+ }
+
+ if (returnResult) {
+ Intent result = new Intent();
+ result.putExtra(EXTRA_FINGERPRINT, fingerprint);
+ setResult(RESULT_OK, result);
+ finish();
+ } else {
+ importKeys(fingerprint);
}
}
@@ -128,21 +190,28 @@ public class QrCodeScanActivity extends FragmentActivity {
}
}
- public void startCertify(Uri dataUri) {
- // example: openpgp4fpr:73EE2314F65FA92EC2390D3A718C070100012282
- if (dataUri.getScheme().equals(Constants.FINGERPRINT_SCHEME)) {
- String fingerprint = dataUri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
- importKeys(fingerprint);
- } else {
- SingletonResult result = new SingletonResult(
- SingletonResult.RESULT_ERROR, OperationResult.LogType.MSG_WRONG_QR_CODE);
- Intent intent = new Intent();
- intent.putExtra(SingletonResult.EXTRA_RESULT, result);
- returnResult(intent);
- }
+ public void importKeys(byte[] keyringData) {
+
+ ParcelableKeyRing keyEntry = new ParcelableKeyRing(keyringData);
+ ArrayList<ParcelableKeyRing> selectedEntries = new ArrayList<>();
+ selectedEntries.add(keyEntry);
+
+ startImportService(selectedEntries);
+
}
public void importKeys(String fingerprint) {
+
+ ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null);
+ ArrayList<ParcelableKeyRing> selectedEntries = new ArrayList<>();
+ selectedEntries.add(keyEntry);
+
+ startImportService(selectedEntries);
+
+ }
+
+ private void startImportService (ArrayList<ParcelableKeyRing> keyRings) {
+
// Message is received after importing is done in KeychainIntentService
KeychainIntentServiceHandler serviceHandler = new KeychainIntentServiceHandler(
this,
@@ -168,7 +237,7 @@ public class QrCodeScanActivity extends FragmentActivity {
return;
}
- if ( ! result.success()) {
+ if (!result.success()) {
// only return if no success...
Intent data = new Intent();
data.putExtras(returnData);
@@ -176,34 +245,32 @@ public class QrCodeScanActivity extends FragmentActivity {
return;
}
- Intent certifyIntent = new Intent(QrCodeScanActivity.this, CertifyKeyActivity.class);
+ Intent certifyIntent = new Intent(ImportKeysProxyActivity.this,
+ CertifyKeyActivity.class);
certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result);
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, result.getImportedMasterKeyIds());
+ certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS,
+ result.getImportedMasterKeyIds());
startActivityForResult(certifyIntent, 0);
}
}
};
- // search config
- Preferences prefs = Preferences.getPreferences(this);
- Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
-
- // Send all information needed to service to query keys in other thread
- Intent intent = new Intent(this, KeychainIntentService.class);
-
- intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING);
-
// fill values for this action
Bundle data = new Bundle();
- data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
-
- ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null);
- ArrayList<ParcelableKeyRing> selectedEntries = new ArrayList<ParcelableKeyRing>();
- selectedEntries.add(keyEntry);
+ // search config
+ {
+ Preferences prefs = Preferences.getPreferences(this);
+ Preferences.CloudSearchPrefs cloudPrefs =
+ new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
+ data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ }
- data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, selectedEntries);
+ data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, keyRings);
+ // Send all information needed to service to query keys in other thread
+ Intent intent = new Intent(this, KeychainIntentService.class);
+ intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING);
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
// Create a new Messenger for the communication back
@@ -215,6 +282,20 @@ public class QrCodeScanActivity extends FragmentActivity {
// start service with intent
startService(intent);
+
+ }
+
+ /**
+ * NFC: Parses the NDEF Message from the intent and prints to the TextView
+ */
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
+ void handleActionNdefDiscovered(Intent intent) {
+ Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
+ // only one message sent during the beam
+ NdefMessage msg = (NdefMessage) rawMsgs[0];
+ // record 0 contains the MIME type, record 1 is the AAR, if present
+ byte[] receivedKeyringBytes = msg.getRecords()[0].getPayload();
+ importKeys(receivedKeyringBytes);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
deleted file mode 100644
index 8d26cc955..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
- *
- * 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;
-
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.Messenger;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.provider.KeychainDatabase;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.ui.util.Notify;
-import org.sufficientlysecure.keychain.util.ExportHelper;
-import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.Preferences;
-
-import java.io.IOException;
-
-public class KeyListActivity extends DrawerActivity {
-
- public static final int REQUEST_CODE_RESULT_TO_LIST = 1;
-
- ExportHelper mExportHelper;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setTitle(R.string.nav_keys);
-
- // if this is the first time show first time activity
- Preferences prefs = Preferences.getPreferences(this);
- if (prefs.isFirstTime()) {
- startActivity(new Intent(this, FirstTimeActivity.class));
- finish();
- return;
- }
-
- mExportHelper = new ExportHelper(this);
-
- setContentView(R.layout.key_list_activity);
-
- Intent data = getIntent();
- // If we got an EXTRA_RESULT in the intent, show the notification
- if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
- OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
- result.createNotify(this).show();
- }
-
- // now setup navigation drawer in DrawerActivity...
- activateDrawerNavigation(savedInstanceState);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.key_list, menu);
-
- if (Constants.DEBUG) {
- menu.findItem(R.id.menu_key_list_debug_cons).setVisible(true);
- menu.findItem(R.id.menu_key_list_debug_read).setVisible(true);
- menu.findItem(R.id.menu_key_list_debug_write).setVisible(true);
- menu.findItem(R.id.menu_key_list_debug_first_time).setVisible(true);
- }
-
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_key_list_add:
- Intent scanQrCode = new Intent(this, QrCodeScanActivity.class);
- scanQrCode.setAction(QrCodeScanActivity.ACTION_SCAN_WITH_RESULT);
- startActivityForResult(scanQrCode, 0);
- return true;
-
- case R.id.menu_key_list_search_cloud:
- searchCloud();
- return true;
-
- case R.id.menu_key_list_create:
- createKey();
- return true;
-
- case R.id.menu_key_list_import_existing_key:
- Intent intentImportExisting = new Intent(this, ImportKeysActivity.class);
- intentImportExisting.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN);
- startActivityForResult(intentImportExisting, 0);
- return true;
-
- case R.id.menu_key_list_export:
- mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
- return true;
-
- case R.id.menu_key_list_debug_cons:
- consolidate();
- return true;
-
- case R.id.menu_key_list_debug_read:
- try {
- 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 Error " + e.getMessage(), Notify.Style.ERROR);
- }
- return true;
-
- case R.id.menu_key_list_debug_write:
- try {
- 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 Error: " + e.getMessage(), Notify.Style.ERROR);
- }
- return true;
-
- case R.id.menu_key_list_debug_first_time:
- Preferences prefs = Preferences.getPreferences(this);
- prefs.setFirstTime(true);
- Intent intent = new Intent(this, FirstTimeActivity.class);
- startActivity(intent);
- finish();
- return true;
-
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- private void searchCloud() {
- Intent importIntent = new Intent(this, ImportKeysActivity.class);
- importIntent.putExtra(ImportKeysActivity.EXTRA_QUERY, (String) null); // hack to show only cloud tab
- startActivity(importIntent);
- }
-
- private void createKey() {
- Intent intent = new Intent(this, CreateKeyActivity.class);
- startActivityForResult(intent, 0);
- }
-
- private void consolidate() {
- // Message is received after importing is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(
- this,
- getString(R.string.progress_importing),
- 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 returnData = message.getData();
- if (returnData == null) {
- return;
- }
- final ConsolidateResult result =
- returnData.getParcelable(OperationResult.EXTRA_RESULT);
- if (result == null) {
- return;
- }
-
- result.createNotify(KeyListActivity.this).show();
- }
- }
- };
-
- // Send all information needed to service to import key in other thread
- Intent intent = new Intent(this, KeychainIntentService.class);
-
- intent.setAction(KeychainIntentService.ACTION_CONSOLIDATE);
-
- // fill values for this action
- Bundle data = new Bundle();
-
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-
- // show progress dialog
- saveHandler.showProgressDialog(this);
-
- // start service with intent
- startService(intent);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // if a result has been returned, display a notify
- if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
- OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
- result.createNotify(this).show();
- } else {
- super.onActivityResult(requestCode, resultCode, data);
- }
- }
-
-}
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 d0be052d8..b56da463a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -18,6 +18,7 @@
package org.sufficientlysecure.keychain.ui;
+import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
@@ -31,62 +32,54 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
-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.support.v4.view.MenuItemCompat;
import android.support.v4.widget.CursorAdapter;
-import android.support.v4.widget.NoScrollableSwipeRefreshLayout;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
-import android.view.MotionEvent;
import android.view.View;
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.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+import com.getbase.floatingactionbutton.FloatingActionButton;
+import com.getbase.floatingactionbutton.FloatingActionsMenu;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
import org.sufficientlysecure.keychain.operations.results.DeleteResult;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.util.ExportHelper;
-import org.sufficientlysecure.keychain.util.KeyUpdateHelper;
import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainDatabase;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
-import org.sufficientlysecure.keychain.ui.widget.ListAwareSwipeRefreshLayout;
import org.sufficientlysecure.keychain.ui.util.Highlighter;
-import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
-import org.sufficientlysecure.keychain.util.ParcelableFileCache;
+import org.sufficientlysecure.keychain.util.ExportHelper;
+import org.sufficientlysecure.keychain.util.FabContainer;
+import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-import edu.cmu.cylab.starslinger.exchange.ExchangeActivity;
-import edu.cmu.cylab.starslinger.exchange.ExchangeConfig;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
@@ -96,21 +89,26 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
*/
public class KeyListFragment extends LoaderFragment
implements SearchView.OnQueryTextListener, AdapterView.OnItemClickListener,
- LoaderManager.LoaderCallbacks<Cursor> {
+ LoaderManager.LoaderCallbacks<Cursor>, FabContainer {
+
+ ExportHelper mExportHelper;
private KeyListAdapter mAdapter;
private StickyListHeadersListView mStickyList;
- private ListAwareSwipeRefreshLayout mSwipeRefreshLayout;
// saves the mode object for multiselect, needed for reset at some point
private ActionMode mActionMode = null;
- private boolean mShowAllKeys = true;
-
private String mQuery;
- private SearchView mSearchView;
- boolean hideMenu = false;
+ private FloatingActionsMenu mFab;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mExportHelper = new ExportHelper(getActivity());
+ }
/**
* Load custom layout with StickyListView from library
@@ -123,71 +121,36 @@ public class KeyListFragment extends LoaderFragment
mStickyList = (StickyListHeadersListView) view.findViewById(R.id.key_list_list);
mStickyList.setOnItemClickListener(this);
- mSwipeRefreshLayout = (ListAwareSwipeRefreshLayout) view.findViewById(R.id.key_list_swipe_container);
- mSwipeRefreshLayout.setOnRefreshListener(new NoScrollableSwipeRefreshLayout.OnRefreshListener() {
+ mFab = (FloatingActionsMenu) view.findViewById(R.id.fab_main);
+
+ FloatingActionButton fabQrCode = (FloatingActionButton) view.findViewById(R.id.fab_add_qr_code);
+ FloatingActionButton fabCloud = (FloatingActionButton) view.findViewById(R.id.fab_add_cloud);
+ FloatingActionButton fabFile = (FloatingActionButton) view.findViewById(R.id.fab_add_file);
+
+ fabQrCode.setOnClickListener(new OnClickListener() {
@Override
- public void onRefresh() {
- KeychainIntentServiceHandler finishedHandler = new KeychainIntentServiceHandler(getActivity()) {
- public void handleMessage(Message message) {
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
- mSwipeRefreshLayout.setRefreshing(false);
- }
- }
- };
- // new KeyUpdateHelper().updateAllKeys(getActivity(), finishedHandler);
- updateActionbarForSwipe(false);
+ public void onClick(View v) {
+ mFab.collapse();
+ scanQrCode();
}
});
- mSwipeRefreshLayout.setColorScheme(
- R.color.android_purple_dark,
- R.color.android_purple_light,
- R.color.android_purple_dark,
- R.color.android_purple_light);
- mSwipeRefreshLayout.setStickyListHeadersListView(mStickyList);
- mSwipeRefreshLayout.setOnTouchListener(new View.OnTouchListener() {
+ fabCloud.setOnClickListener(new OnClickListener() {
@Override
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_MOVE) {
- updateActionbarForSwipe(true);
- } else {
- updateActionbarForSwipe(false);
- }
- return false;
+ public void onClick(View v) {
+ mFab.collapse();
+ searchCloud();
+ }
+ });
+ fabFile.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mFab.collapse();
+ importFile();
}
});
- // Just disable for now
- mSwipeRefreshLayout.setIsLocked(true);
- return root;
- }
- private void updateActionbarForSwipe(boolean show) {
- ActionBarActivity activity = (ActionBarActivity) getActivity();
- ActionBar bar = activity.getSupportActionBar();
-
- if (show) {
- bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
- bar.setDisplayUseLogoEnabled(false);
- bar.setCustomView(R.layout.custom_actionbar);
- TextView title = (TextView) getActivity().findViewById(R.id.custom_actionbar_text);
- title.setText(R.string.swipe_to_update);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- hideMenu = true;
- activity.invalidateOptionsMenu();
- }
- } else {
- bar.setTitle(getActivity().getTitle());
- bar.setDisplayHomeAsUpEnabled(true);
- bar.setDisplayShowTitleEnabled(true);
- bar.setDisplayUseLogoEnabled(true);
- bar.setDisplayShowHomeEnabled(true);
- bar.setDisplayShowCustomEnabled(false);
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- hideMenu = false;
- activity.invalidateOptionsMenu();
- }
- }
+ return root;
}
/**
@@ -198,90 +161,91 @@ public class KeyListFragment extends LoaderFragment
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
+ // show app name instead of "keys" from nav drawer
+ getActivity().setTitle(R.string.app_name);
+
mStickyList.setOnItemClickListener(this);
mStickyList.setAreHeadersSticky(true);
mStickyList.setDrawingListUnderStickyHeader(false);
mStickyList.setFastScrollEnabled(true);
/*
- * Multi-selection is only available for Android >= 3.0
+ * Multi-selection
*/
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- mStickyList.setFastScrollAlwaysVisible(true);
+ mStickyList.setFastScrollAlwaysVisible(true);
- mStickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
- mStickyList.getWrappedList().setMultiChoiceModeListener(new MultiChoiceModeListener() {
+ mStickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
+ mStickyList.getWrappedList().setMultiChoiceModeListener(new MultiChoiceModeListener() {
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- android.view.MenuInflater inflater = getActivity().getMenuInflater();
- inflater.inflate(R.menu.key_list_multi, menu);
- mActionMode = mode;
- return true;
- }
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ android.view.MenuInflater inflater = getActivity().getMenuInflater();
+ inflater.inflate(R.menu.key_list_multi, menu);
+ mActionMode = mode;
+ return true;
+ }
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- return false;
- }
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- // get IDs for checked positions as long array
- long[] ids;
+ // get IDs for checked positions as long array
+ long[] ids;
- switch (item.getItemId()) {
- case R.id.menu_key_list_multi_encrypt: {
- ids = mAdapter.getCurrentSelectedMasterKeyIds();
- encrypt(mode, ids);
- break;
- }
- case R.id.menu_key_list_multi_delete: {
- ids = mAdapter.getCurrentSelectedMasterKeyIds();
- showDeleteKeyDialog(mode, ids, mAdapter.isAnySecretSelected());
- break;
- }
- 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());
- break;
- }
- case R.id.menu_key_list_multi_select_all: {
- // select all
- for (int i = 0; i < mStickyList.getCount(); i++) {
- mStickyList.setItemChecked(i, true);
- }
- break;
+ switch (item.getItemId()) {
+ case R.id.menu_key_list_multi_encrypt: {
+ ids = mAdapter.getCurrentSelectedMasterKeyIds();
+ encrypt(mode, ids);
+ break;
+ }
+ case R.id.menu_key_list_multi_delete: {
+ ids = mAdapter.getCurrentSelectedMasterKeyIds();
+ showDeleteKeyDialog(mode, ids, mAdapter.isAnySecretSelected());
+ break;
+ }
+ case R.id.menu_key_list_multi_export: {
+ ids = mAdapter.getCurrentSelectedMasterKeyIds();
+ ExportHelper mExportHelper = new ExportHelper(getActivity());
+ mExportHelper.showExportKeysDialog(ids, Constants.Path.APP_DIR_FILE,
+ mAdapter.isAnySecretSelected());
+ break;
+ }
+ case R.id.menu_key_list_multi_select_all: {
+ // select all
+ for (int i = 0; i < mStickyList.getCount(); i++) {
+ mStickyList.setItemChecked(i, true);
}
+ break;
}
- return true;
}
+ return true;
+ }
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- mActionMode = null;
- mAdapter.clearSelection();
- }
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ mActionMode = null;
+ mAdapter.clearSelection();
+ }
- @Override
- public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
- boolean checked) {
- if (checked) {
- mAdapter.setNewSelection(position, checked);
- } else {
- mAdapter.removeSelection(position);
- }
- int count = mStickyList.getCheckedItemCount();
- String keysSelected = getResources().getQuantityString(
- R.plurals.key_list_selected_keys, count, count);
- mode.setTitle(keysSelected);
+ @Override
+ public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
+ boolean checked) {
+ if (checked) {
+ mAdapter.setNewSelection(position, true);
+ } else {
+ mAdapter.removeSelection(position);
}
+ int count = mStickyList.getCheckedItemCount();
+ String keysSelected = getResources().getQuantityString(
+ R.plurals.key_list_selected_keys, count, count);
+ mode.setTitle(keysSelected);
+ }
- });
- }
+ });
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
@@ -340,14 +304,6 @@ public class KeyListFragment extends LoaderFragment
whereArgs[i] = "%" + words[i] + "%";
}
}
- if (!mShowAllKeys) {
- if (where == null) {
- where = "";
- } else {
- where += " AND ";
- }
- where += KeyRings.VERIFIED + " != 0";
- }
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
@@ -368,9 +324,7 @@ public class KeyListFragment extends LoaderFragment
// end action mode, if any
if (mActionMode != null) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- mActionMode.finish();
- }
+ mActionMode.finish();
}
// The list should now be shown.
@@ -400,7 +354,6 @@ public class KeyListFragment extends LoaderFragment
startActivity(viewIntent);
}
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
protected void encrypt(ActionMode mode, long[] masterKeyIds) {
Intent intent = new Intent(getActivity(), EncryptFilesActivity.class);
intent.setAction(EncryptFilesActivity.ACTION_ENCRYPT_DATA);
@@ -414,10 +367,8 @@ public class KeyListFragment extends LoaderFragment
/**
* Show dialog to delete key
*
- * @param masterKeyIds
* @param hasSecret must contain whether the list of masterKeyIds contains a secret key or not
*/
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void showDeleteKeyDialog(final ActionMode mode, long[] masterKeyIds, boolean hasSecret) {
// Can only work on singular secret keys
if (hasSecret && masterKeyIds.length > 1) {
@@ -455,25 +406,27 @@ public class KeyListFragment extends LoaderFragment
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
+ inflater.inflate(R.menu.key_list, menu);
+
+ if (Constants.DEBUG) {
+ menu.findItem(R.id.menu_key_list_debug_cons).setVisible(true);
+ menu.findItem(R.id.menu_key_list_debug_read).setVisible(true);
+ menu.findItem(R.id.menu_key_list_debug_write).setVisible(true);
+ menu.findItem(R.id.menu_key_list_debug_first_time).setVisible(true);
+ }
+
// Get the searchview
MenuItem searchItem = menu.findItem(R.id.menu_key_list_search);
- mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
+ SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
// Execute this when searching
- mSearchView.setOnQueryTextListener(this);
-
- View searchPlate = mSearchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
- searchPlate.setBackgroundResource(R.drawable.keychaintheme_searchview_holo_light);
+ searchView.setOnQueryTextListener(this);
// Erase search result without focus
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- hideMenu = true;
- getActivity().invalidateOptionsMenu();
- }
// disable swipe-to-refresh
// mSwipeRefreshLayout.setIsLocked(true);
@@ -485,26 +438,66 @@ public class KeyListFragment extends LoaderFragment
mQuery = null;
getLoaderManager().restartLoader(0, null, KeyListFragment.this);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- hideMenu = false;
- getActivity().invalidateOptionsMenu();
- }
// enable swipe-to-refresh
// mSwipeRefreshLayout.setIsLocked(false);
return true;
}
});
- if (hideMenu) {
- for (int i = 0; i < menu.size(); i++) {
- menu.getItem(i).setVisible(false);
- }
- }
-
super.onCreateOptionsMenu(menu, inflater);
}
@Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+
+ case R.id.menu_key_list_create:
+ createKey();
+ return true;
+
+ case R.id.menu_key_list_export:
+ mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
+ return true;
+
+ case R.id.menu_key_list_debug_cons:
+ consolidate();
+ return true;
+
+ case R.id.menu_key_list_debug_read:
+ try {
+ KeychainDatabase.debugBackup(getActivity(), true);
+ Notify.showNotify(getActivity(), "Restored debug_backup.db", Notify.Style.INFO);
+ getActivity().getContentResolver().notifyChange(KeychainContract.KeyRings.CONTENT_URI, null);
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IO Error", e);
+ Notify.showNotify(getActivity(), "IO Error " + e.getMessage(), Notify.Style.ERROR);
+ }
+ return true;
+
+ case R.id.menu_key_list_debug_write:
+ try {
+ KeychainDatabase.debugBackup(getActivity(), false);
+ Notify.showNotify(getActivity(), "Backup to debug_backup.db completed", Notify.Style.INFO);
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IO Error", e);
+ Notify.showNotify(getActivity(), "IO Error: " + e.getMessage(), Notify.Style.ERROR);
+ }
+ return true;
+
+ case R.id.menu_key_list_debug_first_time:
+ Preferences prefs = Preferences.getPreferences(getActivity());
+ prefs.setFirstTime(true);
+ Intent intent = new Intent(getActivity(), FirstTimeActivity.class);
+ startActivity(intent);
+ getActivity().finish();
+ return true;
+
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
public boolean onQueryTextSubmit(String s) {
return true;
}
@@ -526,6 +519,105 @@ public class KeyListFragment extends LoaderFragment
return true;
}
+ private void searchCloud() {
+ Intent importIntent = new Intent(getActivity(), ImportKeysActivity.class);
+ importIntent.putExtra(ImportKeysActivity.EXTRA_QUERY, (String) null); // hack to show only cloud tab
+ startActivity(importIntent);
+ }
+
+ private void scanQrCode() {
+ Intent scanQrCode = new Intent(getActivity(), ImportKeysProxyActivity.class);
+ scanQrCode.setAction(ImportKeysProxyActivity.ACTION_SCAN_IMPORT);
+ startActivityForResult(scanQrCode, 0);
+ }
+
+ private void importFile() {
+ Intent intentImportExisting = new Intent(getActivity(), ImportKeysActivity.class);
+ intentImportExisting.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN);
+ startActivityForResult(intentImportExisting, 0);
+ }
+
+ private void createKey() {
+ Intent intent = new Intent(getActivity(), CreateKeyActivity.class);
+ startActivityForResult(intent, 0);
+ }
+
+ private void consolidate() {
+ // Message is received after importing is done in KeychainIntentService
+ KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(
+ getActivity(),
+ getString(R.string.progress_importing),
+ 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 returnData = message.getData();
+ if (returnData == null) {
+ return;
+ }
+ final ConsolidateResult result =
+ returnData.getParcelable(OperationResult.EXTRA_RESULT);
+ if (result == null) {
+ return;
+ }
+
+ result.createNotify(getActivity()).show();
+ }
+ }
+ };
+
+ // Send all information needed to service to import key in other thread
+ Intent intent = new Intent(getActivity(), KeychainIntentService.class);
+
+ intent.setAction(KeychainIntentService.ACTION_CONSOLIDATE);
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ // 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);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // if a result has been returned, display a notify
+ if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(getActivity()).show();
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+
+ @Override
+ public void fabMoveUp(int height) {
+ ObjectAnimator anim = ObjectAnimator.ofFloat(mFab, "translationY", 0, -height);
+ // we're a little behind, so skip 1/10 of the time
+ anim.setDuration(270);
+ anim.start();
+ }
+
+ @Override
+ public void fabRestorePosition() {
+ ObjectAnimator anim = ObjectAnimator.ofFloat(mFab, "translationY", 0);
+ // we're a little ahead, so wait a few ms
+ anim.setStartDelay(70);
+ anim.setDuration(300);
+ anim.start();
+ }
+
/**
* Implements StickyListHeadersAdapter from library
*/
@@ -533,7 +625,7 @@ public class KeyListFragment extends LoaderFragment
private String mQuery;
private LayoutInflater mInflater;
- private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>();
+ private HashMap<Integer, Boolean> mSelection = new HashMap<>();
public KeyListAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
@@ -624,13 +716,13 @@ public class KeyListFragment extends LoaderFragment
// Note: order is important!
if (isRevoked) {
- KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, KeyFormattingUtils.STATE_REVOKED, true);
+ KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray);
h.mStatus.setVisibility(View.VISIBLE);
h.mSlinger.setVisibility(View.GONE);
h.mMainUserId.setTextColor(context.getResources().getColor(R.color.bg_gray));
h.mMainUserIdRest.setTextColor(context.getResources().getColor(R.color.bg_gray));
} else if (isExpired) {
- KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, KeyFormattingUtils.STATE_EXPIRED, true);
+ KeyFormattingUtils.setStatusImage(getActivity(), h.mStatus, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray);
h.mStatus.setVisibility(View.VISIBLE);
h.mSlinger.setVisibility(View.GONE);
h.mMainUserId.setTextColor(context.getResources().getColor(R.color.bg_gray));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayActivity.java
index 4a2b88518..0de7bb391 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayActivity.java
@@ -19,21 +19,18 @@
package org.sufficientlysecure.keychain.ui;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.view.View;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
-public class LogDisplayActivity extends ActionBarActivity {
+public class LogDisplayActivity extends BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Inflate a "Done" custom action bar
- ActionBarHelper.setOneButtonView(getSupportActionBar(),
- R.string.btn_okay, R.drawable.ic_action_done,
+ setFullScreenDialogClose(
new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -42,7 +39,10 @@ public class LogDisplayActivity extends ActionBarActivity {
}
}
);
+ }
+ @Override
+ protected void initLayout() {
setContentView(R.layout.log_display_activity);
}
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 2baebc83d..b655a7e55 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java
@@ -153,11 +153,11 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe
switch (subEntry.mType.mLevel) {
case DEBUG: ih.mSecondImg.setBackgroundColor(Color.GRAY); break;
case INFO: ih.mSecondImg.setBackgroundColor(Color.BLACK); break;
- case WARN: ih.mSecondImg.setBackgroundColor(Color.YELLOW); break;
- case ERROR: ih.mSecondImg.setBackgroundColor(Color.RED); break;
- case START: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.emphasis)); break;
- case OK: ih.mSecondImg.setBackgroundColor(Color.GREEN); break;
- case CANCELLED: ih.mSecondImg.setBackgroundColor(Color.RED); break;
+ case WARN: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_orange_light)); break;
+ case ERROR: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break;
+ case START: ih.mSecondImg.setBackgroundColor(Color.BLACK); break;
+ case OK: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_green_light)); break;
+ case CANCELLED: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break;
}
} else {
ih.mSecond.setVisibility(View.GONE);
@@ -184,11 +184,11 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe
switch (entry.mType.mLevel) {
case DEBUG: ih.mImg.setBackgroundColor(Color.GRAY); break;
case INFO: ih.mImg.setBackgroundColor(Color.BLACK); break;
- case WARN: ih.mImg.setBackgroundColor(Color.YELLOW); break;
- case ERROR: ih.mImg.setBackgroundColor(Color.RED); break;
- case START: ih.mImg.setBackgroundColor(getResources().getColor(R.color.emphasis)); break;
- case OK: ih.mImg.setBackgroundColor(Color.GREEN); break;
- case CANCELLED: ih.mImg.setBackgroundColor(Color.RED); break;
+ case WARN: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_orange_light)); break;
+ case ERROR: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break;
+ case START: ih.mImg.setBackgroundColor(Color.BLACK); break;
+ case OK: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_green_light)); break;
+ case CANCELLED: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break;
}
return convertView;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java
new file mode 100644
index 000000000..b6b2fcb8a
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.remote.ui.AppsListFragment;
+import org.sufficientlysecure.keychain.util.Preferences;
+import org.sufficientlysecure.keychain.util.FabContainer;
+
+import it.neokree.materialnavigationdrawer.MaterialNavigationDrawer;
+
+public class MainActivity extends MaterialNavigationDrawer implements FabContainer {
+
+ @Override
+ public void init(Bundle savedInstanceState) {
+ // don't open drawer on first run
+ disableLearningPattern();
+
+// addMultiPaneSupport();
+
+ // set the header image
+ // create and set the header
+ setDrawerHeaderImage(R.drawable.drawer_header);
+
+ // create sections
+ addSection(newSection(getString(R.string.nav_keys), R.drawable.ic_vpn_key_black_24dp, new KeyListFragment()));
+ addSection(newSection(getString(R.string.nav_encrypt_decrypt), R.drawable.ic_lock_black_24dp, new EncryptDecryptOverviewFragment()));
+ addSection(newSection(getString(R.string.title_api_registered_apps), R.drawable.ic_apps_black_24dp, new AppsListFragment()));
+
+ // create bottom section
+ addBottomSection(newSection(getString(R.string.menu_preferences), R.drawable.ic_settings_black_24dp, new Intent(this, SettingsActivity.class)));
+ addBottomSection(newSection(getString(R.string.menu_help), R.drawable.ic_help_black_24dp, new Intent(this, HelpActivity.class)));
+
+ // if this is the first time show first time activity
+ Preferences prefs = Preferences.getPreferences(this);
+ if (prefs.isFirstTime()) {
+ startActivity(new Intent(this, FirstTimeActivity.class));
+ finish();
+ return;
+ }
+
+ Intent data = getIntent();
+ // If we got an EXTRA_RESULT in the intent, show the notification
+ if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(this).show();
+ }
+ }
+
+ @Override
+ public void fabMoveUp(int height) {
+ Object fragment = getCurrentSection().getTargetFragment();
+ if (fragment instanceof FabContainer) {
+ ((FabContainer) fragment).fabMoveUp(height);
+ }
+ }
+
+ @Override
+ public void fabRestorePosition() {
+ Object fragment = getCurrentSection().getTargetFragment();
+ if (fragment instanceof FabContainer) {
+ ((FabContainer) fragment).fabRestorePosition();
+ }
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java
index d0e40a9b8..7311f4879 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcActivity.java
@@ -15,7 +15,6 @@ import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.os.Build;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.view.WindowManager;
import android.widget.Toast;
@@ -23,13 +22,11 @@ import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Iso7816TLV;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
import java.nio.ByteBuffer;
-import java.util.Locale;
/**
* This class provides a communication interface to OpenPGP applications on ISO SmartCard compliant
@@ -38,7 +35,7 @@ import java.util.Locale;
* For the full specs, see http://g10code.com/docs/openpgp-card-2.0.pdf
*/
@TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
-public class NfcActivity extends ActionBarActivity {
+public class NfcActivity extends BaseActivity {
// actions
public static final String ACTION_SIGN_HASH = "sign_hash";
@@ -82,8 +79,6 @@ public class NfcActivity extends ActionBarActivity {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- setContentView(R.layout.nfc_activity);
-
Intent intent = getIntent();
Bundle data = intent.getExtras();
String action = intent.getAction();
@@ -93,36 +88,46 @@ public class NfcActivity extends ActionBarActivity {
mKeyId = data.getLong(EXTRA_KEY_ID);
}
- if (ACTION_SIGN_HASH.equals(action)) {
- mAction = action;
- mPin = data.getString(EXTRA_PIN);
- mHashToSign = data.getByteArray(EXTRA_NFC_HASH_TO_SIGN);
- mHashAlgo = data.getInt(EXTRA_NFC_HASH_ALGO);
- mServiceIntent = data.getParcelable(EXTRA_DATA);
-
- Log.d(Constants.TAG, "NfcActivity mAction: " + mAction);
- Log.d(Constants.TAG, "NfcActivity mPin: " + mPin);
- Log.d(Constants.TAG, "NfcActivity mHashToSign as hex: " + getHex(mHashToSign));
- Log.d(Constants.TAG, "NfcActivity mServiceIntent: " + mServiceIntent.toString());
- } else if (ACTION_DECRYPT_SESSION_KEY.equals(action)) {
- mAction = action;
- mPin = data.getString(EXTRA_PIN);
- mEncryptedSessionKey = data.getByteArray(EXTRA_NFC_ENC_SESSION_KEY);
- mServiceIntent = data.getParcelable(EXTRA_DATA);
-
- Log.d(Constants.TAG, "NfcActivity mAction: " + mAction);
- Log.d(Constants.TAG, "NfcActivity mPin: " + mPin);
- Log.d(Constants.TAG, "NfcActivity mEncryptedSessionKey as hex: " + getHex(mEncryptedSessionKey));
- Log.d(Constants.TAG, "NfcActivity mServiceIntent: " + mServiceIntent.toString());
- } else if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
- Log.e(Constants.TAG, "This should not happen! NfcActivity.onCreate() is being called instead of onNewIntent()!");
- toast("This should not happen! Please create a new bug report that the NFC screen is restarted!");
- finish();
- } else {
- Log.d(Constants.TAG, "Action not supported: " + action);
+ switch (action) {
+ case ACTION_SIGN_HASH:
+ mAction = action;
+ mPin = data.getString(EXTRA_PIN);
+ mHashToSign = data.getByteArray(EXTRA_NFC_HASH_TO_SIGN);
+ mHashAlgo = data.getInt(EXTRA_NFC_HASH_ALGO);
+ mServiceIntent = data.getParcelable(EXTRA_DATA);
+
+ Log.d(Constants.TAG, "NfcActivity mAction: " + mAction);
+ Log.d(Constants.TAG, "NfcActivity mPin: " + mPin);
+ Log.d(Constants.TAG, "NfcActivity mHashToSign as hex: " + getHex(mHashToSign));
+ Log.d(Constants.TAG, "NfcActivity mServiceIntent: " + mServiceIntent.toString());
+ break;
+ case ACTION_DECRYPT_SESSION_KEY:
+ mAction = action;
+ mPin = data.getString(EXTRA_PIN);
+ mEncryptedSessionKey = data.getByteArray(EXTRA_NFC_ENC_SESSION_KEY);
+ mServiceIntent = data.getParcelable(EXTRA_DATA);
+
+ Log.d(Constants.TAG, "NfcActivity mAction: " + mAction);
+ Log.d(Constants.TAG, "NfcActivity mPin: " + mPin);
+ Log.d(Constants.TAG, "NfcActivity mEncryptedSessionKey as hex: " + getHex(mEncryptedSessionKey));
+ Log.d(Constants.TAG, "NfcActivity mServiceIntent: " + mServiceIntent.toString());
+ break;
+ case NfcAdapter.ACTION_TAG_DISCOVERED:
+ Log.e(Constants.TAG, "This should not happen! NfcActivity.onCreate() is being called instead of onNewIntent()!");
+ toast("This should not happen! Please create a new bug report that the NFC screen is restarted!");
+ finish();
+ break;
+ default:
+ Log.d(Constants.TAG, "Action not supported: " + action);
+ break;
}
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.nfc_activity);
+ }
+
/**
* Called when the system is about to start resuming a previous activity,
* disables NFC Foreground Dispatch
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcIntentActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcIntentActivity.java
index cb15dbec2..0ccb206d1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcIntentActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcIntentActivity.java
@@ -15,15 +15,14 @@ import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.os.Build;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.view.WindowManager;
import android.widget.Toast;
import org.spongycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Iso7816TLV;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.Iso7816TLV;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
@@ -36,7 +35,7 @@ import java.nio.ByteBuffer;
* For the full specs, see http://g10code.com/docs/openpgp-card-2.0.pdf
*/
@TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
-public class NfcIntentActivity extends ActionBarActivity {
+public class NfcIntentActivity extends BaseActivity {
// special extra for OpenPgpService
public static final String EXTRA_DATA = "data";
@@ -54,8 +53,6 @@ public class NfcIntentActivity extends ActionBarActivity {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- setContentView(R.layout.nfc_activity);
-
Intent intent = getIntent();
Bundle data = intent.getExtras();
String action = intent.getAction();
@@ -87,7 +84,11 @@ public class NfcIntentActivity extends ActionBarActivity {
Log.e(Constants.TAG, "IOException!", e);
finish();
}
+ }
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.nfc_activity);
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
index 5bface1fb..53fd9cdfd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
@@ -41,8 +41,6 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
-import com.haibison.android.lockpattern.LockPatternActivity;
-
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
@@ -108,20 +106,20 @@ public class PassphraseDialogActivity extends FragmentActivity {
case RESULT_CANCELED:
// The user cancelled the task
break;
- case LockPatternActivity.RESULT_FAILED:
- // The user failed to enter the pattern
- break;
- case LockPatternActivity.RESULT_FORGOT_PATTERN:
- // The user forgot the pattern and invoked your recovery Activity.
- break;
+// case LockPatternActivity.RESULT_FAILED:
+// // The user failed to enter the pattern
+// break;
+// case LockPatternActivity.RESULT_FORGOT_PATTERN:
+// // The user forgot the pattern and invoked your recovery Activity.
+// break;
}
/*
* In any case, there's always a key EXTRA_RETRY_COUNT, which holds
* the number of tries that the user did.
*/
- int retryCount = data.getIntExtra(
- LockPatternActivity.EXTRA_RETRY_COUNT, 0);
+// int retryCount = data.getIntExtra(
+// LockPatternActivity.EXTRA_RETRY_COUNT, 0);
break;
}
@@ -256,9 +254,9 @@ public class PassphraseDialogActivity extends FragmentActivity {
if (keyType == CanonicalizedSecretKey.SecretKeyType.PATTERN) {
// start pattern dialog and show progress circle here...
- Intent patternActivity = new Intent(getActivity(), LockPatternActivity.class);
- patternActivity.putExtra(LockPatternActivity.EXTRA_PATTERN, "123");
- startActivityForResult(patternActivity, REQUEST_CODE_ENTER_PATTERN);
+// Intent patternActivity = new Intent(getActivity(), LockPatternActivity.class);
+// patternActivity.putExtra(LockPatternActivity.EXTRA_PATTERN, "123");
+// startActivityForResult(patternActivity, REQUEST_CODE_ENTER_PATTERN);
mInput.setVisibility(View.GONE);
mProgress.setVisibility(View.VISIBLE);
} else {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseWizardActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseWizardActivity.java
index 93778fd0c..2e838535d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseWizardActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseWizardActivity.java
@@ -43,10 +43,6 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
-import com.haibison.android.lockpattern.LockPatternFragment;
-import com.haibison.android.lockpattern.LockPatternFragmentOld;
-import com.haibison.android.lockpattern.widget.LockPatternView;
-
import org.sufficientlysecure.keychain.R;
import java.io.IOException;
@@ -56,7 +52,8 @@ import java.util.Arrays;
import java.util.List;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
-public class PassphraseWizardActivity extends FragmentActivity implements LockPatternView.OnPatternListener {
+public class PassphraseWizardActivity extends FragmentActivity {
+//public class PassphraseWizardActivity extends FragmentActivity implements LockPatternView.OnPatternListener {
//create or authenticate
public String selectedAction;
//for lockpattern
@@ -117,10 +114,10 @@ public class PassphraseWizardActivity extends FragmentActivity implements LockPa
getActionBar().setTitle(R.string.draw_lockpattern);
}
// LockPatternFragmentOld lpf = LockPatternFragmentOld.newInstance(selectedAction);
- LockPatternFragment lpf = LockPatternFragment.newInstance("asd");
+// LockPatternFragment lpf = LockPatternFragment.newInstance("asd");
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragmentContainer, lpf).addToBackStack(null).commit();
+// FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+// transaction.replace(R.id.fragmentContainer, lpf).addToBackStack(null).commit();
}
public void cancel(View view) {
@@ -205,13 +202,11 @@ public class PassphraseWizardActivity extends FragmentActivity implements LockPa
writeNFC = false; //just write once
Toast.makeText(this, R.string.nfc_write_succesful, Toast.LENGTH_SHORT).show();
//advance to lockpattern
- LockPatternFragmentOld lpf = LockPatternFragmentOld.newInstance(selectedAction);
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragmentContainer, lpf).addToBackStack(null).commit();
+// LockPatternFragmentOld lpf = LockPatternFragmentOld.newInstance(selectedAction);
+// FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+// transaction.replace(R.id.fragmentContainer, lpf).addToBackStack(null).commit();
}
- } catch (IOException e) {
- e.printStackTrace();
- } catch (FormatException e) {
+ } catch (IOException | FormatException e) {
e.printStackTrace();
}
@@ -226,9 +221,9 @@ public class PassphraseWizardActivity extends FragmentActivity implements LockPa
//passwort matches, go to next view
Toast.makeText(this, R.string.passphrases_match + "!", Toast.LENGTH_SHORT).show();
- LockPatternFragmentOld lpf = LockPatternFragmentOld.newInstance(selectedAction);
- FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragmentContainer, lpf).addToBackStack(null).commit();
+// LockPatternFragmentOld lpf = LockPatternFragmentOld.newInstance(selectedAction);
+// FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+// transaction.replace(R.id.fragmentContainer, lpf).addToBackStack(null).commit();
readNFC = false; //just once
} else {
//passwort doesnt match
@@ -236,9 +231,7 @@ public class PassphraseWizardActivity extends FragmentActivity implements LockPa
nfc.setText(R.string.nfc_wrong_tag);
}
}
- } catch (IOException e) {
- e.printStackTrace();
- } catch (FormatException e) {
+ } catch (IOException | FormatException e) {
e.printStackTrace();
}
}
@@ -356,26 +349,6 @@ public class PassphraseWizardActivity extends FragmentActivity implements LockPa
adapter.disableForegroundDispatch(this);
}
- @Override
- public void onPatternStart() {
-
- }
-
- @Override
- public void onPatternCleared() {
-
- }
-
- @Override
- public void onPatternCellAdded(List<LockPatternView.Cell> pattern) {
-
- }
-
- @Override
- public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-
- }
-
public static class SelectMethods extends Fragment {
// private OnFragmentInteractionListener mListener;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeViewActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeViewActivity.java
index cf0c3eb88..d3c1d971a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeViewActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/QrCodeViewActivity.java
@@ -20,57 +20,56 @@ package org.sufficientlysecure.keychain.ui;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v4.app.ActivityCompat;
+import android.support.v7.widget.CardView;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ImageView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.ui.util.QrCodeUtils;
+import org.sufficientlysecure.keychain.util.Log;
-public class QrCodeViewActivity extends ActionBarActivity {
+public class QrCodeViewActivity extends BaseActivity {
- private ImageView mFingerprintQrCode;
+ private ImageView mQrCode;
+ private CardView mQrCodeLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Inflate a "Done" custom action bar
- ActionBarHelper.setOneButtonView(getSupportActionBar(),
- R.string.btn_okay, R.drawable.ic_action_done,
+ setFullScreenDialogClose(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// "Done"
- finish();
+ ActivityCompat.finishAfterTransition(QrCodeViewActivity.this);
}
}
);
- setContentView(R.layout.qr_code_activity);
-
Uri dataUri = getIntent().getData();
if (dataUri == null) {
Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
- finish();
+ ActivityCompat.finishAfterTransition(QrCodeViewActivity.this);
return;
}
- mFingerprintQrCode = (ImageView) findViewById(R.id.qr_code_image);
+ mQrCode = (ImageView) findViewById(R.id.qr_code_image);
+ mQrCodeLayout = (CardView) findViewById(R.id.qr_code_image_layout);
- mFingerprintQrCode.setOnClickListener(new View.OnClickListener() {
+ mQrCodeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- finish();
+ ActivityCompat.finishAfterTransition(QrCodeViewActivity.this);
}
});
@@ -82,7 +81,7 @@ public class QrCodeViewActivity extends ActionBarActivity {
if (blob == null) {
Log.e(Constants.TAG, "key not found!");
Notify.showNotify(this, R.string.error_key_not_found, Style.ERROR);
- finish();
+ ActivityCompat.finishAfterTransition(QrCodeViewActivity.this);
}
String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob);
@@ -91,37 +90,26 @@ public class QrCodeViewActivity extends ActionBarActivity {
// create a minimal size qr code, we can keep this in ram no problem
final Bitmap qrCode = QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0);
- mFingerprintQrCode.getViewTreeObserver().addOnGlobalLayoutListener(
+ mQrCode.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- // create actual bitmap in display dimensions
- Bitmap scaled = Bitmap.createScaledBitmap(qrCode,
- mFingerprintQrCode.getWidth(), mFingerprintQrCode.getWidth(), false);
- mFingerprintQrCode.setImageBitmap(scaled);
- }
- });
+ @Override
+ public void onGlobalLayout() {
+ // create actual bitmap in display dimensions
+ Bitmap scaled = Bitmap.createScaledBitmap(qrCode,
+ mQrCode.getWidth(), mQrCode.getWidth(), false);
+ mQrCode.setImageBitmap(scaled);
+ }
+ });
} catch (ProviderHelper.NotFoundException e) {
Log.e(Constants.TAG, "key not found!", e);
Notify.showNotify(this, R.string.error_key_not_found, Style.ERROR);
- finish();
+ ActivityCompat.finishAfterTransition(QrCodeViewActivity.this);
}
}
@Override
- protected void onResume() {
- super.onResume();
-
- // custom activity transition to get zoom in effect
- this.overridePendingTransition(R.anim.qr_code_zoom_enter, android.R.anim.fade_out);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
-
- // custom activity transition to get zoom out effect
- this.overridePendingTransition(0, R.anim.qr_code_zoom_exit);
+ protected void initLayout() {
+ setContentView(R.layout.qr_code_activity);
}
} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
index 20e1bbe97..d1df2906d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
@@ -27,13 +27,9 @@ import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.FragmentActivity;
-import android.support.v7.app.ActionBarActivity;
import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.NumberPicker;
-import android.widget.Spinner;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
@@ -50,13 +46,12 @@ import org.sufficientlysecure.keychain.util.ParcelableFileCache;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.List;
import edu.cmu.cylab.starslinger.exchange.ExchangeActivity;
import edu.cmu.cylab.starslinger.exchange.ExchangeConfig;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
-public class SafeSlingerActivity extends ActionBarActivity {
+public class SafeSlingerActivity extends BaseActivity {
private static final int REQUEST_CODE_SAFE_SLINGER = 211;
@@ -69,51 +64,17 @@ public class SafeSlingerActivity extends ActionBarActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.safe_slinger_activity);
-
mMasterKeyId = getIntent().getLongExtra(EXTRA_MASTER_KEY_ID, 0);
- // NOTE: there are two versions of this layout, for API >= 11 and one for < 11
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- NumberPicker picker = (NumberPicker) findViewById(R.id.safe_slinger_picker);
- picker.setMinValue(2);
- picker.setMaxValue(10);
- picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- mSelectedNumber = newVal;
- }
- });
- } else {
- Spinner spinner = (Spinner) findViewById(R.id.safe_slinger_spinner);
-
- List<String> list = new ArrayList<String>();
- list.add("2");
- list.add("3");
- list.add("4");
- list.add("5");
- list.add("6");
- list.add("7");
- list.add("8");
- list.add("9");
- list.add("10");
-
- ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_spinner_item, list);
- dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- spinner.setAdapter(dataAdapter);
- spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- mSelectedNumber = position + 2;
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
-
- }
- });
- }
+ NumberPicker picker = (NumberPicker) findViewById(R.id.safe_slinger_picker);
+ picker.setMinValue(2);
+ picker.setMaxValue(10);
+ picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ @Override
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ mSelectedNumber = newVal;
+ }
+ });
ImageView buttonIcon = (ImageView) findViewById(R.id.safe_slinger_button_image);
buttonIcon.setColorFilter(getResources().getColor(R.color.tertiary_text_light),
@@ -128,6 +89,11 @@ public class SafeSlingerActivity extends ActionBarActivity {
});
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.safe_slinger_activity);
+ }
+
private void startExchange(long masterKeyId, int number) {
// retrieve public key blob and start SafeSlinger
Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(masterKeyId);
@@ -197,7 +163,7 @@ public class SafeSlingerActivity extends ActionBarActivity {
certifyIntent.putExtra(CertifyKeyActivity.EXTRA_RESULT, result);
certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, result.getImportedMasterKeyIds());
certifyIntent.putExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, mMasterKeyId);
- startActivityForResult(certifyIntent, KeyListActivity.REQUEST_CODE_RESULT_TO_LIST);
+ startActivityForResult(certifyIntent, 0);
// mExchangeMasterKeyId = null;
}
@@ -221,7 +187,7 @@ public class SafeSlingerActivity extends ActionBarActivity {
// We parcel this iteratively into a file - anything we can
// display here, we should be able to import.
ParcelableFileCache<ParcelableKeyRing> cache =
- new ParcelableFileCache<ParcelableKeyRing>(activity, "key_import.pcl");
+ new ParcelableFileCache<>(activity, "key_import.pcl");
cache.writeCache(it.size(), it.iterator());
// fill values for this action
@@ -249,7 +215,7 @@ public class SafeSlingerActivity extends ActionBarActivity {
}
private static ArrayList<ParcelableKeyRing> getSlingedKeys(Bundle extras) {
- ArrayList<ParcelableKeyRing> list = new ArrayList<ParcelableKeyRing>();
+ ArrayList<ParcelableKeyRing> list = new ArrayList<>();
if (extras != null) {
byte[] d;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java
deleted file mode 100644
index 148aa7d67..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2012-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;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
-import android.view.View;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
-
-public class SelectPublicKeyActivity extends ActionBarActivity {
-
- // Actions for internal use only:
- public static final String ACTION_SELECT_PUBLIC_KEYS = Constants.INTENT_PREFIX
- + "SELECT_PUBLIC_KEYRINGS";
-
- public static final String EXTRA_SELECTED_MASTER_KEY_IDS = "master_key_ids";
-
- public static final String RESULT_EXTRA_MASTER_KEY_IDS = "master_key_ids";
- public static final String RESULT_EXTRA_USER_IDS = "user_ids";
-
- SelectPublicKeyFragment mSelectFragment;
-
- long mSelectedMasterKeyIds[];
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Inflate a "Done"/"Cancel" custom action bar view
- ActionBarHelper.setTwoButtonView(getSupportActionBar(), R.string.btn_okay, R.drawable.ic_action_done,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // ok
- okClicked();
- }
- }, R.string.btn_do_not_save, R.drawable.ic_action_cancel, new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // cancel
- cancelClicked();
- }
- }
- );
-
- setContentView(R.layout.select_public_key_activity);
-
- setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
- handleIntent(getIntent());
-
- // Check that the activity is using the layout version with
- // the fragment_container FrameLayout
- if (findViewById(R.id.select_public_key_fragment_container) != null) {
-
- // However, if we're being restored from a previous state,
- // then we don't need to do anything and should return or else
- // we could end up with overlapping fragments.
- if (savedInstanceState != null) {
- return;
- }
-
- // Create an instance of the fragment
- mSelectFragment = SelectPublicKeyFragment.newInstance(mSelectedMasterKeyIds);
-
- // Add the fragment to the 'fragment_container' FrameLayout
- getSupportFragmentManager().beginTransaction()
- .add(R.id.select_public_key_fragment_container, mSelectFragment).commit();
- }
-
- // TODO: reimplement!
- // mFilterLayout = findViewById(R.id.layout_filter);
- // mFilterInfo = (TextView) mFilterLayout.findViewById(R.id.filterInfo);
- // mClearFilterButton = (Button) mFilterLayout.findViewById(R.id.btn_clear);
- //
- // mClearFilterButton.setOnClickListener(new OnClickListener() {
- // public void onClick(View v) {
- // handleIntent(new Intent());
- // }
- // });
-
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- handleIntent(intent);
- }
-
- private void handleIntent(Intent intent) {
- // TODO: reimplement search!
-
- // String searchString = null;
- // if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- // searchString = intent.getStringExtra(SearchManager.QUERY);
- // if (searchString != null && searchString.trim().length() == 0) {
- // searchString = null;
- // }
- // }
-
- // if (searchString == null) {
- // mFilterLayout.setVisibility(View.GONE);
- // } else {
- // mFilterLayout.setVisibility(View.VISIBLE);
- // mFilterInfo.setText(getString(R.string.filterInfo, searchString));
- // }
-
- // preselected master keys
- mSelectedMasterKeyIds = intent.getLongArrayExtra(EXTRA_SELECTED_MASTER_KEY_IDS);
- }
-
- private void cancelClicked() {
- setResult(RESULT_CANCELED, null);
- finish();
- }
-
- private void okClicked() {
- Intent data = new Intent();
- data.putExtra(RESULT_EXTRA_MASTER_KEY_IDS, mSelectFragment.getSelectedMasterKeyIds());
- data.putExtra(RESULT_EXTRA_USER_IDS, mSelectFragment.getSelectedUserIds());
- setResult(RESULT_OK, data);
- finish();
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java
index af583bf89..afec3bf06 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java
@@ -42,7 +42,6 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ListFragmentWorkaround;
-import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.ui.adapter.SelectKeyCursorAdapter;
@@ -216,7 +215,7 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements T
public long[] getSelectedMasterKeyIds() {
// mListView.getCheckedItemIds() would give the row ids of the KeyRings not the master key
// ids!
- Vector<Long> vector = new Vector<Long>();
+ Vector<Long> vector = new Vector<>();
for (int i = 0; i < getListView().getCount(); ++i) {
if (getListView().isItemChecked(i)) {
vector.add(mAdapter.getMasterKeyId(i));
@@ -238,7 +237,7 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements T
* @return
*/
public String[] getSelectedUserIds() {
- Vector<String> userIds = new Vector<String>();
+ Vector<String> userIds = new Vector<>();
for (int i = 0; i < getListView().getCount(); ++i) {
if (getListView().isItemChecked(i)) {
userIds.add(mAdapter.getUserId(i));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java
index 51fac4779..53986a392 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java
@@ -17,7 +17,7 @@
package org.sufficientlysecure.keychain.ui;
-import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
@@ -27,19 +27,22 @@ import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.ui.widget.IntegerListPreference;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.util.List;
-@SuppressLint("NewApi")
-public class PreferencesActivity extends PreferenceActivity {
+public class SettingsActivity extends PreferenceActivity {
public static final String ACTION_PREFS_CLOUD = "org.sufficientlysecure.keychain.ui.PREFS_CLOUD";
public static final String ACTION_PREFS_ADV = "org.sufficientlysecure.keychain.ui.PREFS_ADV";
@@ -54,6 +57,8 @@ public class PreferencesActivity extends PreferenceActivity {
sPreferences = Preferences.getPreferences(this);
super.onCreate(savedInstanceState);
+ setupToolbar();
+
String action = getIntent().getAction();
if (action != null && action.equals(ACTION_PREFS_CLOUD)) {
@@ -64,9 +69,9 @@ public class PreferencesActivity extends PreferenceActivity {
mKeyServerPreference
.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
- Intent intent = new Intent(PreferencesActivity.this,
- PreferencesKeyServerActivity.class);
- intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS,
+ Intent intent = new Intent(SettingsActivity.this,
+ SettingsKeyServerActivity.class);
+ intent.putExtra(SettingsKeyServerActivity.EXTRA_KEY_SERVERS,
sPreferences.getKeyServers());
startActivityForResult(intent, REQUEST_CODE_KEYSERVER_PREF);
return false;
@@ -130,12 +135,33 @@ public class PreferencesActivity extends PreferenceActivity {
initializeUseNumKeypadForYubikeyPin(
(CheckBoxPreference) findPreference(Constants.Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN));
- } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
- // Load the legacy preferences headers
- addPreferencesFromResource(R.xml.preference_headers_legacy);
}
}
+ /**
+ * Hack to get Toolbar in PreferenceActivity. See http://stackoverflow.com/a/26614696
+ */
+ private void setupToolbar() {
+ ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
+ LinearLayout content = (LinearLayout) root.getChildAt(0);
+ LinearLayout toolbarContainer = (LinearLayout) View.inflate(this, R.layout.preference_toolbar_activity, null);
+
+ root.removeAllViews();
+ toolbarContainer.addView(content);
+ root.addView(toolbarContainer);
+
+ Toolbar toolbar = (Toolbar) toolbarContainer.findViewById(R.id.toolbar);
+ toolbar.setTitle(R.string.title_preferences);
+ toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp));
+ toolbar.setNavigationOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //What to do on back clicked
+ finish();
+ }
+ });
+ }
+
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
@@ -144,7 +170,7 @@ public class PreferencesActivity extends PreferenceActivity {
return;
}
String servers[] = data
- .getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS);
+ .getStringArrayExtra(SettingsKeyServerActivity.EXTRA_KEY_SERVERS);
sPreferences.setKeyServers(servers);
mKeyServerPreference.setSummary(keyserverSummary(this));
break;
@@ -157,7 +183,6 @@ public class PreferencesActivity extends PreferenceActivity {
}
}
- /* Called only on Honeycomb and later */
@Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
@@ -185,8 +210,8 @@ public class PreferencesActivity extends PreferenceActivity {
.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(getActivity(),
- PreferencesKeyServerActivity.class);
- intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS,
+ SettingsKeyServerActivity.class);
+ intent.putExtra(SettingsKeyServerActivity.EXTRA_KEY_SERVERS,
sPreferences.getKeyServers());
startActivityForResult(intent, REQUEST_CODE_KEYSERVER_PREF);
return false;
@@ -208,7 +233,7 @@ public class PreferencesActivity extends PreferenceActivity {
return;
}
String servers[] = data
- .getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS);
+ .getStringArrayExtra(SettingsKeyServerActivity.EXTRA_KEY_SERVERS);
sPreferences.setKeyServers(servers);
mKeyServerPreference.setSummary(keyserverSummary(getActivity()));
break;
@@ -287,6 +312,7 @@ public class PreferencesActivity extends PreferenceActivity {
}
}
+ @TargetApi(Build.VERSION_CODES.KITKAT)
protected boolean isValidFragment(String fragmentName) {
return AdvancedPrefsFragment.class.getName().equals(fragmentName)
|| CloudSearchPrefsFragment.class.getName().equals(fragmentName)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesKeyServerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java
index 2a8ef171c..080dc2495 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesKeyServerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyServerActivity.java
@@ -20,7 +20,6 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -28,14 +27,13 @@ import android.view.ViewGroup;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.ActionBarHelper;
import org.sufficientlysecure.keychain.ui.widget.Editor;
import org.sufficientlysecure.keychain.ui.widget.Editor.EditorListener;
import org.sufficientlysecure.keychain.ui.widget.KeyServerEditor;
import java.util.Vector;
-public class PreferencesKeyServerActivity extends ActionBarActivity implements OnClickListener,
+public class SettingsKeyServerActivity extends BaseActivity implements OnClickListener,
EditorListener {
public static final String EXTRA_KEY_SERVERS = "key_servers";
@@ -52,23 +50,19 @@ public class PreferencesKeyServerActivity extends ActionBarActivity implements O
super.onCreate(savedInstanceState);
// Inflate a "Done"/"Cancel" custom action bar view
- ActionBarHelper.setTwoButtonView(getSupportActionBar(), R.string.btn_okay, R.drawable.ic_action_done,
+ setFullScreenDialogDoneClose(R.string.btn_save,
new View.OnClickListener() {
@Override
public void onClick(View v) {
- // ok
okClicked();
}
- }, R.string.btn_do_not_save, R.drawable.ic_action_cancel, new View.OnClickListener() {
+ },
+ new View.OnClickListener() {
@Override
public void onClick(View v) {
- // cancel
cancelClicked();
}
- }
- );
-
- setContentView(R.layout.key_server_preference);
+ });
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -102,6 +96,11 @@ public class PreferencesKeyServerActivity extends ActionBarActivity implements O
makeServerList(servers);
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.key_server_preference);
+ }
+
private void makeServerList(String[] servers) {
if (servers != null) {
mEditors.removeAllViews();
@@ -137,7 +136,7 @@ public class PreferencesKeyServerActivity extends ActionBarActivity implements O
}
private Vector<String> serverList() {
- Vector<String> servers = new Vector<String>();
+ Vector<String> servers = new Vector<>();
for (int i = 0; i < mEditors.getChildCount(); ++i) {
KeyServerEditor editor = (KeyServerEditor) mEditors.getChildAt(i);
String tmp = editor.getValue();
@@ -150,7 +149,7 @@ public class PreferencesKeyServerActivity extends ActionBarActivity implements O
private void okClicked() {
Intent data = new Intent();
- Vector<String> servers = new Vector<String>();
+ Vector<String> servers = new Vector<>();
for (int i = 0; i < mEditors.getChildCount(); ++i) {
KeyServerEditor editor = (KeyServerEditor) mEditors.getChildAt(i);
String tmp = editor.getValue();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
index 497486a5e..e19793fd5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -24,7 +24,6 @@ import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.NavUtils;
-import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
@@ -34,17 +33,17 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
/**
* Sends the selected public key to a keyserver
*/
-public class UploadKeyActivity extends ActionBarActivity {
+public class UploadKeyActivity extends BaseActivity {
private View mUploadButton;
private Spinner mKeyServerSpinner;
@@ -54,12 +53,10 @@ public class UploadKeyActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.upload_key_activity);
-
mUploadButton = findViewById(R.id.upload_key_action_upload);
mKeyServerSpinner = (Spinner) findViewById(R.id.upload_key_keyserver);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
+ ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, Preferences.getPreferences(this)
.getKeyServers()
);
@@ -86,6 +83,11 @@ public class UploadKeyActivity extends ActionBarActivity {
}
}
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.upload_key_activity);
+ }
+
private void uploadKey() {
// Send all information needed to service to upload key in other thread
Intent intent = new Intent(this, KeychainIntentService.class);
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 34c08a6c7..a80503591 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
@@ -27,9 +27,6 @@ import android.support.v4.app.NavUtils;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
import android.text.format.DateFormat;
import android.view.MenuItem;
import android.view.View;
@@ -37,19 +34,18 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
-import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
import java.util.Date;
-public class ViewCertActivity extends ActionBarActivity
+public class ViewCertActivity extends BaseActivity
implements LoaderManager.LoaderCallbacks<Cursor> {
// These are the rows that we will retrieve.
@@ -86,8 +82,6 @@ public class ViewCertActivity extends ActionBarActivity
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
- setContentView(R.layout.view_cert_activity);
-
mSigneeKey = (TextView) findViewById(R.id.signee_key);
mSigneeUid = (TextView) findViewById(R.id.signee_uid);
mAlgorithm = (TextView) findViewById(R.id.algorithm);
@@ -113,6 +107,11 @@ public class ViewCertActivity extends ActionBarActivity
}
@Override
+ protected void initLayout() {
+ setContentView(R.layout.view_cert_activity);
+ }
+
+ @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
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 0bc75b3a9..742cde75c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -18,10 +18,15 @@
package org.sufficientlysecure.keychain.ui;
+import android.animation.ArgbEvaluator;
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
import android.annotation.TargetApi;
+import android.app.Activity;
+import android.app.ActivityOptions;
import android.content.Intent;
import android.database.Cursor;
-import android.graphics.PorterDuff;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
@@ -32,62 +37,77 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.os.Messenger;
import android.provider.ContactsContract;
+import android.provider.Settings;
+import android.support.v4.app.ActivityCompat;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
-import android.support.v4.view.ViewPager;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.widget.CardView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageButton;
import android.widget.ImageView;
-import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
+import com.getbase.floatingactionbutton.FloatingActionButton;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.util.ContactHelper;
-import org.sufficientlysecure.keychain.util.ExportHelper;
-import org.sufficientlysecure.keychain.util.Preferences;
+import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.results.CertifyResult;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
-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.util.FormattingUtils;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.QrCodeUtils;
+import org.sufficientlysecure.keychain.ui.widget.AspectRatioImageView;
+import org.sufficientlysecure.keychain.util.ContactHelper;
+import org.sufficientlysecure.keychain.util.ExportHelper;
+import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
+import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-public class ViewKeyActivity extends ActionBarActivity implements
+public class ViewKeyActivity extends BaseActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
+ static final int REQUEST_QR_FINGERPRINT = 1;
+
ExportHelper mExportHelper;
ProviderHelper mProviderHelper;
protected Uri mDataUri;
- public static final String EXTRA_SELECTED_TAB = "selected_tab";
- public static final int TAB_MAIN = 0;
- public static final int TAB_SHARE = 1;
-
- // view
- private ViewPager mViewPager;
- private SlidingTabLayout mSlidingTabLayout;
- private PagerTabStripAdapter mTabsAdapter;
-
- private LinearLayout mStatusLayout;
+ private TextView mName;
private TextView mStatusText;
private ImageView mStatusImage;
- private View mStatusDivider;
+ private RelativeLayout mBigToolbar;
+
+ private ImageButton mActionEncryptFile;
+ private ImageButton mActionEncryptText;
+ private ImageButton mActionNfc;
+ private FloatingActionButton mFab;
+ private AspectRatioImageView mPhoto;
+ private ImageView mQrCode;
+ private CardView mQrCodeLayout;
// NFC
private NfcAdapter mNfcAdapter;
@@ -98,6 +118,17 @@ public class ViewKeyActivity extends ActionBarActivity implements
private static final int LOADER_ID_UNIFIED = 0;
+ private boolean mIsSecret = false;
+ private boolean mHasEncrypt = false;
+ private boolean mIsVerified = false;
+ private MenuItem mRefreshItem;
+ private boolean mIsRefreshing;
+ private Animation mRotate, mRotateSpin;
+ private View mRefresh;
+ private String mFingerprint;
+ private long mMasterKeyId;
+
+ @SuppressLint("InflateParams")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -105,39 +136,65 @@ public class ViewKeyActivity extends ActionBarActivity implements
mExportHelper = new ExportHelper(this);
mProviderHelper = new ProviderHelper(this);
- // let the actionbar look like Android's contact app
- ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setIcon(android.R.color.transparent);
- actionBar.setHomeButtonEnabled(true);
+ setTitle(null);
- setContentView(R.layout.view_key_activity);
-
- mStatusLayout = (LinearLayout) findViewById(R.id.view_key_status_layout);
- mStatusText = (TextView) findViewById(R.id.view_key_status_text);
+ mName = (TextView) findViewById(R.id.view_key_name);
+ mStatusText = (TextView) findViewById(R.id.view_key_status);
mStatusImage = (ImageView) findViewById(R.id.view_key_status_image);
- mStatusDivider = findViewById(R.id.view_key_status_divider);
+ mBigToolbar = (RelativeLayout) findViewById(R.id.toolbar_big);
+
+ mActionEncryptFile = (ImageButton) findViewById(R.id.view_key_action_encrypt_files);
+ mActionEncryptText = (ImageButton) findViewById(R.id.view_key_action_encrypt_text);
+ mActionNfc = (ImageButton) findViewById(R.id.view_key_action_nfc);
+ mFab = (FloatingActionButton) findViewById(R.id.fab);
+ mPhoto = (AspectRatioImageView) findViewById(R.id.view_key_photo);
+ mQrCode = (ImageView) findViewById(R.id.view_key_qr_code);
+ mQrCodeLayout = (CardView) findViewById(R.id.view_key_qr_code_layout);
+
+ mRotateSpin = AnimationUtils.loadAnimation(this, R.anim.rotate_spin);
+ mRotateSpin.setAnimationListener(new AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
- mViewPager = (ViewPager) findViewById(R.id.view_key_pager);
- mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.view_key_sliding_tab_layout);
+ }
- mSlidingTabLayout.setCustomTabColorizer(new TabColorizer() {
@Override
- public int getIndicatorColor(int position) {
- return 0xFFAA66CC;
+ public void onAnimationEnd(Animation animation) {
+ mRefreshItem.getActionView().clearAnimation();
+ mRefreshItem.setActionView(null);
+ mRefreshItem.setEnabled(true);
+
+ // this is a deferred call
+ supportInvalidateOptionsMenu();
}
@Override
- public int getDividerColor(int position) {
- return 0;
+ public void onAnimationRepeat(Animation animation) {
+
}
});
+ mRotate = AnimationUtils.loadAnimation(this, R.anim.rotate);
+ mRotate.setRepeatCount(Animation.INFINITE);
+ mRotate.setAnimationListener(new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
- int switchToTab = TAB_MAIN;
- Intent intent = getIntent();
- if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) {
- switchToTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
- }
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+ if (!mIsRefreshing) {
+ mRefreshItem.getActionView().clearAnimation();
+ mRefreshItem.getActionView().startAnimation(mRotateSpin);
+ }
+ }
+ });
+ mRefresh = getLayoutInflater().inflate(R.layout.indeterminate_progress, null);
mDataUri = getIntent().getData();
if (mDataUri == null) {
@@ -155,7 +212,45 @@ public class ViewKeyActivity extends ActionBarActivity implements
}
}
- Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri);
+
+ mActionEncryptFile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ encrypt(mDataUri, false);
+ }
+ });
+ mActionEncryptText.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ encrypt(mDataUri, true);
+ }
+ });
+
+ mFab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mIsSecret) {
+ startSafeSlinger(mDataUri);
+ } else {
+ scanQrCode();
+ }
+ }
+ });
+
+ mQrCodeLayout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showQrCodeDialog();
+ }
+ });
+
+ mActionNfc.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ invokeNfcBeam();
+ }
+ });
// Prepare the loaders. Either re-connect with an existing ones,
// or start new ones.
@@ -163,35 +258,39 @@ public class ViewKeyActivity extends ActionBarActivity implements
initNfc(mDataUri);
- initTabs(mDataUri);
-
- // switch to tab selected by extra
- mViewPager.setCurrentItem(switchToTab);
+ startFragment(savedInstanceState, mDataUri);
}
- private void initTabs(Uri dataUri) {
- mTabsAdapter = new PagerTabStripAdapter(this);
- mViewPager.setAdapter(mTabsAdapter);
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.view_key_activity);
+ }
- Bundle mainBundle = new Bundle();
- mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
- mTabsAdapter.addTab(ViewKeyMainFragment.class,
- mainBundle, getString(R.string.key_view_tab_main));
+ private void startFragment(Bundle savedInstanceState, Uri dataUri) {
+ // However, if we're being restored from a previous state,
+ // then we don't need to do anything and should return or else
+ // we could end up with overlapping fragments.
+ if (savedInstanceState != null) {
+ return;
+ }
- Bundle shareBundle = new Bundle();
- shareBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
- mTabsAdapter.addTab(ViewKeyShareFragment.class,
- shareBundle, getString(R.string.key_view_tab_share));
+ // Create an instance of the fragment
+ ViewKeyFragment frag = ViewKeyFragment.newInstance(dataUri);
- // update layout after operations
- mSlidingTabLayout.setViewPager(mViewPager);
+ // Add the fragment to the 'fragment_container' FrameLayout
+ // NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.view_key_fragment, frag)
+ .commitAllowingStateLoss();
+ // do it immediately!
+ getSupportFragmentManager().executePendingTransactions();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.key_view, menu);
-
+ mRefreshItem = menu.findItem(R.id.menu_key_view_refresh);
return true;
}
@@ -200,7 +299,7 @@ public class ViewKeyActivity extends ActionBarActivity implements
try {
switch (item.getItemId()) {
case android.R.id.home: {
- Intent homeIntent = new Intent(this, KeyListActivity.class);
+ Intent homeIntent = new Intent(this, MainActivity.class);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
return true;
@@ -214,9 +313,26 @@ public class ViewKeyActivity extends ActionBarActivity implements
return true;
}
case R.id.menu_key_view_advanced: {
- Intent advancedIntent = new Intent(this, ViewKeyAdvancedActivity.class);
+ Intent advancedIntent = new Intent(this, ViewKeyAdvActivity.class);
advancedIntent.setData(mDataUri);
startActivity(advancedIntent);
+ return true;
+ }
+ case R.id.menu_key_view_refresh: {
+ try {
+ updateFromKeyserver(mDataUri, mProviderHelper);
+ } catch (ProviderHelper.NotFoundException e) {
+ Notify.showNotify(this, R.string.error_key_not_found, Notify.Style.ERROR);
+ }
+ return true;
+ }
+ case R.id.menu_key_view_edit: {
+ editKey(mDataUri);
+ return true;
+ }
+ case R.id.menu_key_view_certify_fingerprint: {
+ certifyFingeprint(mDataUri);
+ return true;
}
}
} catch (ProviderHelper.NotFoundException e) {
@@ -226,6 +342,105 @@ public class ViewKeyActivity extends ActionBarActivity implements
return super.onOptionsItemSelected(item);
}
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ MenuItem editKey = menu.findItem(R.id.menu_key_view_edit);
+ editKey.setVisible(mIsSecret);
+ MenuItem certifyFingerprint = menu.findItem(R.id.menu_key_view_certify_fingerprint);
+ certifyFingerprint.setVisible(!mIsSecret && !mIsVerified);
+
+ return true;
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private void invokeNfcBeam() {
+ // Check for available NFC Adapter
+ mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
+ if (mNfcAdapter == null || !mNfcAdapter.isEnabled()) {
+ Notify.createNotify(this, R.string.error_nfc_needed, Notify.LENGTH_LONG, Notify.Style.ERROR, new Notify.ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intentSettings = new Intent(Settings.ACTION_NFC_SETTINGS);
+ startActivity(intentSettings);
+ }
+ }, R.string.menu_nfc_preferences).show();
+
+ return;
+ }
+
+ if (!mNfcAdapter.isNdefPushEnabled()) {
+ Notify.createNotify(this, R.string.error_beam_needed, Notify.LENGTH_LONG, Notify.Style.ERROR, new Notify.ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intentSettings = new Intent(Settings.ACTION_NFCSHARING_SETTINGS);
+ startActivity(intentSettings);
+ }
+ }, R.string.menu_beam_preferences).show();
+
+ return;
+ }
+
+ mNfcAdapter.invokeBeam(this);
+ }
+
+ private void scanQrCode() {
+ Intent scanQrCode = new Intent(this, ImportKeysProxyActivity.class);
+ scanQrCode.setAction(ImportKeysProxyActivity.ACTION_SCAN_WITH_RESULT);
+ startActivityForResult(scanQrCode, REQUEST_QR_FINGERPRINT);
+ }
+
+ private void certifyFingeprint(Uri dataUri) {
+ Intent intent = new Intent(this, CertifyFingerprintActivity.class);
+ intent.setData(dataUri);
+
+ startCertifyIntent(intent);
+ }
+
+ private void certifyImmediate() {
+ Intent intent = new Intent(this, CertifyKeyActivity.class);
+ intent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{ mMasterKeyId });
+
+ startCertifyIntent(intent);
+ }
+
+ private void startCertifyIntent (Intent intent) {
+ // Message is received after signing is done in KeychainIntentService
+ KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(this) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ Bundle data = message.getData();
+ CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
+
+ result.createNotify(ViewKeyActivity.this).show();
+ }
+ }
+ };
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ startActivityForResult(intent, 0);
+ }
+
+ private void showQrCodeDialog() {
+ Intent qrCodeIntent = new Intent(this, QrCodeViewActivity.class);
+
+ // create the transition animation - the images in the layouts
+ // of both activities are defined with android:transitionName="qr_code"
+ Bundle opts = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ ActivityOptions options = ActivityOptions
+ .makeSceneTransitionAnimation(this, mQrCodeLayout, "qr_code");
+ opts = options.toBundle();
+ }
+
+ qrCodeIntent.setData(mDataUri);
+ ActivityCompat.startActivity(this, qrCodeIntent, opts);
+ }
+
private void exportToFile(Uri dataUri, ExportHelper exportHelper, ProviderHelper providerHelper)
throws ProviderHelper.NotFoundException {
Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri);
@@ -258,7 +473,31 @@ public class ViewKeyActivity extends ActionBarActivity implements
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // if a result has been returned, display a notify
+ if (requestCode == REQUEST_QR_FINGERPRINT && resultCode == Activity.RESULT_OK) {
+
+ // If there is an EXTRA_RESULT, that's an error. Just show it.
+ if (data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(this).show();
+ return;
+ }
+
+ String fp = data.getStringExtra(ImportKeysProxyActivity.EXTRA_FINGERPRINT);
+ if (fp == null) {
+ Notify.createNotify(this, "Error scanning fingerprint!",
+ Notify.LENGTH_LONG, Notify.Style.ERROR).show();
+ return;
+ }
+ if (mFingerprint.equalsIgnoreCase(fp)) {
+ certifyImmediate();
+ } else {
+ Notify.createNotify(this, "Fingerprints did not match!",
+ Notify.LENGTH_LONG, Notify.Style.ERROR).show();
+ }
+
+ return;
+ }
+
if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
result.createNotify(this).show();
@@ -267,6 +506,154 @@ public class ViewKeyActivity extends ActionBarActivity implements
}
}
+ private void encrypt(Uri dataUri, boolean text) {
+ // If there is no encryption key, don't bother.
+ if (!mHasEncrypt) {
+ Notify.showNotify(this, R.string.error_no_encrypt_subkey, Notify.Style.ERROR);
+ return;
+ }
+ try {
+ long keyId = new ProviderHelper(this)
+ .getCachedPublicKeyRing(dataUri)
+ .extractOrGetMasterKeyId();
+ long[] encryptionKeyIds = new long[]{keyId};
+ Intent intent;
+ if (text) {
+ intent = new Intent(this, EncryptTextActivity.class);
+ intent.setAction(EncryptTextActivity.ACTION_ENCRYPT_TEXT);
+ intent.putExtra(EncryptTextActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds);
+ } else {
+ intent = new Intent(this, EncryptFilesActivity.class);
+ intent.setAction(EncryptFilesActivity.ACTION_ENCRYPT_DATA);
+ intent.putExtra(EncryptFilesActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds);
+ }
+ // used instead of startActivity set actionbar based on callingPackage
+ startActivityForResult(intent, 0);
+ } catch (PgpKeyNotFoundException e) {
+ Log.e(Constants.TAG, "key not found!", e);
+ }
+ }
+
+ private void updateFromKeyserver(Uri dataUri, ProviderHelper providerHelper)
+ throws ProviderHelper.NotFoundException {
+
+ mIsRefreshing = true;
+ mRefreshItem.setEnabled(false);
+ mRefreshItem.setActionView(mRefresh);
+ mRefresh.startAnimation(mRotate);
+
+ byte[] blob = (byte[]) providerHelper.getGenericData(
+ KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
+ KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
+ String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob);
+
+ ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null);
+ ArrayList<ParcelableKeyRing> entries = new ArrayList<>();
+ entries.add(keyEntry);
+
+ // Message is received after importing is done in KeychainIntentService
+ KeychainIntentServiceHandler serviceHandler = new KeychainIntentServiceHandler(this) {
+ 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 returnData = message.getData();
+
+ mIsRefreshing = false;
+
+ if (returnData == null) {
+ finish();
+ return;
+ }
+ final ImportKeyResult result =
+ returnData.getParcelable(OperationResult.EXTRA_RESULT);
+ result.createNotify(ViewKeyActivity.this).show();
+ }
+ }
+ };
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ // search config
+ {
+ Preferences prefs = Preferences.getPreferences(this);
+ Preferences.CloudSearchPrefs cloudPrefs =
+ new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
+ data.putString(KeychainIntentService.IMPORT_KEY_SERVER, cloudPrefs.keyserver);
+ }
+
+ data.putParcelableArrayList(KeychainIntentService.IMPORT_KEY_LIST, entries);
+
+ // Send all information needed to service to query keys in other thread
+ Intent intent = new Intent(this, KeychainIntentService.class);
+ intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYRING);
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ // 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 void editKey(Uri dataUri) {
+ Intent editIntent = new Intent(this, EditKeyActivity.class);
+ editIntent.setData(KeychainContract.KeyRingData.buildSecretKeyRingUri(dataUri));
+ startActivityForResult(editIntent, 0);
+ }
+
+ private void startSafeSlinger(Uri dataUri) {
+ long keyId = 0;
+ try {
+ keyId = new ProviderHelper(this)
+ .getCachedPublicKeyRing(dataUri)
+ .extractOrGetMasterKeyId();
+ } catch (PgpKeyNotFoundException e) {
+ Log.e(Constants.TAG, "key not found!", e);
+ }
+ Intent safeSlingerIntent = new Intent(this, SafeSlingerActivity.class);
+ safeSlingerIntent.putExtra(SafeSlingerActivity.EXTRA_MASTER_KEY_ID, keyId);
+ startActivityForResult(safeSlingerIntent, 0);
+ }
+
+ /**
+ * Load QR Code asynchronously and with a fade in animation
+ */
+ private void loadQrCode(final String fingerprint) {
+ AsyncTask<Void, Void, Bitmap> loadTask =
+ new AsyncTask<Void, Void, Bitmap>() {
+ protected Bitmap doInBackground(Void... unused) {
+ String qrCodeContent = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ // render with minimal size
+ return QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0);
+ }
+
+ protected void onPostExecute(Bitmap qrCode) {
+ // scale the image up to our actual size. we do this in code rather
+ // than let the ImageView do this because we don't require filtering.
+ Bitmap scaled = Bitmap.createScaledBitmap(qrCode,
+ mQrCode.getHeight(), mQrCode.getHeight(),
+ false);
+ mQrCode.setImageBitmap(scaled);
+
+ // simple fade-in animation
+ AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
+ anim.setDuration(200);
+ mQrCode.startAnimation(anim);
+ }
+ };
+
+ loadTask.execute();
+ }
+
/**
* NFC: Initialize NFC sharing if OS and device supports it
*/
@@ -357,25 +744,34 @@ public class ViewKeyActivity extends ActionBarActivity implements
}
};
- static final String[] UNIFIED_PROJECTION = new String[]{
+ // These are the rows that we will retrieve.
+ static final String[] PROJECTION = new String[]{
KeychainContract.KeyRings._ID,
KeychainContract.KeyRings.MASTER_KEY_ID,
KeychainContract.KeyRings.USER_ID,
KeychainContract.KeyRings.IS_REVOKED,
KeychainContract.KeyRings.EXPIRY,
-
+ KeychainContract.KeyRings.VERIFIED,
+ KeychainContract.KeyRings.HAS_ANY_SECRET,
+ KeychainContract.KeyRings.FINGERPRINT,
+ KeychainContract.KeyRings.HAS_ENCRYPT
};
- static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
- static final int INDEX_UNIFIED_USER_ID = 2;
- static final int INDEX_UNIFIED_IS_REVOKED = 3;
- static final int INDEX_UNIFIED_EXPIRY = 4;
+
+ static final int INDEX_MASTER_KEY_ID = 1;
+ static final int INDEX_USER_ID = 2;
+ static final int INDEX_IS_REVOKED = 3;
+ static final int INDEX_EXPIRY = 4;
+ static final int INDEX_VERIFIED = 5;
+ static final int INDEX_HAS_ANY_SECRET = 6;
+ static final int INDEX_FINGERPRINT = 7;
+ static final int INDEX_HAS_ENCRYPT = 8;
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_ID_UNIFIED: {
Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(mDataUri);
- return new CursorLoader(this, baseUri, UNIFIED_PROJECTION, null, null, null);
+ return new CursorLoader(this, baseUri, PROJECTION, null, null, null);
}
default:
@@ -383,6 +779,8 @@ public class ViewKeyActivity extends ActionBarActivity implements
}
}
+ int mPreviousColor = 0;
+
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
/* TODO better error handling? May cause problems when a key is deleted,
@@ -398,37 +796,165 @@ public class ViewKeyActivity extends ActionBarActivity implements
case LOADER_ID_UNIFIED: {
if (data.moveToFirst()) {
// get name, email, and comment from USER_ID
- String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_UNIFIED_USER_ID));
+ String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
if (mainUserId[0] != null) {
- setTitle(mainUserId[0]);
+ mName.setText(mainUserId[0]);
} else {
- setTitle(R.string.user_id_no_name);
+ mName.setText(R.string.user_id_no_name);
}
- // get key id from MASTER_KEY_ID
- long masterKeyId = data.getLong(INDEX_UNIFIED_MASTER_KEY_ID);
- getSupportActionBar().setSubtitle(KeyFormattingUtils.beautifyKeyIdWithPrefix(this, masterKeyId));
+ mMasterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
+ mFingerprint = KeyFormattingUtils.convertFingerprintToHex(data.getBlob(INDEX_FINGERPRINT));
+
+ mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
+ mHasEncrypt = data.getInt(INDEX_HAS_ENCRYPT) != 0;
+ boolean isRevoked = data.getInt(INDEX_IS_REVOKED) > 0;
+ boolean isExpired = !data.isNull(INDEX_EXPIRY)
+ && new Date(data.getLong(INDEX_EXPIRY) * 1000).before(new Date());
+ mIsVerified = data.getInt(INDEX_VERIFIED) > 0;
+
+ // if the refresh animation isn't playing
+ if (!mRotate.hasStarted() && !mRotateSpin.hasStarted()) {
+ // re-create options menu based on mIsSecret, mIsVerified
+ supportInvalidateOptionsMenu();
+ // this is done at the end of the animation otherwise
+ }
- boolean isRevoked = data.getInt(INDEX_UNIFIED_IS_REVOKED) > 0;
- boolean isExpired = !data.isNull(INDEX_UNIFIED_EXPIRY)
- && new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000).before(new Date());
+ AsyncTask<String, Void, Bitmap> photoTask =
+ new AsyncTask<String, Void, Bitmap>() {
+ protected Bitmap doInBackground(String... fingerprint) {
+ return ContactHelper.photoFromFingerprint(getContentResolver(), fingerprint[0]);
+ }
+
+ protected void onPostExecute(Bitmap photo) {
+ mPhoto.setImageBitmap(photo);
+ mPhoto.setVisibility(View.VISIBLE);
+ }
+ };
// Note: order is important
+ int color;
if (isRevoked) {
mStatusText.setText(R.string.view_key_revoked);
- KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, KeyFormattingUtils.STATE_REVOKED);
- mStatusDivider.setVisibility(View.VISIBLE);
- mStatusLayout.setVisibility(View.VISIBLE);
+ mStatusImage.setVisibility(View.VISIBLE);
+ KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,
+ KeyFormattingUtils.STATE_REVOKED, R.color.icons, true);
+ color = getResources().getColor(R.color.android_red_light);
+
+ mActionEncryptFile.setVisibility(View.GONE);
+ mActionEncryptText.setVisibility(View.GONE);
+ mActionNfc.setVisibility(View.GONE);
+ mFab.setVisibility(View.GONE);
+ mQrCodeLayout.setVisibility(View.GONE);
} else if (isExpired) {
- mStatusText.setText(R.string.view_key_expired);
- KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText, KeyFormattingUtils.STATE_EXPIRED);
- mStatusDivider.setVisibility(View.VISIBLE);
- mStatusLayout.setVisibility(View.VISIBLE);
+ if (mIsSecret) {
+ mStatusText.setText(R.string.view_key_expired_secret);
+ } else {
+ mStatusText.setText(R.string.view_key_expired);
+ }
+ mStatusImage.setVisibility(View.VISIBLE);
+ KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,
+ KeyFormattingUtils.STATE_EXPIRED, R.color.icons, true);
+ color = getResources().getColor(R.color.android_red_light);
+
+ mActionEncryptFile.setVisibility(View.GONE);
+ mActionEncryptText.setVisibility(View.GONE);
+ mActionNfc.setVisibility(View.GONE);
+ mFab.setVisibility(View.GONE);
+ mQrCodeLayout.setVisibility(View.GONE);
+ } else if (mIsSecret) {
+ mStatusText.setText(R.string.view_key_my_key);
+ mStatusImage.setVisibility(View.GONE);
+ color = getResources().getColor(R.color.primary);
+ photoTask.execute(mFingerprint);
+ loadQrCode(mFingerprint);
+ mQrCodeLayout.setVisibility(View.VISIBLE);
+
+ // and place leftOf qr code
+ RelativeLayout.LayoutParams nameParams = (RelativeLayout.LayoutParams)
+ mName.getLayoutParams();
+ // remove right margin
+ nameParams.setMargins(FormattingUtils.dpToPx(this, 48), 0, 0, 0);
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ nameParams.setMarginEnd(0);
+ }
+ nameParams.addRule(RelativeLayout.LEFT_OF, R.id.view_key_qr_code_layout);
+ mName.setLayoutParams(nameParams);
+
+ RelativeLayout.LayoutParams statusParams = (RelativeLayout.LayoutParams)
+ mStatusText.getLayoutParams();
+ statusParams.setMargins(FormattingUtils.dpToPx(this, 48), 0, 0, 0);
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ statusParams.setMarginEnd(0);
+ }
+ statusParams.addRule(RelativeLayout.LEFT_OF, R.id.view_key_qr_code_layout);
+ mStatusText.setLayoutParams(statusParams);
+
+ mActionEncryptFile.setVisibility(View.VISIBLE);
+ mActionEncryptText.setVisibility(View.VISIBLE);
+
+ // invokeBeam is available from API 21
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ mActionNfc.setVisibility(View.VISIBLE);
+ } else {
+ mActionNfc.setVisibility(View.GONE);
+ }
+ mFab.setVisibility(View.VISIBLE);
+ mFab.setIconDrawable(getResources().getDrawable(R.drawable.ic_repeat_white_24dp));
} else {
- mStatusDivider.setVisibility(View.GONE);
- mStatusLayout.setVisibility(View.GONE);
+ mActionEncryptFile.setVisibility(View.VISIBLE);
+ mActionEncryptText.setVisibility(View.VISIBLE);
+ mQrCodeLayout.setVisibility(View.GONE);
+ mActionNfc.setVisibility(View.GONE);
+
+ if (mIsVerified) {
+ mStatusText.setText(R.string.view_key_verified);
+ mStatusImage.setVisibility(View.VISIBLE);
+ KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,
+ KeyFormattingUtils.STATE_VERIFIED, R.color.icons, true);
+ color = getResources().getColor(R.color.primary);
+ photoTask.execute(mFingerprint);
+
+ mFab.setVisibility(View.GONE);
+ } else {
+ mStatusText.setText(R.string.view_key_unverified);
+ mStatusImage.setVisibility(View.VISIBLE);
+ KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,
+ KeyFormattingUtils.STATE_UNVERIFIED, R.color.icons, true);
+ color = getResources().getColor(R.color.android_orange_light);
+
+ mFab.setVisibility(View.VISIBLE);
+ }
}
+ if (mPreviousColor == 0 || mPreviousColor == color) {
+ mToolbar.setBackgroundColor(color);
+ mStatusBar.setBackgroundColor(color);
+ mBigToolbar.setBackgroundColor(color);
+ mPreviousColor = color;
+ } else {
+ ObjectAnimator colorFade1 =
+ ObjectAnimator.ofObject(mToolbar, "backgroundColor",
+ new ArgbEvaluator(), mPreviousColor, color);
+ ObjectAnimator colorFade2 =
+ ObjectAnimator.ofObject(mStatusBar, "backgroundColor",
+ new ArgbEvaluator(), mPreviousColor, color);
+ ObjectAnimator colorFade3 =
+ ObjectAnimator.ofObject(mBigToolbar, "backgroundColor",
+ new ArgbEvaluator(), mPreviousColor, color);
+
+ colorFade1.setDuration(1200);
+ colorFade2.setDuration(1200);
+ colorFade3.setDuration(1200);
+ colorFade1.start();
+ colorFade2.start();
+ colorFade3.start();
+ mPreviousColor = color;
+ }
+
+ //noinspection deprecation
+ mStatusImage.setAlpha(80);
+
break;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java
new file mode 100644
index 000000000..9d79b377c
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2015 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;
+
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.view.ViewPager;
+import android.view.View;
+import android.widget.Toast;
+
+import com.astuetz.PagerSlidingTabStrip;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.ContactHelper;
+import org.sufficientlysecure.keychain.util.ExportHelper;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.Date;
+
+public class ViewKeyAdvActivity extends BaseActivity implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ ExportHelper mExportHelper;
+ ProviderHelper mProviderHelper;
+
+ protected Uri mDataUri;
+
+ public static final String EXTRA_SELECTED_TAB = "selected_tab";
+ public static final int TAB_MAIN = 0;
+ public static final int TAB_SHARE = 1;
+
+ // view
+ private ViewPager mViewPager;
+ private PagerSlidingTabStrip mSlidingTabLayout;
+ private PagerTabStripAdapter mTabsAdapter;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setFullScreenDialogClose(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+
+ mExportHelper = new ExportHelper(this);
+ mProviderHelper = new ProviderHelper(this);
+
+ mViewPager = (ViewPager) findViewById(R.id.view_key_pager);
+ mSlidingTabLayout = (PagerSlidingTabStrip) findViewById(R.id.view_key_sliding_tab_layout);
+
+ int switchToTab = TAB_MAIN;
+ Intent intent = getIntent();
+ if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) {
+ switchToTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
+ }
+
+ mDataUri = getIntent().getData();
+ if (mDataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be uri of key!");
+ finish();
+ return;
+ }
+ if (mDataUri.getHost().equals(ContactsContract.AUTHORITY)) {
+ mDataUri = ContactHelper.dataUriFromContactUri(this, mDataUri);
+ if (mDataUri == null) {
+ Log.e(Constants.TAG, "Contact Data missing. Should be uri of key!");
+ Toast.makeText(this, R.string.error_contacts_key_id_missing, Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+ }
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+
+ initTabs(mDataUri);
+
+ // switch to tab selected by extra
+ mViewPager.setCurrentItem(switchToTab);
+ }
+
+ @Override
+ protected void initLayout() {
+ setContentView(R.layout.view_key_adv_activity);
+ }
+
+ private void initTabs(Uri dataUri) {
+ mTabsAdapter = new PagerTabStripAdapter(this);
+ mViewPager.setAdapter(mTabsAdapter);
+
+ Bundle shareBundle = new Bundle();
+ shareBundle.putParcelable(ViewKeyAdvUserIdsFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyAdvShareFragment.class,
+ shareBundle, getString(R.string.key_view_tab_share));
+
+ Bundle userIdsBundle = new Bundle();
+ userIdsBundle.putParcelable(ViewKeyAdvUserIdsFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyAdvUserIdsFragment.class,
+ userIdsBundle, getString(R.string.section_user_ids));
+
+ Bundle keysBundle = new Bundle();
+ keysBundle.putParcelable(ViewKeyAdvSubkeysFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyAdvSubkeysFragment.class,
+ keysBundle, getString(R.string.key_view_tab_keys));
+
+ Bundle certsBundle = new Bundle();
+ certsBundle.putParcelable(ViewKeyAdvCertsFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyAdvCertsFragment.class,
+ certsBundle, getString(R.string.key_view_tab_certs));
+
+ Bundle trustBundle = new Bundle();
+ trustBundle.putParcelable(ViewKeyTrustFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyTrustFragment.class,
+ trustBundle, getString(R.string.key_view_tab_keybase));
+
+ // update layout after operations
+ mSlidingTabLayout.setViewPager(mViewPager);
+ }
+
+ // These are the rows that we will retrieve.
+ static final String[] PROJECTION = new String[]{
+ KeychainContract.KeyRings._ID,
+ KeychainContract.KeyRings.MASTER_KEY_ID,
+ KeychainContract.KeyRings.USER_ID,
+ KeychainContract.KeyRings.IS_REVOKED,
+ KeychainContract.KeyRings.EXPIRY,
+ KeychainContract.KeyRings.VERIFIED,
+ KeychainContract.KeyRings.HAS_ANY_SECRET
+ };
+
+ static final int INDEX_MASTER_KEY_ID = 1;
+ static final int INDEX_USER_ID = 2;
+ static final int INDEX_IS_REVOKED = 3;
+ static final int INDEX_EXPIRY = 4;
+ static final int INDEX_VERIFIED = 5;
+ static final int INDEX_HAS_ANY_SECRET = 6;
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(this, baseUri, PROJECTION, null, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+ // get name, email, and comment from USER_ID
+ String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
+ if (mainUserId[0] != null) {
+ setTitle(mainUserId[0]);
+ } else {
+ setTitle(R.string.user_id_no_name);
+ }
+
+ // get key id from MASTER_KEY_ID
+ long masterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
+ getSupportActionBar().setSubtitle(KeyFormattingUtils.beautifyKeyIdWithPrefix(this, masterKeyId));
+
+ boolean isSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
+ boolean isRevoked = data.getInt(INDEX_IS_REVOKED) > 0;
+ boolean isExpired = !data.isNull(INDEX_EXPIRY)
+ && new Date(data.getLong(INDEX_EXPIRY) * 1000).before(new Date());
+ boolean isVerified = data.getInt(INDEX_VERIFIED) > 0;
+
+ // Note: order is important
+ int color;
+ if (isRevoked || isExpired) {
+ color = getResources().getColor(R.color.android_red_light);
+ } else if (isSecret) {
+ color = getResources().getColor(R.color.primary);
+ } else {
+ if (isVerified) {
+ color = getResources().getColor(R.color.primary);
+ } else {
+ color = getResources().getColor(R.color.android_orange_light);
+ }
+ }
+ mToolbar.setBackgroundColor(color);
+ mStatusBar.setBackgroundColor(color);
+ mSlidingTabLayout.setBackgroundColor(color);
+
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // if a result has been returned, display a notify
+ if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(this).show();
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvancedFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java
index 61bd126ce..90d7a400f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvancedFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014-2015 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
@@ -30,7 +30,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
-import android.widget.ListView;
import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
@@ -39,7 +38,6 @@ import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
-import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
@@ -47,23 +45,16 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
-public class ViewKeyAdvancedFragment extends LoaderFragment implements
+public class ViewKeyAdvCertsFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
public static final String ARG_DATA_URI = "data_uri";
- private ListView mSubkeysList;
- private SubkeysAdapter mSubkeysAdapter;
-
private StickyListHeadersListView mStickyList;
private CertListAdapter mCertsAdapter;
- private Uri mDataUriSubkeys;
private Uri mDataUriCerts;
- private static final int LOADER_SUBKEYS = 1;
- private static final int LOADER_CERTS = 2;
-
// These are the rows that we will retrieve.
static final String[] CERTS_PROJECTION = new String[]{
KeychainContract.Certs._ID,
@@ -86,8 +77,8 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
/**
* Creates new instance of this fragment
*/
- public static ViewKeyAdvancedFragment newInstance(Uri dataUri) {
- ViewKeyAdvancedFragment frag = new ViewKeyAdvancedFragment();
+ public static ViewKeyAdvCertsFragment newInstance(Uri dataUri) {
+ ViewKeyAdvCertsFragment frag = new ViewKeyAdvCertsFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_DATA_URI, dataUri);
@@ -99,9 +90,8 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
View root = super.onCreateView(inflater, superContainer, savedInstanceState);
- View view = inflater.inflate(R.layout.view_key_advanced_fragment, getContainer());
+ View view = inflater.inflate(R.layout.view_key_adv_certs_fragment, getContainer());
- mSubkeysList = (ListView) view.findViewById(R.id.keys);
mStickyList = (StickyListHeadersListView) view.findViewById(R.id.certs_list);
return root;
@@ -122,7 +112,6 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
}
private void loadData(Uri dataUri) {
- mDataUriSubkeys = KeychainContract.Keys.buildKeysUri(dataUri);
mDataUriCerts = KeychainContract.Certs.buildCertsUri(dataUri);
mStickyList.setAreHeadersSticky(true);
@@ -132,34 +121,23 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
mStickyList.setEmptyView(getActivity().findViewById(R.id.empty));
// Create an empty adapter we will use to display the loaded data.
- mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0);
- mSubkeysList.setAdapter(mSubkeysAdapter);
-
mCertsAdapter = new CertListAdapter(getActivity(), null);
mStickyList.setAdapter(mCertsAdapter);
// Prepare the loaders. Either re-connect with an existing ones,
// or start new ones.
- getLoaderManager().initLoader(LOADER_SUBKEYS, null, this);
- getLoaderManager().initLoader(LOADER_CERTS, null, this);
+ getLoaderManager().initLoader(0, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
setContentShown(false);
- switch (id) {
- case LOADER_SUBKEYS:
- return new CursorLoader(getActivity(), mDataUriSubkeys,
- SubkeysAdapter.SUBKEYS_PROJECTION, null, null, null);
-
- case LOADER_CERTS:
- // Now create and return a CursorLoader that will take care of
- // creating a Cursor for the data being displayed.
- return new CursorLoader(getActivity(), mDataUriCerts,
- CERTS_PROJECTION, null, null, CERTS_SORT_ORDER);
-
- default:
- return null;
- }
+
+
+ // Now create and return a CursorLoader that will take care of
+ // creating a Cursor for the data being displayed.
+ return new CursorLoader(getActivity(), mDataUriCerts,
+ CERTS_PROJECTION, null, null, CERTS_SORT_ORDER);
+
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
@@ -170,15 +148,8 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
- switch (loader.getId()) {
- case LOADER_SUBKEYS:
- mSubkeysAdapter.swapCursor(data);
- break;
- case LOADER_CERTS:
- mCertsAdapter.swapCursor(data);
- mStickyList.setAdapter(mCertsAdapter);
- break;
- }
+ mCertsAdapter.swapCursor(data);
+ mStickyList.setAdapter(mCertsAdapter);
// TODO: maybe show not before both are loaded!
setContentShown(true);
@@ -189,14 +160,7 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
* We need to make sure we are no longer using it.
*/
public void onLoaderReset(Loader<Cursor> loader) {
- switch (loader.getId()) {
- case LOADER_SUBKEYS:
- mSubkeysAdapter.swapCursor(null);
- break;
- case LOADER_CERTS:
- mCertsAdapter.swapCursor(null);
- break;
- }
+ mCertsAdapter.swapCursor(null);
}
/**
@@ -307,7 +271,7 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
- return mInflater.inflate(R.layout.view_key_certs_item, parent, false);
+ return mInflater.inflate(R.layout.view_key_adv_certs_item, parent, false);
}
/**
@@ -322,7 +286,7 @@ public class ViewKeyAdvancedFragment extends LoaderFragment implements
HeaderViewHolder holder;
if (convertView == null) {
holder = new HeaderViewHolder();
- convertView = mInflater.inflate(R.layout.view_key_certs_header, parent, false);
+ convertView = mInflater.inflate(R.layout.view_key_adv_certs_header, parent, false);
holder.text = (TextView) convertView.findViewById(R.id.stickylist_header_text);
holder.count = (TextView) convertView.findViewById(R.id.certs_num);
convertView.setTag(holder);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java
index aa260b654..8d0a2dd1d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java
@@ -17,7 +17,7 @@
package org.sufficientlysecure.keychain.ui;
-import android.annotation.TargetApi;
+import android.app.ActivityOptions;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
@@ -26,10 +26,11 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
-import android.provider.Settings;
+import android.support.v4.app.ActivityCompat;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
+import android.support.v7.widget.CardView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -47,7 +48,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.ui.dialog.ShareNfcDialogFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.QrCodeUtils;
@@ -56,20 +56,19 @@ import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException;
-public class ViewKeyShareFragment extends LoaderFragment implements
+public class ViewKeyAdvShareFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
public static final String ARG_DATA_URI = "uri";
private TextView mFingerprint;
- private ImageView mFingerprintQrCode;
+ private ImageView mQrCode;
+ private CardView mQrCodeLayout;
private View mFingerprintShareButton;
private View mFingerprintClipboardButton;
private View mKeyShareButton;
private View mKeyClipboardButton;
private ImageButton mKeySafeSlingerButton;
- private View mNfcHelpButton;
- private View mNfcPrefsButton;
private View mKeyUploadButton;
ProviderHelper mProviderHelper;
@@ -81,31 +80,24 @@ public class ViewKeyShareFragment extends LoaderFragment implements
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
View root = super.onCreateView(inflater, superContainer, savedInstanceState);
- View view = inflater.inflate(R.layout.view_key_share_fragment, getContainer());
+ View view = inflater.inflate(R.layout.view_key_adv_share_fragment, getContainer());
- mProviderHelper = new ProviderHelper(ViewKeyShareFragment.this.getActivity());
+ mProviderHelper = new ProviderHelper(ViewKeyAdvShareFragment.this.getActivity());
mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint);
- mFingerprintQrCode = (ImageView) view.findViewById(R.id.view_key_fingerprint_qr_code_image);
+ mQrCode = (ImageView) view.findViewById(R.id.view_key_qr_code);
+ mQrCodeLayout = (CardView) view.findViewById(R.id.view_key_qr_code_layout);
mFingerprintShareButton = view.findViewById(R.id.view_key_action_fingerprint_share);
mFingerprintClipboardButton = view.findViewById(R.id.view_key_action_fingerprint_clipboard);
mKeyShareButton = view.findViewById(R.id.view_key_action_key_share);
mKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard);
mKeySafeSlingerButton = (ImageButton) view.findViewById(R.id.view_key_action_key_safeslinger);
- mNfcHelpButton = view.findViewById(R.id.view_key_action_nfc_help);
- mNfcPrefsButton = view.findViewById(R.id.view_key_action_nfc_prefs);
mKeyUploadButton = view.findViewById(R.id.view_key_action_upload);
mKeySafeSlingerButton.setColorFilter(getResources().getColor(R.color.tertiary_text_light),
PorterDuff.Mode.SRC_IN);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- mNfcPrefsButton.setVisibility(View.VISIBLE);
- } else {
- mNfcPrefsButton.setVisibility(View.GONE);
- }
-
- mFingerprintQrCode.setOnClickListener(new View.OnClickListener() {
+ mQrCodeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showQrCodeDialog();
@@ -142,18 +134,6 @@ public class ViewKeyShareFragment extends LoaderFragment implements
startSafeSlinger(mDataUri);
}
});
- mNfcHelpButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- showNfcHelpDialog();
- }
- });
- mNfcPrefsButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- showNfcPrefs();
- }
- });
mKeyUploadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -228,10 +208,7 @@ public class ViewKeyShareFragment extends LoaderFragment implements
}
startActivity(Intent.createChooser(sendIntent, title));
}
- } catch (PgpGeneralException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- Notify.showNotify(getActivity(), R.string.error_key_processing, Notify.Style.ERROR);
- } catch (IOException e) {
+ } catch (PgpGeneralException | IOException e) {
Log.e(Constants.TAG, "error processing key!", e);
Notify.showNotify(getActivity(), R.string.error_key_processing, Notify.Style.ERROR);
} catch (ProviderHelper.NotFoundException e) {
@@ -242,20 +219,18 @@ public class ViewKeyShareFragment extends LoaderFragment implements
private void showQrCodeDialog() {
Intent qrCodeIntent = new Intent(getActivity(), QrCodeViewActivity.class);
- qrCodeIntent.setData(mDataUri);
- startActivity(qrCodeIntent);
- }
- private void showNfcHelpDialog() {
- ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance();
- dialog.show(getActivity().getSupportFragmentManager(), "shareNfcDialog");
- }
+ // create the transition animation - the images in the layouts
+ // of both activities are defined with android:transitionName="qr_code"
+ Bundle opts = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ ActivityOptions options = ActivityOptions
+ .makeSceneTransitionAnimation(getActivity(), mQrCodeLayout, "qr_code");
+ opts = options.toBundle();
+ }
- @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
- private void showNfcPrefs() {
- Intent intentSettings = new Intent(
- Settings.ACTION_NFCSHARING_SETTINGS);
- startActivity(intentSettings);
+ qrCodeIntent.setData(mDataUri);
+ ActivityCompat.startActivity(getActivity(), qrCodeIntent, opts);
}
@Override
@@ -361,19 +336,19 @@ public class ViewKeyShareFragment extends LoaderFragment implements
protected void onPostExecute(Bitmap qrCode) {
// only change view, if fragment is attached to activity
- if (ViewKeyShareFragment.this.isAdded()) {
+ if (ViewKeyAdvShareFragment.this.isAdded()) {
// scale the image up to our actual size. we do this in code rather
// than let the ImageView do this because we don't require filtering.
Bitmap scaled = Bitmap.createScaledBitmap(qrCode,
- mFingerprintQrCode.getHeight(), mFingerprintQrCode.getHeight(),
+ mQrCode.getHeight(), mQrCode.getHeight(),
false);
- mFingerprintQrCode.setImageBitmap(scaled);
+ mQrCode.setImageBitmap(scaled);
// simple fade-in animation
AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(200);
- mFingerprintQrCode.startAnimation(anim);
+ mQrCode.startAnimation(anim);
}
}
};
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java
new file mode 100644
index 000000000..bd00c6780
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2014-2015 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;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter;
+import org.sufficientlysecure.keychain.util.Log;
+
+public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ public static final String ARG_DATA_URI = "data_uri";
+
+ private ListView mSubkeysList;
+ private SubkeysAdapter mSubkeysAdapter;
+
+ private Uri mDataUriSubkeys;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static ViewKeyAdvSubkeysFragment newInstance(Uri dataUri) {
+ ViewKeyAdvSubkeysFragment frag = new ViewKeyAdvSubkeysFragment();
+
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_DATA_URI, dataUri);
+
+ frag.setArguments(args);
+ return frag;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_adv_subkeys_fragment, getContainer());
+
+ mSubkeysList = (ListView) view.findViewById(R.id.keys);
+
+ return root;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+
+ loadData(dataUri);
+ }
+
+ private void loadData(Uri dataUri) {
+ mDataUriSubkeys = KeychainContract.Keys.buildKeysUri(dataUri);
+
+ // Create an empty adapter we will use to display the loaded data.
+ mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0);
+ mSubkeysList.setAdapter(mSubkeysAdapter);
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(0, null, this);
+ }
+
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+
+ return new CursorLoader(getActivity(), mDataUriSubkeys,
+ SubkeysAdapter.SUBKEYS_PROJECTION, null, null, null);
+ }
+
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ // Avoid NullPointerExceptions, if we get an empty result set.
+ if (data.getCount() == 0) {
+ return;
+ }
+
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ mSubkeysAdapter.swapCursor(data);
+
+ // TODO: maybe show not before both are loaded!
+ setContentShown(true);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader<Cursor> loader) {
+ mSubkeysAdapter.swapCursor(null);
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java
new file mode 100644
index 000000000..c4e6639a8
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ListView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
+import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
+import org.sufficientlysecure.keychain.ui.dialog.UserIdInfoDialogFragment;
+import org.sufficientlysecure.keychain.util.Log;
+
+public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private ListView mUserIds;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+ private static final int LOADER_ID_USER_IDS = 1;
+
+ private UserIdsAdapter mUserIdsAdapter;
+
+ private Uri mDataUri;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_adv_main_fragment, getContainer());
+
+ mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids);
+
+ mUserIds.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ showUserIdInfo(position);
+ }
+ });
+
+ return root;
+ }
+
+ private void showUserIdInfo(final int position) {
+ final boolean isRevoked = mUserIdsAdapter.getIsRevoked(position);
+ final int isVerified = mUserIdsAdapter.getIsVerified(position);
+
+ DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
+ public void run() {
+ UserIdInfoDialogFragment dialogFragment =
+ UserIdInfoDialogFragment.newInstance(isRevoked, isVerified);
+
+ dialogFragment.show(getActivity().getSupportFragmentManager(), "userIdInfoDialog");
+ }
+ });
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+
+ loadData(dataUri);
+ }
+
+ private void loadData(Uri dataUri) {
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0);
+ mUserIds.setAdapter(mUserIdsAdapter);
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+ getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
+ }
+
+ static final String[] UNIFIED_PROJECTION = new String[]{
+ KeyRings._ID, KeyRings.MASTER_KEY_ID,
+ KeyRings.HAS_ANY_SECRET, KeyRings.IS_REVOKED, KeyRings.EXPIRY, KeyRings.HAS_ENCRYPT
+ };
+ static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
+ static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
+ static final int INDEX_UNIFIED_IS_REVOKED = 3;
+ static final int INDEX_UNIFIED_EXPIRY = 4;
+ static final int INDEX_UNIFIED_HAS_ENCRYPT = 5;
+
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
+ }
+ case LOADER_ID_USER_IDS: {
+ Uri baseUri = UserPackets.buildUserIdsUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri,
+ UserIdsAdapter.USER_IDS_PROJECTION, null, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+
+
+ break;
+ }
+ }
+
+ case LOADER_ID_USER_IDS: {
+ mUserIdsAdapter.swapCursor(data);
+ break;
+ }
+
+ }
+ setContentShown(true);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader<Cursor> loader) {
+ switch (loader.getId()) {
+ case LOADER_ID_USER_IDS:
+ mUserIdsAdapter.swapCursor(null);
+ break;
+ }
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
new file mode 100644
index 000000000..453bfd499
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ListView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
+import org.sufficientlysecure.keychain.ui.dialog.UserIdInfoDialogFragment;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.Date;
+
+public class ViewKeyFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private ListView mUserIds;
+
+ boolean mIsSecret = false;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+ private static final int LOADER_ID_USER_IDS = 1;
+
+ private UserIdsAdapter mUserIdsAdapter;
+
+ private Uri mDataUri;
+
+ ProviderHelper mProviderHelper;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static ViewKeyFragment newInstance(Uri dataUri) {
+ ViewKeyFragment frag = new ViewKeyFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_DATA_URI, dataUri);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_fragment, getContainer());
+
+ mProviderHelper = new ProviderHelper(getActivity());
+
+ mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids);
+
+ mUserIds.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ showUserIdInfo(position);
+ }
+ });
+
+ return root;
+ }
+
+ private void showUserIdInfo(final int position) {
+ if (!mIsSecret) {
+ final boolean isRevoked = mUserIdsAdapter.getIsRevoked(position);
+ final int isVerified = mUserIdsAdapter.getIsVerified(position);
+
+ DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
+ public void run() {
+ UserIdInfoDialogFragment dialogFragment =
+ UserIdInfoDialogFragment.newInstance(isRevoked, isVerified);
+
+ dialogFragment.show(getActivity().getSupportFragmentManager(), "userIdInfoDialog");
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+
+ loadData(dataUri);
+ }
+
+
+ // These are the rows that we will retrieve.
+ static final String[] UNIFIED_PROJECTION = new String[]{
+ KeychainContract.KeyRings._ID,
+ KeychainContract.KeyRings.MASTER_KEY_ID,
+ KeychainContract.KeyRings.USER_ID,
+ KeychainContract.KeyRings.IS_REVOKED,
+ KeychainContract.KeyRings.EXPIRY,
+ KeychainContract.KeyRings.VERIFIED,
+ KeychainContract.KeyRings.HAS_ANY_SECRET,
+ KeychainContract.KeyRings.FINGERPRINT,
+ KeychainContract.KeyRings.HAS_ENCRYPT
+ };
+
+ static final int INDEX_MASTER_KEY_ID = 1;
+ static final int INDEX_USER_ID = 2;
+ static final int INDEX_IS_REVOKED = 3;
+ static final int INDEX_EXPIRY = 4;
+ static final int INDEX_VERIFIED = 5;
+ static final int INDEX_HAS_ANY_SECRET = 6;
+ static final int INDEX_FINGERPRINT = 7;
+ static final int INDEX_HAS_ENCRYPT = 8;
+
+ private void loadData(Uri dataUri) {
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
+ }
+
+ // don't show revoked user ids here, irrelevant for average users
+ public static final String USER_IDS_WHERE = UserPackets.IS_REVOKED + " = 0";
+
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+
+ switch (id) {
+ case LOADER_ID_UNIFIED: {
+ Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
+ }
+ case LOADER_ID_USER_IDS: {
+ Uri baseUri = UserPackets.buildUserIdsUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri,
+ UserIdsAdapter.USER_IDS_PROJECTION, USER_IDS_WHERE, null, null);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ switch (loader.getId()) {
+ case LOADER_ID_UNIFIED: {
+ if (data.moveToFirst()) {
+
+ mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
+ boolean hasEncrypt = data.getInt(INDEX_HAS_ENCRYPT) != 0;
+ boolean isRevoked = data.getInt(INDEX_IS_REVOKED) > 0;
+ boolean isExpired = !data.isNull(INDEX_EXPIRY)
+ && new Date(data.getLong(INDEX_EXPIRY) * 1000).before(new Date());
+ boolean isVerified = data.getInt(INDEX_VERIFIED) > 0;
+
+ // load user ids after we know if it's a secret key
+ mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, false, !mIsSecret, null);
+ mUserIds.setAdapter(mUserIdsAdapter);
+ getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
+
+ break;
+ }
+ }
+
+ case LOADER_ID_USER_IDS: {
+ mUserIdsAdapter.swapCursor(data);
+ break;
+ }
+
+ }
+ setContentShown(true);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader<Cursor> loader) {
+ switch (loader.getId()) {
+ case LOADER_ID_USER_IDS: {
+ mUserIdsAdapter.swapCursor(null);
+ break;
+ }
+ }
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
deleted file mode 100644
index 8101006e1..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
- *
- * 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;
-
-import android.content.Intent;
-import android.database.Cursor;
-import android.graphics.PorterDuff;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ImageView;
-import android.widget.ListView;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
-import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
-import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
-import org.sufficientlysecure.keychain.ui.linked.LinkedIdWizard;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
-import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
-import org.sufficientlysecure.keychain.ui.dialog.UserIdInfoDialogFragment;
-import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.ui.util.Notify;
-
-import java.util.Date;
-
-public class ViewKeyMainFragment extends LoaderFragment implements
- LoaderManager.LoaderCallbacks<Cursor> {
-
- public static final String ARG_DATA_URI = "uri";
-
- private View mActionLink, mActionLinkDivider;
- private View mActionEdit;
- private View mActionEditDivider;
- private View mActionEncryptFiles;
- private View mActionEncryptText;
- private View mActionEncryptTextText;
- private View mActionCertify;
- private View mActionCertifyText;
- private ImageView mActionCertifyImage;
- private View mActionUpdate;
-
- private ListView mUserIds;
-
- private static final int LOADER_ID_UNIFIED = 0;
- private static final int LOADER_ID_USER_IDS = 1;
-
- // conservative attitude
- private boolean mHasEncrypt = true;
-
- private UserIdsAdapter mUserIdsAdapter;
-
- private Uri mDataUri;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
- View root = super.onCreateView(inflater, superContainer, savedInstanceState);
- View view = inflater.inflate(R.layout.view_key_main_fragment, getContainer());
-
- mUserIds = (ListView) view.findViewById(R.id.view_key_user_ids);
- mActionLink = view.findViewById(R.id.view_key_action_link);
- mActionLinkDivider = view.findViewById(R.id.view_key_action_link);
- mActionEdit = view.findViewById(R.id.view_key_action_edit);
- mActionEditDivider = view.findViewById(R.id.view_key_action_edit_divider);
- mActionEncryptText = view.findViewById(R.id.view_key_action_encrypt_text);
- mActionEncryptTextText = view.findViewById(R.id.view_key_action_encrypt_text_text);
- mActionEncryptFiles = view.findViewById(R.id.view_key_action_encrypt_files);
- mActionCertify = view.findViewById(R.id.view_key_action_certify);
- mActionCertifyText = view.findViewById(R.id.view_key_action_certify_text);
- mActionCertifyImage = (ImageView) view.findViewById(R.id.view_key_action_certify_image);
- // make certify image gray, like action icons
- mActionCertifyImage.setColorFilter(getResources().getColor(R.color.tertiary_text_light),
- PorterDuff.Mode.SRC_IN);
- mActionUpdate = view.findViewById(R.id.view_key_action_update);
-
- mUserIds.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- showUserIdInfo(position);
- }
- });
-
- return root;
- }
-
- private void showUserIdInfo(final int position) {
- final boolean isRevoked = mUserIdsAdapter.getIsRevoked(position);
- final int isVerified = mUserIdsAdapter.getIsVerified(position);
-
- DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
- public void run() {
- UserIdInfoDialogFragment dialogFragment =
- UserIdInfoDialogFragment.newInstance(isRevoked, isVerified);
-
- dialogFragment.show(getActivity().getSupportFragmentManager(), "userIdInfoDialog");
- }
- });
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
- if (dataUri == null) {
- Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
- getActivity().finish();
- return;
- }
-
- loadData(dataUri);
- }
-
- private void loadData(Uri dataUri) {
- mDataUri = dataUri;
-
- Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
-
- mActionEncryptFiles.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- encrypt(mDataUri, false);
- }
- });
- mActionEncryptText.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- encrypt(mDataUri, true);
- }
- });
- mActionCertify.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- certify(mDataUri);
- }
- });
- mActionLink.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- linkKey(mDataUri);
- }
- });
- mActionEdit.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- editKey(mDataUri);
- }
- });
- mActionUpdate.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- try {
- updateFromKeyserver(mDataUri, new ProviderHelper(getActivity()));
- } catch (NotFoundException e) {
- Notify.showNotify(getActivity(), R.string.error_key_not_found, Notify.Style.ERROR);
- }
- }
- });
-
- mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0);
- mUserIds.setAdapter(mUserIdsAdapter);
-
- // Prepare the loaders. Either re-connect with an existing ones,
- // or start new ones.
- getLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
- getLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
- }
-
- static final String[] UNIFIED_PROJECTION = new String[]{
- KeyRings._ID, KeyRings.MASTER_KEY_ID,
- KeyRings.HAS_ANY_SECRET, KeyRings.IS_REVOKED, KeyRings.EXPIRY, KeyRings.HAS_ENCRYPT
- };
- static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
- static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
- static final int INDEX_UNIFIED_IS_REVOKED = 3;
- static final int INDEX_UNIFIED_EXPIRY = 4;
- static final int INDEX_UNIFIED_HAS_ENCRYPT = 5;
-
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- setContentShown(false);
-
- switch (id) {
- case LOADER_ID_UNIFIED: {
- Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
- return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
- }
- case LOADER_ID_USER_IDS: {
- Uri baseUri = UserPackets.buildUserIdsUri(mDataUri);
- return new CursorLoader(getActivity(), baseUri,
- UserIdsAdapter.USER_IDS_PROJECTION, null, null, null);
- }
-
- default:
- return null;
- }
- }
-
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- /* TODO better error handling? May cause problems when a key is deleted,
- * because the notification triggers faster than the activity closes.
- */
- // Avoid NullPointerExceptions...
- if (data.getCount() == 0) {
- return;
- }
- // Swap the new cursor in. (The framework will take care of closing the
- // old cursor once we return.)
- switch (loader.getId()) {
- case LOADER_ID_UNIFIED: {
- if (data.moveToFirst()) {
- if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
- // edit button
- mActionLink.setVisibility(View.VISIBLE);
- mActionLinkDivider.setVisibility(View.VISIBLE);
- mActionEdit.setVisibility(View.VISIBLE);
- mActionEditDivider.setVisibility(View.VISIBLE);
- } else {
- // edit button
- mActionLink.setVisibility(View.GONE);
- mActionLinkDivider.setVisibility(View.GONE);
- mActionEdit.setVisibility(View.GONE);
- mActionEditDivider.setVisibility(View.GONE);
- }
-
- // If this key is revoked, it cannot be used for anything!
- if (data.getInt(INDEX_UNIFIED_IS_REVOKED) != 0) {
- mActionEdit.setEnabled(false);
- mActionCertify.setEnabled(false);
- mActionCertifyText.setEnabled(false);
- mActionEncryptText.setEnabled(false);
- mActionEncryptTextText.setEnabled(false);
- mActionEncryptFiles.setEnabled(false);
- } else {
- mActionEdit.setEnabled(true);
-
- Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000);
- if (!data.isNull(INDEX_UNIFIED_EXPIRY) && expiryDate.before(new Date())) {
- mActionCertify.setEnabled(false);
- mActionCertifyText.setEnabled(false);
- mActionEncryptText.setEnabled(false);
- mActionEncryptTextText.setEnabled(false);
- mActionEncryptFiles.setEnabled(false);
- } else {
- mActionCertify.setEnabled(true);
- mActionCertifyText.setEnabled(true);
- mActionEncryptText.setEnabled(true);
- mActionEncryptTextText.setEnabled(true);
- mActionEncryptFiles.setEnabled(true);
- }
- }
-
- mHasEncrypt = data.getInt(INDEX_UNIFIED_HAS_ENCRYPT) != 0;
-
- break;
- }
- }
-
- case LOADER_ID_USER_IDS:
- mUserIdsAdapter.swapCursor(data);
- break;
-
- }
- setContentShown(true);
- }
-
- /**
- * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
- * We need to make sure we are no longer using it.
- */
- public void onLoaderReset(Loader<Cursor> loader) {
- switch (loader.getId()) {
- case LOADER_ID_USER_IDS:
- mUserIdsAdapter.swapCursor(null);
- break;
- }
- }
-
- private void encrypt(Uri dataUri, boolean text) {
- // If there is no encryption key, don't bother.
- if (!mHasEncrypt) {
- Notify.showNotify(getActivity(), R.string.error_no_encrypt_subkey, Notify.Style.ERROR);
- return;
- }
- try {
- long keyId = new ProviderHelper(getActivity())
- .getCachedPublicKeyRing(dataUri)
- .extractOrGetMasterKeyId();
- long[] encryptionKeyIds = new long[]{keyId};
- Intent intent;
- if (text) {
- intent = new Intent(getActivity(), EncryptTextActivity.class);
- intent.setAction(EncryptTextActivity.ACTION_ENCRYPT_TEXT);
- intent.putExtra(EncryptTextActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds);
- } else {
- intent = new Intent(getActivity(), EncryptFilesActivity.class);
- intent.setAction(EncryptFilesActivity.ACTION_ENCRYPT_DATA);
- intent.putExtra(EncryptFilesActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds);
- }
- // used instead of startActivity set actionbar based on callingPackage
- startActivityForResult(intent, 0);
- } catch (PgpKeyNotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- }
- }
-
- private void updateFromKeyserver(Uri dataUri, ProviderHelper providerHelper)
- throws ProviderHelper.NotFoundException {
- byte[] blob = (byte[]) providerHelper.getGenericData(
- KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
- KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
- String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob);
-
- Intent queryIntent = new Intent(getActivity(), ImportKeysActivity.class);
- queryIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT);
- queryIntent.putExtra(ImportKeysActivity.EXTRA_FINGERPRINT, fingerprint);
-
- startActivityForResult(queryIntent, 0);
- }
-
- private void certify(Uri dataUri) {
- long keyId = 0;
- try {
- keyId = new ProviderHelper(getActivity())
- .getCachedPublicKeyRing(dataUri)
- .extractOrGetMasterKeyId();
- } catch (PgpKeyNotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- }
- Intent certifyIntent = new Intent(getActivity(), CertifyKeyActivity.class);
- certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{keyId});
- startActivityForResult(certifyIntent, 0);
- }
-
- private void editKey(Uri dataUri) {
- Intent editIntent = new Intent(getActivity(), EditKeyActivity.class);
- editIntent.setData(KeychainContract.KeyRingData.buildSecretKeyRingUri(dataUri));
- startActivityForResult(editIntent, 0);
- }
-
- private void linkKey(Uri dataUri) {
- Intent editIntent = new Intent(getActivity(), LinkedIdWizard.class);
- editIntent.setData(KeyRings.buildUnifiedKeyRingUri(dataUri));
- startActivityForResult(editIntent, 0);
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
new file mode 100644
index 000000000..25edc7a02
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
@@ -0,0 +1,460 @@
+/*
+ * Copyright (C) 2014 Tim Bray <tbray@textuality.com>
+ *
+ * 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;
+
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.StyleSpan;
+import android.text.style.URLSpan;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+
+import com.textuality.keybase.lib.KeybaseException;
+import com.textuality.keybase.lib.Proof;
+import com.textuality.keybase.lib.User;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.List;
+
+public class ViewKeyTrustFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private View mStartSearch;
+ private TextView mTrustReadout;
+ private TextView mReportHeader;
+ private TableLayout mProofListing;
+ private LayoutInflater mInflater;
+ private View mProofVerifyHeader;
+ private TextView mProofVerifyDetail;
+
+ private static final int LOADER_ID_DATABASE = 1;
+
+ // for retrieving the key we’re working on
+ private Uri mDataUri;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_adv_keybase_fragment, getContainer());
+ mInflater = inflater;
+
+ mTrustReadout = (TextView) view.findViewById(R.id.view_key_trust_readout);
+ mStartSearch = view.findViewById(R.id.view_key_trust_search_cloud);
+ mStartSearch.setEnabled(false);
+ mReportHeader = (TextView) view.findViewById(R.id.view_key_trust_cloud_narrative);
+ mProofListing = (TableLayout) view.findViewById(R.id.view_key_proof_list);
+ mProofVerifyHeader = view.findViewById(R.id.view_key_proof_verify_header);
+ mProofVerifyDetail = (TextView) view.findViewById(R.id.view_key_proof_verify_detail);
+ mReportHeader.setVisibility(View.GONE);
+ mProofListing.setVisibility(View.GONE);
+ mProofVerifyHeader.setVisibility(View.GONE);
+ mProofVerifyDetail.setVisibility(View.GONE);
+
+ return root;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Uri dataUri = getArguments().getParcelable(ARG_DATA_URI);
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ getActivity().finish();
+ return;
+ }
+ mDataUri = dataUri;
+
+ // retrieve the key from the database
+ getLoaderManager().initLoader(LOADER_ID_DATABASE, null, this);
+ }
+
+ static final String[] TRUST_PROJECTION = new String[]{
+ KeyRings._ID, KeyRings.FINGERPRINT, KeyRings.IS_REVOKED, KeyRings.EXPIRY,
+ KeyRings.HAS_ANY_SECRET, KeyRings.VERIFIED
+ };
+ static final int INDEX_TRUST_FINGERPRINT = 1;
+ static final int INDEX_TRUST_IS_REVOKED = 2;
+ static final int INDEX_TRUST_EXPIRY = 3;
+ static final int INDEX_UNIFIED_HAS_ANY_SECRET = 4;
+ static final int INDEX_VERIFIED = 5;
+
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+
+ switch (id) {
+ case LOADER_ID_DATABASE: {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, TRUST_PROJECTION, null, null, null);
+ }
+ // decided to just use an AsyncTask for keybase, but maybe later
+ default:
+ return null;
+ }
+ }
+
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ /* TODO better error handling? May cause problems when a key is deleted,
+ * because the notification triggers faster than the activity closes.
+ */
+ // Avoid NullPointerExceptions...
+ if (data.getCount() == 0) {
+ return;
+ }
+
+ boolean nothingSpecial = true;
+ StringBuilder message = new StringBuilder();
+
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ if (data.moveToFirst()) {
+
+ if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
+ message.append(getString(R.string.key_trust_it_is_yours)).append("\n");
+ nothingSpecial = false;
+ } else if (data.getInt(INDEX_VERIFIED) != 0) {
+ message.append(getString(R.string.key_trust_already_verified)).append("\n");
+ nothingSpecial = false;
+ }
+
+ // If this key is revoked, don’t trust it!
+ if (data.getInt(INDEX_TRUST_IS_REVOKED) != 0) {
+ message.append(getString(R.string.key_trust_revoked)).
+ append(getString(R.string.key_trust_old_keys));
+
+ nothingSpecial = false;
+ } else {
+ Date expiryDate = new Date(data.getLong(INDEX_TRUST_EXPIRY) * 1000);
+ if (!data.isNull(INDEX_TRUST_EXPIRY) && expiryDate.before(new Date())) {
+
+ // if expired, don’t trust it!
+ message.append(getString(R.string.key_trust_expired)).
+ append(getString(R.string.key_trust_old_keys));
+
+ nothingSpecial = false;
+ }
+ }
+
+ if (nothingSpecial) {
+ message.append(getString(R.string.key_trust_maybe));
+ }
+
+ final byte[] fp = data.getBlob(INDEX_TRUST_FINGERPRINT);
+ final String fingerprint = KeyFormattingUtils.convertFingerprintToHex(fp);
+ if (fingerprint != null) {
+
+ mStartSearch.setEnabled(true);
+ mStartSearch.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mStartSearch.setEnabled(false);
+ new DescribeKey().execute(fingerprint);
+ }
+ });
+ }
+ }
+
+ mTrustReadout.setText(message);
+ setContentShown(true);
+ }
+
+ /**
+ * This is called when the last Cursor provided to onLoadFinished() above is about to be closed.
+ * We need to make sure we are no longer using it.
+ */
+ public void onLoaderReset(Loader<Cursor> loader) {
+ // no-op in this case I think
+ }
+
+ class ResultPage {
+ String mHeader;
+ final List<CharSequence> mProofs;
+
+ public ResultPage(String header, List<CharSequence> proofs) {
+ mHeader = header;
+ mProofs = proofs;
+ }
+ }
+
+ // look for evidence from keybase in the background, make tabular version of result
+ //
+ private class DescribeKey extends AsyncTask<String, Void, ResultPage> {
+
+ @Override
+ protected ResultPage doInBackground(String... args) {
+ String fingerprint = args[0];
+
+ final ArrayList<CharSequence> proofList = new ArrayList<CharSequence>();
+ final Hashtable<Integer, ArrayList<Proof>> proofs = new Hashtable<Integer, ArrayList<Proof>>();
+ try {
+ User keybaseUser = User.findByFingerprint(fingerprint);
+ for (Proof proof : keybaseUser.getProofs()) {
+ Integer proofType = proof.getType();
+ appendIfOK(proofs, proofType, proof);
+ }
+
+ // a one-liner in a modern programming language
+ for (Integer proofType : proofs.keySet()) {
+ Proof[] x = {};
+ Proof[] proofsFor = proofs.get(proofType).toArray(x);
+ if (proofsFor.length > 0) {
+ SpannableStringBuilder ssb = new SpannableStringBuilder();
+ ssb.append(getProofNarrative(proofType)).append(" ");
+
+ int i = 0;
+ while (i < proofsFor.length - 1) {
+ appendProofLinks(ssb, fingerprint, proofsFor[i]);
+ ssb.append(", ");
+ i++;
+ }
+ appendProofLinks(ssb, fingerprint, proofsFor[i]);
+ proofList.add(ssb);
+ }
+ }
+
+ } catch (KeybaseException ignored) {
+ }
+
+ return new ResultPage(getString(R.string.key_trust_results_prefix), proofList);
+ }
+
+ private SpannableStringBuilder appendProofLinks(SpannableStringBuilder ssb, final String fingerprint, final Proof proof) throws KeybaseException {
+ int startAt = ssb.length();
+ String handle = proof.getHandle();
+ ssb.append(handle);
+ ssb.setSpan(new URLSpan(proof.getServiceUrl()), startAt, startAt + handle.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ if (haveProofFor(proof.getType())) {
+ ssb.append("\u00a0[");
+ startAt = ssb.length();
+ String verify = getString(R.string.keybase_verify);
+ ssb.append(verify);
+ ClickableSpan clicker = new ClickableSpan() {
+ @Override
+ public void onClick(View view) {
+ verify(proof, fingerprint);
+ }
+ };
+ ssb.setSpan(clicker, startAt, startAt + verify.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append("]");
+ }
+ return ssb;
+ }
+
+ @Override
+ protected void onPostExecute(ResultPage result) {
+ super.onPostExecute(result);
+ if (result.mProofs.isEmpty()) {
+ result.mHeader = getActivity().getString(R.string.key_trust_no_cloud_evidence);
+ }
+
+ mStartSearch.setVisibility(View.GONE);
+ mReportHeader.setVisibility(View.VISIBLE);
+ mProofListing.setVisibility(View.VISIBLE);
+ mReportHeader.setText(result.mHeader);
+
+ int rowNumber = 1;
+ for (CharSequence s : result.mProofs) {
+ TableRow row = (TableRow) mInflater.inflate(R.layout.view_key_adv_keybase_proof, null);
+ TextView number = (TextView) row.findViewById(R.id.proof_number);
+ TextView text = (TextView) row.findViewById(R.id.proof_text);
+ number.setText(Integer.toString(rowNumber++) + ". ");
+ text.setText(s);
+ text.setMovementMethod(LinkMovementMethod.getInstance());
+ mProofListing.addView(row);
+ }
+
+ // mSearchReport.loadDataWithBaseURL("file:///android_res/drawable/", s, "text/html", "UTF-8", null);
+ }
+ }
+
+ private String getProofNarrative(int proofType) {
+ int stringIndex;
+ switch (proofType) {
+ case Proof.PROOF_TYPE_TWITTER: stringIndex = R.string.keybase_narrative_twitter; break;
+ case Proof.PROOF_TYPE_GITHUB: stringIndex = R.string.keybase_narrative_github; break;
+ case Proof.PROOF_TYPE_DNS: stringIndex = R.string.keybase_narrative_dns; break;
+ case Proof.PROOF_TYPE_WEB_SITE: stringIndex = R.string.keybase_narrative_web_site; break;
+ case Proof.PROOF_TYPE_HACKERNEWS: stringIndex = R.string.keybase_narrative_hackernews; break;
+ case Proof.PROOF_TYPE_COINBASE: stringIndex = R.string.keybase_narrative_coinbase; break;
+ case Proof.PROOF_TYPE_REDDIT: stringIndex = R.string.keybase_narrative_reddit; break;
+ default: stringIndex = R.string.keybase_narrative_unknown;
+ }
+ return getActivity().getString(stringIndex);
+ }
+
+ private void appendIfOK(Hashtable<Integer, ArrayList<Proof>> table, Integer proofType, Proof proof) throws KeybaseException {
+ ArrayList<Proof> list = table.get(proofType);
+ if (list == null) {
+ list = new ArrayList<Proof>();
+ table.put(proofType, list);
+ }
+ list.add(proof);
+ }
+
+ // which proofs do we have working verifiers for?
+ private boolean haveProofFor(int proofType) {
+ switch (proofType) {
+ case Proof.PROOF_TYPE_TWITTER: return true;
+ case Proof.PROOF_TYPE_GITHUB: return true;
+ case Proof.PROOF_TYPE_DNS: return true;
+ case Proof.PROOF_TYPE_WEB_SITE: return true;
+ case Proof.PROOF_TYPE_HACKERNEWS: return true;
+ case Proof.PROOF_TYPE_COINBASE: return true;
+ case Proof.PROOF_TYPE_REDDIT: return true;
+ default: return false;
+ }
+ }
+
+ private void verify(final Proof proof, final String fingerprint) {
+ Intent intent = new Intent(getActivity(), KeychainIntentService.class);
+ Bundle data = new Bundle();
+ intent.setAction(KeychainIntentService.ACTION_VERIFY_KEYBASE_PROOF);
+
+ data.putString(KeychainIntentService.KEYBASE_PROOF, proof.toString());
+ data.putString(KeychainIntentService.KEYBASE_REQUIRED_FINGERPRINT, fingerprint);
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ mProofVerifyDetail.setVisibility(View.GONE);
+
+ // Create a new Messenger for the communication back after proof work is done
+ //
+ KeychainIntentServiceHandler handler = new KeychainIntentServiceHandler(getActivity(),
+ getString(R.string.progress_verifying_signature), ProgressDialog.STYLE_HORIZONTAL) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ Bundle returnData = message.getData();
+ String msg = returnData.getString(KeychainIntentServiceHandler.DATA_MESSAGE);
+ SpannableStringBuilder ssb = new SpannableStringBuilder();
+
+ if ((msg != null) && msg.equals("OK")) {
+
+ //yay
+ String proofUrl = returnData.getString(KeychainIntentServiceHandler.KEYBASE_PROOF_URL);
+ String presenceUrl = returnData.getString(KeychainIntentServiceHandler.KEYBASE_PRESENCE_URL);
+ String presenceLabel = returnData.getString(KeychainIntentServiceHandler.KEYBASE_PRESENCE_LABEL);
+
+ String proofLabel;
+ switch (proof.getType()) {
+ case Proof.PROOF_TYPE_TWITTER:
+ proofLabel = getString(R.string.keybase_twitter_proof);
+ break;
+ case Proof.PROOF_TYPE_DNS:
+ proofLabel = getString(R.string.keybase_dns_proof);
+ break;
+ case Proof.PROOF_TYPE_WEB_SITE:
+ proofLabel = getString(R.string.keybase_web_site_proof);
+ break;
+ case Proof.PROOF_TYPE_GITHUB:
+ proofLabel = getString(R.string.keybase_github_proof);
+ break;
+ case Proof.PROOF_TYPE_REDDIT:
+ proofLabel = getString(R.string.keybase_reddit_proof);
+ break;
+ default:
+ proofLabel = getString(R.string.keybase_a_post);
+ break;
+ }
+
+ ssb.append(getString(R.string.keybase_proof_succeeded));
+ StyleSpan bold = new StyleSpan(Typeface.BOLD);
+ ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append("\n\n");
+ int length = ssb.length();
+ ssb.append(proofLabel);
+ if (proofUrl != null) {
+ URLSpan postLink = new URLSpan(proofUrl);
+ ssb.setSpan(postLink, length, length + proofLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+ if (Proof.PROOF_TYPE_DNS == proof.getType()) {
+ ssb.append(" ").append(getString(R.string.keybase_for_the_domain)).append(" ");
+ } else {
+ ssb.append(" ").append(getString(R.string.keybase_fetched_from)).append(" ");
+ }
+ length = ssb.length();
+ URLSpan presenceLink = new URLSpan(presenceUrl);
+ ssb.append(presenceLabel);
+ ssb.setSpan(presenceLink, length, length + presenceLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ if (Proof.PROOF_TYPE_REDDIT == proof.getType()) {
+ ssb.append(", ").
+ append(getString(R.string.keybase_reddit_attribution)).
+ append(" “").append(proof.getHandle()).append("”, ");
+ }
+ ssb.append(" ").append(getString(R.string.keybase_contained_signature));
+ } else {
+ // verification failed!
+ msg = returnData.getString(KeychainIntentServiceHandler.DATA_ERROR);
+ ssb.append(getString(R.string.keybase_proof_failure));
+ if (msg == null) {
+ msg = getString(R.string.keybase_unknown_proof_failure);
+ }
+ StyleSpan bold = new StyleSpan(Typeface.BOLD);
+ ssb.setSpan(bold, 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ ssb.append("\n\n").append(msg);
+ }
+ mProofVerifyHeader.setVisibility(View.VISIBLE);
+ mProofVerifyDetail.setVisibility(View.VISIBLE);
+ mProofVerifyDetail.setMovementMethod(LinkMovementMethod.getInstance());
+ mProofVerifyDetail.setText(ssb);
+ }
+ }
+ };
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(handler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ // show progress dialog
+ handler.showProgressDialog(getActivity());
+
+ // start service with intent
+ getActivity().startService(intent);
+ }
+}
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 6c81e9193..6ba9e26ad 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
@@ -95,8 +95,8 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
* @see org.sufficientlysecure.keychain.operations.ImportExportOperation
*/
public ArrayList<ImportKeysListEntry> getSelectedEntries() {
- ArrayList<ImportKeysListEntry> result = new ArrayList<ImportKeysListEntry>();
- ArrayList<ImportKeysListEntry> secrets = new ArrayList<ImportKeysListEntry>();
+ ArrayList<ImportKeysListEntry> result = new ArrayList<>();
+ ArrayList<ImportKeysListEntry> secrets = new ArrayList<>();
if (mData == null) {
return result;
}
@@ -175,9 +175,9 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
}
if (entry.isRevoked()) {
- KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_REVOKED, true);
+ KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray);
} else if (entry.isExpired()) {
- KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_EXPIRED, true);
+ KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray);
}
if (entry.isRevoked() || entry.isExpired()) {
@@ -213,8 +213,24 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
// destroyLoader view from holder
holder.userIdsList.removeAllViews();
+ // we want conventional gpg UserIDs first, then Keybase ”proofs”
HashMap<String, HashSet<String>> mergedUserIds = entry.getMergedUserIds();
- for (Map.Entry<String, HashSet<String>> pair : mergedUserIds.entrySet()) {
+ ArrayList<Map.Entry<String, HashSet<String>>> sortedIds = new ArrayList<Map.Entry<String, HashSet<String>>>(mergedUserIds.entrySet());
+ java.util.Collections.sort(sortedIds, new java.util.Comparator<Map.Entry<String, HashSet<String>>>() {
+ @Override
+ public int compare(Map.Entry<String, HashSet<String>> entry1, Map.Entry<String, HashSet<String>> entry2) {
+
+ // sort keybase UserIds after non-Keybase
+ boolean e1IsKeybase = entry1.getKey().contains(":");
+ boolean e2IsKeybase = entry2.getKey().contains(":");
+ if (e1IsKeybase != e2IsKeybase) {
+ return (e1IsKeybase) ? 1 : -1;
+ }
+ return entry1.getKey().compareTo(entry2.getKey());
+ }
+ });
+
+ for (Map.Entry<String, HashSet<String>> pair : sortedIds) {
String cUserId = pair.getKey();
HashSet<String> cEmails = pair.getValue();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java
index 176c3ff5b..4781864dd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java
@@ -21,13 +21,13 @@ import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.keyimport.CloudSearch;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.Keyserver;
import org.sufficientlysecure.keychain.operations.results.GetKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.util.Preferences;
-import org.sufficientlysecure.keychain.keyimport.CloudSearch;
-import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.util.ArrayList;
@@ -39,7 +39,7 @@ public class ImportKeysListCloudLoader
Preferences.CloudSearchPrefs mCloudPrefs;
String mServerQuery;
- private ArrayList<ImportKeysListEntry> mEntryList = new ArrayList<ImportKeysListEntry>();
+ private ArrayList<ImportKeysListEntry> mEntryList = new ArrayList<>();
private AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> mEntryListWrapper;
public ImportKeysListCloudLoader(Context context, String serverQuery, Preferences.CloudSearchPrefs cloudPrefs) {
@@ -51,7 +51,7 @@ public class ImportKeysListCloudLoader
@Override
public AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> loadInBackground() {
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null);
+ mEntryListWrapper = new AsyncTaskResultWrapper<>(mEntryList, null);
if (mServerQuery == null) {
Log.e(Constants.TAG, "mServerQuery is null!");
@@ -119,7 +119,7 @@ public class ImportKeysListCloudLoader
mEntryList.addAll(searchResult);
}
GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_OK, null);
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, getKeyResult);
+ mEntryListWrapper = new AsyncTaskResultWrapper<>(mEntryList, getKeyResult);
} catch (Keyserver.CloudSearchFailureException e) {
// convert exception to result parcel
int error = GetKeyResult.RESULT_ERROR;
@@ -140,7 +140,7 @@ public class ImportKeysListCloudLoader
OperationResult.OperationLog log = new OperationResult.OperationLog();
log.add(logType, 0);
GetKeyResult getKeyResult = new GetKeyResult(error, log);
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, getKeyResult);
+ mEntryListWrapper = new AsyncTaskResultWrapper<>(mEntryList, getKeyResult);
}
}
}
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 cecad2716..5447c5f96 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
@@ -24,9 +24,9 @@ import android.support.v4.util.LongSparseArray;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
-import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.operations.results.GetKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing.IteratorWithIOThrow;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
@@ -35,28 +35,15 @@ import org.sufficientlysecure.keychain.util.PositionAwareInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Iterator;
public class ImportKeysListLoader
extends AsyncTaskLoader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
- public static class NonPgpPartException extends Exception {
- private int mCount;
-
- public NonPgpPartException(int count) {
- this.mCount = count;
- }
-
- public int getCount() {
- return mCount;
- }
- }
-
final Context mContext;
final InputData mInputData;
- ArrayList<ImportKeysListEntry> mData = new ArrayList<ImportKeysListEntry>();
- LongSparseArray<ParcelableKeyRing> mParcelableRings = new LongSparseArray<ParcelableKeyRing>();
+ ArrayList<ImportKeysListEntry> mData = new ArrayList<>();
+ LongSparseArray<ParcelableKeyRing> mParcelableRings = new LongSparseArray<>();
AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> mEntryListWrapper;
public ImportKeysListLoader(Context context, InputData inputData) {
@@ -73,7 +60,7 @@ public class ImportKeysListLoader
}
GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_OK, null);
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mData, getKeyResult);
+ mEntryListWrapper = new AsyncTaskResultWrapper<>(mData, getKeyResult);
if (mInputData == null) {
Log.e(Constants.TAG, "Input data is null!");
@@ -140,7 +127,7 @@ public class ImportKeysListLoader
OperationResult.OperationLog log = new OperationResult.OperationLog();
log.add(OperationResult.LogType.MSG_GET_NO_VALID_KEYS, 0);
GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_ERROR_NO_VALID_KEYS, log);
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>
+ mEntryListWrapper = new AsyncTaskResultWrapper<>
(mData, getKeyResult);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyValueSpinnerAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyValueSpinnerAdapter.java
index 80d605fb9..b8fe21941 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyValueSpinnerAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyValueSpinnerAdapter.java
@@ -33,7 +33,7 @@ public class KeyValueSpinnerAdapter extends ArrayAdapter<String> {
static <K, V extends Comparable<? super V>> SortedSet<Map.Entry<K, V>> entriesSortedByValues(
Map<K, V> map) {
- SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<Map.Entry<K, V>>(
+ SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>(
new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java
index 9f29826ef..015775669 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java
@@ -21,13 +21,13 @@ import android.content.Context;
import android.database.Cursor;
import android.os.Parcel;
import android.support.v4.util.LongSparseArray;
+import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
-import android.support.v4.widget.CursorAdapter;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
@@ -44,7 +44,7 @@ public class MultiUserIdsAdapter extends CursorAdapter {
public MultiUserIdsAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
- mCheckStates = new ArrayList<Boolean>();
+ mCheckStates = new ArrayList<>();
}
@Override
@@ -148,7 +148,7 @@ public class MultiUserIdsAdapter extends CursorAdapter {
}
public ArrayList<CertifyAction> getSelectedCertifyActions() {
- LongSparseArray<CertifyAction> actions = new LongSparseArray<CertifyAction>();
+ LongSparseArray<CertifyAction> actions = new LongSparseArray<>();
for (int i = 0; i < mCheckStates.size(); i++) {
if (mCheckStates.get(i)) {
mCursor.moveToPosition(i);
@@ -171,7 +171,7 @@ public class MultiUserIdsAdapter extends CursorAdapter {
}
}
- ArrayList<CertifyAction> result = new ArrayList<CertifyAction>(actions.size());
+ ArrayList<CertifyAction> result = new ArrayList<>(actions.size());
for (int i = 0; i < actions.size(); i++) {
result.add(actions.valueAt(i));
}
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 330254a8f..963e77fe9 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
@@ -27,7 +27,7 @@ import java.util.ArrayList;
public class PagerTabStripAdapter extends FragmentPagerAdapter {
protected final Activity mActivity;
- protected final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+ protected final ArrayList<TabInfo> mTabs = new ArrayList<>();
static final class TabInfo {
public final Class<?> clss;
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 60c130969..a836b35df 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
@@ -30,9 +30,9 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.ui.util.Highlighter;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
/**
@@ -133,11 +133,11 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
boolean enabled;
if (cursor.getInt(mIndexIsRevoked) != 0) {
h.statusIcon.setVisibility(View.VISIBLE);
- KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, KeyFormattingUtils.STATE_REVOKED, true);
+ KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray);
enabled = false;
} else if (cursor.getInt(mIndexIsExpiry) != 0) {
h.statusIcon.setVisibility(View.VISIBLE);
- KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, KeyFormattingUtils.STATE_EXPIRED, true);
+ KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray);
enabled = false;
} else {
h.statusIcon.setVisibility(View.GONE);
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 a032e96fc..ff5fbb49a 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
@@ -35,11 +35,11 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyChange;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.util.Calendar;
import java.util.Date;
@@ -160,7 +160,11 @@ public class SubkeysAdapter extends CursorAdapter {
cursor.getString(INDEX_KEY_CURVE_OID)
));
- if (mSaveKeyringParcel != null && mSaveKeyringParcel.mStripSubKeys.contains(keyId)) {
+ SubkeyChange change = mSaveKeyringParcel != null
+ ? mSaveKeyringParcel.getSubkeyChange(keyId)
+ : null;
+
+ if (change != null && change.mDummyStrip) {
algorithmStr.append(", ");
final SpannableString boldStripped = new SpannableString(
context.getString(R.string.key_stripped)
@@ -268,12 +272,12 @@ public class SubkeysAdapter extends CursorAdapter {
PorterDuff.Mode.SRC_IN);
if (isRevoked) {
- vStatus.setImageResource(R.drawable.status_signature_revoked_cutout);
+ vStatus.setImageResource(R.drawable.status_signature_revoked_cutout_24px);
vStatus.setColorFilter(
mContext.getResources().getColor(R.color.bg_gray),
PorterDuff.Mode.SRC_IN);
} else if (isExpired) {
- vStatus.setImageResource(R.drawable.status_signature_expired_cutout);
+ vStatus.setImageResource(R.drawable.status_signature_expired_cutout_24px);
vStatus.setColorFilter(
mContext.getResources().getColor(R.color.bg_gray),
PorterDuff.Mode.SRC_IN);
@@ -297,7 +301,7 @@ public class SubkeysAdapter extends CursorAdapter {
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
- View view = mInflater.inflate(R.layout.view_key_subkey_item, null);
+ View view = mInflater.inflate(R.layout.view_key_adv_subkey_item, null);
if (mDefaultTextColor == null) {
TextView keyId = (TextView) view.findViewById(R.id.subkey_item_key_id);
mDefaultTextColor = keyId.getTextColors();
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 9f5d5341e..d2359a387 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
@@ -31,8 +31,8 @@ import android.widget.TextView;
import org.spongycastle.bcpg.sig.KeyFlags;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.util.Calendar;
import java.util.Date;
@@ -68,7 +68,7 @@ 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.view_key_subkey_item, null);
+ convertView = mInflater.inflate(R.layout.view_key_adv_subkey_item, null);
final ViewHolder holder = new ViewHolder();
holder.vKeyId = (TextView) convertView.findViewById(R.id.subkey_item_key_id);
holder.vKeyDetails = (TextView) convertView.findViewById(R.id.subkey_item_details);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/TabsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/TabsAdapter.java
index 9ddfa90be..44afed351 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/TabsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/TabsAdapter.java
@@ -33,7 +33,7 @@ public class TabsAdapter extends FragmentStatePagerAdapter implements ActionBar.
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
- private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+ private final ArrayList<TabInfo> mTabs = new ArrayList<>();
static final class TabInfo {
public final Class<?> clss;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java
index 7b8670f22..73c42b1be 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserAttributesAdapter.java
@@ -34,6 +34,9 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
+import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
@@ -43,6 +46,7 @@ public class UserAttributesAdapter extends CursorAdapter implements AdapterView.
private LayoutInflater mInflater;
private final ArrayList<Boolean> mCheckStates;
private SaveKeyringParcel mSaveKeyringParcel;
+ private boolean mShowStatusImages;
public static final String[] USER_PACKETS_PROJECTION = new String[]{
UserPackets._ID,
@@ -64,12 +68,13 @@ public class UserAttributesAdapter extends CursorAdapter implements AdapterView.
private static final int INDEX_IS_REVOKED = 7;
public UserAttributesAdapter(Context context, Cursor c, int flags, boolean showCheckBoxes,
- SaveKeyringParcel saveKeyringParcel) {
+ boolean showStatusImages, SaveKeyringParcel saveKeyringParcel) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
mCheckStates = showCheckBoxes ? new ArrayList<Boolean>() : null;
mSaveKeyringParcel = saveKeyringParcel;
+ mShowStatusImages = showStatusImages;
}
public UserAttributesAdapter(Context context, Cursor c, int flags, boolean showCheckBoxes) {
@@ -161,12 +166,17 @@ public class UserAttributesAdapter extends CursorAdapter implements AdapterView.
vVerifiedLayout.setVisibility(View.GONE);
} else {
vEditImage.setVisibility(View.GONE);
- vVerifiedLayout.setVisibility(View.VISIBLE);
+
+ if (mShowStatusImages) {
+ vVerifiedLayout.setVisibility(View.VISIBLE);
+ } else {
+ vVerifiedLayout.setVisibility(View.GONE);
+ }
}
if (isRevoked) {
// set revocation icon (can this even be primary?)
- KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_REVOKED, true);
+ KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray);
// disable revoked user ids
vName.setEnabled(false);
@@ -188,13 +198,13 @@ public class UserAttributesAdapter extends CursorAdapter implements AdapterView.
int isVerified = cursor.getInt(INDEX_VERIFIED);
switch (isVerified) {
case Certs.VERIFIED_SECRET:
- KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_VERIFIED, false);
+ KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_VERIFIED, KeyFormattingUtils.DEFAULT_COLOR);
break;
case Certs.VERIFIED_SELF:
- KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_UNVERIFIED, false);
+ KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_UNVERIFIED, KeyFormattingUtils.DEFAULT_COLOR);
break;
default:
- KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_INVALID, false);
+ KeyFormattingUtils.setStatusImage(mContext, vVerified, null, KeyFormattingUtils.STATE_INVALID, KeyFormattingUtils.DEFAULT_COLOR);
break;
}
}
@@ -225,7 +235,7 @@ public class UserAttributesAdapter extends CursorAdapter implements AdapterView.
}
public ArrayList<String> getSelectedUserIds() {
- ArrayList<String> result = new ArrayList<String>();
+ ArrayList<String> result = new ArrayList<>();
for (int i = 0; i < mCheckStates.size(); i++) {
if (mCheckStates.get(i)) {
mCursor.moveToPosition(i);
@@ -267,7 +277,7 @@ public class UserAttributesAdapter extends CursorAdapter implements AdapterView.
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
- View view = mInflater.inflate(R.layout.view_key_user_id_item, null);
+ View view = mInflater.inflate(R.layout.view_key_adv_user_id_item, null);
// only need to do this once ever, since mShowCheckBoxes is final
view.findViewById(R.id.user_id_item_check_box).setVisibility(mCheckStates != null ? View.VISIBLE : View.GONE);
return view;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java
index 4c0e7a492..01218a4e4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java
@@ -64,7 +64,7 @@ public class UserIdsAddedAdapter extends ArrayAdapter<String> {
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// Not recycled, inflate a new view
- convertView = mInflater.inflate(R.layout.view_key_user_id_item, null);
+ convertView = mInflater.inflate(R.layout.view_key_adv_user_id_item, null);
final ViewHolder holder = new ViewHolder();
holder.vAddress = (TextView) convertView.findViewById(R.id.user_id_item_address);
holder.vName = (TextView) convertView.findViewById(R.id.user_id_item_name);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java
index b4119a5eb..d5376cbdc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddSubkeyDialogFragment.java
@@ -145,20 +145,20 @@ public class AddSubkeyDialogFragment extends DialogFragment {
}
{
- ArrayList<Choice<Algorithm>> choices = new ArrayList<Choice<Algorithm>>();
- choices.add(new Choice<Algorithm>(Algorithm.DSA, getResources().getString(
+ ArrayList<Choice<Algorithm>> choices = new ArrayList<>();
+ choices.add(new Choice<>(Algorithm.DSA, getResources().getString(
R.string.dsa)));
if (!mWillBeMasterKey) {
- choices.add(new Choice<Algorithm>(Algorithm.ELGAMAL, getResources().getString(
+ choices.add(new Choice<>(Algorithm.ELGAMAL, getResources().getString(
R.string.elgamal)));
}
- choices.add(new Choice<Algorithm>(Algorithm.RSA, getResources().getString(
+ choices.add(new Choice<>(Algorithm.RSA, getResources().getString(
R.string.rsa)));
- choices.add(new Choice<Algorithm>(Algorithm.ECDSA, getResources().getString(
+ choices.add(new Choice<>(Algorithm.ECDSA, getResources().getString(
R.string.ecdsa)));
- choices.add(new Choice<Algorithm>(Algorithm.ECDH, getResources().getString(
+ choices.add(new Choice<>(Algorithm.ECDH, getResources().getString(
R.string.ecdh)));
- ArrayAdapter<Choice<Algorithm>> adapter = new ArrayAdapter<Choice<Algorithm>>(context,
+ ArrayAdapter<Choice<Algorithm>> adapter = new ArrayAdapter<>(context,
android.R.layout.simple_spinner_item, choices);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mAlgorithmSpinner.setAdapter(adapter);
@@ -172,20 +172,20 @@ public class AddSubkeyDialogFragment extends DialogFragment {
}
// 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,
+ ArrayAdapter<CharSequence> keySizeAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item,
new ArrayList<CharSequence>(Arrays.asList(getResources().getStringArray(R.array.rsa_key_size_spinner_values))));
keySizeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mKeySizeSpinner.setAdapter(keySizeAdapter);
mKeySizeSpinner.setSelection(1); // Default to 4096 for the key length
{
- ArrayList<Choice<Curve>> choices = new ArrayList<Choice<Curve>>();
+ ArrayList<Choice<Curve>> choices = new ArrayList<>();
- choices.add(new Choice<Curve>(Curve.NIST_P256, getResources().getString(
+ choices.add(new Choice<>(Curve.NIST_P256, getResources().getString(
R.string.key_curve_nist_p256)));
- choices.add(new Choice<Curve>(Curve.NIST_P384, getResources().getString(
+ choices.add(new Choice<>(Curve.NIST_P384, getResources().getString(
R.string.key_curve_nist_p384)));
- choices.add(new Choice<Curve>(Curve.NIST_P521, getResources().getString(
+ choices.add(new Choice<>(Curve.NIST_P521, getResources().getString(
R.string.key_curve_nist_p521)));
/* @see SaveKeyringParcel
@@ -197,7 +197,7 @@ public class AddSubkeyDialogFragment extends DialogFragment {
R.string.key_curve_bp_p512)));
*/
- ArrayAdapter<Choice<Curve>> adapter = new ArrayAdapter<Choice<Curve>>(context,
+ ArrayAdapter<Choice<Curve>> adapter = new ArrayAdapter<>(context,
android.R.layout.simple_spinner_item, choices);
mCurveSpinner.setAdapter(adapter);
// make NIST P-256 the default
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 3eef04aa7..094c4d8a9 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
@@ -45,8 +45,8 @@ import android.widget.TextView.OnEditorActionListener;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Log;
import java.util.regex.Matcher;
@@ -85,7 +85,7 @@ public class AddUserIdDialogFragment extends DialogFragment implements OnEditorA
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
String predefinedName = getArguments().getString(ARG_NAME);
- ArrayAdapter<String> autoCompleteEmailAdapter = new ArrayAdapter<String>
+ ArrayAdapter<String> autoCompleteEmailAdapter = new ArrayAdapter<>
(getActivity(), android.R.layout.simple_spinner_dropdown_item,
ContactHelper.getPossibleUserEmails(getActivity())
);
@@ -150,7 +150,7 @@ public class AddUserIdDialogFragment extends DialogFragment implements OnEditorA
mName.setThreshold(1); // Start working from first character
mName.setAdapter(
- new ArrayAdapter<String>
+ new ArrayAdapter<>
(getActivity(), android.R.layout.simple_spinner_dropdown_item,
ContactHelper.getPossibleUserNames(getActivity())
)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java
index 19cf27259..d2fa37cf7 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AdvancedAppSettingsDialogFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2015 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
@@ -25,43 +25,48 @@ import android.support.v4.app.FragmentActivity;
import org.sufficientlysecure.keychain.R;
-public class BadImportKeyDialogFragment extends DialogFragment {
- private static final String ARG_BAD_IMPORT = "bad_import";
+public class AdvancedAppSettingsDialogFragment extends DialogFragment {
+ private static final String ARG_PACKAGE_NAME = "package_name";
+ private static final String ARG_SIGNATURE = "signature";
/**
- * Creates a new instance of this Bad Import Key DialogFragment
- *
- * @param bad
- * @return
+ * Creates new instance of this fragment
*/
- public static BadImportKeyDialogFragment newInstance(int bad) {
- BadImportKeyDialogFragment frag = new BadImportKeyDialogFragment();
+ public static AdvancedAppSettingsDialogFragment newInstance(String packageName, String digest) {
+ AdvancedAppSettingsDialogFragment frag = new AdvancedAppSettingsDialogFragment();
Bundle args = new Bundle();
+ args.putString(ARG_PACKAGE_NAME, packageName);
+ args.putString(ARG_SIGNATURE, digest);
- args.putInt(ARG_BAD_IMPORT, bad);
frag.setArguments(args);
-
return frag;
}
+ /**
+ * Creates dialog
+ */
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
- final int badImport = getArguments().getInt(ARG_BAD_IMPORT);
CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
- alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
- alert.setTitle(R.string.warning);
- alert.setMessage(activity.getResources()
- .getQuantityString(R.plurals.bad_keys_encountered, badImport, badImport));
- alert.setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- });
+
+ alert.setTitle(R.string.api_settings_advanced);
alert.setCancelable(true);
+ alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ dismiss();
+ }
+ });
+
+ String packageName = getArguments().getString(ARG_PACKAGE_NAME);
+ String signature = getArguments().getString(ARG_SIGNATURE);
+
+ alert.setMessage(getString(R.string.api_settings_package_name) + ": " + packageName + "\n\n"
+ + getString(R.string.api_settings_package_signature) + ": " + signature);
+
return alert.show();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
index aa27e8391..d405b1dda 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
@@ -26,13 +26,13 @@ public class CustomAlertDialogBuilder extends AlertDialog.Builder {
int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(dividerId);
if (divider != null) {
- divider.setBackgroundColor(dialog.getContext().getResources().getColor(R.color.emphasis));
+ divider.setBackgroundColor(dialog.getContext().getResources().getColor(R.color.header_text));
}
int textViewId = dialog.getContext().getResources().getIdentifier("android:id/alertTitle", null, null);
TextView tv = (TextView) dialog.findViewById(textViewId);
if (tv != null) {
- tv.setTextColor(dialog.getContext().getResources().getColor(R.color.emphasis));
+ tv.setTextColor(dialog.getContext().getResources().getColor(R.color.header_text));
}
return dialog;
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 42e21cd57..879e3f6da 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,6 +18,7 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Dialog;
+import android.content.ContentResolver;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Build;
@@ -30,6 +31,8 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.util.FileHelper;
+import java.io.File;
+
public class DeleteFileDialogFragment extends DialogFragment {
private static final String ARG_DELETE_URI = "delete_uri";
@@ -69,21 +72,38 @@ public class DeleteFileDialogFragment extends DialogFragment {
@Override
public void onClick(DialogInterface dialog, int id) {
dismiss();
+ String scheme = deleteUri.getScheme();
- // 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)) {
+ if(scheme.equals(ContentResolver.SCHEME_FILE)) {
+ if(new File(deleteUri.getPath()).delete()) {
Toast.makeText(getActivity(), R.string.file_delete_successful, Toast.LENGTH_SHORT).show();
return;
}
}
+ else if(scheme.equals(ContentResolver.SCHEME_CONTENT)) {
+ // 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;
+ }
+ }
- if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
- Toast.makeText(getActivity(), R.string.file_delete_successful, Toast.LENGTH_SHORT).show();
- return;
+ if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
+ Toast.makeText(getActivity(), R.string.file_delete_successful, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ // some Uri's a ContentResolver fails to delete is handled by the java.io.File's delete
+ // via the path of the Uri
+ if(new File(deleteUri.getPath()).delete()) {
+ Toast.makeText(getActivity(), R.string.file_delete_successful, Toast.LENGTH_SHORT).show();
+ return;
+ }
}
- Toast.makeText(getActivity(), getActivity().getString(R.string.error_file_delete_failed, deleteFilename), Toast.LENGTH_SHORT).show();
+ Toast.makeText(getActivity(), getActivity().getString(R.string.error_file_delete_failed,
+ deleteFilename), Toast.LENGTH_SHORT).show();
// 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.
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 5b96ea231..802f0c11b 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
@@ -33,6 +33,7 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
@@ -100,14 +101,20 @@ public class DeleteKeyDialogFragment extends DialogFragment {
ProviderHelper.FIELD_TYPE_INTEGER
}
);
- String userId = (String) data.get(KeyRings.USER_ID);
+ String name;
+ String[] mainUserId = KeyRing.splitUserId((String) data.get(KeyRings.USER_ID));
+ if (mainUserId[0] != null) {
+ name = mainUserId[0];
+ } else {
+ name = getString(R.string.user_id_no_name);
+ }
hasSecret = ((Long) data.get(KeyRings.HAS_ANY_SECRET)) == 1;
// Set message depending on which key it is.
mMainMessage.setText(getString(
hasSecret ? R.string.secret_key_deletion_confirmation
: R.string.public_key_deletetion_confirmation,
- userId
+ name
));
} catch (ProviderHelper.NotFoundException e) {
dismiss();
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 1cc800b2b..7ac85781f 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
@@ -37,9 +37,9 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.FileHelper;
import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.ui.util.Notify;
import java.io.File;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
deleted file mode 100644
index 961f92f03..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2013-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.annotation.TargetApi;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.nfc.NfcAdapter;
-import android.os.Build;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.FragmentActivity;
-
-import org.sufficientlysecure.htmltextview.HtmlTextView;
-import org.sufficientlysecure.keychain.R;
-
-@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
-public class ShareNfcDialogFragment extends DialogFragment {
-
- /**
- * Creates new instance of this fragment
- */
- public static ShareNfcDialogFragment newInstance() {
- ShareNfcDialogFragment frag = new ShareNfcDialogFragment();
-
- return frag;
- }
-
- /**
- * Creates dialog
- */
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final FragmentActivity activity = getActivity();
-
- CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
-
- alert.setTitle(R.string.share_nfc_dialog);
- alert.setCancelable(true);
-
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- dismiss();
- }
- });
-
- HtmlTextView textView = new HtmlTextView(getActivity());
- textView.setPadding(8, 8, 8, 8);
- alert.setView(textView);
-
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
- textView.setText(getString(R.string.error) + ": "
- + getString(R.string.error_jelly_bean_needed));
- } else {
- // check if NFC Adapter is available
- NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
- if (nfcAdapter == null) {
- textView.setText(getString(R.string.error) + ": "
- + getString(R.string.error_nfc_needed));
- } else {
- // nfc works...
- textView.setHtmlFromRawResource(getActivity(), R.raw.nfc_beam_share, true);
-
- alert.setNegativeButton(R.string.menu_beam_preferences,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- Intent intentSettings = new Intent(
- Settings.ACTION_NFCSHARING_SETTINGS);
- startActivity(intentSettings);
- }
- }
- );
- }
- }
-
- return alert.show();
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ActionBarHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ActionBarHelper.java
deleted file mode 100644
index edd12ec73..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ActionBarHelper.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2013-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.util;
-
-import android.app.Activity;
-import android.support.v7.app.ActionBar;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import org.sufficientlysecure.keychain.R;
-
-public class ActionBarHelper {
-
- /**
- * Sets custom view on ActionBar for Done/Cancel activities
- *
- * @param actionBar
- * @param firstText
- * @param firstDrawableId
- * @param firstOnClickListener
- * @param secondText
- * @param secondDrawableId
- * @param secondOnClickListener
- */
- public static void setTwoButtonView(ActionBar actionBar,
- int firstText, int firstDrawableId, OnClickListener firstOnClickListener,
- int secondText, int secondDrawableId, OnClickListener secondOnClickListener) {
-
- // Inflate the custom action bar view
- final LayoutInflater inflater = (LayoutInflater) actionBar.getThemedContext()
- .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
- final View customActionBarView = inflater.inflate(
- R.layout.actionbar_custom_view_done_cancel, null);
-
- TextView firstTextView = ((TextView) customActionBarView.findViewById(R.id.actionbar_done_text));
- firstTextView.setText(firstText);
- firstTextView.setCompoundDrawablesWithIntrinsicBounds(firstDrawableId, 0, 0, 0);
- customActionBarView.findViewById(R.id.actionbar_done).setOnClickListener(
- firstOnClickListener);
- TextView secondTextView = ((TextView) customActionBarView.findViewById(R.id.actionbar_cancel_text));
- secondTextView.setText(secondText);
- secondTextView.setCompoundDrawablesWithIntrinsicBounds(secondDrawableId, 0, 0, 0);
- customActionBarView.findViewById(R.id.actionbar_cancel).setOnClickListener(
- secondOnClickListener);
-
- // Show the custom action bar view and hide the normal Home icon and title.
- actionBar.setDisplayShowTitleEnabled(false);
- actionBar.setDisplayShowHomeEnabled(false);
- actionBar.setDisplayShowCustomEnabled(true);
- actionBar.setCustomView(customActionBarView, new ActionBar.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
- }
-
- /**
- * Sets custom view on ActionBar for Done activities
- *
- * @param actionBar
- * @param firstText
- * @param firstOnClickListener
- */
- public static void setOneButtonView(ActionBar actionBar, int firstText, int firstDrawableId,
- OnClickListener firstOnClickListener) {
- // Inflate a "Done" custom action bar view to serve as the "Up" affordance.
- final LayoutInflater inflater = (LayoutInflater) actionBar.getThemedContext()
- .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
- final View customActionBarView = inflater
- .inflate(R.layout.actionbar_custom_view_done, null);
-
- TextView firstTextView = ((TextView) customActionBarView.findViewById(R.id.actionbar_done_text));
- firstTextView.setText(firstText);
- firstTextView.setCompoundDrawablesWithIntrinsicBounds(firstDrawableId, 0, 0, 0);
- customActionBarView.findViewById(R.id.actionbar_done).setOnClickListener(
- firstOnClickListener);
-
- // Show the custom action bar view and hide the normal Home icon and title.
- actionBar.setDisplayShowTitleEnabled(false);
- actionBar.setDisplayShowHomeEnabled(false);
- actionBar.setDisplayShowCustomEnabled(true);
- actionBar.setCustomView(customActionBarView);
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java
index 3f84bf490..eb5c3df45 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java
@@ -24,18 +24,12 @@ import android.text.style.StrikethroughSpan;
public class FormattingUtils {
- public static SpannableStringBuilder strikeOutText(CharSequence text) {
- SpannableStringBuilder sb = new SpannableStringBuilder(text);
- sb.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
- return sb;
- }
-
public static int dpToPx(Context context, int dp) {
- return (int) ((dp * context.getResources().getDisplayMetrics().density) + 0.5);
+ return (int) ((dp * context.getResources().getDisplayMetrics().density) + 0.5f);
}
public static int pxToDp(Context context, int px) {
- return (int) ((px / context.getResources().getDisplayMetrics().density) + 0.5);
+ return (int) ((px / context.getResources().getDisplayMetrics().density) + 0.5f);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
index bff7d6b27..38ed88b9c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
@@ -377,6 +377,8 @@ public class KeyFormattingUtils {
((int) digest[2] + 256) % 256};
}
+ public static final int DEFAULT_COLOR = -1;
+
public static final int STATE_REVOKED = 1;
public static final int STATE_EXPIRED = 2;
public static final int STATE_VERIFIED = 3;
@@ -393,20 +395,32 @@ public class KeyFormattingUtils {
}
public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText, int state) {
- setStatusImage(context, statusIcon, statusText, state, false);
+ setStatusImage(context, statusIcon, statusText, state, KeyFormattingUtils.DEFAULT_COLOR, false);
+ }
+
+ public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText,
+ int state, int color) {
+ setStatusImage(context, statusIcon, statusText, state, color, false);
}
/**
* Sets status image based on constant
*/
public static void setStatusImage(Context context, ImageView statusIcon, TextView statusText,
- int state, boolean unobtrusive) {
+ int state, int color, boolean big) {
switch (state) {
/** GREEN: everything is good **/
case STATE_VERIFIED: {
- statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_verified_cutout));
- int color = R.color.android_green_light;
+ if (big) {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_96px));
+ } else {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_24px));
+ }
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_green_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -416,8 +430,10 @@ public class KeyFormattingUtils {
}
case STATE_ENCRYPTED: {
statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_lock_closed));
- int color = R.color.android_green_light;
+ context.getResources().getDrawable(R.drawable.status_lock_closed_24px));
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_green_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -427,9 +443,16 @@ public class KeyFormattingUtils {
}
/** ORANGE: mostly bad... **/
case STATE_UNVERIFIED: {
- statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout));
- int color = R.color.android_orange_light;
+ if (big) {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_96px));
+ } else {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_24px));
+ }
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_orange_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -439,8 +462,10 @@ public class KeyFormattingUtils {
}
case STATE_UNKNOWN_KEY: {
statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout));
- int color = R.color.android_orange_light;
+ context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24px));
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_orange_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -450,11 +475,15 @@ public class KeyFormattingUtils {
}
/** RED: really bad... **/
case STATE_REVOKED: {
- statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout));
- int color = R.color.android_red_light;
- if (unobtrusive) {
- color = R.color.bg_gray;
+ if (big) {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_96px));
+ } else {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_24px));
+ }
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_red_light;
}
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
@@ -464,11 +493,15 @@ public class KeyFormattingUtils {
break;
}
case STATE_EXPIRED: {
- statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_expired_cutout));
- int color = R.color.android_red_light;
- if (unobtrusive) {
- color = R.color.bg_gray;
+ if (big) {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_96px));
+ } else {
+ statusIcon.setImageDrawable(
+ context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_24px));
+ }
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_red_light;
}
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
@@ -479,8 +512,10 @@ public class KeyFormattingUtils {
}
case STATE_NOT_ENCRYPTED: {
statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_lock_open));
- int color = R.color.android_red_light;
+ context.getResources().getDrawable(R.drawable.status_lock_open_24px));
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_red_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -490,8 +525,10 @@ public class KeyFormattingUtils {
}
case STATE_NOT_SIGNED: {
statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout));
- int color = R.color.android_red_light;
+ context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24px));
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_red_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -501,8 +538,10 @@ public class KeyFormattingUtils {
}
case STATE_INVALID: {
statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout));
- int color = R.color.android_red_light;
+ context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24px));
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.android_red_light;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
@@ -513,8 +552,10 @@ public class KeyFormattingUtils {
/** special **/
case STATE_UNAVAILABLE: {
statusIcon.setImageDrawable(
- context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout));
- int color = R.color.bg_gray;
+ context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24px));
+ if (color == KeyFormattingUtils.DEFAULT_COLOR) {
+ color = R.color.bg_gray;
+ }
statusIcon.setColorFilter(context.getResources().getColor(color),
PorterDuff.Mode.SRC_IN);
if (statusText != null) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java
index 551ac039d..3bc29edb6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java
@@ -20,46 +20,135 @@ package org.sufficientlysecure.keychain.ui.util;
import android.app.Activity;
import android.content.res.Resources;
-import com.github.johnpersano.supertoasts.SuperCardToast;
-import com.github.johnpersano.supertoasts.SuperToast;
+import com.nispok.snackbar.Snackbar;
+import com.nispok.snackbar.Snackbar.SnackbarDuration;
+import com.nispok.snackbar.SnackbarManager;
+import com.nispok.snackbar.enums.SnackbarType;
+import com.nispok.snackbar.listeners.ActionClickListener;
+import com.nispok.snackbar.listeners.EventListenerAdapter;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.util.FabContainer;
/**
- * @author danielhass
* Notify wrapper which allows a more easy use of different notification libraries
*/
public class Notify {
public static enum Style {OK, WARN, INFO, ERROR}
+ public static final int LENGTH_INDEFINITE = 0;
+ public static final int LENGTH_LONG = 3500;
+
/**
* Shows a simple in-layout notification with the CharSequence given as parameter
- * @param activity
* @param text Text to show
* @param style Notification styling
*/
- public static void showNotify(Activity activity, CharSequence text, Style style) {
+ public static void showNotify(final Activity activity, CharSequence text, Style style) {
+
+ Snackbar bar = getSnackbar(activity)
+ .text(text);
+
+ switch (style) {
+ case OK:
+ break;
+ case WARN:
+ bar.textColor(activity.getResources().getColor(R.color.android_orange_light));
+ break;
+ case ERROR:
+ bar.textColor(activity.getResources().getColor(R.color.android_red_light));
+ break;
+ }
+
+ SnackbarManager.show(bar);
+
+ }
+
+ public static Showable createNotify (Activity activity, int resId, int duration, Style style) {
+ final Snackbar bar = getSnackbar(activity)
+ .text(resId);
+
+ if (duration == LENGTH_INDEFINITE) {
+ bar.duration(SnackbarDuration.LENGTH_INDEFINITE);
+ } else {
+ bar.duration(duration);
+ }
+
+ switch (style) {
+ case OK:
+ bar.actionColor(activity.getResources().getColor(R.color.android_green_light));
+ break;
+ case WARN:
+ bar.textColor(activity.getResources().getColor(R.color.android_orange_light));
+ break;
+ case ERROR:
+ bar.textColor(activity.getResources().getColor(R.color.android_red_light));
+ break;
+ }
- SuperCardToast st = new SuperCardToast(activity);
- st.setText(text);
- st.setDuration(SuperToast.Duration.MEDIUM);
- switch (style){
+ return new Showable () {
+ @Override
+ public void show() {
+ SnackbarManager.show(bar);
+ }
+ };
+ }
+
+ public static Showable createNotify(Activity activity, int resId, int duration, Style style,
+ final ActionListener listener, int resIdAction) {
+ return createNotify(activity, activity.getString(resId), duration, style, listener, resIdAction);
+ }
+
+ public static Showable createNotify(Activity activity, String msg, int duration, Style style) {
+ return createNotify(activity, msg, duration, style, null, 0);
+ }
+
+ public static Showable createNotify(Activity activity, String msg, int duration, Style style,
+ final ActionListener listener, int resIdAction) {
+
+ final Snackbar bar = getSnackbar(activity)
+ .text(msg);
+
+ if (listener != null) {
+ bar.actionLabel(resIdAction);
+ bar.actionListener(new ActionClickListener() {
+ @Override
+ public void onActionClicked(Snackbar snackbar) {
+ listener.onAction();
+ }
+ });
+ }
+
+ if (duration == LENGTH_INDEFINITE) {
+ bar.duration(SnackbarDuration.LENGTH_INDEFINITE);
+ } else {
+ bar.duration(duration);
+ }
+
+ switch (style) {
case OK:
- st.setBackground(SuperToast.Background.GREEN);
+ bar.actionColor(activity.getResources().getColor(R.color.android_green_light));
break;
case WARN:
- st.setBackground(SuperToast.Background.ORANGE);
+ bar.textColor(activity.getResources().getColor(R.color.android_orange_light));
break;
case ERROR:
- st.setBackground(SuperToast.Background.RED);
+ bar.textColor(activity.getResources().getColor(R.color.android_red_light));
break;
}
- st.show();
+
+ return new Showable () {
+ @Override
+ public void show() {
+ SnackbarManager.show(bar);
+ }
+ };
}
/**
* Shows a simple in-layout notification with the resource text from given id
- * @param activity
* @param resId ResourceId of notification text
* @param style Notification styling
* @throws Resources.NotFoundException
@@ -67,4 +156,36 @@ public class Notify {
public static void showNotify(Activity activity, int resId, Style style) throws Resources.NotFoundException {
showNotify(activity, activity.getResources().getText(resId), style);
}
+
+ private static Snackbar getSnackbar(final Activity activity) {
+ Snackbar bar = Snackbar.with(activity)
+ .type(SnackbarType.MULTI_LINE)
+ .duration(SnackbarDuration.LENGTH_LONG);
+
+ if (activity instanceof FabContainer) {
+ bar.eventListener(new EventListenerAdapter() {
+ @Override
+ public void onShow(Snackbar snackbar) {
+ ((FabContainer) activity).fabMoveUp(snackbar.getHeight());
+ }
+
+ @Override
+ public void onDismiss(Snackbar snackbar) {
+ ((FabContainer) activity).fabRestorePosition();
+ }
+ });
+ }
+ return bar;
+ }
+
+ public interface Showable {
+ public void show();
+
+ }
+
+ public interface ActionListener {
+ public void onAction();
+
+ }
+
} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java
index 36f38045f..b8d4ea7d2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/QrCodeUtils.java
@@ -47,7 +47,7 @@ public class QrCodeUtils {
*/
public static Bitmap getQRCodeBitmap(final String input, final int size) {
try {
- final Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+ final Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
final BitMatrix result = new QRCodeWriter().encode(input, BarcodeFormat.QR_CODE, size,
size, hints);
@@ -59,7 +59,7 @@ public class QrCodeUtils {
for (int y = 0; y < height; y++) {
final int offset = y * width;
for (int x = 0; x < width; x++) {
- pixels[offset + x] = result.get(x, y) ? Color.BLACK : Color.WHITE;
+ pixels[offset + x] = result.get(x, y) ? Color.BLACK : Color.TRANSPARENT;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/AspectRatioImageView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/AspectRatioImageView.java
new file mode 100644
index 000000000..0df5ba5e8
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/AspectRatioImageView.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2015 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.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import org.sufficientlysecure.keychain.R;
+
+/**
+ * Maintains an aspect ratio based on either width or height. Disabled by default.
+ *
+ * from https://gist.github.com/JakeWharton/2856179
+ */
+public class AspectRatioImageView extends ImageView {
+ // NOTE: These must be kept in sync with the AspectRatioImageView attributes in attrs.xml.
+ public static final int MEASUREMENT_WIDTH = 0;
+ public static final int MEASUREMENT_HEIGHT = 1;
+
+ private static final float DEFAULT_ASPECT_RATIO = 1f;
+ private static final boolean DEFAULT_ASPECT_RATIO_ENABLED = false;
+ private static final int DEFAULT_DOMINANT_MEASUREMENT = MEASUREMENT_WIDTH;
+
+ private float aspectRatio;
+ private boolean aspectRatioEnabled;
+ private int dominantMeasurement;
+
+ public AspectRatioImageView(Context context) {
+ this(context, null);
+ }
+
+ public AspectRatioImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AspectRatioImageView);
+ aspectRatio = a.getFloat(R.styleable.AspectRatioImageView_aspectRatio, DEFAULT_ASPECT_RATIO);
+ aspectRatioEnabled = a.getBoolean(R.styleable.AspectRatioImageView_aspectRatioEnabled,
+ DEFAULT_ASPECT_RATIO_ENABLED);
+ dominantMeasurement = a.getInt(R.styleable.AspectRatioImageView_dominantMeasurement,
+ DEFAULT_DOMINANT_MEASUREMENT);
+ a.recycle();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ if (!aspectRatioEnabled) return;
+
+ int newWidth;
+ int newHeight;
+ switch (dominantMeasurement) {
+ case MEASUREMENT_WIDTH:
+ newWidth = getMeasuredWidth();
+ newHeight = (int) (newWidth * aspectRatio);
+ break;
+
+ case MEASUREMENT_HEIGHT:
+ newHeight = getMeasuredHeight();
+ newWidth = (int) (newHeight * aspectRatio);
+ break;
+
+ default:
+ throw new IllegalStateException("Unknown measurement with ID " + dominantMeasurement);
+ }
+
+ setMeasuredDimension(newWidth, newHeight);
+ }
+
+ /**
+ * Get the aspect ratio for this image view.
+ */
+ public float getAspectRatio() {
+ return aspectRatio;
+ }
+
+ /**
+ * Set the aspect ratio for this image view. This will update the view instantly.
+ */
+ public void setAspectRatio(float aspectRatio) {
+ this.aspectRatio = aspectRatio;
+ if (aspectRatioEnabled) {
+ requestLayout();
+ }
+ }
+
+ /**
+ * Get whether or not forcing the aspect ratio is enabled.
+ */
+ public boolean getAspectRatioEnabled() {
+ return aspectRatioEnabled;
+ }
+
+ /**
+ * set whether or not forcing the aspect ratio is enabled. This will re-layout the view.
+ */
+ public void setAspectRatioEnabled(boolean aspectRatioEnabled) {
+ this.aspectRatioEnabled = aspectRatioEnabled;
+ requestLayout();
+ }
+
+ /**
+ * Get the dominant measurement for the aspect ratio.
+ */
+ public int getDominantMeasurement() {
+ return dominantMeasurement;
+ }
+
+ /**
+ * Set the dominant measurement for the aspect ratio.
+ *
+ * @see #MEASUREMENT_WIDTH
+ * @see #MEASUREMENT_HEIGHT
+ */
+ public void setDominantMeasurement(int dominantMeasurement) {
+ if (dominantMeasurement != MEASUREMENT_HEIGHT && dominantMeasurement != MEASUREMENT_WIDTH) {
+ throw new IllegalArgumentException("Invalid measurement type.");
+ }
+ this.dominantMeasurement = dominantMeasurement;
+ requestLayout();
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java
index 14f42eb04..6d0e6556f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java
@@ -27,9 +27,9 @@ import android.util.AttributeSet;
import android.widget.ImageView;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
-import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
public class CertifyKeySpinner extends KeySpinner {
@@ -86,32 +86,33 @@ public class CertifyKeySpinner extends KeySpinner {
super.onLoadFinished(loader, data);
if (loader.getId() == LOADER_ID) {
+ mIndexHasCertify = data.getColumnIndex(KeychainContract.KeyRings.HAS_CERTIFY);
+ mIndexIsRevoked = data.getColumnIndex(KeychainContract.KeyRings.IS_REVOKED);
+ mIndexIsExpired = data.getColumnIndex(KeychainContract.KeyRings.IS_EXPIRED);
+
// If there is only one choice, pick it by default
if (mAdapter.getCount() == 2) {
// preselect if key can certify
- if (data.moveToPosition(1) && !data.isNull(mIndexHasCertify)) {
+ if (data.moveToPosition(0) && !data.isNull(mIndexHasCertify)) {
setSelection(1);
}
}
- mIndexHasCertify = data.getColumnIndex(KeychainContract.KeyRings.HAS_CERTIFY);
- mIndexIsRevoked = data.getColumnIndex(KeychainContract.KeyRings.IS_REVOKED);
- mIndexIsExpired = data.getColumnIndex(KeychainContract.KeyRings.IS_EXPIRED);
}
}
@Override
boolean setStatus(Context context, Cursor cursor, ImageView statusView) {
if (cursor.getInt(mIndexIsRevoked) != 0) {
- KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, true);
+ KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray);
return false;
}
if (cursor.getInt(mIndexIsExpired) != 0) {
- KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, true);
+ KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray);
return false;
}
// don't invalidate the "None" entry, which is also null!
if (cursor.getPosition() != 0 && cursor.isNull(mIndexHasCertify)) {
- KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, true);
+ KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, R.color.bg_gray);
return false;
}
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
index e03a14989..f05f5f96b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
@@ -28,7 +28,6 @@ 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.text.SpannableStringBuilder;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
@@ -42,14 +41,13 @@ import com.tokenautocomplete.TokenCompleteTextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Log;
import java.util.ArrayList;
@@ -165,7 +163,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
setAdapter(new EncryptKeyAdapter(Collections.<EncryptionKey>emptyList()));
return;
}
- ArrayList<EncryptionKey> keys = new ArrayList<EncryptionKey>();
+ ArrayList<EncryptionKey> keys = new ArrayList<>();
while (cursor.moveToNext()) {
try {
EncryptionKey key = new EncryptionKey(cursor);
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 b456b61ab..34e7b639a 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
@@ -33,17 +33,16 @@ import org.sufficientlysecure.keychain.R;
/**
* Class representing a LinearLayout that can fold and hide it's content when pressed
* To use just add the following to your xml layout
-
- <org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- custom:foldedLabel="@string/TEXT_TO_DISPLAY_WHEN_FOLDED"
- custom:unFoldedLabel="@string/TEXT_TO_DISPLAY_WHEN_UNFOLDED">
-
- <include layout="@layout/ELEMENTS_TO_BE_FOLDED"/>
-
- </org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout>
-
+ * <p/>
+ * <org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout
+ * android:layout_width="wrap_content"
+ * android:layout_height="wrap_content"
+ * custom:foldedLabel="@string/TEXT_TO_DISPLAY_WHEN_FOLDED"
+ * custom:unFoldedLabel="@string/TEXT_TO_DISPLAY_WHEN_UNFOLDED">
+ * <p/>
+ * <include layout="@layout/ELEMENTS_TO_BE_FOLDED"/>
+ * <p/>
+ * </org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout>
*/
public class FoldableLinearLayout extends LinearLayout {
@@ -75,6 +74,7 @@ public class FoldableLinearLayout extends LinearLayout {
/**
* Load given attributes to inner variables,
+ *
* @param context
* @param attrs
*/
@@ -87,8 +87,8 @@ public class FoldableLinearLayout extends LinearLayout {
a.recycle();
}
// If any attribute isn't found then set a default one
- mFoldedLabel = (mFoldedLabel == null) ? context.getString(R.id.none) : mFoldedLabel;
- mUnFoldedLabel = (mUnFoldedLabel == null) ? context.getString(R.id.none) : mUnFoldedLabel;
+ mFoldedLabel = (mFoldedLabel == null) ? context.getString(R.string.none) : mFoldedLabel;
+ mUnFoldedLabel = (mUnFoldedLabel == null) ? context.getString(R.string.none) : mUnFoldedLabel;
}
@Override
@@ -138,7 +138,7 @@ public class FoldableLinearLayout extends LinearLayout {
private void initialiseInnerViews() {
mFoldableIcon = (ImageView) mFoldableLayout.findViewById(R.id.foldableIcon);
- mFoldableIcon.setImageResource(R.drawable.ic_action_expand);
+ mFoldableIcon.setImageResource(R.drawable.ic_expand_more_black_24dp);
mFoldableTextView = (TextView) mFoldableLayout.findViewById(R.id.foldableText);
mFoldableTextView.setText(mFoldedLabel);
@@ -151,7 +151,7 @@ public class FoldableLinearLayout extends LinearLayout {
public void onClick(View view) {
mFolded = !mFolded;
if (mFolded) {
- mFoldableIcon.setImageResource(R.drawable.ic_action_collapse);
+ mFoldableIcon.setImageResource(R.drawable.ic_expand_less_black_24dp);
mFoldableContainer.setVisibility(View.VISIBLE);
AlphaAnimation animation = new AlphaAnimation(0f, 1f);
animation.setDuration(mShortAnimationDuration);
@@ -159,12 +159,13 @@ public class FoldableLinearLayout extends LinearLayout {
mFoldableTextView.setText(mUnFoldedLabel);
} else {
- mFoldableIcon.setImageResource(R.drawable.ic_action_expand);
+ mFoldableIcon.setImageResource(R.drawable.ic_expand_more_black_24dp);
AlphaAnimation animation = new AlphaAnimation(1f, 0f);
animation.setDuration(mShortAnimationDuration);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
- public void onAnimationStart(Animation animation) { }
+ public void onAnimationStart(Animation animation) {
+ }
@Override
public void onAnimationEnd(Animation animation) {
@@ -173,7 +174,8 @@ public class FoldableLinearLayout extends LinearLayout {
}
@Override
- public void onAnimationRepeat(Animation animation) { }
+ public void onAnimationRepeat(Animation animation) {
+ }
});
mFoldableContainer.startAnimation(animation);
mFoldableTextView.setText(mFoldedLabel);
@@ -185,6 +187,7 @@ public class FoldableLinearLayout extends LinearLayout {
/**
* Adds provided child view to foldableContainer View
+ *
* @param child
*/
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
index 7ec6ffe95..c8eceea50 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
@@ -24,24 +24,28 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
+import android.support.v7.internal.widget.TintSpinner;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
-import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
-public abstract class KeySpinner extends Spinner implements LoaderManager.LoaderCallbacks<Cursor> {
+/**
+ * Use TintSpinner from AppCompat lib instead of Spinner. Fixes white dropdown icon.
+ * Related: http://stackoverflow.com/a/27713090
+ */
+public abstract class KeySpinner extends TintSpinner implements LoaderManager.LoaderCallbacks<Cursor> {
public interface OnKeyChangedListener {
public void onKeyChanged(long masterKeyId);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ListAwareSwipeRefreshLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ListAwareSwipeRefreshLayout.java
deleted file mode 100644
index b3c3eb417..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/ListAwareSwipeRefreshLayout.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2014 Daniel Albert
- *
- * 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.support.v4.widget.NoScrollableSwipeRefreshLayout;
-import android.util.AttributeSet;
-import android.view.InputDevice;
-import android.view.InputDevice.MotionRange;
-import android.view.MotionEvent;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.util.Log;
-
-import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
-
-public class ListAwareSwipeRefreshLayout extends NoScrollableSwipeRefreshLayout {
-
- private StickyListHeadersListView mStickyListHeadersListView = null;
- private boolean mIsLocked = false;
-
- /**
- * Constructors
- */
- public ListAwareSwipeRefreshLayout(Context context) {
- super(context);
- }
-
- public ListAwareSwipeRefreshLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- /**
- * Getters / Setters
- */
- public void setStickyListHeadersListView(StickyListHeadersListView stickyListHeadersListView) {
- mStickyListHeadersListView = stickyListHeadersListView;
- }
-
- public StickyListHeadersListView getStickyListHeadersListView() {
- return mStickyListHeadersListView;
- }
-
- public void setIsLocked(boolean locked) {
- mIsLocked = locked;
- }
-
- public boolean getIsLocked() {
- return mIsLocked;
- }
-
- @Override
- public boolean canChildScrollUp() {
- if (mStickyListHeadersListView == null) {
- return super.canChildScrollUp();
- }
-
- return (mIsLocked || (
- mStickyListHeadersListView.getWrappedList().getChildCount() > 0
- && (mStickyListHeadersListView.getWrappedList().getChildAt(0).getTop() < 0
- || mStickyListHeadersListView.getFirstVisiblePosition() > 0)
- )
- );
- }
-
- /** Called on a touch event, this method exempts a small area in the upper right from pull to
- * refresh handling.
- *
- * If the touch event happens somewhere in the upper right corner of the screen, we return false
- * to indicate that the event was not handled. This ensures events in that area are always
- * handed through to the list scrollbar handle. For all other cases, we pass the message through
- * to the pull to refresh handler.
- */
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // The device may be null. This actually happens
- if (event.getDevice() != null) {
- // MotionEvent.AXIS_X is api level 12, for some reason, so we use a constant 0 here
- float ratioX = event.getX() / event.getDevice().getMotionRange(0).getMax();
- float ratioY = event.getY() / event.getDevice().getMotionRange(1).getMax();
- // if this is the upper right corner, don't handle as pull to refresh event
- if (ratioX > 0.85f && ratioY < 0.15f) {
- return false;
- }
- }
- return super.onTouchEvent(event);
- }
-
-} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java
index 59d05a62e..fe91e306e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java
@@ -84,15 +84,15 @@ public class SignKeySpinner extends KeySpinner {
@Override
boolean setStatus(Context context, Cursor cursor, ImageView statusView) {
if (cursor.getInt(mIndexIsRevoked) != 0) {
- KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, true);
+ KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_REVOKED, R.color.bg_gray);
return false;
}
if (cursor.getInt(mIndexIsExpired) != 0) {
- KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, true);
+ KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_EXPIRED, R.color.bg_gray);
return false;
}
if (cursor.getInt(mIndexHasSign) == 0) {
- KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, true);
+ KeyFormattingUtils.setStatusImage(getContext(), statusView, null, KeyFormattingUtils.STATE_UNAVAILABLE, R.color.bg_gray);
return false;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java
deleted file mode 100644
index 17471c86c..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabLayout.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-import android.content.Context;
-import android.graphics.Typeface;
-import android.os.Build;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.HorizontalScrollView;
-import android.widget.TextView;
-
-/**
- * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html
- */
-
-/**
- * To be used with ViewPager to provide a tab indicator component which give constant feedback as to
- * the user's scroll progress.
- * <p/>
- * To use the component, simply add it to your view hierarchy. Then in your
- * {@link android.app.Activity} or {@link android.support.v4.app.Fragment} call
- * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for.
- * <p/>
- * The colors can be customized in two ways. The first and simplest is to provide an array of colors
- * via {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)}. The
- * alternative is via the {@link TabColorizer} interface which provides you complete control over
- * which color is used for any individual position.
- * <p/>
- * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)},
- * providing the layout ID of your custom layout.
- */
-public class SlidingTabLayout extends HorizontalScrollView {
-
- /**
- * Allows complete control over the colors drawn in the tab layout. Set with
- * {@link #setCustomTabColorizer(TabColorizer)}.
- */
- public interface TabColorizer {
-
- /**
- * @return return the color of the indicator used when {@code position} is selected.
- */
- int getIndicatorColor(int position);
-
- /**
- * @return return the color of the divider drawn to the right of {@code position}.
- */
- int getDividerColor(int position);
-
- }
-
- private static final int TITLE_OFFSET_DIPS = 24;
- private static final int TAB_VIEW_PADDING_DIPS = 16;
- private static final int TAB_VIEW_TEXT_SIZE_SP = 12;
-
- private int mTitleOffset;
-
- private int mTabViewLayoutId;
- private int mTabViewTextViewId;
-
- private ViewPager mViewPager;
- private ViewPager.OnPageChangeListener mViewPagerPageChangeListener;
-
- private final SlidingTabStrip mTabStrip;
-
- public SlidingTabLayout(Context context) {
- this(context, null);
- }
-
- public SlidingTabLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- // Disable the Scroll Bar
- setHorizontalScrollBarEnabled(false);
- // Make sure that the Tab Strips fills this View
- setFillViewport(true);
-
- mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);
-
- mTabStrip = new SlidingTabStrip(context);
- addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
- }
-
- /**
- * Set the custom {@link TabColorizer} to be used.
- * <p/>
- * If you only require simple custmisation then you can use
- * {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)} to achieve
- * similar effects.
- */
- public void setCustomTabColorizer(TabColorizer tabColorizer) {
- mTabStrip.setCustomTabColorizer(tabColorizer);
- }
-
- /**
- * Sets the colors to be used for indicating the selected tab. These colors are treated as a
- * circular array. Providing one color will mean that all tabs are indicated with the same color.
- */
- public void setSelectedIndicatorColors(int... colors) {
- mTabStrip.setSelectedIndicatorColors(colors);
- }
-
- /**
- * Sets the colors to be used for tab dividers. These colors are treated as a circular array.
- * Providing one color will mean that all tabs are indicated with the same color.
- */
- public void setDividerColors(int... colors) {
- mTabStrip.setDividerColors(colors);
- }
-
- /**
- * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are
- * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so
- * that the layout can update it's scroll position correctly.
- *
- * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener)
- */
- public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
- mViewPagerPageChangeListener = listener;
- }
-
- /**
- * Set the custom layout to be inflated for the tab views.
- *
- * @param layoutResId Layout id to be inflated
- * @param textViewId id of the {@link TextView} in the inflated view
- */
- public void setCustomTabView(int layoutResId, int textViewId) {
- mTabViewLayoutId = layoutResId;
- mTabViewTextViewId = textViewId;
- }
-
- /**
- * Sets the associated view pager. Note that the assumption here is that the pager content
- * (number of tabs and tab titles) does not change after this call has been made.
- */
- public void setViewPager(ViewPager viewPager) {
- mTabStrip.removeAllViews();
-
- mViewPager = viewPager;
- if (viewPager != null) {
- viewPager.setOnPageChangeListener(new InternalViewPagerListener());
- populateTabStrip();
- }
- }
-
- /**
- * Create a default view to be used for tabs. This is called if a custom tab view is not set via
- * {@link #setCustomTabView(int, int)}.
- */
- protected TextView createDefaultTabView(Context context) {
- TextView textView = new TextView(context);
- textView.setGravity(Gravity.CENTER);
- textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
- textView.setTypeface(Typeface.DEFAULT_BOLD);
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- // If we're running on Honeycomb or newer, then we can use the Theme's
- // selectableItemBackground to ensure that the View has a pressed state
- TypedValue outValue = new TypedValue();
- getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
- outValue, true);
- textView.setBackgroundResource(outValue.resourceId);
- }
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
- textView.setAllCaps(true);
- }
-
- int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
- textView.setPadding(padding, padding, padding, padding);
-
- return textView;
- }
-
- private void populateTabStrip() {
- final PagerAdapter adapter = mViewPager.getAdapter();
- final View.OnClickListener tabClickListener = new TabClickListener();
-
- for (int i = 0; i < adapter.getCount(); i++) {
- View tabView = null;
- TextView tabTitleView = null;
-
- if (mTabViewLayoutId != 0) {
- // If there is a custom tab view layout id set, try and inflate it
- tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,
- false);
- tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId);
- }
-
- if (tabView == null) {
- tabView = createDefaultTabView(getContext());
- }
-
- if (tabTitleView == null && TextView.class.isInstance(tabView)) {
- tabTitleView = (TextView) tabView;
- }
-
- tabTitleView.setText(adapter.getPageTitle(i));
- tabView.setOnClickListener(tabClickListener);
-
- mTabStrip.addView(tabView);
- }
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- if (mViewPager != null) {
- scrollToTab(mViewPager.getCurrentItem(), 0);
- }
- }
-
- private void scrollToTab(int tabIndex, int positionOffset) {
- final int tabStripChildCount = mTabStrip.getChildCount();
- if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
- return;
- }
-
- View selectedChild = mTabStrip.getChildAt(tabIndex);
- if (selectedChild != null) {
- int targetScrollX = selectedChild.getLeft() + positionOffset;
-
- if (tabIndex > 0 || positionOffset > 0) {
- // If we're not at the first child and are mid-scroll, make sure we obey the offset
- targetScrollX -= mTitleOffset;
- }
-
- scrollTo(targetScrollX, 0);
- }
- }
-
- private class InternalViewPagerListener implements ViewPager.OnPageChangeListener {
- private int mScrollState;
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- int tabStripChildCount = mTabStrip.getChildCount();
- if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
- return;
- }
-
- mTabStrip.onViewPagerPageChanged(position, positionOffset);
-
- View selectedTitle = mTabStrip.getChildAt(position);
- int extraOffset = (selectedTitle != null)
- ? (int) (positionOffset * selectedTitle.getWidth())
- : 0;
- scrollToTab(position, extraOffset);
-
- if (mViewPagerPageChangeListener != null) {
- mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,
- positionOffsetPixels);
- }
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- mScrollState = state;
-
- if (mViewPagerPageChangeListener != null) {
- mViewPagerPageChangeListener.onPageScrollStateChanged(state);
- }
- }
-
- @Override
- public void onPageSelected(int position) {
- if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
- mTabStrip.onViewPagerPageChanged(position, 0f);
- scrollToTab(position, 0);
- }
-
- if (mViewPagerPageChangeListener != null) {
- mViewPagerPageChangeListener.onPageSelected(position);
- }
- }
-
- }
-
- private class TabClickListener implements View.OnClickListener {
- @Override
- public void onClick(View v) {
- for (int i = 0; i < mTabStrip.getChildCount(); i++) {
- if (v == mTabStrip.getChildAt(i)) {
- mViewPager.setCurrentItem(i);
- return;
- }
- }
- }
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java
deleted file mode 100644
index 4c41e12c5..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SlidingTabStrip.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.sufficientlysecure.keychain.ui.widget;
-
-import android.R;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.View;
-import android.widget.LinearLayout;
-
-/**
- * Copied from http://developer.android.com/samples/SlidingTabsColors/index.html
- */
-class SlidingTabStrip extends LinearLayout {
-
- private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 2;
- private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;
- private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 8;
- private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFFAA66CC;
-
- private static final int DEFAULT_DIVIDER_THICKNESS_DIPS = 1;
- private static final byte DEFAULT_DIVIDER_COLOR_ALPHA = 0x20;
- private static final float DEFAULT_DIVIDER_HEIGHT = 0.5f;
-
- private final int mBottomBorderThickness;
- private final Paint mBottomBorderPaint;
-
- private final int mSelectedIndicatorThickness;
- private final Paint mSelectedIndicatorPaint;
-
- private final int mDefaultBottomBorderColor;
-
- private final Paint mDividerPaint;
- private final float mDividerHeight;
-
- private int mSelectedPosition;
- private float mSelectionOffset;
-
- private SlidingTabLayout.TabColorizer mCustomTabColorizer;
- private final SimpleTabColorizer mDefaultTabColorizer;
-
- SlidingTabStrip(Context context) {
- this(context, null);
- }
-
- SlidingTabStrip(Context context, AttributeSet attrs) {
- super(context, attrs);
- setWillNotDraw(false);
-
- final float density = getResources().getDisplayMetrics().density;
-
- TypedValue outValue = new TypedValue();
- context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true);
- final int themeForegroundColor = outValue.data;
-
- mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor,
- DEFAULT_BOTTOM_BORDER_COLOR_ALPHA);
-
- mDefaultTabColorizer = new SimpleTabColorizer();
- mDefaultTabColorizer.setIndicatorColors(DEFAULT_SELECTED_INDICATOR_COLOR);
- mDefaultTabColorizer.setDividerColors(setColorAlpha(themeForegroundColor,
- DEFAULT_DIVIDER_COLOR_ALPHA));
-
- mBottomBorderThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density);
- mBottomBorderPaint = new Paint();
- mBottomBorderPaint.setColor(mDefaultBottomBorderColor);
-
- mSelectedIndicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density);
- mSelectedIndicatorPaint = new Paint();
-
- mDividerHeight = DEFAULT_DIVIDER_HEIGHT;
- mDividerPaint = new Paint();
- mDividerPaint.setStrokeWidth((int) (DEFAULT_DIVIDER_THICKNESS_DIPS * density));
- }
-
- void setCustomTabColorizer(SlidingTabLayout.TabColorizer customTabColorizer) {
- mCustomTabColorizer = customTabColorizer;
- invalidate();
- }
-
- void setSelectedIndicatorColors(int... colors) {
- // Make sure that the custom colorizer is removed
- mCustomTabColorizer = null;
- mDefaultTabColorizer.setIndicatorColors(colors);
- invalidate();
- }
-
- void setDividerColors(int... colors) {
- // Make sure that the custom colorizer is removed
- mCustomTabColorizer = null;
- mDefaultTabColorizer.setDividerColors(colors);
- invalidate();
- }
-
- void onViewPagerPageChanged(int position, float positionOffset) {
- mSelectedPosition = position;
- mSelectionOffset = positionOffset;
- invalidate();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- final int height = getHeight();
- final int childCount = getChildCount();
- final int dividerHeightPx = (int) (Math.min(Math.max(0f, mDividerHeight), 1f) * height);
- final SlidingTabLayout.TabColorizer tabColorizer = mCustomTabColorizer != null
- ? mCustomTabColorizer
- : mDefaultTabColorizer;
-
- // Thick colored underline below the current selection
- if (childCount > 0) {
- View selectedTitle = getChildAt(mSelectedPosition);
- int left = selectedTitle.getLeft();
- int right = selectedTitle.getRight();
- int color = tabColorizer.getIndicatorColor(mSelectedPosition);
-
- if (mSelectionOffset > 0f && mSelectedPosition < (getChildCount() - 1)) {
- int nextColor = tabColorizer.getIndicatorColor(mSelectedPosition + 1);
- if (color != nextColor) {
- color = blendColors(nextColor, color, mSelectionOffset);
- }
-
- // Draw the selection partway between the tabs
- View nextTitle = getChildAt(mSelectedPosition + 1);
- left = (int) (mSelectionOffset * nextTitle.getLeft() +
- (1.0f - mSelectionOffset) * left);
- right = (int) (mSelectionOffset * nextTitle.getRight() +
- (1.0f - mSelectionOffset) * right);
- }
-
- mSelectedIndicatorPaint.setColor(color);
-
- canvas.drawRect(left, height - mSelectedIndicatorThickness, right,
- height, mSelectedIndicatorPaint);
- }
-
- // Thin underline along the entire bottom edge
- canvas.drawRect(0, height - mBottomBorderThickness, getWidth(), height, mBottomBorderPaint);
-
- // Vertical separators between the titles
- int separatorTop = (height - dividerHeightPx) / 2;
- for (int i = 0; i < childCount - 1; i++) {
- View child = getChildAt(i);
- mDividerPaint.setColor(tabColorizer.getDividerColor(i));
- canvas.drawLine(child.getRight(), separatorTop, child.getRight(),
- separatorTop + dividerHeightPx, mDividerPaint);
- }
- }
-
- /**
- * Set the alpha value of the {@code color} to be the given {@code alpha} value.
- */
- private static int setColorAlpha(int color, byte alpha) {
- return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));
- }
-
- /**
- * Blend {@code color1} and {@code color2} using the given ratio.
- *
- * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
- * 0.0 will return {@code color2}.
- */
- private static int blendColors(int color1, int color2, float ratio) {
- final float inverseRation = 1f - ratio;
- float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
- float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
- float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
- return Color.rgb((int) r, (int) g, (int) b);
- }
-
- private static class SimpleTabColorizer implements SlidingTabLayout.TabColorizer {
- private int[] mIndicatorColors;
- private int[] mDividerColors;
-
- @Override
- public final int getIndicatorColor(int position) {
- return mIndicatorColors[position % mIndicatorColors.length];
- }
-
- @Override
- public final int getDividerColor(int position) {
- return mDividerColors[position % mDividerColors.length];
- }
-
- void setIndicatorColors(int... colors) {
- mIndicatorColors = colors;
- }
-
- void setDividerColors(int... colors) {
- mDividerColors = colors;
- }
- }
-} \ No newline at end of file
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 99db634ac..c1955f75b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/AlgorithmNames.java
@@ -23,7 +23,6 @@ import android.app.Activity;
import org.spongycastle.bcpg.CompressionAlgorithmTags;
import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData;
-import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import java.util.HashMap;
@@ -32,9 +31,9 @@ import java.util.HashMap;
public class AlgorithmNames {
Activity mActivity;
- HashMap<Integer, String> mEncryptionNames = new HashMap<Integer, String>();
- HashMap<Integer, String> mHashNames = new HashMap<Integer, String>();
- HashMap<Integer, String> mCompressionNames = new HashMap<Integer, String>();
+ HashMap<Integer, String> mEncryptionNames = new HashMap<>();
+ HashMap<Integer, String> mHashNames = new HashMap<>();
+ HashMap<Integer, String> mCompressionNames = new HashMap<>();
public AlgorithmNames(Activity context) {
super();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
index 4ce7a1bac..60bc846b2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
@@ -35,9 +35,9 @@ import android.util.Patterns;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
import java.io.InputStream;
import java.util.ArrayList;
@@ -73,20 +73,20 @@ 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>();
+ private static final Map<String, Bitmap> photoCache = new HashMap<>();
public static List<String> getPossibleUserEmails(Context context) {
Set<String> accountMails = getAccountEmails(context);
accountMails.addAll(getMainProfileContactEmails(context));
// now return the Set (without duplicates) as a List
- return new ArrayList<String>(accountMails);
+ return new ArrayList<>(accountMails);
}
public static List<String> getPossibleUserNames(Context context) {
Set<String> accountMails = getAccountEmails(context);
Set<String> names = getContactNamesFromEmails(context, accountMails);
names.addAll(getMainProfileContactName(context));
- return new ArrayList<String>(names);
+ return new ArrayList<>(names);
}
/**
@@ -97,7 +97,7 @@ public class ContactHelper {
*/
private static Set<String> getAccountEmails(Context context) {
final Account[] accounts = AccountManager.get(context).getAccounts();
- final Set<String> emailSet = new HashSet<String>();
+ final Set<String> emailSet = new HashSet<>();
for (Account account : accounts) {
if (Patterns.EMAIL_ADDRESS.matcher(account.name).matches()) {
emailSet.add(account.name);
@@ -116,7 +116,7 @@ public class ContactHelper {
*/
private static Set<String> getContactNamesFromEmails(Context context, Set<String> emails) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- Set<String> names = new HashSet<String>();
+ Set<String> names = new HashSet<>();
for (String email : emails) {
ContentResolver resolver = context.getContentResolver();
Cursor profileCursor = resolver.query(
@@ -128,7 +128,7 @@ public class ContactHelper {
);
if (profileCursor == null) return null;
- Set<String> currNames = new HashSet<String>();
+ Set<String> currNames = new HashSet<>();
while (profileCursor.moveToNext()) {
String name = profileCursor.getString(1);
if (name != null) {
@@ -140,7 +140,7 @@ public class ContactHelper {
}
return names;
} else {
- return new HashSet<String>();
+ return new HashSet<>();
}
}
@@ -172,7 +172,7 @@ public class ContactHelper {
);
if (profileCursor == null) return null;
- Set<String> emails = new HashSet<String>();
+ Set<String> emails = new HashSet<>();
while (profileCursor.moveToNext()) {
String email = profileCursor.getString(0);
if (email != null) {
@@ -182,7 +182,7 @@ public class ContactHelper {
profileCursor.close();
return emails;
} else {
- return new HashSet<String>();
+ return new HashSet<>();
}
}
@@ -201,7 +201,7 @@ public class ContactHelper {
null, null, null);
if (profileCursor == null) return null;
- Set<String> names = new HashSet<String>();
+ Set<String> names = new HashSet<>();
// should only contain one entry!
while (profileCursor.moveToNext()) {
String name = profileCursor.getString(0);
@@ -210,9 +210,9 @@ public class ContactHelper {
}
}
profileCursor.close();
- return new ArrayList<String>(names);
+ return new ArrayList<>(names);
} else {
- return new ArrayList<String>();
+ return new ArrayList<>();
}
}
@@ -221,9 +221,9 @@ public class ContactHelper {
Cursor mailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Email.DATA},
null, null, null);
- if (mailCursor == null) return new ArrayList<String>();
+ if (mailCursor == null) return new ArrayList<>();
- Set<String> mails = new HashSet<String>();
+ Set<String> mails = new HashSet<>();
while (mailCursor.moveToNext()) {
String email = mailCursor.getString(0);
if (email != null) {
@@ -231,7 +231,7 @@ public class ContactHelper {
}
}
mailCursor.close();
- return new ArrayList<String>(mails);
+ return new ArrayList<>(mails);
}
public static List<String> getContactNames(Context context) {
@@ -239,9 +239,9 @@ public class ContactHelper {
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,
new String[]{ContactsContract.Contacts.DISPLAY_NAME},
null, null, null);
- if (cursor == null) return new ArrayList<String>();
+ if (cursor == null) return new ArrayList<>();
- Set<String> names = new HashSet<String>();
+ Set<String> names = new HashSet<>();
while (cursor.moveToNext()) {
String name = cursor.getString(0);
if (name != null) {
@@ -249,7 +249,7 @@ public class ContactHelper {
}
}
cursor.close();
- return new ArrayList<String>(names);
+ return new ArrayList<>(names);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@@ -309,7 +309,7 @@ public class ContactHelper {
boolean isExpired = !cursor.isNull(4) && new Date(cursor.getLong(4) * 1000).before(new Date());
boolean isRevoked = cursor.getInt(5) > 0;
int rawContactId = findRawContactId(resolver, fingerprint);
- ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+ ArrayList<ContentProviderOperation> ops = new ArrayList<>();
// Do not store expired or revoked keys in contact db - and remove them if they already exist
if (isExpired || isRevoked) {
@@ -351,7 +351,7 @@ public class ContactHelper {
* @return a set of all key fingerprints currently present in the contact db
*/
private static Set<String> getRawContactFingerprints(ContentResolver resolver) {
- HashSet<String> result = new HashSet<String>();
+ HashSet<String> result = new HashSet<>();
Cursor fingerprints = resolver.query(ContactsContract.RawContacts.CONTENT_URI, SOURCE_ID_PROJECTION,
ACCOUNT_TYPE_SELECTION, new String[]{Constants.ACCOUNT_TYPE}, null);
if (fingerprints != null) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java
index 49d4d8bf8..8334b37ec 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java
@@ -42,13 +42,13 @@ public class EmailKeyHelper {
public static void importAll(Context context, Messenger messenger, List<String> mails) {
// Collect all candidates as ImportKeysListEntry (set for deduplication)
- Set<ImportKeysListEntry> entries = new HashSet<ImportKeysListEntry>();
+ Set<ImportKeysListEntry> entries = new HashSet<>();
for (String mail : mails) {
entries.addAll(getEmailKeys(context, mail));
}
// Put them in a list and import
- ArrayList<ParcelableKeyRing> keys = new ArrayList<ParcelableKeyRing>(entries.size());
+ ArrayList<ParcelableKeyRing> keys = new ArrayList<>(entries.size());
for (ImportKeysListEntry entry : entries) {
keys.add(new ParcelableKeyRing(entry.getFingerprintHex(), entry.getKeyIdHex(), null));
}
@@ -56,7 +56,7 @@ public class EmailKeyHelper {
}
public static Set<ImportKeysListEntry> getEmailKeys(Context context, String mail) {
- Set<ImportKeysListEntry> keys = new HashSet<ImportKeysListEntry>();
+ Set<ImportKeysListEntry> keys = new HashSet<>();
// Try _hkp._tcp SRV record first
String[] mailparts = mail.split("@");
@@ -90,7 +90,7 @@ public class EmailKeyHelper {
}
public static List<ImportKeysListEntry> getEmailKeys(String mail, Keyserver keyServer) {
- Set<ImportKeysListEntry> keys = new HashSet<ImportKeysListEntry>();
+ Set<ImportKeysListEntry> keys = new HashSet<>();
try {
for (ImportKeysListEntry key : keyServer.search(mail)) {
if (key.isRevoked() || key.isExpired()) continue;
@@ -103,6 +103,6 @@ public class EmailKeyHelper {
} catch (Keyserver.QueryFailedException ignored) {
} catch (Keyserver.QueryNeedsRepairException ignored) {
}
- return new ArrayList<ImportKeysListEntry>(keys);
+ return new ArrayList<>(keys);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
index 7492d95b2..1d78ed80e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ExportHelper.java
@@ -24,13 +24,11 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
-import android.support.v7.app.ActionBarActivity;
-import android.widget.Toast;
+import android.support.v4.app.FragmentActivity;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.ExportResult;
-import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
@@ -42,9 +40,9 @@ import java.io.File;
public class ExportHelper {
protected File mExportFile;
- ActionBarActivity mActivity;
+ FragmentActivity mActivity;
- public ExportHelper(ActionBarActivity activity) {
+ public ExportHelper(FragmentActivity activity) {
super();
this.mActivity = activity;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FabContainer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FabContainer.java
new file mode 100644
index 000000000..116b98d1e
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FabContainer.java
@@ -0,0 +1,8 @@
+package org.sufficientlysecure.keychain.util;
+
+public interface FabContainer {
+
+ void fabMoveUp(int height);
+ void fabRestorePosition();
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java
index f89ffd139..1f73dcb28 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java
@@ -25,16 +25,28 @@ import java.io.InputStream;
public class InputData {
private PositionAwareInputStream mInputStream;
private long mSize;
+ String mOriginalFilename;
+
+ public InputData(InputStream inputStream, long size, String originalFilename) {
+ mInputStream = new PositionAwareInputStream(inputStream);
+ mSize = size;
+ mOriginalFilename = originalFilename;
+ }
public InputData(InputStream inputStream, long size) {
mInputStream = new PositionAwareInputStream(inputStream);
mSize = size;
+ mOriginalFilename = "";
}
public InputStream getInputStream() {
return mInputStream;
}
+ public String getOriginalFilename () {
+ return mOriginalFilename;
+ }
+
public long getSize() {
return mSize;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Iso7816TLV.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Iso7816TLV.java
index 90afd3bc0..c0483ad04 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Iso7816TLV.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Iso7816TLV.java
@@ -125,7 +125,7 @@ public class Iso7816TLV {
public static Iso7816TLV[] readList(byte[] data, boolean recursive) throws IOException {
ByteBuffer buf = ByteBuffer.wrap(data);
- ArrayList<Iso7816TLV> result = new ArrayList<Iso7816TLV>();
+ ArrayList<Iso7816TLV> result = new ArrayList<>();
// read while data is available. this will fail if there is trailing data!
while (buf.hasRemaining()) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java
index 76ec9f75f..943b913d7 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyUpdateHelper.java
@@ -17,21 +17,6 @@
package org.sufficientlysecure.keychain.util;
-import android.content.Context;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Messenger;
-
-import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-
-import java.util.ArrayList;
-import java.util.List;
-
public class KeyUpdateHelper {
/*
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Log.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Log.java
index b4f7c5767..8b165cd57 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Log.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Log.java
@@ -21,9 +21,6 @@ import android.os.Bundle;
import org.sufficientlysecure.keychain.Constants;
-import java.io.IOException;
-import java.io.StreamTokenizer;
-import java.io.StringReader;
import java.util.Iterator;
import java.util.Set;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
index 3081021cf..6f9cb277e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
@@ -32,9 +32,7 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Iterator;
-import java.util.List;
/**
* When sending large data (over 1MB) through Androids Binder IPC you get
@@ -106,7 +104,6 @@ public class ParcelableFileCache<E extends Parcelable> {
throw new IOException(e);
}
- // yes this is sloppy data flow. WE WOULDN'T NEED THIS WITH TUPLE RETURN TYPES
final int numEntries = ois.readInt();
return new IteratorWithSize<E>() {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java
index 65f4af880..a36af5c87 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java
@@ -172,7 +172,7 @@ public class Preferences {
}
public boolean useDefaultYubikeyPin() {
- return mSharedPreferences.getBoolean(Pref.USE_DEFAULT_YUBIKEY_PIN, true);
+ return mSharedPreferences.getBoolean(Pref.USE_DEFAULT_YUBIKEY_PIN, false);
}
public void setUseDefaultYubikeyPin(boolean useDefaultYubikeyPin) {
@@ -182,7 +182,7 @@ public class Preferences {
}
public boolean useNumKeypadForYubikeyPin() {
- return mSharedPreferences.getBoolean(Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN, false);
+ return mSharedPreferences.getBoolean(Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN, true);
}
public void setUseNumKeypadForYubikeyPin(boolean useNumKeypadForYubikeyPin) {
@@ -200,7 +200,7 @@ public class Preferences {
public String[] getKeyServers() {
String rawData = mSharedPreferences.getString(Constants.Pref.KEY_SERVERS,
Constants.Defaults.KEY_SERVERS);
- Vector<String> servers = new Vector<String>();
+ Vector<String> servers = new Vector<>();
String chunks[] = rawData.split(",");
for (String c : chunks) {
String tmp = c.trim();
@@ -281,7 +281,7 @@ public class Preferences {
case 3: {
// migrate keyserver to hkps
String[] serversArray = getKeyServers();
- ArrayList<String> servers = new ArrayList<String>(Arrays.asList(serversArray));
+ ArrayList<String> servers = new ArrayList<>(Arrays.asList(serversArray));
ListIterator<String> it = servers.listIterator();
while (it.hasNext()) {
String server = it.next();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareHelper.java
index 51e58565f..120b84a3b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ShareHelper.java
@@ -43,16 +43,18 @@ public class ShareHelper {
* Put together from some stackoverflow posts...
*/
public Intent createChooserExcluding(Intent prototype, String title, String[] activityBlacklist) {
- // Produced an empty list on Huawei U8860 with Android Version 4.0.3 and weird results on 2.3
+ // Produced an empty list on Huawei U8860 with Android Version 4.0.3
// TODO: test on 4.1, 4.2, 4.3, only tested on 4.4
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
+ // Disabled on 5.0 because using EXTRA_INITIAL_INTENTS prevents the usage based sorting
+ // introduced in 5.0: https://medium.com/@xXxXxXxXxXam/how-lollipops-share-menu-is-organized-d204888f606d
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return Intent.createChooser(prototype, title);
}
- List<LabeledIntent> targetedShareIntents = new ArrayList<LabeledIntent>();
+ List<LabeledIntent> targetedShareIntents = new ArrayList<>();
List<ResolveInfo> resInfoList = mContext.getPackageManager().queryIntentActivities(prototype, 0);
- List<ResolveInfo> resInfoListFiltered = new ArrayList<ResolveInfo>();
+ List<ResolveInfo> resInfoListFiltered = new ArrayList<>();
if (!resInfoList.isEmpty()) {
for (ResolveInfo resolveInfo : resInfoList) {
// do not add blacklisted ones
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java
index 9946d81aa..4ff14e3bb 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/TlsHelper.java
@@ -20,7 +20,6 @@ package org.sufficientlysecure.keychain.util;
import android.content.res.AssetManager;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.util.Log;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -50,7 +49,7 @@ public class TlsHelper {
}
}
- private static Map<String, byte[]> sStaticCA = new HashMap<String, byte[]>();
+ private static Map<String, byte[]> sStaticCA = new HashMap<>();
public static void addStaticCA(String domain, byte[] certificate) {
sStaticCA.put(domain, certificate);
@@ -120,13 +119,7 @@ public class TlsHelper {
urlConnection.setSSLSocketFactory(context.getSocketFactory());
return urlConnection;
- } catch (CertificateException e) {
- throw new TlsHelperException(e);
- } catch (NoSuchAlgorithmException e) {
- throw new TlsHelperException(e);
- } catch (KeyStoreException e) {
- throw new TlsHelperException(e);
- } catch (KeyManagementException e) {
+ } catch (CertificateException | KeyManagementException | KeyStoreException | NoSuchAlgorithmException e) {
throw new TlsHelperException(e);
}
}
diff --git a/OpenKeychain/src/main/res/anim/rotate.xml b/OpenKeychain/src/main/res/anim/rotate.xml
new file mode 100644
index 000000000..3856fa081
--- /dev/null
+++ b/OpenKeychain/src/main/res/anim/rotate.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:fromDegrees="0"
+ android:toDegrees="360"
+ android:pivotX="50%"
+ android:pivotY="50%"
+ android:duration="800"
+ android:interpolator="@android:anim/linear_interpolator" /> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/anim/rotate_spin.xml b/OpenKeychain/src/main/res/anim/rotate_spin.xml
new file mode 100644
index 000000000..e6ddec869
--- /dev/null
+++ b/OpenKeychain/src/main/res/anim/rotate_spin.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:fromDegrees="0"
+ android:toDegrees="360"
+ android:pivotX="50%"
+ android:pivotY="50%"
+ android:duration="400"
+ android:interpolator="@android:anim/accelerate_decelerate_interpolator" /> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png b/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png
deleted file mode 100644
index 0ddafab03..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.png b/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.png
deleted file mode 100644
index c062b17f8..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/create_key_robot.png b/OpenKeychain/src/main/res/drawable-hdpi/create_key_robot.png
index acc198fc3..2d16b50cf 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/create_key_robot.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/create_key_robot.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_collapse.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_collapse.png
deleted file mode 100644
index e9d2dcb46..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_collapse.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_file.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_file.png
new file mode 100644
index 000000000..1e397ebed
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_file.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_text.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_text.png
new file mode 100644
index 000000000..1cbd993a7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_encrypt_text.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_expand.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_expand.png
deleted file mode 100644
index 29f4de211..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_expand.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_nfc.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_nfc.png
deleted file mode 100644
index 635633709..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_nfc.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png
deleted file mode 100644
index ceb3b1645..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_qr_code.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_safeslinger.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_safeslinger.png
deleted file mode 100644
index 6ff9bb7b4..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_safeslinger.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_verified_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_verified_cutout.png
new file mode 100644
index 000000000..896aca575
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_verified_cutout.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_apps_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_apps_black_24dp.png
new file mode 100644
index 000000000..37931a0ad
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_apps_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png
new file mode 100644
index 000000000..5fa494878
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_check_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_check_white_24dp.png
new file mode 100644
index 000000000..f42a0e2d2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_check_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_close_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_close_white_24dp.png
new file mode 100644
index 000000000..0fd15563a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_cloud_search_24px.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_cloud_search_24px.png
new file mode 100644
index 000000000..6f9b343ad
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_cloud_search_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_expand_less_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 000000000..35e3b426f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_expand_more_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 000000000..ed993f35d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_folder_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_folder_white_24dp.png
new file mode 100644
index 000000000..9f5c75609
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_folder_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_help_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_help_black_24dp.png
new file mode 100644
index 000000000..05be749c3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_help_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_launcher.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_launcher.png
index 6b2be4bc3..6133816d2 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/ic_launcher.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_lock_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_lock_black_24dp.png
new file mode 100644
index 000000000..0888c6173
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_lock_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_lock_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..b94735ecb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_lock_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 000000000..3ee3e1720
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_nfc_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_nfc_white_24dp.png
new file mode 100644
index 000000000..1d87415c5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_nfc_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 000000000..164385d04
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_qrcode_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_qrcode_white_24dp.png
new file mode 100644
index 000000000..261f4a5ab
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_qrcode_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png
new file mode 100644
index 000000000..cd16fdd50
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_grey_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_grey_24dp.png
new file mode 100644
index 000000000..48d6ce93a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_grey_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_white_24dp.png
new file mode 100644
index 000000000..612e73458
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_repeat_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..a2fc5b2e7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_settings_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_settings_black_24dp.png
new file mode 100644
index 000000000..b16209fc1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_settings_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_vpn_key_black_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_vpn_key_black_24dp.png
new file mode 100644
index 000000000..c900b8ec7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_vpn_key_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate_24px.png
index 9d4ed6e84..9d4ed6e84 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_authenticate_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify_24px.png
index e76393659..e76393659 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_certify_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt_24px.png
index 3c2f8c09c..3c2f8c09c 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_encrypt_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign.png b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign_24px.png
index 046424643..046424643 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/key_flag_sign_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
deleted file mode 100644
index f74fcdd8d..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_holo_light.png
deleted file mode 100644
index 9dbad9b92..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_focused_holo_light.png
deleted file mode 100644
index 58a99014e..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_holo_light.png
deleted file mode 100644
index b1b52b23a..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_pressed_holo_light.png
deleted file mode 100644
index e5f0ddf50..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
deleted file mode 100644
index 1d06ee46f..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_holo_light.png
deleted file mode 100644
index cd02122be..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_focused_holo_light.png
deleted file mode 100644
index 0f9718950..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_holo_light.png
deleted file mode 100644
index 8db606b56..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_pressed_holo_light.png
deleted file mode 100644
index 313698a88..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
deleted file mode 100644
index 8ee0aa89c..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_holo_light.9.png
deleted file mode 100644
index 6a2a92cce..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_focused_holo_light.9.png
deleted file mode 100644
index e6ce2835c..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_normal_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_normal_holo_light.9.png
deleted file mode 100644
index 55139e939..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_pressed_holo_light.9.png
deleted file mode 100644
index aaae193fb..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
deleted file mode 100644
index 0dc2a75ab..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
deleted file mode 100644
index 25e8e1ba5..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_focused_holo_light.png
deleted file mode 100644
index 0c22251f3..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_holo_light.png
deleted file mode 100644
index 932257123..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
deleted file mode 100644
index 065e49a12..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
deleted file mode 100644
index 82eb795b8..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
deleted file mode 100644
index 6e61b5287..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_focused_holo_light.png
deleted file mode 100644
index fbee3366d..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_holo_light.png
deleted file mode 100644
index eda8002eb..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
deleted file mode 100644
index 7f66e282f..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_activated_holo.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_activated_holo.9.png
deleted file mode 100644
index e98c2a4d2..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_activated_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_focused_holo.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_focused_holo.9.png
deleted file mode 100644
index 84d9006eb..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_focused_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_longpressed_holo.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_longpressed_holo.9.png
deleted file mode 100644
index e9196aa82..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_longpressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_pressed_holo_light.9.png
deleted file mode 100644
index 895e51bdf..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_selector_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_selector_disabled_holo_light.9.png
deleted file mode 100644
index ca8e9a277..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_selector_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_bg_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_bg_holo_light.9.png
deleted file mode 100644
index 3f12166d2..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_primary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_primary_holo_light.9.png
deleted file mode 100644
index c14605dab..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_secondary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_secondary_holo_light.9.png
deleted file mode 100644
index 60aefe181..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo1.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo1.png
deleted file mode 100644
index b9977dedb..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo1.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo2.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo2.png
deleted file mode 100644
index 88601174a..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo2.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo3.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo3.png
deleted file mode 100644
index 6cd634a91..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo3.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo4.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo4.png
deleted file mode 100644
index 9456cf4e1..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo4.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo5.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo5.png
deleted file mode 100644
index fc6c57e16..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo5.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo6.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo6.png
deleted file mode 100644
index 3c2e03356..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo6.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo7.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo7.png
deleted file mode 100644
index 2618d0e50..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo7.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo8.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo8.png
deleted file mode 100644
index 56745c26b..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo8.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_default_holo_light.9.png
deleted file mode 100644
index a02ebb450..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_disabled_holo_light.9.png
deleted file mode 100644
index d0d94197b..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_focused_holo_light.9.png
deleted file mode 100644
index 12c3cd5af..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_pressed_holo_light.9.png
deleted file mode 100644
index 35f8ec52a..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_activated_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_activated_holo_light.9.png
deleted file mode 100644
index 70691cddc..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_activated_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_default_holo_light.9.png
deleted file mode 100644
index d5ac69c23..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
deleted file mode 100644
index b70db4e10..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_holo_light.9.png
deleted file mode 100644
index a77d66d99..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_focused_holo_light.9.png
deleted file mode 100644
index 257eba9a0..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_lock_closed.png b/OpenKeychain/src/main/res/drawable-hdpi/status_lock_closed_24px.png
index a1b090630..a1b090630 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_lock_closed.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_lock_closed_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_lock_error.png b/OpenKeychain/src/main/res/drawable-hdpi/status_lock_error_24px.png
index e567055aa..e567055aa 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_lock_error.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_lock_error_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_lock_open.png b/OpenKeychain/src/main/res/drawable-hdpi/status_lock_open_24px.png
index 98e32eadc..98e32eadc 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_lock_open.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_lock_open_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired.png
deleted file mode 100644
index 21e8b536a..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_24px.png
index 84ac9bec2..84ac9bec2 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_96px.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_96px.png
new file mode 100644
index 000000000..63546068f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_expired_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid.png
deleted file mode 100644
index 9ae2a09ab..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_24px.png
index 967e00e80..967e00e80 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_96px.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_96px.png
new file mode 100644
index 000000000..9957db288
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_invalid_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked.png
deleted file mode 100644
index 16e1d7181..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_24px.png
index 244dd0708..244dd0708 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_96px.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_96px.png
new file mode 100644
index 000000000..1c3a15c07
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_revoked_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown.png
deleted file mode 100644
index 5c3ba866d..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_24px.png
index 82cc25a4b..82cc25a4b 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_96px.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_96px.png
new file mode 100644
index 000000000..ce46c6317
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unknown_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified.png
deleted file mode 100644
index b8b472a5a..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_24px.png
index e752eaeab..e752eaeab 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_96px.png
new file mode 100644
index 000000000..19ee3c241
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_unverified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified.png
deleted file mode 100644
index d8141b47b..000000000
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_24px.png
index 08a9f464c..08a9f464c 100644
--- a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_96px.png
new file mode 100644
index 000000000..ed3db0aca
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/status_signature_verified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-ldpi/ic_launcher.png b/OpenKeychain/src/main/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index c2b688424..000000000
--- a/OpenKeychain/src/main/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-ldpi/uid_mail_bad.png b/OpenKeychain/src/main/res/drawable-ldpi/uid_mail_bad.png
deleted file mode 100644
index 45467992f..000000000
--- a/OpenKeychain/src/main/res/drawable-ldpi/uid_mail_bad.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-ldpi/uid_mail_ok.png b/OpenKeychain/src/main/res/drawable-ldpi/uid_mail_ok.png
deleted file mode 100644
index c400a1820..000000000
--- a/OpenKeychain/src/main/res/drawable-ldpi/uid_mail_ok.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.png b/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.png
deleted file mode 100644
index ebffb16a0..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.png b/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.png
deleted file mode 100644
index b6739b564..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/create_key_robot.png b/OpenKeychain/src/main/res/drawable-mdpi/create_key_robot.png
index 58476bfc9..08168f357 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/create_key_robot.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/create_key_robot.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_collapse.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_collapse.png
deleted file mode 100644
index 4ac28f270..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_collapse.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_file.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_file.png
new file mode 100644
index 000000000..06a054160
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_file.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_text.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_text.png
new file mode 100644
index 000000000..97cb03def
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_encrypt_text.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_expand.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_expand.png
deleted file mode 100644
index bb46bb315..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_expand.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_nfc.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_nfc.png
deleted file mode 100644
index da5e267d0..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_nfc.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png
deleted file mode 100644
index 21594e62f..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_qr_code.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_safeslinger.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_safeslinger.png
deleted file mode 100644
index bfea67f33..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_safeslinger.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_verified_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_verified_cutout.png
new file mode 100644
index 000000000..0329b488f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_verified_cutout.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_apps_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_apps_black_24dp.png
new file mode 100644
index 000000000..5b1fd7766
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_apps_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png
new file mode 100644
index 000000000..9e662f6d4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_check_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_check_white_24dp.png
new file mode 100644
index 000000000..e91f9048b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_check_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_close_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_close_white_24dp.png
new file mode 100644
index 000000000..e80681aeb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_cloud_search_24px.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_cloud_search_24px.png
new file mode 100644
index 000000000..7a69993fd
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_cloud_search_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_expand_less_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 000000000..a5ab2c5d3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_expand_more_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 000000000..73fc3b422
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_folder_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_folder_white_24dp.png
new file mode 100644
index 000000000..1c5797c9e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_folder_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_help_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_help_black_24dp.png
new file mode 100644
index 000000000..f3743dc20
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_help_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_launcher.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_launcher.png
index 6bb29efde..d945a01de 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/ic_launcher.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_lock_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_lock_black_24dp.png
new file mode 100644
index 000000000..d18d4b667
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_lock_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_lock_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..381b6a118
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_lock_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 000000000..85cff0b91
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_nfc_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_nfc_white_24dp.png
new file mode 100644
index 000000000..65ae04b7c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_nfc_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 000000000..8d1e433a5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_qrcode_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_qrcode_white_24dp.png
new file mode 100644
index 000000000..5cf552b13
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_qrcode_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png
new file mode 100644
index 000000000..235c84f1e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_grey_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_grey_24dp.png
new file mode 100644
index 000000000..60aa53747
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_grey_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_white_24dp.png
new file mode 100644
index 000000000..8a2b641ca
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_repeat_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..dff1e3a8a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_settings_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_settings_black_24dp.png
new file mode 100644
index 000000000..3405c951d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_settings_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_vpn_key_black_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_vpn_key_black_24dp.png
new file mode 100644
index 000000000..5e8781731
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_vpn_key_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_authenticate_24px.png
index ed1ba24d2..ed1ba24d2 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_authenticate.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_authenticate_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_certify_24px.png
index d54d461fa..d54d461fa 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_certify.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_certify_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_encrypt.png b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_encrypt_24px.png
index 81c1b3dfa..81c1b3dfa 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_encrypt.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_encrypt_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_sign.png b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_sign_24px.png
index 9afc43901..9afc43901 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/key_flag_sign.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/key_flag_sign_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
deleted file mode 100644
index d7be4f996..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_holo_light.png
deleted file mode 100644
index db190430c..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_focused_holo_light.png
deleted file mode 100644
index 2c5949eb9..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_holo_light.png
deleted file mode 100644
index f5eaf804b..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_pressed_holo_light.png
deleted file mode 100644
index c237545b1..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
deleted file mode 100644
index d5e0ef543..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_holo_light.png
deleted file mode 100644
index 20e2aab12..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_focused_holo_light.png
deleted file mode 100644
index d12f33b7d..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_holo_light.png
deleted file mode 100644
index 517ea4302..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_pressed_holo_light.png
deleted file mode 100644
index 09f2df11f..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
deleted file mode 100644
index c6a653217..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_holo_light.9.png
deleted file mode 100644
index d424a0e77..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_focused_holo_light.9.png
deleted file mode 100644
index dca8db91f..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_normal_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_normal_holo_light.9.png
deleted file mode 100644
index 502f762af..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_pressed_holo_light.9.png
deleted file mode 100644
index 693371f44..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
deleted file mode 100644
index ef648d9df..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
deleted file mode 100644
index a67375ec8..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_focused_holo_light.png
deleted file mode 100644
index aefa6e2c7..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_holo_light.png
deleted file mode 100644
index 590c37c6c..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
deleted file mode 100644
index ad8341be4..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
deleted file mode 100644
index fa981c2f4..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
deleted file mode 100644
index 4583c3e1f..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_focused_holo_light.png
deleted file mode 100644
index b7421f31a..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_holo_light.png
deleted file mode 100644
index 0f3beeea6..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
deleted file mode 100644
index 7d47196e4..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_activated_holo.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_activated_holo.9.png
deleted file mode 100644
index aa1130332..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_activated_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_focused_holo.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_focused_holo.9.png
deleted file mode 100644
index 8d1b4af83..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_focused_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_longpressed_holo.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_longpressed_holo.9.png
deleted file mode 100644
index ba6538fbe..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_longpressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_pressed_holo_light.9.png
deleted file mode 100644
index 886a6ee0c..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_selector_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_selector_disabled_holo_light.9.png
deleted file mode 100644
index 42cb6463e..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_selector_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_bg_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_bg_holo_light.9.png
deleted file mode 100644
index 780b4b256..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_primary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_primary_holo_light.9.png
deleted file mode 100644
index fdb236d7c..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_secondary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_secondary_holo_light.9.png
deleted file mode 100644
index 64b72e8ee..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo1.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo1.png
deleted file mode 100644
index 0cff52503..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo1.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo2.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo2.png
deleted file mode 100644
index 3a290e871..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo2.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo3.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo3.png
deleted file mode 100644
index d6b4a1326..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo3.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo4.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo4.png
deleted file mode 100644
index 98061c845..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo4.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo5.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo5.png
deleted file mode 100644
index cf130fdf2..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo5.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo6.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo6.png
deleted file mode 100644
index 72d43ea01..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo6.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo7.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo7.png
deleted file mode 100644
index 6a7307dcf..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo7.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo8.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo8.png
deleted file mode 100644
index 0d3cb5fe7..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo8.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_default_holo_light.9.png
deleted file mode 100644
index 574ea43ba..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_disabled_holo_light.9.png
deleted file mode 100644
index a78d6c082..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_focused_holo_light.9.png
deleted file mode 100644
index 33c452dcd..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_pressed_holo_light.9.png
deleted file mode 100644
index 3636d59d4..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_activated_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_activated_holo_light.9.png
deleted file mode 100644
index 4569d71a9..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_activated_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_default_holo_light.9.png
deleted file mode 100644
index 47302c93e..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
deleted file mode 100644
index 0d5ea839d..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_holo_light.9.png
deleted file mode 100644
index ea6d2f74b..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_focused_holo_light.9.png
deleted file mode 100644
index 39ca1ffda..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_lock_closed.png b/OpenKeychain/src/main/res/drawable-mdpi/status_lock_closed_24px.png
index cfc39f0e7..cfc39f0e7 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_lock_closed.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_lock_closed_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_lock_error.png b/OpenKeychain/src/main/res/drawable-mdpi/status_lock_error_24px.png
index 824dc2672..824dc2672 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_lock_error.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_lock_error_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_lock_open.png b/OpenKeychain/src/main/res/drawable-mdpi/status_lock_open_24px.png
index 9bca59ae3..9bca59ae3 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_lock_open.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_lock_open_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired.png
deleted file mode 100644
index 81a900147..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_24px.png
index bc91094b5..bc91094b5 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_96px.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_96px.png
new file mode 100644
index 000000000..df385bb1b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_expired_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid.png
deleted file mode 100644
index baa78f795..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_24px.png
index bc2f56e2a..bc2f56e2a 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_96px.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_96px.png
new file mode 100644
index 000000000..aeb899599
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_invalid_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked.png
deleted file mode 100644
index 7cf985274..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_24px.png
index 2d2593194..2d2593194 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_96px.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_96px.png
new file mode 100644
index 000000000..d77c5e1c1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_revoked_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown.png
deleted file mode 100644
index 3d4665320..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_24px.png
index 0fc74d07e..0fc74d07e 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_96px.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_96px.png
new file mode 100644
index 000000000..ee0661234
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unknown_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified.png
deleted file mode 100644
index 8348b32b3..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_24px.png
index 96a2d1413..96a2d1413 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_96px.png
new file mode 100644
index 000000000..1602747f1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_unverified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified.png
deleted file mode 100644
index 02e53ac8a..000000000
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_24px.png
index 9f7cf837c..9f7cf837c 100644
--- a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_96px.png
new file mode 100644
index 000000000..61c23f749
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/status_signature_verified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.png b/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.png
deleted file mode 100644
index 7c5e21eeb..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.png b/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.png
deleted file mode 100644
index 86814b45d..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/create_key_robot.png b/OpenKeychain/src/main/res/drawable-xhdpi/create_key_robot.png
index 022f2dd2e..a7d43e3b7 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/create_key_robot.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/create_key_robot.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collapse.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collapse.png
deleted file mode 100644
index 60ac6b066..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_collapse.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_file.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_file.png
new file mode 100644
index 000000000..5f528864d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_file.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_text.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_text.png
new file mode 100644
index 000000000..f8867e922
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_encrypt_text.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_expand.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_expand.png
deleted file mode 100644
index 76937f57a..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_expand.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_nfc.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_nfc.png
deleted file mode 100644
index ff569927c..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_nfc.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png
deleted file mode 100644
index 93bdac866..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_qr_code.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_safeslinger.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_safeslinger.png
deleted file mode 100644
index 864a18d1a..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_safeslinger.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_verified_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_verified_cutout.png
new file mode 100644
index 000000000..116adf28d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_verified_cutout.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_apps_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_apps_black_24dp.png
new file mode 100644
index 000000000..c8187799b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_apps_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png
new file mode 100644
index 000000000..addbfc886
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_check_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_check_white_24dp.png
new file mode 100644
index 000000000..e5024472a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_check_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_close_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_close_white_24dp.png
new file mode 100644
index 000000000..76e07f097
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_cloud_search_24px.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_cloud_search_24px.png
new file mode 100644
index 000000000..1f0db264a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_cloud_search_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_less_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 000000000..47c7b52a1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_more_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 000000000..45d30d999
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png
new file mode 100644
index 000000000..e5f54cef0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_help_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_help_black_24dp.png
new file mode 100644
index 000000000..87095ef26
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_help_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_launcher.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_launcher.png
index 6188bbed9..825b18b38 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/ic_launcher.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_black_24dp.png
new file mode 100644
index 000000000..8856c70df
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..c5e9d0b49
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 000000000..7f0ea51bf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_nfc_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_nfc_white_24dp.png
new file mode 100644
index 000000000..44b9006ab
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_nfc_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 000000000..a55d19922
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_qrcode_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_qrcode_white_24dp.png
new file mode 100644
index 000000000..a2c6ade61
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_qrcode_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png
new file mode 100644
index 000000000..5f89fc257
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_grey_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_grey_24dp.png
new file mode 100644
index 000000000..3d0e27547
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_grey_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_white_24dp.png
new file mode 100644
index 000000000..729220066
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_repeat_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_search_white_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..043759acd
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png
new file mode 100644
index 000000000..2b775b646
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_vpn_key_black_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_vpn_key_black_24dp.png
new file mode 100644
index 000000000..ccbdce4ab
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_vpn_key_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate_24px.png
index 8d36d7202..8d36d7202 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_authenticate_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify_24px.png
index 01a74bcc0..01a74bcc0 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_certify_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt_24px.png
index ff07bd0a4..ff07bd0a4 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_encrypt_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign_24px.png
index b8002162a..b8002162a 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/key_flag_sign_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
deleted file mode 100644
index 0b0606462..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_holo_light.png
deleted file mode 100644
index 6a364bbe3..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_focused_holo_light.png
deleted file mode 100644
index 65d850957..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_holo_light.png
deleted file mode 100644
index a1c2005a8..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_pressed_holo_light.png
deleted file mode 100644
index 7ae2fad2b..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
deleted file mode 100644
index 80ad53ff0..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_holo_light.png
deleted file mode 100644
index d705b4204..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_focused_holo_light.png
deleted file mode 100644
index b72dea7f8..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_holo_light.png
deleted file mode 100644
index f24991826..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_pressed_holo_light.png
deleted file mode 100644
index db233e702..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
deleted file mode 100644
index 5c122118e..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_holo_light.9.png
deleted file mode 100644
index b410d238e..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_focused_holo_light.9.png
deleted file mode 100644
index e738f8218..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_normal_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_normal_holo_light.9.png
deleted file mode 100644
index 8bb32617b..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_pressed_holo_light.9.png
deleted file mode 100644
index 06d1d1e75..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
deleted file mode 100644
index 83af2dcc3..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
deleted file mode 100644
index 1030a801a..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_focused_holo_light.png
deleted file mode 100644
index b02c9b6d1..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_holo_light.png
deleted file mode 100644
index 2360f30be..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
deleted file mode 100644
index 0bbf8a326..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
deleted file mode 100644
index 1a2ed89db..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
deleted file mode 100644
index 5741490d3..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_focused_holo_light.png
deleted file mode 100644
index 306e47e71..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_holo_light.png
deleted file mode 100644
index d22876cb2..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
deleted file mode 100644
index c6a6d833d..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_activated_holo.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_activated_holo.9.png
deleted file mode 100644
index 6a24d21e7..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_activated_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_focused_holo.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_focused_holo.9.png
deleted file mode 100644
index 430387245..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_focused_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_longpressed_holo.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_longpressed_holo.9.png
deleted file mode 100644
index 22ab07906..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_longpressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_pressed_holo_light.9.png
deleted file mode 100644
index 541163853..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_selector_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_selector_disabled_holo_light.9.png
deleted file mode 100644
index c6a7d4d87..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_selector_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_bg_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_bg_holo_light.9.png
deleted file mode 100644
index cbd19ac4f..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_primary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_primary_holo_light.9.png
deleted file mode 100644
index 9e08305f5..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_secondary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_secondary_holo_light.9.png
deleted file mode 100644
index 95c75a6db..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo1.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo1.png
deleted file mode 100644
index 06f79cba3..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo1.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo2.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo2.png
deleted file mode 100644
index f7bae4cef..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo2.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo3.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo3.png
deleted file mode 100644
index fc5808cbf..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo3.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo4.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo4.png
deleted file mode 100644
index ef108bdf4..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo4.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo5.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo5.png
deleted file mode 100644
index f826eee36..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo5.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo6.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo6.png
deleted file mode 100644
index dfd468fe9..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo6.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo7.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo7.png
deleted file mode 100644
index 6a223873c..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo7.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo8.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo8.png
deleted file mode 100644
index 27a2832af..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo8.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_default_holo_light.9.png
deleted file mode 100644
index 10458c01a..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_disabled_holo_light.9.png
deleted file mode 100644
index fe541269e..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_focused_holo_light.9.png
deleted file mode 100644
index e4d7abf4d..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_pressed_holo_light.9.png
deleted file mode 100644
index 9d4c6e5a2..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_activated_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_activated_holo_light.9.png
deleted file mode 100644
index dc19219cf..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_activated_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_default_holo_light.9.png
deleted file mode 100644
index f0ad55a66..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
deleted file mode 100644
index 40a28cf70..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_holo_light.9.png
deleted file mode 100644
index 4ffdd869e..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_focused_holo_light.9.png
deleted file mode 100644
index b84a6fed1..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_closed.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_closed_24px.png
index 7c6bb2d18..7c6bb2d18 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_closed.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_closed_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_error.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_error_24px.png
index da4a5d89a..da4a5d89a 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_error.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_error_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_open.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_open_24px.png
index cd02fc1e4..cd02fc1e4 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_open.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_lock_open_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired.png
deleted file mode 100644
index f5105c1ae..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_24px.png
index 83f6fde35..83f6fde35 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_96px.png
new file mode 100644
index 000000000..568b48c43
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_expired_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid.png
deleted file mode 100644
index 67880d6db..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_24px.png
index 29830f5ba..29830f5ba 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_96px.png
new file mode 100644
index 000000000..89f899212
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_invalid_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked.png
deleted file mode 100644
index 2ed67419b..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_24px.png
index 2f7695043..2f7695043 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_96px.png
new file mode 100644
index 000000000..3db663e2e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_revoked_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown.png
deleted file mode 100644
index a6f1f2792..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_24px.png
index 2ce28c7ca..2ce28c7ca 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_96px.png
new file mode 100644
index 000000000..4e0e04375
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unknown_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified.png
deleted file mode 100644
index c25a84b4d..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_24px.png
index 442c55eee..442c55eee 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_96px.png
new file mode 100644
index 000000000..0b2ccc9f7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_unverified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified.png
deleted file mode 100644
index 6f435a85e..000000000
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_24px.png
index 160ec7cbe..160ec7cbe 100644
--- a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_96px.png
new file mode 100644
index 000000000..471e5e513
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/status_signature_verified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.png
deleted file mode 100644
index 5e4818bfc..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.png
deleted file mode 100644
index 7dd89e1f4..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/create_key_robot.png b/OpenKeychain/src/main/res/drawable-xxhdpi/create_key_robot.png
index 5392deafd..0e3432635 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/create_key_robot.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/create_key_robot.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collapse.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collapse.png
deleted file mode 100644
index 76ec594dc..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_collapse.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_file.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_file.png
new file mode 100644
index 000000000..c77329563
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_file.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_text.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_text.png
new file mode 100644
index 000000000..15650500d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_encrypt_text.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_expand.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_expand.png
deleted file mode 100644
index 22003198b..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_expand.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_nfc.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_nfc.png
deleted file mode 100644
index 1f96ce37b..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_nfc.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png
deleted file mode 100644
index 7ede90609..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_qr_code.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_safeslinger.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_safeslinger.png
deleted file mode 100644
index 02efa1d24..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_safeslinger.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_verified_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_verified_cutout.png
new file mode 100644
index 000000000..49b13017c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_verified_cutout.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_apps_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_apps_black_24dp.png
new file mode 100644
index 000000000..626543b47
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_apps_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png
new file mode 100644
index 000000000..4057cc545
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png
new file mode 100644
index 000000000..6e03d54cf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png
new file mode 100644
index 000000000..0eb9d8b08
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_cloud_search_24px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_cloud_search_24px.png
new file mode 100644
index 000000000..852cdc2a6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_cloud_search_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_less_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 000000000..0470e3f02
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_more_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 000000000..aadd04af6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png
new file mode 100644
index 000000000..0d1ac4876
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_help_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_help_black_24dp.png
new file mode 100644
index 000000000..f32d7e708
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_help_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_launcher.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_launcher.png
index 765738881..4809acc39 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_launcher.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_black_24dp.png
new file mode 100644
index 000000000..c49d420e0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..0dcada814
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 000000000..34ec7092f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_nfc_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_nfc_white_24dp.png
new file mode 100644
index 000000000..484856b3f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_nfc_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 000000000..043acd808
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_qrcode_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_qrcode_white_24dp.png
new file mode 100644
index 000000000..c4f2f57c9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_qrcode_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png
new file mode 100644
index 000000000..72128fe69
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_grey_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_grey_24dp.png
new file mode 100644
index 000000000..6a8906126
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_grey_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_white_24dp.png
new file mode 100644
index 000000000..63f8de50f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_repeat_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..0bbeab150
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png
new file mode 100644
index 000000000..47f0e0d82
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_vpn_key_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_vpn_key_black_24dp.png
new file mode 100644
index 000000000..736bde37a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_vpn_key_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate_24px.png
index d786dc72f..d786dc72f 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_authenticate_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify_24px.png
index 4bb97f992..4bb97f992 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_certify_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt_24px.png
index fe0c8e41b..fe0c8e41b 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_encrypt_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign_24px.png
index 51ab367a9..51ab367a9 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/key_flag_sign_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
deleted file mode 100644
index c0fdc45b0..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_holo_light.png
deleted file mode 100644
index 47a63730b..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_focused_holo_light.png
deleted file mode 100644
index 911bad8a3..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_holo_light.png
deleted file mode 100644
index 310ab257c..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_pressed_holo_light.png
deleted file mode 100644
index 773206f63..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
deleted file mode 100644
index 456471129..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_holo_light.png
deleted file mode 100644
index 013c1f6ee..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_focused_holo_light.png
deleted file mode 100644
index e67994690..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_holo_light.png
deleted file mode 100644
index 0c5038fc0..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_pressed_holo_light.png
deleted file mode 100644
index 4b0e39517..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
deleted file mode 100644
index e90491aee..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_holo_light.9.png
deleted file mode 100644
index b4c90d408..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_focused_holo_light.9.png
deleted file mode 100644
index a0ba2a3a2..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_normal_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_normal_holo_light.9.png
deleted file mode 100644
index 24daa6b8a..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_normal_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_pressed_holo_light.9.png
deleted file mode 100644
index 9c808dd2c..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
deleted file mode 100644
index 78ab31858..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
deleted file mode 100644
index 06f0cc78c..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_focused_holo_light.png
deleted file mode 100644
index 2af5bf37b..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_holo_light.png
deleted file mode 100644
index 7d6fa76cd..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
deleted file mode 100644
index 9fe2ebfce..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
deleted file mode 100644
index 01e04d15e..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
deleted file mode 100644
index adb730439..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_focused_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_focused_holo_light.png
deleted file mode 100644
index 90c4cac28..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_focused_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_holo_light.png
deleted file mode 100644
index 7860fc848..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
deleted file mode 100644
index 58108fc4e..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_activated_holo.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_activated_holo.9.png
deleted file mode 100644
index b3b0da723..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_activated_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_focused_holo.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_focused_holo.9.png
deleted file mode 100644
index 0458c7f37..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_focused_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_longpressed_holo.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_longpressed_holo.9.png
deleted file mode 100644
index 82036b6b7..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_longpressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_pressed_holo_light.9.png
deleted file mode 100644
index c7b06aa6a..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_selector_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_selector_disabled_holo_light.9.png
deleted file mode 100644
index 70bc9f282..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_selector_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_bg_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_bg_holo_light.9.png
deleted file mode 100644
index fb146c339..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_primary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_primary_holo_light.9.png
deleted file mode 100644
index f89b6477b..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_secondary_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_secondary_holo_light.9.png
deleted file mode 100644
index 30a079d6e..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo1.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo1.png
deleted file mode 100644
index ca952535f..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo1.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo2.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo2.png
deleted file mode 100644
index 88804968f..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo2.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo3.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo3.png
deleted file mode 100644
index 580a9cf9c..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo3.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo4.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo4.png
deleted file mode 100644
index 8ce77b135..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo4.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo5.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo5.png
deleted file mode 100644
index 9c17f17a2..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo5.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo6.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo6.png
deleted file mode 100644
index 2cab8426e..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo6.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo7.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo7.png
deleted file mode 100644
index 18d252948..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo7.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo8.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo8.png
deleted file mode 100644
index d0632ca2d..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo8.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_default_holo_light.9.png
deleted file mode 100644
index f9facd05d..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_disabled_holo_light.9.png
deleted file mode 100644
index 4cef09547..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_focused_holo_light.9.png
deleted file mode 100644
index f7a9f7c55..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_pressed_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_pressed_holo_light.9.png
deleted file mode 100644
index 62ac88d40..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_activated_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_activated_holo_light.9.png
deleted file mode 100644
index 733255647..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_activated_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_default_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_default_holo_light.9.png
deleted file mode 100644
index 6db1dd0aa..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
deleted file mode 100644
index d157d7d60..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_holo_light.9.png
deleted file mode 100644
index c91f7da91..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_focused_holo_light.9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_focused_holo_light.9.png
deleted file mode 100644
index 01af8180e..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_closed.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_closed_24px.png
index 5a9664d59..5a9664d59 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_closed.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_closed_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_error.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_error_24px.png
index 608f065af..608f065af 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_error.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_error_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_open.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_open_24px.png
index ee34dd396..ee34dd396 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_open.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_lock_open_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired.png
deleted file mode 100644
index f475c9d84..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_24px.png
index 33a3efed1..33a3efed1 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_96px.png
new file mode 100644
index 000000000..ba7e8c2f4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_expired_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid.png
deleted file mode 100644
index f21c2cf52..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_24px.png
index bc39d3496..bc39d3496 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_96px.png
new file mode 100644
index 000000000..1fbf5ceb2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_invalid_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked.png
deleted file mode 100644
index be1a1d9dc..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_24px.png
index 58929661f..58929661f 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_96px.png
new file mode 100644
index 000000000..338c696ac
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_revoked_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown.png
deleted file mode 100644
index 841cfa958..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_24px.png
index 3020357a4..3020357a4 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_96px.png
new file mode 100644
index 000000000..2690310a6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unknown_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified.png
deleted file mode 100644
index 525d1cf6b..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_24px.png
index 3829bb3a0..3829bb3a0 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_96px.png
new file mode 100644
index 000000000..e559faf9d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_unverified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified.png
deleted file mode 100644
index 54eee5ba0..000000000
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified.png
+++ /dev/null
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_24px.png
index 3548ee2b6..3548ee2b6 100644
--- a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout.png
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_24px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_96px.png b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_96px.png
new file mode 100644
index 000000000..79e4ec4a9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/status_signature_verified_cutout_96px.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_apps_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_apps_black_24dp.png
new file mode 100644
index 000000000..d12d2e796
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_apps_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png
new file mode 100644
index 000000000..02f2f6fe8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png
new file mode 100644
index 000000000..87892840e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png
new file mode 100644
index 000000000..7b2a480a0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 000000000..08ae54533
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 000000000..228b2a982
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png
new file mode 100644
index 000000000..7a3c198ee
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png
new file mode 100644
index 000000000..a4286b54c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_launcher.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_launcher.png
index d85507fef..fab324e93 100644
--- a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_launcher.png
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_black_24dp.png
new file mode 100644
index 000000000..db080df4e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png
new file mode 100644
index 000000000..a70c55b7e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 000000000..9380370f4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_nfc_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_nfc_white_24dp.png
new file mode 100644
index 000000000..c8f25bbf7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_nfc_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 000000000..7cc008475
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_qrcode_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_qrcode_white_24dp.png
new file mode 100644
index 000000000..e795f80a5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_qrcode_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png
new file mode 100644
index 000000000..d271d8e03
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_grey_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_grey_24dp.png
new file mode 100644
index 000000000..bf33f287b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_grey_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_white_24dp.png
new file mode 100644
index 000000000..f3c284330
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_repeat_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png
new file mode 100644
index 000000000..70c21baf7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png
new file mode 100644
index 000000000..bce161d00
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_vpn_key_black_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_vpn_key_black_24dp.png
new file mode 100644
index 000000000..3451d9855
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/ic_vpn_key_black_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml b/OpenKeychain/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml
deleted file mode 100644
index e7121f083..000000000
--- a/OpenKeychain/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true" android:drawable="@drawable/apptheme_fastscroll_thumb_pressed_holo" />
- <item android:drawable="@drawable/apptheme_fastscroll_thumb_default_holo" />
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/cardview_header.xml b/OpenKeychain/src/main/res/drawable/cardview_header.xml
new file mode 100644
index 000000000..9bab96ea9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/cardview_header.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+
+ <size
+ android:height="1dp"
+ android:width="1000dp" />
+
+ <solid android:color="@color/bg_gray" />
+
+</shape> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/drawable/drawer_header.png b/OpenKeychain/src/main/res/drawable/drawer_header.png
new file mode 100644
index 000000000..c8fdccf8d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/drawer_header.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable/fab_label_background.xml b/OpenKeychain/src/main/res/drawable/fab_label_background.xml
new file mode 100644
index 000000000..0d8c05b11
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/fab_label_background.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/black_semi_transparent"/>
+ <padding
+ android:left="16dp"
+ android:top="4dp"
+ android:right="16dp"
+ android:bottom="4dp"/>
+ <corners
+ android:radius="2dp"/>
+</shape> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/drawable/first_time_1.png b/OpenKeychain/src/main/res/drawable/first_time_1.png
index 1f340df5c..1f93f2deb 100644
--- a/OpenKeychain/src/main/res/drawable/first_time_1.png
+++ b/OpenKeychain/src/main/res/drawable/first_time_1.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_activated_background_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_activated_background_holo_light.xml
deleted file mode 100644
index 60415e926..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_activated_background_holo_light.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_activated="true" android:drawable="@drawable/keychaintheme_list_activated_holo" />
- <item android:drawable="@android:color/transparent" />
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_btn_check_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_btn_check_holo_light.xml
deleted file mode 100644
index 62567cb98..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_btn_check_holo_light.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- Enabled states -->
-
- <item android:state_checked="true" android:state_window_focused="false"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_on_holo_light" />
- <item android:state_checked="false" android:state_window_focused="false"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_off_holo_light" />
-
- <item android:state_checked="true" android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_on_pressed_holo_light" />
- <item android:state_checked="false" android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_off_pressed_holo_light" />
-
- <item android:state_checked="true" android:state_focused="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_on_focused_holo_light" />
- <item android:state_checked="false" android:state_focused="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_off_focused_holo_light" />
-
- <item android:state_checked="false"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_off_holo_light" />
- <item android:state_checked="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_check_on_holo_light" />
-
-
- <!-- Disabled states -->
-
- <item android:state_checked="true" android:state_window_focused="false"
- android:drawable="@drawable/keychaintheme_btn_check_on_disabled_holo_light" />
- <item android:state_checked="false" android:state_window_focused="false"
- android:drawable="@drawable/keychaintheme_btn_check_off_disabled_holo_light" />
-
- <item android:state_checked="true" android:state_focused="true"
- android:drawable="@drawable/keychaintheme_btn_check_on_disabled_focused_holo_light" />
- <item android:state_checked="false" android:state_focused="true"
- android:drawable="@drawable/keychaintheme_btn_check_off_disabled_focused_holo_light" />
-
- <item android:state_checked="false" android:drawable="@drawable/keychaintheme_btn_check_off_disabled_holo_light" />
- <item android:state_checked="true" android:drawable="@drawable/keychaintheme_btn_check_on_disabled_holo_light" />
-
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_btn_default_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_btn_default_holo_light.xml
deleted file mode 100644
index c9261f53b..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_btn_default_holo_light.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_default_normal_holo_light" />
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/keychaintheme_btn_default_disabled_holo_light" />
- <item android:state_pressed="true"
- android:drawable="@drawable/keychaintheme_btn_default_pressed_holo_light" />
- <item android:state_focused="true" android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_default_focused_holo_light" />
- <item android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_default_normal_holo_light" />
- <item android:state_focused="true"
- android:drawable="@drawable/keychaintheme_btn_default_disabled_focused_holo_light" />
- <item
- android:drawable="@drawable/keychaintheme_btn_default_disabled_holo_light" />
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_btn_radio_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_btn_radio_holo_light.xml
deleted file mode 100644
index eeba95d4f..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_btn_radio_holo_light.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_window_focused="false"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_on_holo_light" />
- <item android:state_checked="false" android:state_window_focused="false"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_off_holo_light" />
-
- <item android:state_checked="true" android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_on_pressed_holo_light" />
- <item android:state_checked="false" android:state_pressed="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_off_pressed_holo_light" />
-
- <item android:state_checked="true" android:state_focused="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_on_focused_holo_light" />
- <item android:state_checked="false" android:state_focused="true"
- android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_off_focused_holo_light" />
-
- <item android:state_checked="false" android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_off_holo_light" />
- <item android:state_checked="true" android:state_enabled="true"
- android:drawable="@drawable/keychaintheme_btn_radio_on_holo_light" />
-
- <!-- Disabled states -->
-
- <item android:state_checked="true" android:state_window_focused="false"
- android:drawable="@drawable/keychaintheme_btn_radio_on_disabled_holo_light" />
- <item android:state_checked="false" android:state_window_focused="false"
- android:drawable="@drawable/keychaintheme_btn_radio_off_disabled_holo_light" />
-
- <item android:state_checked="true" android:state_focused="true"
- android:drawable="@drawable/keychaintheme_btn_radio_on_disabled_focused_holo_light" />
- <item android:state_checked="false" android:state_focused="true"
- android:drawable="@drawable/keychaintheme_btn_radio_off_disabled_focused_holo_light" />
-
- <item android:state_checked="false" android:drawable="@drawable/keychaintheme_btn_radio_off_disabled_holo_light" />
- <item android:state_checked="true" android:drawable="@drawable/keychaintheme_btn_radio_on_disabled_holo_light" />
-
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_edit_text_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_edit_text_holo_light.xml
deleted file mode 100644
index 7acab984d..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_edit_text_holo_light.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/keychaintheme_textfield_default_holo_light" />
- <item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/keychaintheme_textfield_disabled_holo_light" />
- <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/keychaintheme_textfield_activated_holo_light" />
- <item android:state_enabled="true" android:state_activated="true" android:drawable="@drawable/keychaintheme_textfield_focused_holo_light" />
- <item android:state_enabled="true" android:drawable="@drawable/keychaintheme_textfield_default_holo_light" />
- <item android:state_focused="true" android:drawable="@drawable/keychaintheme_textfield_disabled_focused_holo_light" />
- <item android:drawable="@drawable/keychaintheme_textfield_disabled_holo_light" />
-</selector> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_item_background_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_item_background_holo_light.xml
deleted file mode 100644
index b385d2f92..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_item_background_holo_light.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
- <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/keychaintheme_list_selector_disabled_holo_light" />
- <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/keychaintheme_list_selector_disabled_holo_light" />
- <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/keychaintheme_list_selector_background_transition_holo_light" />
- <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/keychaintheme_list_selector_background_transition_holo_light" />
- <item android:state_focused="true" android:drawable="@drawable/keychaintheme_list_focused_holo" />
- <item android:drawable="@android:color/transparent" />
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_background_transition_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_background_transition_holo_light.xml
deleted file mode 100644
index 2a5561b22..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_background_transition_holo_light.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<transition xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/keychaintheme_list_pressed_holo_light" />
- <item android:drawable="@drawable/keychaintheme_list_longpressed_holo" />
-</transition>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_holo_light.xml
deleted file mode 100644
index 17164fd1d..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_holo_light.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:state_window_focused="false" android:drawable="@android:color/transparent" />
-
- <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
- <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/keychaintheme_list_selector_disabled_holo_light" />
- <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/keychaintheme_list_selector_disabled_holo_light" />
- <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/keychaintheme_list_selector_background_transition_holo_light" />
- <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/keychaintheme_list_selector_background_transition_holo_light" />
- <item android:state_focused="true" android:drawable="@drawable/keychaintheme_list_focused_holo" />
-
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_progress_horizontal_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_progress_horizontal_holo_light.xml
deleted file mode 100644
index a99f756f6..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_progress_horizontal_holo_light.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:id="@android:id/background"
- android:drawable="@drawable/keychaintheme_progress_bg_holo_light" />
-
- <item android:id="@android:id/secondaryProgress">
- <scale android:scaleWidth="100%"
- android:drawable="@drawable/keychaintheme_progress_secondary_holo_light" />
- </item>
-
- <item android:id="@android:id/progress">
- <scale android:scaleWidth="100%"
- android:drawable="@drawable/keychaintheme_progress_primary_holo_light" />
- </item>
-
-</layer-list>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_progress_indeterminate_horizontal_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_progress_indeterminate_horizontal_holo_light.xml
deleted file mode 100644
index 79c050e47..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_progress_indeterminate_horizontal_holo_light.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo1" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo2" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo3" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo4" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo5" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo6" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo7" android:duration="50" />
- <item android:drawable="@drawable/keychaintheme_progressbar_indeterminate_holo8" android:duration="50" />
-</animation-list>
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_searchview_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_searchview_holo_light.xml
deleted file mode 100644
index e82b1c2f3..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_searchview_holo_light.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true"
- android:drawable="@drawable/keychaintheme_textfield_activated_holo_light" />
- <item android:drawable="@drawable/keychaintheme_textfield_default_holo_light" />
-</selector> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/drawable/keychaintheme_spinner_background_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_spinner_background_holo_light.xml
deleted file mode 100644
index 9fbb83f95..000000000
--- a/OpenKeychain/src/main/res/drawable/keychaintheme_spinner_background_holo_light.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false"
- android:drawable="@drawable/keychaintheme_spinner_disabled_holo_light" />
- <item android:state_pressed="true"
- android:drawable="@drawable/keychaintheme_spinner_pressed_holo_light" />
- <item android:state_pressed="false" android:state_focused="true"
- android:drawable="@drawable/keychaintheme_spinner_focused_holo_light" />
- <item android:drawable="@drawable/keychaintheme_spinner_default_holo_light" />
-</selector>
diff --git a/OpenKeychain/src/main/res/drawable/section_header.xml b/OpenKeychain/src/main/res/drawable/section_header.xml
index a4468484e..04d3d4957 100644
--- a/OpenKeychain/src/main/res/drawable/section_header.xml
+++ b/OpenKeychain/src/main/res/drawable/section_header.xml
@@ -6,6 +6,6 @@
android:height="2dp"
android:width="1000dp" />
- <solid android:color="@color/emphasis" />
+ <solid android:color="@color/header_text" />
</shape> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-land/qr_code_activity.xml b/OpenKeychain/src/main/res/layout-land/qr_code_activity.xml
new file mode 100644
index 000000000..59a733e89
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout-land/qr_code_activity.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <android.support.v7.widget.CardView
+ android:id="@+id/qr_code_image_layout"
+ android:transitionName="qr_code"
+ android:layout_gravity="center_horizontal"
+ android:layout_margin="32dp"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:clickable="true"
+ android:foreground="?android:attr/selectableItemBackground"
+ app:cardBackgroundColor="@android:color/white"
+ app:cardUseCompatPadding="true"
+ app:cardCornerRadius="4dp">
+
+ <org.sufficientlysecure.keychain.ui.widget.AspectRatioImageView
+ android:id="@+id/qr_code_image"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ app:dominantMeasurement="height"
+ app:aspectRatioEnabled="true" />
+ </android.support.v7.widget.CardView>
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/api_apps_list_activity.xml b/OpenKeychain/src/main/res/layout-large/api_apps_list_activity.xml
deleted file mode 100644
index af06614b9..000000000
--- a/OpenKeychain/src/main/res/layout-large/api_apps_list_activity.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/api_apps_list_content" />
-
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/decrypt_activity.xml b/OpenKeychain/src/main/res/layout-large/decrypt_activity.xml
deleted file mode 100644
index 06487a982..000000000
--- a/OpenKeychain/src/main/res/layout-large/decrypt_activity.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/decrypt_content" />
-
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml b/OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml
deleted file mode 100644
index 4b277c331..000000000
--- a/OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/encrypt_files_content" />
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml b/OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml
deleted file mode 100644
index 5cf838c46..000000000
--- a/OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/encrypt_text_content" />
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/key_list_activity.xml b/OpenKeychain/src/main/res/layout-large/key_list_activity.xml
deleted file mode 100644
index 039081cd7..000000000
--- a/OpenKeychain/src/main/res/layout-large/key_list_activity.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/key_list_content" />
-
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml b/OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml
deleted file mode 100644
index 7e4410f85..000000000
--- a/OpenKeychain/src/main/res/layout-v11/safe_slinger_activity.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <TextView
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="14dp"
- android:text="@string/exchange_description"
- android:layout_weight="1"
- android:gravity="center_vertical"/>
-
- <NumberPicker
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/safe_slinger_picker"
- />
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <LinearLayout
- android:id="@+id/safe_slinger_button"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- android:paddingRight="4dp"
- style="@style/SelectableItem"
- android:orientation="horizontal">
-
- <TextView
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:text="Start exchange"
- android:layout_weight="1"
- android:gravity="center_vertical" />
-
- <!-- separate ImageView required for recoloring -->
- <ImageView
- android:id="@+id/safe_slinger_button_image"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/ic_action_safeslinger"
- android:layout_gravity="center_vertical" />
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:layout_marginBottom="4dp"
- android:background="?android:attr/listDivider" />
-
- </LinearLayout>
-</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/actionbar_custom_view_done.xml b/OpenKeychain/src/main/res/layout/actionbar_custom_view_done.xml
deleted file mode 100644
index b219038b2..000000000
--- a/OpenKeychain/src/main/res/layout/actionbar_custom_view_done.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- Copyright 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:dividerPadding="12dp"
- android:orientation="horizontal"
- android:showDividers="end" >
-
- <include layout="@layout/actionbar_include_done_button" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/actionbar_custom_view_done_cancel.xml b/OpenKeychain/src/main/res/layout/actionbar_custom_view_done_cancel.xml
deleted file mode 100644
index e9047e759..000000000
--- a/OpenKeychain/src/main/res/layout/actionbar_custom_view_done_cancel.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- Copyright 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:dividerPadding="12dp"
- android:orientation="horizontal"
- android:showDividers="middle">
-
- <include layout="@layout/actionbar_include_cancel_button" />
-
- <include layout="@layout/actionbar_include_done_button" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/add_subkey_dialog.xml b/OpenKeychain/src/main/res/layout/add_subkey_dialog.xml
index d52e72997..d32b1496f 100644
--- a/OpenKeychain/src/main/res/layout/add_subkey_dialog.xml
+++ b/OpenKeychain/src/main/res/layout/add_subkey_dialog.xml
@@ -6,10 +6,10 @@
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp"
android:stretchColumns="1">
<TextView
diff --git a/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml b/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml
index 4560e0b9e..79137bf51 100644
--- a/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml
+++ b/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml
@@ -3,10 +3,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:paddingTop="8dp"
- android:paddingBottom="8dp">
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp">
<org.sufficientlysecure.keychain.ui.widget.AutoCorrectAutoCompleteTextView
android:id="@+id/add_user_id_address"
diff --git a/OpenKeychain/src/main/res/layout/alp_42447968_lock_pattern_fragment.xml b/OpenKeychain/src/main/res/layout/alp_42447968_lock_pattern_fragment.xml
deleted file mode 100644
index 6a154fa55..000000000
--- a/OpenKeychain/src/main/res/layout/alp_42447968_lock_pattern_fragment.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/topLayout"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
-
- <com.haibison.android.lockpattern.widget.LockPatternView_v14
- android:id="@+id/lockPattern"
- android:layout_width="@dimen/alp_42447968_separator_size"
- android:layout_height="@dimen/alp_42447968_separator_size"
- android:layout_marginTop="@dimen/alp_42447968_separator_size"
- android:layout_marginBottom="@dimen/alp_42447968_separator_size"
- android:layout_gravity="center_horizontal" />
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_account_settings_activity.xml b/OpenKeychain/src/main/res/layout/api_account_settings_activity.xml
index b2a9c11f5..d2fb291ea 100644
--- a/OpenKeychain/src/main/res/layout/api_account_settings_activity.xml
+++ b/OpenKeychain/src/main/res/layout/api_account_settings_activity.xml
@@ -1,28 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:orientation="vertical"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <ScrollView
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <LinearLayout
+ <ScrollView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="16dp"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <fragment
- android:id="@+id/api_account_settings_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AccountSettingsFragment"
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:padding="16dp"
+ android:orientation="vertical">
- </LinearLayout>
- </ScrollView>
-</LinearLayout> \ No newline at end of file
+ <fragment
+ android:id="@+id/api_account_settings_fragment"
+ android:name="org.sufficientlysecure.keychain.remote.ui.AccountSettingsFragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ </LinearLayout>
+ </ScrollView>
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml b/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml
index dae9de1f2..6df5c84f5 100644
--- a/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml
+++ b/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml
@@ -1,41 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:custom="http://schemas.android.com/apk/res-auto"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
- android:orientation="vertical"
+ xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
-
- <ScrollView
+ <RelativeLayout
+ android:id="@+id/toolbar_big"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="@dimen/big_toolbar"
+ android:elevation="4dp"
+ android:background="?attr/colorPrimary"
+ android:orientation="horizontal">
- <LinearLayout
+ <ImageView
+ android:id="@+id/status_bar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/statusbar_height"
+ android:background="?attr/colorPrimary" />
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_below="@+id/status_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="16dp"
- android:orientation="vertical">
+ android:minHeight="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:overScrollMode="always"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
+ tools:ignore="UnusedAttribute"
+ android:transitionGroup="false"
+ android:touchscreenBlocksFocus="false" />
- <fragment
- android:id="@+id/api_app_settings_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsFragment"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- tools:layout="@layout/api_app_settings_fragment" />
+ <LinearLayout
+ android:layout_below="@+id/toolbar"
+ android:layout_marginLeft="48dp"
+ android:layout_marginRight="72dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:id="@+id/api_app_settings_app_icon"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:src="@drawable/ic_launcher" />
<TextView
- style="@style/SectionHeader"
- android:layout_width="match_parent"
+ android:id="@+id/api_app_settings_app_name"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/api_settings_accounts" />
+ android:text="Name (set in-code)longlong"
+ android:textColor="@color/icons"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingLeft="8dp"
+ android:layout_gravity="center_vertical" />
+ </LinearLayout>
+ </RelativeLayout>
- <FrameLayout
- android:id="@+id/api_accounts_list_fragment"
+ <LinearLayout
+ android:id="@+id/body"
+ android:layout_below="@id/toolbar_big"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" />
+ android:layout_height="wrap_content"
+ android:padding="16dp"
+ android:orientation="vertical">
- </LinearLayout>
- </ScrollView>
-</LinearLayout> \ No newline at end of file
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/api_settings_allowed_keys" />
+
+ <FrameLayout
+ android:id="@+id/api_allowed_keys_list_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+ <TextView
+ android:id="@+id/api_accounts_label"
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:text="@string/api_settings_accounts" />
+
+ <FrameLayout
+ android:id="@+id/api_accounts_list_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+ </LinearLayout>
+ </ScrollView>
+ </LinearLayout>
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab"
+ android:layout_alignBottom="@id/toolbar_big"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="20dp"
+ android:layout_marginBottom="-40dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:elevation="4dp"
+ fab:fab_icon="@drawable/ic_play_arrow_white_24dp"
+ fab:fab_colorNormal="@color/fab"
+ fab:fab_colorPressed="@color/fab_pressed" />
+
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_app_settings_fragment.xml b/OpenKeychain/src/main/res/layout/api_app_settings_fragment.xml
index c5477adba..ed3e33aab 100644
--- a/OpenKeychain/src/main/res/layout/api_app_settings_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/api_app_settings_fragment.xml
@@ -1,15 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
+ android:background="?attr/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="4dp"
+ android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
@@ -17,7 +16,6 @@
android:id="@+id/api_app_settings_app_icon"
android:layout_width="48dp"
android:layout_height="48dp"
- android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:layout_marginRight="6dp"
android:src="@drawable/ic_launcher" />
@@ -31,12 +29,14 @@
android:gravity="center_vertical"
android:orientation="vertical"
android:text="Name (set in-code)"
+ android:textColor="@color/icons"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
<org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:textColor="@color/icons"
custom:foldedLabel="@string/api_settings_show_info"
custom:unFoldedLabel="@string/api_settings_hide_info">
@@ -44,6 +44,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/api_settings_package_name"
+ android:textColor="@color/icons"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
@@ -51,12 +52,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="com.example"
+ android:textColor="@color/icons"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/api_settings_package_signature"
+ android:textColor="@color/icons"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
@@ -64,6 +67,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Base64 encoded hash of signature"
+ android:textColor="@color/icons"
android:textAppearance="?android:attr/textAppearanceSmall" />
</org.sufficientlysecure.keychain.ui.widget.FoldableLinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml b/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml
index b67da13a6..c4ea46d43 100644
--- a/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml
+++ b/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml
@@ -13,16 +13,6 @@
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
- <TextView
- android:id="@+id/api_apps_adapter_item_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:text="Application Name"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_centerVertical="true"
- android:layout_toRightOf="@+id/api_apps_adapter_item_icon" />
-
<ImageView
android:id="@+id/api_apps_adapter_install_icon"
android:layout_width="wrap_content"
@@ -33,5 +23,15 @@
android:layout_alignParentEnd="true"
android:padding="8dp" />
+ <TextView
+ android:id="@+id/api_apps_adapter_item_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:text="Application Name"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@+id/api_apps_adapter_install_icon"
+ android:layout_toRightOf="@+id/api_apps_adapter_item_icon" />
</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_apps_list_activity.xml b/OpenKeychain/src/main/res/layout/api_apps_list_activity.xml
deleted file mode 100644
index df187e0a5..000000000
--- a/OpenKeychain/src/main/res/layout/api_apps_list_activity.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <include layout="@layout/api_apps_list_content"/>
-
- <include layout="@layout/drawer_list" />
-
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_apps_list_content.xml b/OpenKeychain/src/main/res/layout/api_apps_list_content.xml
deleted file mode 100644
index 9f9b99045..000000000
--- a/OpenKeychain/src/main/res/layout/api_apps_list_content.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout
- 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">
-
- <fragment
- android:id="@+id/crypto_consumers_list_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AppsListFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_remote_create_account.xml b/OpenKeychain/src/main/res/layout/api_remote_create_account.xml
index a6a39b1ad..7863f3c7f 100644
--- a/OpenKeychain/src/main/res/layout/api_remote_create_account.xml
+++ b/OpenKeychain/src/main/res/layout/api_remote_create_account.xml
@@ -1,37 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <ScrollView
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="match_parent"
+ android:orientation="vertical">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="16dp"
- android:orientation="vertical">
+ <include layout="@layout/notify_area" />
- <TextView
- android:id="@+id/api_remote_create_account_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingBottom="3dip"
- android:text="@string/api_create_account_text"
- android:textAppearance="?android:attr/textAppearanceMedium" />
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
- <fragment
- android:id="@+id/api_account_settings_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AccountSettingsFragment"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- tools:layout="@layout/api_app_settings_fragment" />
+ android:padding="16dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/api_remote_create_account_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="3dip"
+ android:text="@string/api_create_account_text"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <fragment
+ android:id="@+id/api_account_settings_fragment"
+ android:name="org.sufficientlysecure.keychain.remote.ui.AccountSettingsFragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ tools:layout="@layout/api_app_settings_fragment" />
- </LinearLayout>
- </ScrollView>
-</LinearLayout> \ No newline at end of file
+ </LinearLayout>
+ </ScrollView>
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_remote_error_message.xml b/OpenKeychain/src/main/res/layout/api_remote_error_message.xml
index 3d69a25b3..0bcf40407 100644
--- a/OpenKeychain/src/main/res/layout/api_remote_error_message.xml
+++ b/OpenKeychain/src/main/res/layout/api_remote_error_message.xml
@@ -1,16 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <TextView
- android:id="@+id/api_app_error_message_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="8dp"
- android:paddingBottom="0dip"
- android:text="Set in-code!"
- android:textAppearance="?android:attr/textAppearanceLarge" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
-</LinearLayout> \ No newline at end of file
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/api_app_error_message_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="8dp"
+ android:paddingBottom="0dip"
+ android:text="Set in-code!"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_remote_register_app.xml b/OpenKeychain/src/main/res/layout/api_remote_register_app.xml
index f85f3b8f7..7cb3666bf 100644
--- a/OpenKeychain/src/main/res/layout/api_remote_register_app.xml
+++ b/OpenKeychain/src/main/res/layout/api_remote_register_app.xml
@@ -1,29 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="match_parent">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="16dp"
- android:orientation="vertical">
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <TextView
- android:id="@+id/api_register_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingBottom="3dip"
- android:text="@string/api_register_text"
- android:textAppearance="?android:attr/textAppearanceLarge" />
+ <ScrollView
+ android:layout_below="@id/toolbar_include"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
- <fragment
- android:id="@+id/api_app_settings_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsFragment"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- tools:layout="@layout/api_app_settings_fragment" />
+ android:padding="16dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/api_register_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="3dip"
+ android:text="@string/api_register_text"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <fragment
+ android:id="@+id/api_app_settings_fragment"
+ android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsHeaderFragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ tools:layout="@layout/api_app_settings_fragment" />
- </LinearLayout>
-</ScrollView>
+ </LinearLayout>
+ </ScrollView>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_remote_select_pub_keys.xml b/OpenKeychain/src/main/res/layout/api_remote_select_pub_keys.xml
index bf4d0a70d..3d3d55f3c 100644
--- a/OpenKeychain/src/main/res/layout/api_remote_select_pub_keys.xml
+++ b/OpenKeychain/src/main/res/layout/api_remote_select_pub_keys.xml
@@ -1,21 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <TextView
- android:id="@+id/api_select_pub_keys_text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="8dp"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceSmall" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <FrameLayout
- android:id="@+id/api_select_pub_keys_fragment_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
-</LinearLayout> \ No newline at end of file
+ <TextView
+ android:id="@+id/api_select_pub_keys_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <FrameLayout
+ android:id="@+id/api_select_pub_keys_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/certify_fingerprint_activity.xml b/OpenKeychain/src/main/res/layout/certify_fingerprint_activity.xml
new file mode 100644
index 000000000..ec91d1455
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/certify_fingerprint_activity.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <FrameLayout
+ android:id="@+id/certify_fingerprint_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+ </FrameLayout>
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml b/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml
new file mode 100644
index 000000000..9b6b35012
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/certify_fingerprint_buttons_divider">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/certify_fingerprint_text" />
+
+ <android.support.v7.widget.CardView
+ android:id="@+id/certify_fingerprint_card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:cardBackgroundColor="@android:color/white"
+ app:cardUseCompatPadding="true"
+ app:cardCornerRadius="4dp"
+ android:layout_gravity="top">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/CardViewHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/label_fingerprint" />
+
+ <TextView
+ android:id="@+id/certify_fingerprint_fingerprint"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:textSize="20sp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:typeface="monospace"
+ android:gravity="center_vertical" />
+ </LinearLayout>
+
+ </android.support.v7.widget.CardView>
+
+ </LinearLayout>
+
+ </ScrollView>
+
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:id="@+id/certify_fingerprint_buttons">
+
+ <TextView
+ android:id="@+id/certify_fingerprint_button_no"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_no"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_gravity="center_vertical" />
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp"
+ android:background="?android:attr/listDivider" />
+
+ <TextView
+ android:id="@+id/certify_fingerprint_button_yes"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_match"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_gravity="center_vertical" />
+ </LinearLayout>
+
+ <View
+ android:id="@+id/certify_fingerprint_buttons_divider2"
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_alignBottom="@+id/certify_fingerprint_buttons_text"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true" />
+
+ <TextView
+ android:id="@+id/certify_fingerprint_buttons_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="24dp"
+ android:layout_marginRight="24dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/certify_fingerprint_text2"
+ android:layout_above="@+id/certify_fingerprint_buttons"
+ android:layout_centerHorizontal="true" />
+
+ <View
+ android:id="@+id/certify_fingerprint_buttons_divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_alignTop="@+id/certify_fingerprint_buttons_text"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true" />
+
+
+
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/certify_key_activity.xml b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
index 2bf2c4197..fab8bc2d2 100644
--- a/OpenKeychain/src/main/res/layout/certify_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
@@ -1,21 +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="match_parent"
- android:layout_height="match_parent">
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <FrameLayout
- android:id="@+id/content_frame"
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <fragment
- android:id="@+id/multi_certify_key_fragment"
- android:name="org.sufficientlysecure.keychain.ui.CertifyKeyFragment"
+ <include layout="@layout/notify_area" />
+
+ <FrameLayout
+ android:id="@+id/content_frame"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </FrameLayout>
+ android:layout_height="match_parent">
+
+ <fragment
+ android:id="@+id/multi_certify_key_fragment"
+ android:name="org.sufficientlysecure.keychain.ui.CertifyKeyFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </FrameLayout>
-</LinearLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/certify_key_fragment.xml b/OpenKeychain/src/main/res/layout/certify_key_fragment.xml
index a55a8ea0c..2df3755a4 100644
--- a/OpenKeychain/src/main/res/layout/certify_key_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/certify_key_fragment.xml
@@ -95,7 +95,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="8dp"
- android:src="@drawable/status_signature_verified_cutout"
+ android:src="@drawable/status_signature_verified_cutout_24px"
android:layout_gravity="center_vertical" />
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/create_key_activity.xml b/OpenKeychain/src/main/res/layout/create_key_activity.xml
index 0bd053c49..b9d5206a1 100644
--- a/OpenKeychain/src/main/res/layout/create_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/create_key_activity.xml
@@ -1,15 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+ <!--
+ fitsSystemWindows and layout_marginTop from
+ https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
+ -->
<FrameLayout
- android:id="@+id/create_key_fragment_container"
+ android:layout_below="@id/toolbar_include"
+ android:fitsSystemWindows="true"
+ android:layout_marginTop="-25dp"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" />
+ android:layout_height="match_parent">
-</LinearLayout> \ No newline at end of file
+ <FrameLayout
+ android:id="@+id/create_key_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ </FrameLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml
index 7f7b2cdce..9b6a807cb 100644
--- a/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml
@@ -66,6 +66,7 @@
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:textAppearance="?android:attr/textAppearanceMedium"
+ android:checked="true"
android:text="@string/create_key_upload"
android:id="@+id/create_key_upload" />
@@ -86,7 +87,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/create_key_rsa"
- android:textColor="@color/android_green_dark"
+ android:textColor="@color/android_green_light"
android:textAppearance="?android:attr/textAppearanceMedium"
android:minHeight="?android:attr/listPreferredItemHeight"
android:clickable="true"
@@ -128,7 +129,7 @@
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:text="@string/create_key_final_robot_text"
- android:textColor="@color/android_green_dark"
+ android:textColor="@color/android_green_light"
android:textAppearance="?android:attr/textAppearanceMedium"
android:drawableLeft="@drawable/create_key_robot"
android:drawablePadding="8dp" />
@@ -159,7 +160,7 @@
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:clickable="true"
- style="@style/SelectableItem"
+ style="?android:attr/borderlessButtonStyle"
android:layout_gravity="center_vertical" />
<View
@@ -183,7 +184,7 @@
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:clickable="true"
- style="@style/SelectableItem"
+ style="?android:attr/borderlessButtonStyle"
android:layout_gravity="center_vertical" />
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/create_key_input_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_input_fragment.xml
index d92988111..f678825aa 100644
--- a/OpenKeychain/src/main/res/layout/create_key_input_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_key_input_fragment.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:fillViewport="false"
+ android:fillViewport="true"
android:layout_above="@+id/create_key_button_divider">
<LinearLayout
@@ -139,7 +139,7 @@
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:clickable="true"
- style="@style/SelectableItem"
+ style="?android:attr/borderlessButtonStyle"
android:layout_gravity="center_vertical" />
</LinearLayout>
</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_activity.xml b/OpenKeychain/src/main/res/layout/decrypt_activity.xml
deleted file mode 100644
index bb0e463b3..000000000
--- a/OpenKeychain/src/main/res/layout/decrypt_activity.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/decrypt_content"/>
-
- <include layout="@layout/drawer_list" />
-
-</android.support.v4.widget.FixedDrawerLayout>
diff --git a/OpenKeychain/src/main/res/layout/decrypt_content.xml b/OpenKeychain/src/main/res/layout/decrypt_content.xml
deleted file mode 100644
index 5e7cda4f9..000000000
--- a/OpenKeychain/src/main/res/layout/decrypt_content.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?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">
-
- <include layout="@layout/notify_area" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="4dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:orientation="vertical">
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dp"
- android:text="@string/section_decrypt_files" />
-
-
- <TextView
- android:id="@+id/decrypt_files"
- 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:clickable="true"
- style="@style/SelectableItem"
- android:text="@string/btn_decrypt_files"
- android:drawableRight="@drawable/ic_action_collection"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_marginBottom="8dp" />
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="32dp"
- android:text="@string/section_decrypt_text" />
-
- <LinearLayout
- android:id="@+id/decrypt_from_clipboard"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- android:paddingRight="4dp"
- style="@style/SelectableItem"
- android:orientation="horizontal">
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:paddingRight="4dp"
- android:gravity="center_vertical"
- android:orientation="vertical">
-
- <TextView
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/btn_decrypt_clipboard" />
-
- <TextView
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="@color/tertiary_text_light"
- android:text="@string/btn_decrypt_and_verify"
- android:gravity="center_vertical" />
-
- </LinearLayout>
-
- <ImageView
- android:id="@+id/clipboard_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/ic_action_paste"
- android:layout_gravity="center_vertical" />
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_marginBottom="8dp" />
-
- </LinearLayout>
-
-
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml b/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml
index 0380787db..06c1dda7b 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_files_activity.xml
@@ -1,14 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <FrameLayout
- android:id="@+id/decrypt_files_fragment_container"
+ <!--
+ fitsSystemWindows and layout_marginTop from
+ https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
+ -->
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:fitsSystemWindows="true"
+ android:layout_marginTop="-25dp"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:orientation="vertical">
-</LinearLayout> \ No newline at end of file
+ <include layout="@layout/notify_area" />
+
+ <FrameLayout
+ android:id="@+id/decrypt_files_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_result_include.xml b/OpenKeychain/src/main/res/layout/decrypt_result_include.xml
index 9140ad07b..659d1c207 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_result_include.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_result_include.xml
@@ -24,7 +24,7 @@
android:id="@+id/result_encryption_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/status_lock_open"
+ android:src="@drawable/status_lock_open_24px"
android:layout_gravity="center_vertical" />
<TextView
@@ -47,7 +47,7 @@
android:id="@+id/result_signature_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/status_signature_unverified_cutout"
+ android:src="@drawable/status_signature_unverified_cutout_24px"
android:layout_gravity="center_vertical" />
<TextView
diff --git a/OpenKeychain/src/main/res/layout/decrypt_text_activity.xml b/OpenKeychain/src/main/res/layout/decrypt_text_activity.xml
index e08ecb39e..a692b3681 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_text_activity.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_text_activity.xml
@@ -1,14 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
-
- <FrameLayout
- android:id="@+id/decrypt_text_fragment_container"
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <!--
+ fitsSystemWindows and layout_marginTop from
+ https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
+ -->
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:fitsSystemWindows="true"
+ android:layout_marginTop="-25dp"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <include layout="@layout/notify_area" />
+
+ <FrameLayout
+ android:id="@+id/decrypt_text_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
-</LinearLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/drawer_custom_header.xml b/OpenKeychain/src/main/res/layout/drawer_custom_header.xml
new file mode 100644
index 000000000..86465db98
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/drawer_custom_header.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"
+ android:gravity="center"
+ android:background="@color/primary">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/app_name"
+ android:textColor="@color/white"
+ android:layout_gravity="center_horizontal" />
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/drawer_list.xml b/OpenKeychain/src/main/res/layout/drawer_list.xml
deleted file mode 100644
index ab00c0073..000000000
--- a/OpenKeychain/src/main/res/layout/drawer_list.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- android:layout_gravity="start" tells DrawerLayout to treat
- this as a sliding drawer on the left side for left-to-right
- languages and on the right side for right-to-left languages.
- The drawer is given a fixed width in dp and extends the full height of
- the container. A solid background is used for contrast
- with the content view.
--->
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/left_drawer"
- android:layout_width="@dimen/drawer_size"
- android:layout_height="match_parent"
- android:layout_gravity="start"
- android:background="@color/white"
- android:choiceMode="singleChoice"
- android:divider="@color/bg_gray"
- android:dividerHeight="1dp" />
diff --git a/OpenKeychain/src/main/res/layout/drawer_list_item.xml b/OpenKeychain/src/main/res/layout/drawer_list_item.xml
deleted file mode 100644
index 4719483da..000000000
--- a/OpenKeychain/src/main/res/layout/drawer_list_item.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:fontawesometext="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <ImageView
- android:id="@+id/drawer_item_icon"
- android:gravity="center_vertical"
- android:layout_width="30dp"
- android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:layout_alignParentStart="true"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true" />
-
- <TextView
- android:id="@+id/drawer_item_text"
- android:text="Test"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_marginLeft="8dp"
- android:paddingBottom="16dp"
- android:paddingRight="16dp"
- android:paddingTop="16dp"
- android:textAppearance="@android:style/TextAppearance.Medium"
- android:textColor="#111"
- android:layout_alignParentTop="true"
- android:layout_toRightOf="@id/drawer_item_icon"/>
-
-</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/layout/edit_key_activity.xml b/OpenKeychain/src/main/res/layout/edit_key_activity.xml
index 7e71ccf53..c8b0e3afc 100644
--- a/OpenKeychain/src/main/res/layout/edit_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/edit_key_activity.xml
@@ -1,15 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/notify_area"/>
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <FrameLayout
- android:id="@+id/edit_key_fragment_container"
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" />
+ android:layout_height="match_parent">
-</LinearLayout> \ No newline at end of file
+ <include layout="@layout/notify_area" />
+
+ <FrameLayout
+ android:id="@+id/edit_key_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+ </LinearLayout>
+</RelativeLayout> \ 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
index 8a713115e..a692db574 100644
--- a/OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml
+++ b/OpenKeychain/src/main/res/layout/edit_subkey_expiry_dialog.xml
@@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:id="@+id/edit_subkey_expiry_no_expiry"
- android:layout_marginTop="8dp"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
android:checked="true"
android:layout_width="match_parent"
android:layout_height="wrap_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 67f7032c1..d14828ef7 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_content_adv_settings.xml
@@ -1,24 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
<TextView
- android:id="@+id/label_fileCompression"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_weight="1"
- android:paddingRight="10dip"
- android:text="@string/label_file_compression"
- android:textAppearance="?android:attr/textAppearanceSmall"/>
+ android:id="@+id/label_fileCompression"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:paddingRight="10dip"
+ android:text="@string/label_file_compression"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
<Spinner
- android:id="@+id/fileCompression"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"/>
+ android:id="@+id/fileCompression"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical" />
</LinearLayout>
</merge>
diff --git a/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml
new file mode 100644
index 000000000..d62c9f32b
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingTop="4dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="@string/section_encrypt" />
+
+ <TextView
+ android:id="@+id/encrypt_files"
+ 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:clickable="true"
+ style="@style/SelectableItem"
+ android:text="@string/btn_encrypt_files"
+ android:drawableRight="@drawable/ic_action_collection"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <TextView
+ android:id="@+id/encrypt_text"
+ 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:clickable="true"
+ style="@style/SelectableItem"
+ android:text="@string/btn_encrypt_text"
+ android:drawableRight="@drawable/ic_action_copy"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="@string/section_decrypt" />
+
+ <TextView
+ android:id="@+id/decrypt_files"
+ 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:clickable="true"
+ style="@style/SelectableItem"
+ android:text="@string/btn_decrypt_files"
+ android:drawableRight="@drawable/ic_action_collection"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <LinearLayout
+ android:id="@+id/decrypt_from_clipboard"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ android:paddingRight="4dp"
+ style="@style/SelectableItem"
+ android:orientation="horizontal">
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingRight="4dp"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/btn_decrypt_clipboard" />
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/tertiary_text_light"
+ android:text="@string/btn_decrypt_and_verify"
+ android:gravity="center_vertical" />
+
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/clipboard_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_paste"
+ android:layout_gravity="center_vertical" />
+
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginBottom="8dp" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml b/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml
index cdcf4fa43..168e6d0be 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml
@@ -1,14 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
-<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"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <!--
+ fitsSystemWindows and layout_marginTop from
+ https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
+ -->
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:id="@+id/content_frame"
+ android:fitsSystemWindows="true"
+ android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".ui.EncryptFileActivity">
+ android:orientation="vertical">
+
+ <include layout="@layout/notify_area" />
- <include layout="@layout/encrypt_files_content"/>
+ <FrameLayout
+ android:id="@+id/encrypt_pager_mode"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
- <include layout="@layout/drawer_list" />
+ <fragment
+ android:id="@+id/encrypt_file_fragment"
+ android:name="org.sufficientlysecure.keychain.ui.EncryptFilesFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_files_content.xml b/OpenKeychain/src/main/res/layout/encrypt_files_content.xml
deleted file mode 100644
index b44a2bc4d..000000000
--- a/OpenKeychain/src/main/res/layout/encrypt_files_content.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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">
-
- <include layout="@layout/notify_area" />
-
- <FrameLayout
- android:id="@+id/encrypt_pager_mode"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
-
- <fragment
- android:id="@+id/encrypt_file_fragment"
- android:name="org.sufficientlysecure.keychain.ui.EncryptFilesFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml b/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml
index 5d5e16131..fd7fd6672 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml
@@ -1,14 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
-<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"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <!--
+ fitsSystemWindows and layout_marginTop from
+ https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
+ -->
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:id="@+id/content_frame"
+ android:fitsSystemWindows="true"
+ android:layout_marginTop="-25dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".ui.EncryptTextActivity">
+ android:orientation="vertical">
+
+ <include layout="@layout/notify_area" />
- <include layout="@layout/encrypt_text_content"/>
+ <FrameLayout
+ android:id="@+id/encrypt_pager_mode"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
- <include layout="@layout/drawer_list" />
+ <fragment
+ android:id="@+id/encrypt_text_fragment"
+ android:name="org.sufficientlysecure.keychain.ui.EncryptTextFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_text_content.xml b/OpenKeychain/src/main/res/layout/encrypt_text_content.xml
deleted file mode 100644
index 809f00204..000000000
--- a/OpenKeychain/src/main/res/layout/encrypt_text_content.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?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">
-
- <include layout="@layout/notify_area"/>
-
- <FrameLayout
- android:id="@+id/encrypt_pager_mode"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
-
- <fragment
- android:id="@+id/encrypt_text_fragment"
- android:name="org.sufficientlysecure.keychain.ui.EncryptTextFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/file_dialog.xml b/OpenKeychain/src/main/res/layout/file_dialog.xml
index dcf711679..deefd0428 100644
--- a/OpenKeychain/src/main/res/layout/file_dialog.xml
+++ b/OpenKeychain/src/main/res/layout/file_dialog.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingLeft="5dip"
- android:paddingRight="5dip">
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp">
<TextView
android:id="@+id/message"
@@ -25,10 +27,11 @@
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:lines="1"
+ android:maxLines="1"
+ android:minLines="1"
+ android:scrollbars="vertical"
+ android:layout_gravity="center_vertical" />
<ImageButton
android:id="@+id/btn_browse"
diff --git a/OpenKeychain/src/main/res/layout/first_time_activity.xml b/OpenKeychain/src/main/res/layout/first_time_activity.xml
index 2d750c1a7..ba80214a6 100644
--- a/OpenKeychain/src/main/res/layout/first_time_activity.xml
+++ b/OpenKeychain/src/main/res/layout/first_time_activity.xml
@@ -4,6 +4,11 @@
android:layout_height="wrap_content"
android:paddingTop="16dp">
+ <ImageView
+ android:id="@+id/status_bar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/statusbar_height" />
+
<LinearLayout
android:id="@+id/first_time_buttons"
android:layout_width="match_parent"
@@ -91,6 +96,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
+ android:layout_below="@+id/status_bar"
android:layout_above="@+id/first_time_buttons">
<TextView
@@ -99,7 +105,7 @@
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/app_name"
android:drawableLeft="@drawable/ic_launcher"
- android:drawablePadding="16dp"
+ android:drawablePadding="8dp"
android:gravity="center"
android:layout_gravity="center_horizontal" />
@@ -128,5 +134,4 @@
</LinearLayout>
-
</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml b/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml
index 13cf7c225..773a9d416 100644
--- a/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml
+++ b/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml
@@ -1,37 +1,37 @@
<?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">
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
<LinearLayout
- android:id="@+id/foldableControl"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:clickable="true">
+ android:id="@+id/foldableControl"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clickable="true">
<ImageView
- android:id="@+id/foldableIcon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="10dp"
- android:src="@drawable/ic_action_expand"/>
+ android:id="@+id/foldableIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="10dp"
+ android:src="@drawable/ic_expand_more_black_24dp" />
<TextView
- android:id="@+id/foldableText"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/none"
- android:layout_gravity="center_vertical"
- android:textColor="@color/emphasis"/>
+ android:id="@+id/foldableText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/none"
+ android:layout_gravity="center_vertical"
+ android:textColor="@color/header_text" />
</LinearLayout>
<LinearLayout
- android:id="@+id/foldableContainer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:visibility="gone"/>
+ android:id="@+id/foldableContainer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="gone" />
</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/full_screen_dialog.xml b/OpenKeychain/src/main/res/layout/full_screen_dialog.xml
new file mode 100644
index 000000000..5eb50da07
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/full_screen_dialog.xml
@@ -0,0 +1,10 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:dividerPadding="12dp"
+ android:orientation="horizontal"
+ android:showDividers="middle">
+
+ <include layout="@layout/full_screen_dialog_done_button" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/full_screen_dialog_2.xml b/OpenKeychain/src/main/res/layout/full_screen_dialog_2.xml
new file mode 100644
index 000000000..b1d5efe76
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/full_screen_dialog_2.xml
@@ -0,0 +1,12 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:dividerPadding="12dp"
+ android:orientation="horizontal"
+ android:showDividers="middle">
+
+ <include layout="@layout/full_screen_dialog_2_cancel_button" />
+
+ <include layout="@layout/full_screen_dialog_2_done_button" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/actionbar_include_cancel_button.xml b/OpenKeychain/src/main/res/layout/full_screen_dialog_2_cancel_button.xml
index ec27e394a..7c2c2a62d 100644
--- a/OpenKeychain/src/main/res/layout/actionbar_include_cancel_button.xml
+++ b/OpenKeychain/src/main/res/layout/full_screen_dialog_2_cancel_button.xml
@@ -1,19 +1,3 @@
-<!--
- Copyright 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actionbar_cancel"
style="@style/Widget.AppCompat.ActionButton"
@@ -30,12 +14,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:drawableLeft="@drawable/ic_action_cancel"
+ android:drawableLeft="@drawable/ic_close_white_24dp"
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:paddingRight="20dp"
android:filterTouchesWhenObscured="true"
style="@style/Widget.AppCompat.Light.ActionBar.TabText"
+ android:textAllCaps="true"
+ android:textSize="14sp"
android:text="Cancel (set in-code!)" />
</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/actionbar_include_done_button.xml b/OpenKeychain/src/main/res/layout/full_screen_dialog_2_done_button.xml
index 2590f272c..cd24a1e6d 100644
--- a/OpenKeychain/src/main/res/layout/actionbar_include_done_button.xml
+++ b/OpenKeychain/src/main/res/layout/full_screen_dialog_2_done_button.xml
@@ -1,19 +1,3 @@
-<!--
- Copyright 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actionbar_done"
style="@style/Widget.AppCompat.ActionButton"
@@ -30,12 +14,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:drawableLeft="@drawable/ic_action_done"
+ android:drawableLeft="@drawable/ic_check_white_24dp"
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:paddingRight="20dp"
android:filterTouchesWhenObscured="true"
style="@style/Widget.AppCompat.Light.ActionBar.TabText"
+ android:textAllCaps="true"
+ android:textSize="14sp"
android:text="Done (set in-code!)" />
</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/full_screen_dialog_done_button.xml b/OpenKeychain/src/main/res/layout/full_screen_dialog_done_button.xml
new file mode 100644
index 000000000..49018fee1
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/full_screen_dialog_done_button.xml
@@ -0,0 +1,25 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/full_screen_dialog_done"
+ style="@style/Widget.AppCompat.ActionButton"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent">
+
+ <!--
+ android:filterTouchesWhenObscured="true" to prevent Touch-Event Hijacking
+ https://blog.lookout.com/blog/2010/12/09/android-touch-event-hijacking/
+ -->
+ <TextView
+ android:id="@+id/full_screen_dialog_done_text"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:gravity="center_vertical"
+ android:paddingRight="16dp"
+ android:paddingEnd="16dp"
+ style="@style/Widget.AppCompat.Light.ActionBar.TabText"
+ android:textAllCaps="true"
+ android:textSize="14sp"
+ android:filterTouchesWhenObscured="true"
+ android:text="Done (set in-code!)" />
+
+</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/full_screen_dialog_old.xml b/OpenKeychain/src/main/res/layout/full_screen_dialog_old.xml
new file mode 100644
index 000000000..ed375094f
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/full_screen_dialog_old.xml
@@ -0,0 +1,10 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:dividerPadding="12dp"
+ android:orientation="horizontal"
+ android:showDividers="end" >
+
+ <include layout="@layout/full_screen_dialog_2_done_button" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/help_activity.xml b/OpenKeychain/src/main/res/layout/help_activity.xml
index 3ad087da3..1722f03ea 100644
--- a/OpenKeychain/src/main/res/layout/help_activity.xml
+++ b/OpenKeychain/src/main/res/layout/help_activity.xml
@@ -1,17 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
+ android:layout_height="match_parent">
- <org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout
- android:id="@+id/sliding_tab_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <android.support.v4.view.ViewPager
- android:id="@+id/pager"
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:elevation="4dp">
+
+ <com.astuetz.PagerSlidingTabStrip
+ android:id="@+id/sliding_tab_layout"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:textColor="@color/tab_text"
+ app:pstsTextColorSelected="@color/tab_text_selected"
+ app:pstsIndicatorColor="@color/tab_indicator" />
+
+ <android.support.v4.view.ViewPager
+ android:id="@+id/pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
-</LinearLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_activity.xml b/OpenKeychain/src/main/res/layout/import_keys_activity.xml
index 35818e4ea..dcdd9a31a 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_activity.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_activity.xml
@@ -1,68 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <FrameLayout
- android:id="@+id/import_keys_top_container"
+ <!--
+ fitsSystemWindows and layout_marginTop from
+ https://medium.com/@ngdelamo/using-drawerlayout-the-material-way-i-716bba2b5705
+ -->
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:fitsSystemWindows="true"
+ android:layout_marginTop="-25dp"
android:layout_width="match_parent"
- android:layout_height="64dp"
- android:orientation="vertical"
- android:background="@android:color/white" />
+ android:layout_height="match_parent"
+ android:orientation="vertical">
- <View
- android:layout_width="match_parent"
- android:layout_height="2dip"
- android:background="?android:attr/listDivider" />
+ <include layout="@layout/notify_area" />
- <View
- android:layout_width="match_parent"
- android:layout_height="16dp" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="2dip"
- android:background="?android:attr/listDivider" />
+ <FrameLayout
+ android:id="@+id/import_keys_top_container"
+ android:layout_width="match_parent"
+ android:layout_height="64dp"
+ android:orientation="vertical"
+ android:background="@android:color/white" />
- <FrameLayout
- android:id="@+id/import_keys_list_container"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:orientation="vertical"
- android:layout_weight="1"
- android:background="@android:color/white" />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="2dip"
+ android:background="?android:attr/listDivider" />
- <LinearLayout
- android:id="@+id/import_footer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:background="@android:color/white">
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="16dp" />
<View
android:layout_width="match_parent"
- android:layout_height="1dip"
+ android:layout_height="2dip"
android:background="?android:attr/listDivider" />
- <TextView
- android:id="@+id/import_import"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ <FrameLayout
+ android:id="@+id/import_keys_list_container"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="@string/import_import"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:drawableRight="@drawable/ic_action_download"
- android:drawablePadding="8dp"
- android:gravity="center_vertical"
- android:clickable="true"
- style="@style/SelectableItem" />
+ android:layout_height="0dp"
+ android:orientation="vertical"
+ android:layout_weight="1"
+ android:background="@android:color/white" />
+
+ <LinearLayout
+ android:id="@+id/import_footer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:background="@android:color/white">
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <TextView
+ android:id="@+id/import_import"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/import_import"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_action_download"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="@style/SelectableItem" />
+ </LinearLayout>
</LinearLayout>
-</LinearLayout> \ No newline at end of file
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_cloud_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_cloud_fragment.xml
index 46ec736ca..6f52e1938 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_cloud_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_cloud_fragment.xml
@@ -1,5 +1,4 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
diff --git a/OpenKeychain/src/main/res/layout/import_keys_list_item.xml b/OpenKeychain/src/main/res/layout/import_keys_list_item.xml
index a97e81abe..bf9d33852 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_list_item.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_list_item.xml
@@ -73,7 +73,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:src="@drawable/status_signature_revoked_cutout"
+ android:src="@drawable/status_signature_revoked_cutout_24px"
android:padding="16dp" />
<TextView
diff --git a/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml
index 1cc414dab..9007d2149 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_qr_code_fragment.xml
@@ -21,7 +21,7 @@
android:layout_height="match_parent"
android:text="@string/import_qr_code_button"
android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_qr_code"
+ android:drawableRight="@drawable/ic_qrcode_white_24dp"
android:drawablePadding="8dp"
android:gravity="center_vertical" />
@@ -38,7 +38,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="8dp"
- android:src="@drawable/ic_action_nfc"
+ android:src="@drawable/ic_nfc_white_24dp"
android:layout_gravity="center_vertical"
style="@style/SelectableItem" />
diff --git a/OpenKeychain/src/main/res/layout/indeterminate_progress.xml b/OpenKeychain/src/main/res/layout/indeterminate_progress.xml
new file mode 100644
index 000000000..8515e83a4
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/indeterminate_progress.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:padding="0dp"
+ android:src="@drawable/ic_refresh_white_24dp"
+ style="@style/Widget.AppCompat.ActionButton" />
diff --git a/OpenKeychain/src/main/res/layout/key_list_activity.xml b/OpenKeychain/src/main/res/layout/key_list_activity.xml
deleted file mode 100644
index 03ef85381..000000000
--- a/OpenKeychain/src/main/res/layout/key_list_activity.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/key_list_content" />
-
- <include layout="@layout/drawer_list" />
-
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/key_list_content.xml b/OpenKeychain/src/main/res/layout/key_list_content.xml
index dd230806f..bd0239da7 100644
--- a/OpenKeychain/src/main/res/layout/key_list_content.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_content.xml
@@ -1,47 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
<LinearLayout
- android:id="@+id/content_frame"
- android:layout_marginLeft="@dimen/drawer_content_padding"
android:orientation="vertical"
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <!--<LinearLayout
+ <include layout="@layout/notify_area" />
+
+ <LinearLayout
+ android:id="@+id/content_frame"
android:orientation="vertical"
- android:background="@color/holo_gray_bright"
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="match_parent">
- <Spinner
- android:id="@+id/key_list_filter_spinner"
+ <!--<LinearLayout
+ android:orientation="vertical"
+ android:background="@color/holo_gray_bright"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="12dp"
- android:layout_marginRight="12dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp" />
-
- <View
+ android:layout_height="wrap_content">
+
+ <Spinner
+ android:id="@+id/key_list_filter_spinner"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="12dp"
+ android:layout_marginRight="12dp"
+ android:layout_marginTop="4dp"
+ android:layout_marginBottom="4dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ </LinearLayout>-->
+
+ <fragment
+ android:id="@+id/key_list_fragment"
+ android:name="org.sufficientlysecure.keychain.ui.KeyListFragment"
android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- </LinearLayout>-->
-
- <fragment
- android:id="@+id/key_list_fragment"
- android:name="org.sufficientlysecure.keychain.ui.KeyListFragment"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+ </LinearLayout>
</LinearLayout>
-
-</LinearLayout> \ No newline at end of file
+</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/layout/key_list_fragment.xml b/OpenKeychain/src/main/res/layout/key_list_fragment.xml
index 6529a88e0..65935f9c8 100644
--- a/OpenKeychain/src/main/res/layout/key_list_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_fragment.xml
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
-<org.sufficientlysecure.keychain.ui.widget.ListAwareSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/key_list_swipe_container"
- android:layout_width="match_parent"
+<RelativeLayout xmlns:fab="http://schemas.android.com/apk/res-auto"
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_width="match_parent"
+ >
+
<!--rebuild functionality of ListFragment -->
<FrameLayout
android:layout_width="match_parent"
@@ -13,10 +14,8 @@
android:id="@+id/key_list_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:clipToPadding="false"
android:drawSelectorOnTop="true"
android:fastScrollEnabled="true"
- android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="32dp"
android:scrollbarStyle="outsideOverlay" />
@@ -38,4 +37,54 @@
</LinearLayout>
</FrameLayout>
-</org.sufficientlysecure.keychain.ui.widget.ListAwareSwipeRefreshLayout> \ No newline at end of file
+
+ <com.getbase.floatingactionbutton.FloatingActionsMenu
+ android:id="@+id/fab_main"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentBottom="true"
+ fab:fab_addButtonColorNormal="@color/primary"
+ fab:fab_addButtonColorPressed="@color/primary_dark"
+ fab:fab_addButtonSize="normal"
+ fab:fab_addButtonPlusIconColor="@color/icons"
+ fab:fab_expandDirection="up"
+ fab:fab_labelStyle="@style/FabMenuStyle"
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ >
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_add_qr_code"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ fab:fab_icon="@drawable/ic_qrcode_white_24dp"
+ fab:fab_colorNormal="@color/primary"
+ fab:fab_colorPressed="@color/primary_dark"
+ fab:fab_title="Scan QR Code"
+ fab:fab_size="mini" />
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_add_cloud"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ fab:fab_icon="@drawable/ic_cloud_search_24px"
+ fab:fab_colorNormal="@color/primary"
+ fab:fab_colorPressed="@color/primary_dark"
+ fab:fab_title="Search Cloud"
+ fab:fab_size="mini" />
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab_add_file"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ fab:fab_icon="@drawable/ic_folder_white_24dp"
+ fab:fab_colorNormal="@color/primary"
+ fab:fab_colorPressed="@color/primary_dark"
+ fab:fab_title="Import from File"
+ fab:fab_size="mini" />
+
+ </com.getbase.floatingactionbutton.FloatingActionsMenu>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/key_list_item.xml b/OpenKeychain/src/main/res/layout/key_list_item.xml
index df69e4237..27444a260 100644
--- a/OpenKeychain/src/main/res/layout/key_list_item.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_item.xml
@@ -58,7 +58,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
- android:src="@drawable/ic_action_safeslinger"
+ android:src="@drawable/ic_repeat_grey_24dp"
android:padding="12dp"
style="@style/SelectableItem" />
@@ -69,7 +69,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:src="@drawable/status_signature_revoked_cutout"
+ android:src="@drawable/status_signature_revoked_cutout_24px"
android:padding="16dp" />
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/key_server_preference.xml b/OpenKeychain/src/main/res/layout/key_server_preference.xml
index 33866f746..5319a3ec0 100644
--- a/OpenKeychain/src/main/res/layout/key_server_preference.xml
+++ b/OpenKeychain/src/main/res/layout/key_server_preference.xml
@@ -1,82 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
<LinearLayout
- android:id="@+id/text_layout"
+ android:layout_below="@id/toolbar_include"
android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:orientation="horizontal" >
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
<LinearLayout
- android:layout_width="0dip"
+ android:id="@+id/text_layout"
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="6sp"
- android:layout_marginLeft="16sp"
- android:layout_marginRight="6sp"
- android:layout_marginTop="6sp"
- android:layout_weight="1"
- android:background="@android:drawable/menuitem_background"
- android:orientation="vertical"
- android:focusable="true" >
+ android:gravity="center_vertical"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:orientation="horizontal">
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="0dip"
android:layout_height="wrap_content"
- android:focusable="true"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceLarge" />
+ android:layout_marginBottom="6sp"
+ android:layout_marginLeft="16sp"
+ android:layout_marginRight="6sp"
+ android:layout_marginTop="6sp"
+ android:layout_weight="1"
+ android:background="@android:drawable/menuitem_background"
+ android:orientation="vertical"
+ android:focusable="true">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:focusable="true"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <TextView
+ android:id="@+id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </LinearLayout>
- <TextView
- android:id="@+id/summary"
+ <Button
+ android:id="@+id/rotate"
+ android:layout_width="wrap_content"
+ android:layout_height="31dp"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="4dip"
+ android:layout_marginRight="6dip"
+ android:text="rotate"
+ android:textColor="#ffffffff"
+ android:textStyle="bold"
+ android:background="@drawable/button_rounded_blue" />
+
+ <ImageButton
+ android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall" />
+ android:layout_gravity="center_vertical"
+ android:layout_margin="10dp"
+ android:src="@drawable/plus"
+ android:background="@drawable/button_rounded_green" />
</LinearLayout>
- <Button
- android:id="@+id/rotate"
- android:layout_width="wrap_content"
- android:layout_height="31dp"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="4dip"
- android:layout_marginRight="6dip"
- android:text="rotate"
- android:textColor="#ffffffff"
- android:textStyle="bold"
- android:background="@drawable/button_rounded_blue"
- />
- <ImageButton
- android:id="@+id/add"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_margin="10dp"
- android:src="@drawable/plus"
- android:background="@drawable/button_rounded_green"/>
- </LinearLayout>
- <View
- android:id="@+id/separator"
- android:layout_width="fill_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <ScrollView
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:orientation="vertical" >
+ <View
+ android:id="@+id/separator"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
- <LinearLayout
- android:id="@+id/editors"
+ <ScrollView
android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
- </ScrollView>
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/editors"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
+ </ScrollView>
+
+ </LinearLayout>
-</LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/keyspinner_item.xml b/OpenKeychain/src/main/res/layout/keyspinner_item.xml
index b75bb808e..757dae5be 100644
--- a/OpenKeychain/src/main/res/layout/keyspinner_item.xml
+++ b/OpenKeychain/src/main/res/layout/keyspinner_item.xml
@@ -50,7 +50,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:src="@drawable/status_signature_revoked_cutout"
+ android:src="@drawable/status_signature_revoked_cutout_24px"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
diff --git a/OpenKeychain/src/main/res/layout/log_display_activity.xml b/OpenKeychain/src/main/res/layout/log_display_activity.xml
index 518b56776..a243a9d2b 100644
--- a/OpenKeychain/src/main/res/layout/log_display_activity.xml
+++ b/OpenKeychain/src/main/res/layout/log_display_activity.xml
@@ -1,16 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingLeft="8dp"
- android:paddingRight="8dp">
+ android:layout_height="match_parent">
- <fragment
- android:id="@+id/list"
- android:name="org.sufficientlysecure.keychain.ui.LogDisplayFragment"
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.9" />
+ android:layout_height="match_parent"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp">
+
+ <fragment
+ android:id="@+id/list"
+ android:name="org.sufficientlysecure.keychain.ui.LogDisplayFragment"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="0.9" />
-</LinearLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/nfc_activity.xml b/OpenKeychain/src/main/res/layout/nfc_activity.xml
index 034b74a35..9acd0676c 100644
--- a/OpenKeychain/src/main/res/layout/nfc_activity.xml
+++ b/OpenKeychain/src/main/res/layout/nfc_activity.xml
@@ -1,24 +1,35 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<?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="match_parent"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:paddingTop="16dp"
- android:paddingBottom="16dp">
+ android:layout_height="match_parent">
- <TextView
- android:text="@string/nfc_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@android:style/TextAppearance.Large"
- android:id="@+id/nfc_text"
- android:gravity="center"
- android:layout_gravity="center" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <ImageView
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/yubikey_phone" />
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp">
-</LinearLayout>
+ <TextView
+ android:text="@string/nfc_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@android:style/TextAppearance.Large"
+ android:id="@+id/nfc_text"
+ android:gravity="center"
+ android:layout_gravity="center" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:src="@drawable/yubikey_phone" />
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml b/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml
index 3a19dd452..09e37ee56 100644
--- a/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml
+++ b/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml
@@ -3,8 +3,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp">
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp">
<CheckBox
android:id="@+id/passphrase_no_passphrase"
diff --git a/OpenKeychain/src/main/res/layout/passphrase_wizard_fragment_passphrase.xml b/OpenKeychain/src/main/res/layout/passphrase_wizard_fragment_passphrase.xml
index 61bd4572d..de957cc74 100644
--- a/OpenKeychain/src/main/res/layout/passphrase_wizard_fragment_passphrase.xml
+++ b/OpenKeychain/src/main/res/layout/passphrase_wizard_fragment_passphrase.xml
@@ -7,13 +7,12 @@
tools:context="pSontag.testopenkeychain.Passphrase">
-
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
- <TableRow
- android:layout_marginBottom="10dp">
+ <TableRow android:layout_marginBottom="10dp">
+
<TextView
android:id="@+id/passphraseText"
android:layout_width="match_parent"
@@ -23,7 +22,7 @@
android:layout_gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/passphrase"
- android:layout_weight="1"/>
+ android:layout_weight="1" />
</TableRow>
<View
@@ -32,26 +31,29 @@
android:background="?android:attr/listDivider" />
<TableRow>
+
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/passphrase"/>
+ android:text="@string/passphrase" />
+
<EditText
android:id="@+id/passphrase"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:padding="8dp"
- android:layout_weight="6"/>
+ android:layout_weight="6" />
</TableRow>
<TableRow
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp">
+
<TextView
android:id="@+id/passphraseTextAgain"
android:layout_width="wrap_content"
@@ -59,7 +61,8 @@
android:padding="8dp"
android:text="@string/passphrase_again"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_weight="1"/>
+ android:layout_weight="1" />
+
<EditText
android:id="@+id/passphraseAgain"
android:layout_width="match_parent"
@@ -67,10 +70,11 @@
android:inputType="textPassword"
android:imeOptions="actionDone"
android:padding="8dp"
- android:layout_weight="6"/>
+ android:layout_weight="6" />
</TableRow>
</TableLayout>
+
<View
android:layout_width="match_parent"
android:layout_height="1dip"
@@ -80,28 +84,32 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Cancel"
- android:onClick="cancel"
- android:layout_weight="1"
- android:textAppearance="?android:attr/textAppearanceMedium"
- style="?attr/alp_42447968_button_bar_button_style"/>
- <View
- android:layout_width="1dip"
- android:layout_height="50dip"
- android:background="?android:attr/listDivider" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Ok"
- android:onClick="savePassphrase"
- android:layout_weight="1"
- android:textAppearance="?android:attr/textAppearanceMedium"
- style="?attr/alp_42447968_button_bar_button_style"/>
+
+ <!--<Button-->
+ <!--android:layout_width="wrap_content"-->
+ <!--android:layout_height="wrap_content"-->
+ <!--android:text="Cancel"-->
+ <!--android:onClick="cancel"-->
+ <!--android:layout_weight="1"-->
+ <!--android:textAppearance="?android:attr/textAppearanceMedium"-->
+ <!--style="?attr/alp_42447968_button_bar_button_style" />-->
+
+ <!--<View-->
+ <!--android:layout_width="1dip"-->
+ <!--android:layout_height="50dip"-->
+ <!--android:background="?android:attr/listDivider" />-->
+
+ <!--<Button-->
+ <!--android:layout_width="wrap_content"-->
+ <!--android:layout_height="wrap_content"-->
+ <!--android:text="Ok"-->
+ <!--android:onClick="savePassphrase"-->
+ <!--android:layout_weight="1"-->
+ <!--android:textAppearance="?android:attr/textAppearanceMedium"-->
+ <!--style="?attr/alp_42447968_button_bar_button_style" />-->
</LinearLayout>
+
<View
android:layout_width="match_parent"
android:layout_height="1dip"
diff --git a/OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml b/OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml
new file mode 100644
index 000000000..f17bc30bc
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/preference_toolbar_activity.xml
@@ -0,0 +1,10 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/qr_code_activity.xml b/OpenKeychain/src/main/res/layout/qr_code_activity.xml
index 57c869db6..5709bf0ff 100644
--- a/OpenKeychain/src/main/res/layout/qr_code_activity.xml
+++ b/OpenKeychain/src/main/res/layout/qr_code_activity.xml
@@ -1,14 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <ImageView
- android:id="@+id/qr_code_image"
- android:padding="32dp"
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
android:layout_height="match_parent"
- style="@style/SelectableItem" />
+ android:orientation="horizontal">
+
+ <android.support.v7.widget.CardView
+ android:id="@+id/qr_code_image_layout"
+ android:transitionName="qr_code"
+ android:layout_gravity="center_vertical"
+ android:layout_margin="32dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:foreground="?android:attr/selectableItemBackground"
+ app:cardBackgroundColor="@android:color/white"
+ app:cardUseCompatPadding="true"
+ app:cardCornerRadius="4dp">
+
+ <org.sufficientlysecure.keychain.ui.widget.AspectRatioImageView
+ android:id="@+id/qr_code_image"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:dominantMeasurement="width"
+ app:aspectRatioEnabled="true" />
+ </android.support.v7.widget.CardView>
-</LinearLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml b/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml
index 39f4b7238..bafad173b 100644
--- a/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml
+++ b/OpenKeychain/src/main/res/layout/safe_slinger_activity.xml
@@ -1,74 +1,86 @@
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<?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="match_parent">
- <LinearLayout
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <ScrollView
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp">
+ android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
- <TextView
- android:layout_width="0dp"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="14dp"
- android:text="@string/exchange_description"
- android:layout_weight="1"/>
+ android:orientation="horizontal">
- <Spinner
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/safe_slinger_spinner"
- android:gravity="center_vertical"/>
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/exchange_description"
+ android:layout_weight="1"
+ android:gravity="center_vertical" />
- </LinearLayout>
+ <NumberPicker
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/safe_slinger_picker" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
+ </LinearLayout>
- <LinearLayout
- android:id="@+id/safe_slinger_button"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- android:paddingRight="4dp"
- style="@style/SelectableItem"
- android:orientation="horizontal">
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
- <TextView
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:text="Start exchange"
- android:layout_weight="1"
- android:gravity="center_vertical" />
+ <LinearLayout
+ android:id="@+id/safe_slinger_button"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ android:paddingRight="4dp"
+ style="@style/SelectableItem"
+ android:orientation="horizontal">
- <!-- separate ImageView required for recoloring -->
- <ImageView
- android:id="@+id/safe_slinger_button_image"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/ic_action_safeslinger"
- android:layout_gravity="center_vertical" />
+ <TextView
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:text="@string/btn_start_exchange"
+ android:layout_weight="1"
+ android:gravity="center_vertical" />
- </LinearLayout>
+ <!-- separate ImageView required for recoloring -->
+ <ImageView
+ android:id="@+id/safe_slinger_button_image"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_repeat_grey_24dp"
+ android:layout_gravity="center_vertical" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:layout_marginBottom="4dp"
- android:background="?android:attr/listDivider" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:layout_marginBottom="4dp"
+ android:background="?android:attr/listDivider" />
+
+ </LinearLayout>
+ </ScrollView>
- </LinearLayout>
-</ScrollView>
+</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/layout/select_key_item.xml b/OpenKeychain/src/main/res/layout/select_key_item.xml
index c7fa882cb..13f63d2ee 100644
--- a/OpenKeychain/src/main/res/layout/select_key_item.xml
+++ b/OpenKeychain/src/main/res/layout/select_key_item.xml
@@ -50,7 +50,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:src="@drawable/status_signature_revoked_cutout"
+ android:src="@drawable/status_signature_revoked_cutout_24px"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
diff --git a/OpenKeychain/src/main/res/layout/select_public_key_activity.xml b/OpenKeychain/src/main/res/layout/select_public_key_activity.xml
index a18ce46fc..5a607e5ec 100644
--- a/OpenKeychain/src/main/res/layout/select_public_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/select_public_key_activity.xml
@@ -1,12 +1,22 @@
<?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="match_parent"
- android:layout_centerHorizontal="true" >
+ android:layout_height="match_parent">
- <FrameLayout
- android:id="@+id/select_public_key_fragment_container"
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <RelativeLayout
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:layout_centerHorizontal="true">
+
+ <FrameLayout
+ android:id="@+id/select_public_key_fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </RelativeLayout>
</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/toolbar_standalone.xml b/OpenKeychain/src/main/res/layout/toolbar_standalone.xml
new file mode 100644
index 000000000..950c2f2ae
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/toolbar_standalone.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/toolbar_include"
+ android:elevation="4dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <!--
+ We always have windowTranslucentStatus=true to get under the status bar.
+ Thus this ImageView is the part under the status bar!
+ -->
+ <ImageView
+ android:id="@+id/status_bar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/statusbar_height"
+ android:background="?attr/colorPrimary" />
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_below="@+id/status_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
+ tools:ignore="UnusedAttribute" />
+
+</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/layout/upload_key_activity.xml b/OpenKeychain/src/main/res/layout/upload_key_activity.xml
index 736617ba5..19e37783b 100644
--- a/OpenKeychain/src/main/res/layout/upload_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/upload_key_activity.xml
@@ -1,62 +1,72 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
+<?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="match_parent">
- <include layout="@layout/notify_area" />
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
- <ScrollView
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <LinearLayout
+ <include layout="@layout/notify_area" />
+
+ <ScrollView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:orientation="vertical">
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="14dp"
- android:text="@string/section_key_server" />
+ android:layout_height="match_parent">
- <Spinner
- android:id="@+id/upload_key_keyserver"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="4dp" />
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_marginTop="14dp"
- android:text="@string/section_actions"
- android:layout_weight="1" />
-
- <TextView
- android:id="@+id/upload_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="match_parent"
- android:text="@string/btn_export_to_server"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:drawableRight="@drawable/ic_action_upload"
- android:drawablePadding="8dp"
- android:gravity="center_vertical"
- android:clickable="true"
- style="@style/SelectableItem" />
-
- </LinearLayout>
-
- </ScrollView>
-</LinearLayout> \ No newline at end of file
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/section_key_server" />
+
+ <Spinner
+ android:id="@+id/upload_key_keyserver"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="4dp" />
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/section_actions"
+ android:layout_weight="1" />
+
+ <TextView
+ android:id="@+id/upload_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="match_parent"
+ android:text="@string/btn_export_to_server"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_action_upload"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="@style/SelectableItem" />
+
+ </LinearLayout>
+
+ </ScrollView>
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_cert_activity.xml b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
index bf65fe1cd..0a6b46a93 100644
--- a/OpenKeychain/src/main/res/layout/view_cert_activity.xml
+++ b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
@@ -1,213 +1,226 @@
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<?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="match_parent">
- <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
- <LinearLayout
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <ScrollView
+ android:layout_below="@id/toolbar_include"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:descendantFocusability="beforeDescendants"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp">
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="14dp"
- android:text="@string/section_cert" />
+ android:layout_height="match_parent">
- <TableLayout
+ <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_marginLeft="8dp"
- android:layout_weight="1"
- android:stretchColumns="1">
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_key_id" />
-
- <TextView
- android:id="@+id/signee_key"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:typeface="monospace" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_user_id" />
-
- <TextView
- android:id="@+id/signee_uid"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip" />
- </TableRow>
-
- <TableRow
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_algorithm" />
-
- <TextView
- android:id="@+id/algorithm"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip" />
- </TableRow>
-
- <TableRow
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_cert_type" />
-
- <TextView
- android:id="@+id/signature_type"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip" />
- </TableRow>
-
- <TableRow
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:id="@+id/row_reason">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_revocation" />
-
- <TextView
- android:id="@+id/reason"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_creation" />
-
- <TextView
- android:id="@+id/creation"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip" />
- </TableRow>
-
- </TableLayout>
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="14dp"
- android:text="@string/section_certifier_id" />
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:descendantFocusability="beforeDescendants"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/section_cert" />
+
+ <TableLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_weight="1"
+ android:stretchColumns="1">
+
+ <TableRow>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_key_id" />
+
+ <TextView
+ android:id="@+id/signee_key"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip"
+ android:typeface="monospace" />
+ </TableRow>
+
+ <TableRow>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_user_id" />
+
+ <TextView
+ android:id="@+id/signee_uid"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_algorithm" />
+
+ <TextView
+ android:id="@+id/algorithm"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_cert_type" />
+
+ <TextView
+ android:id="@+id/signature_type"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip" />
+ </TableRow>
+
+ <TableRow
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:id="@+id/row_reason">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_revocation" />
+
+ <TextView
+ android:id="@+id/reason"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip" />
+ </TableRow>
+
+ <TableRow>
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_creation" />
+
+ <TextView
+ android:id="@+id/creation"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip" />
+ </TableRow>
+
+ </TableLayout>
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/section_certifier_id" />
+
+ <TableLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1"
+ android:stretchColumns="1">
+
+ <TableRow>
+
+ <TextView
+ 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/signer_key_id"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip"
+ android:typeface="monospace" />
+ </TableRow>
+
+ <TableRow>
+
+ <TextView
+ android:id="@+id/label_algorithm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:paddingRight="10dip"
+ android:text="@string/label_user_id" />
+
+ <TextView
+ android:id="@+id/signer_uid"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip" />
+ </TableRow>
+
+ </TableLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <TextView
+ android:id="@+id/view_cert_view_cert_key"
+ 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"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:text="@string/btn_view_cert_key"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_action_person"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
+
+ </LinearLayout>
+
+ </ScrollView>
+
+</RelativeLayout>
- <TableLayout
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_marginLeft="8dp"
- android:layout_marginBottom="4dp"
- android:layout_weight="1"
- android:stretchColumns="1">
-
- <TableRow>
-
- <TextView
- 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/signer_key_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:typeface="monospace" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_algorithm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_user_id" />
-
- <TextView
- android:id="@+id/signer_uid"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip" />
- </TableRow>
-
- </TableLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <TextView
- android:id="@+id/view_cert_view_cert_key"
- 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"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- style="@style/SelectableItem"
- android:text="@string/btn_view_cert_key"
- android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_person"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- </LinearLayout>
-
-</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/view_key_activity.xml b/OpenKeychain/src/main/res/layout/view_key_activity.xml
index 451eb30ee..1a45370a5 100644
--- a/OpenKeychain/src/main/res/layout/view_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_activity.xml
@@ -1,52 +1,191 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:fab="http://schemas.android.com/apk/res-auto"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+ android:layout_height="match_parent">
- <include layout="@layout/notify_area" />
-
- <LinearLayout
- android:id="@+id/view_key_status_layout"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"
+ <RelativeLayout
+ android:id="@+id/toolbar_big"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/huge_toolbar"
+ android:elevation="4dp"
+ android:background="?attr/colorPrimary"
android:orientation="horizontal">
+ <org.sufficientlysecure.keychain.ui.widget.AspectRatioImageView
+ android:id="@+id/view_key_photo"
+ app:aspectRatioEnabled="true"
+ android:visibility="gone"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/status_bar"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:src="@drawable/first_time_1" />
+
<ImageView
- android:id="@+id/view_key_status_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:id="@+id/status_bar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/statusbar_height"
+ android:background="?attr/colorPrimary" />
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_below="@+id/status_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?attr/actionBarSize"
+ android:overScrollMode="always"
+ app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
+ tools:ignore="UnusedAttribute"
+ android:transitionGroup="false"
+ android:touchscreenBlocksFocus="false" />
<TextView
- android:id="@+id/view_key_status_text"
+ android:id="@+id/view_key_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="48dp"
+ android:layout_marginStart="48dp"
+ android:layout_marginRight="48dp"
+ android:layout_marginEnd="48dp"
+ android:text=""
+ android:textColor="@color/icons"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:layout_above="@+id/view_key_status" />
+
+ <TextView
+ android:id="@+id/view_key_status"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="48dp"
+ android:layout_marginStart="48dp"
+ android:layout_marginRight="48dp"
+ android:layout_marginEnd="48dp"
+ android:text=""
+ android:textColor="@color/tab_text"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_above="@+id/toolbar2" />
+
+ <LinearLayout
+ android:id="@+id/toolbar2"
+ android:orientation="horizontal"
+ android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
+ android:minHeight="?attr/actionBarSize"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_gravity="center_vertical"
- android:layout_marginLeft="8dp" />
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginLeft="32dp"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true">
- </LinearLayout>
+ <ImageButton
+ android:id="@+id/view_key_action_encrypt_files"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:visibility="invisible"
+ style="?android:attr/borderlessButtonStyle"
+ android:src="@drawable/ic_action_encrypt_file" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:visibility="gone"
- android:id="@+id/view_key_status_divider" />
+ <ImageButton
+ android:id="@+id/view_key_action_encrypt_text"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:visibility="invisible"
+ style="?android:attr/borderlessButtonStyle"
+ android:src="@drawable/ic_action_encrypt_text" />
- <org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout
- android:id="@+id/view_key_sliding_tab_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ <ImageButton
+ android:id="@+id/view_key_action_nfc"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:visibility="invisible"
+ style="?android:attr/borderlessButtonStyle"
+ android:src="@drawable/ic_nfc_white_24dp" />
- <android.support.v4.view.ViewPager
- android:id="@+id/view_key_pager"
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/view_key_status_image"
+ android:layout_width="96dp"
+ android:visibility="invisible"
+ android:src="@drawable/status_signature_unverified_cutout_96px"
+ android:layout_height="96dp"
+ android:layout_above="@id/toolbar2"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:layout_marginRight="16dp" />
+
+ <android.support.v7.widget.CardView
+ android:id="@+id/view_key_qr_code_layout"
+ android:transitionName="qr_code"
+ android:visibility="visible"
+ android:layout_above="@id/toolbar2"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:layout_marginRight="20dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:foreground="?android:attr/selectableItemBackground"
+ card_view:cardBackgroundColor="@android:color/white"
+ card_view:cardElevation="2dp"
+ card_view:cardUseCompatPadding="true"
+ card_view:cardCornerRadius="4dp">
+
+ <ImageView
+ android:id="@+id/view_key_qr_code"
+ android:layout_width="96dp"
+ android:layout_height="96dp" />
+ </android.support.v7.widget.CardView>
+
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/body"
+ android:layout_below="@id/toolbar_big"
+ android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="0px"
- android:layout_weight="1"
- android:background="@android:color/white" />
+ android:layout_height="match_parent">
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:visibility="gone"
+ android:id="@+id/view_key_status_divider" />
+
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <FrameLayout
+ android:id="@+id/view_key_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+ </FrameLayout>
+ </LinearLayout>
+
+ <com.getbase.floatingactionbutton.FloatingActionButton
+ android:id="@+id/fab"
+ android:layout_alignBottom="@id/toolbar_big"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="20dp"
+ android:layout_marginBottom="-40dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="invisible"
+ android:elevation="4dp"
+ fab:fab_icon="@drawable/ic_qrcode_white_24dp"
+ fab:fab_colorNormal="@color/fab"
+ fab:fab_colorPressed="@color/fab_pressed" />
-</LinearLayout> \ No newline at end of file
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_activity.xml b/OpenKeychain/src/main/res/layout/view_key_adv_activity.xml
new file mode 100644
index 000000000..59888c25a
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_activity.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar_include"
+ layout="@layout/toolbar_standalone" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar_include"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:visibility="gone"
+ android:id="@+id/view_key_status_divider" />
+
+ <com.astuetz.PagerSlidingTabStrip
+ android:id="@+id/view_key_sliding_tab_layout"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:textColor="@color/tab_text"
+ app:pstsTextColorSelected="@color/tab_text_selected"
+ app:pstsIndicatorColor="@color/tab_indicator" />
+
+ <android.support.v4.view.ViewPager
+ android:id="@+id/view_key_pager"
+ android:layout_width="match_parent"
+ android:layout_height="0px"
+ android:layout_weight="1"
+ android:background="@android:color/white" />
+
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_advanced_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml
index 9a2190f7e..d512477aa 100644
--- a/OpenKeychain/src/main/res/layout/view_key_advanced_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml
@@ -1,6 +1,4 @@
-<!--<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"--><!--android:layout_width="match_parent"--><!--android:layout_height="match_parent">-->
-
-<!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
+<?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="match_parent"
@@ -10,40 +8,6 @@
android:orientation="vertical">
<TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="8dp"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
- android:text="@string/section_keys" />
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.4">
-
- <ListView
- android:id="@+id/keys"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollbarStyle="outsideOverlay"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:layout_marginBottom="8dp" />
- </FrameLayout>
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
- android:text="@string/section_certs" />
-
- <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/holo_gray_bright"
@@ -60,8 +24,7 @@
<FrameLayout
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.6">
+ android:layout_height="match_parent">
<se.emilsjolander.stickylistheaders.StickyListHeadersListView
android:layout_width="match_parent"
@@ -82,6 +45,4 @@
</FrameLayout>
-</LinearLayout>
-
- <!--</ScrollView>-->
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_certs_header.xml b/OpenKeychain/src/main/res/layout/view_key_adv_certs_header.xml
index f99c012c9..f99c012c9 100644
--- a/OpenKeychain/src/main/res/layout/view_key_certs_header.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_certs_header.xml
diff --git a/OpenKeychain/src/main/res/layout/view_key_certs_item.xml b/OpenKeychain/src/main/res/layout/view_key_adv_certs_item.xml
index e84a98cdb..e84a98cdb 100644
--- a/OpenKeychain/src/main/res/layout/view_key_certs_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_certs_item.xml
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml
new file mode 100644
index 000000000..a29c9fbee
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml
@@ -0,0 +1,126 @@
+<?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="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@color/holo_gray_bright"
+ android:padding="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="@string/key_trust_header_text"
+ android:gravity="center_horizontal" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:descendantFocusability="beforeDescendants"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="8dp"
+ android:text="@string/section_should_you_trust"
+ android:layout_weight="1" />
+
+ <TextView
+ android:id="@+id/view_key_trust_readout"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="14dp"
+ android:layout_marginLeft="8dp"
+ android:layout_weight="1"
+ style="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/section_cloud_evidence"
+ android:layout_weight="1" />
+
+ <LinearLayout
+ android:id="@+id/view_key_trust_search_cloud"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ android:paddingRight="4dp"
+ style="@style/SelectableItem"
+ android:orientation="horizontal">
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:text="@string/key_trust_start_cloud_search"
+ android:layout_weight="1"
+ android:gravity="center_vertical" />
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_search_cloud"
+ android:layout_gravity="center_vertical" />
+
+ </LinearLayout>
+
+
+ <TextView
+ android:id="@+id/view_key_trust_cloud_narrative"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="14dp"
+ android:layout_marginBottom="14dp"
+ android:layout_marginLeft="8dp"
+ android:layout_weight="1"
+ style="?android:attr/textAppearanceMedium" />
+
+ <TableLayout
+ android:id="@+id/view_key_proof_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:id="@+id/view_key_proof_verify_header"
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="16dp"
+ android:text="@string/section_proof_details"
+ android:layout_weight="1" />
+
+ <TextView
+ android:id="@+id/view_key_proof_verify_detail"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="14dp"
+ android:layout_marginLeft="8dp"
+ android:layout_weight="1"
+ style="?android:attr/textAppearanceMedium" />
+
+
+ </LinearLayout>
+
+ </ScrollView>
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_keybase_proof.xml b/OpenKeychain/src/main/res/layout/view_key_adv_keybase_proof.xml
new file mode 100644
index 000000000..0ffd151c1
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_keybase_proof.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent" android:layout_height="match_parent">
+ <TextView
+ android:id="@+id/proof_number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="6dip"
+ android:text="1."
+ style="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:id="@+id/proof_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="6dip"
+ android:text="Posts to twitter as Timbray"
+ style="?android:attr/textAppearanceMedium" />
+</TableRow>
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml
new file mode 100644
index 000000000..3347a514c
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml
@@ -0,0 +1,33 @@
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:descendantFocusability="beforeDescendants"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="8dp"
+ android:text="@string/section_user_ids"
+ android:layout_weight="1" />
+
+ <org.sufficientlysecure.keychain.ui.widget.FixedListView
+ android:id="@+id/view_key_user_ids"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_share_fragment.xml
index 9971032ce..a6224a8d1 100644
--- a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_share_fragment.xml
@@ -1,4 +1,5 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -67,21 +68,33 @@
android:layout_height="1dip"
android:background="?android:attr/listDivider" />
- <ImageView
- android:id="@+id/view_key_fingerprint_qr_code_image"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
+ <android.support.v7.widget.CardView
+ android:id="@+id/view_key_qr_code_layout"
+ android:transitionName="qr_code"
+ android:visibility="visible"
+ android:layout_marginTop="16dp"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
- style="@style/SelectableItem" />
+ android:clickable="true"
+ android:foreground="?android:attr/selectableItemBackground"
+ card_view:cardBackgroundColor="@android:color/white"
+ card_view:cardUseCompatPadding="true"
+ card_view:cardElevation="2dp"
+ card_view:cardCornerRadius="4dp">
+
+ <ImageView
+ android:id="@+id/view_key_qr_code"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </android.support.v7.widget.CardView>
<TextView
style="@style/SectionHeader"
android:layout_width="wrap_content"
android:layout_height="0dp"
- android:layout_marginTop="14dp"
+ android:layout_marginTop="16dp"
android:text="@string/section_share_key"
android:layout_weight="1" />
@@ -135,7 +148,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="8dp"
- android:src="@drawable/ic_action_safeslinger"
+ android:src="@drawable/ic_repeat_grey_24dp"
android:layout_gravity="center_vertical"
style="@style/SelectableItem" />
@@ -162,51 +175,6 @@
android:drawablePadding="8dp"
android:gravity="center_vertical" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <LinearLayout
- android:id="@+id/view_key_action_nfc_help"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- style="@style/SelectableItem"
- android:orientation="horizontal"
- android:layout_marginBottom="8dp">
-
- <TextView
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:text="@string/key_view_action_share_nfc"
- android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_help"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- <View
- 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" />
-
- <ImageButton
- android:id="@+id/view_key_action_nfc_prefs"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/ic_action_settings"
- android:layout_gravity="center_vertical"
- style="@style/SelectableItem" />
-
- </LinearLayout>
-
</LinearLayout>
</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/view_key_subkey_item.xml b/OpenKeychain/src/main/res/layout/view_key_adv_subkey_item.xml
index b2875b9e6..f41109d84 100644
--- a/OpenKeychain/src/main/res/layout/view_key_subkey_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_subkey_item.xml
@@ -11,7 +11,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:src="@drawable/status_signature_revoked_cutout"
+ android:src="@drawable/status_signature_revoked_cutout_24px"
android:paddingLeft="8dp"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />
@@ -71,7 +71,7 @@
android:id="@+id/subkey_item_ic_certify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/key_flag_certify"
+ android:src="@drawable/key_flag_certify_24px"
android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical" />
@@ -79,7 +79,7 @@
android:id="@+id/subkey_item_ic_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/key_flag_sign"
+ android:src="@drawable/key_flag_sign_24px"
android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical" />
@@ -87,7 +87,7 @@
android:id="@+id/subkey_item_ic_encrypt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/key_flag_encrypt"
+ android:src="@drawable/key_flag_encrypt_24px"
android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical" />
@@ -95,7 +95,7 @@
android:id="@+id/subkey_item_ic_authenticate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/key_flag_authenticate"
+ android:src="@drawable/key_flag_authenticate_24px"
android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical" />
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml
new file mode 100644
index 000000000..62fd113f9
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml
@@ -0,0 +1,34 @@
+<?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="match_parent"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:descendantFocusability="beforeDescendants"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="8dp"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:text="@string/section_keys" />
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ListView
+ android:id="@+id/keys"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:scrollbarStyle="outsideOverlay"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:layout_marginBottom="8dp" />
+ </FrameLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_user_id_item.xml b/OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml
index 24e8e1a10..24e8e1a10 100644
--- a/OpenKeychain/src/main/res/layout/view_key_user_id_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml
diff --git a/OpenKeychain/src/main/res/layout/view_key_advanced_activity.xml b/OpenKeychain/src/main/res/layout/view_key_advanced_activity.xml
deleted file mode 100644
index a581caa0e..000000000
--- a/OpenKeychain/src/main/res/layout/view_key_advanced_activity.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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">
-
- <include layout="@layout/notify_area" />
-
- <FrameLayout
- android:id="@+id/content_frame"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <FrameLayout
- android:id="@+id/view_key_advanced_fragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" />
-
- </FrameLayout>
-
-</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_delete_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_delete_fragment.xml
index bbc723bfa..1a6454f91 100644
--- a/OpenKeychain/src/main/res/layout/view_key_delete_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_delete_fragment.xml
@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -8,7 +12,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mainMessage"
- android:layout_margin="4dp"
android:textAppearance="?android:textAppearanceMedium" />
</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/view_key_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_fragment.xml
new file mode 100644
index 000000000..bba412f99
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_fragment.xml
@@ -0,0 +1,47 @@
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
+
+ <android.support.v7.widget.CardView
+ android:id="@+id/card_view"
+ android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ card_view:cardBackgroundColor="@android:color/white"
+ card_view:cardElevation="2dp"
+ card_view:cardUseCompatPadding="true"
+ card_view:cardCornerRadius="4dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/CardViewHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/section_user_ids" />
+
+ <org.sufficientlysecure.keychain.ui.widget.FixedListView
+ android:id="@+id/view_key_user_ids"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp" />
+ </LinearLayout>
+ </android.support.v7.widget.CardView>
+
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml
deleted file mode 100644
index e3347bd70..000000000
--- a/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml
+++ /dev/null
@@ -1,186 +0,0 @@
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:descendantFocusability="beforeDescendants"
- android:orientation="vertical"
- android:paddingLeft="16dp"
- android:paddingRight="16dp">
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_marginTop="8dp"
- android:text="@string/section_user_ids"
- android:layout_weight="1" />
-
- <org.sufficientlysecure.keychain.ui.widget.FixedListView
- android:id="@+id/view_key_user_ids"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_marginBottom="4dp"
- android:layout_weight="1" />
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_marginTop="14dp"
- android:text="@string/section_actions"
- android:layout_weight="1" />
-
- <LinearLayout
- android:id="@+id/view_key_action_certify"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- android:paddingRight="4dp"
- style="@style/SelectableItem"
- android:orientation="horizontal">
-
- <TextView
- android:id="@+id/view_key_action_certify_text"
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:text="@string/key_view_action_certify"
- android:layout_weight="1"
- android:gravity="center_vertical" />
-
- <ImageView
- android:id="@+id/view_key_action_certify_image"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/status_signature_verified_cutout"
- android:layout_gravity="center_vertical" />
-
- </LinearLayout>
-
- <View
- android:id="@+id/view_key_action_certify_divider"
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <TextView
- android:id="@+id/view_key_action_link"
- 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:clickable="true"
- style="@style/SelectableItem"
- android:text="Link to Resource"
- android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_add_person"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- <View
- android:id="@+id/view_key_action_link_divider"
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <TextView
- android:id="@+id/view_key_action_edit"
- 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:clickable="true"
- style="@style/SelectableItem"
- android:text="@string/key_view_action_edit"
- android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_edit"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- <View
- android:id="@+id/view_key_action_edit_divider"
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
-
- <LinearLayout
- android:id="@+id/view_key_action_encrypt_text"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- style="@style/SelectableItem"
- android:orientation="horizontal">
-
- <TextView
- android:id="@+id/view_key_action_encrypt_text_text"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:text="@string/key_view_action_encrypt"
- android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_secure"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- <View
- 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" />
-
- <TextView
- android:id="@+id/view_key_action_encrypt_files"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:text="@string/key_view_action_encrypt_files"
- android:drawableRight="@drawable/ic_action_secure"
- android:drawablePadding="8dp"
- android:gravity="center_vertical"
- style="@style/SelectableItem" />
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider" />
-
- <TextView
- android:id="@+id/view_key_action_update"
- 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:clickable="true"
- style="@style/SelectableItem"
- android:text="@string/key_view_action_update"
- android:layout_weight="1"
- android:drawableRight="@drawable/ic_action_download"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- </LinearLayout>
-
-</ScrollView>
diff --git a/OpenKeychain/src/main/res/menu/api_account_settings.xml b/OpenKeychain/src/main/res/menu/api_account_settings.xml
index d08fc7f42..713345ffc 100644
--- a/OpenKeychain/src/main/res/menu/api_account_settings.xml
+++ b/OpenKeychain/src/main/res/menu/api_account_settings.xml
@@ -6,9 +6,5 @@
android:id="@+id/menu_account_settings_delete"
android:title="@string/api_settings_delete_account"
app:showAsAction="never" />
- <item
- android:id="@+id/menu_account_settings_cancel"
- android:title="@string/api_settings_cancel"
- app:showAsAction="never" />
</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/menu/api_app_settings.xml b/OpenKeychain/src/main/res/menu/api_app_settings.xml
index 1233e4f6e..5ac340550 100644
--- a/OpenKeychain/src/main/res/menu/api_app_settings.xml
+++ b/OpenKeychain/src/main/res/menu/api_app_settings.xml
@@ -3,9 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
- android:id="@+id/menu_api_settings_start"
- android:title="@string/api_settings_start"
- android:icon="@drawable/ic_action_play"
+ android:id="@+id/menu_api_save"
+ android:title="@string/api_settings_save"
app:showAsAction="always" />
<item
@@ -13,4 +12,9 @@
android:title="@string/api_settings_revoke"
app:showAsAction="never" />
+ <item
+ android:id="@+id/menu_api_settings_advanced"
+ android:title="@string/api_settings_advanced"
+ app:showAsAction="never" />
+
</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/menu/key_list.xml b/OpenKeychain/src/main/res/menu/key_list.xml
index 716a426a0..386a9d46e 100644
--- a/OpenKeychain/src/main/res/menu/key_list.xml
+++ b/OpenKeychain/src/main/res/menu/key_list.xml
@@ -5,59 +5,42 @@
<item
android:id="@+id/menu_key_list_search"
android:title="@string/menu_search"
- android:icon="@drawable/ic_action_search"
+ android:icon="@drawable/ic_search_white_24dp"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="collapseActionView|always" />
<item
- android:id="@+id/menu_key_list_search_cloud"
- app:showAsAction="always|withText"
- android:icon="@drawable/ic_action_search_cloud"
- android:title="@string/menu_add_keys" />
-
- <item
- android:id="@+id/menu_key_list_add"
- app:showAsAction="always|withText"
- android:icon="@drawable/ic_action_qr_code"
- android:title="@string/import_qr_code_button" />
-
- <item
android:id="@+id/menu_key_list_export"
- app:showAsAction="never"
- android:title="@string/menu_export_all_keys" />
+ android:title="@string/menu_export_all_keys"
+ app:showAsAction="never" />
<item
android:id="@+id/menu_key_list_create"
- app:showAsAction="never"
- android:title="@string/menu_create_key" />
-
- <item
- android:id="@+id/menu_key_list_import_existing_key"
- app:showAsAction="never"
- android:title="@string/menu_import_existing_key" />
+ android:title="@string/menu_create_key"
+ app:showAsAction="never" />
<item
android:id="@+id/menu_key_list_debug_cons"
- app:showAsAction="never"
android:title="Debug / Consolidate"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never" />
<item
android:id="@+id/menu_key_list_debug_read"
- app:showAsAction="never"
android:title="Debug / DB restore"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never" />
<item
android:id="@+id/menu_key_list_debug_write"
- app:showAsAction="never"
android:title="Debug / DB backup"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never" />
<item
android:id="@+id/menu_key_list_debug_first_time"
- app:showAsAction="never"
android:title="Debug / Show first time screen"
- android:visible="false" />
+ android:visible="false"
+ app:showAsAction="never" />
</menu>
diff --git a/OpenKeychain/src/main/res/menu/key_list_multi.xml b/OpenKeychain/src/main/res/menu/key_list_multi.xml
index 3e0f87692..7fdf4a5c1 100644
--- a/OpenKeychain/src/main/res/menu/key_list_multi.xml
+++ b/OpenKeychain/src/main/res/menu/key_list_multi.xml
@@ -4,26 +4,23 @@
<item
android:id="@+id/menu_key_list_multi_encrypt"
- android:icon="@drawable/ic_action_secure"
+ android:icon="@drawable/ic_lock_white_24dp"
android:title="@string/menu_encrypt_to" />
<item
android:id="@+id/menu_key_list_multi_export"
- android:icon="@drawable/ic_action_import_export"
android:showAsAction="never"
tools:ignore="AppCompatResource"
android:title="@string/menu_export_key" />
<item
android:id="@+id/menu_key_list_multi_delete"
- android:icon="@drawable/ic_action_discard"
android:showAsAction="never"
tools:ignore="AppCompatResource"
android:title="@string/menu_delete_key" />
<item
android:id="@+id/menu_key_list_multi_select_all"
- android:icon="@drawable/ic_action_select_all"
android:showAsAction="never"
tools:ignore="AppCompatResource"
android:title="@string/menu_select_all" />
diff --git a/OpenKeychain/src/main/res/menu/key_view.xml b/OpenKeychain/src/main/res/menu/key_view.xml
index 049c7013a..c724c46a5 100644
--- a/OpenKeychain/src/main/res/menu/key_view.xml
+++ b/OpenKeychain/src/main/res/menu/key_view.xml
@@ -3,8 +3,20 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
+ android:id="@+id/menu_key_view_edit"
+ android:icon="@drawable/ic_mode_edit_white_24dp"
+ android:visible="false"
+ app:showAsAction="always"
+ android:title="@string/key_view_action_edit" />
+
+ <item
+ android:id="@+id/menu_key_view_refresh"
+ android:icon="@drawable/ic_refresh_white_24dp"
+ app:showAsAction="always"
+ android:title="@string/key_view_action_update" />
+
+ <item
android:id="@+id/menu_key_view_export_file"
- android:icon="@drawable/ic_action_import_export"
app:showAsAction="never"
android:title="@string/menu_export_key" />
@@ -19,4 +31,10 @@
app:showAsAction="never"
android:title="@string/menu_advanced" />
+ <item
+ android:id="@+id/menu_key_view_certify_fingerprint"
+ app:showAsAction="never"
+ android:visible="false"
+ android:title="@string/menu_certify_fingerprint" />
+
</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/menu/key_view2.xml b/OpenKeychain/src/main/res/menu/key_view2.xml
new file mode 100644
index 000000000..d928bee36
--- /dev/null
+++ b/OpenKeychain/src/main/res/menu/key_view2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <item
+ android:id="@+id/menu_key_view_refresh"
+ android:icon="@drawable/ic_refresh_white_24dp"
+ app:showAsAction="always"
+ android:title="@string/key_view_action_update" />
+
+</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-bg/help_about.html b/OpenKeychain/src/main/res/raw-bg/help_about.html
new file mode 100644
index 000000000..2c6c5b3c4
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-bg/help_about.html
@@ -0,0 +1,57 @@
+<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</h2>
+<ul>
+<li>Dominik Schürmann (Maintainer)</li>
+<li>Art O Cathain</li>
+<li>Ash Hughes</li>
+<li>Brian C. Barnes</li>
+<li>Bahtiar 'kalkin' Gadimov</li>
+<li>Daniel Albert</li>
+<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>Signe Rüsch</li>
+<li>Sreeram Boyapati</li>
+<li>Thialfihar (APG 1.x)</li>
+<li>Tim Bray</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="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/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT License)</li>
+</ul>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-bg/help_changelog.html b/OpenKeychain/src/main/res/raw-bg/help_changelog.html
new file mode 100644
index 000000000..0cb7d5210
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-bg/help_changelog.html
@@ -0,0 +1,232 @@
+<html>
+<head></head>
+<body>
+
+<h2>3.1.2</h2>
+<ul>
+<li>Fix key export to files (now for real)</li>
+</ul>
+<h2>3.1.1</h2>
+<ul>
+<li>Fix key export to files (they were written partially)</li>
+<li>Fix crash on Android 2.3</li>
+</ul>
+<h2>3.1</h2>
+<ul>
+<li>Fix crash on Android 5</li>
+<li>New certify screen</li>
+<li>Secure Exchange directly from key list (SafeSlinger library)</li>
+<li>New QR Code program flow</li>
+<li>Redesigned decrypt screen</li>
+<li>New icon usage and colors</li>
+<li>Fix import of secret keys from Symantec Encryption Desktop</li>
+<li>Subkey IDs on Yubikeys are now checked correctly</li>
+</ul>
+<h2>3.0.1</h2>
+<ul>
+<li>Better handling of large key imports</li>
+<li>Improved subkey selection</li>
+</ul>
+<h2>3.0</h2>
+<ul>
+<li>Full support for Yubikey signature generation and decryption!</li>
+<li>Propose installable compatible apps in apps list</li>
+<li>New design for decryption screens</li>
+<li>Many fixes for key import, also fixes stripped keys</li>
+<li>Honor and display key authenticate flags</li>
+<li>User interface to generate custom keys</li>
+<li>Fixing user id revocation certificates</li>
+<li>New cloud search (searches over traditional keyservers and keybase.io)</li>
+<li>Support for stripping keys inside OpenKeychain</li>
+</ul>
+<h2>2.9.2</h2>
+<ul>
+<li>Fix keys broken in 2.9.1</li>
+<li>Yubikey decryption now working via API</li>
+</ul>
+<h2>2.9.1</h2>
+<ul>
+<li>Split encrypt screen into two</li>
+<li>Fix key flags handling (now supporting Mailvelope 0.7 keys)</li>
+<li>Improved passphrase handling</li>
+<li>Key sharing via SafeSlinger</li>
+<li>Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain</li>
+<li>Fix usage of stripped keys</li>
+<li>SHA256 as default for compatibility</li>
+<li>Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
+<li>OpenPGP API now handles revoked/expired keys and returns all user ids</li>
+</ul>
+<h2>2.9</h2>
+<ul>
+<li>Fixing crashes introduced in v2.8</li>
+<li>Experimental ECC support</li>
+<li>Experimental Yubikey support (signing-only with imported keys)</li>
+</ul>
+<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 key creation 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>
+<li>Keys are connected to Android's contacts</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>
+<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 OpenPGP messages/files</li>
+<li>Refactored key edit 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 passphrase 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 passphrase 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-bg/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-bg/help_nfc_beam.html
new file mode 100644
index 000000000..966fb554a
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-bg/help_nfc_beam.html
@@ -0,0 +1,12 @@
+<html>
+<head></head>
+<body>
+<h2>How to receive keys</h2>
+<ol>
+<li>Go to your partners keys and open the key 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-bg/help_start.html b/OpenKeychain/src/main/res/raw-bg/help_start.html
new file mode 100644
index 000000000..92fd4a92a
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-bg/help_start.html
@@ -0,0 +1,19 @@
+<html>
+<head></head>
+<body>
+<h2>Getting started</h2>
+<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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-bg/help_wot.html b/OpenKeychain/src/main/res/raw-bg/help_wot.html
new file mode 100644
index 000000000..2a551f79c
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-bg/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 OpenPGP 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-bg/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-bg/nfc_beam_share.html
new file mode 100644
index 000000000..083e055c7
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-bg/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-cs/help_changelog.html b/OpenKeychain/src/main/res/raw-cs/help_changelog.html
index f90af31f0..af9e49137 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-cs/help_changelog.html
@@ -14,7 +14,7 @@
<h2>3.1</h2>
<ul>
<li>Fix crash on Android 5</li>
-<li>New certify screen</li>
+<li>Nová obrazovka certifikace</li>
<li>Secure Exchange directly from key list (SafeSlinger library)</li>
<li>New QR Code program flow</li>
<li>Redesigned decrypt screen</li>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
@@ -110,11 +110,11 @@ Besides several small patches, a notable number of patches are made by the follo
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>Obarvit otisk klíče</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>Certifikovat uživatelská ID</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>
diff --git a/OpenKeychain/src/main/res/raw-cs/help_start.html b/OpenKeychain/src/main/res/raw-cs/help_start.html
index 58639f43a..5a665ea24 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_start.html
+++ b/OpenKeychain/src/main/res/raw-cs/help_start.html
@@ -4,7 +4,7 @@
<h2>Začínáme</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>Našel jsem chybu v OpenKeychain!</h2>
<p>Nahlašte prosím chybu na <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">bug trackeru OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-cs/help_wot.html b/OpenKeychain/src/main/res/raw-cs/help_wot.html
index 5b8186009..29b4fc420 100644
--- a/OpenKeychain/src/main/res/raw-cs/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-cs/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Síť důvěry</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>
+<p>The Web of Trust describes the part of OpenPGP 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>Podpora v OpenKeychain</h2>
<p>Podpora pro síť důvěry v OpenKeychain je teprve ve svých začátcích. Tento stav se bude velmi měnit v dalších verzích aplikace.</p>
diff --git a/OpenKeychain/src/main/res/raw-de/help_changelog.html b/OpenKeychain/src/main/res/raw-de/help_changelog.html
index 0979684ac..aae29a2a6 100644
--- a/OpenKeychain/src/main/res/raw-de/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-de/help_changelog.html
@@ -4,11 +4,11 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Behoben: Schlüsselexport in Datei (Jetzt wirklich)</li>
</ul>
<h2>3.1.1</h2>
<ul>
-<li>Fix key export to files (they were written partially)</li>
+<li>Behoben: Schlüsselexport in Datei (wurde nur teilweise geschrieben)</li>
<li>Absturz auf Android 2.3 behoben</li>
</ul>
<h2>3.1</h2>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fehler bei der Entschlüsselung symmetrischer PGP Nachrichten/Dateien behoben</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refaktorisierter Schlüsselbearbeitungsbildschirm (Dank an Ash Hughes)</li>
<li>Neues modernes Design für Verschlüsselungs-/Entschlüsselungs-Bildschirme</li>
<li>OpenPGP API Version 3 (mehrfache API-Konten, interne Fehlerbehebungen, Schlüsselsuche)</li>
diff --git a/OpenKeychain/src/main/res/raw-de/help_start.html b/OpenKeychain/src/main/res/raw-de/help_start.html
index 735961dc9..9d37a4cc6 100644
--- a/OpenKeychain/src/main/res/raw-de/help_start.html
+++ b/OpenKeychain/src/main/res/raw-de/help_start.html
@@ -4,7 +4,7 @@
<h2>Los geht's</h2>
<p>Zuerst wird ein geheimer Schlüssel benötigt. Erstelle einen über das Menü "Keys" oder importiere einen bereits existierenden geheimen Schlüssel. Anschließend kannst du die Schlüssel deiner Freunde herunterladen oder über QR-Codes oder NFC austauschen.</p>
-<p>Auf Android-Geräte mit einer kleineren Versionsnummer als 4.4 wird empfohlen den Datei-Browser <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> zu installieren. Um QR-Codes zu scannen, wird der <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> benötigt. Ein Klick auf die Links öffnet den Google Play Store oder F-Droid, von wo die Programme installiert werden können.</p>
+<p>Auf Android-Geräte mit einer kleineren Versionsnummer als 4.4 wird empfohlen den Datei-Browser <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> zu installieren.</p>
<h2>Ich habe einen Fehler in OpenKeychain gefunden!</h2>
<p>Bitte berichten Sie Bugs mithilfe des <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">Issue Trackers der OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-es/help_changelog.html b/OpenKeychain/src/main/res/raw-es/help_changelog.html
index 1c9680230..e404fecf1 100644
--- a/OpenKeychain/src/main/res/raw-es/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-es/help_changelog.html
@@ -4,7 +4,7 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Repara la exportación de claves hacia ficheros (ahora de verdad)</li>
</ul>
<h2>3.1.1</h2>
<ul>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Repara descifrado de mensajes/ficheros pgp simétricos</li>
+<li>Repara el descifrado de ficheros/mensajes OpenPGP simétricos</li>
<li>Pantalla de edición de clave refactorizada (gracias a Ash Hughes)</li>
<li>Nuevo diseño moderno para pantallas de cifrado/descifrado</li>
<li>API de OpenPGP version 3 (múltiples cuentas api, reparaciones internas, búsqueda de clave)</li>
diff --git a/OpenKeychain/src/main/res/raw-es/help_start.html b/OpenKeychain/src/main/res/raw-es/help_start.html
index eb56fe3f4..c3755f014 100644
--- a/OpenKeychain/src/main/res/raw-es/help_start.html
+++ b/OpenKeychain/src/main/res/raw-es/help_start.html
@@ -4,7 +4,7 @@
<h2>Primeros pasos</h2>
<p>Primero, necesita una clave personal. Cree una a través del menú en "Claves" o importe claves secretas (privadas) existentes. Después, puede descargar las claves de sus amigos o intercambiarlas mediante códigos QR o transmisión NFC.</p>
-<p>Sobre un Android inferior a la 4.4, se recomienda que instale <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> para una selección de ficheros mejorada. Para compartir mediante códigos QR instale <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Haga clic en los enlaces para abrir la Google Play Store o F-Droid para instalarlos.</p>
+<p>En Android inferior a 4.4, se recomienda que instale <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> para una selección de ficheros mejorada.</p>
<h2>¡He encontrado un bug en OpenKeychain!</h2>
<p>Por favor, informa de errores usando el <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">seguimiento de incidencias de OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-es/help_wot.html b/OpenKeychain/src/main/res/raw-es/help_wot.html
index b3b65d4b2..3af2cae10 100644
--- a/OpenKeychain/src/main/res/raw-es/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-es/help_wot.html
@@ -1,11 +1,11 @@
<html>
<head></head>
<body>
-<h2>Web of Trust</h2>
-<p>El Web of Trust (web de confianza) describe la parte de PGP que trata con la creación y catalogación de certificaciones. Proporciona mecanismos para ayudar al usuario a llevar un seguimiento de a quién pertenece una clave pública, y comparte esta información con otros. Para asegurar la privacidad de las comunicaciones cifradas, es esencial saber que la clave pública que usted cifra pertenece a la misma persona que usted piensa.</p>
+<h2>Anillo de confianza</h2>
+<p>El anillo de confianza (web of trust) describe la parte de OpenPGP que se encarga de la creación y registro de las certificaciones. Proporciona mecanismos para ayudar al usuario a llevar un seguimiento de a quién pertenece una clave pública, y compartir esta información con otros. Para asegurar la privacidad de la comunicación cifrada, es esencial saber que la clave pública con la que usted la cifra pertenece a la persona que usted cree.</p>
<h2>Soporte en OpenKeychain</h2>
-<p>Sólo hay soporte básico para Web of Trust (web de confianza) en OpenKeychain. Este es un duro trabajo que tenemos en marcha sujeto a cambios en versiones posteriores.</p>
+<p>Sólo hay soporte básico para el anillo de confianza (web of trust) en OpenKeychain. Esta es una pesada tarea que tenemos en marcha sujeta a cambios en versiones posteriores.</p>
<h2>Modelo de confianza</h2>
<p>La evaluación de la confianza está basada en la simple asunción de que todas las claves que tienen disponibles claves privadas (secretas) son de confianza. Las claves públicas que contienen al menos una identificación de usuario certificada por una clave de confianza serán marcadas con un punto verde en los listados de claves. No es posible (aún) especificar niveles de confianza para certificados de otras claves públicas conocidas.</p>
diff --git a/OpenKeychain/src/main/res/raw-et/help_changelog.html b/OpenKeychain/src/main/res/raw-et/help_changelog.html
index 4d3d293ac..0cb7d5210 100644
--- a/OpenKeychain/src/main/res/raw-et/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-et/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-et/help_start.html b/OpenKeychain/src/main/res/raw-et/help_start.html
index 4f029ab37..92fd4a92a 100644
--- a/OpenKeychain/src/main/res/raw-et/help_start.html
+++ b/OpenKeychain/src/main/res/raw-et/help_start.html
@@ -4,7 +4,7 @@
<h2>Getting started</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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>
diff --git a/OpenKeychain/src/main/res/raw-et/help_wot.html b/OpenKeychain/src/main/res/raw-et/help_wot.html
index 29790139b..2a551f79c 100644
--- a/OpenKeychain/src/main/res/raw-et/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-et/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>
diff --git a/OpenKeychain/src/main/res/raw-eu/help_about.html b/OpenKeychain/src/main/res/raw-eu/help_about.html
new file mode 100644
index 000000000..2c6c5b3c4
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-eu/help_about.html
@@ -0,0 +1,57 @@
+<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</h2>
+<ul>
+<li>Dominik Schürmann (Maintainer)</li>
+<li>Art O Cathain</li>
+<li>Ash Hughes</li>
+<li>Brian C. Barnes</li>
+<li>Bahtiar 'kalkin' Gadimov</li>
+<li>Daniel Albert</li>
+<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>Signe Rüsch</li>
+<li>Sreeram Boyapati</li>
+<li>Thialfihar (APG 1.x)</li>
+<li>Tim Bray</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="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/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT License)</li>
+</ul>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-eu/help_changelog.html b/OpenKeychain/src/main/res/raw-eu/help_changelog.html
new file mode 100644
index 000000000..0cb7d5210
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-eu/help_changelog.html
@@ -0,0 +1,232 @@
+<html>
+<head></head>
+<body>
+
+<h2>3.1.2</h2>
+<ul>
+<li>Fix key export to files (now for real)</li>
+</ul>
+<h2>3.1.1</h2>
+<ul>
+<li>Fix key export to files (they were written partially)</li>
+<li>Fix crash on Android 2.3</li>
+</ul>
+<h2>3.1</h2>
+<ul>
+<li>Fix crash on Android 5</li>
+<li>New certify screen</li>
+<li>Secure Exchange directly from key list (SafeSlinger library)</li>
+<li>New QR Code program flow</li>
+<li>Redesigned decrypt screen</li>
+<li>New icon usage and colors</li>
+<li>Fix import of secret keys from Symantec Encryption Desktop</li>
+<li>Subkey IDs on Yubikeys are now checked correctly</li>
+</ul>
+<h2>3.0.1</h2>
+<ul>
+<li>Better handling of large key imports</li>
+<li>Improved subkey selection</li>
+</ul>
+<h2>3.0</h2>
+<ul>
+<li>Full support for Yubikey signature generation and decryption!</li>
+<li>Propose installable compatible apps in apps list</li>
+<li>New design for decryption screens</li>
+<li>Many fixes for key import, also fixes stripped keys</li>
+<li>Honor and display key authenticate flags</li>
+<li>User interface to generate custom keys</li>
+<li>Fixing user id revocation certificates</li>
+<li>New cloud search (searches over traditional keyservers and keybase.io)</li>
+<li>Support for stripping keys inside OpenKeychain</li>
+</ul>
+<h2>2.9.2</h2>
+<ul>
+<li>Fix keys broken in 2.9.1</li>
+<li>Yubikey decryption now working via API</li>
+</ul>
+<h2>2.9.1</h2>
+<ul>
+<li>Split encrypt screen into two</li>
+<li>Fix key flags handling (now supporting Mailvelope 0.7 keys)</li>
+<li>Improved passphrase handling</li>
+<li>Key sharing via SafeSlinger</li>
+<li>Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain</li>
+<li>Fix usage of stripped keys</li>
+<li>SHA256 as default for compatibility</li>
+<li>Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
+<li>OpenPGP API now handles revoked/expired keys and returns all user ids</li>
+</ul>
+<h2>2.9</h2>
+<ul>
+<li>Fixing crashes introduced in v2.8</li>
+<li>Experimental ECC support</li>
+<li>Experimental Yubikey support (signing-only with imported keys)</li>
+</ul>
+<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 key creation 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>
+<li>Keys are connected to Android's contacts</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>
+<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 OpenPGP messages/files</li>
+<li>Refactored key edit 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 passphrase 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 passphrase 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-eu/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-eu/help_nfc_beam.html
new file mode 100644
index 000000000..966fb554a
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-eu/help_nfc_beam.html
@@ -0,0 +1,12 @@
+<html>
+<head></head>
+<body>
+<h2>How to receive keys</h2>
+<ol>
+<li>Go to your partners keys and open the key 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-eu/help_start.html b/OpenKeychain/src/main/res/raw-eu/help_start.html
new file mode 100644
index 000000000..92fd4a92a
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-eu/help_start.html
@@ -0,0 +1,19 @@
+<html>
+<head></head>
+<body>
+<h2>Getting started</h2>
+<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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-eu/help_wot.html b/OpenKeychain/src/main/res/raw-eu/help_wot.html
new file mode 100644
index 000000000..2a551f79c
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-eu/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 OpenPGP 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-eu/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-eu/nfc_beam_share.html
new file mode 100644
index 000000000..083e055c7
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-eu/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-fi/help_changelog.html b/OpenKeychain/src/main/res/raw-fi/help_changelog.html
index 4d3d293ac..0cb7d5210 100644
--- a/OpenKeychain/src/main/res/raw-fi/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-fi/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-fi/help_start.html b/OpenKeychain/src/main/res/raw-fi/help_start.html
index 4f029ab37..92fd4a92a 100644
--- a/OpenKeychain/src/main/res/raw-fi/help_start.html
+++ b/OpenKeychain/src/main/res/raw-fi/help_start.html
@@ -4,7 +4,7 @@
<h2>Getting started</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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>
diff --git a/OpenKeychain/src/main/res/raw-fi/help_wot.html b/OpenKeychain/src/main/res/raw-fi/help_wot.html
index 29790139b..2a551f79c 100644
--- a/OpenKeychain/src/main/res/raw-fi/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-fi/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_changelog.html b/OpenKeychain/src/main/res/raw-fr/help_changelog.html
index da2d7eada..97b42c6a6 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_changelog.html
@@ -4,7 +4,7 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Correctif - Exportation des clefs vers des fichiers (vraiment, maintenant)</li>
</ul>
<h2>3.1.1</h2>
<ul>
@@ -54,7 +54,7 @@
<li>Correctif - Utilisation de clefs dépouillées</li>
<li>SHA256 par défaut pour la compatibilité</li>
<li>L'API des intentions a changé, voir https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
-<li>L'API d'OpenPGP gère maintenant les clefs révoquées/expirées et retourne tous les ID d'utilisateurs</li>
+<li>L'API d'OpenPGP gère maintenant les clefs révoquées/expirées et retourne tous les ID utilisateurs</li>
</ul>
<h2>2.9</h2>
<ul>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Correctif -Déchiffrement de messages/fichiers pgp symétriques</li>
+<li>Correctif - Déchiffrement des messages/fichiers symétriques OpenPGP</li>
<li>Écran de modification des clefs remanié (merci à Ash Hughes)</li>
<li>Nouvelle conception moderne pour les écrans de chiffrement/déchiffrement</li>
<li>API OpenPGP version 3 (comptes multiples d'api, correctifs internes, recherche de clefs)</li>
@@ -114,7 +114,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>Prise en charge des ports des serveurs de clefs</li>
<li>Désactiver la possibilité de générer des clefs faibles</li>
<li>Encore plus de travail interne dans l'API</li>
-<li>Certifier les ID d'utilisateurs</li>
+<li>Certifier les ID utilisateurs</li>
<li>Requêtes des serveurs de clefs basées sur des sorties assimilables par la machine</li>
<li>Verrouiller les tiroirs de navigation sur les tablettes</li>
<li>Suggestion de courriels à la création de clefs</li>
@@ -132,7 +132,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>Plus de 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 - Mise en page et du style des fenêtres de dialogue sur Android 2.2-3.0</li>
-<li>Correctif - Plantage pour les clefs avec des ID d'utilisateur vides</li>
+<li>Correctif - Plantage pour les clefs avec des ID utilisateur vides</li>
<li>Correctif - Plantage et 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>Correctif - Téléversement d'une clef depuis l'écran de signature</li>
@@ -213,7 +213,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>Listes de clefs filtrables</li>
<li>Présélection plus intelligente des clefs de chiffrement</li>
<li>Nouvelle gestion des intentions pour VIEW et SEND, permet le chiffrement/déchiffrement des fichiers depuis les gestionnaires de fichiers</li>
-<li>Correctifs et fonctions additionnelles (présélection des clefs) pour K-9-Mail, nouvelle version bêta disponible</li>
+<li>Correctifs et fonctions additionnelles (présélection des clefs) pour K-9-Mail, nouvelle version bêta proposée</li>
</ul>
<h2>1.0.1</h2>
<ul>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_start.html b/OpenKeychain/src/main/res/raw-fr/help_start.html
index 5440125ea..030a429e0 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_start.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_start.html
@@ -4,7 +4,7 @@
<h2>Commencer</h2>
<p>Vous avez d'abord besoin d'une clef personnelle. Créez-en une avec l'option du menu « Clefs » ou importez des clefs secrètes existantes. Ensuite vous pourrez télécharger les clefs de vos amis, ou les échanger par codes QR ou NFC.</p>
-<p>Sur les versions d'Android antérieures à 4.4, il vous est recommandé d'installer le<a href="market://details?id=org.openintents.filemanager">gestionnaire de fichiers OI</a> pour une sélection améliorée des fichiers. Pour le partage par codes QR, installez le <a href="market://details?id=com.google.zxing.client.android">lecteur de codes à barres</a>. Cliquer sur les liens ouvrira Google Play Store ou F-Droid pour l'installation</p>
+<p>Sur les versions d'Android antérieures à 4.4, il vous est recommandé d'installer le<a href="market://details?id=org.openintents.filemanager">gestionnaire de fichiers OI</a> pour une sélection améliorée des fichiers.</p>
<h2>J'ai trouvé un bogue dans OpenKeychain !</h2>
<p>Veuillez rapporter le bogue en utilisant le <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">gestionnaire de bogue d'OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_wot.html b/OpenKeychain/src/main/res/raw-fr/help_wot.html
index c15e6eefd..6763b8969 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_wot.html
@@ -1,17 +1,17 @@
<html>
<head></head>
<body>
-<h2>Toile confiance</h2>
-<p>La toile de confiance décrit la partie de PGP qui s'occupe de la création et du suivi des certifications. Elle fournit des mécanismes pour aider l'utilisateur à suivre à qui appartient une clef publique, et partager cette information avec les autres. Pour assurer la confidentialité d'une communication chiffrée, il est essentiel de savoir que la clef publique vers laquelle vous chiffrez appartient à la personne à qui vous croyez qu'elle appartient.</p>
+<h2>Toile de confiance</h2>
+<p>La toile de confiance décrit la partie d'OpenPGP qui s'occupe de la création et du suivi des certifications. Elle fournit des mécanismes pour aider l'utilisateur à suivre à qui appartient une clef publique, et partager cette information avec d'autres. Pour assurer la confidentialité d'une communication chiffrée, il est essentiel de savoir que la clef publique vers laquelle vous chiffrez appartient à la personne à qui vous croyez qu'elle appartient.</p>
<h2>Prise en charge dans OpenKeychain</h2>
<p>OpenKeychain offre seulement une prise en charge de base de la toile de confiance. Un travail important est en cours et ceci pourrait changer dans les versions à venir.</p>
<h2>Modèle de confiance</h2>
-<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>
+<p>L'évaluation de la confiance est fondée sur la simple supposition que toutes les clefs proposant des clefs secrètes sont de confiance. Les clefs publiques contenant au moins un ID 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'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>
+<p>La prise en charge de la certification des clefs est proposée et les ID 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-is/help_changelog.html b/OpenKeychain/src/main/res/raw-is/help_changelog.html
index 4d3d293ac..0cb7d5210 100644
--- a/OpenKeychain/src/main/res/raw-is/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-is/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-is/help_start.html b/OpenKeychain/src/main/res/raw-is/help_start.html
index 4f029ab37..92fd4a92a 100644
--- a/OpenKeychain/src/main/res/raw-is/help_start.html
+++ b/OpenKeychain/src/main/res/raw-is/help_start.html
@@ -4,7 +4,7 @@
<h2>Getting started</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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>
diff --git a/OpenKeychain/src/main/res/raw-is/help_wot.html b/OpenKeychain/src/main/res/raw-is/help_wot.html
index 29790139b..2a551f79c 100644
--- a/OpenKeychain/src/main/res/raw-is/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-is/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>
diff --git a/OpenKeychain/src/main/res/raw-it/help_changelog.html b/OpenKeychain/src/main/res/raw-it/help_changelog.html
index f56362c11..bbb765bc3 100644
--- a/OpenKeychain/src/main/res/raw-it/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-it/help_changelog.html
@@ -4,23 +4,23 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Corretta esportazione chiavi su file (ora per davvero)</li>
</ul>
<h2>3.1.1</h2>
<ul>
-<li>Fix key export to files (they were written partially)</li>
-<li>Fix crash on Android 2.3</li>
+<li>Corretta esportazione chiavi su file (la scrittura era parziale)</li>
+<li>Corretto crash su Android 2.3</li>
</ul>
<h2>3.1</h2>
<ul>
-<li>Fix crash on Android 5</li>
-<li>New certify screen</li>
-<li>Secure Exchange directly from key list (SafeSlinger library)</li>
-<li>New QR Code program flow</li>
-<li>Redesigned decrypt screen</li>
-<li>New icon usage and colors</li>
-<li>Fix import of secret keys from Symantec Encryption Desktop</li>
-<li>Subkey IDs on Yubikeys are now checked correctly</li>
+<li>Corretto crash su Android 5</li>
+<li>Nuova schermata di certificazione</li>
+<li>Scambio sicuro direttamente dalla lista delle chiavi (libreria SafeSlinger)</li>
+<li>Nuovo programma di flusso QR Code</li>
+<li>Schermata di decodifica ridisegnata</li>
+<li>Nuove icone e colori</li>
+<li>Corretta importazione di chiavi segrete da Symantec Encryption Desktop</li>
+<li>ID delle sottochiavi Yubikey sono controllati correttamente</li>
</ul>
<h2>3.0.1</h2>
<ul>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Corretta la decodifica di messaggi PGP / file simmetrici</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactoring della schermata di modifica chiave (grazie a Ash Hughes)</li>
<li>Nuovo design moderno per le schermate di codifica / decodifica</li>
<li>OpenPGP API versione 3 (api account multipli, correzioni interne, ricerca chiavi)</li>
diff --git a/OpenKeychain/src/main/res/raw-it/help_start.html b/OpenKeychain/src/main/res/raw-it/help_start.html
index e75b209ff..ecf52eadd 100644
--- a/OpenKeychain/src/main/res/raw-it/help_start.html
+++ b/OpenKeychain/src/main/res/raw-it/help_start.html
@@ -4,7 +4,7 @@
<h2>Per iniziare</h2>
<p>In primo luogo è necessaria una chiave segreta personale. Creane una tramite il menu opzioni sotto la voce "Chiavi" o importa chiavi segrete già esistenti. Successivamente, è possibile scaricare le chiavi dei vostri amici o scambiarle con i codici QR o NFC.</p>
-<p>In Android precedente 4.4, si raccomanda di installare <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> per una migliore selezione dei file. Per condividere via Codici QR <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. I collegamenti verranno aperti in Google Play Store o F-Droid per l'installazione.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>Ho trovato un bug in OpenKeychain!</h2>
<p>Per favore riporta i bug usando il <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">issue tracker di OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-it/help_wot.html b/OpenKeychain/src/main/res/raw-it/help_wot.html
index 98e3aafea..09b38199b 100644
--- a/OpenKeychain/src/main/res/raw-it/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-it/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Rete di Fiducia</h2>
-<p>La Rete di Fiducia descrive la parte del PGP che si occupa di creazione e gestione delle certificazioni. Essa fornisce meccanismi per aiutare l'utente a tenere traccia di chi appartiene una chiave pubblica, e condividere queste informazioni con gli altri; Per garantire la privacy della comunicazione crittografata, è essenziale sapere che la chiave pubblica per crittografare appartiene alla persona che si pensa.</p>
+<p>The Web of Trust describes the part of OpenPGP 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>Supporto in OpenKeychain</h2>
<p>Esiste solo un supporto di base per le Reti di Fiducia in OpenKeychain. Questo è un grosso lavoro in corso e soggetto a modifiche nei prossimi rilasci.</p>
diff --git a/OpenKeychain/src/main/res/raw-ja/help_changelog.html b/OpenKeychain/src/main/res/raw-ja/help_changelog.html
index c682d870b..f6ceaa427 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_changelog.html
@@ -4,11 +4,11 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>鍵のファイルへのエクスポートの修正 (現実的になりました)</li>
</ul>
<h2>3.1.1</h2>
<ul>
-<li>鍵のファイルへのエクスポートの修正 (私たちは部分的に作成)</li>
+<li>鍵のファイルへのエクスポートの修正 (部分的に修正)</li>
<li>Android 2.3でのクラッシュ修正</li>
</ul>
<h2>3.1</h2>
@@ -106,7 +106,7 @@
</ul>
<h2>2.4</h2>
<p>このリリースにおいて適用したリッチでバグのない機能を作ってくれたGoogle Summer of Code 2014の参加者たちに感謝を!
-また、以下の人達(アルファベット順)の作ってくれたいくつもののさなパッチや相当数のパッチにも:
+また、以下の人達(アルファベット順)の作ってくれたいくつもの小さなパッチや相当数のパッチにも:
Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p>
<ul>
<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 db9841568..d9f73428a 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_start.html
@@ -4,7 +4,7 @@
<h2>入門</h2>
<p>最初にあなたの個人用鍵ペアが必要になります。メニューの"鍵"で生成するか、既存の鍵ペアをインポートします。その後、あなたの友人の鍵をダウンロード、もしくはQRコードやNFCで交換します。</p>
-<p>Android 4.4 以下の場合、拡張したファイルの選択のためには<a href="market://details?id=org.openintents.filemanager">OI File Manager</a>のインストールを推奨します。QRコードの共有には<a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>です。このリンクをクリックすると Google Play ストアか F-Droid が開きます。</p>
+<p>Android 4.4 未満の場合、拡張したファイルの選択のためには<a href="market://details?id=org.openintents.filemanager">OI File Manager</a>のインストールを推奨します。</p>
<h2>OpenKeychainでバグを見付けた!</h2>
<p><a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">OpenKeychainのIssueトラッカー</a>を使ってバグレポートを送ってください。</p>
diff --git a/OpenKeychain/src/main/res/raw-ja/help_wot.html b/OpenKeychain/src/main/res/raw-ja/help_wot.html
index 01b523d76..e4db99bb8 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>信頼の輪はOpenPGPの一面で証明の作成とその維持の一面を説明します。ユーザが公開鍵に属する者の追跡を維持し、他のユーザーとその情報を共有する手助けになるメカニズムを提供します。暗号化通信のプライバシーを確保するためには、あなたが暗号化したいという相手の公開鍵が必要な要素となります。</p>
<h2>OpenKeychainでサポート</h2>
<p>OpenKeychainで信頼の輪の基本のみサポートされます。とても重い作業を進めており今後やってくるリリースにおいて状態が変更されていきます。</p>
@@ -11,7 +11,7 @@
<p>信頼の評価はシンプルな仮定に基づいています、それはすべての鍵は秘密鍵が信頼できるというものです。公開鍵は信頼された鍵で検証された最低1つのユーザIDを含んでおり、それは鍵リストにおいて、緑でマークされます。ただしそれは他の既知の公開鍵の信頼レベルを特別なものには(まだ)しません。</p>
<h2>鍵の検証</h2>
-<p>鍵検証のサポートが提供されており、ユーザIDは個別に検証できます。ただしそれは他の既知の公開鍵の信頼レベルを特別なものにはまだしないか他の特別なタイプの証明です。</p>
+<p>鍵検証のサポートが提供されており、またユーザIDは個別に検証できます。ただしそれは他の既知の公開鍵の信頼レベルを特別なものにはしないローカルもしくは他の特別なタイプの証明です。</p>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-nl/help_about.html b/OpenKeychain/src/main/res/raw-nl/help_about.html
index 0bc9f6f70..33622b7c5 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_about.html
+++ b/OpenKeychain/src/main/res/raw-nl/help_about.html
@@ -5,9 +5,9 @@
<p><a href="http://www.openkeychain.org">OpenKeychain</a> is een OpenPGP implementatie voor Android.</p>
<p>Licentie: GPLv3+</p>
-<h2>Developers</h2>
+<h2>Ontwikkelaars</h2>
<ul>
-<li>Dominik Schürmann (Maintainer)</li>
+<li>Dominik Schürmann (beheerder)</li>
<li>Art O Cathain</li>
<li>Ash Hughes</li>
<li>Brian C. Barnes</li>
@@ -35,13 +35,13 @@
<li>
<a href="http://developer.android.com/tools/support-library/index.html">Android Support Bibliotheek v7 'appcompat'</a> (Apache Licentie v2)</li>
<li>
-<a href="https://github.com/timbray/KeybaseLib">KeybaseLib</a> (Apache License v2)</li>
+<a href="https://github.com/timbray/KeybaseLib">KeybaseLib</a> (Apache-licentie v2)</li>
<li>
-<a href="https://github.com/JohnPersano/SuperToasts">SuperToasts</a> (Apache License v2)</li>
+<a href="https://github.com/JohnPersano/SuperToasts">SuperToasts</a> (Apache-licentie v2)</li>
<li>
-<a href="https://github.com/splitwise/TokenAutoComplete">TokenAutoComplete</a> (Apache License v2)</li>
+<a href="https://github.com/splitwise/TokenAutoComplete">TokenAutoComplete</a> (Apache-licentie v2)</li>
<li>
-<a href="https://github.com/rtreffer/minidns">MiniDNS</a> (Apache License v2)</li>
+<a href="https://github.com/rtreffer/minidns">MiniDNS</a> (Apache-licentie v2)</li>
<li>
<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache Licentie v2)</li>
<li>
@@ -51,7 +51,7 @@
<li>
<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache Licentie v2)</li>
<li>
-<a href="https://github.com/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT License)</li>
+<a href="https://github.com/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT-licentie)</li>
</ul>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-nl/help_changelog.html b/OpenKeychain/src/main/res/raw-nl/help_changelog.html
index 4d3d293ac..809ffa6e6 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-nl/help_changelog.html
@@ -4,228 +4,228 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Oplossing voor exporteren van sleutels naar bestanden (deze keer echt)</li>
</ul>
<h2>3.1.1</h2>
<ul>
-<li>Fix key export to files (they were written partially)</li>
-<li>Fix crash on Android 2.3</li>
+<li>Oplossing voor exporteren van sleutels naar bestanden (ze werden maar gedeeltelijk geschreven)</li>
+<li>Oplossing voor crash op Android 2.3</li>
</ul>
<h2>3.1</h2>
<ul>
-<li>Fix crash on Android 5</li>
-<li>New certify screen</li>
-<li>Secure Exchange directly from key list (SafeSlinger library)</li>
-<li>New QR Code program flow</li>
-<li>Redesigned decrypt screen</li>
-<li>New icon usage and colors</li>
-<li>Fix import of secret keys from Symantec Encryption Desktop</li>
-<li>Subkey IDs on Yubikeys are now checked correctly</li>
+<li>Oplossing voor crash op Android 5</li>
+<li>Nieuw certificeerscherm</li>
+<li>Veilig uitwisselen vanuit sleutellijst (SafeSlinger bibliotheek)</li>
+<li>Nieuwe QR code programma flow</li>
+<li>Nieuw design voor ontcijferingsscherm</li>
+<li>Nieuw icoon en kleuren</li>
+<li>Oplossing voor importeren van geheime sleutels van Symantec Encryption Desktop</li>
+<li>Subsleutel-ID's op Yubikeys worden nu currect gecontroleerd</li>
</ul>
<h2>3.0.1</h2>
<ul>
-<li>Better handling of large key imports</li>
-<li>Improved subkey selection</li>
+<li>Grote sleutelimportaties worden beter behandeld</li>
+<li>Subsleutelselectie verbeterd</li>
</ul>
<h2>3.0</h2>
<ul>
-<li>Full support for Yubikey signature generation and decryption!</li>
-<li>Propose installable compatible apps in apps list</li>
-<li>New design for decryption screens</li>
-<li>Many fixes for key import, also fixes stripped keys</li>
-<li>Honor and display key authenticate flags</li>
-<li>User interface to generate custom keys</li>
-<li>Fixing user id revocation certificates</li>
-<li>New cloud search (searches over traditional keyservers and keybase.io)</li>
-<li>Support for stripping keys inside OpenKeychain</li>
+<li>Volledige ondersteuning voor Yubikey ondertekeningsgeneratie en ontcijfering!</li>
+<li>Stel installeerbare compatibele apps voor in apps-lijst</li>
+<li>Nieuw design voor ontcijferingsschermen</li>
+<li>Veel oplossingen voor sleutelimporteren, lost ook gestripte sleutels op</li>
+<li>Eer en toon sleutelauthenticatievlaggen</li>
+<li>Gebruikersinterface om eigen sleutels aan te maken</li>
+<li>Oplossing voor gebruikers-ID-intrekkingscertificaten</li>
+<li>Nieuwe cloud search (zoekt op traditionele sleutelservers en keybase.io)</li>
+<li>Ondersteuning voor strippen van sleutels in OpenKeychain</li>
</ul>
<h2>2.9.2</h2>
<ul>
-<li>Fix keys broken in 2.9.1</li>
-<li>Yubikey decryption now working via API</li>
+<li>Oplossing voor gebroken sleutels in 2.9.1</li>
+<li>Yubikey ontsleuteling werkt nu via API</li>
</ul>
<h2>2.9.1</h2>
<ul>
-<li>Split encrypt screen into two</li>
-<li>Fix key flags handling (now supporting Mailvelope 0.7 keys)</li>
-<li>Improved passphrase handling</li>
-<li>Key sharing via SafeSlinger</li>
-<li>Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain</li>
-<li>Fix usage of stripped keys</li>
-<li>SHA256 as default for compatibility</li>
-<li>Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
-<li>OpenPGP API now handles revoked/expired keys and returns all user ids</li>
+<li>Deel versleutelingsscherm in twee</li>
+<li>Oplossing voor sleutelvlaggen (ondersteunt nu Mailvelope 0.7 sleutels)</li>
+<li>Verbeterde behandeling van wachtwoorden</li>
+<li>Sleutels delen via SafeSlinger</li>
+<li>Yubikey: optie om andere PINs toe te staan, momenteel werkt enkel ondertekenen via de OpenPGP API, niet in OpenKeychain zelf</li>
+<li>Oplossing voor gestripte sleutels</li>
+<li>SHA256 als standaard voor compatibiliteit</li>
+<li>Intent API is veranderd, zie https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
+<li>OpenPGP API behandelt nu ingetrokken/verlopen sleutels en geeft alle gebruikers-ID's weer</li>
</ul>
<h2>2.9</h2>
<ul>
-<li>Fixing crashes introduced in v2.8</li>
-<li>Experimental ECC support</li>
-<li>Experimental Yubikey support (signing-only with imported keys)</li>
+<li>Oplossing voor crashes geïntroduceerd in v2.8</li>
+<li>Experimentele ondersteuning voor ECC</li>
+<li>Experimentele ondersteuning voor Yubikey (alleen ondertekenen met geïmporteerde sleutels)</li>
</ul>
<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 key creation 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>
-<li>Keys are connected to Android's contacts</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>
+<li>Er zijn zoveel bugs opgelost in deze release dat we kunnen focussen op de belangrijke nieuwe mogelijkheden</li>
+<li>Sleutels wijzigen: nieuw design, sleutels intrekken</li>
+<li>Sleutels importeren: nieuw design, veilige verbindingen met sleutelservers via hkps, sleutelserver resolving via DNS SRV records</li>
+<li>Nieuw eerste gebruiksscherm</li>
+<li>Nieuw scherm voor sleutels aanmaken: automatisch aanvullen van naam en e-mailadres gebaseerd op persoonlijke Android-accounts</li>
+<li>Bestandsversleuteling: nieuw design, ondersteuning voor versleutelen van meerdere bestanden</li>
+<li>Nieuwe iconen om sleutelstatus weer te geven (door Brennan Novak)</li>
+<li>Belangrijke bugfix: importeren van grote sleutelbossen uit een bestand is nu mogelijk</li>
+<li>Melding om gecachete wachtwoorden weer te geven</li>
+<li>Sleutels worden verbonden aan Android's contacten</li>
+</ul>
+<p>Deze release zou niet mogelijk zijn zonder het werkt van 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>
-<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>
+<li>Paars! (Dominik, Vincent)</li>
+<li>Nieuw design voor bekijken van sleutels (Dominik, Vincent)</li>
+<li>Nieuwe platte Android-knoppen (Dominik, Vincent)</li>
+<li>API-oplossingen (Dominik)</li>
+<li>Importeren uit keybase.io (Tim Bray)</li>
</ul>
<h2>2.6.1</h2>
<ul>
-<li>Some fixes for regression bugs</li>
+<li>Enkele oplossingen voor regressies</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>Sleutelcertificaties (dank aan Vincent Breitmoser)</li>
+<li>Ondersteuning voor GnuPG gedeeltelijke geheime sleutels (dank aan Vincent Breitmoser)</li>
+<li>Nieuw design voor ondertekeningsverificatie</li>
+<li>Aangepaste sleutellengte (dank aan Greg Witczak)</li>
+<li>Oplossing voor delen vanuit andere apps</li>
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
-<li>Refactored key edit 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>
+<li>Oplossing voor ontcijfering van symmetrische OpenPGP berichten/bestanden</li>
+<li>Nieuw ontwerp voor sleutelbewerkingsscherm (dank aan Ash Hughes)</li>
+<li>Nieuw modern design voor versleutelings/ontcijferingsschermen</li>
+<li>OpenPGP API versie 3 (meerdere API accounts, interne fixes, zoeken naar sleutels)</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):
+<p>Dank aan alle deelnemers aan Google Summer of Code 2014 die deze release zo vol mogelijkheden en zonder bugs hebben gemaakt!
+Buiten verschillende kleine patches, werden een groot aantal patches gemaakt door volgende personen (alfabetisch gerangschikt):
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>Nieuwe geünificeerde sleutellijst</li>
+<li>Gekleurde sleutelvingerafdruk</li>
+<li>Ondersteuning voor sleutelserver-poorten</li>
+<li>Zet mogelijkheid om zwakke sleutels aan te maken uit</li>
+<li>Veel meer intern werk aan API</li>
+<li>Certificeer gebruikers-ID's</li>
+<li>Sleutelserverzoekopdracht gebaseerd op machine-leesbare output</li>
+<li>Zet navigatiedrawer op tablets vast</li>
+<li>Suggesties voor e-mailadress bij aanmaken van sleutels</li>
+<li>Zoeken in publieke sleutellijsten</li>
+<li>En veel more verbeteringen en fixes...</li>
</ul>
<h2>2.3.1</h2>
<ul>
-<li>Hotfix for crash when upgrading from old versions</li>
+<li>Hotfix voor crash bij upgraden van oude versies</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>
+<li>Verwijder onnodige export van publieke sleutels bij exporteren van geheime sleutel (dank aan Ash Hughes)</li>
+<li>Oplossing voor verloopdata op sleutels (dank aan Ash Hughes)</li>
+<li>Meer interne fixes by bewerken van sleutels (dank aan Ash Hughes)</li>
+<li>Zoeken op sleutelservers rechtstreeks van importscherm</li>
+<li>Oplossing voor layout en dialoogstijl op Android 2.2-3.0</li>
+<li>Oplossing voor crash op sleutels met lege gebruikers-ID's</li>
+<li>Oplossing voor crash en lege lijsten bij terugkeren van ondertekeningsscherm</li>
+<li>Bouncy Castle (cryptografie-bibliotheek) geüpdatet van 1.47 naar 1.50 en built from source</li>
+<li>Oplossing voor uploaden van sleutel van ondertekeningsscherm</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>Nieuw design met navigatiebalk</li>
+<li>Nieuw publieke sleutellijst design</li>
+<li>Nieuwe publieke sleutel view</li>
+<li>Bugfixes voor importeren van sleutels</li>
+<li>Sleutel certificatie (dank aan Ash Hughes)</li>
+<li>Behandel UTF-8 wachtwoorden correct (dank aan Ash Hughes)</li>
+<li>Eerste versie met nieuwe talen (dank aan de medewerkers op Transifex)</li>
+<li>Delen van sleutels via QR codes opgelost en verbeterd</li>
+<li>Pakketondertekeningsverificatie voor API</li>
</ul>
<h2>2.1.1</h2>
<ul>
-<li>API Updates, preparation for K-9 Mail integration</li>
+<li>API updates, voorbereiding voor K-9 Mail integratie</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>
+<li>Veel bugfixes</li>
+<li>Nieuwe API voor ontwikkelaars</li>
+<li>PRNG bug fix door 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>Volledig nieuw design</li>
+<li>Publieke sleutels delen via QR codes, NFC beam</li>
+<li>Sleutels ondertekenen</li>
+<li>Upload sleutels naar server</li>
+<li>Importeerproblemen opgelost</li>
+<li>Nieuwe AIDL API</li>
</ul>
<h2>1.0.8</h2>
<ul>
-<li>Basic keyserver support</li>
-<li>App2sd</li>
-<li>More choices for passphrase cache: 1, 2, 4, 8, hours</li>
-<li>Translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)</li>
+<li>Basisondersteuning voor sleutelservers</li>
+<li>App2SD</li>
+<li>Meer keuzes voor wachtwoordcache: 1, 2, 4, 8 uur</li>
+<li>Vertalingen: Noors (bedankt, Sander Danielsen), Chinees (bedankt, Zhang Fredrick)</li>
<li>Bugfixes</li>
-<li>Optimizations</li>
+<li>Optimalisaties</li>
</ul>
<h2>1.0.7</h2>
<ul>
-<li>Fixed problem with signature verification of texts with trailing newline</li>
-<li>More options for passphrase cache time to live (20, 40, 60 mins)</li>
+<li>Probleem met ondertekeningsverificatie van text met achterlopende newline opgelost</li>
+<li>Meer opties voor wachtwoord cachetijd (20, 40, 60 min.)</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>Crash bij toevoegen van account op Froyo opgelost</li>
+<li>Veilige bestandsverwijdering</li>
+<li>Optie om sleutelbestand na importeren te verwijderen</li>
+<li>Stream versleuteling/ontcijfering (galerij, enz.)</li>
+<li>Nieuwe opties (taal, forceer v3 ondertekeningen)</li>
+<li>Wijzigingen in interface</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>Duitse en Italiaanse vertaling</li>
+<li>Veel kleiner pakket, door verminderde BC bronnen</li>
+<li>Nieuwe GUI voor voorkeuren</li>
+<li>Layout wijzigingen voor localisatie</li>
+<li>Bugfix voor ondertekeningen</li>
</ul>
<h2>1.0.4</h2>
<ul>
-<li>Fixed another crash caused by some SDK bug with query builder</li>
+<li>Een andere crash veroorzaakt door een SDK bug met de query builder opgelost</li>
</ul>
<h2>1.0.3</h2>
<ul>
-<li>Fixed crashes during encryption/signing and possibly key export</li>
+<li>Crashes tijdens versleuteling/ondertekenen en mogelijk sleutelexportatie opgelost</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>Filterbare sleutellijsten</li>
+<li>Slimmere preselectie van cryptosleutels</li>
+<li>Nieuwe Intents voor VIEW en SEND, laat toe bestanden te versleutelen/ontcijferen vanuit bestandsbeheerders</li>
+<li>Oplossingen en nieuwe functies (sleutel preselectie) voor K-9 Mail, nieuwe beta build beschikbaar</li>
</ul>
<h2>1.0.1</h2>
<ul>
-<li>GMail account listing was broken in 1.0.0, fixed again</li>
+<li>Oplijsten van GMail accounts werkte niet in 1.0.0, opgelost</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>K-9 Mail integratie, APG ondersteuning voor beta build van K-9 Mail</li>
+<li>Ondersteuning voor meer bestandsbeheerders (waaronder ASTRO)</li>
+<li>Sloveense vertaling</li>
+<li>Nieuwe database, veel sneller, minder geheugengebruik</li>
+<li>Intents en content provider voor andere apps gedefinieerd</li>
<li>Bugfixes</li>
</ul>
</body>
diff --git a/OpenKeychain/src/main/res/raw-nl/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-nl/help_nfc_beam.html
index 7ba0a2d1a..4caf75748 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_nfc_beam.html
+++ b/OpenKeychain/src/main/res/raw-nl/help_nfc_beam.html
@@ -3,10 +3,10 @@
<body>
<h2>Hoe sleutels te ontvangen</h2>
<ol>
-<li>Go to your partners keys and open the key you want to share.</li>
-<li>Houd de twee apparaten met de achterkant tegen elkaar (ze moeten elkaar bijna aanraken) en u zult een trilling voelen.</li>
-<li>Nadat het trilt zult u de inhoud op uw partners apparaat in een soort kaart zien veranderen met Star Trek warp snelheid-eruitziende animatie op de achtergrond.</li>
-<li>Druk op de kaart en de inhoud zal dan laden op het apparaat.</li>
+<li>Ga naar je partner's sleutels en open de sleutel die je wil delen.</li>
+<li>Houd de twee toestellen met de achterkant tegen elkaar (ze moeten elkaar bijna aanraken) en je zal een trilling voelen.</li>
+<li>Nadat het trilt zal je de inhoud op je partner's toestel in een soort kaart zien veranderen met Star Trek warp snelheid-eruitziende animatie op de achtergrond.</li>
+<li>Druk op de kaart en de inhoud zal dan laden op het toestel.</li>
</ol>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-nl/help_start.html b/OpenKeychain/src/main/res/raw-nl/help_start.html
index d159c4cf0..fda3c97b1 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_start.html
+++ b/OpenKeychain/src/main/res/raw-nl/help_start.html
@@ -2,15 +2,15 @@
<head></head>
<body>
<h2>Aan de slag</h2>
-<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>Eerst heb je een persoonlijke sleutel nodig. Maak er een aan via het menu in 'Sleutels' of importeer bestaande geheime sleutels. Nadien kan je de sleutels van je vrienden downloaden of ze uitwisselen via QR codes of NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>Op Android-versies lager dan 4.4 raden we aan dat je <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> installeert voor een verbeterde bestandsselectie.</p>
<h2>Ik heb een bug in OpenKeychain gevonden!</h2>
<p>Rapporteer de bug met de <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">problemen tracker van OpenKeychain</a>.</p>
<h2>Bijdragen</h2>
-<p>Als u ons wilt helpen om OpenKeychain te ontwikkelen door code bij te dragen, <a href="https://github.com/openpgp-keychain/openpgp-keychain#contribute-code">volg onze kleine gids op Github</a>.</p>
+<p>Als je ons wil helpen om OpenKeychain te ontwikkelen door code bij te dragen, <a href="https://github.com/openpgp-keychain/openpgp-keychain#contribute-code">volg onze kleine gids op Github</a>.</p>
<h2>Vertalingen</h2>
<p>Help OpenKeychain te vertalen! Iedereen kan deelnemen op <a href="https://www.transifex.com/projects/p/openpgp-keychain/">OpenKeychain op Transifex</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-nl/help_wot.html b/OpenKeychain/src/main/res/raw-nl/help_wot.html
index efaac3c1e..4c72a875c 100644
--- a/OpenKeychain/src/main/res/raw-nl/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-nl/help_wot.html
@@ -2,16 +2,16 @@
<head></head>
<body>
<h2>Web van Vertrouwen</h2>
-<p>het Web of Trust beschrijft het deel van PGP dat te maken heeft met aanmaken en boekhouden van certificaten. Het voorziet van mechanismes zodat de gebruiker bij kan houden van aan wie een publieke sleutel toebehoort, en deze informatie met anderen kan delen; om de privacy van versleutelde communicatie te verzekeren, is het essentiëel om te weten dat de publieke sleutel die u versleutelt, toebehoort aan de persoon aan wie u denkt dat het toebehoort.</p>
+<p>Het Web van Vertrouwen beschrijft het deel van OpenPGP dat te maken heeft met aanmaken en boekhouden van certificaten. Het voorziet van mechanismes zodat de gebruiker bij kan houden van aan wie een publieke sleutel toebehoort, en deze informatie met anderen kan delen; om de privacy van versleutelde communicatie te verzekeren, is het essentiëel om te weten dat de publieke sleutel die je versleutelt, toebehoort aan de persoon aan wie je denkt dat het toebehoort.</p>
-<h2>Support in OpenKeychain</h2>
-<p>Er is alleen basissupport voor Web van Vertrouwen in OpenKeychain. Dit is een zware 'werk in uitvoering' en onderwerp voor veranderingen in toekomstige releases.</p>
+<h2>Ondersteuning in OpenKeychain</h2>
+<p>Er is alleen basisondersteuning voor Web van Vertrouwen in OpenKeychain. Dit is een zware 'werk in uitvoering' en onderwerp voor veranderingen in toekomstige releases.</p>
-<h2>Vertrouwen Model</h2>
-<p>Vertrouwen evaluatie is gebaseerd om de simpele aanname dat alle sleutels die beschikbare geheime sleutels hebben, vertrouwd zijn. Publieke sleutels die minstens een gebruikers-id bevatten, gecertificeerd door een vertrouwde sleutel, zullen gemarkeerd worden met een groene stip in de sleutel lijsten. Het is (nog) niet mogelijk om vertrouwen niveaus voor certificaten van andere bekende publieke sleutels te specifiëren.</p>
+<h2>Vertrouwensmodel</h2>
+<p>Vertrouwensevaluatie is gebaseerd om de simpele aanname dat alle sleutels die beschikbare geheime sleutels hebben, vertrouwd zijn. Publieke sleutels die minstens een gebruikers-ID bevatten, gecertificeerd door een vertrouwde sleutel, zullen gemarkeerd worden met een groene stip in de sleutel lijsten. Het is (nog) niet mogelijk om vertrouwen niveaus voor certificaten van andere bekende publieke sleutels te specifiëren.</p>
-<h2>Sleutels certificeren</h2>
-<p>Support voor sleutelcertificatie is beschikbaar, en gebruikers-id's kunnen individueel gecertificeerd worden. Het is nog niet mogelijk om het niveau van vertrouwen te specifiëren om locale en andere speciale typen van certificaten te maken.</p>
+<h2>Bezig met certificeren van sleutels&lt;br&gt;</h2>
+<p>Ondersteuning voor sleutelcertificatie is beschikbaar, en gebruikers-ID's kunnen individueel gecertificeerd worden. Het is nog niet mogelijk om het niveau van vertrouwen te specifiëren om locale en andere speciale typen van certificaten te maken.</p>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-pl/help_changelog.html b/OpenKeychain/src/main/res/raw-pl/help_changelog.html
index 715e1aee6..07dcd04e2 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-pl/help_start.html b/OpenKeychain/src/main/res/raw-pl/help_start.html
index 967042b53..400a89e60 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_start.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_start.html
@@ -4,7 +4,7 @@
<h2>Pierwsze kroki</h2>
<p>Najpierw będziesz potrzebował osobistego klucza. Stwórz go wybierając z menu "Klucze" lub zaimportuj istniejące tajne klucze. Później możesz pobrać klucze swoich znajomych lub wymienić się używając kodów QR lub NFC.</p>
-<p>Na Androidzie niższym od wersji 4.4, zalecane jest zainstalowanie <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> w celu zapewnienia wygodniejszego wyboru plików. Aby dzielić się używając kodów QR zainstaluj <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Kliknięcie na powyższe linki przekieruje Cię do sklepu Google Play lub F-Droid w celu instalacji tych aplikacji.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>Znalazłem błąd w OpenKeychain!</h2>
<p>Zgłoś błąd korzystając z <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">systemu śledzenia błędów OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-pl/help_wot.html b/OpenKeychain/src/main/res/raw-pl/help_wot.html
index 29790139b..2a551f79c 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>
diff --git a/OpenKeychain/src/main/res/raw-pt/help_changelog.html b/OpenKeychain/src/main/res/raw-pt/help_changelog.html
index 4d3d293ac..0cb7d5210 100644
--- a/OpenKeychain/src/main/res/raw-pt/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-pt/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-pt/help_start.html b/OpenKeychain/src/main/res/raw-pt/help_start.html
index 4f029ab37..92fd4a92a 100644
--- a/OpenKeychain/src/main/res/raw-pt/help_start.html
+++ b/OpenKeychain/src/main/res/raw-pt/help_start.html
@@ -4,7 +4,7 @@
<h2>Getting started</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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>
diff --git a/OpenKeychain/src/main/res/raw-pt/help_wot.html b/OpenKeychain/src/main/res/raw-pt/help_wot.html
index 29790139b..2a551f79c 100644
--- a/OpenKeychain/src/main/res/raw-pt/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-pt/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>
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..2c6c5b3c4
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_about.html
@@ -0,0 +1,57 @@
+<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</h2>
+<ul>
+<li>Dominik Schürmann (Maintainer)</li>
+<li>Art O Cathain</li>
+<li>Ash Hughes</li>
+<li>Brian C. Barnes</li>
+<li>Bahtiar 'kalkin' Gadimov</li>
+<li>Daniel Albert</li>
+<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>Signe Rüsch</li>
+<li>Sreeram Boyapati</li>
+<li>Thialfihar (APG 1.x)</li>
+<li>Tim Bray</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="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/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT License)</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..0cb7d5210
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_changelog.html
@@ -0,0 +1,232 @@
+<html>
+<head></head>
+<body>
+
+<h2>3.1.2</h2>
+<ul>
+<li>Fix key export to files (now for real)</li>
+</ul>
+<h2>3.1.1</h2>
+<ul>
+<li>Fix key export to files (they were written partially)</li>
+<li>Fix crash on Android 2.3</li>
+</ul>
+<h2>3.1</h2>
+<ul>
+<li>Fix crash on Android 5</li>
+<li>New certify screen</li>
+<li>Secure Exchange directly from key list (SafeSlinger library)</li>
+<li>New QR Code program flow</li>
+<li>Redesigned decrypt screen</li>
+<li>New icon usage and colors</li>
+<li>Fix import of secret keys from Symantec Encryption Desktop</li>
+<li>Subkey IDs on Yubikeys are now checked correctly</li>
+</ul>
+<h2>3.0.1</h2>
+<ul>
+<li>Better handling of large key imports</li>
+<li>Improved subkey selection</li>
+</ul>
+<h2>3.0</h2>
+<ul>
+<li>Full support for Yubikey signature generation and decryption!</li>
+<li>Propose installable compatible apps in apps list</li>
+<li>New design for decryption screens</li>
+<li>Many fixes for key import, also fixes stripped keys</li>
+<li>Honor and display key authenticate flags</li>
+<li>User interface to generate custom keys</li>
+<li>Fixing user id revocation certificates</li>
+<li>New cloud search (searches over traditional keyservers and keybase.io)</li>
+<li>Support for stripping keys inside OpenKeychain</li>
+</ul>
+<h2>2.9.2</h2>
+<ul>
+<li>Fix keys broken in 2.9.1</li>
+<li>Yubikey decryption now working via API</li>
+</ul>
+<h2>2.9.1</h2>
+<ul>
+<li>Split encrypt screen into two</li>
+<li>Fix key flags handling (now supporting Mailvelope 0.7 keys)</li>
+<li>Improved passphrase handling</li>
+<li>Key sharing via SafeSlinger</li>
+<li>Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain</li>
+<li>Fix usage of stripped keys</li>
+<li>SHA256 as default for compatibility</li>
+<li>Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
+<li>OpenPGP API now handles revoked/expired keys and returns all user ids</li>
+</ul>
+<h2>2.9</h2>
+<ul>
+<li>Fixing crashes introduced in v2.8</li>
+<li>Experimental ECC support</li>
+<li>Experimental Yubikey support (signing-only with imported keys)</li>
+</ul>
+<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 key creation 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>
+<li>Keys are connected to Android's contacts</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>
+<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 OpenPGP messages/files</li>
+<li>Refactored key edit 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 passphrase 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 passphrase 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..966fb554a
--- /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 keys and open the key 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..92fd4a92a
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ro/help_start.html
@@ -0,0 +1,19 @@
+<html>
+<head></head>
+<body>
+<h2>Getting started</h2>
+<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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..2a551f79c
--- /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 OpenPGP 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_changelog.html b/OpenKeychain/src/main/res/raw-ru/help_changelog.html
index 4d3d293ac..6c22f1315 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_changelog.html
@@ -4,229 +4,229 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Исправление экспорта ключей в файл (на этот раз точно)</li>
</ul>
<h2>3.1.1</h2>
<ul>
-<li>Fix key export to files (they were written partially)</li>
-<li>Fix crash on Android 2.3</li>
+<li>Исправление экспорта ключей (записывались частично)</li>
+<li>Исправление падений на Android 2.3</li>
</ul>
<h2>3.1</h2>
<ul>
-<li>Fix crash on Android 5</li>
-<li>New certify screen</li>
-<li>Secure Exchange directly from key list (SafeSlinger library)</li>
-<li>New QR Code program flow</li>
-<li>Redesigned decrypt screen</li>
-<li>New icon usage and colors</li>
-<li>Fix import of secret keys from Symantec Encryption Desktop</li>
-<li>Subkey IDs on Yubikeys are now checked correctly</li>
+<li>Исправление падений на Android 5</li>
+<li>Новый диалог сертификации</li>
+<li>Безопасный обмен ключами из списка (SafeSlinger library)</li>
+<li>Новый обработчик QR кодов</li>
+<li>Изменение дизайна диалога расшифровки</li>
+<li>Использование новых иконок и цветов</li>
+<li>Исправлен импорт закрытых ключей из Symantec Encryption Desktop</li>
+<li>Корректная проверка идентификаторов доп. ключей на Yubikeys</li>
</ul>
<h2>3.0.1</h2>
<ul>
-<li>Better handling of large key imports</li>
-<li>Improved subkey selection</li>
+<li>Улучшение обработки импорта больших ключей</li>
+<li>Улучшение выбора доп. ключей</li>
</ul>
<h2>3.0</h2>
<ul>
-<li>Full support for Yubikey signature generation and decryption!</li>
-<li>Propose installable compatible apps in apps list</li>
-<li>New design for decryption screens</li>
-<li>Many fixes for key import, also fixes stripped keys</li>
-<li>Honor and display key authenticate flags</li>
-<li>User interface to generate custom keys</li>
-<li>Fixing user id revocation certificates</li>
-<li>New cloud search (searches over traditional keyservers and keybase.io)</li>
-<li>Support for stripping keys inside OpenKeychain</li>
+<li>Полная поддержка подписания и расшифровки с Yubikey!</li>
+<li>Предлагаются для установки совместимые программы</li>
+<li>Новый дизайн для диалога расшифровки</li>
+<li>Исправление ошибок импорта ключей и исправление сжатых ключей</li>
+<li>Обработка и отображение флагов ключей</li>
+<li>Пользовательский интерфейс для генерации ключей</li>
+<li>Исправление сертификатов отзыва</li>
+<li>Новый облачный поиск (ищет на традиционных серверах и keybase.io)</li>
+<li>Поддержка сжатых ключей в OpenKeychain</li>
</ul>
<h2>2.9.2</h2>
<ul>
-<li>Fix keys broken in 2.9.1</li>
-<li>Yubikey decryption now working via API</li>
+<li>Исправление ключей, сломанных в 2.9.1</li>
+<li>Расшифровка с Yubikey теперь работает через API</li>
</ul>
<h2>2.9.1</h2>
<ul>
-<li>Split encrypt screen into two</li>
-<li>Fix key flags handling (now supporting Mailvelope 0.7 keys)</li>
-<li>Improved passphrase handling</li>
-<li>Key sharing via SafeSlinger</li>
-<li>Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain</li>
-<li>Fix usage of stripped keys</li>
-<li>SHA256 as default for compatibility</li>
-<li>Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
-<li>OpenPGP API now handles revoked/expired keys and returns all user ids</li>
+<li>Разделение диалога шифрования на два окна</li>
+<li>Исправление обработки флагов ключей (теперь поддерживаются ключи Mailvelope 0.7)</li>
+<li>Улучшение обработчика паролей</li>
+<li>Передача ключей через SafeSlinger</li>
+<li>Yubikey: опция использования других PIN, пока работает только подписание через OpenPGP API, не внутри OpenKeychain</li>
+<li>Исправление использования сжатых ключей</li>
+<li>SHA256 по умолчанию для совместимости</li>
+<li>Изменение API. См. https://github.com/open-keychain/open-keychain/wiki/Intent-API</li>
+<li>OpenPGP API теперь обрабатывает отозванные/просроченные ключи и возвращает все идентификаторы</li>
</ul>
<h2>2.9</h2>
<ul>
-<li>Fixing crashes introduced in v2.8</li>
-<li>Experimental ECC support</li>
-<li>Experimental Yubikey support (signing-only with imported keys)</li>
+<li>Исправление падений, выявленных в 2.8</li>
+<li>Экспериментальная поддержка Эллиптических кривых</li>
+<li>Экспериментальная поддержка Yubikey (вход по импортированному ключу)</li>
</ul>
<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 key creation 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>
-<li>Keys are connected to Android's contacts</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>
+<li>Так много небольших исправлений, что лучше сообщить о существенных изменениях</li>
+<li>Изменение ключа: новый дизайн, аннулирование клуча</li>
+<li>Импорт ключа: усовершенствованный дизайн, безопасное соединение с серверами ключей по протоколу hkps, определение серверов по записям DNS SRV</li>
+<li>Новый диалог при первом запуске</li>
+<li>Экран создания ключа: автодополнение имени и адреса почты из учетной записи Android</li>
+<li>Шифрование файла: усовершенствованный дизайн, возможность шифрования нескольких файлов</li>
+<li>Новые иконки статуса ключа (Brennan Novak)</li>
+<li>Важное исправление: Теперь возможен импорт большого количества ключей из одного файла</li>
+<li>Уведомление о запомненных паролях</li>
+<li>Ключи соединяются с контактами Android</li>
+</ul>
+<p>Этот релиз стал возможен благодаря работе 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>
-<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>
+<li>Пурпурный! (Dominik, Vincent)</li>
+<li>Новый вид просмотра ключей (Dominik, Vincent)</li>
+<li>Новый вид кнопок в стиле Android (Dominik, Vincent)</li>
+<li>Исправления API (Dominik)</li>
+<li>Импорт Keybase.io (Tim Bray)</li>
</ul>
<h2>2.6.1</h2>
<ul>
-<li>Some fixes for regression bugs</li>
+<li>Исправления найденных ошибок</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>Сертификация ключей (благодаря Vincent Breitmoser)</li>
+<li>Поддержка частично-секретных ключей GnuPG (благодаря Vincent Breitmoser)</li>
+<li>Новый дизайн проверки подписи</li>
+<li>Произвольная длина ключей (благодаря Greg Witczak)</li>
+<li>Исправление ошибки получения данных от других приложений</li>
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
-<li>Refactored key edit 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>
+<li>Исправлено симметричное шифрование сообщений/файлов</li>
+<li>Переработано окно изменения ключа (благодаря Ash Hughes)</li>
+<li>Новый дизайн для окон шифрования/расшифровки</li>
+<li>OpenPGP API версии 3 (множественные аккаунты, внутренние исправления, поиск ключей)</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):
+<p>Спасибо всем участникам Google Summer of Code 2014, которые помогли сделать этот выпуск, добавив функции и исправив ошибки!
+Из общего числа патчей, особенный вклад внесли следующие люди (в алфавитном порядке):
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>Новый объединенный список ключей</li>
+<li>Цветовая индикация отпечатков ключей</li>
+<li>Поддержка портов серверов ключей</li>
+<li>Отключена возможность создавать слабые ключи</li>
+<li>Ещё больше улучшений работы API</li>
+<li>Сертификация пользовательских данных</li>
+<li>Запрос к серверу ключей основывается на машинном формате вывода</li>
+<li>Фиксация панели на планшетах</li>
+<li>Подсказки email при создании ключей</li>
+<li>Поиск в списках публичных ключей</li>
+<li>И множество других исправлений и улучшений...</li>
</ul>
<h2>2.3.1</h2>
<ul>
-<li>Hotfix for crash when upgrading from old versions</li>
+<li>Исправление ошибки при обновлении со старых версий</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>
+<li>Удален не требующийся экспорт публичного ключа при экспорте секретного ключа (спасибо, Ash Hughes)</li>
+<li>Исправлена ошибка срока годности ключей (спасибо, Ash Hughes)</li>
+<li>Исправления ошибок при изменении ключей (спасибо, Ash Hughes)</li>
+<li>Запрос ключа с сервера прямо из окна импорта ключей</li>
+<li>Исправление внешнего вида для Android 2.2-3.0</li>
+<li>Исправлено падение когда ключ не содержал идентификатор пользователя</li>
+<li>Исправлено падение и пустой список при возвращении из окна подписания</li>
+<li>Криптографическая библиотека Bouncy Castle обновлена с версии 1.47 до 1.50 и пересобрана</li>
+<li>Исправлена загрузка ключа из окна подписания</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>Новый дизайн с боковой панелью</li>
+<li>Новый дизайн списка ключей</li>
+<li>Новый вид просмотра ключа</li>
+<li>Исправление ошибок импорта ключей</li>
+<li>Кросс-сертификация ключей (спасибо, Ash Hughes)</li>
+<li>Правильная обработка паролей в UTF-8 (спасибо, Ash Hughes)</li>
+<li>Первая версия с новыми языками (спасибо переводчикам с Transifex)</li>
+<li>Исправление и улучшение передачи ключей через QR коды</li>
+<li>Проверка подписей пакетов для API</li>
</ul>
<h2>2.1.1</h2>
<ul>
-<li>API Updates, preparation for K-9 Mail integration</li>
+<li>Обновление API, подготовка к интеграции с K-9 Mail</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>
+<li>Множество исправлений ошибок</li>
+<li>Новый API для разработчиков</li>
+<li>Исправление ошибки генератора случайных чисел</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>Переработка дизайна</li>
+<li>Передача ключей через QR коды и NFC</li>
+<li>Подписание ключей</li>
+<li>Загрузка ключей на сервер</li>
+<li>Исправление проблем импорта</li>
+<li>Новый AIDL API</li>
</ul>
<h2>1.0.8</h2>
<ul>
-<li>Basic keyserver support</li>
-<li>App2sd</li>
-<li>More choices for passphrase 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>Поддержка серверов ключей</li>
+<li>App2SD</li>
+<li>Больше вариантов сохранения кэша пароля: 1, 2, 4, 8 часов</li>
+<li>Переводы: Норвежский (спасибо, Sander Danielsen), Китайский (спасибо, Zhang Fredrick)</li>
+<li>Исправления ошибок</li>
+<li>Оптимизация</li>
</ul>
<h2>1.0.7</h2>
<ul>
-<li>Fixed problem with signature verification of texts with trailing newline</li>
-<li>More options for passphrase cache time to live (20, 40, 60 mins)</li>
+<li>Исправление ошибки при проверке подписи текста с переводом строки</li>
+<li>Больше вариантов сохранения кэша пароля (20, 40, 60 минут)</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>Исправление ошибки создания записи на Froyo</li>
+<li>Безопасное удаление файлов</li>
+<li>Опция удаления файла ключа после импорта</li>
+<li>Передача шифрования (галерея и т.д.)</li>
+<li>Новые возможности (язык, v3 подписи)</li>
+<li>Изменения интерфейса</li>
+<li>Исправления ошибок</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>Новые языки: немецкий, итальянский</li>
+<li>Значительное уменьшение размера программы</li>
+<li>Новый интерфейс настроек</li>
+<li>Изменение вида для локализации</li>
+<li>Исправление ошибки подписи</li>
</ul>
<h2>1.0.4</h2>
<ul>
-<li>Fixed another crash caused by some SDK bug with query builder</li>
+<li>Исправление еще одной ошибки, возникающей в SDK</li>
</ul>
<h2>1.0.3</h2>
<ul>
-<li>Fixed crashes during encryption/signing and possibly key export</li>
+<li>Исправление ошибок при шифровании/подписании и экспорте ключей</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>Фильтр списка ключей</li>
+<li>Улучшение выбора ключей шифрования</li>
+<li>Добавлена возможность шифровать файлы прямо из файлового менеджера</li>
+<li>Исправления ошибок и новые возможности для интеграции с K-9 Mail</li>
</ul>
<h2>1.0.1</h2>
<ul>
-<li>GMail account listing was broken in 1.0.0, fixed again</li>
+<li>Исправление выбора учетной записи GMail, сломанного в 1.0.0</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>
+<li>интеграция с K-9 Mail, APG поддерживает beta-версию K-9 Mail</li>
+<li>Поддержка сторонних файловых менеджеров (в т.ч. ASTRO)</li>
+<li>Словенский перевод</li>
+<li>Новая база данных, еще быстрее и компактнее</li>
+<li>Добавлены обработчики для взаимодействия с другими приложениями</li>
+<li>Исправления ошибок</li>
</ul>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-ru/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-ru/help_nfc_beam.html
index 5ed10635d..fcf55cdaf 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_nfc_beam.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_nfc_beam.html
@@ -3,7 +3,7 @@
<body>
<h2>Как обменяться ключами</h2>
<ol>
-<li>Go to your partners keys and open the key you want to share.</li>
+<li>Нажмите и удерживайте ключ, который вы хотите передать.</li>
<li>Поднесите оба устройства вплотную обратными сторонами (до полного касания). Вы почувствуете небольшую вибрацию.</li>
<li>Как только устройства завибрируют, на экране появится карточка с передаваемым содержимым.</li>
<li>Нажмите на карточку, что бы передать данные (ключи) с одного устройства на другое.</li>
diff --git a/OpenKeychain/src/main/res/raw-ru/help_start.html b/OpenKeychain/src/main/res/raw-ru/help_start.html
index a9c200abb..1463d374d 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_start.html
@@ -2,9 +2,9 @@
<head></head>
<body>
<h2>Приступая</h2>
-<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>Для начала Вам нужен свой секретный ключ. Создайте его в меню раздела "Ключи" или импортируйте ранее созданный ключ. Позже вы сможете поделиться данными своего ключа с друзьями с помощью QR кода или NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>На Android ниже 4.4, рекомендуется установить <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> для выбора файлов.</p>
<h2>Я нашел ошибку в OpenKeychain!</h2>
<p>Пожалуйста, сообщайте о возникших проблемах и найденных ошибках в разделе <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">Решение проблем OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-ru/help_wot.html b/OpenKeychain/src/main/res/raw-ru/help_wot.html
index 53c862cbc..7fbde44d3 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Сеть доверия (WoT)</h2>
-<p>Сеть доверия (The Web of Trust) предоставляет механизм, определения принадлежности ключа именно тому пользователю, который в нём указан. Основа этой модели строится на знакомстве людей и сертификации своей подписью ключей своих знакомых. Не менее важно распространение этой информации среди других пользователей WoT.</p>
+<p>Сеть доверия (The Web of Trust) предоставляет механизм заверения ключей посредством присоединения и распространения информации о выполненной сертификации. Для гарантии безопасного зашифрованного общения крайне важно не сомневаться, что владельцем ключа является ваш собеседник.</p>
<h2>Поддержка в OpenKeychain</h2>
<p>В настоящее время реализованы только базовые возможности WoT. Работа в самом разгаре и в будущих версиях OpenKeychain будут появляться дополнительные возможности.</p>
diff --git a/OpenKeychain/src/main/res/raw-sl/help_changelog.html b/OpenKeychain/src/main/res/raw-sl/help_changelog.html
index ed1f88cad..943ba79f1 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-sl/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Popravek dešifriranja simetrično šifriranih sporočil pgp</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Popravki kode za okno 'uredi ključ' (hvala, Ash Hughes)</li>
<li>Nova, sodobna podoba za okno 'šifriranje/dešifriranje'</li>
<li>API OpenPGP, verzija 3 (podpora za več api računov, interni popravki, iskanje ključev)</li>
diff --git a/OpenKeychain/src/main/res/raw-sl/help_start.html b/OpenKeychain/src/main/res/raw-sl/help_start.html
index 276377723..2d0b763e0 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_start.html
+++ b/OpenKeychain/src/main/res/raw-sl/help_start.html
@@ -4,7 +4,7 @@
<h2>Kako začeti</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>Našel sem 'hrošča' v aplikaciji OpenKeychain!</h2>
<p>Za poročanje o 'hroščih' uporabite <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">sledilnik težav za OpenKeychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-sl/help_wot.html b/OpenKeychain/src/main/res/raw-sl/help_wot.html
index 62cdf8094..224110e18 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-sl/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Omrežje zaupanja</h2>
-<p>Omrežje zaupanja je del PGP-ja, ki se dotika ustvarjanja, urejanja in hranjenja ključev. Ponuja nam orodja za vodenje evidence ključev in njihovih lastnikov, ter deljenje teh informacij z drugimi. Za zagotavljanje zasebnosti šifrirane komunikacije je bistvenega pomena, da vemo, da ključ s katerim šifriramo določeno vsebino resnično pripada osebi, ki ji je ta vsebina namenjena.</p>
+<p>The Web of Trust describes the part of OpenPGP 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>Podpora v OpenKeychain</h2>
<p>OpenKeychain ponuja zgolj osnovno podporo za 'Omrežje zaupanja'. V prihodnjih različicah bomo to podporo še nadgrajevali in izboljševali.</p>
diff --git a/OpenKeychain/src/main/res/raw-sr/help_changelog.html b/OpenKeychain/src/main/res/raw-sr/help_changelog.html
index 5cd99d2fd..599498336 100644
--- a/OpenKeychain/src/main/res/raw-sr/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-sr/help_changelog.html
@@ -4,7 +4,7 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Поправка извоза кључева у фајлове (сада заиста)</li>
</ul>
<h2>3.1.1</h2>
<ul>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Поправка дешифровања симетричних пгп порука/фајлова</li>
+<li>Поправка дешифровања симетричних ОпенПГП порука/фајлова</li>
<li>Прерађен екран уређивања кључа (захваљујући Ешу Хјуџесу)</li>
<li>Нови модерни дизајн за екране шифровања/дешифровања</li>
<li>ОпенПГП АПИ издање 3 (вишеструки АПИ налози, унутрашње поправке, потрага кључа)</li>
diff --git a/OpenKeychain/src/main/res/raw-sr/help_start.html b/OpenKeychain/src/main/res/raw-sr/help_start.html
index 020f21137..a2f337a2f 100644
--- a/OpenKeychain/src/main/res/raw-sr/help_start.html
+++ b/OpenKeychain/src/main/res/raw-sr/help_start.html
@@ -4,7 +4,7 @@
<h2>Први кораци</h2>
<p>Најпре требате лични кључ. Направите један преко менија у „Кључеви“ или увезите постојеће тајне кључеве. Након тога, можете да преузмете пријатељеве кључеве или да их размените преко бар-кодова или НФЦ-а.</p>
-<p>За Андроид старији од 4.4 препоручује се да инсталирате <a href="market://details?id=org.openintents.filemanager">ОИ Менаџер фајлова</a> за побољшани избор фаjлова. Да бисте делили преко бар-кодова инсталирајте <a href="market://details?id=com.google.zxing.client.android">Скенер бар-кода</a>. Кликом на везе отворићете Гуглову Продавницу или Ф-Дроид за инсталацију.</p>
+<p>За Андроид старији од 4.4 препоручује се да инсталирате <a href="market://details?id=org.openintents.filemanager">ОИ Менаџер фајлова</a> за побољшани избор фаjлова.</p>
<h2>Пронађох грешку у Отвореном кључарнику!</h2>
<p>Пријавите грешку на <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">пратиоцу проблема за Отворени кључарник</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-sr/help_wot.html b/OpenKeychain/src/main/res/raw-sr/help_wot.html
index 91a75bd3c..713b3e331 100644
--- a/OpenKeychain/src/main/res/raw-sr/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-sr/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Веб Поверења</h2>
-<p>Веб поверења описује део ПГП-а који се бави прављењем и књиговодством сертификата. Пружа механизме који помажу кориснику у праћењу коме јавни кључ припада и дељењу ове информације са осталима; да би се осигурала приватност шифроване комуникације, нужно је знати да јавни кључ на који шифрујете припада особи којој и мислите да припада.</p>
+<p>Веб Поверења описује део ОпенПГП-а који се бави прављењем и спремањем сертификата. Пружа механизме који помажу кориснику у праћењу коме јавни кључ припада и дељењу ове информације са осталима; да би се осигурала приватност шифроване комуникације, нужно је знати да јавни кључ на који шифрујете припада особи којој и мислите да припада.</p>
<h2>Подршка у Отвореном кључарнику</h2>
<p>Постоји само основна подршка за Веб поверења у Отвореном кључарнику. Ово је велики посао у току и подложан променама у наредним издањима.</p>
diff --git a/OpenKeychain/src/main/res/raw-sv/help_changelog.html b/OpenKeychain/src/main/res/raw-sv/help_changelog.html
index 4d3d293ac..30ab97733 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-sv/help_changelog.html
@@ -4,28 +4,28 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>Fixade nyckelexport till filer (nu på riktigt)</li>
</ul>
<h2>3.1.1</h2>
<ul>
<li>Fix key export to files (they were written partially)</li>
-<li>Fix crash on Android 2.3</li>
+<li>Fixade krasch på Android 2.3</li>
</ul>
<h2>3.1</h2>
<ul>
-<li>Fix crash on Android 5</li>
-<li>New certify screen</li>
+<li>Fixade krasch på Android 5</li>
+<li>Ny certifieringsskärm</li>
<li>Secure Exchange directly from key list (SafeSlinger library)</li>
<li>New QR Code program flow</li>
-<li>Redesigned decrypt screen</li>
-<li>New icon usage and colors</li>
-<li>Fix import of secret keys from Symantec Encryption Desktop</li>
+<li>Omdesignad dekrypteringsskärm</li>
+<li>Nya ikoner och färger</li>
+<li>Fixade import av privata nycklar från Symantec Encryption Desktop</li>
<li>Subkey IDs on Yubikeys are now checked correctly</li>
</ul>
<h2>3.0.1</h2>
<ul>
-<li>Better handling of large key imports</li>
-<li>Improved subkey selection</li>
+<li>Bättre hantering av import av stora nycklar</li>
+<li>Förbättade markeringen av undernycklar</li>
</ul>
<h2>3.0</h2>
<ul>
@@ -58,32 +58,32 @@
</ul>
<h2>2.9</h2>
<ul>
-<li>Fixing crashes introduced in v2.8</li>
-<li>Experimental ECC support</li>
-<li>Experimental Yubikey support (signing-only with imported keys)</li>
+<li>Fixar krascher som uppstod i v2.8</li>
+<li>Experimentellt stöd för ECC</li>
+<li>Experimentellt stöd för Yubikey (endast signering med importerade nycklar)</li>
</ul>
<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>Nyckelredigering: ny design, nyckelåterkallelse</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>Ny första gången-skärm</li>
<li>New key creation 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>Filkryptering: ny design, stöd för att kryptera flera filer</li>
+<li>Nya ikoner för att visa nyckelstatus (av 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>
-<li>Keys are connected to Android's contacts</li>
+<li>Notis visar cachace lösenordsfraser</li>
+<li>Nycklar är anslutna till Androids kontakter</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>
-<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>
+<li>Lila! (Dominik, Vincent)</li>
+<li>Ny design av nyckelvy (Dominik, Vincent)</li>
+<li>Nya platta Android-knappar (Dominik, Vincent)</li>
+<li>API-fixar (Dominik)</li>
+<li>Import från Keybase.io (Tim Bray)</li>
</ul>
<h2>2.6.1</h2>
<ul>
@@ -93,15 +93,15 @@
<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>Ny design för verifiering av signaturer</li>
+<li>Anpassad nyckellängd (tack vare 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>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit screen (thanks to Ash Hughes)</li>
-<li>New modern design for encrypt/decrypt screens</li>
+<li>Ny modern design för kryptera-/dekryptera-skärmar</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)</li>
</ul>
<h2>2.4</h2>
@@ -110,11 +110,11 @@ Besides several small patches, a notable number of patches are made by the follo
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>Färglagda nyckelfingeravtryck</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>Certifiera användar-ID:n</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>
diff --git a/OpenKeychain/src/main/res/raw-sv/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-sv/help_nfc_beam.html
index 966fb554a..4e940a398 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_nfc_beam.html
+++ b/OpenKeychain/src/main/res/raw-sv/help_nfc_beam.html
@@ -1,12 +1,12 @@
<html>
<head></head>
<body>
-<h2>How to receive keys</h2>
+<h2>Hur man tar emot nycklar</h2>
<ol>
<li>Go to your partners keys and open the key 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>
+<li>Håll de två enheternas baksidor mot varandra (de måste nästan vidröras) och du känner av en vibration.</li>
+<li>Efter vibrationen kommer du att se innehållet på din partners enhet omvandlas till ett kortliknande föremål och en animation i bakgrunden som ser ut som Star Treks warp speed.</li>
+<li>Tryck på kortet och innehållet kommer att laddas på den andra personens enhet.</li>
</ol>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-sv/help_start.html b/OpenKeychain/src/main/res/raw-sv/help_start.html
index e7220f5e1..da1d90308 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_start.html
+++ b/OpenKeychain/src/main/res/raw-sv/help_start.html
@@ -2,15 +2,15 @@
<head></head>
<body>
<h2>Kom igång</h2>
-<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
+<p>Först behöver du en personlig nyckel. Skapa en via menyn i "Nycklar" eller importera en befintlig privat nyckel. Efteråt så kan du ladda ner dina vänners nycklar eller utbyta dem via QR-koder eller NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>I Android lägre än 4.4 rekommenderas det att du installerar <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> för förbättrad filurval.</p>
<h2>Jag hittade en bugg i 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>
+<p>Rapporterar buggen med <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">felrapporteringssystemen av OpenKeychain</a>.</p>
<h2>Bidra</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>
+<p>Om du vill hjälpa oss att utveckla OpenKeychain genom att bidra med kod <a href="https://github.com/openpgp-keychain/openpgp-keychain#contribute-code">, följ vår korta guide på Github</a>.</p>
<h2>Översättningar</h2>
<p>Hjälp till med att översätta OpenKeychain! Alla kan delta i <a href="https://www.transifex.com/projects/p/openpgp-keychain/">OpenKeychain på Transifex</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-sv/help_wot.html b/OpenKeychain/src/main/res/raw-sv/help_wot.html
index efada7bd8..68a2e3997 100644
--- a/OpenKeychain/src/main/res/raw-sv/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-sv/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Tillitsnät</h2>
-<p>Tillitsnätet beskriver den del av PGP som handlar om hur man skapar och bokför certifieringar. Det gör det möjligt för användaren att hålla reda på vem en publik nyckel tillhör, och dela denna information med andra; för att försäkra sig om integriteten i krypterad kommunikation är det avgörande att veta att den publika nyckel du krypterar till tillhör den person du tror att den gör.</p>
+<p>Tillitsnätet beskriver den del av OpenPGP som handlar om hur man skapar och bokför certifieringar. Det gör det möjligt för användaren att hålla reda på vem en publik nyckel tillhör, och dela denna information med andra; för att försäkra sig om integriteten i krypterad kommunikation är det avgörande att veta att den publika nyckel du krypterar till tillhör den person du tror att den gör.</p>
<h2>Stöd i OpenKeychain</h2>
<p>Endast grundläggande stöd för tillitsnät finns i OpenKeychain. Arbetet med funktionen pågår och den kan komma att ändras i kommande versioner.</p>
diff --git a/OpenKeychain/src/main/res/raw-sv/nfc_beam_share.html b/OpenKeychain/src/main/res/raw-sv/nfc_beam_share.html
index 083e055c7..b88771e70 100644
--- a/OpenKeychain/src/main/res/raw-sv/nfc_beam_share.html
+++ b/OpenKeychain/src/main/res/raw-sv/nfc_beam_share.html
@@ -2,10 +2,10 @@
<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>
+<li>Se till att NFC är påslaget i Inställningar &gt; Mer &gt; NFC och se även till att Android Beam är på i samma avdelning.</li>
+<li>Håll de två enheternas baksidor mot varandra (de måste nästan vidröras) och du känner av en vibration.</li>
+<li>Efter vibrationen kommer du att se innehållet på din enhet omvandlas till ett kortliknande föremål och en animation i bakgrunden som ser ut som Star Treks warp speed.</li>
+<li>Tryck på kortet och innehållet kommer att laddas på den andra personens enhet.</li>
</ol>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-tr/help_changelog.html b/OpenKeychain/src/main/res/raw-tr/help_changelog.html
index a7a8030c8..cb5cdaf36 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-tr/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-tr/help_start.html b/OpenKeychain/src/main/res/raw-tr/help_start.html
index 93674e794..bbcd0326c 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_start.html
+++ b/OpenKeychain/src/main/res/raw-tr/help_start.html
@@ -4,7 +4,7 @@
<h2>Başlarken</h2>
<p>Öncelikle kişisel bir anahtara ihtiyacınız var. "Anahtarlar" içindeki menüden bir tane oluşturabilir veya var olan gizli anahtarınızı içe aktarabilirsiniz. Daha sonra arkadaşlarınızın anahtarlarını indirebilir ya da QR Kodları veya NFC aracılığıyla değiş tokuş edebilirsiniz.</p>
-<p>Android 4.4 altındaki sürümlere gelişmiş dosya seçimi için <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> yüklenmesi önerilir. QR Kodları ile paylaşmak için <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> yükleyin. Bağlantılara tıkladığınızda yükleme için Google Play Store veya F-Droid açılır.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>OpenKeychain'de bir bug buldum!</h2>
<p>Lütfen bulduğunuz hataları <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">OpenKeychain sorun izleyici</a> kullanarak rapor edin.</p>
diff --git a/OpenKeychain/src/main/res/raw-tr/help_wot.html b/OpenKeychain/src/main/res/raw-tr/help_wot.html
index f80c1274f..f2282908b 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-tr/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>OpenKeychain Desteği</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>
diff --git a/OpenKeychain/src/main/res/raw-uk/help_changelog.html b/OpenKeychain/src/main/res/raw-uk/help_changelog.html
index 4d3d293ac..0cb7d5210 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-uk/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-uk/help_start.html b/OpenKeychain/src/main/res/raw-uk/help_start.html
index f2d2fe6f7..19197f6df 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_start.html
+++ b/OpenKeychain/src/main/res/raw-uk/help_start.html
@@ -4,7 +4,7 @@
<h2>Приступаючи до роботи</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>Я знайшов помилку в OpenPGP Keychain!</h2>
<p>Будь ласка, повідомте про ваду за допомогою <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">відстежувача проблем OpenPGP Keychain</a>.</p>
diff --git a/OpenKeychain/src/main/res/raw-uk/help_wot.html b/OpenKeychain/src/main/res/raw-uk/help_wot.html
index e1296472e..669aa0649 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-uk/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>Мережа довіри</h2>
-<p>Мережа довіри - The Web of Trust - надає механізм визначення приналежності ключа саме тому користувачеві, який в ньому зазначений. Основа цієї моделі будується на знайомстві людей та сертифікації своїм підписом ключів своїх знайомих. Не менш важливо поширення цієї інформації серед інших користувачів WoT.</p>
+<p>The Web of Trust describes the part of OpenPGP 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>Підтримка у OpenKeychain</h2>
<p>Наразі реалізовані тільки базові можливості WoT. Робота в самому розпалі, і в майбутніх версіях OpenKeychain будуть з'являтися додаткові можливості.</p>
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_about.html b/OpenKeychain/src/main/res/raw-zh-rTW/help_about.html
index 6c95c4afe..37b3a2ec6 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_about.html
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_about.html
@@ -7,7 +7,7 @@
<h2>銘謝</h2>
<ul>
-<li>Dominik Schürmann (Maintainer)</li>
+<li>Dominik Schürmann (維護人)</li>
<li>Art O Cathain</li>
<li>Ash Hughes</li>
<li>Brian C. Barnes</li>
@@ -31,27 +31,27 @@
<h2>函式庫</h2>
<ul>
<li>
-<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (Apache License v2)</li>
+<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (Apache授權條款 v2)</li>
<li>
-<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (Apache License v2)</li>
+<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (Apache授權條款 v2)</li>
<li>
-<a href="https://github.com/timbray/KeybaseLib">KeybaseLib</a> (Apache License v2)</li>
+<a href="https://github.com/timbray/KeybaseLib">KeybaseLib</a> (Apache授權條款 v2)</li>
<li>
-<a href="https://github.com/JohnPersano/SuperToasts">SuperToasts</a> (Apache License v2)</li>
+<a href="https://github.com/JohnPersano/SuperToasts">SuperToasts</a> (Apache授權條款 v2)</li>
<li>
-<a href="https://github.com/splitwise/TokenAutoComplete">TokenAutoComplete</a> (Apache License v2)</li>
+<a href="https://github.com/splitwise/TokenAutoComplete">TokenAutoComplete</a> (Apache授權條款 v2)</li>
<li>
-<a href="https://github.com/rtreffer/minidns">MiniDNS</a> (Apache License v2)</li>
+<a href="https://github.com/rtreffer/minidns">MiniDNS</a> (Apache授權條款 v2)</li>
<li>
-<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache License v2)</li>
+<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache授權條款 v2)</li>
<li>
-<a href="http://code.google.com/p/zxing/">ZXing</a> (Apache License v2)</li>
+<a href="http://code.google.com/p/zxing/">ZXing</a> (Apache授權條款 v2)</li>
<li>
-<a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (MIT X11 License)</li>
+<a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (MIT X11授權條款)</li>
<li>
-<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache License v2)</li>
+<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache授權條款 v2)</li>
<li>
-<a href="https://github.com/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT License)</li>
+<a href="https://github.com/SafeSlingerProject/exchange-android">SafeSlinger Exchange library</a> (MIT授權條款)</li>
</ul>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.html b/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.html
index 4d3d293ac..bf28ea2e0 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_changelog.html
@@ -4,22 +4,22 @@
<h2>3.1.2</h2>
<ul>
-<li>Fix key export to files (now for real)</li>
+<li>修正〝匯出金鑰到檔案〞功能(這次是真的了)</li>
</ul>
<h2>3.1.1</h2>
<ul>
-<li>Fix key export to files (they were written partially)</li>
-<li>Fix crash on Android 2.3</li>
+<li>修正〝匯出金鑰到檔案〞功能(部分完成)</li>
+<li>修正在Android 2.3上的崩潰</li>
</ul>
<h2>3.1</h2>
<ul>
-<li>Fix crash on Android 5</li>
-<li>New certify screen</li>
-<li>Secure Exchange directly from key list (SafeSlinger library)</li>
+<li>修正在Android 5上的崩潰</li>
+<li>新的認證畫面</li>
+<li>直接在金鑰清單進行安全的金鑰交換 (使用SafeSlinger程式庫)</li>
<li>New QR Code program flow</li>
-<li>Redesigned decrypt screen</li>
+<li>重新設計的解密畫面</li>
<li>New icon usage and colors</li>
-<li>Fix import of secret keys from Symantec Encryption Desktop</li>
+<li>修正從Symantec Encryption Desktop匯入密鑰的問題</li>
<li>Subkey IDs on Yubikeys are now checked correctly</li>
</ul>
<h2>3.0.1</h2>
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_start.html b/OpenKeychain/src/main/res/raw-zh-rTW/help_start.html
index ce6e388a8..44835cc46 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_start.html
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_start.html
@@ -4,7 +4,7 @@
<h2>快速上手</h2>
<p>首先你需要一支個人金鑰,通過選單來建立一支金鑰或是匯入現有私鑰。接下來,你可以下載你朋友的金鑰,或是通過QR條碼和NFC進行交換。</p>
-<p>Android 4.4以下的裝置可以下載<a href="market://details?id=org.openintents.filemanager">OI File Manager檔案總管</a>來選擇和加密檔案,要通過QR條碼分享需要先安裝<a href="market://details?id=com.google.zxing.client.android">條碼掃描器</a>。點選連結開啟Google Play商店或F-Droid進行安裝。</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>我在OpenKeychain發現問題!</h2>
<p>請通過<a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">OpenKeychain問題追蹤</a>回報問題。</p>
diff --git a/OpenKeychain/src/main/res/raw-zh-rTW/help_wot.html b/OpenKeychain/src/main/res/raw-zh-rTW/help_wot.html
index 3674f22c2..0db0d354f 100644
--- a/OpenKeychain/src/main/res/raw-zh-rTW/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-zh-rTW/help_wot.html
@@ -2,7 +2,7 @@
<head></head>
<body>
<h2>信任網</h2>
-<p>信任網描述了PGP建立與紀錄認證的部分,它提供使用者追蹤公鑰所有人並與他人分享此一資訊的機制。為了確保加密通訊的隱私,你必須確認用來加密的公鑰屬於你所期望的對象。</p>
+<p>The Web of Trust describes the part of OpenPGP 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>OpenKeychain的支援狀況</h2>
<p>目前OpenKeychain對信任網只有基本程度的支援。這是一件大工程,有任何進展將隨時發佈。</p>
diff --git a/OpenKeychain/src/main/res/raw-zh/help_changelog.html b/OpenKeychain/src/main/res/raw-zh/help_changelog.html
index 728d85c11..7bba18be8 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-zh/help_changelog.html
@@ -99,7 +99,7 @@
</ul>
<h2>2.5</h2>
<ul>
-<li>Fix decryption of symmetric pgp messages/files</li>
+<li>Fix decryption of symmetric OpenPGP messages/files</li>
<li>Refactored key edit 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>
diff --git a/OpenKeychain/src/main/res/raw-zh/help_start.html b/OpenKeychain/src/main/res/raw-zh/help_start.html
index 357f937c9..1290e109a 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_start.html
+++ b/OpenKeychain/src/main/res/raw-zh/help_start.html
@@ -4,7 +4,7 @@
<h2>快速上手指南</h2>
<p>首先你需要一个个人密钥。可以通过菜单创建一个密钥或者导入已有密钥。之后你就可以从网络下载朋友的密钥或者通过二维码和NFC功能交换密钥。</p>
-<p>安卓4.4一下版本可以通过该链接<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>. 点击链接可以从谷歌商店下载安装.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</p>
<h2>我在OpenKeychain發現問題!</h2>
<p>請利用 <a href="https://github.com/openpgp-keychain/openpgp-keychain/issues">OpenKeychain 項目回報系統</a>回報問題。</p>
diff --git a/OpenKeychain/src/main/res/raw-zh/help_wot.html b/OpenKeychain/src/main/res/raw-zh/help_wot.html
index 29790139b..2a551f79c 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_wot.html
+++ b/OpenKeychain/src/main/res/raw-zh/help_wot.html
@@ -2,7 +2,7 @@
<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>
+<p>The Web of Trust describes the part of OpenPGP 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>
diff --git a/OpenKeychain/src/main/res/raw/help_start.html b/OpenKeychain/src/main/res/raw/help_start.html
index d54780491..75fe9de26 100644
--- a/OpenKeychain/src/main/res/raw/help_start.html
+++ b/OpenKeychain/src/main/res/raw/help_start.html
@@ -8,7 +8,7 @@ And don't add newlines before or after p tags because of transifex -->
<h2>Getting started</h2>
<p>First you need a personal key. Create one via the menu in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection. To share via QR Codes install <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<p>On Android lower 4.4, it is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection.</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>
diff --git a/OpenKeychain/src/main/res/values-bg/strings.xml b/OpenKeychain/src/main/res/values-bg/strings.xml
new file mode 100644
index 000000000..233347bd3
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-bg/strings.xml
@@ -0,0 +1,69 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--GENERAL: Please put all strings inside quotes as described in example 1 on
+ http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <!--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-->
+ <!--Add keys-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--elliptic curve names-->
+ <!--not in for now, see SaveKeyringParcel
+ <string name="key_curve_bp_p256">"Brainpool P-256"</string>
+ <string name="key_curve_bp_p384">"Brainpool P-384"</string>
+ <string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Generic result toast-->
+ <!--Import result toast-->
+ <!--Delete result toast-->
+ <!--Certify result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <!--Other messages used in OperationLogs-->
+ <!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
+ <!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <!--PassphraseCache-->
+ <!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml
index 301f4a92a..903cc50f3 100644
--- a/OpenKeychain/src/main/res/values-cs/strings.xml
+++ b/OpenKeychain/src/main/res/values-cs/strings.xml
@@ -9,12 +9,12 @@
<string name="title_encrypt_text">Zašifrovat text</string>
<string name="title_encrypt_files">Zašifrovat soubory</string>
<string name="title_decrypt">Rozšifrovat</string>
- <string name="title_unlock">Heslo</string>
+ <string name="title_unlock">Odemknout klíč</string>
<string name="title_add_subkey">Přidat podklíč</string>
<string name="title_edit_key">Editovat klíč</string>
- <string name="title_preferences">Možnosti</string>
+ <string name="title_preferences">Nastavení</string>
+ <string name="title_cloud_search_preferences">Nastavení vyhledávání v cloudu</string>
<string name="title_api_registered_apps">Aplikace</string>
- <string name="title_key_server_preference">Nastavení keyservrů</string>
<string name="title_change_passphrase">Změnit heslo</string>
<string name="title_share_fingerprint_with">Sdílet otisk s...</string>
<string name="title_share_key">Sdílet klíč s...</string>
@@ -33,6 +33,7 @@
<string name="title_help">Nápověda</string>
<string name="title_log_display">Log</string>
<string name="title_create_key">Vytvořit klíč</string>
+ <string name="title_exchange_keys">Vyměnit klíče</string>
<string name="title_advanced_key_info">Další informace ke klíči</string>
<!--section-->
<string name="section_user_ids">Identity</string>
@@ -41,6 +42,8 @@
<string name="section_general">Obecné</string>
<string name="section_defaults">Výchozí hodnoty</string>
<string name="section_advanced">Pokročilé</string>
+ <string name="section_passphrase_cache">Cache hesel</string>
+ <string name="section_certify">Certifikovat</string>
<string name="section_actions">Akce</string>
<string name="section_share_key">Klíč</string>
<string name="section_certification_key">Klíč použitý pro certifikaci</string>
@@ -70,7 +73,6 @@
<string name="btn_create_key">Vytvořit klíč</string>
<string name="btn_add_files">Přidat soubor(y)</string>
<string name="btn_add_share_decrypted_text">Sdílet dešifrovaný text</string>
- <string name="btn_decrypt_clipboard">Dešifrovat ze schránky</string>
<string name="btn_decrypt_and_verify">a ověřit podpisy</string>
<string name="btn_decrypt_files">Dešifrovat soubory</string>
<!--menu-->
@@ -102,8 +104,9 @@
<string name="label_file_ascii_armor">Povolit ASCII armor</string>
<string name="label_write_version_header">Dát ostatním vědět, že používáte OpenKeychain</string>
<string name="label_write_version_header_summary">Zapisovat \'OpenKeychain v2.7\' do OpenPGP podpisů, šifrovaného textu a exportovaných klíčů</string>
- <string name="label_use_default_yubikey_pin">Použít výchozí Yubikey PIN</string>
- <string name="label_label_use_default_yubikey_pin_summary">Používá základní PIN (123456) pro přístup k Yubikey přes NFC</string>
+ <string name="label_use_default_yubikey_pin">Použít výchozí YubiKey PIN</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Použít numerickou klávesnici pro YubiKey PIN</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Používá základní PIN (123456) pro přístup k YubiKey přes NFC</string>
<string name="label_asymmetric_from">Podepsáno:</string>
<string name="label_to">Zašifrovat pro:</string>
<string name="label_delete_after_encryption">Smazat soubor po zašifrování</string>
@@ -111,6 +114,8 @@
<string name="label_encryption_algorithm">Šifrovací algoritmus</string>
<string name="label_hash_algorithm">Hashovací algoritmus</string>
<string name="label_symmetric">Zašifrovat heslem</string>
+ <string name="label_passphrase_cache_ttl">Čas vypršení pro cache</string>
+ <string name="label_passphrase_cache_subs">Pamatovat si heslo podle podklíče</string>
<string name="label_message_compression">Komprimovat zprávu</string>
<string name="label_file_compression">Komprimovat soubor</string>
<string name="label_keyservers">Keyservery</string>
@@ -127,6 +132,7 @@
<string name="label_send_key">Synchronizovat s cloudem</string>
<string name="label_fingerprint">Otisk</string>
<string name="expiry_date_dialog_title">Nastavit datum expirace</string>
+ <string name="label_first_keyserver_is_used">(Výchozí je první keyserver)</string>
<string name="label_preferred">upřednostněno</string>
<string name="user_id_no_name">&lt;beze jména&gt;</string>
<string name="none">&lt;žádný&gt;</string>
@@ -183,7 +189,9 @@
<string name="passphrase_must_not_be_empty">Prosím zadejte heslo.</string>
<string name="passphrase_for_symmetric_encryption">Symetrická šifra.</string>
<string name="passphrase_for">Zadejte heslo pro \'%s\'</string>
- <string name="yubikey_pin_for">Zadejte PIN pro přístup k Yubikey pro \'%s\'</string>
+ <string name="pin_for">Zadat PIN pro \'%s\'</string>
+ <string name="yubikey_pin_for">Zadejte PIN pro přístup k YubiKey pro \'%s\'</string>
+ <string name="nfc_text">Přidržte YubiKey u zadní strany vašeho přístroje.</string>
<string name="file_delete_confirmation">Chcete opravdu smazat\n%s?</string>
<string name="file_delete_successful">Úspěšně smazáno.</string>
<string name="no_file_selected">Nejprve vyberte soubor.</string>
@@ -192,7 +200,14 @@
<string name="enter_passphrase_twice">Heslo zadejte dvakrát.</string>
<string name="select_encryption_key">Vyberte alespoň jeden šifrovací klíč.</string>
<string name="select_encryption_or_signature_key">Vyberte alespoň jeden šifrovací nebo podpisový klíč.</string>
+ <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\'?\nTuto operaci nelze vzít zpět!</string>
+ <string name="public_key_deletetion_confirmation">Opravdu chcete smazat veřejný klíč \'%s\'?\nToto nelze vzít zpět!</string>
<string name="also_export_secret_keys">Zárověň exportovat tajný klíč</string>
+ <string name="reinstall_openkeychain">Narazili jste na známou chybu v Androidu. Přeinstalujte prosím OpenKeychain pokud chcete své propojit kontakty s klíči.</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>
@@ -223,18 +238,23 @@
<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_contacts_key_id_missing">Příjem ID klíče od kontatktu selhal!</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-->
<string name="decrypt_result_no_signature">Nepodepsáno</string>
<string name="decrypt_result_invalid_signature">Špatný podpis!</string>
+ <string name="decrypt_result_signature_uncertified">Kým podepsáno (neověřen!)</string>
<string name="decrypt_result_signature_certified">Podepsáno</string>
+ <string name="decrypt_result_signature_expired_key">Klíč neplatný!</string>
+ <string name="decrypt_result_signature_revoked_key">Klíč byl revokován!</string>
<string name="decrypt_result_signature_missing_key">Neznámý veřejný klíč</string>
<string name="decrypt_result_encrypted">Zašifrováno</string>
<string name="decrypt_result_not_encrypted">Nezašifrováno</string>
<string name="decrypt_result_action_show">Zobrazit</string>
<string name="decrypt_result_action_Lookup">Vyhledat</string>
+ <string name="decrypt_invalid_text">Podpis neplatný, platnost klíče vypršela nebo byl zrušen. Nemůžete si být jistí tím, kdo text napsal. Jste si jistí, že chcete i přesto zprávu zobrazit?</string>
+ <string name="decrypt_invalid_button">Beru na vědomí, zobraz to!</string>
<!--Add keys-->
<string name="add_keys_my_key">Můj klíč:</string>
<!--progress dialogs, usually ending in '…'-->
@@ -255,6 +275,7 @@
<string name="progress_modify">modifikuji klíčenku...</string>
<string name="progress_modify_unlock">odemykám klíčenku...</string>
<string name="progress_modify_adduid">přidávám uživatelské IDčka...</string>
+ <string name="progress_modify_adduat">přidávám uživatelovy atributy...</string>
<string name="progress_modify_revokeuid">revokuji uživatelská IDčka...</string>
<string name="progress_modify_primaryuid">měním primární uživatelské ID...</string>
<string name="progress_modify_subkeychange">modifikuji podklíče...</string>
@@ -285,6 +306,7 @@
<string name="progress_deleting">mažu klíče...</string>
<!--action strings-->
<string name="hint_keyserver_search_hint">Jméno/Email/ID klíče</string>
+ <string name="hint_cloud_search_hint">Jméno/Email/Důkaz/Klíč...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -327,8 +349,12 @@
<string name="import_qr_code_too_short_fingerprint">Fingerprint je příliš krátký (&lt; 16 znaků)</string>
<string name="import_qr_code_button">Naskenovat QR kód</string>
<!--Generic result toast-->
- <string name="view_log">Zobrazit log</string>
<!--Import result toast-->
+ <plurals name="import_keys_added_and_updated_1">
+ <item quantity="one">Klíč úspěšně importován</item>
+ <item quantity="few">Úspěšně importováno %1$d klíče</item>
+ <item quantity="other">Úspěšně importováno %1$d klíčů</item>
+ </plurals>
<plurals name="import_error">
<item quantity="one">Import selhal!</item>
<item quantity="few">Import %d klíčů selhal!</item>
@@ -337,6 +363,8 @@
<string name="import_error_nothing">Nic k importu</string>
<string name="import_error_nothing_cancelled">Import zrušen.</string>
<!--Delete result toast-->
+ <string name="delete_nothing">Nic ke smazání.</string>
+ <string name="delete_cancelled">Operace smazání zrušena.</string>
<!--Certify result toast-->
<!--Intent labels-->
<string name="intent_decrypt_file">Dešifrovat soubor pomocí OpenKeychain</string>
@@ -359,7 +387,6 @@
<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_settings">Nastavení</string>
<string name="api_settings_key">Klíč účtu:</string>
<string name="api_settings_accounts_empty">Žádné účty nejsou specifikovány pro tuto appku.</string>
@@ -380,6 +407,9 @@
<item quantity="few">%d klíče vybrány.</item>
<item quantity="other">%d klíčů vybráno.</item>
</plurals>
+ <string name="key_list_empty_text1">Žádný klíč nenalezen!</string>
+ <string name="key_list_filter_show_all">Zobrazit všechny klíče</string>
+ <string name="key_list_filter_show_certified">Zobrazit puze ověřené klíče</string>
<!--Key view-->
<string name="key_view_action_edit">Editovat klíč</string>
<string name="key_view_action_encrypt">Zašifrovat text</string>
@@ -395,8 +425,14 @@
<string name="key_view_tab_certs">Certifikáty</string>
<string name="user_id_info_revoked_title">Zneplatněno</string>
<string name="user_id_info_revoked_text">Tato identity byla zneplatněna vlastníkem klíče. Klíč již není platný.</string>
+ <string name="user_id_info_certified_title">Ověřeno</string>
+ <string name="user_id_info_certified_text">Tato identita byla vámi ověřena</string>
+ <string name="user_id_info_uncertified_title">Neověřeno</string>
+ <string name="user_id_info_uncertified_text">Tato identita nebyla ještě ověřena. Nemůžete si být jisti, že identita skutečně odpovídá konkrétní osobě.</string>
<string name="user_id_info_invalid_title">Neplatná</string>
<string name="user_id_info_invalid_text">S touto identitou je něco v nepořádku!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Změnit heslo</string>
<string name="edit_key_action_add_identity">Přidat identitu</string>
@@ -411,22 +447,29 @@
</string-array>
<string name="edit_key_edit_user_id_revoked">Tato identity byla zneplatněna. Toto není možné vzít zpět.</string>
<string name="edit_key_edit_subkey_title">Vyberte akci!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Změnit expiraci</item>
+ <item>Zneplatnit podklíč</item>
+ <item>Strip podklíč</item>
+ </string-array>
<string name="edit_key_new_subkey">nový podklíč</string>
+ <string name="edit_key_select_flag">Prosím vyberte alespoň jeden příznak!</string>
+ <string name="edit_key_error_add_identity">Přidejte alespoň jednu identitu!</string>
+ <string name="edit_key_error_add_subkey">Přidejte alespoň jeden podklíč!</string>
<!--Create key-->
<string name="create_key_upload">Aktualizovat klíč na keyserver</string>
<string name="create_key_empty">Toto pole je vyžadováno</string>
<string name="create_key_passphrases_not_equal">Heslo nesouhlasí</string>
<string name="create_key_final_text">Zadali jste následující identitu:</string>
+ <string name="create_key_final_robot_text">Vytvoření klíče může chvíli trvat, mezitím si dejte třeba šálek dobré kávy...</string>
+ <string name="create_key_rsa">(3 podklíče, RSA, 4096 bit)</string>
+ <string name="create_key_custom">(uživatelská konfigurace klíče)</string>
<string name="create_key_text">Zadejte své celé jméno, emailovou adresu a zvolte heslo.</string>
<string name="create_key_hint_full_name">Celé jméno, např. Jan Novák</string>
+ <string name="create_key_edit">Změnit konfiguraci klíče</string>
<!--View key-->
- <string name="view_key_revoked">Tento klíč byl zneplatněn!</string>
- <string name="view_key_expired">Tento klíč vyexpiroval!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Klíče</string>
- <string name="nav_encrypt_text">Zašifrovat text</string>
- <string name="nav_encrypt_files">Zašifrovat soubory</string>
- <string name="nav_decrypt">Rozšifrovat</string>
<string name="nav_apps">Aplikace</string>
<string name="drawer_open">Otevřít navigační panel</string>
<string name="drawer_close">Zavří navigační panel</string>
@@ -456,21 +499,28 @@
<!--createSecretKeyRing-->
<string name="msg_cr">Generuji nový hlavní klíč</string>
<string name="msg_cr_error_no_keysize">Nebyla specifikována eliptická křivka! Toto je chyba v programování a je třeba ji nahlásit!</string>
- <string name="msg_cr_error_internal_pgp">Vnitřní chyba PGP!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Upravuji klíčenku %s</string>
<string name="msg_mf_uid_error_empty">Uživatelské ID nesmí být prázdné!</string>
<!--Consolidate-->
<string name="msg_con_error_db">Chyba otevírání databáze!</string>
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_not_found">Klíč nenalezen!</string>
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<string name="msg_acc_saved">Účet uložen</string>
<!--PassphraseCache-->
<string name="passp_cache_notif_click_to_clear">Kliknout pro vymazání načtených hesel</string>
<string name="passp_cache_notif_clear">Smazat cache</string>
<string name="passp_cache_notif_pwd">Heslo</string>
+ <!--First Time-->
+ <string name="first_time_text1">Převezměte opět kontrolu nad svým soukromím s OpenKeychain!</string>
+ <string name="first_time_create_key">Vytvořit vlastní klíč</string>
+ <string name="first_time_skip">Přeskočit nastavení</string>
<!--unsorted-->
<string name="section_cert">Detaily certifikátu</string>
<string name="label_user_id">Identita</string>
@@ -490,8 +540,8 @@
<string name="error_no_encrypt_subkey">Není dostupný šifrovací podklíč!</string>
<string name="contact_show_key">Zobrazit klíč (%s)</string>
<string name="swipe_to_update">Potáhnout dolů pro aktualizaci z keyserveru</string>
- <!--First Time-->
- <string name="first_time_text1">Převezměte opět kontrolu nad svým soukromím s OpenKeychain!</string>
- <string name="first_time_create_key">Vytvořit vlastní klíč</string>
- <string name="first_time_skip">Přeskočit nastavení</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 52d979983..63b0c4c09 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -9,7 +9,7 @@
<string name="title_encrypt_text">Text Verschlüsseln</string>
<string name="title_encrypt_files">Dateien verschlüsseln</string>
<string name="title_decrypt">Entschlüsseln</string>
- <string name="title_unlock">Passwort</string>
+ <string name="title_unlock">Schlüssel entsperren</string>
<string name="title_add_subkey">Unterschlüssel hinzufügen</string>
<string name="title_edit_key">Schlüssel bearbeiten</string>
<string name="title_preferences">Einstellungen</string>
@@ -36,6 +36,7 @@
<string name="title_create_key">Schlüssel erzeugen</string>
<string name="title_exchange_keys">Schlüssel austauschen</string>
<string name="title_advanced_key_info">Erweiterte Schlüsselinformation</string>
+ <string name="title_keys">Schlüssel</string>
<!--section-->
<string name="section_user_ids">Identitäten</string>
<string name="section_keys">Unterschlüssel</string>
@@ -55,6 +56,8 @@
<string name="section_decrypt_files">Dateien</string>
<string name="section_decrypt_text">Text</string>
<string name="section_certs">Zertifikate</string>
+ <string name="section_encrypt">Verschlüsseln</string>
+ <string name="section_decrypt">Entschlüsseln</string>
<!--button-->
<string name="btn_decrypt_verify_file">Datei entschlüsseln, verifizieren und speichern</string>
<string name="btn_decrypt_verify_message">Entschlüsseln und verifizieren</string>
@@ -74,9 +77,11 @@
<string name="btn_create_key">Schlüssel erzeugen</string>
<string name="btn_add_files">Datei(en) hinzufügen</string>
<string name="btn_add_share_decrypted_text">Entschlüsselten Text teilen</string>
- <string name="btn_decrypt_clipboard">Aus Zwischenablage entschlüsseln</string>
+ <string name="btn_decrypt_clipboard">Text aus Zwischenablage entschlüsseln</string>
<string name="btn_decrypt_and_verify">und Signaturen überprüfen</string>
<string name="btn_decrypt_files">Dateien entschlüsseln</string>
+ <string name="btn_encrypt_files">Dateien verschlüsseln</string>
+ <string name="btn_encrypt_text">Text verschlüsseln</string>
<!--menu-->
<string name="menu_preferences">Einstellungen</string>
<string name="menu_help">Hilfe</string>
@@ -90,6 +95,7 @@
<string name="menu_encrypt_to">Verschlüsseln nach…</string>
<string name="menu_select_all">Alles auswählen</string>
<string name="menu_add_keys">Schlüssel hinzufügen</string>
+ <string name="menu_search_cloud">Cloud durchsuchen</string>
<string name="menu_export_all_keys">Alle Schlüssel exportieren</string>
<string name="menu_advanced">Erweiterte Infos anzeigen</string>
<!--label-->
@@ -106,9 +112,9 @@
<string name="label_file_ascii_armor">Aktiviere ASCII Armor</string>
<string name="label_write_version_header">Lass andere wissen dass du OpenKeychain nutzt</string>
<string name="label_write_version_header_summary">Fügt \'OpenKeychain v2.7\' zu OpenPGP-Signaturen, Daten und exportierten Schlüsseln hinzu</string>
- <string name="label_use_default_yubikey_pin">Standard Yubikey PIN verwenden</string>
- <string name="label_use_num_keypad_for_yubikey_pin">Zifferntastatur für Yubikey PIN verwenden</string>
- <string name="label_label_use_default_yubikey_pin_summary">Verwendet Standard PIN (123456) um auf Yubikeys via NFC zuzugreifen</string>
+ <string name="label_use_default_yubikey_pin">Standard-YubiKey-PIN verwenden</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Zifferntastatur für YubiKey PIN verwenden</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Verwendet Standard-PIN (123456) zum Zugriff auf YubiKeys über NFC</string>
<string name="label_asymmetric_from">Signiert von:</string>
<string name="label_to">Verschlüsselt an:</string>
<string name="label_delete_after_encryption">Datei nach Verschlüsselung löschen</string>
@@ -189,7 +195,9 @@
<string name="passphrase_must_not_be_empty">Bitte ein Passwort eingeben.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrische Verschlüsselung.</string>
<string name="passphrase_for">Passwort für \'%s\' eingeben</string>
+ <string name="pin_for">PIN für \'%s\' eingeben</string>
<string name="yubikey_pin_for">PIN für Zugriff auf Yubikey für \'%s\' eingeben</string>
+ <string name="nfc_text">Halten Sie den YubiKey gegen die Rückseite Ihres Geräts.</string>
<string name="file_delete_confirmation">%s wirklich löschen?</string>
<string name="file_delete_successful">Erfolgreich gelöscht.</string>
<string name="no_file_selected">Zuerst eine Datei auswählen.</string>
@@ -241,7 +249,6 @@
<string name="error_could_not_extract_private_key">Privater Schlüssel konnte nicht extrahiert werden</string>
<!--errors without preceeding Error:-->
<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_nothing_import">Keine Schlüssel gefunden!</string>
<string name="error_contacts_key_id_missing">Abrufen der Schlüsselkennung von den Kontakten ist fehlgeschlagen!</string>
<string name="error_generic_report_bug">Ein allgemeiner Fehler trat auf, bitte schreiben Sie einen neuen Bugreport für OpenKeychain.</string>
@@ -257,6 +264,7 @@
<string name="decrypt_result_not_encrypted">Nicht Verschlüsselt</string>
<string name="decrypt_result_action_show">Anzeigen</string>
<string name="decrypt_result_action_Lookup">Nachschlagen</string>
+ <string name="decrypt_invalid_text">Der Schlüssel ist entweder ungültig oder wurde zurückgezogen/ist abgelaufen. Sie können den Verfasser der Nachricht nicht eindeutig identifizieren. Wollen Sie die Nachricht trotzdem anzeigen?</string>
<string name="decrypt_invalid_button">Ich verstehe das Risiko, Nachricht anzeigen!</string>
<!--Add keys-->
<string name="add_keys_my_key">Mein Schlüssel:</string>
@@ -278,6 +286,7 @@
<string name="progress_modify">Schlüsselbund wird verändert...</string>
<string name="progress_modify_unlock">Schlüsselbund wird entsperrt...</string>
<string name="progress_modify_adduid">User-ID wird hinzugefügt...</string>
+ <string name="progress_modify_adduat">Benutzerattribute werden hinzugefügt...</string>
<string name="progress_modify_revokeuid">User-IDs werden widerrufen...</string>
<string name="progress_modify_primaryuid">Primäre User-ID wird geändert...</string>
<string name="progress_modify_subkeychange">Unterschlüssel werden verändert...</string>
@@ -306,8 +315,8 @@
<string name="progress_verifying_integrity">Integrität wird überprüft…</string>
<string name="progress_deleting_securely">\'%s\' wird sicher gelöscht…</string>
<string name="progress_deleting">Lösche Schlüssel</string>
- <string name="progress_con_saving">Zusammenführung: Speiche in Cache...</string>
- <string name="progress_con_reimport">Zusammenführung: Reimportiere...</string>
+ <string name="progress_con_saving">Zusammenführung: Im Cache speichern...</string>
+ <string name="progress_con_reimport">Zusammenführung: Neuimportierung...</string>
<!--action strings-->
<string name="hint_keyserver_search_hint">Name/Email/Schlüssel ID...</string>
<string name="hint_cloud_search_hint">Name/Email/Nachweis/Schlüssel...</string>
@@ -352,8 +361,9 @@
<string name="import_qr_code_wrong">Falsch formatierter QR-Code! Bitte erneut versuchen!</string>
<string name="import_qr_code_too_short_fingerprint">Der Fingerabdruck ist zu kurz (&lt; 16 Zeichen)</string>
<string name="import_qr_code_button">QR-Code scannen</string>
+ <string name="import_qr_code_text">Plazieren sie ihre Kamera über dem QR Code!</string>
<!--Generic result toast-->
- <string name="view_log">Log ansehen</string>
+ <string name="view_log">Details</string>
<string name="with_warnings">, mit Warnungen</string>
<string name="with_cancelled">. bis abgebrochen wurde</string>
<!--Import result toast-->
@@ -388,16 +398,39 @@
<item quantity="one">Der Schlüssel wurde erfolgreich gelöscht.</item>
<item quantity="other">%1$d Schlüssel wurden erfolgreich gelöscht</item>
</plurals>
+ <plurals name="delete_ok_but_fail_2">
+ <item quantity="one">, aber das Löschen eines Schlüssels%2$s ist fehlgeschlagen.</item>
+ <item quantity="other">, aber das Löschen von %1$d Schlüsseln%2$s ist fehlgeschlagen.</item>
+ </plurals>
+ <plurals name="delete_ok">
+ <item quantity="one">Erfolgreich gelöscht key%2$s.</item>
+ <item quantity="other">Erfolgreich gelöscht %1$d keys%2$s.</item>
+ </plurals>
+ <plurals name="delete_fail">
+ <item quantity="one">Fehler beim Löschen eines Schlüssels%2$s.</item>
+ <item quantity="other">Fehler beim Löschen von %1$d Schlüsseln.</item>
+ </plurals>
<string name="delete_nothing">Nichts zu löschen.</string>
<string name="delete_cancelled">Löschen abgebrochen.</string>
<!--Certify result toast-->
+ <plurals name="certify_keys_ok">
+ <item quantity="one">Schlüssel%2$s erfolgreich beglaubigt.</item>
+ <item quantity="other">%1$d Schlüssel%2$s erfolgreich beglaubigt.</item>
+ </plurals>
+ <plurals name="certify_keys_with_errors">
+ <item quantity="one">Beglaubigung fehlgeschlagen!</item>
+ <item quantity="other">Beglaubigung für %d Schlüssel fehlgeschlagen!</item>
+ </plurals>
+ <plurals name="certify_error">
+ <item quantity="one">Beglaubigung fehlgeschlagen!</item>
+ <item quantity="other">Beglaubigung von %d Schlüsseln ist fehlgeschlagen!</item>
+ </plurals>
<!--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 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>
@@ -413,10 +446,14 @@
<string name="api_settings_delete_account">Account löschen</string>
<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">Konten (veraltete API)</string>
+ <string name="api_settings_advanced">Erweiterte Informationen</string>
+ <string name="api_settings_allowed_keys">Erlaubte Schlüssel</string>
<string name="api_settings_settings">Einstellungen</string>
<string name="api_settings_key">Account Schlüssel:</string>
<string name="api_settings_accounts_empty">Keine Konten mit dieser Anwendung verknüpft.</string>
+ <string name="api_create_account_text">Für diesen Account ist kein Schlüssel hinterlegt. Bitte wähle einen deiner existierenden Schlüssel aus oder erstelle einen neuen.\nApps können nur hier ausgewählte Schlüssel nutzen.</string>
+ <string name="api_update_account_text">Der Schlüssel für diesen Account wurde gelöscht. Bitte wähle einen anderen aus!\nApps können nur hier ausgewählte Schlüssel nutzen.</string>
<string name="api_register_text">Folgende Anwendung möchte Nachrichten ver-/entschlüsseln und in Ihrem Namen signieren. Zugriff erlauben?\n\nVORSICHT: Sollten Sie nicht wissen warum dieses Fenster erscheint, sollten Sie den Zugriff verbieten! Sie können Zugriffe später über das Menü \'Apps\' widerrufen.</string>
<string name="api_register_allow">Zugriff erlauben</string>
<string name="api_register_disallow">Zugriff verbieten</string>
@@ -455,8 +492,11 @@
<string name="user_id_info_certified_title">Beglaubigt</string>
<string name="user_id_info_certified_text">Diese Identität wurde von Ihnen beglaubigt.</string>
<string name="user_id_info_uncertified_title">Nicht beglaubigt</string>
+ <string name="user_id_info_uncertified_text">Diese Identität wurde noch nicht beglaubigt. Sie können nicht sicher sein, ob diese Identität wirklich zu einer bestimmten Person gehört.</string>
<string name="user_id_info_invalid_title">Ungültig</string>
<string name="user_id_info_invalid_text">Irgend etwas ist mit dieser Identität nicht in Ordnung!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Passwort ändern</string>
<string name="edit_key_action_add_identity">Identität hinzufügen</string>
@@ -492,13 +532,9 @@
<string name="create_key_hint_full_name">Vollständiger Name, z.B. Max Mustermann</string>
<string name="create_key_edit">Schlüsselkonfiguration ändern</string>
<!--View key-->
- <string name="view_key_revoked">Dieser Schlüssel wurde widerrufen!</string>
- <string name="view_key_expired">Dieser Schlüssel ist nicht mehr gültig!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Schlüssel</string>
- <string name="nav_encrypt_text">Text Verschlüsseln</string>
- <string name="nav_encrypt_files">Dateien Verschlüsseln</string>
- <string name="nav_decrypt">Entschlüsseln</string>
+ <string name="nav_encrypt_decrypt">Verschlüsseln/Entschlüsseln</string>
<string name="nav_apps">Apps</string>
<string name="drawer_open">Menü öffnen</string>
<string name="drawer_close">Menü schließen</string>
@@ -519,6 +555,7 @@
<string name="msg_internal_error">Interner Fehler!</string>
<string name="msg_cancelled">Vorgang abgebrochen.</string>
<!--Import Public log entries-->
+ <string name="msg_ip_apply_batch">Eingabeoperationen werden angewendet.</string>
<string name="msg_ip_bad_type_secret">Es wurde versucht einen geheimen Schlüsselbund als Öffentlich zu importieren. Das ist ein Fehler, bitte reiche einen Bericht ein.</string>
<string name="msg_ip_delete_old_fail">Kein alter Schlüssel gelöscht (Einen neuen erzeugen?)</string>
<string name="msg_ip_delete_old_ok">Alte Schlüssel aus der Datenbank löschen</string>
@@ -551,6 +588,7 @@
<string name="msg_ip_master_flags_xxxa">Haupt-Attribute: authentifizieren</string>
<string name="msg_ip_master_flags_xxxx">Haupt-Attribute: Keine</string>
<string name="msg_ip_merge_public">Füge importierte Daten in existierend öffentlichen Schlüsselbund ein</string>
+ <string name="msg_ip_merge_secret">Importierte Daten werden in vorhandenen öffentlichen Schlüsselbund eingefügt</string>
<string name="msg_ip_subkey">Unterschlüssel %s wird bearbeitet</string>
<string name="msg_ip_subkey_expired">Unterschlüssel am %s abgelaufen</string>
<string name="msg_ip_subkey_expires">Unterschlüssel läuft am %s ab</string>
@@ -585,30 +623,63 @@
<item quantity="one">Ignoriere eine Beglaubigung, ausgestellt von unbekanntm öffentlichen Schlüssel</item>
<item quantity="other">Ignoriere %s Beglaubigungen, ausgestellt von unbekannten öffentlichen Schlüsseln</item>
</plurals>
+ <string name="msg_ip_uid_classifying_zero">Benutzerkennungen werden klassifiziert (keine vertrauenswürdigen Schlüssel verfügbar)</string>
+ <plurals name="msg_ip_uid_classifying">
+ <item quantity="one">Benutzerkennungen werden klassifiziert (ein vertrauenswürdiger Schlüssel wird verwendet)</item>
+ <item quantity="other">Benutzerkennungen werden klassifiziert (%s vertrauenswürdige Schlüssel werden verwendet)</item>
+ </plurals>
+ <string name="msg_ip_uid_reorder">Benutzerkennungen werden neu geordnet</string>
+ <string name="msg_ip_uid_processing">Benutzerkennung %s wird verarbeitet</string>
+ <string name="msg_ip_uid_revoked">Nutzer ID wiederrufen</string>
+ <string name="msg_ip_uat_processing_image">Bilder werden verarbeitet</string>
+ <string name="msg_ip_uat_processing_unknown">Unbekannte Benutzerattribute werden verarbeitet</string>
+ <string name="msg_ip_uat_cert_bad">Ungültiges Zertifikat gefunden!</string>
+ <string name="msg_ip_uat_cert_error">Fehler beim Verarbeiten des Zertifikates!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Besitzt bereits eine nicht widerrufbare Beglaubigung, überspringe.</string>
+ <string name="msg_ip_uat_cert_old">Beglaubgigung ist älter als Vorherige, überspringe.</string>
+ <string name="msg_ip_uat_cert_new">Beglaubigung ist aktueller, ersetze Vorherhige.</string>
+ <string name="msg_ip_uat_cert_good">Korrekte Beglaubigung von %1$s gefunden</string>
+ <string name="msg_ip_uat_cert_good_revoke">Korrekten Zertifikatswiderruf von %1$s gefunden</string>
+ <plurals name="msg_ip_uat_certs_unknown">
+ <item quantity="one">Ignoriere eine Beglaubigung, ausgestellt von einem unbekannten Schlüssel</item>
+ <item quantity="other">Ignoriere %s Beglaubigungen, ausgestellt von unbekannten öffentlichen Schlüsseln</item>
+ </plurals>
+ <string name="msg_ip_uat_classifying">Klassifiziere Benutzerattribute</string>
+ <string name="msg_ip_uat_revoked">Benutzerattribut wurde widerrufen</string>
<string name="msg_is_bad_type_public">Es wurde versucht einen öffentlichen Schlüsselbund als Geheim zu importieren. Das ist ein Fehler, bitte reiche einen Bericht ein.</string>
+ <string name="msg_is_bad_type_uncanon">Es wurde versucht, einen Schlüsselbund ohne Anpassung zu importieren. Dies ist ein Fehler, bitte reiche einen Bericht ein.</string>
<!--Import Secret log entries-->
<string name="msg_is">Importiere geheimen Schlüssel %s</string>
<string name="msg_is_db_exception">Datenbankfehler!</string>
<string name="msg_is_importing_subkeys">Geheime Unterschlüssel werden bearbeitet</string>
<string name="msg_is_error_io_exc">Fehler bei Kordierung des Schlüsselbunds</string>
+ <string name="msg_is_merge_public">Importierte Daten werden in vorhandenen öffentlichen Schlüsselbund eingefügt</string>
+ <string name="msg_is_merge_secret">Importierte Daten werden in vorhandenen öffentlichen Schlüsselbund eingefügt</string>
+ <string name="msg_is_merge_special">Eigenbeglaubigungsdaten aus öffentlichem Schlüsselbund werden eingefügt</string>
<string name="msg_is_pubring_generate">Generiere öffentlichen Schlüsselbund aus geheimem Schlüsselbund</string>
<string name="msg_is_subkey_nonexistent">Unterschlüssel %s in privatem Schlüssel nicht verfügbar.</string>
<string name="msg_is_subkey_ok">Geheimen Unterschlüssel %s als verfügbar markiert</string>
<string name="msg_is_subkey_empty">Geheimen Unterschlüssel %s als verfügbar markiert, ohne Passphrase</string>
+ <string name="msg_is_subkey_pin">Geheimen Unterschlüssel %s als verfügbar markiert, mit PIN</string>
<string name="msg_is_subkey_stripped">Privater Unterschlüssel %s als gekürzt markiert</string>
<string name="msg_is_subkey_divert">Privater Unterschlüssel %s als \'Umleiten zu Smartcard/NFC\' markiert</string>
<string name="msg_is_success_identical">Schlüsselbund enthält keine neuen Daten, es gibt nichts zu tun.</string>
<string name="msg_is_success">Geheimer Schlüsselbund erfolgreich importiert</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_public">Öffentlicher Schlüsselbund %s wird in vorschriftsgemäße Form gebracht</string>
+ <string name="msg_kc_secret">Geheimer Schlüsselbund %s wird in vorschriftsgemäße Form gebracht</string>
<string name="msg_kc_error_v3">Dies ist ein OpenPGP Schlüssel der Version 3, welche hinfällig sind und nicht weiter unterstützt werden!</string>
<string name="msg_kc_error_no_uid">Schlüsselbund hat keine gültigen Benutzerkennungen!</string>
<string name="msg_kc_error_master_algo">Der Hauptschlüssel verwendet einen unbekannten (%s) Algorithmus!</string>
+ <string name="msg_kc_error_dup_key">Unterschlüssel %s kommt zweimal im Schlüsselbund vor. Schlüsselbund ist fehlerhaft, wird nicht importiert!</string>
<string name="msg_kc_master">Verarbeite Hauptschlüssel</string>
- <string name="msg_kc_master_bad_err">Entferne fehlerhaftes Schlüsselbund Widerrufszertifikat</string>
- <string name="msg_kc_master_bad_local">Entferne Schlüsselbund Widerrufszertifikat mit \"Lokal\" Attribut</string>
- <string name="msg_kc_master_bad_time">Entferne Schlüsselbund Widerrufszertifikat mit zukünftigem Zeitstempel</string>
- <string name="msg_kc_master_bad_type">Entferne Hauptschlüsselbeglaubigung unbekannter Art (%s)</string>
- <string name="msg_kc_master_bad">Entferne fehlerhaftes Schlüsselbund Widerrufszertifikat</string>
+ <string name="msg_kc_master_bad_type">Hauptschlüsselbeglaubigung unbekannter Art wird entfernt (%s)</string>
+ <string name="msg_kc_master_bad_local">Hauptschlüsselbeglaubigung mit \'Lokal\'-Attribut wird entfernt</string>
+ <string name="msg_kc_master_bad_err">Fehlerhafte Hauptschlüsselbeglaubigung wird entfernt</string>
+ <string name="msg_kc_master_bad_time">Schlüsselbund-Widerrufszertifikat mit zukünftigem Zeitstempel wird entfernt</string>
+ <string name="msg_kc_master_bad_type_uid"> Benutzerkennungsbeglaubigung an falscher Position wird entfernt</string>
+ <string name="msg_kc_master_bad">Fehlerhafte Hauptschlüsselbeglaubigung wird entfernt</string>
+ <string name="msg_kc_master_local">Hauptschlüsselbeglaubigung mit \'Lokal\'-Attribut wird entfernt</string>
<string name="msg_kc_revoke_dup">Entferne redundantes Schlüsselbund Widerrufszertifikat</string>
<string name="msg_kc_sub">Verarbeite Unterschlüssel %s</string>
<string name="msg_kc_sub_bad">Entferne ungültige Unterschlüssel Zwischenbeglaubigung</string>
@@ -626,25 +697,64 @@
<string name="msg_kc_sub_revoke_bad">Entferne fehlerhaftes Unterschlüssel Widerrufszertifikat</string>
<string name="msg_kc_sub_revoke_dup">Entferne redundantes Unterschlüssel Widerrufszertifikat</string>
<string name="msg_kc_sub_unknown_algo">Unterschlüssel verwendet unbekannten Algorithmus, wird nicht importiert...</string>
+ <string name="msg_kc_sub_algo_bad_encrpyt">Der Unterschlüssel soll für die Verschlüsselung genutzt werden, der zu verwendende Algorithmus unterstützt dies jedoch nicht.</string>
+ <string name="msg_kc_sub_algo_bad_sign">Der Unterschlüssel soll zum Unterschreiben genutzt werden, der zu verwendende Algorithmus unterstützt dies jedoch nicht.</string>
+ <string name="msg_kc_success">Schlüsselbund wurde erfolgreich in vorschriftsgemäße Form gebracht, keine Änderungen</string>
+ <plurals name="msg_kc_success_bad">
+ <item quantity="one">Schlüsselbund wurde erfolgreich in vorschriftsgemäße Form gebracht, eine fehlerhafte Beglaubigung entfernt</item>
+ <item quantity="other">Schlüsselbund wurde erfolgreich in vorschriftsgemäße Form gebracht, %d fehlerhafte Beglaubigungen entfernt</item>
+ </plurals>
+ <string name="msg_kc_success_bad_and_red">Schlüsselbund wurde erfolgreich in vorschriftsgemäße Form gebracht, %1$s fehlerhafte und %2$s redundante Beglaubigungen entfernt</string>
+ <plurals name="msg_kc_success_redundant">
+ <item quantity="one">Schlüsselbund wurde erfolgreich in vorschriftsgemäße Form gebracht, eine redundante Beglaubigung entfernt</item>
+ <item quantity="other">Schlüsselbund wurde erfolgreich in vorschriftsgemäße Form gebracht, %d redundante Beglaubigungen entfernt</item>
+ </plurals>
+ <string name="msg_kc_uid_bad_err">Fehlerhafte Eigenbeglaubigung für Benutzerkennung \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_bad_local">Benutzerkennungsbeglaubigung mit \'Lokal\'-Attribut wird entfernt</string>
+ <string name="msg_kc_uid_bad_time">Benutzerkennung mit zukünftigem Zeitstempel wird entfernt</string>
+ <string name="msg_kc_uid_bad_type">Benutzerkennungsbeglaubigung unbekannter Art wird entfernt (%s)</string>
+ <string name="msg_kc_uid_bad">Fehlerhafte Eigenbeglaubigung für Benutzerkennung \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_cert_dup">Abgelaufene Eigenbeglaubigung für Benutzerkennung \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_foreign">Fremde Benutzerkennungsbeglaubigung von \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_revoke_dup">Redundantes Widerrufszertifikat für Benutzerkennung \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_revoke_old">Abgelaufenes Widerrufszertifikat für Benutzerkennung \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_no_cert">Keine gültige Eigenbeglaubigung für Benutzerkennung \'%s\' gefunden, wird vom Bund entfernt</string>
+ <string name="msg_kc_uid_remove">Ungültige Benutzerkennung \'%s\' wird entfernt</string>
+ <string name="msg_kc_uid_dup">Doppelte Benutzerkennung \'%s\' wird entfernt. Der geheime Schlüssel enthielt zwei davon. Hieraus könnten fehlende Beglaubigungen resultieren!</string>
<string name="msg_kc_uid_warn_encoding">Benutzerkennung nicht als UTF-8 bestätigt!</string>
+ <string name="msg_kc_uat_jpeg">Das Benutzerattribut JPEG wird verarbeitet</string>
+ <string name="msg_kc_uat_unknown">Ein unbekanntes Benutzerattribut wird verarbeitet</string>
+ <string name="msg_kc_uat_bad_err">Entferne fehlerhafte Eigenbeglaubigung für Benutzerattribut</string>
+ <string name="msg_kc_uat_bad_local">Entferne Benutzerattributsbeglaubigung mit \'Lokal\'-Attribut</string>
+ <string name="msg_kc_uat_bad_time">Entferne fehlerhaftes Benutzerattribute mit zukünftigem Zeitstempel</string>
+ <string name="msg_kc_uat_bad_type">Entferne Benutzerattributbeglaubigung unbekannter Art (%s)</string>
+ <string name="msg_kc_uat_bad">Entferne fehlerhafte Eigenbeglaubigung für Benutzerattribut</string>
+ <string name="msg_kc_uat_cert_dup">Entferne abgelaufene Eigenbeglaubigung für Benutzerattribut</string>
+ <string name="msg_kc_uat_foreign">Entferne fremdes Benutzerattributszertifikat von</string>
+ <string name="msg_kc_uat_revoke_dup">Entferne redundantes Widerrufszertifikat für Benutzerkennung</string>
+ <string name="msg_kc_uat_revoke_old">Entferne abgelaufenes Widerrufszertifikat für Benutzerkennung</string>
+ <string name="msg_kc_uat_no_cert">Keine gültigen Eigenbeglaubigungen für das Benutzerattribut gefunden, entferne vom Ring</string>
+ <string name="msg_kc_uat_remove">Ungültiges Benutzerattribut wird entfernt</string>
+ <string name="msg_kc_uat_warn_encoding">Benutzerkennung nicht als UTF-8 bestätigt!</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_secret_dummy">Neuer öffentlicher Unterschlüssel gefunden, aber Erstellung von geheimen Unterschlüsseldummys wird nicht unterstützt!</string>
<string name="msg_mg_error_heterogeneous">Versucht Schlüsselbunde mit unterschiedlichen Fingerabdrücken zusammenzufügen!</string>
<string name="msg_mg_error_encode">Schwerer Fehler bei Kodierung der Signatur!</string>
<string name="msg_mg_public">Vereine in öffentlichen Schlüsselbund %s </string>
- <string name="msg_mg_secret">Vereine in geheimen Schlüsselring %s</string>
+ <string name="msg_mg_secret">Wird in geheimen Schlüsselbund %s eingefügt</string>
<string name="msg_mg_new_subkey">Neuer Unterschlüssel %s wird hinzugefügt</string>
<string name="msg_mg_found_new">%s neue Beglaubigungen in Schlüsselbund gefunden</string>
<string name="msg_mg_unchanged">Nichts zum zusammenführen</string>
<!--createSecretKeyRing-->
<string name="msg_cr">Neuer Masterschlüssel wird erzeugt</string>
<string name="msg_cr_error_no_master">Keine Hauptschlüsseloptionen definiert!</string>
+ <string name="msg_cr_error_no_user_id">Schlüsselbund muss mit mindestens einer Benutzerkennung erstellt werden!</string>
<string name="msg_cr_error_no_certify">Hauptschlüssel benötigt das Attribut beglaubigen!</string>
<string name="msg_cr_error_null_expiry">Ablaufdatum kann bei Schlüsselerstellung nicht \'gleiche wie vorher\' sein. Das ist ein Programmierfehler, bitte reiche einen Fehlerbericht ein.</string>
<string name="msg_cr_error_keysize_512">Schlüsselgröße muss größer/gleich 512 sein!</string>
<string name="msg_cr_error_no_curve">Keine Schlüsselgröße angegeben. Das ist ein Progammierfehler, bitte reiche einen Fehlerbericht ein!</string>
<string name="msg_cr_error_no_keysize">Keine Elliptische Kurve angegeben. Das ist ein Progammierfehler, bitte reiche einen Fehlerbericht ein!</string>
- <string name="msg_cr_error_internal_pgp">Interner PGP Fehler!</string>
+ <string name="msg_cr_error_internal_pgp">Interner OpenPGP Fehler!</string>
<string name="msg_cr_error_unknown_algo">Unbekannter Algorithmus ausgewählt. Das ist ein Progammierfehler, bitte reiche einen Fehlerbericht ein!</string>
<string name="msg_cr_error_flags_dsa">Falsche Schlüsselattribute gewählt, DSA kann nicht zum verschlüsseln verwendet werden!</string>
<string name="msg_cr_error_flags_elgamal">Falsche Schlüsselattribute gewählt, ElGamal kann nicht zum signieren verwendet werden!</string>
@@ -658,15 +768,19 @@
<string name="msg_mf_error_integrity">Interner Fehler, Integritätsprüfung fehlgeschlagen!</string>
<string name="msg_mf_error_master_none">Keine Hauptbeglaubigung zum arbeiten gefunden! (Alle widerrufen?)</string>
<string name="msg_mf_error_noexist_primary">Falsche primäre Benutzerkennung festgelegt!</string>
+ <string name="msg_mf_error_noexist_revoke">Falsche Benutzerkennung für Widerruf definiert!</string>
+ <string name="msg_mf_error_revoked_primary">Widerrufene Benutzerkennungen können keine Primäre sein!</string>
<string name="msg_mf_error_null_expiry">Ablaufdatum kann bei Unterschlüsselerstellung nicht \'gleiche wie vorher\' sein. Das ist ein Programmierfehler, bitte reiche einen Fehlerbericht ein.</string>
<string name="msg_mf_error_passphrase_master">Schwerer Fehler beim Entschlüsseln des Hauptschlüssels! Dies ist wahrscheinlich ein Programmierfehler, bitte reiche einen Fehlerbericht ein.</string>
- <string name="msg_mf_error_pgp">Interner PGP-Fehler!</string>
+ <string name="msg_mf_error_pgp">Interner OpenPGP Fehler!</string>
<string name="msg_mf_error_sig">Signaturfehler!</string>
<string name="msg_mf_master">Verändere Hauptbeglaubigungen</string>
- <string name="msg_mf_passphrase">Speichere Passwort für Schlüsselbund zwischen...</string>
+ <string name="msg_mf_passphrase">Passwort für Schlüsselbund wird geändert</string>
<string name="msg_mf_passphrase_key">Erneute Verschlüsselung des Unterschlüssels %s mit neuem Passwort</string>
<string name="msg_mf_passphrase_empty_retry">Setzen des neuen Passworts fehlgeschlagen, versuche es nochmal mit leerem altem Passwort</string>
<string name="msg_mf_passphrase_fail">Passwort für Unterschlüssel konnte nicht geändert werden! (Hat er ein anderes als die anderen Schlüssel?)</string>
+ <string name="msg_mf_primary_replace_old">Beglaubigung von vorheriger primärer Benutzerkennung wird ersetzt</string>
+ <string name="msg_mf_primary_new">Neue Beglaubigung für neue primäre Benutzerkennung wird erzeugt</string>
<string name="msg_mf_subkey_change">Unterschlüssel %s wird geändert</string>
<string name="msg_mf_error_subkey_missing">Versuch mit fehlendem Unterschlüssel %s zu arbeiten!</string>
<string name="msg_mf_subkey_new">Füge neuen Unterschlüssel vom Typ %s hinzu</string>
@@ -676,15 +790,20 @@
<string name="msg_mf_subkey_strip">Kürze Unterschlüssel %s</string>
<string name="msg_mf_success">Schlüsselbund erfolgreich verändert</string>
<string name="msg_mf_uid_add">Benutzerkennung %s wird hinzugefügt</string>
+ <string name="msg_mf_uid_primary">Primäre Benutzerkenung wird auf %s geändert</string>
+ <string name="msg_mf_uid_revoke">Benutzerkennung %s wird widerrufen</string>
<string name="msg_mf_uid_error_empty">Benutzerkennung darf nicht leer sein!</string>
+ <string name="msg_mf_uat_error_empty">Benutzerattribut darf nicht leer sein!</string>
+ <string name="msg_mf_uat_add_image">Benutzerattribut vom Typ Bild wird hinzugefügt</string>
+ <string name="msg_mf_uat_add_unknown">Benutzerattribut unbekannter Art wird hinzugefügt</string>
<string name="msg_mf_unlock_error">Fehler beim entsperren des Schlüsselbunds</string>
<string name="msg_mf_unlock">Schlüsselbund wird entsperrt</string>
<!--Consolidate-->
- <string name="msg_con">Führe Datenbank zusammen</string>
- <string name="msg_con_error_bad_state">Zusammenführung wurde gestartet, während keine Datenbank zwischengespeichert war! Dies ist wahrscheinlich ein Programmierfehler, bitte reiche einen Fehlerbericht ein!</string>
- <string name="msg_con_error_concurrent">Zusammenführung abgebrochen, läuft bereits in einem anderen Prozess!</string>
- <string name="msg_con_save_secret">Geheime Schlüsselringe werden gespeichert</string>
- <string name="msg_con_save_public">Öffentliche Schlüsselringe werden gespeichert</string>
+ <string name="msg_con">Datenbank wird zusammengeführt</string>
+ <string name="msg_con_error_bad_state">Zusammenführung wurde gestartet während keine Datenbank zwischengespeichert war! Dies ist wahrscheinlich ein Programmierfehler, bitte reichen Sie einen Fehlerbericht ein!</string>
+ <string name="msg_con_error_concurrent">Zusammenführung abgebrochen, läuft bereits auf einem anderen Thread!</string>
+ <string name="msg_con_save_secret">Geheime Schlüsselbünde werden gespeichert</string>
+ <string name="msg_con_save_public">Öffentliche Schlüsselbünde werden gespeichert</string>
<string name="msg_con_db_clear">Datenbank wird geleert</string>
<string name="msg_con_success">Datenbank erfolgreich zusammengeführt!</string>
<string name="msg_con_critical_in">Beginne kritische Phase!</string>
@@ -696,6 +815,8 @@
<string name="msg_con_error_io_secret">Ein-/Ausgabefehler beim Schreiben von geheimen Schlüsseln in den Cache!</string>
<string name="msg_con_error_public">Fehler beim reimportieren der öffentlichen Schlüssel!</string>
<string name="msg_con_error_secret">Fehler beim reimportieren der geheimen Schlüssel!</string>
+ <string name="msg_con_recover">Zusammenführungsvorgang wird fortgesetzt</string>
+ <string name="msg_con_recover_unknown">Zusammenführungsvorgang aus unbekanntem Zustand wird fortgesetzt</string>
<plurals name="msg_con_reimport_public">
<item quantity="one">Wiederimport eines öffentlichen Schlüssels </item>
<item quantity="other">Reimport von %d öffentlichen Schlüsseln</item>
@@ -708,6 +829,17 @@
<string name="msg_con_reimport_secret_skip">Keine geheimen Schlüssel für reimport, überspringe...</string>
<string name="msg_con_warn_delete_public">Fehler beim Löschen der Öffentlichen Cache-Datei</string>
<string name="msg_con_warn_delete_secret">Fehler beim Löschen der Geheimen Cache-Datei</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">Schlüsselvorgang wird durchgeführt</string>
+ <string name="msg_ed_caching_new">Neues Passwort wird zwischengespeichert</string>
+ <string name="msg_ed_error_key_not_found">Schlüssel nicht gefunden!</string>
+ <string name="msg_ed_fetching">Zu ändernder Schlüssel wird abgerufen (%s)</string>
+ <string name="msg_ed_success">Schlüsselvorgang erfolgreich</string>
+ <!--Promote key-->
+ <string name="msg_pr_error_already_secret">Der Schlüssel ist bereits ein geheimer Schlüssel!</string>
+ <string name="msg_pr_error_key_not_found">Schlüssel nicht gefunden!</string>
+ <string name="msg_pr_fetching">Zu ändernder Schlüssel wird abgerufen (%s)</string>
+ <string name="msg_pr_success">Schlüssel erfolgreich eingebracht</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">Bearbeiten von NFC Schlüsseln wird (noch) nicht unterstützt!</string>
<string name="msg_ek_error_dummy">Kann Schlüsselbund nicht mit gekürztem Hauptschlüssel bearbeiten!</string>
@@ -716,11 +848,13 @@
<string name="msg_dc_askip_no_key">Daten mit unbekanntem Schlüssel verschlüsselt, überspringe...</string>
<string name="msg_dc_askip_not_allowed">Daten mit nicht zugelassenem Schlüssel verschlüsselt, überspringe...</string>
<string name="msg_dc_asym">Block asymmetrisch verschlüsselter Daten für Schlüssel %s gefunden</string>
+ <string name="msg_dc_charset">Ein Zeichensatz-Header wurde gefunden: \'%s\'</string>
<string name="msg_dc_clear_data">Verarbeite Klartextdaten</string>
<string name="msg_dc_clear_decompress">Entpacke komprimierte Daten</string>
<string name="msg_dc_clear_meta_file">Dateiname: %s</string>
<string name="msg_dc_clear_meta_mime">MIME-Typ: %s</string>
<string name="msg_dc_clear_meta_size">Dateigröße: %s</string>
+ <string name="msg_dc_clear_meta_size_unknown">Dateigröße ist unbekannt</string>
<string name="msg_dc_clear_meta_time">Änderungszeit: %s</string>
<string name="msg_dc_clear_signature_bad">Signaturprüfung NICHT OK!</string>
<string name="msg_dc_clear_signature_check">Überprüfe Signaturdaten</string>
@@ -734,7 +868,7 @@
<string name="msg_dc_error_io">Ein-/Ausgabefehler während Vorgang aufgetreten!</string>
<string name="msg_dc_error_no_data">Keine verschlüsselten Daten in Datenstrom gefunden!</string>
<string name="msg_dc_error_no_key">Keine verschlüsselten Daten mit bekanntem geheimen Schlüssel in Datenstrom gefunden!</string>
- <string name="msg_dc_error_pgp_exception">PGP Ausnahme während des Vorgangs aufgetreten!</string>
+ <string name="msg_dc_error_pgp_exception">Es ist ein OpenPGP-Ausnahmefehler während des Vorgangs aufgetreten!</string>
<string name="msg_dc_integrity_check_ok">Integritätsprüfung OK!</string>
<string name="msg_dc_ok_meta_only">Es wurden nur Metadaten angefragt, überspringe Entschlüsselung</string>
<string name="msg_dc_ok">OK</string>
@@ -745,36 +879,59 @@
<string name="msg_dc">Starte Entschlüsselungsvorgang...</string>
<string name="msg_dc_sym_skip">Symmetrische Daten nicht erlaubt, überspringe...</string>
<string name="msg_dc_sym">Block symmetrisch verschlüsselter Daten gefunden</string>
+ <string name="msg_dc_trail_asym">Anhängende, asymmetrisch verschlüsselte Daten für Schlüssel %s gefunden</string>
+ <string name="msg_dc_trail_sym">Anhang gefunden, symmetrisch verschlüsselte Daten</string>
+ <string name="msg_dc_trail_unknown">Anhängende Daten unbekannter Art gefunden</string>
<string name="msg_dc_unlocking">Geheimer Schlüssel wird entsperrt</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">Bereite öffentliche Schlüssel für Verschlüsselung vor</string>
- <string name="msg_se_clearsign_only">Signieren von Klartexteingaben wird nicht Unterstützt!</string>
- <string name="msg_se_compressing">Bereite Kompression vor</string>
- <string name="msg_se_encrypting">Daten werden verschlüsselt</string>
- <string name="msg_se_error_bad_passphrase">Falsches Passwort!</string>
- <string name="msg_se_error_io">Ein-/Ausgabefehler während Vorgang aufgetreten!</string>
- <string name="msg_se_error_key_sign">Gewählter Signaturschlüssel kann keine Daten signieren!</string>
- <string name="msg_se_error_sign_key">Fehler bei Abruf des Signaturschlüssels!</string>
- <string name="msg_se_error_nfc">NFC-Datenfehler!</string>
- <string name="msg_se_error_no_passphrase">Kein Passwort bereitgestellt!</string>
- <string name="msg_se_error_pgp">Interner PGP-Fehler!</string>
- <string name="msg_se_error_sig">PGP Signaturausnahme aufgetreten!</string>
- <string name="msg_se_error_unlock">Unbekannter Fehler bei Schlüsselentsperrung!</string>
- <string name="msg_se_key_ok">Verschlüssele für Schlüssel: %s</string>
- <string name="msg_se_key_unknown">Fehlender Schlüssel für Verschlüsselung: %s</string>
- <string name="msg_se_key_warn">Falscher Schlüssel für Verschlüsselung: %s</string>
- <string name="msg_se_ok">Signierungs-/Verschlüsselungsvorgang erfolgreich!</string>
- <string name="msg_se_pending_nfc">NFC Token benötigt, verlange Benutzereingabe...</string>
- <string name="msg_se_pending_passphrase">Passwort benötigt, verlange Benutezreingabe...</string>
- <string name="msg_se_signing">Signiere Daten (ohne Verschlüsselung)</string>
- <string name="msg_se_sigcrypting">Verschlüssele Daten mit Signatur</string>
- <string name="msg_se">Starte Signier- und/oder Verschlüsselungsvorgang</string>
- <string name="msg_se_symmetric">Bereite symmetrische Verschlüsselung vor</string>
+ <string name="msg_se">Starte Signier-/Verschlüsselungsvorgang</string>
+ <string name="msg_se_error_no_input">Keine Eingabe gegeben!</string>
+ <string name="msg_se_error_input_uri_not_found">Fehler beim öffnen der Uri zum lesen!</string>
+ <string name="msg_se_success">Signier-/Verschlüsselungsvorgang erfolgreich!</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">Bereite öffentliche Schlüssel für Verschlüsselung vor</string>
+ <string name="msg_pse_clearsign_only">Signieren von Klartexteingaben wird nicht unterstützt!</string>
+ <string name="msg_pse_compressing">Bereite Kompression vor</string>
+ <string name="msg_pse_encrypting">Daten werden verschlüsselt</string>
+ <string name="msg_pse_error_bad_passphrase">Falsches Passwort!</string>
+ <string name="msg_pse_error_hash_algo">Angeforderter Hash-Algorithmus wird von diesem Schlüssel nicht unterstützt!</string>
+ <string name="msg_pse_error_io">Ein-/Ausgabefehler während Vorgang aufgetreten!</string>
+ <string name="msg_pse_error_key_sign">Gewählter Signaturschlüssel kann keine Daten signieren!</string>
+ <string name="msg_pse_error_sign_key">Fehler bei Abruf des Signaturschlüssels!</string>
+ <string name="msg_pse_error_nfc">NFC-Datenfehler!</string>
+ <string name="msg_pse_error_no_passphrase">Kein Passwort bereitgestellt!</string>
+ <string name="msg_pse_error_pgp">Interner OpenPGP Fehler!</string>
+ <string name="msg_pse_error_sig">OpenPGP-Signaturfehler aufgetreten!</string>
+ <string name="msg_pse_error_unlock">Unbekannter Fehler bei Schlüsselentsperrung!</string>
+ <string name="msg_pse_key_ok">Verschlüssele für Schlüssel: %s</string>
+ <string name="msg_pse_key_unknown">Fehlender Schlüssel für Verschlüsselung: %s</string>
+ <string name="msg_pse_key_warn">Falscher Schlüssel für Verschlüsselung: %s</string>
+ <string name="msg_pse_ok">Signierungs-/Verschlüsselungsvorgang erfolgreich!</string>
+ <string name="msg_pse_pending_nfc">NFC Token benötigt, verlange Benutzereingabe...</string>
+ <string name="msg_pse_pending_passphrase">Passwort benötigt, verlange Benutzereingabe...</string>
+ <string name="msg_pse_signing">Signiere Daten (ohne Verschlüsselung)</string>
+ <string name="msg_pse_signing_cleartext">Erstelle Klartextsignatur</string>
+ <string name="msg_pse_signing_detached">Separate Signatur wird erstellt</string>
+ <string name="msg_pse_sigcrypting">Verschlüssele Daten mit Signatur</string>
+ <string name="msg_pse">Starte Signier- und/oder Verschlüsselungsvorgang</string>
+ <string name="msg_pse_symmetric">Bereite symmetrische Verschlüsselung vor</string>
<string name="msg_crt_certifying">Zertifizierungen werden erzeugt</string>
+ <string name="msg_crt_certify_all">Alle Benutzerkennungen für Schlüssel %s werden beglaubigt</string>
+ <plurals name="msg_crt_certify_some">
+ <item quantity="one">Eine Benutzerkennung für Schlüssel %2$s wird beglaubigt</item>
+ <item quantity="other">%1$d Benutzerkennungen für Schlüssel %2$s werden beglaubigt</item>
+ </plurals>
+ <string name="msg_crt_error_self">Auf diese Art und Weise kann keine Eigenbeglaubigung ausgestellt werden!</string>
<string name="msg_crt_error_master_not_found">Hauptschlüssel nicht gefunden!</string>
<string name="msg_crt_error_nothing">Keine beglaubigten Schlüssel!</string>
+ <string name="msg_crt_error_unlock">Fehler beim Entsperren des Hauptschlüssels!</string>
+ <string name="msg_crt_error_divert">Beglaubigung mit NFC wird (noch) nicht unterstützt!</string>
<string name="msg_crt">Schlüsselbund wird beglaubigt</string>
+ <string name="msg_crt_master_fetch">Beglaubigender Hauptschlüssel wird abgerfufen</string>
+ <string name="msg_crt_save">Beglaubigter Schlüssel %s wird gespeichert</string>
<string name="msg_crt_saving">Schlüsselbunde werden gespeichert</string>
+ <string name="msg_crt_unlock">Hauptschlüssel wird entsperrt</string>
<string name="msg_crt_success">Identitäten erfolgreich beglaubigt</string>
<string name="msg_crt_warn_not_found">Schlüssel nicht gefunden!</string>
<string name="msg_crt_warn_cert_failed">Erzeugen des Zertifikates fehlgeschlagen!</string>
@@ -784,15 +941,35 @@
<item quantity="one">Schlüssel wird importiert</item>
<item quantity="other">%d Schlüssel werden importiert</item>
</plurals>
+ <string name="msg_import_fetch_error_decode">Fehler beim Dekodieren des abgerufenen Schlüsselbundes!</string>
+ <string name="msg_import_fetch_error">Schlüssel konnte nicht abgerufen werden! (Netzwerkprobleme?)</string>
+ <string name="msg_import_fetch_keybase">Empfange von keybase.io: %s</string>
+ <string name="msg_import_fetch_keyserver_error">Konnte Schlüssel nicht von Keybase empfangen!</string>
+ <string name="msg_import_fetch_keyserver">Von einem Schlüsselserver abrufen: %s</string>
+ <string name="msg_import_fetch_keyserver_ok">Schlüsselabruf erfolgreich</string>
<string name="msg_import_keyserver">Schlüsselserver %s wird verwendet</string>
+ <string name="msg_import_fingerprint_error">Fingerabdruck des abgerufenen Schlüssels entspricht nicht dem Erwarteten!</string>
+ <string name="msg_import_fingerprint_ok">Fingerabdrucktest in Ordnung</string>
+ <string name="msg_import_merge">Abgerufene Daten werden eingefügt</string>
<string name="msg_import_error">Importieren fehlgeschlagen!</string>
+ <string name="msg_import_error_io">Der Import ist aufgrund eines Eingabe/Ausgabe-Fehlers fehlgeschlagen!</string>
<string name="msg_import_partial">Importvorgang erfolgreich, mit Fehlern!</string>
+ <string name="msg_import_success">Importvorgang erfolgreich!</string>
+ <plurals name="msg_export">
+ <item quantity="one">Ein Schlüssel wird exportiert</item>
+ <item quantity="other">%d Schlüssel werden exportiert</item>
+ </plurals>
<string name="msg_export_all">Exportiere alle Schlüssel</string>
<string name="msg_export_public">Exportiere öffentlichen Schlüssel %s</string>
<string name="msg_export_secret">Exportiere privaten Schlüssel %s</string>
<string name="msg_export_error_no_file">Kein Dateiname angegeben!</string>
+ <string name="msg_export_error_fopen">Fehler beim Öffnen der Datei !</string>
+ <string name="msg_export_error_no_uri">Keine URI angegeben!</string>
+ <string name="msg_export_error_uri_open">Fehler beim Öffnen des URI-Streams!</string>
+ <string name="msg_export_error_storage">Speicher ist nicht Schreibbereit !</string>
<string name="msg_export_error_db">Datenbankfehler!</string>
<string name="msg_export_error_io">Eingabe/Ausgabe Fehler!</string>
+ <string name="msg_export_error_key">Fehlber bei der Vorverarbeitung der Schlüsseldaten!</string>
<string name="msg_export_success">Exportvorgang erfolgreich!</string>
<string name="msg_del_error_empty">Nichts zu löschen!</string>
<string name="msg_del_error_multi_secret">Geheime Schlüssel können nur einzeln gelöscht werden!</string>
@@ -802,16 +979,26 @@
</plurals>
<string name="msg_del_key">Lösche Schlüssel %s</string>
<string name="msg_del_key_fail">Fehler beim Löschen von Schlüssel %s</string>
+ <string name="msg_del_consolidate">Datenbank wird nach Löschung des geheimen Schlüssels zusammengeführt</string>
<plurals name="msg_del_ok">
<item quantity="one">Schlüssel erfolgreich gelöscht</item>
<item quantity="other">%d Schlüssel erfolgreich gelöscht</item>
</plurals>
+ <plurals name="msg_del_fail">
+ <item quantity="one">Fehler beim Löschen eines Schlüssels</item>
+ <item quantity="other">Fehler beim Löschen von %d Schlüsseln</item>
+ </plurals>
<string name="msg_acc_saved">Konto gespeichert</string>
<string name="msg_download_success">Erfolgreich heruntergeladen!</string>
+ <string name="msg_download_no_valid_keys">Keine gültigen Schlüssel in der Datei/Zwischenablage gefunden!</string>
+ <string name="msg_download_no_pgp_parts">NOCH ZU MACHEN: Plurale!</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="msg_download_query_too_short">Suchanfrage zu kurz. Bitte verfeinern Sie Ihre Suchanfrage!</string>
+ <string name="msg_download_too_many_responses">Schlüsselsuchanfrage lieferte zu viele Kandidaten. Bitte verfeinern Sie Ihre Anfrage!</string>
+ <string name="msg_download_query_too_short_or_too_many_responses">Entweder keine oder zu viele Schlüssel wurden gefunden. Bitte verbessern Sie Ihre Anfrage!</string>
<string name="msg_download_query_failed">Beim suchen der Schlüssel ist ein Fehler aufgetreten.</string>
<!--PassphraseCache-->
<string name="passp_cache_notif_click_to_clear">Klicken um Passworte aus Zwischenspeicher zu leeren</string>
@@ -819,6 +1006,11 @@
<string name="passp_cache_notif_keys">Zwischengespeicherte Passworte:</string>
<string name="passp_cache_notif_clear">Cache löschen</string>
<string name="passp_cache_notif_pwd">Passwort</string>
+ <!--First Time-->
+ <string name="first_time_text1">Hol dir deine Privatsphäre mit OpenKeychain zurück!</string>
+ <string name="first_time_create_key">Erzeuge meinen Schlüssel</string>
+ <string name="first_time_import_key">Von Datei importieren</string>
+ <string name="first_time_skip">Setup überspringen</string>
<!--unsorted-->
<string name="section_certifier_id">Beglaubiger</string>
<string name="section_cert">Zertifikatdetails</string>
@@ -847,9 +1039,32 @@
<string name="error_no_file_selected">Mindestens eine Datei zum Verschlüsseln auswählen!</string>
<string name="error_multi_not_supported">Das speichern von mehreren Dateien wird nicht unterstützt. Dies ist eine Einschränkung der aktuellen Android Version.</string>
<string name="key_colon">Schlüssel:</string>
- <!--First Time-->
- <string name="first_time_text1">Hol dir deine Privatsphäre mit OpenKeychain zurück!</string>
- <string name="first_time_create_key">Erzeuge meinen Schlüssel</string>
- <string name="first_time_import_key">Von Datei importieren</string>
- <string name="first_time_skip">Setup überspringen</string>
+ <string name="btn_start_exchange">Austausch starten</string>
+ <string name="user_id_none"><![CDATA[<kein>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">Wähle eine Entsperrmethode</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Passwort eingeben</string>
+ <string name="passphrase">Passwort</string>
+ <string name="noPassphrase">Kein Passwort</string>
+ <string name="no_passphrase_set">Kein Passwort gesetzt</string>
+ <string name="passphrases_match">Die Passwörter stimmten nicht überein.</string>
+ <string name="passphrase_saved">Passwort gespeichert</string>
+ <string name="passphrase_invalid">Falsches Passwort</string>
+ <string name="missing_passphrase">Fehlendes Passwort</string>
+ <string name="passphrase_again">Wiederholen</string>
+ <string name="lockpattern">Entsperrcode</string>
+ <string name="lockpatternNFC">NFc + Entsperrcode</string>
+ <string name="unlock_method">Entsperrmethode</string>
+ <string name="set_passphrase">Passwort setzen</string>
+ <string name="draw_lockpattern">Zeichne Entsperrcode</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Falscher Tag. Bitte versuche es erneut.</string>
+ <string name="enable_nfc">Aktiviere NFC in deinen Einstellungen.</string>
+ <string name="no_nfc_support">Dieses Gerät unterstützt kein NFC</string>
+ <string name="nfc_write_succesful">Erfolgreich auf den NFC Tag geschrieben</string>
+ <string name="unlocked">Entsperrt</string>
+ <string name="nfc_settings">Einstellungen</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index bf532a2aa..0d7444c47 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -9,13 +9,13 @@
<string name="title_encrypt_text">Cifrar texto</string>
<string name="title_encrypt_files">Cifrar ficheros</string>
<string name="title_decrypt">Descifrar</string>
- <string name="title_unlock">Frase de contraseña</string>
+ <string name="title_unlock">Desbloquear clave</string>
<string name="title_add_subkey">Añadir subclave</string>
<string name="title_edit_key"> Editar clave</string>
- <string name="title_preferences"> Preferencias</string>
+ <string name="title_preferences">Configuración</string>
<string name="title_cloud_search_preferences">Preferencias de búsqueda en la nube</string>
<string name="title_api_registered_apps">Aplicaciones</string>
- <string name="title_key_server_preference">Prioridad del servidor de claves</string>
+ <string name="title_key_server_preference">Servidores de claves</string>
<string name="title_change_passphrase">Cambiar frase de contraseña</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>
@@ -36,8 +36,12 @@
<string name="title_create_key">Crear clave</string>
<string name="title_exchange_keys">Intercambiar claves</string>
<string name="title_advanced_key_info">Información avanzada de clave</string>
+ <string name="title_keys">Claves</string>
<!--section-->
<string name="section_user_ids">Identificaciones</string>
+ <string name="section_should_you_trust">¿Debe confiar en esta clave?</string>
+ <string name="section_proof_details">Prueba de verificación</string>
+ <string name="section_cloud_evidence">Evidencia desde la nube</string>
<string name="section_keys">Subclaves</string>
<string name="section_cloud_search">Búsqueda en la nube</string>
<string name="section_general">General</string>
@@ -55,6 +59,8 @@
<string name="section_decrypt_files">Ficheros</string>
<string name="section_decrypt_text">Texto</string>
<string name="section_certs">Certificados</string>
+ <string name="section_encrypt">Cifrar</string>
+ <string name="section_decrypt">Descifrar</string>
<!--button-->
<string name="btn_decrypt_verify_file">Descifrar, verificar, y guardar fichero</string>
<string name="btn_decrypt_verify_message">Descifrar y verificar mensaje</string>
@@ -68,15 +74,19 @@
<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_no">No</string>
+ <string name="btn_match">Las huellas de validación son coincidentes</string>
<string name="btn_lookup_key">Buscar clave</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>
<string name="btn_add_share_decrypted_text">Compartir texto descifrado</string>
- <string name="btn_decrypt_clipboard">Descifrar desde el portapapeles</string>
+ <string name="btn_decrypt_clipboard">Descifrar texto desde el portapapeles</string>
<string name="btn_decrypt_and_verify">y verificar firmas</string>
<string name="btn_decrypt_files">Descifrar ficheros</string>
+ <string name="btn_encrypt_files">Cifrar ficheros</string>
+ <string name="btn_encrypt_text">Cifrar texto</string>
<!--menu-->
<string name="menu_preferences">Ajustes</string>
<string name="menu_help">Ayuda</string>
@@ -85,13 +95,16 @@
<string name="menu_create_key">Crear mi clave</string>
<string name="menu_import_existing_key">Importar desde fichero</string>
<string name="menu_search">Buscar</string>
+ <string name="menu_nfc_preferences">Configuraciones NFC</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>
<string name="menu_select_all">Seleccionar todo</string>
<string name="menu_add_keys">Añadir claves</string>
+ <string name="menu_search_cloud">Buscar en la nube</string>
<string name="menu_export_all_keys">Exportar todas las claves</string>
<string name="menu_advanced">Mostrar información avanzada</string>
+ <string name="menu_certify_fingerprint">Verificar vía comparación de huellas de validación</string>
<!--label-->
<string name="label_message">Mensaje</string>
<string name="label_file">Archivo</string>
@@ -106,9 +119,9 @@
<string name="label_file_ascii_armor">Habilitar armadura ASCII</string>
<string name="label_write_version_header">Permitir conocer a otros que usted está usando OpenKeychain</string>
<string name="label_write_version_header_summary">Escribe \'OpenKeychain v2.7\' en las firmas OpenPGP, texto cifrado, y claves exportadas</string>
- <string name="label_use_default_yubikey_pin">Usar el PIN por defecto de Yubikey</string>
- <string name="label_use_num_keypad_for_yubikey_pin">Usar el teclado numérico para el PIN de Yubikey</string>
- <string name="label_label_use_default_yubikey_pin_summary">Usa el PIN predeterminado (123456) para acceder a las Yubikeys sobre NFC</string>
+ <string name="label_use_default_yubikey_pin">Utilizar PIN predeterminado de la YubiKey</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Utilizar teclado numérico para el PIN de la YubiKey</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Utiliza el PIN predeterminado (123456) para acceder a las YubiKeys sobre NFC</string>
<string name="label_asymmetric_from">Firmado por:</string>
<string name="label_to">Cifrar hacia:</string>
<string name="label_delete_after_encryption">Eliminar fichero después del cifrado</string>
@@ -189,7 +202,9 @@
<string name="passphrase_must_not_be_empty">Por favor, introduce una frase de contraseña.</string>
<string name="passphrase_for_symmetric_encryption">Cifrado simétrico.</string>
<string name="passphrase_for">Introducir la frase de contraseña para \'%s\'</string>
- <string name="yubikey_pin_for">Introduzca el PIN de acceso a Yubikey para \'%s\'</string>
+ <string name="pin_for">Introduzca el PIN para \'%s\'</string>
+ <string name="yubikey_pin_for">Introduzca el PIN para acceder a la YubiKey para \'%s\'</string>
+ <string name="nfc_text">Sostenga la YubiKey contra el reverso de su dispositivo.</string>
<string name="file_delete_confirmation">¿Está seguro de que quiere eliminar\n%s?</string>
<string name="file_delete_successful">Borrado satisfactoriamente.</string>
<string name="no_file_selected">Selecciona un archivo antes.</string>
@@ -235,13 +250,14 @@
<string name="error_key_needs_a_user_id">necesita al menos una identificación</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">¡No hay contenido cifrado o firmado con OpenPGP válido!</string>
+ <string name="error_invalid_data">¡No es un contenido cifrado o firmado con OpenPGP 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_could_not_extract_private_key">no se puede extraer la clave privada</string>
<!--errors without preceeding Error:-->
<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_nfc_needed">¡NFC ha de estar habilitado!</string>
+ <string name="error_beam_needed">¡Beam ha de estar habilitado!</string>
<string name="error_nothing_import">¡No se encontraron claves!</string>
<string name="error_contacts_key_id_missing">¡Fallo al obtener clave de identificación desde los contactos!</string>
<string name="error_generic_report_bug">Ha ocurrido un error genérico, por favor, informa de este bug a OpenKeychain</string>
@@ -250,14 +266,14 @@
<string name="decrypt_result_invalid_signature">¡Firma no válida!</string>
<string name="decrypt_result_signature_uncertified">Firmado por (¡no certificada!)</string>
<string name="decrypt_result_signature_certified">Firmado por</string>
- <string name="decrypt_result_signature_expired_key">¡La clave ha expirado!</string>
+ <string name="decrypt_result_signature_expired_key">¡La clave ha caducado!</string>
<string name="decrypt_result_signature_revoked_key">¡La clave ha sido revocada!</string>
<string name="decrypt_result_signature_missing_key">Clave pública desconocida</string>
<string name="decrypt_result_encrypted">Cifrado</string>
<string name="decrypt_result_not_encrypted">No cifrado</string>
<string name="decrypt_result_action_show">Mostrar</string>
<string name="decrypt_result_action_Lookup">Buscar</string>
- <string name="decrypt_invalid_text">O bien la firma no es válida, o la clave ha sido revocada/ha expirado. No puede estar seguro de quién escribió el texto. ¿Todavía quiere mostrarlo?</string>
+ <string name="decrypt_invalid_text">O bien la firma no es válida, o la clave ha sido revocada o ha caducado. No puede estar seguro de quién escribió el texto. ¿Aún quiere mostrarlo?</string>
<string name="decrypt_invalid_button">Comprendo los riesgos, ¡muéstralo!</string>
<!--Add keys-->
<string name="add_keys_my_key">Mi clave:</string>
@@ -279,6 +295,7 @@
<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 identificaciones de usuario...</string>
+ <string name="progress_modify_adduat">añadiendo atributos de usuario...</string>
<string name="progress_modify_revokeuid">revocando identificaciones de usuario...</string>
<string name="progress_modify_primaryuid">cambiando identificación principal de usuario...</string>
<string name="progress_modify_subkeychange">modificando subclaves...</string>
@@ -339,7 +356,7 @@
<!--Help-->
<string name="help_tab_start">Comenzar</string>
<string name="help_tab_faq">FAQ</string>
- <string name="help_tab_wot">Web of Trust</string>
+ <string name="help_tab_wot">Anillo de confianza</string>
<string name="help_tab_nfc_beam">NFC Beam</string>
<string name="help_tab_changelog">Registro de cambios</string>
<string name="help_tab_about">A cerca de</string>
@@ -353,8 +370,9 @@
<string name="import_qr_code_wrong">¡El código QR está deformado! ¡Por favor, prueba de nuevo!</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_code_button">Escanear código QR</string>
+ <string name="import_qr_code_text">¡Sitúe su cámara sobre el código QR!</string>
<!--Generic result toast-->
- <string name="view_log">Ver registro (log)</string>
+ <string name="view_log">Detalles</string>
<string name="with_warnings">, con advertencias</string>
<string name="with_cancelled">, hasta que sea cancelado</string>
<!--Import result toast-->
@@ -422,7 +440,6 @@
<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¡Puede encontrar una lista de aplicaciones de terceros soportadas en \'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>
@@ -438,7 +455,9 @@
<string name="api_settings_delete_account">Borrar cuenta</string>
<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">Cuentas (API desechada)</string>
+ <string name="api_settings_advanced">Información avanzada</string>
+ <string name="api_settings_allowed_keys">Claves permitidas</string>
<string name="api_settings_settings">Configuración</string>
<string name="api_settings_key">Clave de la cuenta:</string>
<string name="api_settings_accounts_empty">No hay cuentas adjuntas a esta aplicación</string>
@@ -477,14 +496,54 @@
<string name="key_view_tab_share">Compartir</string>
<string name="key_view_tab_keys">Subclaves</string>
<string name="key_view_tab_certs">Certificados</string>
+ <string name="key_view_tab_keybase">Keybase.io</string>
<string name="user_id_info_revoked_title">Revocada</string>
- <string name="user_id_info_revoked_text">Esta identificación ha sido revocada por el propietario de la clave. En adelante no es válida.</string>
+ <string name="user_id_info_revoked_text">Esta identificación ha sido revocada por el propietario de la clave. En adelante no será válida.</string>
<string name="user_id_info_certified_title">Certificada</string>
<string name="user_id_info_certified_text">Esta identificación ha sido certificada por usted.</string>
<string name="user_id_info_uncertified_title">No certificada</string>
<string name="user_id_info_uncertified_text">Esta identificación de no ha sido certificada aún. No puede estar seguro de si la identificación corresponde en realidad a una persona específica.</string>
- <string name="user_id_info_invalid_title">No válido</string>
+ <string name="user_id_info_invalid_title">No válida</string>
<string name="user_id_info_invalid_text">¡Hay algo mal con esta identificación!</string>
+ <!--Key trust-->
+ <string name="key_trust_already_verified">¡Ya ha certificado esta clave!</string>
+ <string name="key_trust_it_is_yours">¡Esta es una de sus claves!</string>
+ <string name="key_trust_maybe">Esta clave no está revocada ni caducada.\nNo la ha certificado, pero puede elegir confiar en ella.</string>
+ <string name="key_trust_revoked">Esta clave ha sido revocada por su propietario. No debe confiar en ella.</string>
+ <string name="key_trust_expired">Esta clave ha caducado. No debe confiar en ella.</string>
+ <string name="key_trust_old_keys">Puede ser correcto usar esta para descifrar un mensaje antiguo que date del momento en que esta clave estaba vigente.</string>
+ <string name="key_trust_no_cloud_evidence">No hay evidencia desde la nube de la fiabilidad de esta clave.</string>
+ <string name="key_trust_start_cloud_search">Comenzar búsqueda</string>
+ <string name="key_trust_results_prefix">Keybase.io ofrece \"pruebas\" que sostienen que el propietario de esta clave:</string>
+ <!--keybase proof stuff-->
+ <string name="keybase_narrative_twitter">Publica en Twitter como</string>
+ <string name="keybase_narrative_github">Es conocido en GitHub como</string>
+ <string name="keybase_narrative_dns">Controla el(los) nombre(s) de dominio</string>
+ <string name="keybase_narrative_web_site">Puede publicar en el(los) sitio(s) web</string>
+ <string name="keybase_narrative_reddit">Publica en Reddit como </string>
+ <string name="keybase_narrative_coinbase">Es conocido en Coinbase como</string>
+ <string name="keybase_narrative_hackernews">Publica en Hacker News como</string>
+ <string name="keybase_narrative_unknown">Tipo de prueba desconocido</string>
+ <string name="keybase_proof_failure">Desafortunadamente esta prueba no puede ser verificada.</string>
+ <string name="keybase_unknown_proof_failure">Problema no reconocido con el verificador de la prueba</string>
+ <string name="keybase_problem_fetching_evidence">Problema con la evidencia de la prueba</string>
+ <string name="keybase_key_mismatch">La huella de validación de clave no coincide con aquella en el post de la prueba</string>
+ <string name="keybase_dns_query_failure">Fallo al obtener registro DNS TXT</string>
+ <string name="keybase_no_prover_found">No se encontró verificador de prueba para</string>
+ <string name="keybase_message_payload_mismatch">El post de la prueba descifrada no coincide con el valor esperado</string>
+ <string name="keybase_message_fetching_data">Descargado evidencia de la prueba</string>
+ <string name="keybase_proof_succeeded">¡Esta prueba ha sido verificada!</string>
+ <string name="keybase_a_post">Un post</string>
+ <string name="keybase_fetched_from">descargada desde</string>
+ <string name="keybase_for_the_domain">para el dominio</string>
+ <string name="keybase_contained_signature">contiene un mensaje que sólo podría haber sido creado por el propietario de esta clave.</string>
+ <string name="keybase_twitter_proof">Un twit</string>
+ <string name="keybase_dns_proof">Un registro DNS TXT</string>
+ <string name="keybase_web_site_proof">Un fichero de texto</string>
+ <string name="keybase_github_proof">Un gist</string>
+ <string name="keybase_reddit_proof">Un fichero JSON</string>
+ <string name="keybase_reddit_attribution">atribuido por Reddit a</string>
+ <string name="keybase_verify">Verificar</string>
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Cambiar frase-contraseña</string>
<string name="edit_key_action_add_identity">Añadir identificación</string>
@@ -520,13 +579,15 @@
<string name="create_key_hint_full_name">Nombre completo, ej. Max Mustermann</string>
<string name="create_key_edit">Cambiar configuración de clave</string>
<!--View key-->
- <string name="view_key_revoked">¡Esta clave ha sido revocada!</string>
- <string name="view_key_expired">¡Esta clave ha expirado!</string>
+ <string name="view_key_revoked">Revocada: ¡La clave no debe volver a ser usada!</string>
+ <string name="view_key_expired">Caducada: ¡El contacto necesita extender la vigencia de las claves!</string>
+ <string name="view_key_expired_secret">Caducada: ¡Puede extender la vigencia de las claves al editarlas!</string>
+ <string name="view_key_my_key">Mi clave</string>
+ <string name="view_key_verified">Clave verificada</string>
+ <string name="view_key_unverified">No verificada: ¡Escanee el código QR para verificar la clave!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Claves</string>
- <string name="nav_encrypt_text">Cifrar texto</string>
- <string name="nav_encrypt_files">Cifrar ficheros</string>
- <string name="nav_decrypt">Descifrar</string>
+ <string name="nav_encrypt_decrypt">Cifrar/Descifrar</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>
@@ -560,8 +621,8 @@
<string name="msg_ip_insert_keys">Analizando claves</string>
<string name="msg_ip_prepare">Preparando base de datos de operaciones</string>
<string name="msg_ip_master">Procesando clave maestra %s</string>
- <string name="msg_ip_master_expired">El juego de claves expiró el %s</string>
- <string name="msg_ip_master_expires">El juego de claves expira el %s</string>
+ <string name="msg_ip_master_expired">El juego de claves caducó el %s</string>
+ <string name="msg_ip_master_expires">El juego de claves caduca el %s</string>
<string name="msg_ip_master_flags_unspecified">Indicativos maestros: no especificados (se asumen todos)</string>
<string name="msg_ip_master_flags_cesa">Indicativos maestros: certificar, cifrar, firmar, autentificar</string>
<string name="msg_ip_master_flags_cesx">Indicativos maestros: certificar, cifrar, firmar</string>
@@ -582,8 +643,8 @@
<string name="msg_ip_merge_public">Incorporando datos importados al juego de claves público existente</string>
<string name="msg_ip_merge_secret">Incorporando datos importados al juego de claves público existente</string>
<string name="msg_ip_subkey">Procesando subclave %s</string>
- <string name="msg_ip_subkey_expired">La subclave expiró el %s</string>
- <string name="msg_ip_subkey_expires">La subclave expira el %s</string>
+ <string name="msg_ip_subkey_expired">La subclave caducó el %s</string>
+ <string name="msg_ip_subkey_expires">La subclave caduca el %s</string>
<string name="msg_ip_subkey_flags_unspecified">Indicativos de subclave: no especificados (se asumen todos)</string>
<string name="msg_ip_subkey_flags_cesa">Indicativos de subclave: certificar, cifrar, firmar, autentificar</string>
<string name="msg_ip_subkey_flags_cesx">Indicativos de subclave: certificar, cifrar, firmar</string>
@@ -623,6 +684,21 @@
<string name="msg_ip_uid_reorder">Re-ordenando identificaciones de usuario</string>
<string name="msg_ip_uid_processing">Procesando identificación de usuario %s</string>
<string name="msg_ip_uid_revoked">La identificación de usuario está revocada</string>
+ <string name="msg_ip_uat_processing_image">Procesando atributo de usuario de tipo imagen</string>
+ <string name="msg_ip_uat_processing_unknown">Procesando atributo de usuario de tipo desconocido</string>
+ <string name="msg_ip_uat_cert_bad">¡Se encontró un certificado defectuoso!</string>
+ <string name="msg_ip_uat_cert_error">¡Error procesando certificado!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Ya tiene un certificado no revocable, omitiendo.</string>
+ <string name="msg_ip_uat_cert_old">El certificado es más antiguo que el anterior, omitiendo.</string>
+ <string name="msg_ip_uat_cert_new">El certificado es más reciente, reemplazando el anterior.</string>
+ <string name="msg_ip_uat_cert_good">Hallado certificado correcto por %1$s</string>
+ <string name="msg_ip_uat_cert_good_revoke">Hallada revocación de certificado correcta por %1$s </string>
+ <plurals name="msg_ip_uat_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>
+ </plurals>
+ <string name="msg_ip_uat_classifying">Clasificando atributos de usuario</string>
+ <string name="msg_ip_uat_revoked">El atributo de usuario está revocado</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-->
@@ -637,6 +713,7 @@
<string name="msg_is_subkey_nonexistent">La subclave %s no está disponible en la clave secreta (privada)</string>
<string name="msg_is_subkey_ok">Subclave secreta (privada) %s marcada como disponible</string>
<string name="msg_is_subkey_empty">Subclave secreta (privada) %s marcada como disponible, con frase-contraseña vacía</string>
+ <string name="msg_is_subkey_pin">Subclave secreta %s marcada como disponible, con PIN</string>
<string name="msg_is_subkey_stripped">Subclave secreta (privada) %s marcada como desnuda</string>
<string name="msg_is_subkey_divert">Se marcó la subclave secreta (privada) %s como \'desviar a smartcard/NFC\'</string>
<string name="msg_is_success_identical">El juego de claves no contiene nuevos datos, no hay nada que hacer</string>
@@ -649,25 +726,28 @@
<string name="msg_kc_error_master_algo">¡La clave maestra usa un algoritmo (%s) desconocido!</string>
<string name="msg_kc_error_dup_key">La subclave %s aparece dos veces en el juego de claves (keyring). El juego de claves está mal formado, ¡no se va a importar!</string>
<string name="msg_kc_master">Procesando clave maestra</string>
- <string name="msg_kc_master_bad_err">Eliminando certificado defectuoso de revocación de juego de claves</string>
- <string name="msg_kc_master_bad_local">Eliminando certificado de revocación de juego de claves, con distintivo \"local\"</string>
- <string name="msg_kc_master_bad_time">Eliminando certificado de revocación de juego de claves, con marca de tiempo futura</string>
- <string name="msg_kc_master_bad_type">Eliminando certificado de clave maestra, de tipo desconocido (%s)</string>
+ <string name="msg_kc_master_bad_type">Eliminando certificado de clave maestra de tipo desconocido (%s)</string>
+ <string name="msg_kc_master_bad_local">Eliminando certificado de clave maestra con distintivo \"local\"</string>
+ <string name="msg_kc_master_bad_err">Eliminando certificado de clave maestra defectuoso</string>
+ <string name="msg_kc_master_bad_time">Eliminando certificado de revocación de juego de claves con marca de tiempo en el futuro</string>
<string name="msg_kc_master_bad_type_uid">Eliminando certificado de identificación de usuario en posición incorrecta</string>
- <string name="msg_kc_master_bad">Eliminando certificado defectuoso de revocación de juego de claves</string>
+ <string name="msg_kc_master_bad">Eliminando certificado de clave maestra defectuoso</string>
+ <string name="msg_kc_master_local">Eliminando certificado de clave maestra con distitivo \"local\"</string>
<string name="msg_kc_revoke_dup">Eliminando certificado redundante de revocación de juego de claves </string>
+ <string name="msg_kc_notation_dup">Eliminando certificado de notación redundante</string>
+ <string name="msg_kc_notation_empty">Eliminando certificado de notación vacía</string>
<string name="msg_kc_sub">Procesando subclave %s</string>
- <string name="msg_kc_sub_bad">Eliminando certificado no válido de vinculación de subclave</string>
+ <string name="msg_kc_sub_bad">Eliminando certificado no vigente de vinculación de subclave</string>
<string name="msg_kc_sub_bad_err">Eliminando certificado defectuoso de vinculación de subclave</string>
<string name="msg_kc_sub_bad_local">Eliminando certificado de vinculación de subclave, con distintivo \"local\"</string>
<string name="msg_kc_sub_bad_keyid">La identificación del publicante de la vinculación de subclave no coincide</string>
<string name="msg_kc_sub_bad_time">Eliminando certificado de vinculación de subclave, con marca de tiempo futura</string>
<string name="msg_kc_sub_bad_type">Tipo de certificado de subclave desconocido: %s</string>
<string name="msg_kc_sub_dup">Eliminando certificado redundante de vinculación de subclave</string>
- <string name="msg_kc_sub_primary_bad">Eliminando certificado de vinculación de subclave debido a un certificado de vinculación principal no válido</string>
+ <string name="msg_kc_sub_primary_bad">Eliminando certificado de vinculación de subclave debido a un certificado de vinculación principal no vigente</string>
<string name="msg_kc_sub_primary_bad_err">Eliminando certificado de vinculación de subclave debido a un certificado de vinculación principal defectuoso</string>
<string name="msg_kc_sub_primary_none">Eliminando certificado de vinculación de subclave debido a un certificado de vinculación principal ausente</string>
- <string name="msg_kc_sub_no_cert">No se encontró ningún certificado válido para %s, eliminándola del juego de claves</string>
+ <string name="msg_kc_sub_no_cert">No se encontró ningún certificado vigente para %s, eliminándola del juego de claves</string>
<string name="msg_kc_sub_revoke_bad_err">Eliminando certificado defectuoso de revocación de subclave</string>
<string name="msg_kc_sub_revoke_bad">Eliminando certificado defectuoso de revocación de subclave</string>
<string name="msg_kc_sub_revoke_dup">Eliminando certificado redundante de revocación de subclave</string>
@@ -693,10 +773,25 @@
<string name="msg_kc_uid_foreign">Eliminando certificado por \'%s\' de identificación de usuario ajeno </string>
<string name="msg_kc_uid_revoke_dup">Eliminando certificado de revocación redundante para la identificación de usuario \'%s\'</string>
<string name="msg_kc_uid_revoke_old">Eliminando certificado de revocación caducado para la identificación de usuario \'%s\'</string>
- <string name="msg_kc_uid_no_cert">No se encontró auto-certificado válido para la identificación de usuario \'%s\', eliminándola del juego de claves</string>
+ <string name="msg_kc_uid_no_cert">No se encontró auto-certificado vigente para la identificación de usuario \'%s\', eliminándola del juego de claves</string>
<string name="msg_kc_uid_remove">Eliminando identificación de usuario \'%s\' no válida</string>
- <string name="msg_kc_uid_dup">Eliminando identificación de usuario duplicada \'%s\'. La clave secreta (privada) contenía dos de ellas. ¡Esto puede dar lugar a certificados perdidos!</string>
+ <string name="msg_kc_uid_dup">Eliminando identificaciones de usuario duplicadas \'%s\'. El juego de claves contenía dos de ellas. ¡Esto puede resultar en certificados perdidos!</string>
<string name="msg_kc_uid_warn_encoding">¡La identificación de usuario no se verifica como UTF-8!</string>
+ <string name="msg_kc_uat_jpeg">Procesando atributo de usuario del tipo JPEG</string>
+ <string name="msg_kc_uat_unknown">Procesando atributo de usuario de tipo desconocido</string>
+ <string name="msg_kc_uat_bad_err">Eliminando auto certificados defectuosos para el atributo de usuario</string>
+ <string name="msg_kc_uat_bad_local">Eliminando certificado de atributo de usuario con indicativo \'local\'</string>
+ <string name="msg_kc_uat_bad_time">Eliminando atributo de usuario con marca de tiempo futura</string>
+ <string name="msg_kc_uat_bad_type">Eliminando certificado de atributo de usuario de tipo desconocido (%s)</string>
+ <string name="msg_kc_uat_bad">Eliminando auto certificado defectuoso para el atributo de usuario</string>
+ <string name="msg_kc_uat_cert_dup">Eliminando auto certificado desactualizado para el atributo de usuario</string>
+ <string name="msg_kc_uat_dup">Eliminando atributo de usuario duplicado. El juego de claves contenía dos de ellos. ¡Esto puede resultar en certificados perdidos!</string>
+ <string name="msg_kc_uat_foreign">Eliminando atributo de usuario ajeno certificado por</string>
+ <string name="msg_kc_uat_revoke_dup">Eliminando certificado de revocación redundante para el atributo de usuario</string>
+ <string name="msg_kc_uat_revoke_old">Eliminando certificado de revocación desactualizado para el atributo de usuario</string>
+ <string name="msg_kc_uat_no_cert">No se encontró auto certificado válido para el atributo de usuario, eliminándolo del juego de claves</string>
+ <string name="msg_kc_uat_remove">Eliminando atributo de usuario no válido</string>
+ <string name="msg_kc_uat_warn_encoding">¡La identificación de usuario no se verifica con formato UTF-8!</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_secret_dummy">Nueva subclave pública encontrada, ¡pero la generación de subclaves secretas (privadas) ficticias no está soportada!</string>
<string name="msg_mg_error_heterogeneous">¡Se intentaron fusionar juegos de claves con diferentes huellas de validación!</string>
@@ -715,7 +810,7 @@
<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_no_curve">¡No se especificó tamaño de clave! ¡Esto es un error de programación, por favor consigne un informe de fallo!</string>
<string name="msg_cr_error_no_keysize">¡No se especificó curva elíptica! ¡Esto es un error de programación, por favor consigne un informe de fallo!</string>
- <string name="msg_cr_error_internal_pgp">¡Error PGP interno!</string>
+ <string name="msg_cr_error_internal_pgp">¡Error OpenPGP interno!</string>
<string name="msg_cr_error_unknown_algo">¡Se seleccionó un algoritmo desconocido! ¡Esto es un error de programación, por favor consigne un informe de errores!</string>
<string name="msg_cr_error_flags_dsa">¡Se seleccionaron indicativos de clave defectuosa, DSA no puede usarse para cifrado!</string>
<string name="msg_cr_error_flags_elgamal">¡Se seleccionaron indicativos de clave defectuosa, ElGamal no puede usarse para firmado!</string>
@@ -723,6 +818,7 @@
<string name="msg_cr_error_flags_ecdh">¡Seleccionados indicativos de clave defectuosa, ECDH no puede usarse para firmado!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modificando el juego de claves %s</string>
+ <string name="msg_mf_error_divert_serial">¡El número de serie de una clave con indicativo desviar-a-tarjeta debe ser de 16 bytes! ¡Esto es un error de programación, por favor consigne un informe de error!</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 identificación de clave. Esto es un error interno, por favor ¡consigne un informe de error!</string>
@@ -730,13 +826,16 @@
<string name="msg_mf_error_master_none">¡No se encontró certificado maestro sobre el que operar! (¿Todos revocados?)</string>
<string name="msg_mf_error_noexist_primary">¡Se especificó una identificación de usuario principal errónea!</string>
<string name="msg_mf_error_noexist_revoke">¡Se especificó una identificación de usuario errónea para revocación!</string>
+ <string name="msg_mf_error_restricted">¡Se intentó efectuar una operación restringida sin frase-contraseña! ¡Este es un error de programación, por favor consigne un informe de error!</string>
<string name="msg_mf_error_revoked_primary">¡Las identificaciones de usuario revocadas no pueden ser las principales!</string>
<string name="msg_mf_error_null_expiry">El periodo hasta la expiración no puede ser \"el mismo que antes\" al crear subclave. Esto es un error de programación, por favor ¡rellene un informe de fallo!</string>
<string name="msg_mf_error_passphrase_master">¡Error fatal descrifrando la clave maestra! Probablemente esto se daba a un error de programación, por favor ¡rellene un informe de fallo!</string>
- <string name="msg_mf_error_pgp">¡Error interno de PGP!</string>
+ <string name="msg_mf_error_pgp">¡Error OpenPGP interno!</string>
<string name="msg_mf_error_sig">¡Excepción con la firma!</string>
<string name="msg_mf_master">Modificando certificaciones maestras</string>
- <string name="msg_mf_passphrase">Cambiando frase-contraseña para el juego de claves (keyring)...</string>
+ <string name="msg_mf_notation_empty">Añadiendo paquete de notación vacío</string>
+ <string name="msg_mf_notation_pin">Añadiendo paquete de notación de PIN</string>
+ <string name="msg_mf_passphrase">Cambiando la frase-contraseña para el juego de claves</string>
<string name="msg_mf_passphrase_key">Re-cifrando subclave %s con nueva frase-contraseña</string>
<string name="msg_mf_passphrase_empty_retry">Fallo al establecer nueva frase-contraseña, intentándolo de nuevo con una antigua frase-contraseña vacía</string>
<string name="msg_mf_passphrase_fail">¡La frase contraseña para la subclave no pudo cambiarse! (¿Tiene la subclave una diferente de la de las otras claves?)</string>
@@ -754,6 +853,9 @@
<string name="msg_mf_uid_primary">Cambiando identificación de usuario primaria a %s</string>
<string name="msg_mf_uid_revoke">Revocando la identificación de usuario %s</string>
<string name="msg_mf_uid_error_empty">¡La identificación de usuario no debe estar vacía!</string>
+ <string name="msg_mf_uat_error_empty">¡El atributo de usuario no debe estar vacío!</string>
+ <string name="msg_mf_uat_add_image">Añadiendo atributo de usuario de tipo imagen</string>
+ <string name="msg_mf_uat_add_unknown">Añadiendo atributo de usuario de tipo desconocido</string>
<string name="msg_mf_unlock_error">¡Error desbloqueando juego de claves!</string>
<string name="msg_mf_unlock">Desbloqueando juego de claves (keyring)</string>
<!--Consolidate-->
@@ -774,6 +876,7 @@
<string name="msg_con_error_public">¡Error al reimportar claves públicas!</string>
<string name="msg_con_error_secret">¡Error reimportando claves secretas (privadas)!</string>
<string name="msg_con_recover">Retomando el proceso de consolidación</string>
+ <string name="msg_con_recursive">Omitiendo consolidación recursiva</string>
<string name="msg_con_recover_unknown">Retomando el proceso de consolidación desde un estado desconocido</string>
<plurals name="msg_con_reimport_public">
<item quantity="one">Reimportando una clave pública</item>
@@ -787,6 +890,19 @@
<string name="msg_con_reimport_secret_skip">No hay claves públicas a reimportar, omitiendo...</string>
<string name="msg_con_warn_delete_public">Excepción borrando fichero de caché de claves públicas</string>
<string name="msg_con_warn_delete_secret">Excepción al borrar fichero de caché de claves secretas (privadas)</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">Realizando operación en la clave</string>
+ <string name="msg_ed_caching_new">Guardar en caché nueva frase-contraseña</string>
+ <string name="msg_ed_error_no_parcel">¡SaveKeyringParcel ausente! (esto es un fallo, por favor notifíquelo)</string>
+ <string name="msg_ed_error_key_not_found">¡Clave no encontrada!</string>
+ <string name="msg_ed_fetching">Descargando clave a modificar (%s)</string>
+ <string name="msg_ed_success">Operación en la clave completada</string>
+ <!--Promote key-->
+ <string name="msg_pr">Promover clave pública a clave secreta (privada)</string>
+ <string name="msg_pr_error_already_secret">¡La clave ya es una clave secreta (privada)!</string>
+ <string name="msg_pr_error_key_not_found">¡Clave no encontrada!</string>
+ <string name="msg_pr_fetching">Descargar clave para modificar (%s)</string>
+ <string name="msg_pr_success">La clave se promovió con éxito</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">¡La edición de claves NFC (aún) no está soportada!</string>
<string name="msg_ek_error_dummy">¡No se pudo editar el juego de claves (keyring) con la clave maestra desnuda!</string>
@@ -795,11 +911,13 @@
<string name="msg_dc_askip_no_key">Datos no cifrados con clave conocida, omitiendo...</string>
<string name="msg_dc_askip_not_allowed">Datos no cifrados con clave permitida, omitiendo...</string>
<string name="msg_dc_asym">Se encontró un bloque de datos cifrados asimétricamente para la clave %s</string>
+ <string name="msg_dc_charset">Se encontró cabecera de juego de caracteres: \'%s\'</string>
<string name="msg_dc_clear_data">Procesando datos literales</string>
<string name="msg_dc_clear_decompress">Desempaquetando datos comprimidos</string>
<string name="msg_dc_clear_meta_file">Nombre de fichero: %s</string>
<string name="msg_dc_clear_meta_mime">Tipo MIME: %s</string>
<string name="msg_dc_clear_meta_size">Tamaño de fichero: %s</string>
+ <string name="msg_dc_clear_meta_size_unknown">Tamaño de fichero desconocido</string>
<string name="msg_dc_clear_meta_time">Hora de la modificación: %s</string>
<string name="msg_dc_clear_signature_bad">¡Comprobación de firma NO CORRECTA!</string>
<string name="msg_dc_clear_signature_check">Verificando datos de firma</string>
@@ -809,11 +927,12 @@
<string name="msg_dc_error_bad_passphrase">Error al desbloquear clave, ¡frase-contraseña errónea!</string>
<string name="msg_dc_error_extract_key">¡Error desconocido al desbloquear clave!</string>
<string name="msg_dc_error_integrity_check">¡Error de comprobación de integridad!</string>
+ <string name="msg_dc_error_integrity_missing">¡Verificación de integridad ausente! Esto puede ocurrir porque la aplicación de cifrado no está actualizada, o debido a un ataque desactualización.</string>
<string name="msg_dc_error_invalid_siglist">¡No se encontraron datos de firma válidos!</string>
<string name="msg_dc_error_io">¡Se encontró Excepción de E/S durante la operación!</string>
<string name="msg_dc_error_no_data">¡No se encontraron datos cifrados en el flujo de datos (`stream`)!</string>
<string name="msg_dc_error_no_key">¡No se encontraron datos cifrados con clave secreta (privada) conocida en el flujo de datos (`stream`)!</string>
- <string name="msg_dc_error_pgp_exception">¡Se encontró una Excepción PGP durante la operación!</string>
+ <string name="msg_dc_error_pgp_exception">¡Se encontró una excepción OpenPGP durante la operación!</string>
<string name="msg_dc_integrity_check_ok">¡Comprobación de integridad CORRECTA!</string>
<string name="msg_dc_ok_meta_only">Sólo fueron solicitados los metadatos, omitiendo descifrado</string>
<string name="msg_dc_ok">CORRECTO</string>
@@ -828,36 +947,62 @@
<string name="msg_dc_trail_sym">Se encontró huella, datos cifrados simétricamente</string>
<string name="msg_dc_trail_unknown">Se encontró huella, datos de tipo desconocido</string>
<string name="msg_dc_unlocking">Desbloqueando clave secreta (privada)</string>
+ <!--Messages for VerifySignedLiteralData operation-->
+ <string name="msg_vl">Comenzando comprobación de firma</string>
+ <string name="msg_vl_error_no_siglist">No hay lista de firmas en los datos literales firmados</string>
+ <string name="msg_vl_error_wrong_key">Mensaje no firmado con una clave correcta</string>
+ <string name="msg_vl_error_missing_literal">No hay carga útil en los datos literales firmados</string>
+ <string name="msg_vl_clear_meta_file">Nombre de fichero: %s</string>
+ <string name="msg_vl_clear_meta_mime">Tipo MIME: %s</string>
+ <string name="msg_vl_clear_meta_time">Fecha de modificación: %s</string>
+ <string name="msg_vl_clear_meta_size">Tamaño de fichero: %s</string>
+ <string name="msg_vl_clear_signature_check">Verificando datos de firma</string>
+ <string name="msg_vl_error_integrity_check">¡Error de comprobación de integridad!</string>
+ <string name="msg_vl_ok">Correcto</string>
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">Preparando claves públicas para cifrado</string>
- <string name="msg_se_clearsign_only">¡No está soportado el firmado de la entrada de texto no cifrado (`cleartext`)!</string>
- <string name="msg_se_compressing">Preparando compresión</string>
- <string name="msg_se_encrypting">Cifrando datos</string>
- <string name="msg_se_error_bad_passphrase">¡Frase-contraseña errónea!</string>
- <string name="msg_se_error_io">¡Se encontró Excepción de E/S durante la operación!</string>
- <string name="msg_se_error_key_sign">¡La clave de firmado seleccionada no puede firmar datos!</string>
- <string name="msg_se_error_sign_key">¡Error descargando clave de firmado!</string>
- <string name="msg_se_error_nfc">¡Error de datos NFC!</string>
- <string name="msg_se_error_no_passphrase">¡No se proporcionó frase-contraseña!</string>
- <string name="msg_se_error_pgp">¡Error interno de PGP!</string>
- <string name="msg_se_error_sig">¡Se encontró excepción de firma PGP!</string>
- <string name="msg_se_error_unlock">¡Error desconocido desbloqueando clave!</string>
- <string name="msg_se_key_ok">Cifrando para la clave: %s</string>
- <string name="msg_se_key_unknown">Clave para cifrado perdida: %s</string>
- <string name="msg_se_key_warn">Clave para cifrado errónea: %s</string>
- <string name="msg_se_ok">¡Operación de firmado/cifrado completada!</string>
- <string name="msg_se_pending_nfc">Se requiere credencial NFC, solicitando su introducción por el usuario...</string>
- <string name="msg_se_pending_passphrase">Se requiere frase-contraseña, solicitando que el usuario la introduzca...</string>
- <string name="msg_se_signing">Firmando datos (sin cifrado)</string>
- <string name="msg_se_sigcrypting">Cifrando datos con firma</string>
- <string name="msg_se">Iniciando operación de firmado y/o cifrado</string>
- <string name="msg_se_symmetric">Preparando cifrado simétrico</string>
+ <string name="msg_se">Iniciando operación de firmado/cifrado</string>
+ <string name="msg_se_input_bytes">Procesando entrada de matriz de bytes</string>
+ <string name="msg_se_input_uri">Procesando entrada de URI</string>
+ <string name="msg_se_error_no_input">¡No se proporcionó entrada!</string>
+ <string name="msg_se_error_input_uri_not_found">¡Error al abrir URI para lectura!</string>
+ <string name="msg_se_error_output_uri_not_found">¡Error al abrir URI para escritura!</string>
+ <string name="msg_se_error_too_many_inputs">¡Se especificaron más entradas que salidas! Probablemente esto es un error de programación, ¡por favor informe!</string>
+ <string name="msg_se_warn_output_left">Se dejaron las salidas pero no las entradas. Probablemente esto es un error de programación, ¡por favor informe!</string>
+ <string name="msg_se_success">Operación de firmado/cifrado completada</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">Preparando claves públicas para cifrado</string>
+ <string name="msg_pse_clearsign_only">¡El fimado de texto sin cifrar (cleartext) no está soportado!</string>
+ <string name="msg_pse_compressing">Preparando compresión</string>
+ <string name="msg_pse_encrypting">Cifrando datos</string>
+ <string name="msg_pse_error_bad_passphrase">¡Frase-contraseña errónea!</string>
+ <string name="msg_pse_error_hash_algo">¡El algoritmo de identificación criptográfica (hash) solicitado no está soportado por esta clave!</string>
+ <string name="msg_pse_error_io">¡Se encontró una excepción de E/S durante la operación!</string>
+ <string name="msg_pse_error_key_sign">¡La clave de firmado seleccionada no puede firmar datos!</string>
+ <string name="msg_pse_error_sign_key">¡Error al descargar clave de firmado!</string>
+ <string name="msg_pse_error_nfc">¡Error de datos NFC!</string>
+ <string name="msg_pse_error_no_passphrase">¡No se proporcionó frase-contraseña!</string>
+ <string name="msg_pse_error_pgp">¡Error interno de OpenPGP!</string>
+ <string name="msg_pse_error_sig">¡Se encontró una excepción de firma OpenPGP!</string>
+ <string name="msg_pse_error_unlock">¡Error desconocido al desbloquear clave!</string>
+ <string name="msg_pse_key_ok">Cifrando para la clave: %s</string>
+ <string name="msg_pse_key_unknown">Clave para cifrado ausente: %s</string>
+ <string name="msg_pse_key_warn">Clave para cifrado errónea: %s</string>
+ <string name="msg_pse_ok">¡Operación de firmado/cifrado completada!</string>
+ <string name="msg_pse_pending_nfc">Se requiere credencial NFC, solicitando su introducción al usuario...</string>
+ <string name="msg_pse_pending_passphrase">Se requiere frase-contraseña, solicitando su introducción al usuario.</string>
+ <string name="msg_pse_signing">Firmando datos (sin cifrado)</string>
+ <string name="msg_pse_signing_cleartext">Creando firma de texto sin cifrar (cleartext)</string>
+ <string name="msg_pse_signing_detached">Creando firma desacoplada</string>
+ <string name="msg_pse_sigcrypting">Cifrando datos con firma</string>
+ <string name="msg_pse">Iniciando operación de firmado y/o cifrado</string>
+ <string name="msg_pse_symmetric">Preparando cifrado simétrico</string>
<string name="msg_crt_certifying">Generando certificaciones</string>
<string name="msg_crt_certify_all">Certificando todas las identificaciones de usuario para la clave %s</string>
<plurals name="msg_crt_certify_some">
<item quantity="one">Certificando una identificación de usuario para la clave %2$s</item>
<item quantity="other">Certificando %1$d identificaciones de usuario para la clave %2$s</item>
</plurals>
+ <string name="msg_crt_error_self">¡No se puede emitir un auto-certificado como este!</string>
<string name="msg_crt_error_master_not_found">¡Clave maestra no encontrada!</string>
<string name="msg_crt_error_nothing">¡No se certificaron claves!</string>
<string name="msg_crt_error_unlock">¡Error desbloqueando clave maestra!</string>
@@ -887,6 +1032,7 @@
<string name="msg_import_fingerprint_ok">Comprobación de la huella de validación correcta</string>
<string name="msg_import_merge">Incorporando datos descargados</string>
<string name="msg_import_error">¡La operación de importación falló!</string>
+ <string name="msg_import_error_io">¡Fallo en la operación de importación debido a un error de e/s!</string>
<string name="msg_import_partial">¡Operación de importado completada, con errores!</string>
<string name="msg_import_success">¡Operación de importado exitosa!</string>
<plurals name="msg_export">
@@ -903,6 +1049,7 @@
<string name="msg_export_error_storage">¡El almacenamiento no está listo para escritura!</string>
<string name="msg_export_error_db">¡Error de base de datos!</string>
<string name="msg_export_error_io">¡Error de entrada/salida!</string>
+ <string name="msg_export_error_key">¡Error al preprocesar los datos de la clave!</string>
<string name="msg_export_success">Operación de exportado exitosa</string>
<string name="msg_del_error_empty">¡No hay nada que borrar!</string>
<string name="msg_del_error_multi_secret">¡Las claves secretas (privadas) sólo se pueden borrar individualmente!</string>
@@ -923,7 +1070,7 @@
</plurals>
<string name="msg_acc_saved">Cuenta guardada</string>
<string name="msg_download_success">¡Descargado con éxito!</string>
- <string name="msg_download_no_valid_keys">¡No se encontraron clave válidas en el fichero/portapapeles!</string>
+ <string name="msg_download_no_valid_keys">¡No se encontraron claves vigentes en el fichero/portapapeles!</string>
<string name="msg_download_no_pgp_parts">PENDIENTE: ¡plurales!</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>
@@ -939,6 +1086,11 @@
<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">Frase-contraseña</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 desde fichero</string>
+ <string name="first_time_skip">Omitir configuración</string>
<!--unsorted-->
<string name="section_certifier_id">Certificador</string>
<string name="section_cert">Detalles del certificado</string>
@@ -948,6 +1100,8 @@
<string name="certs_text">Aquí sólo se muestran auto-certificados validados y certificados validados creados con sus claves.</string>
<string name="section_uids_to_certify">Identificaciones para</string>
<string name="certify_text">Las claves que está importando contienen \"identificaciones\": nombres y correos electrónicos. Para certificación seleccione exactamente aquellas que coinciden con lo que usted esperaba.</string>
+ <string name="certify_fingerprint_text">Compare la huella de validación mostrada, caracter por caracter, con la que se muestra en el dispositivo de su colega.</string>
+ <string name="certify_fingerprint_text2">¿Coinciden las huellas de validación mostradas?</string>
<string name="label_revocation">Razón de la revocación</string>
<string name="label_verify_status">Estado de la verificación</string>
<string name="label_cert_type">Tipo</string>
@@ -969,9 +1123,32 @@
<string name="error_multi_not_supported">El guardado de múltiples ficheros no está soportado. Esto es una limitación de su Android actual.</string>
<string name="key_colon">Clave:</string>
<string name="exchange_description">Para iniciar un intercambio de claves, en el lado derecho elija el número de participantes, y luego pulse el botón \"Iniciar intercambio\".\n\nSe le formularán dos preguntas más para asegurar que sólo están en el intercambio los participantes debidos, y que sus huellas de validación son correctas.</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 desde fichero</string>
- <string name="first_time_skip">Omitir configuración</string>
+ <string name="btn_start_exchange">Comenzar intercambio</string>
+ <string name="user_id_none"><![CDATA[<ninguno>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">Escoja un método de desbloqueo</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Introduzca frase-contraseña</string>
+ <string name="passphrase">Frase-contraseña</string>
+ <string name="noPassphrase">Sin frase-contraseña</string>
+ <string name="no_passphrase_set">No se estableció frase-contraseña</string>
+ <string name="passphrases_match">Las frases-contraseña no coinciden</string>
+ <string name="passphrase_saved">Frase-contraseña guardada</string>
+ <string name="passphrase_invalid">Frase-contraseña no válida</string>
+ <string name="missing_passphrase">Frase-contraseña ausente</string>
+ <string name="passphrase_again">De nuevo</string>
+ <string name="lockpattern">Patrón de bloqueo</string>
+ <string name="lockpatternNFC">NFC + patrón de bloqueo</string>
+ <string name="unlock_method">Método de desbloqueo</string>
+ <string name="set_passphrase">Establecer frase-contraseña</string>
+ <string name="draw_lockpattern">Dibujar patrón de bloqueo</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Etiqueta incorrecta. Por favor inténtelo de nuevo.</string>
+ <string name="enable_nfc">Por favor active NFC en su configuración</string>
+ <string name="no_nfc_support">Este dispositivo no soporta NFC</string>
+ <string name="nfc_write_succesful">Se escribió con éxito en la etiqueta NFC</string>
+ <string name="unlocked">Desbloqueado</string>
+ <string name="nfc_settings">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 c811a12f0..057eb8e00 100644
--- a/OpenKeychain/src/main/res/values-et/strings.xml
+++ b/OpenKeychain/src/main/res/values-et/strings.xml
@@ -4,10 +4,7 @@
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
<!--title-->
<string name="title_decrypt">Dekrüpteeri</string>
- <string name="title_unlock">Salasõne</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_import_keys">Impordi võtmeid</string>
<string name="title_export_key">Ekspordi võti</string>
<string name="title_export_keys">Ekspordi võtmed</string>
@@ -93,6 +90,8 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<!--Create key-->
<!--View key-->
@@ -107,10 +106,18 @@
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<!--PassphraseCache-->
- <!--unsorted-->
<!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-eu/strings.xml b/OpenKeychain/src/main/res/values-eu/strings.xml
new file mode 100644
index 000000000..233347bd3
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-eu/strings.xml
@@ -0,0 +1,69 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--GENERAL: Please put all strings inside quotes as described in example 1 on
+ http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <!--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-->
+ <!--Add keys-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--elliptic curve names-->
+ <!--not in for now, see SaveKeyringParcel
+ <string name="key_curve_bp_p256">"Brainpool P-256"</string>
+ <string name="key_curve_bp_p384">"Brainpool P-384"</string>
+ <string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Generic result toast-->
+ <!--Import result toast-->
+ <!--Delete result toast-->
+ <!--Certify result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <!--Other messages used in OperationLogs-->
+ <!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
+ <!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <!--PassphraseCache-->
+ <!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-fi/strings.xml b/OpenKeychain/src/main/res/values-fi/strings.xml
index 460c5462e..804383637 100644
--- a/OpenKeychain/src/main/res/values-fi/strings.xml
+++ b/OpenKeychain/src/main/res/values-fi/strings.xml
@@ -3,13 +3,191 @@
<!--GENERAL: Please put all strings inside quotes as described in example 1 on
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
<!--title-->
+ <string name="title_select_recipients">Valitse Avaimet</string>
+ <string name="title_select_secret_key">Valitse Oma Avain</string>
+ <string name="title_encrypt_text">Salaa Tekstiä</string>
+ <string name="title_encrypt_files">Salaa Tiedostoja</string>
+ <string name="title_decrypt">Pura Salaus</string>
+ <string name="title_unlock">Avaa Avain</string>
+ <string name="title_add_subkey">Lisää aliavain</string>
+ <string name="title_edit_key">Muokkaa avainta</string>
+ <string name="title_preferences">Asetukset</string>
+ <string name="title_cloud_search_preferences">Pilvihaun Asetukset</string>
+ <string name="title_api_registered_apps">Sovellukset</string>
+ <string name="title_change_passphrase">Vaihda Salasana</string>
+ <string name="title_share_fingerprint_with">Jaa sormenjälki...</string>
+ <string name="title_share_key">Jaa avain...</string>
+ <string name="title_share_file">Jaa tiedosto...</string>
+ <string name="title_share_message">Jaa viesti...</string>
+ <string name="title_encrypt_to_file">Salaa Tiedostoon</string>
+ <string name="title_decrypt_to_file">Pura Tiedostoon</string>
+ <string name="title_import_keys">Tuo Avaimia</string>
+ <string name="title_add_keys">Lisää Avaimia</string>
+ <string name="title_export_key">Vie Avain</string>
+ <string name="title_export_keys">Vie Avaimia</string>
+ <string name="title_key_not_found">Avainta Ei Löydy</string>
+ <string name="title_send_key">Lähetä Avainpalvelimelle</string>
+ <string name="title_certify_key">Varmenna Identiteetit</string>
+ <string name="title_key_details">Avaimen Tiedot</string>
+ <string name="title_help">Apua</string>
+ <string name="title_log_display">Loki</string>
+ <string name="title_create_key">Luo Avain</string>
+ <string name="title_exchange_keys">Vaihda Avaimia</string>
+ <string name="title_advanced_key_info">Lisätietoa Avaimesta</string>
<!--section-->
+ <string name="section_user_ids">Identiteetit</string>
+ <string name="section_keys">Aliavaimet</string>
+ <string name="section_cloud_search">Pilvihaku</string>
+ <string name="section_general">Yleistä</string>
+ <string name="section_defaults">Vakiot</string>
+ <string name="section_advanced">Lisäasetukset</string>
+ <string name="section_passphrase_cache">Salasanavälimuisti</string>
+ <string name="section_certify">Varmenna</string>
+ <string name="section_actions">Toiminteet</string>
+ <string name="section_share_key">Avain</string>
+ <string name="section_certification_key">Varmentamiseen käytetty Avaimesi</string>
+ <string name="section_upload_key">Synkronoi Avain</string>
+ <string name="section_key_server">Avainpalvelin</string>
+ <string name="section_fingerprint">Sormenjälki</string>
+ <string name="section_key_to_certify">Varmennettava avain</string>
+ <string name="section_decrypt_files">Tiedostot</string>
+ <string name="section_decrypt_text">Teksti</string>
+ <string name="section_certs">Varmenteet</string>
<!--button-->
+ <string name="btn_decrypt_verify_file">Pura, todenna ja tallenna tiedosto</string>
+ <string name="btn_decrypt_verify_message">Pura ja todenna viesti</string>
+ <string name="btn_encrypt_file">Salaa ja tallenna tiedosto</string>
+ <string name="btn_encrypt_share_file">Salaa ja jaa tiedosto</string>
+ <string name="btn_save">Tallenna</string>
+ <string name="btn_do_not_save">Peruuta</string>
+ <string name="btn_delete">Poista</string>
+ <string name="btn_no_date">Ei umpeutumisaikaa</string>
+ <string name="btn_okay">OK</string>
+ <string name="btn_export_to_server">Lataa Avainpalvelimelle</string>
+ <string name="btn_next">Seuraava</string>
+ <string name="btn_back">Takaisin</string>
+ <string name="btn_lookup_key">Etsi avain</string>
+ <string name="btn_share_encrypted_signed">Salaa ja jaa viesti</string>
+ <string name="btn_view_cert_key">Näytä varmennusavain</string>
+ <string name="btn_create_key">Luo avain</string>
+ <string name="btn_add_files">Lisää tiedosto(ja)</string>
+ <string name="btn_add_share_decrypted_text">Jaa purettu teksti</string>
+ <string name="btn_decrypt_and_verify">ja varmenna allekirjoitukset</string>
+ <string name="btn_decrypt_files">Pura tiedostoja</string>
<!--menu-->
+ <string name="menu_preferences">Asetukset</string>
+ <string name="menu_help">Apua</string>
+ <string name="menu_export_key">Vie tiedostoon</string>
+ <string name="menu_delete_key">Poista avain</string>
+ <string name="menu_create_key">Luo minun avaimeni</string>
+ <string name="menu_import_existing_key">Tuo tiedostosta</string>
+ <string name="menu_search">Etsi</string>
+ <string name="menu_beam_preferences">Beam asetukset</string>
+ <string name="menu_key_edit_cancel">Peruuta</string>
+ <string name="menu_encrypt_to">Salaa...</string>
+ <string name="menu_select_all">Valitse kaikki</string>
+ <string name="menu_add_keys">Lisää avaimia</string>
+ <string name="menu_search_cloud">Etsi pilvestä</string>
+ <string name="menu_export_all_keys">Vie kaikki avaimet</string>
+ <string name="menu_advanced">Näytä lisäinformaatio</string>
<!--label-->
+ <string name="label_message">Viesti</string>
+ <string name="label_file">Tiedosto</string>
+ <string name="label_files">Tiedosto(t)</string>
+ <string name="label_file_colon">Tiedosto:</string>
+ <string name="label_no_passphrase">Ei salasanaa</string>
+ <string name="label_passphrase">Salasana</string>
+ <string name="label_unlock">Avataan...</string>
+ <string name="label_passphrase_again">Toista salasana</string>
+ <string name="label_algorithm">Algoritmi</string>
+ <string name="label_ascii_armor">Tiedosto ASCII Armor</string>
+ <string name="label_file_ascii_armor">Käytä ASCII Armoria</string>
+ <string name="label_write_version_header">Anna muiden tietää että käytät OpenKeychainia</string>
+ <string name="label_write_version_header_summary">Kirjoittaa \'OpenKeychain v2.7\' OpenPGP-allekirjoituksiin, kryptattuun tekstiin sekä vietyihin avaimiin</string>
+ <string name="label_use_default_yubikey_pin">Käytä vakiota YubiKey PIN:iä</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Käytä numeerista näppäimistöä YuniKey PIN:iin</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Käyttää vakio-PIN:iä (123456) käyttääkseen YubiKeyssejä NFC kautta</string>
+ <string name="label_asymmetric_from">Allekirjoittaja:</string>
+ <string name="label_to">Salaa:</string>
+ <string name="label_delete_after_encryption">Poista tiedosto salauksen jälkeen</string>
+ <string name="label_delete_after_decryption">Poista salauksen purkamisen jälkeen</string>
+ <string name="label_encryption_algorithm">Salausalgoritmi</string>
+ <string name="label_hash_algorithm">Tiivistealgoritmi</string>
+ <string name="label_symmetric">Salaa salasanalla</string>
+ <string name="label_passphrase_cache_ttl">Välimuistiaika</string>
+ <string name="label_passphrase_cache_subs">Väliaikaistalleta salasanat aliavaimen mukaan</string>
+ <string name="label_message_compression">Viestin pakkaus</string>
+ <string name="label_file_compression">Tiedoston pakkaus</string>
+ <string name="label_keyservers">Avainpalvelimet</string>
+ <string name="label_key_id">Avaimen ID</string>
+ <string name="label_creation">Luontiaika</string>
+ <string name="label_expiry">Umpeutumisaika</string>
+ <string name="label_usage">Käyttö</string>
+ <string name="label_key_size">Avaimen Koko</string>
+ <string name="label_ecc_curve">Elliptinen Käyrä</string>
+ <string name="label_main_user_id">Pääidentiteetti</string>
+ <string name="label_name">Nimi</string>
+ <string name="label_comment">Kommentti</string>
+ <string name="label_email">Email</string>
+ <string name="label_send_key">Synkronoi pilveen</string>
+ <string name="label_fingerprint">Sormenjälki</string>
+ <string name="expiry_date_dialog_title">Aseta umpeutumispäivämäärä</string>
+ <string name="label_first_keyserver_is_used">(Ensimmäinen avainpalvelin listalla on ensisijainen)</string>
+ <string name="label_preferred">ensisijainen</string>
+ <string name="user_id_no_name">&lt;ei nimeä&gt;</string>
+ <string name="none">&lt;ei mitään&gt;</string>
+ <string name="no_key">&lt;ei avainta&gt;</string>
+ <string name="can_encrypt">voi salata</string>
+ <string name="can_sign">voi allekirjoittaa</string>
+ <string name="can_certify">voi varmentaa</string>
+ <string name="can_certify_not">ei voi varmentaa</string>
+ <string name="expired">umpeutunut</string>
+ <string name="revoked">peruutettu</string>
+ <plurals name="n_keys">
+ <item quantity="one">1 avain</item>
+ <item quantity="other">%d avainta</item>
+ </plurals>
+ <plurals name="n_keyservers">
+ <item quantity="one">%d avainpalvelin</item>
+ <item quantity="other">%d avainpalvelinta</item>
+ </plurals>
+ <string name="secret_key">Salainen Avain:</string>
<!--choice-->
+ <string name="choice_none">Ei mitään</string>
+ <string name="choice_15secs">15 sek.</string>
+ <string name="choice_1min">1 min</string>
+ <string name="choice_3mins">3 min.</string>
+ <string name="choice_5mins">5 min.</string>
+ <string name="choice_10mins">10 min.</string>
+ <string name="choice_20mins">20 min.</string>
+ <string name="choice_40mins">40 min.</string>
+ <string name="choice_1hour">1 tunti</string>
+ <string name="choice_2hours">2 tuntia</string>
+ <string name="choice_4hours">4 tuntia</string>
+ <string name="choice_8hours">8 tuntia</string>
+ <string name="choice_forever">aina</string>
+ <string name="dsa">DSA</string>
+ <string name="elgamal">ElGamal</string>
+ <string name="rsa">RSA</string>
+ <string name="ecdh">ECDH</string>
+ <string name="ecdsa">ECDSA</string>
+ <string name="filemanager_title_open">Avaa...</string>
+ <string name="warning">Varoitus</string>
+ <string name="error">Virhe</string>
+ <string name="error_message">Virhe: %s</string>
<!--key flags-->
+ <string name="flag_certify">Varmenna</string>
+ <string name="flag_sign">Allekirjoita</string>
+ <string name="flag_encrypt">Salaa</string>
+ <string name="flag_authenticate">Autentikoi</string>
<!--sentences-->
+ <string name="wrong_passphrase">Väärä salasana.</string>
+ <string name="no_filemanager_installed">Yhteensopivaa tiedostonhallintaa ei ole asennettu.</string>
+ <string name="passphrases_do_not_match">Salasanat eivät vastaa toisiaan.</string>
+ <string name="passphrase_must_not_be_empty">Syötä salasana.</string>
+ <string name="passphrase_for_symmetric_encryption">Symmetrinen salaus.</string>
+ <string name="passphrase_for">Syötä salasana \'%s\':lle</string>
+ <string name="pin_for">Syötä PIN \'%s\':lle</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
@@ -36,6 +214,8 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<!--Create key-->
<!--View key-->
@@ -50,10 +230,18 @@
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<!--PassphraseCache-->
- <!--unsorted-->
<!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index b252dc9e0..50bd53921 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -9,13 +9,13 @@
<string name="title_encrypt_text">Chiffrer un texte</string>
<string name="title_encrypt_files">Chiffrer des fichiers</string>
<string name="title_decrypt">Déchiffrer</string>
- <string name="title_unlock">Phrase de passe</string>
+ <string name="title_unlock">Déverrouiller la clef</string>
<string name="title_add_subkey">Ajouter une sous-clef</string>
<string name="title_edit_key">Modifier une clef</string>
- <string name="title_preferences">Préférences</string>
+ <string name="title_preferences">Paramètres</string>
<string name="title_cloud_search_preferences">Préférences de recherche nuagique</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_key_server_preference">Serveurs de clefs</string>
<string name="title_change_passphrase">Modifier la phrase de passe</string>
<string name="title_share_fingerprint_with">Partager l\'empreinte avec...</string>
<string name="title_share_key">Partager la clef avec...</string>
@@ -36,8 +36,12 @@
<string name="title_create_key">Créer une clef</string>
<string name="title_exchange_keys">Échanger des clefs</string>
<string name="title_advanced_key_info">Infos avancées sur les clefs</string>
+ <string name="title_keys">Clefs</string>
<!--section-->
<string name="section_user_ids">identités</string>
+ <string name="section_should_you_trust">Devriez-vous faire confiance à cette clef ?</string>
+ <string name="section_proof_details">Vérification de preuve</string>
+ <string name="section_cloud_evidence">Preuve provenant du nuage</string>
<string name="section_keys">Sous-clefs</string>
<string name="section_cloud_search">Recherche nuagique</string>
<string name="section_general">Général</string>
@@ -55,6 +59,8 @@
<string name="section_decrypt_files">Fichiers</string>
<string name="section_decrypt_text">Texte</string>
<string name="section_certs">Certificats</string>
+ <string name="section_encrypt">Chiffrer</string>
+ <string name="section_decrypt">Déchiffrer</string>
<!--button-->
<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>
@@ -68,15 +74,19 @@
<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_no">Non</string>
+ <string name="btn_match">Les empreintes correspondent</string>
<string name="btn_lookup_key">Rechercher la clef</string>
<string name="btn_share_encrypted_signed">Chiffrer et partager le message</string>
<string name="btn_view_cert_key">Voir la clef de certification</string>
<string name="btn_create_key">Créer la clef</string>
<string name="btn_add_files">Ajouter un/des fichier(s)</string>
<string name="btn_add_share_decrypted_text">Partager le texte déchiffrer</string>
- <string name="btn_decrypt_clipboard">Déchiffrer à partir du presse-papiers</string>
+ <string name="btn_decrypt_clipboard">Déchiffrer du texte à partir du presse-papiers</string>
<string name="btn_decrypt_and_verify">et vérifier les signatures</string>
<string name="btn_decrypt_files">Déchiffrer les fichiers</string>
+ <string name="btn_encrypt_files">Chiffrer des fichiers</string>
+ <string name="btn_encrypt_text">Chiffrer du texte</string>
<!--menu-->
<string name="menu_preferences">Paramètres</string>
<string name="menu_help">Aide</string>
@@ -85,13 +95,16 @@
<string name="menu_create_key">Créer ma clef</string>
<string name="menu_import_existing_key">Importer depuis un fichier</string>
<string name="menu_search">Rechercher</string>
+ <string name="menu_nfc_preferences">Paramètres NFC</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>
<string name="menu_select_all">Tout sélectionner</string>
<string name="menu_add_keys">Ajouter des clefs</string>
+ <string name="menu_search_cloud">Rechercher dans le nuage</string>
<string name="menu_export_all_keys">Exporter toutes les clefs</string>
<string name="menu_advanced">Afficher les infos avancées</string>
+ <string name="menu_certify_fingerprint">Vérifier par comparaison d\'empreintes</string>
<!--label-->
<string name="label_message">Message</string>
<string name="label_file">Fichier</string>
@@ -189,7 +202,9 @@
<string name="passphrase_must_not_be_empty">Veuillez saisir une phrase de passe</string>
<string name="passphrase_for_symmetric_encryption">Chriffrement symétrique.</string>
<string name="passphrase_for">Saisir une phrase de passe pour « %s »</string>
+ <string name="pin_for">Saisir le NIP pour « %s »</string>
<string name="yubikey_pin_for">Saisir le NIP pour accéder à la Yubikey pour « %s »</string>
+ <string name="nfc_text">Tenez la YubiKey contre le dos de votre appareil.</string>
<string name="file_delete_confirmation">Êtes-vous certain de vouloir supprimer\n%s?</string>
<string name="file_delete_successful">Supprimé avec succès.</string>
<string name="no_file_selected">Choisir d\'abord un fichier.</string>
@@ -241,7 +256,8 @@
<string name="error_could_not_extract_private_key">impossible d\'extraire la clef privée</string>
<!--errors without preceeding Error:-->
<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_nfc_needed">La NFC doit être activée !</string>
+ <string name="error_beam_needed">Beam doit être activé !</string>
<string name="error_nothing_import">Aucune clef trouvée !</string>
<string name="error_contacts_key_id_missing">Échec lors de la récupération de l\'ID de clef à partir des contacts !</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>
@@ -278,9 +294,10 @@
<string name="progress_generating_ecdh">génération d\'une nouvelle clef ECDH... </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 ID d\'utilisateur...</string>
- <string name="progress_modify_revokeuid">révocation des ID d\'utilisateur...</string>
- <string name="progress_modify_primaryuid">changement de l\'ID d\'utilisateur principal...</string>
+ <string name="progress_modify_adduid">ajout des ID utilisateurs...</string>
+ <string name="progress_modify_adduat">ajout des attributs utilisateur...</string>
+ <string name="progress_modify_revokeuid">révocation des ID utilisateurs...</string>
+ <string name="progress_modify_primaryuid">changement de l\'ID utilisateur principal...</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_subkeystrip">dépouillement des sous-clefs...</string>
@@ -353,8 +370,9 @@
<string name="import_qr_code_wrong">Code QR incorrecte ! Veuillez réessayer !</string>
<string name="import_qr_code_too_short_fingerprint">L\'empreinte est trop courte (&lt; 16 caractères)</string>
<string name="import_qr_code_button">Balayer le code QR</string>
+ <string name="import_qr_code_text">Placez votre appareil photo au-dessus du code QR !</string>
<!--Generic result toast-->
- <string name="view_log">Consulter le journal</string>
+ <string name="view_log">Détails</string>
<string name="with_warnings">, avec des avertissements</string>
<string name="with_cancelled">, jusqu\'à l\'annulation</string>
<!--Import result toast-->
@@ -422,7 +440,6 @@
<string name="intent_send_encrypt">Chiffrer avec OpenKeychain</string>
<string name="intent_send_decrypt">Déchiffrer avec OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Aucune application enregistrée !\n\nUne liste d\'applications tierces prises en charge peut être trouvée dans l\'« Aide » !</string>
<string name="api_settings_show_info">Afficher les informations avancées</string>
<string name="api_settings_hide_info">Masquer les informations avancées</string>
<string name="api_settings_show_advanced">Afficher les paramètres avancés</string>
@@ -438,7 +455,9 @@
<string name="api_settings_delete_account">Supprimer le compte</string>
<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">Comptes (API dépréciée)</string>
+ <string name="api_settings_advanced">Informations avancées</string>
+ <string name="api_settings_allowed_keys">Clefs autorisées</string>
<string name="api_settings_settings">Paramètres</string>
<string name="api_settings_key">Clef du compte :</string>
<string name="api_settings_accounts_empty">Aucun compte n\'est attaché à cette appli.</string>
@@ -477,6 +496,7 @@
<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>
+ <string name="key_view_tab_keybase">Keybase.io</string>
<string name="user_id_info_revoked_title">Révoquée</string>
<string name="user_id_info_revoked_text">Cette identité a été révoquée par le propriétaire de la clef. Elle n\'est plus valide.</string>
<string name="user_id_info_certified_title">Certifié</string>
@@ -485,6 +505,43 @@
<string name="user_id_info_uncertified_text">Cette identité n\'a pas encore été certifiée. Vous ne pouvez pas être sûr que l\'identité correspond vraiment à une personne spécifique.</string>
<string name="user_id_info_invalid_title">Invalide</string>
<string name="user_id_info_invalid_text">Quelque chose ne va pas avec cette identité !</string>
+ <!--Key trust-->
+ <string name="key_trust_already_verified">Vous avez déjà certifié cette clef !</string>
+ <string name="key_trust_it_is_yours">C\'est une de vos clefs !</string>
+ <string name="key_trust_maybe">Cette clef n\'est ni révoquée, ni expirée.\nVous ne l\'avez pas certifiée, mais vous pourriez décider de lui faire confiance.</string>
+ <string name="key_trust_revoked">Cette clef a été révoquée par son propriétaire. Vous ne devriez pas lui faire confiance.</string>
+ <string name="key_trust_expired">Cette clef est expirée. Vous ne devriez pas lui faire confiance.</string>
+ <string name="key_trust_old_keys">Vous pourriez l\'utiliser pour déchiffrer un ancien message datant de la période de validité de la clef.</string>
+ <string name="key_trust_no_cloud_evidence">Aucune preuve de fiabilité provenant du nuage pour cette clef.</string>
+ <string name="key_trust_start_cloud_search">Lancer la recherche</string>
+ <string name="key_trust_results_prefix">Keybase.io offre des « preuves » affirmant que le propriétaire de cette clef : </string>
+ <!--keybase proof stuff-->
+ <string name="keybase_narrative_twitter">Publie vers Twitter en tant que</string>
+ <string name="keybase_narrative_github">Est connu sur GitHub en tant que</string>
+ <string name="keybase_narrative_dns">Contrôle le/les nom(s) de domaine</string>
+ <string name="keybase_narrative_web_site">Peut publier vers le/les site(s) Web</string>
+ <string name="keybase_narrative_reddit">Publie sur Reddit en tant que</string>
+ <string name="keybase_narrative_coinbase">Est connu sur Coinbase en tant que</string>
+ <string name="keybase_narrative_hackernews">Publie sur « Hacker News » en tant que</string>
+ <string name="keybase_narrative_unknown">Type de preuve inconnu</string>
+ <string name="keybase_proof_failure">Malheureusement cette preuve ne peut pas être vérifiée.</string>
+ <string name="keybase_unknown_proof_failure">Problème inconnu avec le vérificateur de preuve</string>
+ <string name="keybase_key_mismatch">L\'empreinte de clef ne correspondant pas à celle du billet de preuve</string>
+ <string name="keybase_dns_query_failure">Échec lors de la récupération de l\'enregistrement DNS TXT</string>
+ <string name="keybase_no_prover_found">Aucun vérificateur de preuve trouvé pour</string>
+ <string name="keybase_message_payload_mismatch">Le billet de preuve déchiffré ne correspond pas à la valeur attendue</string>
+ <string name="keybase_proof_succeeded">Cette preuve a été vérifié !</string>
+ <string name="keybase_a_post">Un billet</string>
+ <string name="keybase_fetched_from">récupéré de</string>
+ <string name="keybase_for_the_domain">pour le domaine</string>
+ <string name="keybase_contained_signature">contient un message qui a seulement pu être créé par le propriétaire de cette clef.</string>
+ <string name="keybase_twitter_proof">Un gazouillis</string>
+ <string name="keybase_dns_proof">Un enregistrement DNS TXT</string>
+ <string name="keybase_web_site_proof">Un fichier texte</string>
+ <string name="keybase_github_proof">Un gist</string>
+ <string name="keybase_reddit_proof">Un fichier JSON</string>
+ <string name="keybase_reddit_attribution">attribué par Reddit à</string>
+ <string name="keybase_verify">Vérifier</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>
@@ -520,13 +577,15 @@
<string name="create_key_hint_full_name">Nom complet, p. ex. Marc-Olivier Lagacé</string>
<string name="create_key_edit">Changer la configuration de la clef</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>
+ <string name="view_key_revoked">Révoquée : la clef ne doit plus être utilisée !</string>
+ <string name="view_key_expired">Expirée : le contact doit prolonger la validité de la clef !</string>
+ <string name="view_key_expired_secret">Expirée : vous pouvez prolonger la validité de la clef en la modifiant !</string>
+ <string name="view_key_my_key">Ma clef</string>
+ <string name="view_key_verified">Clef vérifiée</string>
+ <string name="view_key_unverified">Non vérifiée : balayez le code QR pour vérifier la clef !</string>
<!--Navigation Drawer-->
<string name="nav_keys">Clefs</string>
- <string name="nav_encrypt_text">Chiffrer un texte</string>
- <string name="nav_encrypt_files">Chiffrer des fichiers</string>
- <string name="nav_decrypt">Déchiffrer</string>
+ <string name="nav_encrypt_decrypt">Chiffrer/déchiffrer</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>
@@ -552,7 +611,7 @@
<string name="msg_ip_delete_old_fail">Aucune ancienne clef de supprimée (création d\'une nouvelle ?)</string>
<string name="msg_ip_delete_old_ok">L\'ancienne clef a été supprimée de la base de données</string>
<string name="msg_ip_encode_fail">Échec de l\'opération causé par une erreur d\'encodage</string>
- <string name="msg_ip_error_io_exc">Échec de l\'opération causé par une erreur d\'e/s</string>
+ <string name="msg_ip_error_io_exc">Échec de l\'opération causé par une erreur d\'E/S</string>
<string name="msg_ip_error_op_exc">Échec de l\'opération causé par une erreur de base de données</string>
<string name="msg_ip_error_remote_ex">Échec de l\'opération causé par une erreur interne</string>
<string name="msg_ip">Importation du trousseau public %s</string>
@@ -615,14 +674,29 @@
<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 d\'utilisateurs (aucune clef de confiance disponible)</string>
+ <string name="msg_ip_uid_classifying_zero">Classification des ID utilisateurs (aucune clef de confiance proposée)</string>
<plurals name="msg_ip_uid_classifying">
- <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>
+ <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>
</plurals>
- <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_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_uat_processing_image">Traitement de l\'attribut utilisateur de type image</string>
+ <string name="msg_ip_uat_processing_unknown">Traitement de l\'attribut utilisateur de type inconnu</string>
+ <string name="msg_ip_uat_cert_bad">Mauvais certificat rencontré !</string>
+ <string name="msg_ip_uat_cert_error">Erreur lors du traitement du certificat !</string>
+ <string name="msg_ip_uat_cert_nonrevoke">A déjà un certificat non-révocable, étape ignorée.</string>
+ <string name="msg_ip_uat_cert_old">Le certificat est plus ancien que le précédent, étape ignorée.</string>
+ <string name="msg_ip_uat_cert_new">Le certificat est plus récent, remplacement du précédent.</string>
+ <string name="msg_ip_uat_cert_good">Un bon certificat par %1$s a été trouvé</string>
+ <string name="msg_ip_uat_cert_good_revoke">Une révocation d\'un bon certificat par %1$s a été trouvée</string>
+ <plurals name="msg_ip_uat_certs_unknown">
+ <item quantity="one">Un certificat provenant d\'une clef publique inconnue est ignoré</item>
+ <item quantity="other">%s certificats provenant de clefs publiques inconnues sont ignorés</item>
+ </plurals>
+ <string name="msg_ip_uat_classifying">Organisation des attributs utilisateur</string>
+ <string name="msg_ip_uat_revoked">L\'attribut 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-->
@@ -637,6 +711,7 @@
<string name="msg_is_subkey_nonexistent">La sous-clef %s n\'est pas disponible dans la clef secrète</string>
<string name="msg_is_subkey_ok">Marquer la sous-clef secrète %s comme disponible</string>
<string name="msg_is_subkey_empty">Marquer la sous-clef secrète %s comme disponible, avec une phrase de passe vide</string>
+ <string name="msg_is_subkey_pin">La sous-clef secrète %s a été marquée comme disponible, avec un NIP</string>
<string name="msg_is_subkey_stripped">Marquer la sous-clef secrète %s comme dépouillée</string>
<string name="msg_is_subkey_divert">Marquer la sous-clef secrète %s comme « dévier vers la carte intelligente/la NFC »</string>
<string name="msg_is_success_identical">Le trousseau ne contient pas de nouvelle donnée, rien à faire</string>
@@ -645,17 +720,20 @@
<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_error_v3">Ceci est une clef OpenPGP version 3, qui a été déprécié et n\'est plus pris en charge !</string>
- <string name="msg_kc_error_no_uid">Le trousseau n\'a pas d\'ID d\'utilisateur valide !</string>
+ <string name="msg_kc_error_no_uid">Le trousseau n\'a pas d\'ID utilisateur valide !</string>
<string name="msg_kc_error_master_algo">La clef maîtresse utilise un algorithme (%s) inconnu ! </string>
<string name="msg_kc_error_dup_key">La sous-clef %s se présente deux fois dans le trousseau. Le trousseau est mal formé, pas d\'importation ! </string>
<string name="msg_kc_master">Traitement de la clef maîtresse</string>
- <string name="msg_kc_master_bad_err">Suppression du mauvais certificat de révocation du trousseau</string>
- <string name="msg_kc_master_bad_local">Suppression du certificat de révocation du trousseau ayant le drapeau « local »</string>
- <string name="msg_kc_master_bad_time">Suppression du certificat de révocation du trousseau ayant une estampille temporelle dans le futur</string>
<string name="msg_kc_master_bad_type">Suppression du certificat de clef maîtresse de type inconnu (%s)</string>
- <string name="msg_kc_master_bad_type_uid">Suppression du certificat de l\'ID d\'utilisateur en mauvaise position</string>
- <string name="msg_kc_master_bad">Suppression du mauvais certificat de révocation du trousseau</string>
+ <string name="msg_kc_master_bad_local">Suppression du certificat clef maîtresse ayant le drapeau « local »</string>
+ <string name="msg_kc_master_bad_err">Suppression du mauvais certificat de clef maîtresse</string>
+ <string name="msg_kc_master_bad_time">Suppression du certificat de révocation du trousseau ayant une estampille temporelle dans le futur</string>
+ <string name="msg_kc_master_bad_type_uid">Suppression du certificat de l\'ID utilisateur en mauvaise position</string>
+ <string name="msg_kc_master_bad">Suppression du mauvais certificat de clef maîtresse</string>
+ <string name="msg_kc_master_local">Suppression du certificat de clef maîtresse ayant le drapeau « local »</string>
<string name="msg_kc_revoke_dup"> Suppression du certificat redondant de révocation du trousseau</string>
+ <string name="msg_kc_notation_dup">Suppression du certificat de notation redondant</string>
+ <string name="msg_kc_notation_empty">Suppression du certificat de notation vide</string>
<string name="msg_kc_sub">Traitement de la sous-clef %s</string>
<string name="msg_kc_sub_bad">Suppression du certificat invalide de liaison de la sous-clef</string>
<string name="msg_kc_sub_bad_err">Suppression du mauvais certificat de liaison de la sous-clef</string>
@@ -685,18 +763,33 @@
<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 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_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_cert_dup">Suppression de l\'auto-certificat périmé pour l\'ID d\'utilisateur « %s »</string>
- <string name="msg_kc_uid_foreign">Suppression du certificat d\'ID d\'utilisateur étranger 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>
- <string name="msg_kc_uid_dup">Suppression de l\'ID d\'utilisateur en double « %s ». La clef secrète en contenait deux. Ceci pourrait entraîner des certificats manquants !</string>
- <string name="msg_kc_uid_warn_encoding">L\'ID d\'utilisateur ne passe pas le test UTF-8 !</string>
+ <string name="msg_kc_uid_cert_dup">Suppression de l\'auto-certificat périmé pour l\'ID utilisateur « %s »</string>
+ <string name="msg_kc_uid_foreign">Suppression du certificat d\'ID utilisateur étranger 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_remove">Suppression de l\'ID utilisateur invalide « %s »</string>
+ <string name="msg_kc_uid_dup">Suppression de l\'ID d\'utilisateur en double « %s ». Le trousseau en contenait deux. Ceci pourrait entraîner des certificats manquants !</string>
+ <string name="msg_kc_uid_warn_encoding">L\'ID utilisateur ne passe pas le test UTF-8 !</string>
+ <string name="msg_kc_uat_jpeg">Traitement de l\'attribut utilisateur de type JPEG</string>
+ <string name="msg_kc_uat_unknown">Traitement de l\'attribut utilisateur de type inconnu</string>
+ <string name="msg_kc_uat_bad_err">Suppression du mauvais auto-certificat pour l\'attribut utilisateur</string>
+ <string name="msg_kc_uat_bad_local">Suppression de l\'attribut utilisateur ayant le drapeau « local »</string>
+ <string name="msg_kc_uat_bad_time">Suppression de l\'attribut utilisateur ayant une estampille temporelle dans le futur</string>
+ <string name="msg_kc_uat_bad_type">Suppression du certificat d\'attribut utilisateur de type inconnu (%s)</string>
+ <string name="msg_kc_uat_bad">Suppression du mauvais auto-certificat pour l\'attribut utilisateur</string>
+ <string name="msg_kc_uat_cert_dup">Suppression de l\'auto-certificat périmé pour l\'attribut utilisateur</string>
+ <string name="msg_kc_uat_dup">Suppression de l\'attribut utilisateur en double. Le trousseau en contenait deux. Ceci pourrait entraîner des certificats manquants !</string>
+ <string name="msg_kc_uat_foreign">Suppression du certificat étranger d\'attribut utilisateur par</string>
+ <string name="msg_kc_uat_revoke_dup">Suppression du certificat de révocation redondant pour l\'attribut utilisateur</string>
+ <string name="msg_kc_uat_revoke_old">Suppression de l\'auto-certificat périmé pour l\'attribut utilisateur</string>
+ <string name="msg_kc_uat_no_cert">Aucun auto-certificat valide trouvé pour l\'attribut utilisateur, qui est maintenant enlevé du trousseau</string>
+ <string name="msg_kc_uat_remove">Suppression de l\'attribut utilisateur invalide</string>
+ <string name="msg_kc_uat_warn_encoding">L\'ID utilisateur ne passe pas le test UTF-8 !</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_secret_dummy">Une nouvelle sous-clef publique a été trouvée, mais la génération de sous-clef secrète factice n\'est pas prise en charge !</string>
<string name="msg_mg_error_heterogeneous">Il a été tenté de fusionner des trousseaux avec des empreintes différentes !</string>
@@ -709,13 +802,13 @@
<!--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_user_id">Les trousseaux doivent être créés avec au moins un ID utilisateur !</string>
<string name="msg_cr_error_no_certify">La clef maîtresse doit avoir le drapeau « certifié » !</string>
<string name="msg_cr_error_null_expiry">L\'expiration ne peut pas être « pareille qu\'avant » à la création de la clef. Ceci est une erreur du programme, veuillez remplir un rapport de bogue !</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_no_curve">Aucune taille de clef n\'a été spécifiée ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_cr_error_no_keysize">Aucune courbe elliptique n\'a été spécifiée ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
- <string name="msg_cr_error_internal_pgp">Erreur interne PGP !</string>
+ <string name="msg_cr_error_internal_pgp">Erreur interne OpenPGP !</string>
<string name="msg_cr_error_unknown_algo">L\'algorithme choisi est inconnu ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_cr_error_flags_dsa">Les drapeaux de clef choisis sont incorrects, DSA ne peut pas être utilisé pour le chiffrement ! </string>
<string name="msg_cr_error_flags_elgamal">Les drapeaux de clef choisis sont incorrects, ElGamal ne peut pas être utilisé pour le chiffrement ! </string>
@@ -723,25 +816,29 @@
<string name="msg_cr_error_flags_ecdh">Les drapeaux de clef choisis sont incorrects, ECDH ne peut pas être utilisé pour le chiffrement ! </string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modification du trousseau %s</string>
+ <string name="msg_mf_error_divert_serial">Le numéro de série d\'une clef diriger-vers-la-carte doit avoir 16 bytes ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</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 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_master_none">Aucun certificat maître sur lequel se basé n\'a été trouvé ! (Tous révoqués ?)</string>
- <string name="msg_mf_error_noexist_primary">Mauvais ID d\'utilisateur principal spécifié !</string>
- <string name="msg_mf_error_noexist_revoke">Mauvais ID d\'utilisateur spécifié pour la révocation !</string>
- <string name="msg_mf_error_revoked_primary">Les ID d\'utilisateurs révoqués ne peuvent pas être principaux !</string>
+ <string name="msg_mf_error_noexist_primary">Mauvais ID utilisateur principal spécifié !</string>
+ <string name="msg_mf_error_noexist_revoke">Mauvais ID utilisateur spécifié pour la révocation !</string>
+ <string name="msg_mf_error_restricted">Tentative d\'exécution d\'une opération restreinte sans phrase de passe ! Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_mf_error_revoked_primary">Les ID utilisateurs révoqués ne peuvent pas être principaux !</string>
<string name="msg_mf_error_null_expiry">L\'expiration ne peut pas être « pareille qu\'avant » lors de la création de sous-clefs. Ceci est une erreur de programmation, veuillez remplir un rapport de bogue !</string>
<string name="msg_mf_error_passphrase_master">Erreur fatale lors du déchiffrement de la clef maîtresse ! Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
- <string name="msg_mf_error_pgp">Erreur interne de PGP !</string>
+ <string name="msg_mf_error_pgp">Erreur interne OpenPGP !</string>
<string name="msg_mf_error_sig">Exception de signature !</string>
<string name="msg_mf_master">Modification des certifications maîtresses</string>
- <string name="msg_mf_passphrase">Changement de la phrase de passe pour le trousseau...</string>
+ <string name="msg_mf_notation_empty">Ajout d\'un paquet de notation vide</string>
+ <string name="msg_mf_notation_pin">Ajout d\'un paquet de notation NIP</string>
+ <string name="msg_mf_passphrase">Changement de la phrase de passe pour le trousseau</string>
<string name="msg_mf_passphrase_key">Rechiffrement de la sous-clef %s avec la nouvelle phrase de passe</string>
<string name="msg_mf_passphrase_empty_retry">Échec lors de la définition de la nouvelle phrase de passe, nouvel essai avec une ancienne phrase de passe vide</string>
<string name="msg_mf_passphrase_fail">La phrase de passe de la sous-clef n\'a pas pu être changée ! (Est-elle différente des autres clefs ?)</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_primary_replace_old">Remplacement du certificat de l\'ID utilisateur principal précédent</string>
+ <string name="msg_mf_primary_new">Génération d\'un nouveau certificat pour le nouvel ID utilisateur principal</string>
<string name="msg_mf_subkey_change">Modification de la sous-clef %s</string>
<string name="msg_mf_error_subkey_missing">Une action a été tentée sur la sous-clef manquante %s !</string>
<string name="msg_mf_subkey_new">Ajout d\'une nouvelle sous-clef de type %s</string>
@@ -750,10 +847,13 @@
<string name="msg_mf_subkey_revoke">Révocation de la sous-clef %s</string>
<string name="msg_mf_subkey_strip">Dépouillement 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 d\'utilisateur %s</string>
- <string name="msg_mf_uid_primary">Changement de l\'ID d\'utilisateur 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_uid_add">Ajout de l\'ID utilisateur %s</string>
+ <string name="msg_mf_uid_primary">Changement de l\'ID utilisateur principal en %s</string>
+ <string name="msg_mf_uid_revoke">Révocation de l\'ID utilisateur %s</string>
+ <string name="msg_mf_uid_error_empty">L\'ID utilisateur ne peut pas être vide !</string>
+ <string name="msg_mf_uat_error_empty">L\'attribut utilisateur ne peut pas être vide !</string>
+ <string name="msg_mf_uat_add_image">Ajout de l\'attribut utilisateur de type image</string>
+ <string name="msg_mf_uat_add_unknown">Ajout de l\'attribut utilisateur de type inconnu</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>
<!--Consolidate-->
@@ -774,6 +874,7 @@
<string name="msg_con_error_public">Erreur lors de la réimportation des clefs publiques !</string>
<string name="msg_con_error_secret">Erreur lors de la réimportation des clefs secrètes !</string>
<string name="msg_con_recover">Reprise du processus de consolidation</string>
+ <string name="msg_con_recursive">Consolidation récursive ignorée</string>
<string name="msg_con_recover_unknown">Reprise du processus de consolidation à partir d\'un état inconnu</string>
<plurals name="msg_con_reimport_public">
<item quantity="one">Réimportation d\'une clef publique</item>
@@ -787,6 +888,19 @@
<string name="msg_con_reimport_secret_skip">Aucune clef secrète à réimporter, étape ignorée...</string>
<string name="msg_con_warn_delete_public">Une exception a eu lieu lors de la suppression du fichier de cache public</string>
<string name="msg_con_warn_delete_secret">Une exception a eu lieu lors de la suppression du fichier de cache secret</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">Exécution de l\'opération sur la clef</string>
+ <string name="msg_ed_caching_new">Mise en cache de la nouvelle phrase de passe</string>
+ <string name="msg_ed_error_no_parcel">SaveKeyringParcel absent ! (Ceci est un bogue, veuillez le rapporter)</string>
+ <string name="msg_ed_error_key_not_found">Clef introuvable !</string>
+ <string name="msg_ed_fetching">Obtention de la clef à modifier (%s)</string>
+ <string name="msg_ed_success">Opération sur la clef réussie</string>
+ <!--Promote key-->
+ <string name="msg_pr">Promotion de la clef publique en clef secrète</string>
+ <string name="msg_pr_error_already_secret">La clef est déjà une clef secrète !</string>
+ <string name="msg_pr_error_key_not_found">Clef introuvable !</string>
+ <string name="msg_pr_fetching">Obtention de la clef à modifier (%s)</string>
+ <string name="msg_pr_success">Clef promue avec succès</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">La modification des clefs NFC n\'est pas (encore) prise en charge !</string>
<string name="msg_ek_error_dummy">Impossible de modifier un trousseau avec une clef maîtresse dépouillée !</string>
@@ -795,11 +909,13 @@
<string name="msg_dc_askip_no_key">Les données ne sont pas chiffrées avec un clef connue, étape ignorée...</string>
<string name="msg_dc_askip_not_allowed">Les données ne sont pas chiffrées avec un clef autorisée, étape ignorée...</string>
<string name="msg_dc_asym">Un bloc de données chiffrées asymétriquement a été trouvé pour la clef %s</string>
+ <string name="msg_dc_charset">En-tête de jeu de caractère trouvé : « %s »</string>
<string name="msg_dc_clear_data">Traitement des données littérales</string>
<string name="msg_dc_clear_decompress">Extraction des données compressées</string>
<string name="msg_dc_clear_meta_file">Nom de fichier : %s</string>
<string name="msg_dc_clear_meta_mime">Type MIME : %s</string>
<string name="msg_dc_clear_meta_size">Taille de fichier : %s</string>
+ <string name="msg_dc_clear_meta_size_unknown">La taille de fichier est inconnue</string>
<string name="msg_dc_clear_meta_time">Heure de modification : %s</string>
<string name="msg_dc_clear_signature_bad">La vérification de la signature n\'est PAS CORRECTE !</string>
<string name="msg_dc_clear_signature_check">Vérification des données de signature</string>
@@ -809,11 +925,12 @@
<string name="msg_dc_error_bad_passphrase">Erreur lors du déverrouillage de la clef, phrase de passe erronée !</string>
<string name="msg_dc_error_extract_key">Erreur inconnue lors du déverrouillage de la clef !</string>
<string name="msg_dc_error_integrity_check">Erreur de vérification de l\'intégrité !</string>
+ <string name="msg_dc_error_integrity_missing">Vérification de l\'intégrité absente ! Ceci peut arriver car l\'application n\'est pas à jour, ou à cause d\'une attaque par mise à niveau inférieur.</string>
<string name="msg_dc_error_invalid_siglist">Aucune donnée de signature valide trouvée !</string>
<string name="msg_dc_error_io">Une exception E/S a été rencontrée durant l\'opération !</string>
<string name="msg_dc_error_no_data">Aucune donnée chiffrée n\'a été trouvée dans le flux !</string>
<string name="msg_dc_error_no_key">Aucune donnée chiffrée avec une clef secrète connue n\'a été trouvée dans le flux !</string>
- <string name="msg_dc_error_pgp_exception">Une exception PGP a été rencontrée durant l\'opération !</string>
+ <string name="msg_dc_error_pgp_exception">Une exception OpenPGP a été rencontrée durant l\'opération !</string>
<string name="msg_dc_integrity_check_ok">Vérification de l\'intégrité OK !</string>
<string name="msg_dc_ok_meta_only">Seules les métadonnées ont été demandées, déchiffrement ignoré</string>
<string name="msg_dc_ok">OK</string>
@@ -828,36 +945,52 @@
<string name="msg_dc_trail_sym">Des données traînantes chiffrées symétriquement ont été rencontrées</string>
<string name="msg_dc_trail_unknown">Des données traînantes de type inconnu ont été rencontrées</string>
<string name="msg_dc_unlocking">Déverrouillage de la clef secrète</string>
+ <!--Messages for VerifySignedLiteralData operation-->
+ <string name="msg_vl">Lancement de la vérification de la signature</string>
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">Préparation de la clef secrète pour le chiffrement</string>
- <string name="msg_se_clearsign_only">La signature d\'entrée de texte en clair n\'est pas prise en charge !</string>
- <string name="msg_se_compressing">Préparation de la compression</string>
- <string name="msg_se_encrypting">Chiffrement des données</string>
- <string name="msg_se_error_bad_passphrase">Phrase de passe erronée !</string>
- <string name="msg_se_error_io">Exception E/S rencontrée durant l\'opération !</string>
- <string name="msg_se_error_key_sign">La clef de signature choisie ne peut pas signer les données !</string>
- <string name="msg_se_error_sign_key">Erreur lors de la récupération de la clef de signature !</string>
- <string name="msg_se_error_nfc">Erreur de données NFC !</string>
- <string name="msg_se_error_no_passphrase">Aucune phrase de passe fournie !</string>
- <string name="msg_se_error_pgp">Erreur interne PGP !</string>
- <string name="msg_se_error_sig">Une exception de signature PGP a été rencontrée !</string>
- <string name="msg_se_error_unlock">Erreur inconnue lors du déverrouillage de la clef !</string>
- <string name="msg_se_key_ok">Chiffrement pour la clef : %s</string>
- <string name="msg_se_key_unknown">Clef manquante pour le chiffrement : %s</string>
- <string name="msg_se_key_warn">Clef erronée pour le chiffrement : %s</string>
- <string name="msg_se_ok">Opération de signature/chiffrement réussie !</string>
- <string name="msg_se_pending_nfc">Jeton NFC exigé, demande de saisie à l\'utilisateur...</string>
- <string name="msg_se_pending_passphrase">Phrase de passe exigée, demande de saisie à l\'utilisateur...</string>
- <string name="msg_se_signing">Signature des données (sans chiffrement)</string>
- <string name="msg_se_sigcrypting">Chiffrement des données avec signature</string>
- <string name="msg_se">Début de l\'opération de signature et/ou de chiffrement</string>
- <string name="msg_se_symmetric">Préparation du chiffrement symétrique</string>
+ <string name="msg_se">Début de l\'opération de signature/chiffrement</string>
+ <string name="msg_se_input_bytes">Traitement de l\'entrée du tableau de bytes</string>
+ <string name="msg_se_input_uri">Traitement de l\'entrée de l\'URI</string>
+ <string name="msg_se_error_no_input">Aucune entrée donnée !</string>
+ <string name="msg_se_error_input_uri_not_found">Erreur lors de l\'ouverture de l\'URI en lecture !</string>
+ <string name="msg_se_error_output_uri_not_found">Erreur lors de l\'ouverture de l\'URI en écriture !</string>
+ <string name="msg_se_error_too_many_inputs">Plus d\'entrées spécifiées que de sorties ! Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_se_warn_output_left">Il reste des sorties mais pas d\'entrée. Ceci est probablement une erreur de programmation, veuillez remplir un rapport de bogue !</string>
+ <string name="msg_se_success">Opération de signature/chiffrement réussie</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">Préparation des clefs publiques pour le chiffrement</string>
+ <string name="msg_pse_clearsign_only">La signature de texte en clair n\'est pas prise en charge !</string>
+ <string name="msg_pse_compressing">Préparation de la compression</string>
+ <string name="msg_pse_encrypting">Chiffrement des données</string>
+ <string name="msg_pse_error_bad_passphrase">Phrase de passe erronée !</string>
+ <string name="msg_pse_error_hash_algo">L’algorithme de hachage demandé n\'est pas pris en charge par cette clef ! </string>
+ <string name="msg_pse_error_io">Une exception E/S a été rencontrée durant l\'opération !</string>
+ <string name="msg_pse_error_key_sign">La clef de signature choisie ne peut pas signer les données !</string>
+ <string name="msg_pse_error_sign_key">Erreur lors de la récupération de la clef de signature !</string>
+ <string name="msg_pse_error_nfc">Erreur de données NFC !</string>
+ <string name="msg_pse_error_no_passphrase">Aucune phrase de passe fournie !</string>
+ <string name="msg_pse_error_pgp">Erreur interne OpenPGP !</string>
+ <string name="msg_pse_error_sig">Une exception de signature OpenPGP a été rencontrée !</string>
+ <string name="msg_pse_error_unlock">Erreur inconnue lors du déverrouillage de la clef !</string>
+ <string name="msg_pse_key_ok">Chiffrement pour la clef : %s</string>
+ <string name="msg_pse_key_unknown">Clef manquante pour le chiffrement : %s</string>
+ <string name="msg_pse_key_warn">Clef erronée pour le chiffrement : %s</string>
+ <string name="msg_pse_ok">Opération de signature/chiffrement réussie !</string>
+ <string name="msg_pse_pending_nfc">Jeton NFC exigé, demande de saisie à l\'utilisateur...</string>
+ <string name="msg_pse_pending_passphrase">Phrase de passe exigée, demande de saisie à l\'utilisateur...</string>
+ <string name="msg_pse_signing">Signature des données (sans chiffrement)</string>
+ <string name="msg_pse_signing_cleartext">Création d\'une signature de texte en clair</string>
+ <string name="msg_pse_signing_detached">Création d\'une signature détachée</string>
+ <string name="msg_pse_sigcrypting">Chiffrement des données avec signature</string>
+ <string name="msg_pse">Début de l\'opération de signature et/ou de chiffrement</string>
+ <string name="msg_pse_symmetric">Préparation du chiffrement symétrique</string>
<string name="msg_crt_certifying">Générations des certifications</string>
- <string name="msg_crt_certify_all">Certification de tous les ID d\'utilisateurs pour la clef %s</string>
+ <string name="msg_crt_certify_all">Certification de tous les ID utilisateurs pour la clef %s</string>
<plurals name="msg_crt_certify_some">
- <item quantity="one">Certification d\'un ID d\'utilisateur pour la clef %2$s</item>
- <item quantity="other">Certification de %1$d ID d\'utilisateurs pour la clef %2$s</item>
+ <item quantity="one">Certification d\'un ID utilisateur pour la clef %2$s</item>
+ <item quantity="other">Certification de %1$d ID utilisateurs pour la clef %2$s</item>
</plurals>
+ <string name="msg_crt_error_self">Un auto-certificat ne peut pas être délivré ainsi !</string>
<string name="msg_crt_error_master_not_found">Clef maîtresse introuvable !</string>
<string name="msg_crt_error_nothing">Aucune clef certifiée !</string>
<string name="msg_crt_error_unlock">Erreur lors du déverrouillage de la clef maîtresse !</string>
@@ -887,6 +1020,7 @@
<string name="msg_import_fingerprint_ok">Vérification de l\'empreinte OK !</string>
<string name="msg_import_merge">Fusion des données récupérées</string>
<string name="msg_import_error">Échec lors de l\'opération d\'importation !</string>
+ <string name="msg_import_error_io">Échec de l\'opération causé par une erreur d\'E/S !</string>
<string name="msg_import_partial">Opération d\'importation réussie, avec des erreurs !</string>
<string name="msg_import_success">Opération d\'importation réussie !</string>
<plurals name="msg_export">
@@ -903,6 +1037,7 @@
<string name="msg_export_error_storage">Le stockage n\'est pas prêt pour l\'écriture !</string>
<string name="msg_export_error_db">Erreur de base de données !</string>
<string name="msg_export_error_io">Erreur d\'entrée/sortie !</string>
+ <string name="msg_export_error_key">Erreur lors du prétraitement des données de la clef !</string>
<string name="msg_export_success">Opération d\'exportation réussie !</string>
<string name="msg_del_error_empty">Rien à supprimer !</string>
<string name="msg_del_error_multi_secret">Les clefs secrètes ne peuvent être supprimées qu\'individuellement !</string>
@@ -939,6 +1074,11 @@
<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">Phrase de passe</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 depuis un fichier</string>
+ <string name="first_time_skip">Ignorer le paramétrage</string>
<!--unsorted-->
<string name="section_certifier_id">Certificateur</string>
<string name="section_cert">Détails du certificat</string>
@@ -948,6 +1088,8 @@
<string name="certs_text">Seuls les auto-certificats et les certificats validés créés avec vos clefs sont affichés ici.</string>
<string name="section_uids_to_certify">Identités pour</string>
<string name="certify_text">Les clefs que vous importez contiennent des « identités » : des noms et des adresses courriel. Choisissez exactement ceux qui correspondent à ce que vous attendiez.</string>
+ <string name="certify_fingerprint_text">Comparez l\'empreinte affichée, caractère par caractère, à celle affichée sur l\'appareil de l\'autre personne.</string>
+ <string name="certify_fingerprint_text2">Est-ce que les empreintes affichées correspondent ?</string>
<string name="label_revocation">Raison de la révocation</string>
<string name="label_verify_status">État de vérification</string>
<string name="label_cert_type">Type</string>
@@ -961,7 +1103,7 @@
<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_no_encrypt_subkey">Aucune sous-clef de chiffrement n\'est disponible !</string>
+ <string name="error_no_encrypt_subkey">Aucune sous-clef de chiffrement n\'est proposée !</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>
<string name="swipe_to_update">Glisser vers le bas pour mettre à jour à partir du serveur de clefs</string>
@@ -969,9 +1111,32 @@
<string name="error_multi_not_supported">L\'enregistrement des fichiers multiples n\'est pas pris en charge. Ceci est actuellement une limitation d\'Android.</string>
<string name="key_colon">Clef :</string>
<string name="exchange_description">Pour démarrer un échange de clef, choisir le nombre de participants du côté droit, puis cliquer sur le bouton « Démarrer l\'échange ».\n\Deux questions de plus seront posées pour s\'assurer que seuls les bons participants sont dans l\'échange et que les empreintes sont correctes.</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 depuis un fichier</string>
- <string name="first_time_skip">Ignorer le paramétrage</string>
+ <string name="btn_start_exchange">Démarrer l\'échange</string>
+ <string name="user_id_none"><![CDATA[<none>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">Choisir une méthode de déverrouillage</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Saisir la phrase de passe</string>
+ <string name="passphrase">Phrase de passe</string>
+ <string name="noPassphrase">Aucune phrase de passe</string>
+ <string name="no_passphrase_set">Aucune phrase de passe définie</string>
+ <string name="passphrases_match">Les phrases de passe ne correspondent pas</string>
+ <string name="passphrase_saved">Phrase de passe enregistrée</string>
+ <string name="passphrase_invalid">Phrase de passe invalide</string>
+ <string name="missing_passphrase">Phrase de passe manquante</string>
+ <string name="passphrase_again">De nouveau</string>
+ <string name="lockpattern">Schéma de verrouillage</string>
+ <string name="lockpatternNFC">NFC + schéma de verrouillage</string>
+ <string name="unlock_method">Méthode de déverrouillage</string>
+ <string name="set_passphrase">Définir la phrase de passe</string>
+ <string name="draw_lockpattern">Dessiner le schéma de verrouillage</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Mauvaise balise. Veuillez ressayer.</string>
+ <string name="enable_nfc">Veuillez activer la NFC dans vos paramètres</string>
+ <string name="no_nfc_support">Cet appareil ne prends pas en charge la NFC</string>
+ <string name="nfc_write_succesful">Écrit avec succès sur la balise NFC</string>
+ <string name="unlocked">Déverrouillé</string>
+ <string name="nfc_settings">Paramètres</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-is/strings.xml b/OpenKeychain/src/main/res/values-is/strings.xml
index 460c5462e..233347bd3 100644
--- a/OpenKeychain/src/main/res/values-is/strings.xml
+++ b/OpenKeychain/src/main/res/values-is/strings.xml
@@ -36,6 +36,8 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<!--Create key-->
<!--View key-->
@@ -50,10 +52,18 @@
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<!--PassphraseCache-->
- <!--unsorted-->
<!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml
index f5a6696ae..d741f7111 100644
--- a/OpenKeychain/src/main/res/values-it/strings.xml
+++ b/OpenKeychain/src/main/res/values-it/strings.xml
@@ -5,17 +5,14 @@
<string name="app_name">OpenKeychain</string>
<!--title-->
<string name="title_select_recipients">Seleziona chiavi</string>
- <string name="title_select_secret_key">Seleziona la Tua Chiave</string>
- <string name="title_encrypt_text">Testo Cifrato</string>
- <string name="title_encrypt_files">File Cifrati</string>
+ <string name="title_select_secret_key">Seleziona la tua chiave</string>
+ <string name="title_encrypt_text">Testo cifrato</string>
+ <string name="title_encrypt_files">File cifrati</string>
<string name="title_decrypt">Decodifica</string>
- <string name="title_unlock">Frase di accesso</string>
<string name="title_add_subkey">Aggiungi Sottochiave</string>
<string name="title_edit_key">Modifica Chiave</string>
- <string name="title_preferences">Preferenze</string>
<string name="title_cloud_search_preferences">Preferenze di ricerca</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_share_fingerprint_with">Condivi impronta con...</string>
<string name="title_share_key">Condividi chiave con...</string>
@@ -34,6 +31,8 @@
<string name="title_help">Aiuto</string>
<string name="title_log_display">Registro</string>
<string name="title_create_key">Crea Chiave</string>
+ <string name="title_exchange_keys">Scambia le chiavi</string>
+ <string name="title_advanced_key_info">Informazioni avanzate sulla chiave</string>
<!--section-->
<string name="section_user_ids">Identità</string>
<string name="section_keys">Sottochiavi</string>
@@ -52,6 +51,7 @@
<string name="section_key_to_certify">Chiave da certificare</string>
<string name="section_decrypt_files">Files</string>
<string name="section_decrypt_text">Testo</string>
+ <string name="section_certs">Certificati</string>
<!--button-->
<string name="btn_decrypt_verify_file">Decodifica, verifica e salva su file</string>
<string name="btn_decrypt_verify_message">Decodifica e verifica messaggio</string>
@@ -71,7 +71,6 @@
<string name="btn_create_key">Crea chiave</string>
<string name="btn_add_files">Aggiungi file(s)</string>
<string name="btn_add_share_decrypted_text">Condividi testo decifrato</string>
- <string name="btn_decrypt_clipboard">Decifra dalla lavagna</string>
<string name="btn_decrypt_and_verify">e verifica le firme</string>
<string name="btn_decrypt_files">Decifra files</string>
<!--menu-->
@@ -80,6 +79,7 @@
<string name="menu_export_key">Esporta su un file</string>
<string name="menu_delete_key">Cancella chiave</string>
<string name="menu_create_key">Crea mia chiave</string>
+ <string name="menu_import_existing_key">Importa da file</string>
<string name="menu_search">Cerca</string>
<string name="menu_beam_preferences">Impostazioni Beam</string>
<string name="menu_key_edit_cancel">Annulla</string>
@@ -102,9 +102,8 @@
<string name="label_file_ascii_armor">Abilita Armatura ASCII</string>
<string name="label_write_version_header">Fai sapere agli altri che utilizzi OpenKeychain</string>
<string name="label_write_version_header_summary">Scrive \'OpenKeychain v2.7\' nelle firme OpenPGP, testi cifrati e chiavi esportate</string>
- <string name="label_use_default_yubikey_pin">Utilizza PIN Yubikey</string>
- <string name="label_use_num_keypad_for_yubikey_pin">Usa tastierino numerico per PIN Yubikey</string>
- <string name="label_label_use_default_yubikey_pin_summary">Utilizza il PIN base (123456) per accedere a Yubikeys tramite NFC</string>
+ <string name="label_use_default_yubikey_pin">Utilizza il PIN predefinito di YubiKey</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Utilizza la tastiera numerica per il PIN di YubiKey</string>
<string name="label_asymmetric_from">Firmato da:</string>
<string name="label_to">Codifica per:</string>
<string name="label_delete_after_encryption">Elimina file dopo la codifica</string>
@@ -126,6 +125,7 @@
<string name="label_name">Nome</string>
<string name="label_comment">Commento</string>
<string name="label_email">Email</string>
+ <string name="label_send_key">Sincronizza con il cloud</string>
<string name="label_fingerprint">Impronta</string>
<string name="expiry_date_dialog_title">Impostare la data di scadenza</string>
<string name="label_first_keyserver_is_used">(Primo server delle chiavi elencato è il preferito)</string>
@@ -183,7 +183,6 @@
<string name="passphrase_must_not_be_empty">Si prega di inserire una frase di accesso.</string>
<string name="passphrase_for_symmetric_encryption">Codifica Simmetrica.</string>
<string name="passphrase_for">Inserisci la frase di accesso per \'%s\'</string>
- <string name="yubikey_pin_for">Inserisci il PIN per accedere a Yubikey con \'%s\'</string>
<string name="file_delete_confirmation">Sei sicuro di voler eliminare\n%s?</string>
<string name="file_delete_successful">Eliminato correttamente.</string>
<string name="no_file_selected">Seleziona un file prima.</string>
@@ -241,7 +240,6 @@ Non potrai annullare!</string>
<string name="error_could_not_extract_private_key">impossibile estrarre la chiave privata</string>
<!--errors without preceeding Error:-->
<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_contacts_key_id_missing">Recupero dell\'ID della chiave dai contatti fallito!</string>
<string name="error_generic_report_bug">Si è verificato un errore generico, si prega di creare una nuova segnalazione di errore per OpenKeychain.</string>
@@ -350,7 +348,6 @@ Non potrai annullare!</string>
<string name="import_qr_code_wrong">Codica QR deformato! Prova di nuovo!</string>
<string name="import_qr_code_too_short_fingerprint">Impronta troppo corta (&lt; 16 caratteri)</string>
<!--Generic result toast-->
- <string name="view_log">Mostra registro</string>
<string name="with_warnings">, con avvisi</string>
<string name="with_cancelled">, fino all\'annullamento</string>
<!--Import result toast-->
@@ -390,7 +387,6 @@ Non potrai annullare!</string>
<string name="intent_send_encrypt">Codifica con OpenKeychain</string>
<string name="intent_send_decrypt">Decodifica con OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Nessuna applicazione registrata!\n\nUna lista di applicazioni di terze parti supportate è disponibile in \'Aiuto\'!</string>
<string name="api_settings_show_info">Mostra informazioni dettagliate</string>
<string name="api_settings_hide_info">Nascondi informazioni dettagliate</string>
<string name="api_settings_show_advanced">Mostra impostazioni avanzate</string>
@@ -406,7 +402,6 @@ Non potrai annullare!</string>
<string name="api_settings_delete_account">Cancella account</string>
<string name="api_settings_package_name">Nome Pacchetto</string>
<string name="api_settings_package_signature">SHA-256 della Firma del Pacchetto</string>
- <string name="api_settings_accounts">Account</string>
<string name="api_settings_settings">Impostazioni</string>
<string name="api_settings_key">Chiave account:</string>
<string name="api_settings_accounts_empty">Nessun account collegato a questa applicazione</string>
@@ -430,6 +425,7 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<item quantity="one">1 chiave selezionata.</item>
<item quantity="other">%d chiavi selezionate.</item>
</plurals>
+ <string name="key_list_empty_text1">Nessuna chiave trovata!</string>
<string name="key_list_filter_show_all">Mostra tutte le chiavi</string>
<string name="key_list_filter_show_certified">Mostra solo le chiavi certificate</string>
<!--Key view-->
@@ -450,8 +446,11 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="user_id_info_certified_title">Certificato</string>
<string name="user_id_info_certified_text">Questa identità è stata certificata da te.</string>
<string name="user_id_info_uncertified_title">Non certificato</string>
+ <string name="user_id_info_uncertified_text">Questa identità non è stata ancora certificata. Non puoi esser sicuro che l\'identità corrisponda veramente ad una specifica persona.</string>
<string name="user_id_info_invalid_title">Non valido</string>
<string name="user_id_info_invalid_text">C\'è qualcosa che non va con questa identità!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Cambia Frase Di Accesso</string>
<string name="edit_key_action_add_identity">Aggiungi Identità</string>
@@ -487,13 +486,8 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="create_key_hint_full_name">Nome completo, es: Mario Rossi</string>
<string name="create_key_edit">Cambia configurazione della chiave</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_text">Codifica Testo</string>
- <string name="nav_encrypt_files">Codifica documenti</string>
- <string name="nav_decrypt">Decodifica</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>
@@ -599,11 +593,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_kc_secret">Canonicalizzazione portachiavi segreto %s</string>
<string name="msg_kc_error_v3">Questa è una chiave OpenPGP versione 3, è deprecata e non più supportata!</string>
<string name="msg_kc_master">Elaborazione chiave principale</string>
- <string name="msg_kc_master_bad_err">Rimozione di certificato di revoca del portachiavi corrotto</string>
- <string name="msg_kc_master_bad_local">Rimozione certificato di revoca del portachiavi con caratteristica \"locale\"</string>
- <string name="msg_kc_master_bad_time">Rimozione certificato di revoca del portachiavi con marca temporale futura</string>
- <string name="msg_kc_master_bad_type">Rimozione certificato della chiave principale di tipo sconosciuto (%s)</string>
- <string name="msg_kc_master_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>
<string name="msg_kc_sub_bad">Rimozione certificato vincolante di sottochiave non valido</string>
@@ -637,6 +626,7 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_mg_secret">Fusione nel portachiavi privato %s</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">Nulla da unire</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>
@@ -644,7 +634,6 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_cr_error_null_expiry">La data di scadenza non può essere \'come prima\' sulla creazione di chiavi. Questo è un errore di programmazione, si prega di inviare una segnalazione di bug!</string>
<string name="msg_cr_error_keysize_512">La grandezza della chiave deve essere di 512bit o maggiore</string>
<string name="msg_cr_error_no_keysize">Nessuna curva ellittica specificata! Questo è un errore di programmazione, per favore invia una segnalazione!</string>
- <string name="msg_cr_error_internal_pgp">Errore PGP interno!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modifica del portachiavi %s</string>
<string name="msg_mf_error_encode">Eccezione di codifica!</string>
@@ -654,10 +643,8 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_mf_error_master_none">Nessun certificato principale trovato su cui operare! (Tutti revocati?)</string>
<string name="msg_mf_error_null_expiry">La data di scadenza non può essere \"come prima\" sulla creazione di sottochiavi. Questo è un errore di programmazione, si prega di inviare una segnalazione di bug!</string>
<string name="msg_mf_error_passphrase_master">Errore irreversibile nella decodifica della chiave principale! Questo è probabilmente un errore di programmazione, si prega di inviare una segnalazione di bug!</string>
- <string name="msg_mf_error_pgp">Errore PGP interno!</string>
<string name="msg_mf_error_sig">Eccezione di firma!</string>
<string name="msg_mf_master">Modifica delle certificazioni principali</string>
- <string name="msg_mf_passphrase">Cambio frase di accesso del portachiavi...</string>
<string name="msg_mf_passphrase_key">Ri-codifica sottochiave %s con nuova frase di accesso</string>
<string name="msg_mf_passphrase_empty_retry">Impostazione nuova frase di accesso fallita, provo di nuovo con frase precedente di accesso vuota</string>
<string name="msg_mf_passphrase_fail">La frase di accesso per la sottochiave non può essere modificata! (Ne ha una diversa dalle altre chiavi?)</string>
@@ -700,6 +687,8 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_con_reimport_secret_skip">Nessuna chiave privata da reimportare, proseguo...</string>
<string name="msg_con_warn_delete_public">Eccezione durante la eliminazione del file di cache pubblico</string>
<string name="msg_con_warn_delete_secret">Eccezione durante la eliminazione del file di cache privato</string>
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">La Modifica delle chiavi NFC non è (ancora) supportata!</string>
<string name="msg_ek_error_not_found">Chiave non trovata!</string>
@@ -718,14 +707,9 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="msg_dc">Inizio operazione di decodifica...</string>
<string name="msg_dc_sym_skip">Dati simmetrici non permessi, proseguo...</string>
<string name="msg_dc_unlocking">Sblocco chiave segreta</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">Preparazione chiavi pubbliche per la codifica</string>
- <string name="msg_se_compressing">Preparazione compressione</string>
- <string name="msg_se_encrypting">Codifica dati</string>
- <string name="msg_se_error_bad_passphrase">Frase di Accesso errata</string>
- <string name="msg_se_error_nfc">Errore Dati NFC!</string>
- <string name="msg_se_error_no_passphrase">Nessuna frase di accesso disponibile!</string>
- <string name="msg_se_error_pgp">Errore PGP interno!</string>
+ <!--Messages for PgpSignEncrypt operation-->
<string name="msg_crt_success">Identità certificata correttamente</string>
<string name="msg_crt_warn_not_found">Chiave non trovata!</string>
<string name="msg_crt_upload_success">Chiave caricata con successo sul server</string>
@@ -742,6 +726,10 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<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">Frase di Accesso</string>
+ <!--First Time-->
+ <string name="first_time_text1">Riappropriati della tua privacy con OpenKeychain!</string>
+ <string name="first_time_create_key">Crea mia chiave</string>
+ <string name="first_time_skip">Salta Installazione</string>
<!--unsorted-->
<string name="section_certifier_id">Certificatore</string>
<string name="section_cert">Dettagli Certificato</string>
@@ -766,8 +754,8 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="error_no_file_selected">Seleziona almeno un file da codificare!</string>
<string name="error_multi_not_supported">Il salvataggio di più file non è supportato. Questa è una limitazione corrente di Android.</string>
<string name="key_colon">Chiave:</string>
- <!--First Time-->
- <string name="first_time_text1">Riappropriati della tua privacy con OpenKeychain!</string>
- <string name="first_time_create_key">Crea mia chiave</string>
- <string name="first_time_skip">Salta Installazione</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml
index 815a77431..c5318db36 100644
--- a/OpenKeychain/src/main/res/values-ja/strings.xml
+++ b/OpenKeychain/src/main/res/values-ja/strings.xml
@@ -9,13 +9,13 @@
<string name="title_encrypt_text">テキスト暗号化</string>
<string name="title_encrypt_files">ファイル暗号化</string>
<string name="title_decrypt">復号化</string>
- <string name="title_unlock">パスフレーズ</string>
+ <string name="title_unlock">鍵のロック解除</string>
<string name="title_add_subkey">副鍵の追加</string>
<string name="title_edit_key">鍵の編集</string>
<string name="title_preferences">設定</string>
<string name="title_cloud_search_preferences">クラウド検索設定</string>
<string name="title_api_registered_apps">アプリ</string>
- <string name="title_key_server_preference">鍵サーバ設定</string>
+ <string name="title_key_server_preference">鍵サーバ</string>
<string name="title_change_passphrase">パスフレーズの変更</string>
<string name="title_share_fingerprint_with">...で指紋の共有</string>
<string name="title_share_key">...で鍵の共有</string>
@@ -36,6 +36,7 @@
<string name="title_create_key">鍵の生成</string>
<string name="title_exchange_keys">鍵の交換</string>
<string name="title_advanced_key_info">鍵の詳細情報</string>
+ <string name="title_keys">鍵</string>
<!--section-->
<string name="section_user_ids">ユーザID</string>
<string name="section_keys">副鍵</string>
@@ -55,6 +56,8 @@
<string name="section_decrypt_files">ファイル</string>
<string name="section_decrypt_text">テキスト</string>
<string name="section_certs">証明</string>
+ <string name="section_encrypt">暗号化</string>
+ <string name="section_decrypt">復号化</string>
<!--button-->
<string name="btn_decrypt_verify_file">復号化と検証、そしてファイルの保存</string>
<string name="btn_decrypt_verify_message">メッセージの復号化と検証</string>
@@ -68,15 +71,19 @@
<string name="btn_export_to_server">鍵サーバへアップロード</string>
<string name="btn_next">次</string>
<string name="btn_back">戻る</string>
+ <string name="btn_no">なし</string>
+ <string name="btn_match">指紋が一致</string>
<string name="btn_lookup_key">鍵検出</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>
<string name="btn_add_share_decrypted_text">復号化したテキストの共有</string>
- <string name="btn_decrypt_clipboard">クリップボードから復号化</string>
+ <string name="btn_decrypt_clipboard">クリップボードからテキストを復号化</string>
<string name="btn_decrypt_and_verify">と署名の検証</string>
<string name="btn_decrypt_files">ファイルの復号化</string>
+ <string name="btn_encrypt_files">ファイルの暗号化</string>
+ <string name="btn_encrypt_text">テキストの暗号化</string>
<!--menu-->
<string name="menu_preferences">設定</string>
<string name="menu_help">ヘルプ</string>
@@ -85,13 +92,16 @@
<string name="menu_create_key">自分の鍵の生成</string>
<string name="menu_import_existing_key">ファイルからインポート</string>
<string name="menu_search">検索</string>
+ <string name="menu_nfc_preferences">NFC設定</string>
<string name="menu_beam_preferences">Beamの設定</string>
<string name="menu_key_edit_cancel">キャンセル</string>
<string name="menu_encrypt_to">暗号化...</string>
<string name="menu_select_all">すべて選択</string>
<string name="menu_add_keys">鍵の追加</string>
+ <string name="menu_search_cloud">クラウドを検索</string>
<string name="menu_export_all_keys">すべての鍵のエクスポート</string>
<string name="menu_advanced">詳細情報を表示</string>
+ <string name="menu_certify_fingerprint">指紋比較による検証</string>
<!--label-->
<string name="label_message">メッセージ</string>
<string name="label_file">ファイル</string>
@@ -104,9 +114,9 @@
<string name="label_algorithm">アルゴリズム</string>
<string name="label_ascii_armor">アスキー形式ファイル</string>
<string name="label_file_ascii_armor">アスキー形式ファイルを有効</string>
- <string name="label_write_version_header">他の人にあなたがOpenKeychain使用していることを知ってもらいましょう</string>
+ <string name="label_write_version_header">OpenKeychainの利用を通知する</string>
<string name="label_write_version_header_summary">OpenPGPの 署名、暗号文、そしてエクスポートした鍵に \'OpenKeychain v2.7\' と書くようになりました</string>
- <string name="label_use_default_yubikey_pin">Yubikey PINをデフォルトで使用する</string>
+ <string name="label_use_default_yubikey_pin">デフォルトのYubikey PINを使用する</string>
<string name="label_use_num_keypad_for_yubikey_pin">Yubikey PINで数字キーパッドを使う</string>
<string name="label_label_use_default_yubikey_pin_summary"> NFC越しにYubikeyにアクセスするためデフォルトのPIN (123456) を使用する</string>
<string name="label_asymmetric_from">署名:</string>
@@ -187,7 +197,9 @@
<string name="passphrase_must_not_be_empty">パスフレーズを入れてください。</string>
<string name="passphrase_for_symmetric_encryption">対称暗号。</string>
<string name="passphrase_for">\'%s\' にパスフレーズを入れてください。</string>
+ <string name="pin_for">\'%s\' にPINを入力してください</string>
<string name="yubikey_pin_for">\'%s\' の Yubikey にアクセスするためのPINを入力してください</string>
+ <string name="nfc_text">あなたのデバイスの背面にYubiKeyを固定してください。</string>
<string name="file_delete_confirmation">%s
を削除してもかまいませんか?</string>
<string name="file_delete_successful">削除に成功しました。</string>
@@ -249,13 +261,14 @@
<string name="error_could_not_extract_private_key">秘密鍵を取り出すことができません</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Android NFC Beam機能を使うにはAndroid 4.1 が必要です!</string>
- <string name="error_nfc_needed">あなたのデバイスにはNFCが存在しません!</string>
+ <string name="error_nfc_needed">NFCを有効にしてください!</string>
+ <string name="error_beam_needed">Beamを有効にしてください!</string>
<string name="error_nothing_import">鍵が見当りません!</string>
<string name="error_contacts_key_id_missing">連絡帳から鍵IDの回収が失敗しました!</string>
<string name="error_generic_report_bug">一般エラーが発生しました、この新しいバグの情報をOpenKeychainプロジェクトに送ってください</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">未署名</string>
- <string name="decrypt_result_invalid_signature">不正な署名です!</string>
+ <string name="decrypt_result_invalid_signature">無効な署名です!</string>
<string name="decrypt_result_signature_uncertified">署名(未検証!)</string>
<string name="decrypt_result_signature_certified">署名</string>
<string name="decrypt_result_signature_expired_key">鍵が期限切れ!</string>
@@ -265,6 +278,8 @@
<string name="decrypt_result_not_encrypted">未暗号化</string>
<string name="decrypt_result_action_show">表示</string>
<string name="decrypt_result_action_Lookup">検出</string>
+ <string name="decrypt_invalid_text">署名が無効もしくは鍵が破棄された/期限が切れています。なのでだれかがあなたへ文書を書くなどとても出きません。まだ表示しますか?</string>
+ <string name="decrypt_invalid_button">表示されている、リスクについて理解しました!</string>
<!--Add keys-->
<string name="add_keys_my_key">自分の鍵:</string>
<!--progress dialogs, usually ending in '…'-->
@@ -285,6 +300,7 @@
<string name="progress_modify">鍵輪を変更中...</string>
<string name="progress_modify_unlock">鍵輪のロック解除中...</string>
<string name="progress_modify_adduid">ユーザIDを追加中...</string>
+ <string name="progress_modify_adduat">ユーザ属性を追加...</string>
<string name="progress_modify_revokeuid">ユーザIDを破棄中...</string>
<string name="progress_modify_primaryuid">主ユーザIDを変更中...</string>
<string name="progress_modify_subkeychange">副鍵の変更中...</string>
@@ -358,8 +374,9 @@
<string name="import_qr_code_wrong">不適QRコード! もう一度!</string>
<string name="import_qr_code_too_short_fingerprint">指紋が短かすぎます (&lt; 16 文字)</string>
<string name="import_qr_code_button">QCコードのスキャン</string>
+ <string name="import_qr_code_text">カメラをQRコードにかざしてください!</string>
<!--Generic result toast-->
- <string name="view_log">ログを見る</string>
+ <string name="view_log">概要</string>
<string name="with_warnings">、とワーニング</string>
<string name="with_cancelled">、キャンセルされるまで</string>
<!--Import result toast-->
@@ -384,16 +401,36 @@
<string name="import_error_nothing">インポートするものがありません。</string>
<string name="import_error_nothing_cancelled">インポートをキャンセルしました。</string>
<!--Delete result toast-->
+ <plurals name="delete_ok_but_fail_1">
+ <item quantity="other">%1$d 個の鍵の削除に成功</item>
+ </plurals>
+ <plurals name="delete_ok_but_fail_2">
+ <item quantity="other">、しかし %1$d 個の鍵 %2$s の削除が失敗。</item>
+ </plurals>
+ <plurals name="delete_ok">
+ <item quantity="other">%1$d の鍵%2$sを削除するのに成功しました。</item>
+ </plurals>
+ <plurals name="delete_fail">
+ <item quantity="other">%1$d の鍵を削除中にエラーしました。</item>
+ </plurals>
+ <string name="delete_nothing">削除するものがありません。</string>
+ <string name="delete_cancelled">削除操作をキャンセルしました。</string>
<!--Certify result toast-->
+ <plurals name="certify_keys_ok">
+ <item quantity="other">%1$d 個の鍵 %2$s の検証に成功。</item>
+ </plurals>
+ <plurals name="certify_keys_with_errors">
+ <item quantity="other">%d 個の鍵で検証失敗!</item>
+ </plurals>
+ <plurals name="certify_error">
+ <item quantity="other">%d 個の鍵の検証が失敗!</item>
+ </plurals>
<!--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">未登録のアプリです!
-
-\'ヘルプ\'のサードパーティ製アプリケーションのサポートリストにあるかを見てください!</string>
<string name="api_settings_show_info">詳細情報を表示</string>
<string name="api_settings_hide_info">詳細情報を非表示</string>
<string name="api_settings_show_advanced">拡張設定を表示</string>
@@ -409,7 +446,9 @@
<string name="api_settings_delete_account">アカウントを削除</string>
<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">アカウント(deprecated API)</string>
+ <string name="api_settings_advanced">詳細情報</string>
+ <string name="api_settings_allowed_keys">受け入れる鍵</string>
<string name="api_settings_settings">設定</string>
<string name="api_settings_key">アカウント鍵:</string>
<string name="api_settings_accounts_empty">このアプリに接続されてるアカウントはありません。</string>
@@ -436,6 +475,7 @@
<plurals name="key_list_selected_keys">
<item quantity="other">%d の鍵を選択。</item>
</plurals>
+ <string name="key_list_empty_text1">鍵が見当りません!</string>
<string name="key_list_filter_show_all">すべての鍵を表示</string>
<string name="key_list_filter_show_certified">検証済みの鍵のみ表示</string>
<!--Key view-->
@@ -454,9 +494,13 @@
<string name="user_id_info_revoked_title">破棄</string>
<string name="user_id_info_revoked_text">このIDは鍵の所有者により破棄されています。もう適正ではありません。</string>
<string name="user_id_info_certified_title">検証済み</string>
+ <string name="user_id_info_certified_text">このIDは貴方によって証明されています。</string>
<string name="user_id_info_uncertified_title">未検証</string>
- <string name="user_id_info_invalid_title">不適正</string>
+ <string name="user_id_info_uncertified_text">このIDはまだ検証されていません。IDが本当に特定の人に対応している場合を、あなたは確認することができません。</string>
+ <string name="user_id_info_invalid_title">無効</string>
<string name="user_id_info_invalid_text">このIDではなにかしら問題があります!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">パスフレーズの変更</string>
<string name="edit_key_action_add_identity">ユーザIDの追加</string>
@@ -492,13 +536,15 @@
<string name="create_key_hint_full_name">フルネーム、例えば Max Mustermann</string>
<string name="create_key_edit">鍵の設定変更</string>
<!--View key-->
- <string name="view_key_revoked">この鍵は破棄されています!</string>
- <string name="view_key_expired">この鍵は期限切れです!</string>
+ <string name="view_key_revoked">破棄: 鍵はもう使われません!</string>
+ <string name="view_key_expired">期限切れ: この連絡先は鍵の妥当性を拡張する必要があります!</string>
+ <string name="view_key_expired_secret">期限切れ: 編集で鍵の妥当性を拡張することができます!</string>
+ <string name="view_key_my_key">自分の鍵</string>
+ <string name="view_key_verified">検証済みの鍵</string>
+ <string name="view_key_unverified">未検証: QRコードをスキャンして鍵を検証!</string>
<!--Navigation Drawer-->
<string name="nav_keys">鍵</string>
- <string name="nav_encrypt_text">テキスト暗号化</string>
- <string name="nav_encrypt_files">ファイル暗号化</string>
- <string name="nav_decrypt">復号化</string>
+ <string name="nav_encrypt_decrypt">暗号化/復号化</string>
<string name="nav_apps">アプリ</string>
<string name="drawer_open">ナビゲーションドロワーを開く</string>
<string name="drawer_close">ナビゲーションドロワーを閉める</string>
@@ -586,9 +632,27 @@
<plurals name="msg_ip_uid_certs_unknown">
<item quantity="other">不明な公開鍵から %s の検証を無視</item>
</plurals>
+ <string name="msg_ip_uid_classifying_zero">ユーザIDを検証 (信頼された鍵がありません)</string>
+ <plurals name="msg_ip_uid_classifying">
+ <item quantity="other">ユーザIDを検証 ( %s の信頼された鍵を使いました)</item>
+ </plurals>
<string name="msg_ip_uid_reorder">ユーザIDの並べ直し</string>
<string name="msg_ip_uid_processing">ユーザID %s の処理中</string>
<string name="msg_ip_uid_revoked">ユーザIDは破棄されました</string>
+ <string name="msg_ip_uat_processing_image">画像型のユーザー属性の処理中</string>
+ <string name="msg_ip_uat_processing_unknown">不明な型のユーザー属性の処理中</string>
+ <string name="msg_ip_uat_cert_bad">問題のある検証を検出しました!</string>
+ <string name="msg_ip_uat_cert_error">検証の処理でエラーしました!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">すでに持っている破棄不能な証明です、スキップします。</string>
+ <string name="msg_ip_uat_cert_old">証明が前出のものより古いです、スキップします。</string>
+ <string name="msg_ip_uat_cert_new">証明がより新しいです、以前のものを置き換えます。</string>
+ <string name="msg_ip_uat_cert_good">%1$s にて良好な証明を見付けました</string>
+ <string name="msg_ip_uat_cert_good_revoke">%1$s にて良好な破棄証明を見付けました</string>
+ <plurals name="msg_ip_uat_certs_unknown">
+ <item quantity="other">不明な公開鍵なので %s の検証を無視</item>
+ </plurals>
+ <string name="msg_ip_uat_classifying">ユーザ属性の検査</string>
+ <string name="msg_ip_uat_revoked">ユーザ属性は破棄されました</string>
<string name="msg_is_bad_type_public">公開鍵の鍵輪を秘密鍵としてインポートを試行しました。これはバグで、ファイルをレポートしてください\"</string>
<string name="msg_is_bad_type_uncanon">正規化せずに鍵輪へインポートを試行した。これはバグで、ファイルをレポートしてください!</string>
<!--Import Secret log entries-->
@@ -603,6 +667,7 @@
<string name="msg_is_subkey_nonexistent">秘密鍵の副鍵 %s が利用不可能</string>
<string name="msg_is_subkey_ok">秘密鍵の副鍵 %s を利用可能としてマーク</string>
<string name="msg_is_subkey_empty">秘密鍵の副鍵 %s を利用可能としてマーク、空のパスフレーズで</string>
+ <string name="msg_is_subkey_pin">秘密鍵の副鍵 %s をPINとして利用可能とマーク</string>
<string name="msg_is_subkey_stripped">秘密鍵の副鍵 %s をストリップとしてマーク</string>
<string name="msg_is_subkey_divert">秘密鍵の副鍵 %s を\'スマートカード/NFCへ迂回\'としてマーク</string>
<string name="msg_is_success_identical">鍵輪にデータがないため、なにもしません</string>
@@ -615,22 +680,25 @@
<string name="msg_kc_error_master_algo">主鍵で不明なアルゴリズム(%s)を利用しています!</string>
<string name="msg_kc_error_dup_key">鍵輪の中に副鍵 %s が2度出現しました。鍵輪が不整形となっており、インポートできあせん!</string>
<string name="msg_kc_master">主鍵処理中</string>
- <string name="msg_kc_master_bad_err">問題のある鍵輪の破棄証明を破棄中</string>
- <string name="msg_kc_master_bad_local">鍵輪のローカルフラグ付き破棄証明を破棄中</string>
+ <string name="msg_kc_master_bad_type">主鍵の不明な型 (%s) の証明を破棄中</string>
+ <string name="msg_kc_master_bad_local">ローカルフラグ付きの主鍵検証を破棄中</string>
+ <string name="msg_kc_master_bad_err">証明が付随する問題のある主鍵を破棄中</string>
<string name="msg_kc_master_bad_time">鍵輪の未来にタイムスタンプがある破棄証明を破棄中</string>
- <string name="msg_kc_master_bad_type">問題のある主鍵の不明な型 (%s) の証明を破棄中</string>
<string name="msg_kc_master_bad_type_uid">不正な位置のユーザID検証を破棄中</string>
- <string name="msg_kc_master_bad">問題のある鍵輪の破棄証明を破棄中</string>
+ <string name="msg_kc_master_bad">証明が付随する問題のある主鍵を破棄中</string>
+ <string name="msg_kc_master_local">ローカルフラグ付きの主鍵検証を破棄中</string>
<string name="msg_kc_revoke_dup">重複している鍵輪の破棄証明を破棄中</string>
+ <string name="msg_kc_notation_dup">重複しているノーテーション証明を破棄中</string>
+ <string name="msg_kc_notation_empty">空のノーテーション証明を破棄中</string>
<string name="msg_kc_sub">副鍵 %s の処理中</string>
- <string name="msg_kc_sub_bad">証明が付随する不正な副鍵を破棄中</string>
+ <string name="msg_kc_sub_bad">証明が付随する無効な副鍵を破棄中</string>
<string name="msg_kc_sub_bad_err">証明が付随する問題のある副鍵を破棄中</string>
<string name="msg_kc_sub_bad_local">ローカルフラグ付きの証明が付随する副鍵を破棄中</string>
<string name="msg_kc_sub_bad_keyid">副鍵の発行者のIDと付随するIDがミスマッチ</string>
<string name="msg_kc_sub_bad_time">未来にタイムスタンプがある証明が付随する副鍵を破棄中</string>
<string name="msg_kc_sub_bad_type">不明な検証のタイプ: %sの副鍵</string>
<string name="msg_kc_sub_dup">証明が付随する重複する副鍵を破棄中</string>
- <string name="msg_kc_sub_primary_bad">付随する主たる証明が正しくない証明が付随する副鍵を破棄中</string>
+ <string name="msg_kc_sub_primary_bad">付随する主たる証明が無効であるものが付随する副鍵を破棄中</string>
<string name="msg_kc_sub_primary_bad_err">付随する主たる証明に問題がある証明が付随する副鍵を破棄中</string>
<string name="msg_kc_sub_primary_none">付随する主たる証明が失なわれている証明が付随する副鍵を破棄中</string>
<string name="msg_kc_sub_no_cert">%s から正常な検証が見付かりません、鍵輪から除外します</string>
@@ -648,7 +716,34 @@
<plurals name="msg_kc_success_redundant">
<item quantity="other">鍵輪の認可に成功、 %d 個の重複を除去</item>
</plurals>
+ <string name="msg_kc_uid_bad_err">ユーザID \'%s\' による問題のある自己検証を破棄中</string>
+ <string name="msg_kc_uid_bad_local">\'ローカル\'フラグ付きのユーザID検証を破棄中</string>
+ <string name="msg_kc_uid_bad_time">未来のタイムスタンプになっているユーザIDを破棄中</string>
+ <string name="msg_kc_uid_bad_type">不明な型 (%s) でのユーザID検証を破棄中</string>
+ <string name="msg_kc_uid_bad">ユーザID \'%s\' による問題のある自己検証を破棄中</string>
+ <string name="msg_kc_uid_cert_dup">期限の切れたユーザID \'%s\' による自己検証を破棄中</string>
+ <string name="msg_kc_uid_foreign">\'%s\' によって検証されている外部ユーザIDを破棄中</string>
+ <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>
+ <string name="msg_kc_uid_dup">重複したユーザID \'%s\' を削除中。IDを二つもっています。この結果は署名を失っているためかもしれません!</string>
<string name="msg_kc_uid_warn_encoding">ユーザIDがUTF-8で検証できませんでした!</string>
+ <string name="msg_kc_uat_jpeg">JPEG型のユーザー属性の処理中</string>
+ <string name="msg_kc_uat_unknown">不明な型のユーザー属性の処理中</string>
+ <string name="msg_kc_uat_bad_err">ユーザ属性で問題のある自己検証を破棄中</string>
+ <string name="msg_kc_uat_bad_local">\'ローカル\'フラグ付きのユーザ属性検証を破棄中</string>
+ <string name="msg_kc_uat_bad_time">タイムスタンプが未来のユーザ属性を破棄中</string>
+ <string name="msg_kc_uat_bad_type">不明な型 (%s) でのユーザ属性検証を破棄中</string>
+ <string name="msg_kc_uat_bad">ユーザ属性で問題のある自己検証を破棄中</string>
+ <string name="msg_kc_uat_cert_dup">期限の切れたユーザ属性の自己検証を破棄中</string>
+ <string name="msg_kc_uat_dup">重複したユーザ属性を削除中。属性を二つもっています。この結果は署名を失っているためかもしれません!</string>
+ <string name="msg_kc_uat_foreign">これによって検証されている外部ユーザ属性を破棄中</string>
+ <string name="msg_kc_uat_revoke_dup">ユーザ属性の重複した破棄証明を破棄中</string>
+ <string name="msg_kc_uat_revoke_old">ユーザ属性の期限の切れた破棄証明を破棄中</string>
+ <string name="msg_kc_uat_no_cert">ユーザー属性として正常な自己署名が見付かりませんでした、鍵輪から除去しました</string>
+ <string name="msg_kc_uat_remove">無効なユーザ属性を破棄中</string>
+ <string name="msg_kc_uat_warn_encoding">ユーザIDがUTF-8として検証できませんでした!</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_secret_dummy">新しい公開鍵の副鍵を見付けました、しかしダミー生成の秘密鍵の副鍵でサポートされません。!</string>
<string name="msg_mg_error_heterogeneous">指紋が異なる鍵輪をマージしようとしています!</string>
@@ -663,32 +758,36 @@
<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_null_expiry">鍵の生成時に期限を\'過去\'とすることはできません。これはプログラムエラーで、バグレポートとしてファイルを送ってください!</string>
+ <string name="msg_cr_error_null_expiry">鍵の生成時に期限を\'過去\'とすることはできません。これはプログラムエラーで、バグレポートでファイルを送ってください!</string>
<string name="msg_cr_error_keysize_512">鍵サイズは512かそれ以上が必須です!</string>
- <string name="msg_cr_error_no_curve">鍵サイズが不明です! これはプログラミングのエラーで、バグレポートの提出をお願いします!</string>
- <string name="msg_cr_error_no_keysize">楕円暗号が不明です! これはプログラミングのエラーで、バグレポートの提出をお願いします!</string>
+ <string name="msg_cr_error_no_curve">鍵サイズが不明です! これはプログラムエラーで、バグレポートでファイルの提出をお願いします!</string>
+ <string name="msg_cr_error_no_keysize">楕円暗号が不明です! これはプログラムエラーで、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_cr_error_internal_pgp">PGP内部エラー!</string>
- <string name="msg_cr_error_unknown_algo">不明なアルゴリズムが選択されています! これはプログラミングのエラーで、バグレポートの提出をお願いします!</string>
+ <string name="msg_cr_error_unknown_algo">不明なアルゴリズムが選択されています! これはプログラムエラーで、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_cr_error_flags_dsa">問題のある鍵フラグが選択されています、DSAは暗号化に使えません!</string>
<string name="msg_cr_error_flags_elgamal">問題のある鍵フラグが選択されています、ElGamalは署名に使えません!</string>
<string name="msg_cr_error_flags_ecdsa">問題のある鍵フラグが選択されています、楕円曲線DSAは暗号化に使えません!</string>
<string name="msg_cr_error_flags_ecdh">問題のある鍵フラグが選択されています、楕円曲線DHは署名に使えません!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">鍵輪 %s を変更中</string>
+ <string name="msg_mf_error_divert_serial">カードに対比した鍵のシリアル番号には16バイトは必要です!これはプロラグラムエラーで、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_mf_error_encode">エンコード例外!</string>
<string name="msg_mf_error_fingerprint">現実の鍵指紋が想定の1つと合致しませんでした!</string>
- <string name="msg_mf_error_keyid">鍵IDがない。 これは内部エラーで、バグレポートの提出をお願いします!</string>
+ <string name="msg_mf_error_keyid">鍵IDがありません。 これは内部エラーで、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_mf_error_integrity">内部エラー、完全性チェックが失敗!</string>
<string name="msg_mf_error_master_none">マスター認証が操作で見付かりませんでした(すべて破棄しましたか?)</string>
<string name="msg_mf_error_noexist_primary">問題のある主ユーザIDが指定された!</string>
<string name="msg_mf_error_noexist_revoke">破棄において問題のあるユーザIDが指定された!</string>
+ <string name="msg_mf_error_restricted">パスフレーズのない厳密な捜査を実行してみてください!それはプロラミングエラーで、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_mf_error_revoked_primary">主ユーザIDの破棄はできません!</string>
- <string name="msg_mf_error_null_expiry">副鍵の生成時に期限を\"過去\"とすることはできません。これはプログラムエラーで、バグレポートとしてファイルを送ってください!</string>
- <string name="msg_mf_error_passphrase_master">主鍵の復号で致命的な失敗! これはプログラミングのエラーの場合がありますので、バグレポートの提出をお願いします!</string>
+ <string name="msg_mf_error_null_expiry">副鍵の生成時に期限を\"過去\"とすることはできません。これはプログラムエラーで、バグレポートでファイルの提出をお願いします!</string>
+ <string name="msg_mf_error_passphrase_master">主鍵の復号で致命的な失敗! これはプログラムエラーの場合がありますので、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_mf_error_pgp">PGP内部エラー!</string>
<string name="msg_mf_error_sig">署名例外!</string>
<string name="msg_mf_master">マスター認証を変更</string>
- <string name="msg_mf_passphrase">鍵輪のパスフレーズの変更中...</string>
+ <string name="msg_mf_notation_empty">空のノーテーションパケットを追加</string>
+ <string name="msg_mf_notation_pin">PINノーテーションパケットを追加</string>
+ <string name="msg_mf_passphrase">鍵輪のパスフレーズの変更中</string>
<string name="msg_mf_passphrase_key">副鍵 %s を新しいパスフレーズで再暗号化</string>
<string name="msg_mf_passphrase_empty_retry">新しいパスフレーズの設定に失敗しました、空の古いパスフレーズで再度試してください</string>
<string name="msg_mf_passphrase_fail">副鍵のパスフレーズは変更されていません! (他の鍵とは異なるになっていませんか?)</string>
@@ -703,12 +802,17 @@
<string name="msg_mf_subkey_strip">副鍵 %s のストリップ中</string>
<string name="msg_mf_success">鍵輪の変更に成功</string>
<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_uat_error_empty">ユーザ属性は空にすることはできません!</string>
+ <string name="msg_mf_uat_add_image">画像型のユーザー属性の追加中</string>
+ <string name="msg_mf_uat_add_unknown">不明な型のユーザー属性の追加中</string>
<string name="msg_mf_unlock_error">鍵輪のロック解除エラー!</string>
<string name="msg_mf_unlock">鍵輪のロック解除中</string>
<!--Consolidate-->
<string name="msg_con">データベースの統合中</string>
- <string name="msg_con_error_bad_state">データベースでキャッシュせずに統合が開始されています! これはおそらくプログラミングのエラーなので、バグレポートの提出をお願いします!</string>
+ <string name="msg_con_error_bad_state">データベースでキャッシュせずに統合が開始されています! これはおそらくプログラムエラーなので、バグレポートでファイルの提出をお願いします!</string>
<string name="msg_con_error_concurrent">統合を中断しました、すでに他のスレッドで動いているためです!</string>
<string name="msg_con_save_secret">秘密鍵の鍵輪を保存中</string>
<string name="msg_con_save_public">公開鍵の鍵輪を保存中</string>
@@ -723,6 +827,9 @@
<string name="msg_con_error_io_secret">キャッシュに秘密鍵を書く際にI/Oエラー!</string>
<string name="msg_con_error_public">公開鍵の再インポートのエラー!</string>
<string name="msg_con_error_secret">秘密鍵の再インポートのエラー!</string>
+ <string name="msg_con_recover">統合整理処理のレジューム</string>
+ <string name="msg_con_recursive">再帰統合処理をスキップ</string>
+ <string name="msg_con_recover_unknown">不明な状態からの統合整理処理のレジューム</string>
<plurals name="msg_con_reimport_public">
<item quantity="other">%d の公開鍵を再インポート中</item>
</plurals>
@@ -733,6 +840,19 @@
<string name="msg_con_reimport_secret_skip">再インポートで秘密鍵がありません、スキップします...</string>
<string name="msg_con_warn_delete_public">公開鍵キャッシュファイルの削除例外</string>
<string name="msg_con_warn_delete_secret">秘密鍵のキャッシュファイルを削除中に例外発生</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">キー操作の実行</string>
+ <string name="msg_ed_caching_new">新しいパスフレーズをキャッシュ</string>
+ <string name="msg_ed_error_no_parcel">SaveKeyringParcel欠落!(これはバグです、レポートしてください)</string>
+ <string name="msg_ed_error_key_not_found">鍵が見当りません!</string>
+ <string name="msg_ed_fetching">フェッチした鍵を変更 (%s)</string>
+ <string name="msg_ed_success">鍵の操作に成功</string>
+ <!--Promote key-->
+ <string name="msg_pr">公開鍵が秘密鍵に昇格しました</string>
+ <string name="msg_pr_error_already_secret">鍵はすでに秘密鍵となっています!</string>
+ <string name="msg_pr_error_key_not_found">鍵が見当りません!</string>
+ <string name="msg_pr_fetching">フェッチした鍵を変更 (%s)</string>
+ <string name="msg_pr_success">鍵は正常に昇格しました</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">NFCの鍵の編集は(まだ)サポートされていません!</string>
<string name="msg_ek_error_dummy">ストリップした主鍵では鍵輪を編集できません!</string>
@@ -741,11 +861,13 @@
<string name="msg_dc_askip_no_key">既知の鍵で暗号化されていないデータです、スキップします...</string>
<string name="msg_dc_askip_not_allowed">受け入れた鍵で暗号化されていないデータです、スキップします...</string>
<string name="msg_dc_asym">鍵 %s で非対称の暗号化されたデータのブロックを検出</string>
+ <string name="msg_dc_charset">文字セットヘッダを発見: \'%s\'</string>
<string name="msg_dc_clear_data">固定データを処理中</string>
<string name="msg_dc_clear_decompress">圧縮データの展開中</string>
<string name="msg_dc_clear_meta_file">ファイル名: %s</string>
<string name="msg_dc_clear_meta_mime">MIME種別: %s</string>
<string name="msg_dc_clear_meta_size">ファイルサイズ: %s</string>
+ <string name="msg_dc_clear_meta_size_unknown">ファイルサイズが不明</string>
<string name="msg_dc_clear_meta_time">更新日時: %s</string>
<string name="msg_dc_clear_signature_bad">署名の確認がOKではありません!</string>
<string name="msg_dc_clear_signature_check">署名データの検証中</string>
@@ -755,6 +877,7 @@
<string name="msg_dc_error_bad_passphrase">鍵のロック解除エラー、パスフレーズに問題があります!</string>
<string name="msg_dc_error_extract_key">鍵のロック解除で不明なエラー!</string>
<string name="msg_dc_error_integrity_check">完全性チェックエラー!</string>
+ <string name="msg_dc_error_integrity_missing">完全聖チェックの欠落!これは暗号化アプリケーションが期限切れになった場合、もしくは暗号強度低下攻撃がある場合に発生します。</string>
<string name="msg_dc_error_invalid_siglist">正常な署名データが見付からなかった!</string>
<string name="msg_dc_error_io">操作中にIO例外に当たりました!</string>
<string name="msg_dc_error_no_data">ストリーム中に暗号化されたデータが見付からなかった!</string>
@@ -774,31 +897,50 @@
<string name="msg_dc_trail_sym">追跡で遭遇、対称暗号化されたデータ</string>
<string name="msg_dc_trail_unknown">追跡で未知のタイプのデータに遭遇</string>
<string name="msg_dc_unlocking">秘密鍵のロック解除</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">暗号化のための公開鍵の検証</string>
- <string name="msg_se_clearsign_only">クリアテキスト署名の入力はサポートされていません!</string>
- <string name="msg_se_compressing">圧縮の検証</string>
- <string name="msg_se_encrypting">暗号化データ</string>
- <string name="msg_se_error_bad_passphrase">駄目なパスフレーズ!</string>
- <string name="msg_se_error_io">操作中にIO例外に当たりました!</string>
- <string name="msg_se_error_key_sign">選択した署名鍵で署名データができません!</string>
- <string name="msg_se_error_sign_key">署名鍵の取得エラー!</string>
- <string name="msg_se_error_nfc">NFC データエラー!</string>
- <string name="msg_se_error_no_passphrase">パスフレーズなしで提供!</string>
- <string name="msg_se_error_pgp">PGP内部エラー!</string>
- <string name="msg_se_error_sig">PGP署名例外に当たりました!</string>
- <string name="msg_se_error_unlock">鍵のロック解除で不明なエラー!</string>
- <string name="msg_se_key_ok">暗号化の鍵: %s</string>
- <string name="msg_se_key_unknown">暗号化で鍵を紛失: %s</string>
- <string name="msg_se_key_warn">暗号化に問題のある鍵: %s</string>
- <string name="msg_se_ok">署名/暗号化操作に成功!</string>
- <string name="msg_se_pending_nfc">NFCトークンが必要、ユーザー入力を要求中...</string>
- <string name="msg_se_pending_passphrase">パスフレーズが必要、ユーザー入力を要求中...</string>
- <string name="msg_se_signing">署名データ(暗号化していない)</string>
- <string name="msg_se_sigcrypting">データを署名付きで暗号化中</string>
<string name="msg_se">署名/暗号化操作を開始します</string>
- <string name="msg_se_symmetric">対称暗号の検証</string>
+ <string name="msg_se_input_bytes">バイト配列からの入力処理中</string>
+ <string name="msg_se_input_uri">URIからの入力処理中</string>
+ <string name="msg_se_error_no_input">入力がありません!</string>
+ <string name="msg_se_error_input_uri_not_found">読み出すためにURIを開く時にエラー!</string>
+ <string name="msg_se_error_output_uri_not_found">書き込むためにURIを開く時にエラー!</string>
+ <string name="msg_se_error_too_many_inputs">不明な出力以上の入力過多です! これはプログラミングのエラーで、バグレポートの提出をお願いします!</string>
+ <string name="msg_se_warn_output_left">得られた出力が入力から乖離している。これはプログラミングのエラーで、バグレポートの提出をお願いします!</string>
+ <string name="msg_se_success">署名/暗号化操作に成功!</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">暗号化のための公開鍵の準備</string>
+ <string name="msg_pse_clearsign_only">クリアテキスト署名の入力はサポートされていません!</string>
+ <string name="msg_pse_compressing">圧縮の準備</string>
+ <string name="msg_pse_encrypting">データ暗号化</string>
+ <string name="msg_pse_error_bad_passphrase">駄目なパスフレーズ!</string>
+ <string name="msg_pse_error_hash_algo">この鍵ではサポートされていないハッシュアルゴリズムを要求されています!</string>
+ <string name="msg_pse_error_io">操作中にIO例外に当たりました!</string>
+ <string name="msg_pse_error_key_sign">選択した署名鍵で署名データを作れません!</string>
+ <string name="msg_pse_error_sign_key">署名鍵の取得エラー!</string>
+ <string name="msg_pse_error_nfc">NFC データエラー!</string>
+ <string name="msg_pse_error_no_passphrase">パスフレーズが提供されてない!</string>
+ <string name="msg_pse_error_pgp">OpenPGP内部エラー!</string>
+ <string name="msg_pse_error_sig">OpenPGP署名例外に当たりました!</string>
+ <string name="msg_pse_error_unlock">鍵のロック解除で不明なエラー!</string>
+ <string name="msg_pse_key_ok">暗号化の鍵: %s</string>
+ <string name="msg_pse_key_unknown">暗号化の鍵を紛失: %s</string>
+ <string name="msg_pse_key_warn">暗号化に問題のある鍵: %s</string>
+ <string name="msg_pse_ok">署名/暗号化操作に成功!</string>
+ <string name="msg_pse_pending_nfc">NFCトークンが必要、ユーザー入力を要求中...</string>
+ <string name="msg_pse_pending_passphrase">パスフレーズが必要、ユーザー入力を要求中...</string>
+ <string name="msg_pse_signing">署名データ(暗号化なし)</string>
+ <string name="msg_pse_signing_cleartext">クリアテキスト署名作成中</string>
+ <string name="msg_pse_signing_detached">分離署名作成中</string>
+ <string name="msg_pse_sigcrypting">データを署名付きで暗号化中</string>
+ <string name="msg_pse">署名/暗号化操作を開始します</string>
+ <string name="msg_pse_symmetric">対称暗号の準備</string>
<string name="msg_crt_certifying">検証の生成中</string>
+ <string name="msg_crt_certify_all">鍵 %s ですべてのユーザIDの検証中</string>
+ <plurals name="msg_crt_certify_some">
+ <item quantity="other">鍵 %2$s で %1$d 個のユーザIDの検証中</item>
+ </plurals>
+ <string name="msg_crt_error_self">自己証明書的な発行は行えません!</string>
<string name="msg_crt_error_master_not_found">主鍵が見当りません!</string>
<string name="msg_crt_error_nothing">検証できた鍵がない!</string>
<string name="msg_crt_error_unlock">主鍵のロック解除エラー!</string>
@@ -813,16 +955,29 @@
<string name="msg_crt_warn_cert_failed">証明の生成が失敗!</string>
<string name="msg_crt_warn_save_failed">保存操作が失敗!</string>
<string name="msg_crt_upload_success">鍵をサーバにアップロードしました</string>
+ <plurals name="msg_import">
+ <item quantity="other">%d 個の鍵のインポート</item>
+ </plurals>
+ <string name="msg_import_fetch_error_decode">鍵輪のデコードエラー</string>
<string name="msg_import_fetch_error">鍵の展開ができません! (ネットワークの問題?)</string>
- <string name="msg_import_fetch_keybase">keybase.ioから展開: %s</string>
+ <string name="msg_import_fetch_keybase">keybase.ioから回収: %s</string>
<string name="msg_import_fetch_keyserver_error">keybaseからの鍵の展開ができません!</string>
+ <string name="msg_import_fetch_keyserver">鍵サーバからの回収: %s</string>
<string name="msg_import_fetch_keyserver_ok">鍵の展開に成功</string>
+ <string name="msg_import_keyserver">鍵サーバ %s を使う</string>
+ <string name="msg_import_fingerprint_error">フェッチした鍵の鍵指紋が完全には一致しませんでした!</string>
<string name="msg_import_fingerprint_ok">指紋チェックOK!</string>
<string name="msg_import_merge">展開したデータをマージ</string>
<string name="msg_import_error">インポート操作に失敗!</string>
+ <string name="msg_import_error_io">I/Oエラーによりインポート操作が失敗しました!</string>
<string name="msg_import_partial">インポート操作に成功、ただしエラーあり!</string>
<string name="msg_import_success">インポート操作に成功!</string>
+ <plurals name="msg_export">
+ <item quantity="other">%d 個の鍵のエクスポート</item>
+ </plurals>
<string name="msg_export_all">すべての鍵のエクスポート</string>
+ <string name="msg_export_public">公開鍵 %s のエクスポート</string>
+ <string name="msg_export_secret">秘密鍵 %s のエクスポート</string>
<string name="msg_export_error_no_file">指定のファイル名のファイルはありません!</string>
<string name="msg_export_error_fopen">ファイルオープン中のエラー!</string>
<string name="msg_export_error_no_uri">指定のURIはありません!</string>
@@ -830,13 +985,32 @@
<string name="msg_export_error_storage">ストレージが書き込み準備できていません!</string>
<string name="msg_export_error_db">データベースエラー!</string>
<string name="msg_export_error_io">入出力エラー!</string>
+ <string name="msg_export_error_key">鍵データの事前処理のエラー!</string>
<string name="msg_export_success">エクスポート操作に成功!</string>
<string name="msg_del_error_empty">削除するものがありません!</string>
+ <string name="msg_del_error_multi_secret">秘密鍵は個別にしか削除できません!</string>
+ <plurals name="msg_del">
+ <item quantity="other">%d 個の鍵の削除</item>
+ </plurals>
+ <string name="msg_del_key">鍵 %s の削除中</string>
+ <string name="msg_del_key_fail">鍵 %s の削除に失敗</string>
+ <string name="msg_del_consolidate">秘密鍵削除後のデータベースの統合</string>
+ <plurals name="msg_del_ok">
+ <item quantity="other">%d 個の鍵の削除に成功</item>
+ </plurals>
+ <plurals name="msg_del_fail">
+ <item quantity="other">%d 個の鍵の削除に失敗</item>
+ </plurals>
<string name="msg_acc_saved">アカウント保存</string>
<string name="msg_download_success">ダウンロードに成功しました!</string>
+ <string name="msg_download_no_valid_keys">ファイル/クリップボードにて正しい鍵が見付かりません!</string>
+ <string name="msg_download_no_pgp_parts">TODO: 複数部分!</string>
<plurals name="error_import_non_pgp_part">
<item quantity="other">読み込んだファイルのOpenPGPオブジェクト部分は正しいですが、OpenPGPの鍵ではありません</item>
</plurals>
+ <string name="msg_download_query_too_short">鍵検索のクエリが短かすぎます。クエリを精密化してください!</string>
+ <string name="msg_download_too_many_responses">鍵検索のクエリが沢山の候補を返しました。クエリを精密化してください!</string>
+ <string name="msg_download_query_too_short_or_too_many_responses">鍵がまったく無いか、多すぎる鍵が見付かりました。クエリを改善してください!</string>
<string name="msg_download_query_failed">鍵の検索時にエラーが発生しました。</string>
<!--PassphraseCache-->
<string name="passp_cache_notif_click_to_clear">クリックしてパスフレーズのキャッシュをクリア</string>
@@ -844,6 +1018,11 @@
<string name="passp_cache_notif_keys">パスフレーズのキャッシュ:</string>
<string name="passp_cache_notif_clear">キャッシュクリア</string>
<string name="passp_cache_notif_pwd">パスフレーズ</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>
<!--unsorted-->
<string name="section_certifier_id">検証者</string>
<string name="section_cert">証明の詳細</string>
@@ -852,6 +1031,9 @@
<string name="empty_certs">この鍵に証明がない</string>
<string name="certs_text">あなたの検証された自己証明とあなたの鍵で生成された証明がここに表示されます</string>
<string name="section_uids_to_certify">ユーザID</string>
+ <string name="certify_text">インポートした鍵には\"アイデンティティ\": 名前とメールアドレス を含みます。正確に期待したものと一致しているか認定されているものを選択します。</string>
+ <string name="certify_fingerprint_text">表示している指紋を、文字対文字で、あなたのパートナーの表示しているものと比較</string>
+ <string name="certify_fingerprint_text2">表示している指紋は一致しましたか?</string>
<string name="label_revocation">破棄の理由</string>
<string name="label_verify_status">検証ステータス</string>
<string name="label_cert_type">種別</string>
@@ -873,9 +1055,33 @@
<string name="error_no_file_selected">暗号化するファイルを少なくとも1つ選択して下さい。</string>
<string name="error_multi_not_supported">複数ファイルの保存はサポートされていません。これは現在のAndroidでの制限です。</string>
<string name="key_colon">鍵:</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>
+ <string name="exchange_description">鍵交換の開始は、右側の参加者の番号を選択し、その後、\"交換開始\"ボタンを推します。\n\n2つ以上の質問で交換にいる右の参加者とその指紋が正しいかを確認してください。</string>
+ <string name="btn_start_exchange">交換開始</string>
+ <string name="user_id_none"><![CDATA[<none>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">アンロックする手段を選択してください</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">パスフレーズの入力</string>
+ <string name="passphrase">パスフレーズ</string>
+ <string name="noPassphrase">パスフレーズなし</string>
+ <string name="no_passphrase_set">パスフレーズが設定されてない</string>
+ <string name="passphrases_match">パスフレーズが一致しない</string>
+ <string name="passphrase_saved">パスフレーズを保存</string>
+ <string name="passphrase_invalid">無効なパスフレーズ</string>
+ <string name="missing_passphrase">パスフレーズがありません</string>
+ <string name="passphrase_again">もう一度</string>
+ <string name="lockpattern">ロックパターン</string>
+ <string name="lockpatternNFC">NFCとロックパターン</string>
+ <string name="unlock_method">アンロック手段</string>
+ <string name="set_passphrase">パスフレーズの設定</string>
+ <string name="draw_lockpattern">ロックパターンを描いてください</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">ダメなタグ。再度実施してください。</string>
+ <string name="enable_nfc">設定からNFCを有効にしてください</string>
+ <string name="no_nfc_support">この装置ではNFCをサポートしていません</string>
+ <string name="nfc_write_succesful">NFCタグに書けました!</string>
+ <string name="unlocked">アンロック</string>
+ <string name="nfc_settings">設定</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-large/dimens.xml b/OpenKeychain/src/main/res/values-large/dimens.xml
index 192a4bb99..045e125f3 100644
--- a/OpenKeychain/src/main/res/values-large/dimens.xml
+++ b/OpenKeychain/src/main/res/values-large/dimens.xml
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="drawer_content_padding">240dp</dimen>
</resources>
diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml
index d4eb02932..34b8f1627 100644
--- a/OpenKeychain/src/main/res/values-nl/strings.xml
+++ b/OpenKeychain/src/main/res/values-nl/strings.xml
@@ -2,80 +2,153 @@
<resources>
<!--GENERAL: Please put all strings inside quotes as described in example 1 on
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <string name="app_name">OpenKeychain</string>
<!--title-->
+ <string name="title_select_recipients">Selecteer sleutels</string>
+ <string name="title_select_secret_key">Selecteer je sleutel</string>
+ <string name="title_encrypt_text">Versleutel tekst</string>
+ <string name="title_encrypt_files">Versleutel bestanden</string>
<string name="title_decrypt">Ontsleutelen</string>
- <string name="title_unlock">Wachtwoord</string>
+ <string name="title_unlock">Ontgrendel sleutel</string>
+ <string name="title_add_subkey">Voeg subsleutel toe</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_cloud_search_preferences">Cloud-zoekvoorkeuren</string>
+ <string name="title_api_registered_apps">Apps</string>
+ <string name="title_key_server_preference">Sleutelservers</string>
<string name="title_change_passphrase">Wachtwoord wijzigen</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>
+ <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>
+ <string name="title_share_message">Bericht delen met…</string>
<string name="title_encrypt_to_file">Versleutelen naar bestand</string>
<string name="title_decrypt_to_file">Ontsleutelen naar bestand</string>
<string name="title_import_keys">Sleutels importeren</string>
+ <string name="title_add_keys">Voeg sleutels toe</string>
<string name="title_export_key">Sleutels exporteren</string>
<string name="title_export_keys">Sleutels exporteren</string>
<string name="title_key_not_found">Sleutel niet gevonden</string>
- <string name="title_send_key">Upload naar Sleutelserver</string>
- <string name="title_certify_key">Certifiëer Identiteiten</string>
+ <string name="title_send_key">Upload naar sleutelserver</string>
+ <string name="title_certify_key">Certifieer Identiteiten</string>
<string name="title_key_details">Sleutel Details</string>
<string name="title_help">Help</string>
+ <string name="title_log_display">Log</string>
+ <string name="title_create_key">Sleutel aanmaken</string>
+ <string name="title_exchange_keys">Sleutels uitwisselen</string>
+ <string name="title_advanced_key_info">Geavanceerde sleutelinfo</string>
+ <string name="title_keys">Sleutels</string>
<!--section-->
<string name="section_user_ids">Identiteiten</string>
+ <string name="section_should_you_trust">Zou je deze sleutel vertrouwen?</string>
+ <string name="section_proof_details">Bewijs van verificatie</string>
+ <string name="section_cloud_evidence">Bewijs van de cloud</string>
<string name="section_keys">Subsleutels</string>
+ <string name="section_cloud_search">Cloud zoeken</string>
<string name="section_general">Algemeen</string>
<string name="section_defaults">Standaard</string>
<string name="section_advanced">Geavanceerd</string>
+ <string name="section_passphrase_cache">Wachtwoordcache</string>
+ <string name="section_certify">Certificeren</string>
<string name="section_actions">Acties</string>
+ <string name="section_share_key">Sleutel</string>
<string name="section_certification_key">Uw Sleutel die u gebruikt voor certificatie</string>
+ <string name="section_upload_key">Synchroniseer sleutel</string>
<string name="section_key_server">Sleutelserver</string>
<string name="section_fingerprint">Vingerafdruk</string>
<string name="section_key_to_certify">Sleutel om te certificeren</string>
+ <string name="section_decrypt_files">Bestanden</string>
+ <string name="section_decrypt_text">Tekst</string>
+ <string name="section_certs">Certificaten</string>
+ <string name="section_encrypt">Versleutelen</string>
+ <string name="section_decrypt">Ontsleutelen</string>
<!--button-->
<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_encrypt_file">Codeer en sla bestanden op</string>
+ <string name="btn_encrypt_share_file">Bestand versleutelen en delen</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 einddatum</string>
<string name="btn_okay">OK</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_no">Nee</string>
+ <string name="btn_match">Vingerafdrukken komen overeen</string>
<string name="btn_lookup_key">Opzoeksleutel</string>
+ <string name="btn_share_encrypted_signed">Bericht versleutelen en delen</string>
<string name="btn_view_cert_key">Toon certificatiesleutel</string>
+ <string name="btn_create_key">Sleutel aanmaken</string>
+ <string name="btn_add_files">Bestand(en) toevoegen</string>
+ <string name="btn_add_share_decrypted_text">Ontcijferde tekst delen</string>
+ <string name="btn_decrypt_clipboard">Tekst van klembord ontsleutelen</string>
+ <string name="btn_decrypt_and_verify">en ondertekeningen verifiëren</string>
+ <string name="btn_decrypt_files">Bestanden ontcijferen</string>
+ <string name="btn_encrypt_files">Bestanden versleutelen</string>
+ <string name="btn_encrypt_text">Tekst versleutelen</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">Mijn sleutel aanmaken</string>
+ <string name="menu_import_existing_key">Importeren van bestand</string>
<string name="menu_search">Zoeken</string>
+ <string name="menu_nfc_preferences">NFC-instellingen</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>
+ <string name="menu_encrypt_to">Versleutelen naar…</string>
<string name="menu_select_all">Alles selecteren</string>
<string name="menu_add_keys">Sleutels toevoegen</string>
+ <string name="menu_search_cloud">Zoeken</string>
<string name="menu_export_all_keys">Alle sleutels exporteren</string>
+ <string name="menu_advanced">Geavanceerde info tonen</string>
+ <string name="menu_certify_fingerprint">Verifiëren door vingerafdrukken te vergelijken</string>
<!--label-->
<string name="label_message">Bericht</string>
<string name="label_file">Bestand</string>
+ <string name="label_files">Bestand(en)</string>
+ <string name="label_file_colon">Bestand:</string>
<string name="label_no_passphrase">Geen wachtwoord</string>
<string name="label_passphrase">Wachtwoord</string>
+ <string name="label_unlock">Bezig met ontgrendelen…</string>
+ <string name="label_passphrase_again">Herhaal wachtwoord</string>
<string name="label_algorithm">Algoritme</string>
+ <string name="label_ascii_armor">Bestand ASCII Armor</string>
+ <string name="label_file_ascii_armor">ASCII Armor aanzetten</string>
+ <string name="label_write_version_header">Laat anderen weten dat je OpenKeychain gebruikt</string>
+ <string name="label_write_version_header_summary">Voegt \'OpenKeychain v2.7\' toe aan OpenPGP ondertekeningen, cijfertekst en geëxporteerde sleutels</string>
+ <string name="label_use_default_yubikey_pin">Gebruik standaard YubiKey PIN</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Gebruik numeriek toetsenbord voor YubiKey PIN</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Gebruikt standaard PIN (123456) om YubiKeys over NFC te bereiken</string>
+ <string name="label_asymmetric_from">Ondertekend door:</string>
+ <string name="label_to">Versleutelen naar:</string>
+ <string name="label_delete_after_encryption">Verwijder bestand na versleuteling</string>
+ <string name="label_delete_after_decryption">Verwijder na ontcijfering</string>
+ <string name="label_encryption_algorithm">Versleutelingsalgoritme</string>
+ <string name="label_hash_algorithm">Hashalgoritme</string>
+ <string name="label_symmetric">Versleutelen met wachtwoord</string>
+ <string name="label_passphrase_cache_ttl">Cachetijd</string>
+ <string name="label_passphrase_cache_subs">Cache wachtwoorden per subsleutel</string>
+ <string name="label_message_compression">Berichtscompressie</string>
+ <string name="label_file_compression">Bestandscompressie</string>
<string name="label_keyservers">Sleutelservers</string>
<string name="label_key_id">Sleutel-id</string>
<string name="label_creation">Aanmaak</string>
<string name="label_expiry">Verlopen</string>
<string name="label_usage">Gebruik</string>
<string name="label_key_size">Sleutelgrootte</string>
+ <string name="label_ecc_curve">Elliptische curve</string>
<string name="label_main_user_id">Primaire identiteit</string>
<string name="label_name">Naam</string>
<string name="label_comment">Opmerking</string>
<string name="label_email">E-mailadres</string>
+ <string name="label_send_key">Synchroniseren met de cloud</string>
<string name="label_fingerprint">Vingerafdruk</string>
<string name="expiry_date_dialog_title">Bepaal verloopdatum</string>
+ <string name="label_first_keyserver_is_used">(Voorkeur gaat uit naar de eerste keyserver in de lijst)</string>
+ <string name="label_preferred">voorkeur</string>
<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>
@@ -111,7 +184,9 @@
<string name="dsa">DSA</string>
<string name="elgamal">ElGamal</string>
<string name="rsa">RSA</string>
- <string name="filemanager_title_open">Openen...</string>
+ <string name="ecdh">ECDH</string>
+ <string name="ecdsa">ECDSA</string>
+ <string name="filemanager_title_open">Openen…</string>
<string name="warning">Waarschuwing</string>
<string name="error">Fout</string>
<string name="error_message">Fout: %s</string>
@@ -127,6 +202,10 @@
<string name="passphrase_must_not_be_empty">Vul een wachtwoord in.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrische versleuteling.</string>
<string name="passphrase_for">Voer het wachtwoord in voor \'%s\'</string>
+ <string name="pin_for">Voer PIN in voor \'%s\'</string>
+ <string name="yubikey_pin_for">Voer PIN in om toegang te verkrijgen tot YubiKey voor \'%s\'</string>
+ <string name="nfc_text">Hou YubiKey tegen de achterkant van je toestel</string>
+ <string name="file_delete_confirmation">Ben je zeker dat je %s wil verwijderen?</string>
<string name="file_delete_successful">Succesvol verwijderd.</string>
<string name="no_file_selected">Selecteer eerst een bestand.</string>
<string name="encrypt_sign_successful">Succesvol gesigneerd en/of gecodeerd.</string>
@@ -134,17 +213,30 @@
<string name="enter_passphrase_twice">Voer het wachtwoord tweemaal in.</string>
<string name="select_encryption_key">Selecteer ten minste één versleutelingssleutel.</string>
<string name="select_encryption_or_signature_key">Selecter ten minste één versleutelings-/ondertekeningssleutel.</string>
+ <string name="specify_file_to_encrypt_to">Gelieve aan te geven naar welk bestand versleuteld moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden.</string>
+ <string name="specify_file_to_decrypt_to">Gelieve aan te geven naar welk bestand ontcijferd moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden.</string>
+ <string name="specify_file_to_export_to">Gelieve aan te geven naar welk bestand geëxporteerd moet worden.\nWAARSCHUWING: Als het bestand al bestaat, zal het overschreven worden.</string>
+ <string name="key_deletion_confirmation_multi">Ben je zeker dat je alle geselecteerde publieke sleutels wil verwijderen?\nJe kan dit niet ongedaan maken!</string>
+ <string name="secret_key_deletion_confirmation">Ben je zeker dat je de GEHEIME sleutel \'%s\' wil verwijderen?\nJe kan dit niet ongedaan maken!</string>
+ <string name="public_key_deletetion_confirmation">Ben je zeker dat je de publieke sleutel \'%s\' wil verwijderen?\nJe kan dit niet ongedaan maken!</string>
+ <string name="also_export_secret_keys">Exporteer ook geheime sleutels</string>
+ <string name="reinstall_openkeychain">Je bent een gekende Android-bug tegengekomen. Gelieve OpenKeychain opnieuw te installeren als je je contacten met sleutels wil verbinden.</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_not_found">Kan de sleutel %08X niet vinden.</string>
+ <plurals name="bad_keys_encountered">
+ <item quantity="one">%d slechte geheime sleutel genegeerd. Misschien heb je geëxporteerd met de optie\n--export-secret-subkeys\nZorg ervoor dat je in plaats daarvan met --export-secret-keys exporteert.</item>
+ <item quantity="other">%d slechte geheime sleutels genegeerd. Misschien heb je geëxporteerd met de optie\n--export-secret-subkeys\nZorg ervoor dat je in plaats daarvan met --export-secret-keys exporteert.</item>
+ </plurals>
<string name="list_empty">Lijst is leeg</string>
<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="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>
+ <string name="text_copied_to_clipboard">Tekst is gekopieerd naar klembord!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
@@ -158,44 +250,85 @@
<string name="error_key_needs_a_user_id">minstens een identiteit 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 versleutelde of ondertekende OpenPGP-inhoud!</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_wrong_passphrase">wachtwoord verkeerd</string>
<string name="error_could_not_extract_private_key">kan privésleutel niet uitpakken</string>
<!--errors without preceeding Error:-->
<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>
+ <string name="error_nfc_needed">NFC moet aangezet zijn!</string>
+ <string name="error_beam_needed">Beam moet aangezet zijn!</string>
+ <string name="error_nothing_import">Geen sleutels gevonden!</string>
+ <string name="error_contacts_key_id_missing">Sleutel-ID van contacten ophalen mislukt!</string>
+ <string name="error_generic_report_bug">Een algemene fout is opgetreden, gelieve een nieuw bug-verslag te maken voor OpenKeychain.</string>
<!--results shown after decryption/verification-->
+ <string name="decrypt_result_no_signature">Niet ondertekend</string>
<string name="decrypt_result_invalid_signature">Ongeldige handtekening!</string>
+ <string name="decrypt_result_signature_uncertified">Ondertekend door (niet gecertificeerd!)</string>
+ <string name="decrypt_result_signature_certified">Ondertekend door</string>
+ <string name="decrypt_result_signature_expired_key">Sleutel is verlopen!</string>
+ <string name="decrypt_result_signature_revoked_key">Sleutel is ingetrokken!</string>
+ <string name="decrypt_result_signature_missing_key">Onbekende publieke sleutel</string>
+ <string name="decrypt_result_encrypted">Versleuteld</string>
+ <string name="decrypt_result_not_encrypted">Niet versleuteld</string>
+ <string name="decrypt_result_action_show">Toon</string>
+ <string name="decrypt_result_action_Lookup">Zoek</string>
+ <string name="decrypt_invalid_text">De ondertekening is ongeldig of de sleutel is ingetrokken/verlopen. Je kan niet zeker zijn wie de tekst geschreven heeft. Ben je zeker dat je ze wil weergeven?</string>
+ <string name="decrypt_invalid_button">Ik begrijp de risico\'s, geef de tekst weer!</string>
<!--Add keys-->
+ <string name="add_keys_my_key">Mijn sleutel:</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">Gereed.</string>
<string name="progress_cancel">Annuleren</string>
- <string name="progress_saving">opslaan...</string>
- <string name="progress_importing">importeren...</string>
- <string name="progress_exporting">exporteren...</string>
- <string name="progress_building_key">sleutel maken...</string>
- <string name="progress_building_master_key">hoofdsleutelbos maken...</string>
+ <string name="progress_cancelling">bezig met annuleren…</string>
+ <string name="progress_saving">opslaan…</string>
+ <string name="progress_importing">importeren…</string>
+ <string name="progress_exporting">exporteren…</string>
+ <string name="progress_uploading">bezig met uploaden…</string>
+ <string name="progress_building_key">sleutel maken…</string>
+ <string name="progress_building_master_key">hoofdsleutelbos maken…</string>
+ <string name="progress_generating_rsa">bezig met genereren van nieuwe RSA-sleutel…</string>
+ <string name="progress_generating_dsa">bezig met genereren van nieuwe DSA-sleutel…</string>
+ <string name="progress_generating_elgamal">bezig met genereren van nieuwe ElGamal-sleutel…</string>
+ <string name="progress_generating_ecdsa">bezig met genereren van nieuwe ECDSA-sleutel…</string>
+ <string name="progress_generating_ecdh">bezig met genereren van nieuwe ECDH-sleutel…</string>
+ <string name="progress_modify">bezig met wijzigen van sleutelbos…</string>
+ <string name="progress_modify_unlock">bezig met ontgrendelen van sleutelbos…</string>
+ <string name="progress_modify_adduid">bezig met toevoegen van gebruikers-ID\'s…</string>
+ <string name="progress_modify_adduat">bezig met toevoegen van gebruikersattributen…</string>
+ <string name="progress_modify_revokeuid">bezig met intrekken van gebruikers-ID\'s…</string>
+ <string name="progress_modify_primaryuid">bezig met primaire gebruikers-ID te veranderen…</string>
+ <string name="progress_modify_subkeychange">bezig met wijzigen van subsleutels…</string>
+ <string name="progress_modify_subkeyrevoke">bezig met terugtrekken van subsleutels…</string>
+ <string name="progress_modify_subkeystrip">bezig met strippen van subsleutels…</string>
+ <string name="progress_modify_subkeyadd">bezig met toevoegen van subsleutels…</string>
+ <string name="progress_modify_passphrase">bezig met veranderen van wachtwoord…</string>
<plurals name="progress_exporting_key">
- <item quantity="one">sleutel exporteren...</item>
- <item quantity="other">sleutels exporteren...</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>
- <string name="progress_encrypting">gegevens versleutelen...</string>
- <string name="progress_decrypting">gegevens ontsleutelen...</string>
- <string name="progress_preparing_signature">handtekening voorbereiden...</string>
- <string name="progress_generating_signature">handtekening genereren...</string>
- <string name="progress_processing_signature">handtekening verwerken...</string>
- <string name="progress_verifying_signature">handtekening verifiëren...</string>
- <string name="progress_signing">ondertekenen...</string>
- <string name="progress_reading_data">gegevens lezen...</string>
- <string name="progress_finding_key">sleutel opzoeken...</string>
- <string name="progress_decompressing_data">gegevens decomprimeren...</string>
- <string name="progress_verifying_integrity">integriteit verifiëren...</string>
- <string name="progress_deleting_securely">\'%s\' veilig verwijderen...</string>
+ <item quantity="one">sleutel exporteren…</item>
+ <item quantity="other">sleutels exporteren…</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>
+ <string name="progress_encrypting">gegevens versleutelen…</string>
+ <string name="progress_decrypting">gegevens ontsleutelen…</string>
+ <string name="progress_preparing_signature">handtekening voorbereiden…</string>
+ <string name="progress_generating_signature">handtekening genereren…</string>
+ <string name="progress_processing_signature">handtekening verwerken…</string>
+ <string name="progress_verifying_signature">handtekening verifiëren…</string>
+ <string name="progress_signing">ondertekenen…</string>
+ <string name="progress_certifying">bezig met certificeren…</string>
+ <string name="progress_reading_data">gegevens lezen…</string>
+ <string name="progress_finding_key">sleutel opzoeken…</string>
+ <string name="progress_decompressing_data">gegevens decomprimeren…</string>
+ <string name="progress_verifying_integrity">integriteit verifiëren…</string>
+ <string name="progress_deleting_securely">\'%s\' veilig verwijderen…</string>
+ <string name="progress_deleting">bezig met verwijderen van sleutels…</string>
+ <string name="progress_con_saving">consolidatie: bezig met opslaan naar cache…</string>
+ <string name="progress_con_reimport">consolidatie: bezig met opnieuw importeren…</string>
<!--action strings-->
+ <string name="hint_keyserver_search_hint">Naam/E-mail/Sleutel ID…</string>
+ <string name="hint_cloud_search_hint">Name/E-mail/Bewijs/Sleutel…</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -207,8 +340,12 @@
<string name="key_size_8192">8192</string>
<string name="key_size_custom">Aangepaste sleutelgrootte</string>
<string name="key_size_custom_info">Typ aangepaste sleutellengte (in bits):</string>
+ <string name="key_size_custom_info_rsa">RSA sleutellengte moet groter zijn dan 1024 en ten hoogste 16384. Ze moet ook deelbaar zijn door 8.</string>
<string name="key_size_custom_info_dsa">DSA sleutellengte moet minstens 512 zijn en maximaal 1024. Het moet ook deelbaar zijn door 64.</string>
<!--elliptic curve names-->
+ <string name="key_curve_nist_p256">NIST P-256</string>
+ <string name="key_curve_nist_p384">NIST P-384</string>
+ <string name="key_curve_nist_p521">NIST P-521</string>
<!--not in for now, see SaveKeyringParcel
<string name="key_curve_bp_p256">"Brainpool P-256"</string>
<string name="key_curve_bp_p384">"Brainpool P-384"</string>
@@ -225,13 +362,78 @@
<string name="help_tab_about">Over</string>
<string name="help_about_version">Versie:</string>
<!--Import-->
+ <string name="import_tab_keyserver">Sleutelserver</string>
+ <string name="import_tab_cloud">Zoeken</string>
+ <string name="import_tab_direct">Bestand/klembord</string>
+ <string name="import_tab_qr_code">QR code/NFC</string>
<string name="import_import">Geselecteerde sleutels importeren</string>
<string name="import_qr_code_wrong">QR-code ongeldig. Probeer het opnieuw</string>
<string name="import_qr_code_too_short_fingerprint">Vingerafdruk is te kort (&lt; 16 tekens)</string>
+ <string name="import_qr_code_button">QR code scannen</string>
+ <string name="import_qr_code_text">Plaats je camera voor de QR-code!</string>
<!--Generic result toast-->
+ <string name="view_log">Details</string>
+ <string name="with_warnings">, met waarschuwingen</string>
+ <string name="with_cancelled">, tot annulatie</string>
<!--Import result toast-->
+ <plurals name="import_keys_added_and_updated_1">
+ <item quantity="one">Sleutel succesvol geïmporteerd</item>
+ <item quantity="other">%1$d sleutels succesvol geïmporteerd</item>
+ </plurals>
+ <plurals name="import_keys_added_and_updated_2">
+ <item quantity="one">en sleutel%2$s geüpdatet.</item>
+ <item quantity="other">en %1$d sleutels%2$s.</item>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="one">Sleutel%2$s succesvol geïmporteerd.</item>
+ <item quantity="other">%1$d sleutels%2$s succesvol geïmporteerd.</item>
+ </plurals>
+ <plurals name="import_keys_updated">
+ <item quantity="one">Sleutel%2$s succesvol geüpdatet.</item>
+ <item quantity="other">%1$d sleutels%2$s succesvol geüpdatet.</item>
+ </plurals>
+ <plurals name="import_keys_with_errors">
+ <item quantity="one">Importeren mislukt voor een sleutel!</item>
+ <item quantity="other">Importeren mislukt voor %d sleutels!</item>
+ </plurals>
+ <plurals name="import_error">
+ <item quantity="one">Importeren mislukt!</item>
+ <item quantity="other">Importeren van %d sleutels mislukt!</item>
+ </plurals>
+ <string name="import_error_nothing">Niets te importeren.</string>
+ <string name="import_error_nothing_cancelled">Importeren geannuleerd.</string>
<!--Delete result toast-->
+ <plurals name="delete_ok_but_fail_1">
+ <item quantity="one">Een sleutel succesvol verwijderd</item>
+ <item quantity="other">%1$d sleutels succesvol verwijderd</item>
+ </plurals>
+ <plurals name="delete_ok_but_fail_2">
+ <item quantity="one">, maar verwijderen van een sleutel%2$s mislukt.</item>
+ <item quantity="other">, maar verwijderen van %1$d sleutels%2$s mislukt.</item>
+ </plurals>
+ <plurals name="delete_ok">
+ <item quantity="one">Sleutel%2$s succesvol verwijderd.</item>
+ <item quantity="other">%1$d sleutels%2$s succesvol verwijderd.</item>
+ </plurals>
+ <plurals name="delete_fail">
+ <item quantity="one">Fout bij verwijderen van een sleutel%2$s.</item>
+ <item quantity="other">Fout bij verwijderen van %1$d sleutels.</item>
+ </plurals>
+ <string name="delete_nothing">Niets te verwijderen.</string>
+ <string name="delete_cancelled">Verwijderen geannuleerd.</string>
<!--Certify result toast-->
+ <plurals name="certify_keys_ok">
+ <item quantity="one">Sleutel%2$s succesvol gecertificeerd.</item>
+ <item quantity="other">%1$d sleutels%2$s succesvol gecertificeerd.</item>
+ </plurals>
+ <plurals name="certify_keys_with_errors">
+ <item quantity="one">Certificatie mislukt!</item>
+ <item quantity="other">Certificatie mislukt voor %d sleutels!</item>
+ </plurals>
+ <plurals name="certify_error">
+ <item quantity="one">Certificatie mislukt!</item>
+ <item quantity="other">Certificatie van %d sleutels mislukt!</item>
+ </plurals>
<!--Intent labels-->
<string name="intent_decrypt_file">Decodeer bestand met OpenKeychain</string>
<string name="intent_import_key">Importeer Sleutel met OpenKeychain</string>
@@ -246,17 +448,29 @@
<string name="api_settings_select_key">Sleutel selecteren</string>
<string name="api_settings_create_key">Maak nieuwe sleutel voor dit account</string>
<string name="api_settings_save">Opslaan</string>
+ <string name="api_settings_save_msg">Account is opgeslaan</string>
<string name="api_settings_cancel">Annuleren</string>
<string name="api_settings_revoke">Toegang herroepen</string>
<string name="api_settings_start">Start applicatie</string>
<string name="api_settings_delete_account">Verwijder account</string>
<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">Accounts (verouderde API)</string>
+ <string name="api_settings_advanced">Geavanceerde informatie</string>
+ <string name="api_settings_allowed_keys">Toegestane sleutels</string>
+ <string name="api_settings_settings">Instellingen</string>
+ <string name="api_settings_key">Accountsleutel:</string>
+ <string name="api_settings_accounts_empty">Geen accounts verbonden aan deze app.</string>
+ <string name="api_create_account_text">Geen sleutel ingesteld voor deze account. Gelieve een van je bestaande sleutels te selecteren, of een nieuwe sleutel aan te maken.\nApps kunnen enkel ontcijferen/ondertekenen met de sleutels die je hier selecteert!</string>
+ <string name="api_update_account_text">De sleutel opgeslaan voor deze account is verwijderd. Gelieve een andere te selecteren!\nApps kunnen enkel ontcijferen/ondertekenen met de sleutels die je hier selecteert!</string>
+ <string name="api_register_text">De weergegeven app will berichten versleutelen/ontcijferen en ze in jouw naam ondertekenen.\nToegang toestaan?\n\nWAARSCHUWING: als je niet weet waarom dit scherm verscheen, sta dan geen toegang toe! Je kan later toegang weghalen via het \'Apps\' scherm.</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>
+ <string name="api_select_pub_keys_missing_text">Geen sleutels gevonden voor deze identiteiten:</string>
+ <string name="api_select_pub_keys_dublicates_text">Meer dan een sleutel bestaat voor deze identiteiten:</string>
<string name="api_select_pub_keys_text">Bekijkt u a.u.b. de ontvangers</string>
+ <string name="api_select_pub_keys_text_no_user_ids">Gelieve de ontvangers te selecteren!</string>
<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>
@@ -266,63 +480,675 @@
<item quantity="one">1 sleutel geselecteerd.</item>
<item quantity="other">%d sleutels geselecteerd.</item>
</plurals>
+ <string name="key_list_empty_text1">Geen sleutels gevonden!</string>
+ <string name="key_list_filter_show_all">Alle sleutels weergeven</string>
+ <string name="key_list_filter_show_certified">Enkel gecertificeerde sleutels weergeven</string>
<!--Key view-->
<string name="key_view_action_edit">Sleutel bewerken</string>
+ <string name="key_view_action_encrypt">Versleutel tekst</string>
+ <string name="key_view_action_encrypt_files">bestanden</string>
<string name="key_view_action_certify">Certifiëer identiteiten</string>
- <string name="key_view_action_share_with">Delen met...</string>
+ <string name="key_view_action_update">Update van sleutelserver</string>
+ <string name="key_view_action_share_with">Delen met…</string>
+ <string name="key_view_action_share_nfc">Delen over NFC</string>
+ <string name="key_view_action_upload">Uploaden naar sleutelserver</string>
<string name="key_view_tab_main">Hoofd Info</string>
<string name="key_view_tab_share">Delen</string>
<string name="key_view_tab_keys">Subsleutels</string>
<string name="key_view_tab_certs">Certificaten</string>
+ <string name="key_view_tab_keybase">Keybase.io</string>
+ <string name="user_id_info_revoked_title">Ingetrokken</string>
+ <string name="user_id_info_revoked_text">Deze identiteit is door de sleuteleigenaar ingetrokken. Ze is niet langer geldig.</string>
+ <string name="user_id_info_certified_title">Gecertificeerd</string>
+ <string name="user_id_info_certified_text">Deze identiteit is door jou gecertificeerd.</string>
+ <string name="user_id_info_uncertified_title">Niet gecertificeerd</string>
+ <string name="user_id_info_uncertified_text">Deze identiteit is nog niet gecertificeerd. Je kan niet zeker zijn dat deze identiteit echt overeenkomt met een bepaald persoon.</string>
+ <string name="user_id_info_invalid_title">Ongeldig</string>
+ <string name="user_id_info_invalid_text">Er is iets mis met deze identiteit!</string>
+ <!--Key trust-->
+ <string name="key_trust_already_verified">Je hebt deze sleutel al gecertificeerd!</string>
+ <string name="key_trust_it_is_yours">Dit is een van jouw sleutels!</string>
+ <string name="key_trust_maybe">Deze sleutel is ingetrokken noch verlopen.\nJe hebt ze niet gecertificeerd, maar je kan kiezen ze te vertrouwen.</string>
+ <string name="key_trust_revoked">Deze sleutel is door de eigenaar ingetrokken. Je zou ze niet moeten vertrouwen.</string>
+ <string name="key_trust_expired">Deze sleutel is verlopen. Je zou ze niet moeten vertrouwen.</string>
+ <string name="key_trust_old_keys">Het kan oké zijn deze sleutel te gebruiken om een oud bericht te ontsleutelen van een moment waarop de sleutel nog geldig was.</string>
+ <string name="key_trust_no_cloud_evidence">Geen bewijs van de cloud voor de betrouwbaarheid van deze sleutel.</string>
+ <string name="key_trust_start_cloud_search">Zoeken starten</string>
+ <string name="key_trust_results_prefix">Keybase.io geeft “bewijzen” die stellen dat de eigenaar van deze sleutel:</string>
+ <!--keybase proof stuff-->
+ <string name="keybase_narrative_twitter">Post op Twitter als</string>
+ <string name="keybase_narrative_github">Bekend is op GitHub als</string>
+ <string name="keybase_narrative_dns">De volgende domeinnamen beheert</string>
+ <string name="keybase_narrative_web_site">Kan posten op de website(s)</string>
+ <string name="keybase_narrative_reddit">Post op Reddit als</string>
+ <string name="keybase_narrative_coinbase">Bekend is op Coinbase als</string>
+ <string name="keybase_narrative_hackernews">Post op Hacker News als</string>
+ <string name="keybase_narrative_unknown">Onbekend bewijstype</string>
+ <string name="keybase_proof_failure">Helaas kan dit bewijs niet geverifieerd worden.</string>
+ <string name="keybase_unknown_proof_failure">Niet-herkend probleem met de bewijschecker</string>
+ <string name="keybase_problem_fetching_evidence">Probleem met bewijs van bewijs</string>
+ <string name="keybase_key_mismatch">Sleutelvingerafdruk komt niet overeen met die in bewijspost</string>
+ <string name="keybase_dns_query_failure">DNS TXT record ophalen mislukt</string>
+ <string name="keybase_no_prover_found">Geen bewijschecker gevonden voor</string>
+ <string name="keybase_message_payload_mismatch">Ontsleuteld bewijs komt niet overeen met verwachte waarde</string>
+ <string name="keybase_message_fetching_data">Bezig met ophalen van bewijs van bewijs</string>
+ <string name="keybase_proof_succeeded">Dit bewijs is geverifieerd!</string>
+ <string name="keybase_a_post">Een post</string>
+ <string name="keybase_fetched_from">opgehaald van</string>
+ <string name="keybase_for_the_domain">voor het domein</string>
+ <string name="keybase_contained_signature">bevat een bericht dat enkel gemaakt kan zijn door de eigenaar van deze sleutel.</string>
+ <string name="keybase_twitter_proof">Een tweet</string>
+ <string name="keybase_dns_proof">Een DNS TXT record</string>
+ <string name="keybase_web_site_proof">Een tekstbestand</string>
+ <string name="keybase_github_proof">Een gist</string>
+ <string name="keybase_reddit_proof">Een JSON-bestand</string>
+ <string name="keybase_reddit_attribution">toegeschreven door Reddit aan</string>
+ <string name="keybase_verify">Verifiëren</string>
<!--Edit key-->
+ <string name="edit_key_action_change_passphrase">Wachtwoord wijzigen</string>
+ <string name="edit_key_action_add_identity">Identiteit toevoegen</string>
+ <string name="edit_key_action_add_subkey">Subsleutel toevoegen</string>
+ <string name="edit_key_edit_user_id_title">Selecteer een actie!</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>Verander naar primaire identiteit</item>
+ <item>Trek identiteit in</item>
+ </string-array>
+ <string-array name="edit_key_edit_user_id_revert_revocation">
+ <item>Intrekking ongedaan maken</item>
+ </string-array>
+ <string name="edit_key_edit_user_id_revoked">Deze identiteit is ingetrokken. Dit kan niet ongedaan gemaakt worden.</string>
+ <string name="edit_key_edit_subkey_title">Selecteer een actie!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Vervaldatum veranderen</item>
+ <item>Subsleutel intrekken</item>
+ <item>Subsleutel strippen</item>
+ </string-array>
+ <string name="edit_key_new_subkey">nieuwe subsleutel</string>
+ <string name="edit_key_select_flag">Gelieve minstens een vlag te selecteren!</string>
+ <string name="edit_key_error_add_identity">Voeg minstens een identiteit toe!</string>
+ <string name="edit_key_error_add_subkey">Voeg minstens een subsleutel toe!</string>
<!--Create key-->
+ <string name="create_key_upload">Upload sleutel naar sleutelserver</string>
+ <string name="create_key_empty">Dit veld moet ingevuld worden</string>
+ <string name="create_key_passphrases_not_equal">Wachtwoorden komen niet overeen</string>
+ <string name="create_key_final_text">Je hebt volgende identiteit ingevoerd:</string>
+ <string name="create_key_final_robot_text">Een sleutel aanmaken kan even duren, maak intussen een tasje thee klaar…</string>
+ <string name="create_key_rsa">(3 subsleutels, RSA, 4096 bit)</string>
+ <string name="create_key_custom">(aangepaste sleutelconfiguratie)</string>
+ <string name="create_key_text">Voer je volledige naam en e-mailadres in, en kies een wachtwoord.</string>
+ <string name="create_key_hint_full_name">Volledige naam, bv. Max Mustermann</string>
+ <string name="create_key_edit">Sleutelconfiguratie wijzigen</string>
<!--View key-->
+ <string name="view_key_revoked">Ingetrokken: sleutel mag niet meer gebruikt worden!</string>
+ <string name="view_key_expired">Verlopen: het contact moet de geldigheid van de sleutels verlengen!</string>
+ <string name="view_key_expired_secret">Verlopen: je kan de geldigheid van de sleutels verlengen door ze te bewerken!</string>
+ <string name="view_key_my_key">Mijn sleutel</string>
+ <string name="view_key_verified">Geverifieerde sleutels</string>
+ <string name="view_key_unverified">Niet geverifieerd: scan QR-code om de sleutel te verifiëren!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Sleutels</string>
+ <string name="nav_encrypt_decrypt">Versleutelen/Ontsleutelen</string>
+ <string name="nav_apps">Apps</string>
<string name="drawer_open">Open navigatiemenu</string>
<string name="drawer_close">Sluit navigatiemenu</string>
<string name="my_keys">Mijn Sleutels</string>
<!--hints-->
+ <string name="encrypt_content_edit_text_hint">Type tekst</string>
<!--certs-->
<string name="cert_default">standaard</string>
<string name="cert_none">geen</string>
<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>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <string name="msg_internal_error">Interne fout!</string>
+ <string name="msg_cancelled">Bewerking geannuleerd.</string>
<!--Import Public log entries-->
+ <string name="msg_ip_apply_batch">Bezig met toepassen van invoeg-batchbewerking.</string>
+ <string name="msg_ip_bad_type_secret">Geprobeerd een geheime sleutel als publieke sleutel te importeren. Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_ip_delete_old_fail">Geen oude sleutel verwijderd (een nieuwe aan het aanmaken?)</string>
+ <string name="msg_ip_delete_old_ok">Oude sleutel van database verwijderd</string>
+ <string name="msg_ip_encode_fail">Bewerking mislukt door coderingsfout</string>
+ <string name="msg_ip_error_io_exc">Bewerking mislukt door i/o-fout</string>
+ <string name="msg_ip_error_op_exc">Bewerking mislukt door databasefout</string>
+ <string name="msg_ip_error_remote_ex">Bewerking mislukt door interne fout</string>
+ <string name="msg_ip">Bezig met importeren van publieke sleutelbos %s</string>
+ <string name="msg_ip_insert_keyring">Bezig met coderen van sleutelbosgegevens</string>
+ <string name="msg_ip_insert_keys">Bezig met analyseren van sleutels</string>
+ <string name="msg_ip_prepare">Bezig met voorbereiden van databasebewerkingen</string>
+ <string name="msg_ip_master">Bezig met verwerken van hoofdsleutel %s</string>
+ <string name="msg_ip_master_expired">Sleutelbos is verlopen op %s</string>
+ <string name="msg_ip_master_expires">Sleutelbos verloopt op %s</string>
+ <string name="msg_ip_master_flags_unspecified">Hoofdvlaggen: niet gespecificeerd (alle worden verondersteld)</string>
+ <string name="msg_ip_master_flags_cesa">Hoofdvlaggen: certificeren, versleutelen, ondertekenen, authenticeren</string>
+ <string name="msg_ip_master_flags_cesx">Hoofdvlaggen: certificeren, versleutelen, ondertekenen</string>
+ <string name="msg_ip_master_flags_cexa">Hoofdvlaggen: certificeren, versleutelen, authenticeren</string>
+ <string name="msg_ip_master_flags_cexx">Hoofdvlaggen: certificeren, versleutelen</string>
+ <string name="msg_ip_master_flags_cxsa">Hoofdvlaggen: certificeren, versleutelen, authenticeren</string>
+ <string name="msg_ip_master_flags_cxsx">Hoofdvlaggen: certificeren, ondertekenen</string>
+ <string name="msg_ip_master_flags_cxxa">Hoofdvlaggen: certificeren, authenticeren</string>
+ <string name="msg_ip_master_flags_cxxx">Hoofdvlaggen: certificeren</string>
+ <string name="msg_ip_master_flags_xesa">Hoofdvlaggen: versleutelen, ondertekenen, authenticeren</string>
+ <string name="msg_ip_master_flags_xesx">Hoofdvlaggen: versleutelen, ondertekenen</string>
+ <string name="msg_ip_master_flags_xexa">Hoofdvlaggen: versleutelen, authenticeren</string>
+ <string name="msg_ip_master_flags_xexx">Hoofdvlaggen: versleutelen</string>
+ <string name="msg_ip_master_flags_xxsa">Hoofdvlaggen: ondertekenen, authenticeren</string>
+ <string name="msg_ip_master_flags_xxsx">Hoofdvlaggen: ondertekenen</string>
+ <string name="msg_ip_master_flags_xxxa">Hoofdvlaggen: authenticeren</string>
+ <string name="msg_ip_master_flags_xxxx">Hoofdvlaggen: geen</string>
+ <string name="msg_ip_merge_public">Bezig met samenvoegen van geïmporteerde gegevens in bestaande publieke sleutelbos</string>
+ <string name="msg_ip_merge_secret">Bezig met samenvoegen van geïmporteerde gegevens in bestaande publieke sleutelbos</string>
+ <string name="msg_ip_subkey">Bezig met verwerken van subsleutel %s</string>
+ <string name="msg_ip_subkey_expired">Subsleutel is vervallen op %s</string>
+ <string name="msg_ip_subkey_expires">Subsleutel vervalt op %s</string>
+ <string name="msg_ip_subkey_flags_unspecified">Subsleutelvlaggen: niet gespecificeerd (alle worden verondersteld)</string>
+ <string name="msg_ip_subkey_flags_cesa">Subsleutelvlaggen: certificeren, versleutelen, ondertekenen, authenticeren</string>
+ <string name="msg_ip_subkey_flags_cesx">Subsleutelvlaggen: certificeren, versleutelen, ondertekenen</string>
+ <string name="msg_ip_subkey_flags_cexa">Subsleutelvlaggen: certificeren, versleutelen, authenticeren</string>
+ <string name="msg_ip_subkey_flags_cexx">Subsleutelvlaggen: certificeren, versleutelen</string>
+ <string name="msg_ip_subkey_flags_cxsa">Subsleutelvlaggen: certificeren, ondertekenen, authenticeren</string>
+ <string name="msg_ip_subkey_flags_cxsx">Subsleutelvlaggen: certificeren, ondertekenen</string>
+ <string name="msg_ip_subkey_flags_cxxa">Subsleutelvlaggen: certificeren, authenticeren</string>
+ <string name="msg_ip_subkey_flags_cxxx">Subsleutelvlaggen: certificeren</string>
+ <string name="msg_ip_subkey_flags_xesa">Subsleutelvlaggen: versleutelen, ondertekenen, authenticeren</string>
+ <string name="msg_ip_subkey_flags_xesx">Subsleutelvlaggen: versleutelen, ondertekenen</string>
+ <string name="msg_ip_subkey_flags_xexa">Subsleutelvlaggen: versleutelen, authenticeren</string>
+ <string name="msg_ip_subkey_flags_xexx">Subsleutelvlaggen: versleutelen</string>
+ <string name="msg_ip_subkey_flags_xxsa">Subsleutelvlaggen: ondertekenen, authenticeren</string>
+ <string name="msg_ip_subkey_flags_xxsx">Subsleutelvlaggen: ondertekenen</string>
+ <string name="msg_ip_subkey_flags_xxxa">Subsleutelvlaggen: authenticeren</string>
+ <string name="msg_ip_subkey_flags_xxxx">Subsleutelvlaggen: geen</string>
+ <string name="msg_ip_success">Publieke sleutelbos succesvol geïmporteerd</string>
+ <string name="msg_ip_success_identical">Sleutelbos bevat geen nieuwe gegevens, niets te doen</string>
+ <string name="msg_ip_reinsert_secret">Bezig met opnieuw invoegen van geheime sleutel</string>
+ <string name="msg_ip_uid_cert_bad">Slecht certificaat tegengekomen!</string>
+ <string name="msg_ip_uid_cert_error">Fout bij verwerken van certificaat!</string>
+ <string name="msg_ip_uid_cert_nonrevoke">Er is al een niet-intrekbaar certificaat, dit certificaat wordt overgeslaan.</string>
+ <string name="msg_ip_uid_cert_old">Dit certificaat is ouder dan het vorige en wordt overgeslaan.</string>
+ <string name="msg_ip_uid_cert_new">Dit certificaat is recenter en vervangt het vorige.</string>
+ <string name="msg_ip_uid_cert_good">Goed certificaat door %1$s gevonden</string>
+ <string name="msg_ip_uid_cert_good_revoke">Goede intrekking van certificaat door %1$s gevonden</string>
+ <plurals name="msg_ip_uid_certs_unknown">
+ <item quantity="one">Een certificaat uitgegeven door een onbekende publieke sleutel wordt genegeerd</item>
+ <item quantity="other">%s certificaten uitgegeven door onbekende publieke sleutels worden genegeerd</item>
+ </plurals>
+ <string name="msg_ip_uid_classifying_zero">Bezig met classificeren van gebruikers-ID\'s (geen vertrouwde sleutels beschikbaar)</string>
+ <plurals name="msg_ip_uid_classifying">
+ <item quantity="one">Bezig met classificeren van gebruikers-ID\'s (een vertrouwde sleutel wordt gebruikt)</item>
+ <item quantity="other">Bezig met classificeren van gebruikers-ID\'s (%s vertrouwde sleutels worden gebruikt)</item>
+ </plurals>
+ <string name="msg_ip_uid_reorder">Bezig met opnieuw ordenen van gebruikers-ID\'s</string>
+ <string name="msg_ip_uid_processing">Bezig met verwerken van gebruikers-ID %s</string>
+ <string name="msg_ip_uid_revoked">Gebruikers-ID is ingetrokken</string>
+ <string name="msg_ip_uat_processing_image">Bezig met verwerken van gebruikersattribuut van type afbeelding</string>
+ <string name="msg_ip_uat_processing_unknown">Bezig met verwerken van gebruikersattribuut van onbekend type</string>
+ <string name="msg_ip_uat_cert_bad">Slecht certificaat tegengekomen!</string>
+ <string name="msg_ip_uat_cert_error">Fout bij verwerken van certificaat!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Er is al een niet-intrekbaar certificaat, dit certificaat wordt overgeslaan.</string>
+ <string name="msg_ip_uat_cert_old">Dit certificaat is ouder dan het vorige en wordt overgeslaan.</string>
+ <string name="msg_ip_uat_cert_new">Dit certificaat is recenter en vervangt het vorige.</string>
+ <string name="msg_ip_uat_cert_good">Goed certificaat door %1$s gevonden</string>
+ <string name="msg_ip_uat_cert_good_revoke">Goede intrekking van certificaat door %1$s gevonden</string>
+ <plurals name="msg_ip_uat_certs_unknown">
+ <item quantity="one">Een certificaat uitgegeven door een onbekende publieke sleutel wordt genegeerd</item>
+ <item quantity="other">%s certificaten uitgegeven door onbekende publieke sleutels worden genegeerd</item>
+ </plurals>
+ <string name="msg_ip_uat_classifying">Bezig met classificeren van gebruikersattributen</string>
+ <string name="msg_ip_uat_revoked">Gebruikersattribuut is ingetrokken</string>
+ <string name="msg_is_bad_type_public">Geprobeerd een geheime sleutelbos als publieke sleutelbos te importeren. Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_is_bad_type_uncanon">Geprobeerd een sleutelbos zonder standaardisatie te importeren. Dit is een bug, gelieve een verslag in te dienen!</string>
<!--Import Secret log entries-->
+ <string name="msg_is">Bezig met importeren van geheime sleutel %s</string>
+ <string name="msg_is_db_exception">Databasefout!</string>
+ <string name="msg_is_importing_subkeys">Bezig met verwerken van geheime subsleutels</string>
+ <string name="msg_is_error_io_exc">Fout bij coderen van sleutelbos</string>
+ <string name="msg_is_merge_public">Bezig met samenvoegen van geïmporteerde gegevens in bestaande publieke sleutelbos</string>
+ <string name="msg_is_merge_secret">Bezig met samenvoegen van geïmporteerde gegevens in bestaande publieke sleutelbos</string>
+ <string name="msg_is_merge_special">Bezig met samenvoegen van gegevens van self-certificaten uit publieke sleutelbos</string>
+ <string name="msg_is_pubring_generate">Bezig met aanmaken van publieke sleutelbos uit geheime sleutelbos</string>
+ <string name="msg_is_subkey_nonexistent">Subsleutel %s niet beschikbaar in geheime sleutel</string>
+ <string name="msg_is_subkey_ok">Geheime subsleutel %s gemarkeerd als beschikbaar</string>
+ <string name="msg_is_subkey_empty">Geheime subsleutel %s gemarkeerd als beschikbaar, met leeg wachtwoord</string>
+ <string name="msg_is_subkey_pin">Geheime subsleutel %s gemarkeerd als beschikbaar, met PIN</string>
+ <string name="msg_is_subkey_stripped">Geheime subsleutel %s gemarkeerd als gestript</string>
+ <string name="msg_is_subkey_divert">Geheime subsleutel %s gemarkeerd als \'doorschakelen naar smartcard/NFC\'</string>
+ <string name="msg_is_success_identical">Sleutelbos bevat geen nieuwe gegevens, niets te doen</string>
+ <string name="msg_is_success">Geheime sleutelbos succesvol geïmporteerd</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_public">Bezig met standaardiseren van publieke sleutelbos %s</string>
+ <string name="msg_kc_secret">Bezig met standaardiseren van geheime sleutelbos %s</string>
+ <string name="msg_kc_error_v3">Dit is een OpenPGP versie 3 sleutel, deze is verouderd en wordt niet meer ondersteund!</string>
+ <string name="msg_kc_error_no_uid">Sleutelbos bevat geen geldige gebruikers-ID\'s!</string>
+ <string name="msg_kc_error_master_algo">De hoofdsleutel gebruikt een onbekend (%s) algoritme!</string>
+ <string name="msg_kc_error_dup_key">Subsleutel %s komt tweemaal voor in sleutelbos. Sleutelbos is misvormd en wordt niet geïmporteerd!</string>
+ <string name="msg_kc_master">Bezig met verwerken van hoofdsleutel</string>
+ <string name="msg_kc_master_bad_type">Bezig met verwijderen van hoofdsleutelcertificaat van onbekend type (%s)</string>
+ <string name="msg_kc_master_bad_local">Bezig met verwijderen van hoofdsleutelcertificaat met vlag \'lokaal\'</string>
+ <string name="msg_kc_master_bad_err">Bezig met verwijderen van slecht hoofdsleutelcertificaat</string>
+ <string name="msg_kc_master_bad_time">Bezig met verwijderen van sleutelbosintrekkingscertificaat met toekomstige tijdstempel</string>
+ <string name="msg_kc_master_bad_type_uid">Bezig met verwijderen van gebruikers-ID-certificaat in slechte positie</string>
+ <string name="msg_kc_master_bad">Bezig met verwijderen van slecht hoofdsleutelcertificaat</string>
+ <string name="msg_kc_master_local">Bezig met verwijderen van hoofdsleutelcertificaat met vlag \'lokaal\'</string>
+ <string name="msg_kc_revoke_dup">Bezig met verwijderen van overbodig sleutelbosintrekkingscertificaat</string>
+ <string name="msg_kc_notation_dup">Bezig met verwijderen van overbodig notatiecertificaat</string>
+ <string name="msg_kc_notation_empty">Bezig met verwijderen van leeg notatiecertificaat</string>
+ <string name="msg_kc_sub">Bezig met verwerken van subsleutel %s</string>
+ <string name="msg_kc_sub_bad">Bezig met verwijderen van ongeldig subsleutelbindend certificaat</string>
+ <string name="msg_kc_sub_bad_err">Bezig met verwijderen van slecht subsleutelbindend certificaat</string>
+ <string name="msg_kc_sub_bad_local">Bezig met verwijderen van subsleutelbindend certificaat met vlag \'lokaal\'</string>
+ <string name="msg_kc_sub_bad_keyid">Subsleutelbindende uitgevers-ID komt niet overeen</string>
+ <string name="msg_kc_sub_bad_time">Bezig met verwijderen van subsleutelbindend certificaat met toekomstige tijdstempel</string>
+ <string name="msg_kc_sub_bad_type">Onbekend subsleutelcertificaattype: %s</string>
+ <string name="msg_kc_sub_dup">Bezig met verwijderen van overbodig subsleutelbindend certificaat</string>
+ <string name="msg_kc_sub_primary_bad">Bezig met verwijderen van subsleutelbindend certificaat wegens ongeldig primair bindend certificaat</string>
+ <string name="msg_kc_sub_primary_bad_err">Bezig met verwijderen van subsleutelbindend certificaat wegens slecht primair bindend certificaat</string>
+ <string name="msg_kc_sub_primary_none">Bezig met verwijderen van subsleutelbindend certificaat wegens ontbrekend primair bindend certificaat</string>
+ <string name="msg_kc_sub_no_cert">Geen geldig certificaat gevonden voor %s, wordt verwijderd van sleutelbos</string>
+ <string name="msg_kc_sub_revoke_bad_err">Bezig met verwijderen van slecht subsleutelintrekkingscertificaat</string>
+ <string name="msg_kc_sub_revoke_bad">Bezig met verwijderen van slecht subsleutelintrekkingscertificaat</string>
+ <string name="msg_kc_sub_revoke_dup">Bezig met verwijderen van overbodig subsleutelintrekkingscertificaat</string>
+ <string name="msg_kc_sub_unknown_algo">Subsleutel gebruikt een onbekend algoritme en wordt niet geïmporteerd…</string>
+ <string name="msg_kc_sub_algo_bad_encrpyt">Subsleutel heeft versleuteling-gebruiksvlag, maar algoritme is niet geschikt voor versleuteling.</string>
+ <string name="msg_kc_sub_algo_bad_sign">Subsleutel heeft ondertekenen-gebruiksvlag, maar algoritme is niet geschikt voor ondertekenen.</string>
+ <string name="msg_kc_success">Standaardisatie van sleutelbos geslaagd, geen wijzigingen</string>
+ <plurals name="msg_kc_success_bad">
+ <item quantity="one">Standaardisatie van sleutelbos geslaagd, een foutief certificaat verwijderd</item>
+ <item quantity="other">Standaardisatie van sleutelbos geslaagd, %d foutieve certificaten verwijderd</item>
+ </plurals>
+ <string name="msg_kc_success_bad_and_red">Standaardisatie van sleutelbos geslaagd, %1$s foutieve en %2$s overbodige certificaten verwijderd</string>
+ <plurals name="msg_kc_success_redundant">
+ <item quantity="one">Standaardisatie van sleutelbos geslaagd, een overbodig certificaat verwijderd</item>
+ <item quantity="other">Standaardisatie van sleutelbos geslaagd, %d overbodige certificaten verwijderd</item>
+ </plurals>
+ <string name="msg_kc_uid_bad_err">Bezig met verwijderen van slecht self-certificaat voor gebruikers-ID \'%s\'</string>
+ <string name="msg_kc_uid_bad_local">Bezig met verwijderen van gebruikers-ID-certificaat met vlag \'lokaal\'</string>
+ <string name="msg_kc_uid_bad_time">Bezig met verwijderen van gebruikers-ID-certificaat met toekomstige tijdstempel</string>
+ <string name="msg_kc_uid_bad_type">Bezig met verwijderen van gebruikers-ID-certificaat van onbekend type (%s)</string>
+ <string name="msg_kc_uid_bad">Bezig met verwijderen van slecht self-certificaat voor gebruikers-ID \'%s\'</string>
+ <string name="msg_kc_uid_cert_dup">Bezig met verwijderen van verlopen self-certificaat voor gebruikers-ID \'%s\'</string>
+ <string name="msg_kc_uid_foreign">Bezig met verwijderen van vreemd gebruikers-ID-certificaat door \'%s\'</string>
+ <string name="msg_kc_uid_revoke_dup">Bezig met verwijderen van overbodig intrekkingscertificaat voor gebruikers-ID \'%s\'</string>
+ <string name="msg_kc_uid_revoke_old">Bezig met verwijderen van verlopen intrekkingscertificaat voor gebruikers-ID \'%s\'</string>
+ <string name="msg_kc_uid_no_cert">Geen geldig self-certificaat gevonden voor gebruikers-ID \'%s\', wordt verwijderd van sleutelbos</string>
+ <string name="msg_kc_uid_remove">Bezig met verwijderen van ongeldige gebruikers-ID \'%s\'</string>
+ <string name="msg_kc_uid_dup">Bezig met verwijderen van dubbele gebruikers-ID \'%s\'. De sleutelbos bevat er twee. Dit kan resulteren in ontbrekende certificaten!</string>
+ <string name="msg_kc_uid_warn_encoding">Gebruikers-ID verifieert niet als UTF-8!</string>
+ <string name="msg_kc_uat_jpeg">Bezig met verwerken van gebruikersattribuut van type JPEG</string>
+ <string name="msg_kc_uat_unknown">Bezig met verwerken van gebruikersattribuut van onbekend type</string>
+ <string name="msg_kc_uat_bad_err">Bezig met verwijderen van slecht self-certificaat voor gebruikersattribuut</string>
+ <string name="msg_kc_uat_bad_local">Bezig met verwijderen van gebruikersattribuut-certificaat met vlag \'lokaal\'</string>
+ <string name="msg_kc_uat_bad_time">Bezig met verwijderen van gebruikersattribuut-certificaat met toekomstige tijdstempel</string>
+ <string name="msg_kc_uat_bad_type">Bezig met verwijderen van gebruikersattribuut-certificaat van onbekend type (%s)</string>
+ <string name="msg_kc_uat_bad">Bezig met verwijderen van slecht self-certificaat voor gebruikersattribuut</string>
+ <string name="msg_kc_uat_cert_dup">Bezig met verwijderen van verlopen self-certificaat voor gebruikersattribuut</string>
+ <string name="msg_kc_uat_dup">Bezig met verwijderen van dubbel gebruikersattribuut. De sleutelbos bevat er twee. Dit kan resulteren in ontbrekende certificaten!</string>
+ <string name="msg_kc_uat_foreign">Bezig met verwijderen van vreemd gebruikersattribuut-certificaat door</string>
+ <string name="msg_kc_uat_revoke_dup">Bezig met verwijderen van overbodig intrekkingscertificaat voor gebruikersattribuut</string>
+ <string name="msg_kc_uat_revoke_old">Bezig met verwijderen van verlopen intrekkingscertificaat voor gebruikersattribuut</string>
+ <string name="msg_kc_uat_no_cert">Geen geldig self-certificaat gevonden voor gebruikersattribuut, wordt verwijderd van sleutelbos</string>
+ <string name="msg_kc_uat_remove">Bezig met verwijderen van ongeldig gebruikersattribuut</string>
+ <string name="msg_kc_uat_warn_encoding">Gebruikers-ID verifieert niet als UTF-8!</string>
<!--Keyring merging log entries-->
+ <string name="msg_mg_error_secret_dummy">Nieuwe publieke subsleutel gevonden, maar geheime subsleutel dummy-generatie wordt niet ondersteund!</string>
+ <string name="msg_mg_error_heterogeneous">Geprobeerd om sleutelbossen met verschillende vingerafdrukken samen te voegen!</string>
+ <string name="msg_mg_error_encode">Fatale fout bij coderen van ondertekening!</string>
+ <string name="msg_mg_public">Bezig met samenvoegen in publieke sleutelbos %s</string>
+ <string name="msg_mg_secret">Bezig met samenvoegen in geheime sleutelbos %s</string>
+ <string name="msg_mg_new_subkey">Bezig met toevoegen van nieuwe subsleutel %s</string>
+ <string name="msg_mg_found_new">%s nieuwe certificaten in sleutelbos gevonden</string>
+ <string name="msg_mg_unchanged">Niets om samen te voegen</string>
<!--createSecretKeyRing-->
+ <string name="msg_cr">Bezig met aanmaken van nieuwe hoofdsleutel</string>
+ <string name="msg_cr_error_no_master">Geen hoofdsleutel-opties opgegeven!</string>
+ <string name="msg_cr_error_no_user_id">Sleutelbossen moeten met minstens een gebruikers-ID aangemaakt worden!</string>
+ <string name="msg_cr_error_no_certify">Hoofdsleutel moet certificeer-vlag hebben!</string>
+ <string name="msg_cr_error_null_expiry">Verloopdatum kan niet hetzelfde als voordien zijn bij aanmaken van een sleutel. Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_cr_error_keysize_512">Sleutelgrootte moet groter dan of gelijk zijn aan 512!</string>
+ <string name="msg_cr_error_no_curve">Geen sleutelgrootte opgegeven! Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_cr_error_no_keysize">Geen elliptische curve opgegeven! Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_cr_error_internal_pgp">Interne OpenPGP-fout!</string>
+ <string name="msg_cr_error_unknown_algo">Onbekend algoritme geselecteerd! Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_cr_error_flags_dsa">Slechte sleutelvlaggen geselecteerd, DSA kan niet gebruikt worden voor versleuteling!</string>
+ <string name="msg_cr_error_flags_elgamal">Slechte sleutelvlaggen geselecteerd, ElGamal kan niet gebruikt worden voor versleuteling!</string>
+ <string name="msg_cr_error_flags_ecdsa">Slechte sleutelvlaggen geselecteerd, ECDSA kan niet gebruikt worden voor versleuteling!</string>
+ <string name="msg_cr_error_flags_ecdh">Slechte sleutelvlaggen geselecteerd, ECDH kan niet gebruikt worden voor versleuteling!</string>
<!--modifySecretKeyRing-->
+ <string name="msg_mr">Bezig met wijzigen van sleutelbos %s</string>
+ <string name="msg_mf_error_divert_serial">Het serienummer van een doorschakelen-naar-kaart sleutel moet 16 bytes zijn! Dit is een programmeerfout, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_error_encode">Codeeruitzondering!</string>
+ <string name="msg_mf_error_fingerprint">Eigenlijke vingerafdruk van sleutel komt niet overeen met verwachte vingerafdruk!</string>
+ <string name="msg_mf_error_keyid">Geen sleutel-ID. Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_error_integrity">Interne fout, integriteitscheck mislukt!</string>
+ <string name="msg_mf_error_master_none">Geen hoofdcertificaat gevonden om mee te werken! (Allemaal ingetrokken?)</string>
+ <string name="msg_mf_error_noexist_primary">Slechte primaire gebruikers-ID opgegeven!</string>
+ <string name="msg_mf_error_noexist_revoke">Slechte gebruikers-ID voor intrekking opgegeven!</string>
+ <string name="msg_mf_error_restricted">Geprobeerd een beperkte bewerking uit te voeren zonder wachtwoord! Dit is een programmeerfout, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_error_revoked_primary">Ingetrokken gebruikers-ID\'s kunnen niet primair zijn!</string>
+ <string name="msg_mf_error_null_expiry">Verloopdatum kan niet hetzelfde als voordien zijn bij aanmaken van een subsleutel. Dit is een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_error_passphrase_master">Fatale fout bij ontcijferen van hoofdsleutel. Dit is waarschijnlijk een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_mf_error_pgp">Interne OpenPGP-fout!</string>
+ <string name="msg_mf_error_sig">Ondertekeningsuitzondering!</string>
+ <string name="msg_mf_master">Bezig met wijzigen van hoofdcertificaten</string>
+ <string name="msg_mf_notation_empty">Bezig met toevoegen van leeg notatiepakket</string>
+ <string name="msg_mf_notation_pin">Bezig met toevoegen van PIN-notatiepakket</string>
+ <string name="msg_mf_passphrase">Bezig met wijzigen van wachtwoord voor sleutelbos</string>
+ <string name="msg_mf_passphrase_key">Bezig met opnieuw versleutelen van subsleutel %s met nieuw wachtwoord</string>
+ <string name="msg_mf_passphrase_empty_retry">Instellen van nieuw wachtwoord mislukt, opnieuw proberen met leeg oud wachtwoord</string>
+ <string name="msg_mf_passphrase_fail">Wachtwoord voor subsleutel kon niet gewijzigd worden! (Heeft het een ander wachtwoord dan de andere sleutels?)</string>
+ <string name="msg_mf_primary_replace_old">Bezig met vervangen van certificaat van vorige primaire gebruikers-ID</string>
+ <string name="msg_mf_primary_new">Bezig met aanmaken van nieuw certificaat voor nieuwe primaire gebruikers-ID</string>
+ <string name="msg_mf_subkey_change">Bezig met wijzigen van subsleutel %s</string>
+ <string name="msg_mf_error_subkey_missing">Geprobeerd om bewerking uit te voeren op ontbrekende subsleutel %s!</string>
+ <string name="msg_mf_subkey_new">Bezig met toevoegen van nieuwe subsleutel of type %s</string>
+ <string name="msg_mf_subkey_new_id">Nieuwe subsleutel-ID: %s</string>
+ <string name="msg_mf_error_past_expiry">Verloopdatum kan niet in het verleden zijn!</string>
+ <string name="msg_mf_subkey_revoke">Bezig met intrekken van subsleutel %s</string>
+ <string name="msg_mf_subkey_strip">Bezig met strippen van subsleutel %s</string>
+ <string name="msg_mf_success">Sleutelbos succesvol gewijzigd</string>
+ <string name="msg_mf_uid_add">Bezig met toevoegen van gebruikers-ID %s</string>
+ <string name="msg_mf_uid_primary">Bezig met wijzigen van primaire gebruikers-ID naar %s</string>
+ <string name="msg_mf_uid_revoke">Bezig met intrekken van gebruikers-ID %s</string>
+ <string name="msg_mf_uid_error_empty">Gebruikers-ID kan niet leeg zijn!</string>
+ <string name="msg_mf_uat_error_empty">Gebruikersattribuut kan niet leeg zijn!</string>
+ <string name="msg_mf_uat_add_image">Bezig met toevoegen van gebruikersattribuut van type afbeelding</string>
+ <string name="msg_mf_uat_add_unknown">Bezig met toevoegen van gebruikersattribuut van onbekend type</string>
+ <string name="msg_mf_unlock_error">Fout bij ontgrendelen van sleutelbos!</string>
+ <string name="msg_mf_unlock">Bezig met ontgrendelen van sleutelbos</string>
<!--Consolidate-->
+ <string name="msg_con">Bezig met consolideren van database</string>
+ <string name="msg_con_error_bad_state">Consolidatie gestart terwijl er geen database was gecached! Dit is waarschijnlijk een bug, gelieve een verslag in te dienen!</string>
+ <string name="msg_con_error_concurrent">Consolidatie afgebroken, loopt al op een andere draad!</string>
+ <string name="msg_con_save_secret">Bezig met opslaan van geheime sleutelbossen</string>
+ <string name="msg_con_save_public">Bezig met opslaan van publieke sleutelbossen</string>
+ <string name="msg_con_db_clear">Bezig met wissen van database</string>
+ <string name="msg_con_success">Database succesvol geconsolideerd</string>
+ <string name="msg_con_critical_in">Begin van kritieke fase</string>
+ <string name="msg_con_critical_out">Einde van kritieke fase</string>
+ <string name="msg_con_delete_public">Bezig met verwijderen van cachebestand van publieke sleutelbos</string>
+ <string name="msg_con_delete_secret">Bezig met verwijderen van cachebestand van geheime sleutelbos</string>
+ <string name="msg_con_error_db">Fout bij openen van database!</string>
+ <string name="msg_con_error_io_public">I/O-fout bij schrijven van publieke sleutels naar cache!</string>
+ <string name="msg_con_error_io_secret">I/O-fout bij schrijven van geheime sleutels naar cache!</string>
+ <string name="msg_con_error_public">Fout bij opnieuw importeren van publieke sleutels!</string>
+ <string name="msg_con_error_secret">Fout bij opnieuw importeren van geheime sleutels!</string>
+ <string name="msg_con_recover">Bezig met hervatten van consolidatieproces</string>
+ <string name="msg_con_recursive">Recursief samenvoegen wordt overgeslaan</string>
+ <string name="msg_con_recover_unknown">Bezig met hervatten van consolidatieproces uit onbekende staat</string>
+ <plurals name="msg_con_reimport_public">
+ <item quantity="one">Bezig met opnieuw importeren van een publieke sleutel</item>
+ <item quantity="other">Bezig met opnieuw importeren van %d publieke sleutels</item>
+ </plurals>
+ <string name="msg_con_reimport_public_skip">Geen publieke sleutels om opnieuw te importeren, bewerking wordt overgeslaan…</string>
+ <plurals name="msg_con_reimport_secret">
+ <item quantity="one">Bezig met opnieuw importeren van een geheime sleutel</item>
+ <item quantity="other">Bezig met opnieuw importeren van %d geheime sleutels</item>
+ </plurals>
+ <string name="msg_con_reimport_secret_skip">Geen geheime sleutel om opnieuw te importeren, bewerking wordt overgeslaan…</string>
+ <string name="msg_con_warn_delete_public">Uitzondering bij verwijderen van publiek cachebestand</string>
+ <string name="msg_con_warn_delete_secret">Uitzondering bij verwijderen van geheim cachebestand</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">Bezig met uitvoeren van sleutelbewerking</string>
+ <string name="msg_ed_caching_new">Bezig met cachen van nieuw wachtwoord</string>
+ <string name="msg_ed_error_no_parcel">SaveKeyringParcel ontbreekt! (dit is een bug, gelieve een verslag in te dienen)</string>
+ <string name="msg_ed_error_key_not_found">Sleutel niet gevonden!</string>
+ <string name="msg_ed_fetching">Bezig met ophalen van de te wijzigen sleutel (%s)</string>
+ <string name="msg_ed_success">Sleutelbewerking geslaagd</string>
+ <!--Promote key-->
+ <string name="msg_pr">Bezig met promoveren van publieke sleutel naar geheime sleutel</string>
+ <string name="msg_pr_error_already_secret">Sleutel is al een geheime sleutel!</string>
+ <string name="msg_pr_error_key_not_found">Sleutel niet gevonden!</string>
+ <string name="msg_pr_fetching">Bezig met ophalen van de te wijzigen sleutel (%s)</string>
+ <string name="msg_pr_success">Sleutel succesvol gepromoveerd!</string>
<!--Other messages used in OperationLogs-->
+ <string name="msg_ek_error_divert">Bewerken van NFC-sleutels wordt (nog) niet ondersteund!</string>
+ <string name="msg_ek_error_dummy">Kan sleutelbos niet bewerken met gestripte hoofdsleutel!</string>
+ <string name="msg_ek_error_not_found">Sleutel niet gevonden!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_askip_no_key">Gegevens niet versleuteld met bekende sleutel, bewerking wordt overgeslaan…</string>
+ <string name="msg_dc_askip_not_allowed">Gegevens niet versleuteld met toegestane sleutel, bewerking wordt overgeslaan…</string>
+ <string name="msg_dc_asym">Blok van asymmetrisch versleutelde gegevens gevonden voor sleutel %s</string>
+ <string name="msg_dc_charset">Karakterset-header gevonder: \'%s\'</string>
+ <string name="msg_dc_clear_data">Bezig met verwerken van letterlijke gegevens</string>
+ <string name="msg_dc_clear_decompress">Bezig met uitpakken van gecomprimeerde gegevens</string>
+ <string name="msg_dc_clear_meta_file">Bestandsnaam: %s</string>
+ <string name="msg_dc_clear_meta_mime">MIME-type: %s</string>
+ <string name="msg_dc_clear_meta_size">Bestandsgrootte: %s</string>
+ <string name="msg_dc_clear_meta_size_unknown">Bestandsgrootte onbekend</string>
+ <string name="msg_dc_clear_meta_time">Wijzigingstijd: %s</string>
+ <string name="msg_dc_clear_signature_bad">Ondertekeningscontrole NIET OKÉ!</string>
+ <string name="msg_dc_clear_signature_check">Bezig met verifiëren van ondertekeningsgegevens</string>
+ <string name="msg_dc_clear_signature_ok">Ondertekeningscontrole OKÉ</string>
+ <string name="msg_dc_clear_signature">Bezig met opslaan van ondertekeningsgegevens voor later</string>
+ <string name="msg_dc_clear">Bezig met verwerken van platte tekst-gegevens</string>
+ <string name="msg_dc_error_bad_passphrase">Fout bij ontcijferen van sleutel, slecht wachtwoord!</string>
+ <string name="msg_dc_error_extract_key">Onbekende fout bij ontgrendelen van sleutel!</string>
+ <string name="msg_dc_error_integrity_check">Fout bij integriteitscontrole!</string>
+ <string name="msg_dc_error_integrity_missing">Integriteitscheck ontbreekt! Dit kan gebeuren omdat de versleutelingsapplicatie verouderd is, of door een downgrade-aanval.</string>
+ <string name="msg_dc_error_invalid_siglist">Geen geldige ondertekeningsgegevens gevonden!</string>
+ <string name="msg_dc_error_io">I/O-uitzondering tegengekomen tijdens bewerking!</string>
+ <string name="msg_dc_error_no_data">Geen versleutelde gegevens gevonden!</string>
+ <string name="msg_dc_error_no_key">Geen versleutelde gegevens met bekende geheime sleutel gevonden!</string>
+ <string name="msg_dc_error_pgp_exception">OpenPGP-uitzondering tegengekomen tijdens bewerking!</string>
+ <string name="msg_dc_integrity_check_ok">Integriteitscontrole OKÉ!</string>
+ <string name="msg_dc_ok_meta_only">Enkel metadata opgevraagd, ontcijferen wordt overgeslaan</string>
+ <string name="msg_dc_ok">Oké</string>
+ <string name="msg_dc_pass_cached">Wachtwoord wordt uit cache gebruikt</string>
+ <string name="msg_dc_pending_nfc">NFC token vereist, gebruikersinput wordt gevraagd…</string>
+ <string name="msg_dc_pending_passphrase">Wachtwoord vereist, gebruikersinput wordt gevraagd…</string>
+ <string name="msg_dc_prep_streams">Bezig met voorbereiden van streams voor ontcijfering</string>
+ <string name="msg_dc">Ontcijfering wordt gestart…</string>
+ <string name="msg_dc_sym_skip">Symmetrische gegevens niet toegestaan, bewerking wordt overgeslaan…</string>
+ <string name="msg_dc_sym">Blok met symmetrisch versleutelde gegevens gevonden</string>
+ <string name="msg_dc_trail_asym">Achterlopende, asymmetrisch versleutelde gegevens tegengekomen voor sleutel %s</string>
+ <string name="msg_dc_trail_sym">Achterlopende, symmetrisch versleutelde gegevens tegengekomen</string>
+ <string name="msg_dc_trail_unknown">Achterlopende gegevens van onbekend type tegengekomen</string>
+ <string name="msg_dc_unlocking">Bezig met ontgrendelen van geheime sleutel</string>
+ <!--Messages for VerifySignedLiteralData operation-->
+ <string name="msg_vl">Ondertekeningscontrole wordt gestart</string>
+ <string name="msg_vl_error_no_siglist">Geen ondertekeningslijst in ondertekende letterlijke gegevens</string>
+ <string name="msg_vl_error_wrong_key">Bericht niet ondertekend met de juiste sleutel</string>
+ <string name="msg_vl_error_missing_literal">Geen payload in ondertekende letterlijke gegevens</string>
+ <string name="msg_vl_clear_meta_file">Bestandsnaam: %s</string>
+ <string name="msg_vl_clear_meta_mime">MIME-type: %s</string>
+ <string name="msg_vl_clear_meta_time">Wijzigingstijd: %s</string>
+ <string name="msg_vl_clear_meta_size">Bestandsgrootte: %s</string>
+ <string name="msg_vl_clear_signature_check">Bezig met verifiëren van ondertekeningsgegevens</string>
+ <string name="msg_vl_error_integrity_check">Fout bij integriteitscontrole!</string>
+ <string name="msg_vl_ok">Oké</string>
<!--Messages for SignEncrypt operation-->
+ <string name="msg_se">Ondertekening/versleuteling wordt gestart</string>
+ <string name="msg_se_input_bytes">Bezig met verwerken van input van byte array</string>
+ <string name="msg_se_input_uri">Bezig met verwerken van input van URI</string>
+ <string name="msg_se_error_no_input">Geen input gegeven!</string>
+ <string name="msg_se_error_input_uri_not_found">Fout bij openen van URI voor lezen!</string>
+ <string name="msg_se_error_output_uri_not_found">Fout bij openen van URI voor schrijven!</string>
+ <string name="msg_se_error_too_many_inputs">Meer inputs dan outputs opgegeven! Dit is waarschijnlijk een programmeerfout, gelieve dit te melden!</string>
+ <string name="msg_se_warn_output_left">Er blijven outputs over maar geen inputs. Dit is waarschijnlijk een programmeerfout, gelieve dit te melden!</string>
+ <string name="msg_se_success">Ondertekening/versleuteling geslaagd</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">Bezig met publieke sleutels voorbereiden voor versleuteling</string>
+ <string name="msg_pse_clearsign_only">Ondertekenen van platte tekst-input wordt niet ondersteund!</string>
+ <string name="msg_pse_compressing">Bezig met voorbereiden van comprimeren</string>
+ <string name="msg_pse_encrypting">Bezig met versleutelen van gegevens</string>
+ <string name="msg_pse_error_bad_passphrase">Slecht wachtwoord!</string>
+ <string name="msg_pse_error_hash_algo">Het gevraagde hashing-algoritme wordt niet ondersteund door deze sleutel!</string>
+ <string name="msg_pse_error_io">I/O-uitzondering tegengekomen tijdens bewerking!</string>
+ <string name="msg_pse_error_key_sign">Geselecteerde sleutel kan geen gegevens ondertekenen!</string>
+ <string name="msg_pse_error_sign_key">Fout bij ophalen van ondertekeningssleutel!</string>
+ <string name="msg_pse_error_nfc">NFC-gegevensfout!</string>
+ <string name="msg_pse_error_no_passphrase">Geen wachtwoord gegeven!</string>
+ <string name="msg_pse_error_pgp">Interne OpenPGP-fout!</string>
+ <string name="msg_pse_error_sig">OpenPGP-ondertekeningsuitzondering tegengekomen!</string>
+ <string name="msg_pse_error_unlock">Onbekende fout bij ontgrendelen van sleutel!</string>
+ <string name="msg_pse_key_ok">Bezig met versleutelen voor sleutel: %s</string>
+ <string name="msg_pse_key_unknown">Ontbrekende sleutel voor versleuteling: %s</string>
+ <string name="msg_pse_key_warn">Slechte sleutel voor versleuteling: %s</string>
+ <string name="msg_pse_ok">Ondertekening/versleuteling geslaagd!</string>
+ <string name="msg_pse_pending_nfc">NFC token vereist, gebruikersinput gevraagd…</string>
+ <string name="msg_pse_pending_passphrase">Wachtwoord vereist, gebruikersinput gevraagd…</string>
+ <string name="msg_pse_signing">Bezig met ondertekenen van gegevens (zonder versleuteling)</string>
+ <string name="msg_pse_signing_cleartext">Bezig met aanmaken van platte tekst-ondertekening</string>
+ <string name="msg_pse_signing_detached">Bezig met aanmaken van vrijstaande ondertekening</string>
+ <string name="msg_pse_sigcrypting">Bezig met versleutelen van gegevens met ondertekening</string>
+ <string name="msg_pse">Ondertekening en/of versleuteling wordt gestart</string>
+ <string name="msg_pse_symmetric">Bezig met voorbereiden van symmetrische versleuteling</string>
+ <string name="msg_crt_certifying">Bezig met aanmaken van certificaten</string>
+ <string name="msg_crt_certify_all">Bezig met certificeren van alle gebruikers-ID\'s voor sleutel %s</string>
+ <plurals name="msg_crt_certify_some">
+ <item quantity="one">Bezig met certificeren van een gebruikers-ID voor sleutel %2$s</item>
+ <item quantity="other">Bezig met certificeren van %1$d gebruikers-ID\'s voor sleutel %2$s</item>
+ </plurals>
+ <string name="msg_crt_error_self">Kan self-certificaat zo niet uitgeven!</string>
+ <string name="msg_crt_error_master_not_found">Hoofdsleutel niet gevonden!</string>
+ <string name="msg_crt_error_nothing">Geen sleutels gecertificeerd!</string>
+ <string name="msg_crt_error_unlock">Fout bij ontgrendelen van hoofdsleutel!</string>
+ <string name="msg_crt_error_divert">Certificatie met NFC wordt (nog) niet ondersteund!</string>
+ <string name="msg_crt">Bezig met certificeren van sleutelbossen</string>
+ <string name="msg_crt_master_fetch">Bezig met ophalen van gecertificeerde hoofdsleutel</string>
+ <string name="msg_crt_save">Bezig met opslaan van gecertificeerde sleutel %s</string>
+ <string name="msg_crt_saving">Bezig met opslaan van sleutelbossen</string>
+ <string name="msg_crt_unlock">Bezig met ontgrendelen van hoofdsleutel</string>
+ <string name="msg_crt_success">Identiteiten succesvol gecertificeerd</string>
+ <string name="msg_crt_warn_not_found">Sleutel niet gevonden!</string>
+ <string name="msg_crt_warn_cert_failed">Aanmaken van certificaat mislukt!</string>
+ <string name="msg_crt_warn_save_failed">Opslaan mislukt!</string>
+ <string name="msg_crt_upload_success">Sleutel succesvol geüpload naar server</string>
+ <plurals name="msg_import">
+ <item quantity="one">Bezig met importeren van sleutel</item>
+ <item quantity="other">Bezig met importeren van %d sleutels</item>
+ </plurals>
+ <string name="msg_import_fetch_error_decode">Fout bij decoderen van opgehaalde sleutelbos!</string>
+ <string name="msg_import_fetch_error">Sleutel kon niet opgehaald worden! (Netwerkproblemen?)</string>
+ <string name="msg_import_fetch_keybase">Bezig met ophalen van keybase.io: %s</string>
+ <string name="msg_import_fetch_keyserver_error">Kon sleutel niet ophalen!</string>
+ <string name="msg_import_fetch_keyserver">Bezig met ophalen van sleutelserver: %s</string>
+ <string name="msg_import_fetch_keyserver_ok">Ophalen van sleutel geslaagd!</string>
+ <string name="msg_import_keyserver">Sleutelserver %s wordt gebruikt</string>
+ <string name="msg_import_fingerprint_error">Vingerafdruk van opgehaalde sleutel komt niet overeen met verwachte vingerafdruk!</string>
+ <string name="msg_import_fingerprint_ok">Vingerafdrukcontrole OKÉ</string>
+ <string name="msg_import_merge">Bezig met samenvoegen van opgehaalde gegevens</string>
+ <string name="msg_import_error">Importeren mislukt!</string>
+ <string name="msg_import_error_io">Importeren mislukt door i/o-fout!</string>
+ <string name="msg_import_partial">Importeren geslaagd, met fouten!</string>
+ <string name="msg_import_success">Importeren geslaagd!</string>
+ <plurals name="msg_export">
+ <item quantity="one">Bezig met exporteren van een sleutel</item>
+ <item quantity="other">Bezig met exporteren van %d sleutels</item>
+ </plurals>
+ <string name="msg_export_all">Bezig met exporteren van alle sleutels</string>
+ <string name="msg_export_public">Bezig met exporteren van publieke sleutel %s</string>
+ <string name="msg_export_secret">Bezig met exporteren van geheime sleutel %s</string>
+ <string name="msg_export_error_no_file">Geen bestandsnaam opgegeven!</string>
+ <string name="msg_export_error_fopen">Fout bij openen van bestand!</string>
+ <string name="msg_export_error_no_uri">Geen URI opgegeven!</string>
+ <string name="msg_export_error_uri_open">Fout bij openen van URI stream!</string>
+ <string name="msg_export_error_storage">Opslag is niet klaar voor schrijven!</string>
+ <string name="msg_export_error_db">Databasefout!</string>
+ <string name="msg_export_error_io">Input/output-fout!</string>
+ <string name="msg_export_error_key">Fout bij voorwerken van sleutelgegevens!</string>
+ <string name="msg_export_success">Exporteren geslaagd</string>
+ <string name="msg_del_error_empty">Niets om te verwijderen!</string>
+ <string name="msg_del_error_multi_secret">Geheime sleutels kunnen enkel individueel verwijderd worden!</string>
+ <plurals name="msg_del">
+ <item quantity="one">Bezig met verwijderen van een sleutel</item>
+ <item quantity="other">Bezig met verwijderen van %d sleutels</item>
+ </plurals>
+ <string name="msg_del_key">Bezig met verwijderen van sleutel %s</string>
+ <string name="msg_del_key_fail">Verwijderen van sleutel %s mislukt</string>
+ <string name="msg_del_consolidate">Bezig met consolideren van database na verwijderen van geheime sleutel</string>
+ <plurals name="msg_del_ok">
+ <item quantity="one">Sleutel succesvol verwijderd</item>
+ <item quantity="other">%d sleutels succesvol verwijderd</item>
+ </plurals>
+ <plurals name="msg_del_fail">
+ <item quantity="one">Verwijderen van een sleutel mislukt</item>
+ <item quantity="other">Verwijderen van %d sleutels mislukt</item>
+ </plurals>
+ <string name="msg_acc_saved">Account opgeslaan</string>
+ <string name="msg_download_success">Succesvol gedownload!</string>
+ <string name="msg_download_no_valid_keys">Geen geldige sleutels gevonden in bestand/klembord!</string>
+ <string name="msg_download_no_pgp_parts">TODO: meervouden!</string>
<plurals name="error_import_non_pgp_part">
<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="msg_download_query_too_short">Zoekopdracht te kort. Gelieve je zoekopdracht te verfijnen!</string>
+ <string name="msg_download_too_many_responses">Zoekopdracht gaf te veel kandidaten. Gelieve je zoekopdracht te verfijnen!</string>
+ <string name="msg_download_query_too_short_or_too_many_responses">Geen of te veel sleutels werden gevonden. Gelieve je zoekopdracht te verfijnen!</string>
+ <string name="msg_download_query_failed">Er trad een fout op bij het zoeken naar sleutels.</string>
<!--PassphraseCache-->
+ <string name="passp_cache_notif_click_to_clear">Klik om de gecachete wachtwoorden te wissen</string>
+ <string name="passp_cache_notif_n_keys">OpenKeychain heeft %d wachtwoorden gecachet</string>
+ <string name="passp_cache_notif_keys">Gecachete wachtwoorden:</string>
+ <string name="passp_cache_notif_clear">Wis cache</string>
+ <string name="passp_cache_notif_pwd">Wachtwoord</string>
+ <!--First Time-->
+ <string name="first_time_text1">Neem je privacy terug met OpenKeychain!</string>
+ <string name="first_time_create_key">Maak mijn sleutel aan</string>
+ <string name="first_time_import_key">Importeren van bestand</string>
+ <string name="first_time_skip">Setup overslaan</string>
<!--unsorted-->
<string name="section_certifier_id">Certificeer</string>
<string name="section_cert">Certificaat Details</string>
<string name="label_user_id">Identiteit</string>
<string name="unknown_uid">&lt;onbekend&gt;</string>
<string name="empty_certs">Geen certificaten voor deze sleutel</string>
+ <string name="certs_text">Enkel gevalideerde self-certificaten en gevalideerde certificaten gemaakt met jouw sleutels worden hier weergegeven.</string>
+ <string name="section_uids_to_certify">Identiteiten voor</string>
+ <string name="certify_text">De sleutels die je importeert bevatten \'identiteiten\': namen en e-mailadressen. Selecteer precies die voor certificatie die overeenkomen met wat je had verwacht.</string>
+ <string name="certify_fingerprint_text">Vergelijk de weergegeven vingerafdruk, karakter per karakter, met die weergegeven op het toestel van je partner.</string>
+ <string name="certify_fingerprint_text2">Komen de weergegeven vingerafdrukken overeen?</string>
<string name="label_revocation">Intrek Reden</string>
<string name="label_verify_status">Verificatie Status</string>
<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="key_stripped">gestript</string>
+ <string name="key_divert">doorschakelen naar smartcard/NFC</string>
+ <string name="key_no_passphrase">geen wachtwoord</string>
+ <string name="key_unavailable">niet beschikbaar</string>
+ <string name="secret_cannot_multiple">Je eigen sleutels kunnen enkel 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-->
+ <string name="info_no_manual_account_creation">Maak OpenKeychain-accounts niet handmatig aan.\nVoor meer informatie, zie Help.</string>
+ <string name="contact_show_key">Toon sleutel (%s)</string>
+ <string name="swipe_to_update">Veeg naar beneden om van sleutelserver te updaten</string>
+ <string name="error_no_file_selected">Selecteer minstens een bestand om te versleutelen!</string>
+ <string name="error_multi_not_supported">Opslaan van meerdere bestanden wordt niet ondersteund. Dit is een beperking van Android.</string>
+ <string name="key_colon">Sleutel:</string>
+ <string name="exchange_description">Selecteer om een sleuteluitwisseling te starten het aantal deelnemers aan de rechterkant, en klik vervolgens op de knop \'Start uitwisseling\'.\n\nJe zal twee vragne gesteld worden om zeker te zijn dat enkel de juiste deelnemers zich in de uitwisseling bevinden en dat hun vingerafdrukken correct zijn.</string>
+ <string name="btn_start_exchange">Uitwisseling starten</string>
+ <string name="user_id_none"><![CDATA[<none>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">Kies een ontgrendelingsmethode</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Voer wachtwoord in</string>
+ <string name="passphrase">Wachtwoord</string>
+ <string name="noPassphrase">Geen wachtwoord</string>
+ <string name="no_passphrase_set">Geen wachtwoord ingesteld</string>
+ <string name="passphrases_match">Wachtwoorden komen niet overeen</string>
+ <string name="passphrase_saved">Wachtwoord opgeslagen</string>
+ <string name="passphrase_invalid">Wachtwoord ongeldig</string>
+ <string name="missing_passphrase">Ontbrekend wachtwoord</string>
+ <string name="passphrase_again">Opnieuw</string>
+ <string name="lockpattern">Vergrendelingspatroon</string>
+ <string name="lockpatternNFC">NFC + vergrendelingspatroon</string>
+ <string name="unlock_method">Ontgrendelingsmethode</string>
+ <string name="set_passphrase">Wachtwoord instellen</string>
+ <string name="draw_lockpattern">Vergrendelingspatroon tekenen</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Verkeerde tag. Gelieve opnieuw te proberen.</string>
+ <string name="enable_nfc">Gelieve NFC in je instellingen te activeren</string>
+ <string name="no_nfc_support">Dit toestel biedt geen ondersteuning voor NFC</string>
+ <string name="nfc_write_succesful">Succesvol geschreven op NFC-tag</string>
+ <string name="unlocked">Ontgrendeld</string>
+ <string name="nfc_settings">Instellingen</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml
index fed8ac224..3dc6a2a35 100644
--- a/OpenKeychain/src/main/res/values-pl/strings.xml
+++ b/OpenKeychain/src/main/res/values-pl/strings.xml
@@ -9,18 +9,18 @@
<string name="title_encrypt_text">Szyfruj tekst</string>
<string name="title_encrypt_files">Szyfruj pliki</string>
<string name="title_decrypt">Odszyfruj</string>
- <string name="title_unlock">Hasło</string>
+ <string name="title_unlock">Odblokuj klucz</string>
<string name="title_add_subkey">Dodaj pod-klucz</string>
<string name="title_edit_key">Edytuj klucz</string>
- <string name="title_preferences">Właściwości</string>
+ <string name="title_preferences">Ustawienia</string>
<string name="title_cloud_search_preferences">Właściwości Szukania w Chmurze</string>
<string name="title_api_registered_apps">Aplikacje</string>
- <string name="title_key_server_preference">Właściwości serwera kluczy</string>
+ <string name="title_key_server_preference">Serwery kluczy</string>
<string name="title_change_passphrase">Zmień hasło</string>
- <string name="title_share_fingerprint_with">Podziel się fingerprintem z...</string>
- <string name="title_share_key">Podziel się kluczem z...</string>
- <string name="title_share_file">Podziel się plikiem z...</string>
- <string name="title_share_message">Podziel się wiadomością z...</string>
+ <string name="title_share_fingerprint_with">Podziel się odciskiem klucza przez...</string>
+ <string name="title_share_key">Podziel się kluczem przez...</string>
+ <string name="title_share_file">Podziel się plikiem przez...</string>
+ <string name="title_share_message">Podziel się wiadomością przez...</string>
<string name="title_encrypt_to_file">Zaszyfruj do pliku</string>
<string name="title_decrypt_to_file">Odszyfruj do pliku</string>
<string name="title_import_keys">Importuj klucze</string>
@@ -34,6 +34,9 @@
<string name="title_help">Pomoc</string>
<string name="title_log_display">Logi</string>
<string name="title_create_key">Utwórz klucz</string>
+ <string name="title_exchange_keys">Wymień się kluczami</string>
+ <string name="title_advanced_key_info">Zaawansowane informacje o kluczu</string>
+ <string name="title_keys">Klucze</string>
<!--section-->
<string name="section_user_ids">Tożsamości</string>
<string name="section_keys">Pod-klucze</string>
@@ -48,10 +51,13 @@
<string name="section_certification_key">Twój klucz użyty do certyfikacji</string>
<string name="section_upload_key">Synchronizuj Klucz</string>
<string name="section_key_server">Serwer kluczy</string>
- <string name="section_fingerprint">Fingerprint</string>
+ <string name="section_fingerprint">Odcisk klucza</string>
<string name="section_key_to_certify">Klucz do certyfikacji</string>
<string name="section_decrypt_files">Pliki</string>
<string name="section_decrypt_text">Tekst</string>
+ <string name="section_certs">Certyfikaty</string>
+ <string name="section_encrypt">Zaszyfruj</string>
+ <string name="section_decrypt">Odszyfruj</string>
<!--button-->
<string name="btn_decrypt_verify_file">Odszyfruj, weryfikuj i zapisz plik</string>
<string name="btn_decrypt_verify_message">Odszyfruj i weryfikuj wiadomość</string>
@@ -72,14 +78,17 @@
<string name="btn_add_files">Dodaj plik(i)</string>
<string name="btn_add_share_decrypted_text">Podziel się odszyfrowanym tekstem</string>
<string name="btn_decrypt_clipboard">Odszyfruj ze schowka</string>
- <string name="btn_decrypt_and_verify">oraz weryfikuj podpisy</string>
+ <string name="btn_decrypt_and_verify">oraz zweryfikuj podpisy</string>
<string name="btn_decrypt_files">Odszyfruj pliki</string>
+ <string name="btn_encrypt_files">Zaszyfruj pliki</string>
+ <string name="btn_encrypt_text">Zaszyfruj tekst</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">Utwórz mój klucz</string>
+ <string name="menu_import_existing_key">Importuj z pliku</string>
<string name="menu_search">Szukaj</string>
<string name="menu_beam_preferences">Ustawienia Beam</string>
<string name="menu_key_edit_cancel">Anuluj</string>
@@ -101,16 +110,16 @@
<string name="label_ascii_armor">Plik ASCII Armor</string>
<string name="label_file_ascii_armor">Włącz ASCII Armor</string>
<string name="label_write_version_header">Niech inni wiedzą, że używasz OpenKeychain</string>
- <string name="label_write_version_header_summary">Napisze \'\'OpenKeychain v2.7\' do podpisów OpenPGP, ciphertekstu i wyeksportowanych kluczy</string>
- <string name="label_use_default_yubikey_pin">Użyj domyślnego Yubikey PINa</string>
- <string name="label_use_num_keypad_for_yubikey_pin">Użyj klawiatury numerycznej dla PINu Yubikey</string>
- <string name="label_label_use_default_yubikey_pin_summary">Używa domyślnego PINu (123456) do dostępu do Yubikeys przez NFC</string>
+ <string name="label_write_version_header_summary">Wpisuje \'\'OpenKeychain v2.7\' do podpisów, szyfrogramów i wyeksportowanych kluczy OpenPGP.</string>
+ <string name="label_use_default_yubikey_pin">Użyj domyślnego PIN-u YubiKey</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Użyj klawiatury numerycznej dla PIN-u YubiKey</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Używa domyślnego PIN-u (123456) do dostępu do YubiKeys przez NFC</string>
<string name="label_asymmetric_from">Podpisane przez:</string>
<string name="label_to">Szyfruj do:</string>
<string name="label_delete_after_encryption">Usuń plik po zaszyfrowaniu</string>
<string name="label_delete_after_decryption">Usuń po odszyfrowaniu</string>
<string name="label_encryption_algorithm">Algorytm szyfrowania</string>
- <string name="label_hash_algorithm">Algorytm hash</string>
+ <string name="label_hash_algorithm">Funkcja skrótu</string>
<string name="label_symmetric">Szyfruj z hasłem</string>
<string name="label_passphrase_cache_ttl">Czas pamięci cache</string>
<string name="label_passphrase_cache_subs">Pamiętaj hasła względem pod-klucza:</string>
@@ -127,6 +136,7 @@
<string name="label_name">Imię</string>
<string name="label_comment">Komentarz</string>
<string name="label_email">Adres email</string>
+ <string name="label_send_key">Synchronizuj z chmurą</string>
<string name="label_fingerprint">Odcisk</string>
<string name="expiry_date_dialog_title">Ustaw datę wygaśnięcia</string>
<string name="label_first_keyserver_is_used">(Pierwszy serwer kluczy jest preferowany)</string>
@@ -176,9 +186,9 @@
<string name="error_message">Błąd: %s</string>
<!--key flags-->
<string name="flag_certify">Certyfikuj</string>
- <string name="flag_sign">Podpisz</string>
- <string name="flag_encrypt">Zaszyfruj</string>
- <string name="flag_authenticate">Autentykuj</string>
+ <string name="flag_sign">Podpisuj</string>
+ <string name="flag_encrypt">Szyfruj</string>
+ <string name="flag_authenticate">Uwierzytelniaj</string>
<!--sentences-->
<string name="wrong_passphrase">Nieprawidłowe hasło.</string>
<string name="no_filemanager_installed">Nie zainstalowano żadnego kompatybilnego menadżera plików.</string>
@@ -186,7 +196,8 @@
<string name="passphrase_must_not_be_empty">Podaj hasło.</string>
<string name="passphrase_for_symmetric_encryption">Szyfrowanie symetryczne.</string>
<string name="passphrase_for">Podaj hasło dla \'%s\'</string>
- <string name="yubikey_pin_for">Wpisz PIN, aby otworzyć Yubikey dla \'%s\'</string>
+ <string name="pin_for">Wpisz PIN dla \'%s\'</string>
+ <string name="nfc_text">Trzymaj YubiKey z tyłu Twojego urządzenia.</string>
<string name="file_delete_confirmation">Czy jesteś pewny, że chcesz usunąć\n%s?</string>
<string name="file_delete_successful">Usunięto pomyślnie.</string>
<string name="no_file_selected">Najpierw wskaż plik.</string>
@@ -216,7 +227,7 @@
<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="fingerprint_copied_to_clipboard">Fingerprint został skopiowany do schowka!</string>
+ <string name="fingerprint_copied_to_clipboard">Odcisk klucza został skopiowany do schowka!</string>
<string name="select_key_to_certify">Proszę wybrać klucz który będzie użyty do certyfikacji!</string>
<string name="key_too_big_for_sharing">Klucz ma za duży rozmiar by być udostępniony w ten sposób!</string>
<string name="text_copied_to_clipboard">Tekst został skopiowany do schowka!</string>
@@ -239,7 +250,6 @@
<string name="error_could_not_extract_private_key">nie można wyodrębnić klucza prywatnego</string>
<!--errors without preceeding Error:-->
<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_nothing_import">Nie znaleziono kluczy!</string>
<string name="error_contacts_key_id_missing">Pobieranie ID klucza z kontaktów nie powiodło się!</string>
<string name="error_generic_report_bug">Wystąpił błąd ogólny, proszę zgłoś go autorom OpenKeychain.</string>
@@ -255,6 +265,7 @@
<string name="decrypt_result_not_encrypted">Nie szyfrowane</string>
<string name="decrypt_result_action_show">Pokaż</string>
<string name="decrypt_result_action_Lookup">Sprawdź</string>
+ <string name="decrypt_invalid_button">Rozumiem ryzko, pokaż!</string>
<!--Add keys-->
<string name="add_keys_my_key">Mój klucz:</string>
<!--progress dialogs, usually ending in '…'-->
@@ -341,14 +352,16 @@
<string name="help_about_version">Wersja:</string>
<!--Import-->
<string name="import_tab_keyserver">Serwery kluczy</string>
- <string name="import_tab_cloud">Szukaj w Chmurze</string>
+ <string name="import_tab_cloud">Szukaj w chmurze</string>
<string name="import_tab_direct">Plik/Schowek</string>
<string name="import_tab_qr_code">Kod QR/NFC</string>
<string name="import_import">Zaimportuj wybrane klucze</string>
<string name="import_qr_code_wrong">Kod QR zniekształcony! Spróbuj jeszcze raz!</string>
<string name="import_qr_code_too_short_fingerprint">Odcisk klucza jest za krótki (&lt; 16 znaków)</string>
+ <string name="import_qr_code_button">Skanuj kod QR</string>
+ <string name="import_qr_code_text">Umieść kod QR przed kamerą!</string>
<!--Generic result toast-->
- <string name="view_log">Pokaż logi</string>
+ <string name="view_log">Szczegóły</string>
<string name="with_warnings">, z ostrzeżeniami</string>
<string name="with_cancelled">, aż anulowano</string>
<!--Import result toast-->
@@ -429,7 +442,6 @@
<string name="intent_send_encrypt">Zaszyfruj korzystając z OpenKeychain</string>
<string name="intent_send_decrypt">Deszyfruj korzystając z OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Brak zarejestrowanych aplikacji!\n\nLista obsługiwanych aplikacji innych firm jest dostępna w \'Pomoc\'.</string>
<string name="api_settings_show_info">Pokaż zaawansowane informacje</string>
<string name="api_settings_hide_info">Ukryj zaawansowane informacje</string>
<string name="api_settings_show_advanced">Pokaż zaawanowane ustawienia</string>
@@ -445,7 +457,7 @@
<string name="api_settings_delete_account">Usuń konto</string>
<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">Konta (przestarzłe API)</string>
<string name="api_settings_settings">Ustawienia</string>
<string name="api_settings_key">Klucz konta:</string>
<string name="api_settings_accounts_empty">Brak kont połączonych z tą aplikacją.</string>
@@ -471,6 +483,7 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<item quantity="few">%d kluczy wybranych.</item>
<item quantity="other">%d kluczy wybranych.</item>
</plurals>
+ <string name="key_list_empty_text1">Nie znaleziono kluczy!</string>
<string name="key_list_filter_show_all">Pokaż wszystkie klucze</string>
<string name="key_list_filter_show_certified">Pokaż tylko certyfikowane klucze</string>
<!--Key view-->
@@ -494,6 +507,8 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="user_id_info_uncertified_text">Ta tożsamość nie była jeszcze certyfikowana. Nie możesz być pewny, że ta tożsamość naprawdę jest tą osobą za którą się podaje.</string>
<string name="user_id_info_invalid_title">Nieprawidłowe</string>
<string name="user_id_info_invalid_text">Coś jest nie tak z tą tożsamością!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Zmień hasło</string>
<string name="edit_key_action_add_identity">Dodaj tożsamość</string>
@@ -529,13 +544,9 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="create_key_hint_full_name">Imię i nazwisko, na przykład, Jan Kowalski</string>
<string name="create_key_edit">Zmień klucz konfiguracji</string>
<!--View key-->
- <string name="view_key_revoked">Ten klucz został unieważniony!</string>
- <string name="view_key_expired">Ten klucz stracił swoją ważność!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Klucze</string>
- <string name="nav_encrypt_text">Szyfruj tekst</string>
- <string name="nav_encrypt_files">Szyfruj pliki</string>
- <string name="nav_decrypt">Odszyfruj</string>
+ <string name="nav_encrypt_decrypt">Zaszyfruj/Odszyfruj</string>
<string name="nav_apps">Aplikacje</string>
<string name="drawer_open">Otwórz panel nawigacji</string>
<string name="drawer_close">Zamknij panel nawigacji</string>
@@ -570,11 +581,11 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
<!--createSecretKeyRing-->
- <string name="msg_cr">Generowanie nowego master klucza</string>
- <string name="msg_cr_error_internal_pgp">Wewnętrzny błąd PGP!</string>
+ <string name="msg_cr">Generowanie nowego klucza głównego</string>
+ <string name="msg_cr_error_internal_pgp">Błąd wewnętrzny PGP!</string>
<!--modifySecretKeyRing-->
- <string name="msg_mf_error_pgp">Wewnętrzny błąd PGP!</string>
- <string name="msg_mf_passphrase">Zmienianie hasła dla pęku kluczy...</string>
+ <string name="msg_mf_error_pgp">Błąd wewnętrzny PGP!</string>
+ <string name="msg_mf_passphrase">Zmiana hasła dla pęku kluczy</string>
<string name="msg_mf_error_past_expiry">Data ważności nie może być przeszła!</string>
<string name="msg_mf_subkey_revoke">Unieważnianie pod-klucza %s</string>
<string name="msg_mf_uid_error_empty">ID użytkownika nie może być pusty!</string>
@@ -583,6 +594,8 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="msg_con_save_secret">Zapisywanie prywatnych pęków kluczy</string>
<string name="msg_con_save_public">Zapisywanie publicznych pęków kluczy</string>
<string name="msg_con_db_clear">Czyszczenie bazy danych</string>
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_not_found">Nie znaleziono klucza!</string>
<!--Messages for DecryptVerify operation-->
@@ -599,18 +612,9 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="msg_dc_pass_cached">Użycie hasła z pamięci cache</string>
<string name="msg_dc_pending_passphrase">Hasło wymagane, wymagana reakcja użytkownika...</string>
<string name="msg_dc">Rozpoczynanie operacji odszyfrowania...</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_encrypting">Szyfrowanie danych</string>
- <string name="msg_se_error_bad_passphrase">Nieprawidłowe hasło!</string>
- <string name="msg_se_error_no_passphrase">Nie wprowadzono hasła!</string>
- <string name="msg_se_key_ok">Szyfrowanie dla klucza: %s</string>
- <string name="msg_se_key_unknown">Brakujący klucz do szyfrowania: %s</string>
- <string name="msg_se_key_warn">Zły klucz do szyfrowania: %s</string>
- <string name="msg_se_ok">Operacja Podpisania/Szyfrowania zakończona pomyślnie!</string>
- <string name="msg_se_pending_nfc">Token NFC jest wymagany, wymagana reakcja użytkownika...</string>
- <string name="msg_se_pending_passphrase">Hasło wymagane, wymagana reakcja użytkownika...</string>
- <string name="msg_se_signing">Podpisywanie danych (bez podpisu)</string>
- <string name="msg_se_sigcrypting">Szyfrowanie danych z podpisem</string>
+ <!--Messages for PgpSignEncrypt operation-->
<string name="msg_crt_saving">Zapisywanie pęków kluczy</string>
<string name="msg_crt_unlock">Odblokowanie master klucza</string>
<string name="msg_crt_success">Pomyślnie certyfikowane tożsamości</string>
@@ -659,12 +663,17 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="passp_cache_notif_keys">Zapamiętane hasła:</string>
<string name="passp_cache_notif_clear">Wyczyść pamięć cache</string>
<string name="passp_cache_notif_pwd">Hasło</string>
+ <!--First Time-->
+ <string name="first_time_text1">Weź prywatność w swoje ręce używając OpenKeychain!</string>
+ <string name="first_time_create_key">Utwórz mój klucz</string>
+ <string name="first_time_skip">Pomiń ustawienia</string>
<!--unsorted-->
<string name="section_certifier_id">Certyfikujący</string>
<string name="section_cert">Szczegóły certyfikatu</string>
<string name="label_user_id">Tożsamość</string>
<string name="unknown_uid">&lt;nieznany&gt;</string>
<string name="empty_certs">Nie ma certyfikatów dla tego klucza</string>
+ <string name="section_uids_to_certify">Tożsamości dla</string>
<string name="label_revocation">Powód odwołania</string>
<string name="label_verify_status">Stan weryfikacji</string>
<string name="label_cert_type">Typ</string>
@@ -682,8 +691,9 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="swipe_to_update">Pociągnij w dół, aby aktualizować z serwera kluczy</string>
<string name="error_no_file_selected">Wybierz przynajmniej jeden plik, aby szyfrować!</string>
<string name="key_colon">Klucz:</string>
- <!--First Time-->
- <string name="first_time_text1">Weź prywatność w swoje ręce używając OpenKeychain!</string>
- <string name="first_time_create_key">Utwórz mój klucz</string>
- <string name="first_time_skip">Pomiń ustawienia</string>
+ <string name="btn_start_exchange">Rozpocznij wymianę</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-pt/strings.xml b/OpenKeychain/src/main/res/values-pt/strings.xml
index 460c5462e..233347bd3 100644
--- a/OpenKeychain/src/main/res/values-pt/strings.xml
+++ b/OpenKeychain/src/main/res/values-pt/strings.xml
@@ -36,6 +36,8 @@
<!--Share-->
<!--Key list-->
<!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<!--Create key-->
<!--View key-->
@@ -50,10 +52,18 @@
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<!--PassphraseCache-->
- <!--unsorted-->
<!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</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..233347bd3
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-ro/strings.xml
@@ -0,0 +1,69 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--GENERAL: Please put all strings inside quotes as described in example 1 on
+ http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <!--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-->
+ <!--Add keys-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--elliptic curve names-->
+ <!--not in for now, see SaveKeyringParcel
+ <string name="key_curve_bp_p256">"Brainpool P-256"</string>
+ <string name="key_curve_bp_p384">"Brainpool P-384"</string>
+ <string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Generic result toast-->
+ <!--Import result toast-->
+ <!--Delete result toast-->
+ <!--Certify result toast-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
+ <!--Edit key-->
+ <!--Create key-->
+ <!--View key-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <!--Import Public log entries-->
+ <!--Import Secret log entries-->
+ <!--Keyring Canonicalization log entries-->
+ <!--Keyring merging log entries-->
+ <!--createSecretKeyRing-->
+ <!--modifySecretKeyRing-->
+ <!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <!--Other messages used in OperationLogs-->
+ <!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
+ <!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <!--PassphraseCache-->
+ <!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml
index 3e9f3a234..dc1c81bb4 100644
--- a/OpenKeychain/src/main/res/values-ru/strings.xml
+++ b/OpenKeychain/src/main/res/values-ru/strings.xml
@@ -2,16 +2,20 @@
<resources>
<!--GENERAL: Please put all strings inside quotes as described in example 1 on
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <string name="app_name">OpenKeychain</string>
<!--title-->
<string name="title_select_recipients">Выберите ключи</string>
<string name="title_select_secret_key">Выберите Ваш ключ</string>
+ <string name="title_encrypt_text">Зашифровать текст</string>
+ <string name="title_encrypt_files">Зашифровать файлы</string>
<string name="title_decrypt">Расшифровать</string>
- <string name="title_unlock">Пароль</string>
+ <string name="title_unlock">Разблокировать ключ</string>
<string name="title_add_subkey">Добавить доп. ключ</string>
<string name="title_edit_key">Изменить ключ</string>
<string name="title_preferences">Настройки</string>
+ <string name="title_cloud_search_preferences">Настройки облачного поиска</string>
<string name="title_api_registered_apps">Приложения</string>
- <string name="title_key_server_preference">Настройки сервера ключей</string>
+ <string name="title_key_server_preference">Серверы ключей</string>
<string name="title_change_passphrase">Изменить пароль</string>
<string name="title_share_fingerprint_with">Отправить отпечаток...</string>
<string name="title_share_key">Отправить ключ...</string>
@@ -20,6 +24,7 @@
<string name="title_encrypt_to_file">Зашифровать в файл</string>
<string name="title_decrypt_to_file">Расшифровать в файл</string>
<string name="title_import_keys">Импорт ключей</string>
+ <string name="title_add_keys">Добавить ключи</string>
<string name="title_export_key">Экспортировать ключ</string>
<string name="title_export_keys">Экспорт ключей</string>
<string name="title_key_not_found">Ключ не найден</string>
@@ -29,17 +34,30 @@
<string name="title_help">Помощь</string>
<string name="title_log_display">Журнал</string>
<string name="title_create_key">Создать ключ</string>
+ <string name="title_exchange_keys">Обмен ключами</string>
+ <string name="title_advanced_key_info">Детальная информация о ключе</string>
+ <string name="title_keys">Ключи</string>
<!--section-->
<string name="section_user_ids">Идентификаторы</string>
<string name="section_keys">Доп. ключи</string>
+ <string name="section_cloud_search">Облачный поиск</string>
<string name="section_general">Приложение</string>
<string name="section_defaults">Алгоритмы</string>
<string name="section_advanced">Дополнительно</string>
+ <string name="section_passphrase_cache">Кэш пароля</string>
+ <string name="section_certify">Удостоверить</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_fingerprint">Отпечаток ключа</string>
<string name="section_key_to_certify">Сертифицируемый ключ</string>
+ <string name="section_decrypt_files">Файлы</string>
+ <string name="section_decrypt_text">Текст</string>
+ <string name="section_certs">Сертификаты</string>
+ <string name="section_encrypt">Зашифровать</string>
+ <string name="section_decrypt">Расшифровать</string>
<!--button-->
<string name="btn_decrypt_verify_file">Расшифровать, проверить и сохранить файл</string>
<string name="btn_decrypt_verify_message">Расшифровать и проверить сообщение</string>
@@ -53,25 +71,37 @@
<string name="btn_export_to_server">Загрузить на сервер ключей</string>
<string name="btn_next">Далее</string>
<string name="btn_back">Назад</string>
+ <string name="btn_no">Нет</string>
+ <string name="btn_match">Отпечатки совпадают</string>
<string name="btn_lookup_key">Найти ключ</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>
+ <string name="btn_add_share_decrypted_text">Поделиться расшифрованным текстом</string>
+ <string name="btn_decrypt_clipboard">Расшифровать текст из буфера обмена</string>
+ <string name="btn_decrypt_and_verify">и проверить подписи</string>
+ <string name="btn_decrypt_files">Расшифровать файлы</string>
+ <string name="btn_encrypt_files">Зашифровать файлы</string>
+ <string name="btn_encrypt_text">Зашифровать текст</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_import_existing_key">Импорт из файла</string>
<string name="menu_search">Поиск</string>
+ <string name="menu_nfc_preferences">Настройки NFC</string>
<string name="menu_beam_preferences">Настройки Beam</string>
<string name="menu_key_edit_cancel">Отмена</string>
<string name="menu_encrypt_to">Зашифровать....</string>
<string name="menu_select_all">Выбрать все</string>
<string name="menu_add_keys">Добавить ключи</string>
+ <string name="menu_search_cloud">Поиск в облаке</string>
<string name="menu_export_all_keys">Экспорт всех ключей</string>
<string name="menu_advanced">Подробные данные</string>
+ <string name="menu_certify_fingerprint">Сверить отпечатки</string>
<!--label-->
<string name="label_message">Сообщение</string>
<string name="label_file">Файл</string>
@@ -79,11 +109,27 @@
<string name="label_file_colon">Файл:</string>
<string name="label_no_passphrase">Без пароля</string>
<string name="label_passphrase">Пароль</string>
+ <string name="label_unlock">Идет разблокировка...</string>
<string name="label_passphrase_again">Повторите пароль</string>
<string name="label_algorithm">Алгоритм</string>
<string name="label_ascii_armor">ASCII формат</string>
+ <string name="label_file_ascii_armor">Использовать ASCII формат</string>
<string name="label_write_version_header">Добавить комментарий об использовании OpenKeychain</string>
<string name="label_write_version_header_summary">Дописывать \'OpenKeychain v2.x\' в OpenPGP подписи, шифры, и экспортируемые ключи</string>
+ <string name="label_use_default_yubikey_pin">Использовать YubiKey PIN по умолчанию</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Использовать цифровую клавиатуру для YubiKey PIN</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Использовать PIN по умолчанию (123456) для доступа к YubiKeys через NFC</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_encryption_algorithm">Алгоритм шифрования</string>
+ <string name="label_hash_algorithm">ХЭШ-алгоритм</string>
+ <string name="label_symmetric">Зашифровать паролем</string>
+ <string name="label_passphrase_cache_ttl">Время хранения в кэше</string>
+ <string name="label_passphrase_cache_subs">Кэшировать пароли по доп. ключу</string>
+ <string name="label_message_compression">Сжимать сообщение</string>
+ <string name="label_file_compression">Сжатие файла</string>
<string name="label_keyservers">Серверы ключей</string>
<string name="label_key_id">ID ключа</string>
<string name="label_creation">Создан</string>
@@ -95,8 +141,11 @@
<string name="label_name">Имя</string>
<string name="label_comment">Комментарий</string>
<string name="label_email">Email</string>
+ <string name="label_send_key">Синхронизировать с облаком</string>
<string name="label_fingerprint">Отпечаток</string>
<string name="expiry_date_dialog_title">Срок годности</string>
+ <string name="label_first_keyserver_is_used">(Предпочесть первый сервер ключей)</string>
+ <string name="label_preferred">предпочитаемый</string>
<string name="user_id_no_name">&lt;нет имени&gt;</string>
<string name="none">&lt;нет&gt;</string>
<string name="no_key">&lt;нет ключа&gt;</string>
@@ -153,6 +202,12 @@
<string name="passphrase_for_symmetric_encryption">Симметричное шифрование.</string>
<string name="passphrase_for">Введите пароль для
\'%s\'</string>
+ <string name="pin_for">Введите PIN для
+\'%s\'</string>
+ <string name="yubikey_pin_for">Введите PIN для доступа к YubiKey для
+\'%s\'</string>
+ <string name="nfc_text">Держите YubiKey возле задней части вашего устройства.</string>
+ <string name="file_delete_confirmation">Вы уверены, что хотите удалить\n%s?</string>
<string name="file_delete_successful">Удалено.</string>
<string name="no_file_selected">Сначала выберите файл.</string>
<string name="encrypt_sign_successful">Успешно подписано и/или зашифровано.</string>
@@ -160,7 +215,14 @@
<string name="enter_passphrase_twice">Дважды введите пароль.</string>
<string name="select_encryption_key">Укажите хотя бы один ключ.</string>
<string name="select_encryption_or_signature_key">Выберите хотя бы один ключ для шифрования или подписи.</string>
+ <string name="specify_file_to_encrypt_to">Пожалуйста, выберите файл для шифрования.\nВНИМАНИЕ! Файл будет перезаписан если он уже существует.</string>
+ <string name="specify_file_to_decrypt_to">Пожалуйста, выберите файл для расшифровки.\nВНИМАНИЕ! Файл будет перезаписан если он уже существует.</string>
+ <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="public_key_deletetion_confirmation">Вы правда хотите удалить публичный ключ \'%s\'?\nЭто действие нельзя отменить!</string>
<string name="also_export_secret_keys">Экспортировать секретные ключи</string>
+ <string name="reinstall_openkeychain">Вы столкнулись с багом Андроид. Пожалуйста, переустановите OpenKeychain чтобы связать ваши контакты и ключи. </string>
<string name="key_exported">Успешный экспорт 1 ключа.</string>
<string name="keys_exported">Экспортировано %d ключей.</string>
<string name="no_keys_exported">Ключи не были экспортированы.</string>
@@ -172,6 +234,7 @@
<string name="fingerprint_copied_to_clipboard">Отпечаток ключа скопирован в буфер обмена!</string>
<string name="select_key_to_certify">Выберите ключ, используемый для сертификации!</string>
<string name="key_too_big_for_sharing">Ключ слишком большой для этого способа передачи!</string>
+ <string name="text_copied_to_clipboard">Тест скопирован в буфер обмена!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
@@ -185,20 +248,37 @@
<string name="error_key_needs_a_user_id">необходим хотя бы один идентификатор</string>
<string name="error_no_signature_passphrase">пароль не задан</string>
<string name="error_no_signature_key">ключ для подписи не задан</string>
+ <string name="error_invalid_data">Зашифрованные или подписанные данные OpenPGP не найдены!</string>
<string name="error_integrity_check_failed">Проверка целостности не удалась! Данные изменились!</string>
<string name="error_wrong_passphrase">неправильный пароль</string>
<string name="error_could_not_extract_private_key">не удалось извлечь личный ключ</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Для использования NFC Beam требуется Android 4.1+ !</string>
- <string name="error_nfc_needed">Ваше устройство не поддерживает NFC!</string>
+ <string name="error_nfc_needed">Необходимо включить NFC!</string>
+ <string name="error_beam_needed">Необходимо включить Beam!</string>
<string name="error_nothing_import">Ключи не найдены!</string>
+ <string name="error_contacts_key_id_missing">Ошибка извлечения идентификатора ключа из контактов!</string>
<string name="error_generic_report_bug">Выявлена ошибка. Пожалуйста, сообщите о ней разработчику.</string>
<!--results shown after decryption/verification-->
+ <string name="decrypt_result_no_signature">Не подписано</string>
<string name="decrypt_result_invalid_signature">Неверная подпись!</string>
+ <string name="decrypt_result_signature_uncertified">Подписано (не удостоверено!)</string>
+ <string name="decrypt_result_signature_certified">Подписано:</string>
+ <string name="decrypt_result_signature_expired_key">Срок годности ключа истёк!</string>
+ <string name="decrypt_result_signature_revoked_key">Ключ аннулирован!</string>
+ <string name="decrypt_result_signature_missing_key">Неизвестный открытый ключ</string>
+ <string name="decrypt_result_encrypted">Зашифровано</string>
+ <string name="decrypt_result_not_encrypted">Не зашифровано</string>
+ <string name="decrypt_result_action_show">Показать</string>
+ <string name="decrypt_result_action_Lookup">Искать</string>
+ <string name="decrypt_invalid_text">Неверная подпись или ключ был отозван или просрочен. Авторство текста невозможно проверить. Показать текст?</string>
+ <string name="decrypt_invalid_button">Мне понятны все риски, показать!</string>
<!--Add keys-->
+ <string name="add_keys_my_key">Мой ключ:</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">Готово.</string>
<string name="progress_cancel">Отмена</string>
+ <string name="progress_cancelling">отмена...</string>
<string name="progress_saving">сохранение...</string>
<string name="progress_importing">импорт...</string>
<string name="progress_exporting">экспорт...</string>
@@ -213,10 +293,12 @@
<string name="progress_modify">изменение связки ключей...</string>
<string name="progress_modify_unlock">разблокирование связки...</string>
<string name="progress_modify_adduid">добавление идентификатора...</string>
+ <string name="progress_modify_adduat">добавление аттрибутов пользователя...</string>
<string name="progress_modify_revokeuid">аннулирование идентификатора...</string>
<string name="progress_modify_primaryuid">изменение основного идентификатора...</string>
<string name="progress_modify_subkeychange">изменение доп. ключей...</string>
<string name="progress_modify_subkeyrevoke">аннулирование доп. ключей...</string>
+ <string name="progress_modify_subkeystrip">отделение доп.ключей...</string>
<string name="progress_modify_subkeyadd">добавление доп. ключей...</string>
<string name="progress_modify_passphrase">изменение пароля...</string>
<plurals name="progress_exporting_key">
@@ -241,8 +323,11 @@
<string name="progress_verifying_integrity">проверка целостности...</string>
<string name="progress_deleting_securely">безопасное удаление \'%s\'...</string>
<string name="progress_deleting">удаление ключей...</string>
+ <string name="progress_con_saving">объединение: сохранение в кэш...</string>
+ <string name="progress_con_reimport">объединение: реимпорт...</string>
<!--action strings-->
<string name="hint_keyserver_search_hint">Имя/Email/ID ключа…</string>
+ <string name="hint_cloud_search_hint">Имя/Email/Проверка/Ключ...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -277,13 +362,18 @@
<string name="help_about_version">Версия:</string>
<!--Import-->
<string name="import_tab_keyserver">Сервер ключей</string>
+ <string name="import_tab_cloud">Поиск в облаке</string>
<string name="import_tab_direct">Файл/Буфер</string>
<string name="import_tab_qr_code">QR код/NFC</string>
<string name="import_import">Импорт выбранных ключей</string>
<string name="import_qr_code_wrong">Некорректный QR код. Попробуйте снова!</string>
<string name="import_qr_code_too_short_fingerprint">Отпечаток слишком коротнкий (&lt; 16 символов)</string>
+ <string name="import_qr_code_button">Сканировать QR код...</string>
+ <string name="import_qr_code_text">Расположите вашу камеру над QR кодом!</string>
<!--Generic result toast-->
- <string name="view_log">Смотреть журнал</string>
+ <string name="view_log">Сведения</string>
+ <string name="with_warnings">, с предупреждениями</string>
+ <string name="with_cancelled">, до отмены</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Ключ успешно импортирован</item>
@@ -291,7 +381,10 @@
<item quantity="other">Успешно добавлено %1$d ключей</item>
</plurals>
<string name="import_error_nothing">Нет данных для импорта.</string>
+ <string name="import_error_nothing_cancelled">Импорт отменен.</string>
<!--Delete result toast-->
+ <string name="delete_nothing">Нет данных для удаления!</string>
+ <string name="delete_cancelled">Удаление отменено.</string>
<!--Certify result toast-->
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeychain: Расшифровать файл</string>
@@ -307,18 +400,29 @@
<string name="api_settings_select_key">Выбрать ключ</string>
<string name="api_settings_create_key">Создать новый ключ для этого аккаунта</string>
<string name="api_settings_save">Сохранить</string>
+ <string name="api_settings_save_msg">Аккаунт сохранен</string>
<string name="api_settings_cancel">Отмена</string>
<string name="api_settings_revoke">Отозвать доступ</string>
<string name="api_settings_start">Запустить приложение</string>
<string name="api_settings_delete_account">Удалить аккаунт</string>
<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">Аккаунты (устаревший API)</string>
+ <string name="api_settings_advanced">Подробная информация</string>
+ <string name="api_settings_allowed_keys">Разрешённые ключи</string>
+ <string name="api_settings_settings">Настройки</string>
+ <string name="api_settings_key">Ключ аккаунта:</string>
<string name="api_settings_accounts_empty">Нет аккаунтов, связанных с этим приложением.</string>
+ <string name="api_create_account_text">Отсутствует ключ настроенный для данного аккаунта. Выберите имеющийся ключ или создайте новый.\nПриложения могут расшифровывать/подписывать только при помощи выбранных здесь ключей!</string>
+ <string name="api_update_account_text">Ключ, сохранённый для данного аккаунта, был удалён. Пожалуйста, выберите другой!\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>
+ <string name="api_select_pub_keys_missing_text">Для данных лиц ключи не найдены:</string>
+ <string name="api_select_pub_keys_dublicates_text">Для данных лиц имеется более одного ключа: </string>
<string name="api_select_pub_keys_text">Пожалуйста, проверьте получателей!</string>
+ <string name="api_select_pub_keys_text_no_user_ids">Пожалуйста, выберите получателей!</string>
<string name="api_error_wrong_signature">Проверка подписи пакета не удалась! Если вы установили программу из другого источника, отзовите для неё доступ к этой программе или обновите право доступа.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Отправить как QR код</string>
@@ -329,89 +433,352 @@
<item quantity="few">%d ключей выбрано.</item>
<item quantity="other">%d ключей выбрано.</item>
</plurals>
+ <string name="key_list_empty_text1">Ключи не найдены!</string>
+ <string name="key_list_filter_show_all">Показать все ключи</string>
+ <string name="key_list_filter_show_certified">Показать только сертифицированные ключи</string>
<!--Key view-->
<string name="key_view_action_edit">Изменить ключ</string>
+ <string name="key_view_action_encrypt">Зашифровать текст</string>
+ <string name="key_view_action_encrypt_files">файлы</string>
<string name="key_view_action_certify">Сертифицировать</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>
<string name="user_id_info_revoked_title">Аннулировано</string>
+ <string name="user_id_info_revoked_text">Этот идентификатор отозван владельцем ключа. Он больше недействителен.</string>
+ <string name="user_id_info_certified_title">Сертифицировано</string>
+ <string name="user_id_info_certified_text">Этот идентификатор был сертифицирован Вами</string>
+ <string name="user_id_info_uncertified_title">Не сертифицирован</string>
+ <string name="user_id_info_uncertified_text">Этот идентификатор не был заверен. Нет гарантии, что он принадлежит этому человеку.</string>
<string name="user_id_info_invalid_title">Недействительно</string>
<string name="user_id_info_invalid_text">Что-то не так с идентификатором!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Изменить пароль</string>
<string name="edit_key_action_add_identity">Добавить идентификатор</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>Изменить на основной идентификатор</item>
+ <item>Отозвать идентификатор</item>
+ </string-array>
+ <string-array name="edit_key_edit_user_id_revert_revocation">
+ <item>Отменить отзыв</item>
+ </string-array>
+ <string name="edit_key_edit_user_id_revoked">Этот идентификатор был отозван. Это не может быть отменено.</string>
+ <string name="edit_key_edit_subkey_title">Выберите действие!</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>Изменить срок годности</item>
+ <item>Отозвать доп. ключ</item>
+ <item>Отделить доп. ключ</item>
+ </string-array>
+ <string name="edit_key_new_subkey">новый доп. ключ</string>
+ <string name="edit_key_select_flag">Пожалуйста, выберите хотя бы один флаг!</string>
+ <string name="edit_key_error_add_identity">Добавьте хотя бы один идентификатор!</string>
+ <string name="edit_key_error_add_subkey">Добавьте хотя бы один доп. ключ!</string>
<!--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">Вы указали следующие данные:</string>
+ <string name="create_key_final_robot_text">Создание ключа займет некоторое время, можете пока выпить чашечку кофе...</string>
+ <string name="create_key_rsa">(3 доп. ключа, RSA, 4096 bit)</string>
+ <string name="create_key_custom">(произвольная конфигурация ключа)</string>
<string name="create_key_text">Укажите полное имя, адрес почты и придумайте надежный пароль.</string>
<string name="create_key_hint_full_name">Полное имя, напр. Иван Хлестаков</string>
+ <string name="create_key_edit">Изменить конфигурацию ключа</string>
<!--View key-->
- <string name="view_key_revoked">Этот ключ был аннулирован!</string>
- <string name="view_key_expired">Срок годности ключа истёк!</string>
+ <string name="view_key_revoked">Аннулирован: Ключ не должен использоваться когда-либо в будущем!</string>
+ <string name="view_key_expired">Срок годности истёк: Контакт должен продлить срок!</string>
+ <string name="view_key_expired_secret">Срок годности истёк: Вы можете продлить срок, изменив ключ!</string>
+ <string name="view_key_my_key">Мой ключ</string>
+ <string name="view_key_verified">Подтвержденный ключ</string>
+ <string name="view_key_unverified">Достоверность: Сканируйте QR код для проверки ключа!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Ключи</string>
+ <string name="nav_encrypt_decrypt">Зашифровать/Расшифровать</string>
<string name="nav_apps">Приложения</string>
<string name="drawer_open">Открыть панель навигации</string>
<string name="drawer_close">Закрыть панель навигации</string>
<string name="my_keys">Мои ключи</string>
<!--hints-->
+ <string name="encrypt_content_edit_text_hint">Напишите текст</string>
<!--certs-->
<string name="cert_default">по умолчанию</string>
<string name="cert_none">нет</string>
+ <string name="cert_casual">случайный</string>
+ <string name="cert_positive">положительный</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>
+ <string name="cert_verify_unavailable">ключ недоступен</string>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <string name="msg_internal_error">Внутренняя ошибка!</string>
+ <string name="msg_cancelled">Действие отменено.</string>
<!--Import Public log entries-->
<string name="msg_ip_apply_batch">Выполнение пакетной вставки.</string>
<string name="msg_ip_bad_type_secret">Попытка импорта секретной связки как публичной. Это ошибка, пожалуйста, сообщите об этом.</string>
<string name="msg_ip_delete_old_fail">Старый ключ не удален (создать новый?)</string>
<string name="msg_ip_delete_old_ok">Старый ключ удален из базы</string>
- <string name="msg_ip_encode_fail">Действие прервано из-за ошибки кодировки</string>
+ <string name="msg_ip_encode_fail">Действие прервано из-за ошибки кодирования</string>
+ <string name="msg_ip_error_io_exc">Действие прервано из-за ошибки ввода/вывода</string>
+ <string name="msg_ip_error_op_exc">Действие прервано из-за ошибки базы</string>
+ <string name="msg_ip_error_remote_ex">Действие прервано из-за внутренней ошибки</string>
<string name="msg_ip">Импорт связки публичных ключей %s</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_master_expired">Срок годности связки ключей истек %s</string>
+ <string name="msg_ip_master_expires">Срок годности связки ключей истекает %s</string>
+ <string name="msg_ip_master_flags_unspecified">Основные флаги: не определены (подразумеваются все)</string>
+ <string name="msg_ip_master_flags_cesa">Основные флаги: сертифицировать, зашифровать, подписать, удостоверить</string>
+ <string name="msg_ip_master_flags_cesx">Основные флаги: сертифицировать, зашифровать, подписать</string>
+ <string name="msg_ip_master_flags_cexa">Основные флаги: сертифицировать, зашифровать, удостоверить</string>
+ <string name="msg_ip_master_flags_cexx">Основные флаги: сертифицировать, зашифровать</string>
+ <string name="msg_ip_master_flags_cxsa">Основные флаги: сертифицировать, подписать, удостоверить</string>
+ <string name="msg_ip_master_flags_cxsx">Основные флаги: сертифицировать, подписать</string>
+ <string name="msg_ip_master_flags_cxxa">Основные флаги: сертифицировать, удостоверить</string>
+ <string name="msg_ip_master_flags_cxxx">Основные флаги: сертифицировать</string>
+ <string name="msg_ip_master_flags_xesa">Основные флаги: зашифровать, подписать, удостоверить</string>
+ <string name="msg_ip_master_flags_xesx">Основные флаги: зашифровать, подписать</string>
+ <string name="msg_ip_master_flags_xexa">Основные флаги: зашифровать, удостоверить</string>
+ <string name="msg_ip_master_flags_xexx">Основные флаги: зашифровать</string>
+ <string name="msg_ip_master_flags_xxsa">Основные флаги: подписать, удостоверить</string>
+ <string name="msg_ip_master_flags_xxsx">Основные флаги: подписать</string>
+ <string name="msg_ip_master_flags_xxxa">Основные флаги: удостоверить</string>
+ <string name="msg_ip_master_flags_xxxx">Основные флаги: нет</string>
+ <string name="msg_ip_merge_public">Объединение импортированных данных с существующей связкой публичных ключей</string>
+ <string name="msg_ip_merge_secret">Объединение импортированных данных с существующей связкой публичных ключей</string>
+ <string name="msg_ip_subkey">Обработка доп. ключа %s</string>
+ <string name="msg_ip_subkey_expired">Срок годности доп. ключа истек %s</string>
+ <string name="msg_ip_subkey_expires">Срок годности доп. ключа истекает %s</string>
+ <string name="msg_ip_subkey_flags_unspecified">Флаги доп. ключа: не определены (подразумеваются все)</string>
+ <string name="msg_ip_subkey_flags_cesa">Флаги доп. ключа: сертифицировать, зашифровать, подписать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_cesx">Флаги доп. ключа: сертифицировать, зашифровать, подписать</string>
+ <string name="msg_ip_subkey_flags_cexa">Флаги доп. ключа: сертифицировать, зашифровать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_cexx">Флаги доп. ключа: сертифицировать, зашифровать</string>
+ <string name="msg_ip_subkey_flags_cxsa">Флаги доп. ключа: сертифицировать, подписать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_cxsx">Флаги доп. ключа: сертифицировать, подписать</string>
+ <string name="msg_ip_subkey_flags_cxxa">Флаги доп. ключа: сертифицировать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_cxxx">Флаги доп. ключа: сертифицировать</string>
+ <string name="msg_ip_subkey_flags_xesa">Флаги доп. ключа: зашифровать, подписать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_xesx">Флаги доп. ключа: зашифровать, подписать</string>
+ <string name="msg_ip_subkey_flags_xexa">Флаги доп. ключа: зашифровать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_xexx">Флаги доп. ключа: зашифровать</string>
+ <string name="msg_ip_subkey_flags_xxsa">Флаги доп. ключа: подписать, удостоверить</string>
+ <string name="msg_ip_subkey_flags_xxsx">Флаги доп. ключа: подписать</string>
+ <string name="msg_ip_subkey_flags_xxxa">Флаги доп. ключа: удостоверить</string>
+ <string name="msg_ip_subkey_flags_xxxx">Флаги доп. ключа: нет</string>
<string name="msg_ip_success">Успешно внесена связка публичных ключей</string>
+ <string name="msg_ip_success_identical">Связка ключей не содержит новых данных, нечего делать</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_cert_nonrevoke">Уже есть неотзываемый сертификат, пропускаем.</string>
+ <string name="msg_ip_uid_cert_old">Сертификат старее, чем предыдущий, пропускаем.</string>
+ <string name="msg_ip_uid_cert_new">Сертификат более новый, заменяем предыдущий.</string>
+ <string name="msg_ip_uid_cert_good">Найден хороший сертификат %1$s</string>
+ <string name="msg_ip_uid_cert_good_revoke">Найдено аннулирование хорошего сертификата %1$s</string>
+ <string name="msg_ip_uid_classifying_zero">Сортировка пользовательских ID (доверенные ключи недоступны)</string>
+ <string name="msg_ip_uid_reorder">Переупорядочение пользовательских ID</string>
+ <string name="msg_ip_uid_processing">Обработка id %s</string>
+ <string name="msg_ip_uid_revoked">id аннулирован</string>
+ <string name="msg_ip_uat_processing_image">Обработка атрибута пользователя типа изображения</string>
+ <string name="msg_ip_uat_processing_unknown">Обработка атрибута пользователя неизвестного типа</string>
+ <string name="msg_ip_uat_cert_bad">Плохой сертификат!</string>
+ <string name="msg_ip_uat_cert_error">Ошибка обработки сертификата!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Уже есть неотзываемый сертификат, пропускаем.</string>
+ <string name="msg_ip_uat_cert_old">Сертификат старее, чем предыдущий, пропускаем.</string>
+ <string name="msg_ip_uat_cert_new">Сертификат более новый, заменяем предыдущий.</string>
+ <string name="msg_ip_uat_cert_good">Найден хороший сертификат %1$s</string>
+ <string name="msg_ip_uat_cert_good_revoke">Найдено аннулирование хорошего сертификата %1$s</string>
+ <string name="msg_ip_uat_classifying">Сортировка атрибутов пользователя</string>
+ <string name="msg_ip_uat_revoked">Атрибут пользователя аннулирован</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>
- <string name="msg_is_importing_subkeys">Обработка секретных ключей</string>
+ <string name="msg_is_importing_subkeys">Обработка секретных доп. ключей</string>
+ <string name="msg_is_error_io_exc">Ошибка кодирования ключа</string>
+ <string name="msg_is_merge_public">Объединение импортированных данных с существующей связкой публичных ключей</string>
+ <string name="msg_is_merge_secret">Объединение импортированных данных с существующей связкой публичных ключей</string>
+ <string name="msg_is_merge_special">Объединение само-сертифицированных данных из публичных ключей</string>
+ <string name="msg_is_pubring_generate">Формирование публичной связки из секретной связки</string>
+ <string name="msg_is_subkey_nonexistent">Доп. ключ %s недоступен в секретном ключе</string>
+ <string name="msg_is_subkey_ok">Секретный доп. ключ %s отмечен как доступный</string>
+ <string name="msg_is_subkey_empty">Секретный доп. ключ %s отмечен как доступный, с пустым паролем</string>
+ <string name="msg_is_subkey_pin">Секретный доп. ключ %s отмечен как доступный, с PIN</string>
+ <string name="msg_is_subkey_stripped">Секретный доп. ключ %s отмечен как отделённый</string>
+ <string name="msg_is_subkey_divert">Секретный доп. ключ %s отмечен как \'переключенный на смарт-карту/NFC\'</string>
+ <string name="msg_is_success_identical">Связка ключей не содержит новых данных, нечего делать</string>
<string name="msg_is_success">Успешно добавлена связка секретных ключей</string>
<!--Keyring Canonicalization log entries-->
+ <string name="msg_kc_public">Нормализация публичной связки %s</string>
+ <string name="msg_kc_secret">Нормализация секретной связки %s</string>
+ <string name="msg_kc_error_v3">Это ключ OpenPGP версии 3, которая устарела и больше не поддерживается!</string>
+ <string name="msg_kc_error_no_uid">Связка не имеет допустимых ID!</string>
+ <string name="msg_kc_error_master_algo">Основной ключ использует неизвестный алгоритм (%s)!</string>
+ <string name="msg_kc_error_dup_key">Доп. ключ %s найден дважды в связке. Связка некорректна, не импортируется!</string>
<string name="msg_kc_master">Подготовка основного ключа</string>
+ <string name="msg_kc_master_bad_type">Удаление сертификата основного ключа неизвестного типа (%s)</string>
+ <string name="msg_kc_master_bad_local">Удаление сертификата основного ключа с \"локальным\" флагом</string>
+ <string name="msg_kc_master_bad_err">Удаление плохого сертификата основного ключа</string>
+ <string name="msg_kc_master_bad_time">Удаление сертификата аннулирования ключа с отметкой времени, находящейся в будущем</string>
+ <string name="msg_kc_master_bad_type_uid">Удаление сертификата ID в некорректном положении</string>
+ <string name="msg_kc_master_bad">Удаление плохого сертификата основного ключа</string>
+ <string name="msg_kc_master_local">Удаление сертификата основного ключа с \"локальным\" флагом</string>
+ <string name="msg_kc_revoke_dup">Удаление лишнего сертификата аннулирования ключа</string>
+ <string name="msg_kc_notation_dup">Удаление лишнего сертификата обозначения</string>
+ <string name="msg_kc_notation_empty">Удаление пустого сертификата обозначения</string>
+ <string name="msg_kc_sub">Обработка доп. ключа %s</string>
+ <string name="msg_kc_sub_bad">Удаление неверного сертификата связывания доп. ключа</string>
+ <string name="msg_kc_sub_bad_err">Удаление плохого сертификата связывания доп. ключа</string>
+ <string name="msg_kc_sub_bad_local">Удаление сертификата связывания доп. ключа с \"локальным\" флагом</string>
+ <string name="msg_kc_sub_bad_keyid">Несоответствие id издателя связывания доп. ключа</string>
+ <string name="msg_kc_sub_bad_time">Удаление сертификата связывания доп. ключа с отметкой времени, находящейся в будущем</string>
+ <string name="msg_kc_sub_bad_type">Неизвестный тип сертификата доп. ключа: %s</string>
+ <string name="msg_kc_sub_dup">Удаление лишнего сертификата связывания доп. ключа</string>
+ <string name="msg_kc_sub_primary_bad">Удаление сертификата связывания доп. ключа вследствие неверного основного сертификата связывания</string>
+ <string name="msg_kc_sub_primary_bad_err">Удаление сертификата связывания доп. ключа вследствие плохого основного сертификата связывания</string>
+ <string name="msg_kc_sub_primary_none">Удаление сертификата связывания доп. ключа вследствие отсутствующего основного сертификата связывания</string>
+ <string name="msg_kc_sub_no_cert">Нет допустимого сертификата для %s, удаление из связки</string>
+ <string name="msg_kc_sub_revoke_bad_err">Удаление плохого сертификата аннулирования доп. ключа</string>
+ <string name="msg_kc_sub_revoke_bad">Удаление плохого сертификата аннулирования доп. ключа</string>
+ <string name="msg_kc_sub_revoke_dup">Удаление лишнего сертификата аннулирования доп. ключа</string>
+ <string name="msg_kc_sub_unknown_algo">Доп. ключ использует неизвестный алгоритм, не импортируется...</string>
+ <string name="msg_kc_sub_algo_bad_encrpyt">Доп. ключ имеет флаг использования шифрования, но алгоритм не подходит для шифрования.</string>
+ <string name="msg_kc_sub_algo_bad_sign">Доп. ключ имеет флаг использования подписи, но алгоритм не подходит для подписи.</string>
+ <string name="msg_kc_success">Связка нормализована успешно, нет изменений</string>
+ <string name="msg_kc_success_bad_and_red">Связка нормализована успешно, удалено %1$s ошибочных и %2$s лишних сертификатов</string>
+ <string name="msg_kc_uid_bad_err">Удаление плохого самостоятельного сертификата для ID \'%s\'</string>
+ <string name="msg_kc_uid_bad_local">Удаление сертификата ID с \'локальным\' флагом</string>
+ <string name="msg_kc_uid_bad_time">Удаление ID с отметкой времени, находящейся в будущем</string>
+ <string name="msg_kc_uid_bad_type">Удаление сертификата ID неизвестного типа (%s)</string>
+ <string name="msg_kc_uid_bad">Удаление плохого самостоятельного сертификата для ID \'%s\'</string>
+ <string name="msg_kc_uid_cert_dup">Удаление устаревшего самостоятельного сертификата для ID \'%s\'</string>
+ <string name="msg_kc_uid_foreign">Удаление \'%s\' несоответствующего сертификата ID</string>
+ <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>
+ <string name="msg_kc_uid_dup">Удаление повторяющегося ID \'%s\'. Связка содержит их два. Это может привести к отсутствию сертификатов!</string>
+ <string name="msg_kc_uid_warn_encoding">ID пользователя не соответствует UTF-8!</string>
+ <string name="msg_kc_uat_jpeg">Обработка атрибута пользователя типа JPEG</string>
+ <string name="msg_kc_uat_unknown">Обработка атрибута пользователя неизвестного типа</string>
+ <string name="msg_kc_uat_bad_err">Удаление плохого самостоятельного сертификата для атрибута пользователя</string>
+ <string name="msg_kc_uat_bad_local">Удаление сертификата атрибута пользователя с \'локальным\' флагом</string>
+ <string name="msg_kc_uat_bad_time">Удаление атрибута пользователя с отметкой времени, находящейся в будущем</string>
+ <string name="msg_kc_uat_bad_type">Удаление сертификата атрибута пользователя неизвестного типа (%s)</string>
+ <string name="msg_kc_uat_bad">Удаление плохого самостоятельного сертификата для атрибута пользователя</string>
+ <string name="msg_kc_uat_cert_dup">Удаление устаревшего самостоятельного сертификата для атрибута пользователя</string>
+ <string name="msg_kc_uat_dup">Удаление повторяющегося атрибута пользователя. Связка содержит их два. Это может привести к отсутствию сертификатов!</string>
+ <string name="msg_kc_uat_foreign">Удаление несоответствующего сертификата атрибута пользователя</string>
+ <string name="msg_kc_uat_revoke_dup">Удаление лишнего сертификата аннулирования для атрибута пользователя</string>
+ <string name="msg_kc_uat_revoke_old">Удаление устаревшего сертификата аннулирования для атрибута пользователя</string>
+ <string name="msg_kc_uat_no_cert">Нет допустимого самостоятельного сертификата для атрибута пользователя, удаление из связки</string>
+ <string name="msg_kc_uat_remove">Удаление неверного атрибута пользователя</string>
+ <string name="msg_kc_uat_warn_encoding">ID пользователя не соответствует UTF-8!</string>
<!--Keyring merging log entries-->
+ <string name="msg_mg_error_secret_dummy">Найден новый публичный доп. ключ, но фиктивное создание секретного доп. ключа не поддерживается!</string>
+ <string name="msg_mg_error_heterogeneous">Попытка объединить связки с различными отпечатками!</string>
+ <string name="msg_mg_error_encode">Фатальная ошибка кодирования подписи!</string>
+ <string name="msg_mg_public">Объединение с публичной связкой %s</string>
+ <string name="msg_mg_secret">Объединение с секретной связкой %s</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">Связки должны создаваться с хотя бы одним ID пользователя!</string>
+ <string name="msg_cr_error_no_certify">Основной ключ должен иметь флаг сертификата!</string>
+ <string name="msg_cr_error_null_expiry">Срок годности не может быть \'такой же как раньше\' при создании ключа. Это программная ошибка, пожалуйста, сообщите об этом!</string>
+ <string name="msg_cr_error_keysize_512">Размер ключа должен быть больше или равен 512!</string>
+ <string name="msg_cr_error_no_curve">Не задан размер ключа! Это программная ошибка, пожалуйста, сообщите об этом!</string>
+ <string name="msg_cr_error_no_keysize">Не задана эллиптическая кривая! Это программная ошибка, пожалуйста, сообщите об этом!</string>
+ <string name="msg_cr_error_internal_pgp">Внутренняя ошибка OpenPGP!</string>
+ <string name="msg_cr_error_unknown_algo">Выбран неизвестный алгоритм! Это программная ошибка, пожалуйста, сообщите об этом!</string>
+ <string name="msg_cr_error_flags_dsa">Выбраны плохие флаги ключа, DSA не может быть использован для шифрования!</string>
+ <string name="msg_cr_error_flags_elgamal">Выбраны плохие флаги ключа, ElGamal не может быть использован для подписи!</string>
+ <string name="msg_cr_error_flags_ecdsa">Выбраны плохие флаги ключа, ECDSA не может быть использован для шифрования!</string>
+ <string name="msg_cr_error_flags_ecdh">Выбраны плохие флаги ключа, ECDH не может быть использован для подписи!</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_integrity">Внутренняя ошибка, сбой проверки целостности!</string>
+ <string name="msg_mf_error_master_none">Не найден основной сертификат! (Все отозваны?)</string>
+ <string name="msg_mf_error_revoked_primary">Аннулированные идентификаторы не могут быть основными!</string>
+ <string name="msg_mf_error_pgp">Внутренняя ошибка OpenPGP!</string>
<string name="msg_mf_error_sig">Ошибка подписи!</string>
+ <string name="msg_mf_master">Изменение основного сертификата</string>
+ <string name="msg_mf_passphrase_key">Перешифрование доп. ключа %s новым паролем</string>
+ <string name="msg_mf_primary_new">Создание нового сертификата для основного идентификатора</string>
+ <string name="msg_mf_subkey_change">Изменение доп. ключа %s</string>
+ <string name="msg_mf_error_subkey_missing">Попытка работы с отсутствующим доп. ключом %s!</string>
+ <string name="msg_mf_subkey_new">Добавление нового доп. ключа типа %s</string>
+ <string name="msg_mf_subkey_new_id">Идентификатор нового доп. ключа: %s</string>
+ <string name="msg_mf_error_past_expiry">Срок годности не может быть в прошлом!</string>
+ <string name="msg_mf_subkey_revoke">Аннулирование доп. ключа %s</string>
<string name="msg_mf_success">Связка успешно изменена</string>
+ <string name="msg_mf_uid_primary">Изменение основного идентификатора на %s</string>
+ <string name="msg_mf_uid_error_empty">Идентификатор пользователя не может быть пустой</string>
<string name="msg_mf_unlock_error">Ошибка разблокирования связки!</string>
<string name="msg_mf_unlock">Разблокирование связки</string>
<!--Consolidate-->
+ <string name="msg_con">Консолидация базы данных</string>
+ <string name="msg_con_error_bad_state">Консолидация началась но база не кэширована! Это программная ошибка, пожалуйста, сообщите об этом.</string>
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
+ <string name="msg_pr_error_key_not_found">Ключ не найден!</string>
<!--Other messages used in OperationLogs-->
+ <string name="msg_ek_error_divert">Редактирование NFC ключей (еще) не поддерживается!</string>
+ <string name="msg_ek_error_not_found">Ключ не найден!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_ok">OK</string>
+ <string name="msg_dc_unlocking">Разблокировка секретного ключа</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_compressing">Подготовка сжатия</string>
+ <string name="msg_pse_encrypting">Шифрование данных</string>
+ <string name="msg_pse_error_bad_passphrase">Неправильный пароль!</string>
+ <string name="msg_pse_error_nfc">Ошибка данных NFC!</string>
+ <string name="msg_pse_error_pgp">Внутренняя ошибка OpenPGP!</string>
+ <string name="msg_crt_saving">Сохранение связки</string>
+ <string name="msg_crt_unlock">Разблокировка основного ключа</string>
+ <string name="msg_crt_warn_not_found">Ключ не найден!</string>
+ <string name="msg_crt_warn_cert_failed">Создание сертификата не удалось!</string>
+ <string name="msg_crt_upload_success">Ключ успешно загружен на сервер</string>
+ <string name="msg_export_error_fopen">Ошибка открытия файла!</string>
+ <string name="msg_export_error_db">Ошибка базы данных!</string>
+ <string name="msg_export_error_io">Ошибка ввода/вывода!</string>
+ <string name="msg_del_error_empty">Нет данных для удаления!</string>
+ <string name="msg_acc_saved">Аккаунт сохранен</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">часть загруженного файла содержит данные OpenPGP, но это не ключ</item>
<item quantity="few">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
<item quantity="other">части загруженного файла содержат данные OpenPGP, но это не ключ</item>
</plurals>
<!--PassphraseCache-->
+ <string name="passp_cache_notif_keys">Кэшированные пароли:</string>
+ <string name="passp_cache_notif_clear">Очистить кэш</string>
+ <string name="passp_cache_notif_pwd">Пароль</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>
<!--unsorted-->
<string name="section_certifier_id">Кем подписан</string>
<string name="section_cert">Детали сертификации</string>
@@ -423,10 +790,24 @@
<string name="label_cert_type">Тип</string>
<string name="error_key_not_found">Ключ не найден!</string>
<string name="error_key_processing">Ошибка обработки ключа!</string>
+ <string name="key_unavailable">недоступно</string>
<string name="title_view_cert">Просмотреть детали сертификации</string>
<string name="unknown_algorithm">неизв.</string>
<string name="can_sign_not">не для подписания</string>
<string name="error_no_encrypt_subkey">Нет доп. ключа для шифрования!</string>
<string name="contact_show_key">Показать ключ (%s)</string>
- <!--First Time-->
+ <string name="key_colon">Ключ:</string>
+ <string name="btn_start_exchange">Начать обмен</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">Выберите метод разблокировки</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Введите пароль</string>
+ <string name="passphrase">Пароль</string>
+ <string name="passphrase_invalid">Неверный пароль</string>
+ <string name="passphrase_again">Еще раз</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="unlocked">Разблокирован</string>
+ <string name="nfc_settings">Настройки</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index 6eeb7bd72..5d6581bfc 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -9,13 +9,11 @@
<string name="title_encrypt_text">Šifriraj besedilo</string>
<string name="title_encrypt_files">Šifriraj datoteko</string>
<string name="title_decrypt">Dešifriraj</string>
- <string name="title_unlock">Geslo</string>
+ <string name="title_unlock">Odkleni ključ</string>
<string name="title_add_subkey">Dodaj podključ</string>
<string name="title_edit_key">Uredi ključ</string>
- <string name="title_preferences">Nastavitve</string>
<string name="title_cloud_search_preferences">Nastavitve iskanja v oblaku</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_share_fingerprint_with">Deli prstni odtis z...</string>
<string name="title_share_key">Deli ključ z...</string>
@@ -221,7 +219,6 @@
<string name="error_could_not_extract_private_key">ne morem izvleči zasebnega ključa</string>
<!--errors without preceeding Error:-->
<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_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>
<!--results shown after decryption/verification-->
@@ -253,6 +250,7 @@
<string name="progress_generating_elgamal">ustvarjanje novega ElGamal ključa...</string>
<string name="progress_generating_ecdsa">ustvarjanje novega ECDSA ključa...</string>
<string name="progress_generating_ecdh">ustvarjanje novega ECDH ključa...</string>
+ <string name="progress_modify_primaryuid">menjavam glavno identiteto uporabnika...</string>
<string name="progress_modify_subkeychange">spreminjanje podključev...</string>
<string name="progress_modify_subkeyrevoke">preklicevanje podključev...</string>
<string name="progress_modify_subkeyadd">dodajanje podključev...</string>
@@ -323,7 +321,6 @@
<string name="import_qr_code_wrong">Koda QR je deformirana! Poskusite znova!</string>
<string name="import_qr_code_too_short_fingerprint">Prstni odtis je prekratek (&lt; 16 znakov)</string>
<!--Generic result toast-->
- <string name="view_log">Poglej dnevnik</string>
<!--Import result toast-->
<string name="import_error_nothing">Nič za uvoziti.</string>
<string name="import_error_nothing_cancelled">Uvoz preklican.</string>
@@ -349,7 +346,6 @@
<string name="api_settings_delete_account">Izbriši račun</string>
<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_settings">Nastavitve</string>
<string name="api_settings_accounts_empty">S to aplikacijo ni povezan noben račun</string>
<string name="api_register_allow">Dovoli dostop</string>
@@ -384,6 +380,8 @@
<string name="user_id_info_revoked_title">Preklican</string>
<string name="user_id_info_revoked_text">Lastnik ključa je preklical to identiteto. Ta ni več veljavna.</string>
<string name="user_id_info_invalid_title">Neveljaven</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Zamenjaj geslo</string>
<string name="edit_key_action_add_identity">Dodaj identiteto</string>
@@ -399,12 +397,8 @@
<string name="create_key_passphrases_not_equal">Gesli se ne ujemata</string>
<string name="create_key_hint_full_name">Polno ime, npr. Janez Vzorec</string>
<!--View key-->
- <string name="view_key_expired">Ta ključ je pretekel!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Ključi</string>
- <string name="nav_encrypt_text">Šifriraj besedilo</string>
- <string name="nav_encrypt_files">Šifriraj datoteke</string>
- <string name="nav_decrypt">Dešifriraj</string>
<string name="nav_apps">Aplikacije</string>
<string name="drawer_open">Odprite navigacijski poteznik</string>
<string name="drawer_close">Zaprite navigacijski poteznik</string>
@@ -447,11 +441,6 @@
<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_master_bad_err">Umikam slab certifikat za preklic zbirk ključev</string>
- <string name="msg_kc_master_bad_local">Umikam certifikat za preklic zbirk ključev z oznako \"lokalno\"</string>
- <string name="msg_kc_master_bad_time">Umikam certifikat za preklic zbirk ključev s časovno znamko v prihodnosti</string>
- <string name="msg_kc_master_bad_type">Umikam certifikat glavnega ključa neznanega tipa (%s)</string>
- <string name="msg_kc_master_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>
@@ -465,10 +454,14 @@
<string name="msg_mf_subkey_revoke">Preklic podključa %s</string>
<!--Consolidate-->
<string name="msg_con_db_clear">Čiščenje podatkovne baze</string>
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_not_found">Ključ ni bil najden!</string>
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<string name="msg_crt_warn_not_found">Ključ ni bil najden!</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">Del naložene datoteke je veljavnen objekt OpenPGP a ni ključ.</item>
@@ -481,6 +474,11 @@
<string name="passp_cache_notif_n_keys">OpenKeychain pomni gesla: %d</string>
<string name="passp_cache_notif_keys">Zapomnjena gesla:</string>
<string name="passp_cache_notif_pwd">Geslo</string>
+ <!--First Time-->
+ <string name="first_time_text1">Vzemite si svojo zasebnost nazaj v svoje roke z OpenKeychain!</string>
+ <string name="first_time_create_key">Ustvari zasebni ključ</string>
+ <string name="first_time_import_key">Uvozi iz datoteke</string>
+ <string name="first_time_skip">Preskoči nastavitev</string>
<!--unsorted-->
<string name="section_certifier_id">Overovitelj</string>
<string name="section_cert">Podrobnosti potrdil</string>
@@ -502,9 +500,8 @@
<string name="error_no_encrypt_subkey">Ni nobenega podključa za šifriranje!</string>
<string name="contact_show_key">Prikaži ključ (%s)</string>
<string name="key_colon">Ključ:</string>
- <!--First Time-->
- <string name="first_time_text1">Vzemite si svojo zasebnost nazaj v svoje roke z OpenKeychain!</string>
- <string name="first_time_create_key">Ustvari zasebni ključ</string>
- <string name="first_time_import_key">Uvozi iz datoteke</string>
- <string name="first_time_skip">Preskoči nastavitev</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-sr/strings.xml b/OpenKeychain/src/main/res/values-sr/strings.xml
index b4955b9eb..11639e2eb 100644
--- a/OpenKeychain/src/main/res/values-sr/strings.xml
+++ b/OpenKeychain/src/main/res/values-sr/strings.xml
@@ -9,13 +9,13 @@
<string name="title_encrypt_text">Шифруј текст</string>
<string name="title_encrypt_files">Шифруј фајлове</string>
<string name="title_decrypt">Дешифруј</string>
- <string name="title_unlock">Лозинка</string>
+ <string name="title_unlock">Откључај кључ</string>
<string name="title_add_subkey">Додај поткључ</string>
<string name="title_edit_key">Уреди кључ</string>
<string name="title_preferences">Поставке</string>
<string name="title_cloud_search_preferences">Поставке клауд претраге</string>
<string name="title_api_registered_apps">Апликације</string>
- <string name="title_key_server_preference">Поставка сервера кључева</string>
+ <string name="title_key_server_preference">Сервери кључева</string>
<string name="title_change_passphrase">Измени лозинку</string>
<string name="title_share_fingerprint_with">Подели отисак са…</string>
<string name="title_share_key">Подели кључ са…</string>
@@ -36,6 +36,7 @@
<string name="title_create_key">Направи кључ</string>
<string name="title_exchange_keys">Размена кључева</string>
<string name="title_advanced_key_info">Напредни подаци о кључу</string>
+ <string name="title_keys">Кључеви</string>
<!--section-->
<string name="section_user_ids">Идентитети</string>
<string name="section_keys">Поткључеви</string>
@@ -55,6 +56,8 @@
<string name="section_decrypt_files">Фајлови</string>
<string name="section_decrypt_text">Текст</string>
<string name="section_certs">Сертификати</string>
+ <string name="section_encrypt">Шифровање</string>
+ <string name="section_decrypt">Дешифровање</string>
<!--button-->
<string name="btn_decrypt_verify_file">Дешифруј, овери и сачувај фајл</string>
<string name="btn_decrypt_verify_message">Дешифруј и овери поруку</string>
@@ -68,15 +71,19 @@
<string name="btn_export_to_server">Отпреми на сервер кључева</string>
<string name="btn_next">Следеће</string>
<string name="btn_back">Назад</string>
+ <string name="btn_no">Не</string>
+ <string name="btn_match">Отисци се поклапају</string>
<string name="btn_lookup_key">Потражи кључ</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>
<string name="btn_add_share_decrypted_text">Подели дешифрован текст</string>
- <string name="btn_decrypt_clipboard">Дешифруј са клипборда</string>
+ <string name="btn_decrypt_clipboard">Дешифруј текст са клипборда</string>
<string name="btn_decrypt_and_verify">и овери потписе</string>
<string name="btn_decrypt_files">Дешифруј фајлове</string>
+ <string name="btn_encrypt_files">Шифруј фајлове</string>
+ <string name="btn_encrypt_text">Шифруј текст</string>
<!--menu-->
<string name="menu_preferences">Поставке</string>
<string name="menu_help">Помоћ</string>
@@ -85,13 +92,16 @@
<string name="menu_create_key">Направи ми кључ</string>
<string name="menu_import_existing_key">Увези из фајла</string>
<string name="menu_search">Претрага</string>
+ <string name="menu_nfc_preferences">НФЦ поставке</string>
<string name="menu_beam_preferences">Поставке Снопа</string>
<string name="menu_key_edit_cancel">Одустани</string>
<string name="menu_encrypt_to">Шифруј у…</string>
<string name="menu_select_all">Изабери све</string>
<string name="menu_add_keys">Додај кључеве</string>
+ <string name="menu_search_cloud">Клауд претрага</string>
<string name="menu_export_all_keys">Извези све кључеве</string>
<string name="menu_advanced">Прикажи напредне податке</string>
+ <string name="menu_certify_fingerprint">Овери поређењем отисака</string>
<!--label-->
<string name="label_message">Порука</string>
<string name="label_file">Фајл</string>
@@ -108,7 +118,7 @@
<string name="label_write_version_header_summary">Уписује „OpenKeychain v3.0“ у ОпенПГП потписе, шифровани текст и извезене кључеве</string>
<string name="label_use_default_yubikey_pin">Користи подразумевани Јубикључ ПИН</string>
<string name="label_use_num_keypad_for_yubikey_pin">Користи бројчану тастатуру за Јубикључ ПИН</string>
- <string name="label_label_use_default_yubikey_pin_summary">Користи подразумевани ПИН (123456) за приступ Јуби-кључевима преко НФЦ-а</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Користи подразумевани ПИН (123456) за приступ Јубикључевима преко НФЦ-а</string>
<string name="label_asymmetric_from">Потписник:</string>
<string name="label_to">Шифруј за:</string>
<string name="label_delete_after_encryption">Обриши фајл након шифровања</string>
@@ -191,7 +201,9 @@
<string name="passphrase_must_not_be_empty">Унесите лозинку.</string>
<string name="passphrase_for_symmetric_encryption">Симетрично шифровање.</string>
<string name="passphrase_for">Унесите лозинку за „%s“</string>
+ <string name="pin_for">Унесите ПИН за „%s“</string>
<string name="yubikey_pin_for">Унесите ПИН за приступ Јубикључу за „%s“</string>
+ <string name="nfc_text">Држите Јубикључ на полеђини вашег уређаја.</string>
<string name="file_delete_confirmation">Желите ли заиста да обришете\n%s?</string>
<string name="file_delete_successful">Брисање је успело.</string>
<string name="no_file_selected">Најпре изаберите фајл.</string>
@@ -244,7 +256,8 @@
<string name="error_could_not_extract_private_key">нисам могао да извучем лични кључ</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Потребан вам је Андроид 4.1 да бисте користили Андроидову могућност НФЦ Снопа!</string>
- <string name="error_nfc_needed">НФЦ није доступан на вашем уређају!</string>
+ <string name="error_nfc_needed">НФЦ мора бити укључен!</string>
+ <string name="error_beam_needed">Бим мора бити укључен</string>
<string name="error_nothing_import">Нема нађених кључева!</string>
<string name="error_contacts_key_id_missing">Добављање ИД кључа из контаката није успело!</string>
<string name="error_generic_report_bug">Дошло је до опште грешке, направите нови извештај о грешци за Отворени кључарник.</string>
@@ -282,6 +295,7 @@
<string name="progress_modify">модификујем привезак…</string>
<string name="progress_modify_unlock">откључавам привезак…</string>
<string name="progress_modify_adduid">додајем корисничке ИД-ове…</string>
+ <string name="progress_modify_adduat">додајем корисничке атрибуте…</string>
<string name="progress_modify_revokeuid">опозивам корисничке ИД-ове…</string>
<string name="progress_modify_primaryuid">мењам примарни кориснички ИД…</string>
<string name="progress_modify_subkeychange">модификујем поткључеве…</string>
@@ -357,8 +371,9 @@
<string name="import_qr_code_wrong">Бар-код деформисан! Покушајте поново!</string>
<string name="import_qr_code_too_short_fingerprint">Отисак је прекратак (&lt; 16 знакова)</string>
<string name="import_qr_code_button">Очитај бар-код</string>
+ <string name="import_qr_code_text">Усмерите камеру на бар-код!</string>
<!--Generic result toast-->
- <string name="view_log">Прикажи дневник</string>
+ <string name="view_log">Детаљи</string>
<string name="with_warnings">, са упозорењима</string>
<string name="with_cancelled">, док није отказано</string>
<!--Import result toast-->
@@ -439,7 +454,6 @@
<string name="intent_send_encrypt">Шифруј помоћу Отвореног кључарника</string>
<string name="intent_send_decrypt">Дешифруј помоћу Отвореног кључарника</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>
@@ -455,7 +469,9 @@
<string name="api_settings_delete_account">Обриши налог</string>
<string name="api_settings_package_name">Име пакета</string>
<string name="api_settings_package_signature">СХА-256 потписа пакета</string>
- <string name="api_settings_accounts">Налози</string>
+ <string name="api_settings_accounts">Налози (застарели АПИ)</string>
+ <string name="api_settings_advanced">Напредни подаци</string>
+ <string name="api_settings_allowed_keys">Дозвољени кључеви</string>
<string name="api_settings_settings">Поставке</string>
<string name="api_settings_key">Кључ налога:</string>
<string name="api_settings_accounts_empty">Нема налога придружених овој апликацији.</string>
@@ -495,6 +511,7 @@
<string name="key_view_tab_share">Подели</string>
<string name="key_view_tab_keys">Поткључеви</string>
<string name="key_view_tab_certs">Сертификати</string>
+ <string name="key_view_tab_keybase">Keybase.io</string>
<string name="user_id_info_revoked_title">Опозван</string>
<string name="user_id_info_revoked_text">Власник кључа је опозвао овај идентитет. Више није исправан.</string>
<string name="user_id_info_certified_title">Оверен</string>
@@ -503,6 +520,13 @@
<string name="user_id_info_uncertified_text">Овај идентитет још није оверен. Не можете бити сигурни да идентитет заиста одговара одређеној особи.</string>
<string name="user_id_info_invalid_title">Неисправан</string>
<string name="user_id_info_invalid_text">Нешто није у реду са овим идентитетом!</string>
+ <!--Key trust-->
+ <string name="key_trust_it_is_yours">Ово је један од ваших кључева!</string>
+ <string name="key_trust_revoked">Власни је опозвао овај кључ. Не бисте требали да се поуздате у њега.</string>
+ <string name="key_trust_expired">Овај кључ је истекао. Не бисте требали да се поуздате у њега.</string>
+ <string name="key_trust_start_cloud_search">Почни претрагу</string>
+ <!--keybase proof stuff-->
+ <string name="keybase_verify">Овери</string>
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Измени лозинку</string>
<string name="edit_key_action_add_identity">Додај идентитет</string>
@@ -538,13 +562,15 @@
<string name="create_key_hint_full_name">Пуно име, нпр. Петар Петровић</string>
<string name="create_key_edit">Промени конфигурацију кључа</string>
<!--View key-->
- <string name="view_key_revoked">Овај кључ је опозван!</string>
- <string name="view_key_expired">Овај кључ је истекао!</string>
+ <string name="view_key_revoked">Опозван: кључ више не смије бити коришћен!</string>
+ <string name="view_key_expired">Истекао: контакт мора да продужи ваљаност кључа!</string>
+ <string name="view_key_expired_secret">Истекао: можете да уредите кључ и продужите му ваљаност!</string>
+ <string name="view_key_my_key">Мој кључ</string>
+ <string name="view_key_verified">Оверен кључ</string>
+ <string name="view_key_unverified">Неоверен: очитајте бар-код да бисте оверили кључ!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Кључеви</string>
- <string name="nav_encrypt_text">Шифруј текст</string>
- <string name="nav_encrypt_files">Шифруј фајлове</string>
- <string name="nav_decrypt">Дешифруј</string>
+ <string name="nav_encrypt_decrypt">Шифруј/дешифруј</string>
<string name="nav_apps">Апликације</string>
<string name="drawer_open">Отвори навигациону фиоку</string>
<string name="drawer_close">Затвори навигациону фиоку</string>
@@ -570,7 +596,7 @@
<string name="msg_ip_delete_old_fail">Ниједан стари кључ није обрисан (прављење новог?)</string>
<string name="msg_ip_delete_old_ok">Обрисан стари кључ из базе података</string>
<string name="msg_ip_encode_fail">Радња није успела због грешке кодирања</string>
- <string name="msg_ip_error_io_exc">Радња није успела због улазно/излазне грешке</string>
+ <string name="msg_ip_error_io_exc">Радња није успела због У/И грешке</string>
<string name="msg_ip_error_op_exc">Радња није успела због грешке базе података</string>
<string name="msg_ip_error_remote_ex">Радња није успела због унутрашње грешке</string>
<string name="msg_ip">Увозим јавни привезак %s</string>
@@ -643,6 +669,22 @@
<string name="msg_ip_uid_reorder">Поново разврставам корисничке ИД-ове</string>
<string name="msg_ip_uid_processing">Обрађујем кориснички ИД %s</string>
<string name="msg_ip_uid_revoked">Кориснички ИД је опозван</string>
+ <string name="msg_ip_uat_processing_image">Обрађујем кориснички атрибут типа слике</string>
+ <string name="msg_ip_uat_processing_unknown">Обрађујем кориснички атрибут непознатог типа</string>
+ <string name="msg_ip_uat_cert_bad">Наиђох на лош сертификат!</string>
+ <string name="msg_ip_uat_cert_error">Грешка обраде сертификата!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Већ постоји неопозив сертификат, прескачем.</string>
+ <string name="msg_ip_uat_cert_old">Сертификат је старији него претходни, прескачем.</string>
+ <string name="msg_ip_uat_cert_new">Сертификат је новији, замењујем претходни.</string>
+ <string name="msg_ip_uat_cert_good">Нађен добар сертификат од %1$s</string>
+ <string name="msg_ip_uat_cert_good_revoke">Нађен добар опозив сертификата од %1$s</string>
+ <plurals name="msg_ip_uat_certs_unknown">
+ <item quantity="one">Игноришем сертификат издат од непознатог јавног кључа</item>
+ <item quantity="few">Игноришем %s сертификата издата од непознатих јавних кључева</item>
+ <item quantity="other">Игноришем %s сертификата издатих од непознатих јавних кључева</item>
+ </plurals>
+ <string name="msg_ip_uat_classifying">Разврставам корисничке атрибуте</string>
+ <string name="msg_ip_uat_revoked">Кориснички атрибут је опозван</string>
<string name="msg_is_bad_type_public">Покушај увоза јавног привеска као тајног. Ово је грешка, поднесите извештај!</string>
<string name="msg_is_bad_type_uncanon">Покушај увоза привеска без каноникализације. Ово је грешка, поднесите извештај!</string>
<!--Import Secret log entries-->
@@ -657,6 +699,7 @@
<string name="msg_is_subkey_nonexistent">Поткључ %s није доступан у тајном кључу</string>
<string name="msg_is_subkey_ok">Тајни поткључ %d означен као доступан</string>
<string name="msg_is_subkey_empty">Тајни поткључ %d означен као доступан, без лозинке</string>
+ <string name="msg_is_subkey_pin">Тајни поткључ %s означен као доступан, са ПИНом</string>
<string name="msg_is_subkey_stripped">Тајни поткључ %d означен као огољен</string>
<string name="msg_is_subkey_divert">Тајни поткључ %d означен као „преусмерен на картицу/НФЦ“</string>
<string name="msg_is_success_identical">Привезак не садржи нове податке, нема шта да се ради</string>
@@ -669,13 +712,16 @@
<string name="msg_kc_error_master_algo">Главни кључ користи непознат алгоритам (%s)!</string>
<string name="msg_kc_error_dup_key">Поткључ %s се појављује два пута у привеску. Привезак је деформисан, не увозим!</string>
<string name="msg_kc_master">Обрађујем главни кључ</string>
- <string name="msg_kc_master_bad_err">Уклањам лош сертификат опозива привеска</string>
- <string name="msg_kc_master_bad_local">Уклањам сертификат опозива привеска са заставицом „локални“</string>
- <string name="msg_kc_master_bad_time">Уклањам сертификат опозива привеска са временском ознаком у будућности</string>
<string name="msg_kc_master_bad_type">Уклањам сертификат главног кључа непознатог типа (%s)</string>
+ <string name="msg_kc_master_bad_local">Уклањам сертификат главног кључа са заставицом „локални“</string>
+ <string name="msg_kc_master_bad_err">Уклањам лош сертификат главног кључа</string>
+ <string name="msg_kc_master_bad_time">Уклањам сертификат опозива привеска са временском ознаком у будућности</string>
<string name="msg_kc_master_bad_type_uid">Уклањам сертификат корисничког ИД-а са погрешног места</string>
- <string name="msg_kc_master_bad">Уклањам лош сертификат опозива привеска</string>
+ <string name="msg_kc_master_bad">Уклањам лош сертификат главног кључа</string>
+ <string name="msg_kc_master_local">Уклањам сертификат главног кључа са заставицом „локални“</string>
<string name="msg_kc_revoke_dup">Уклањам сувишни сертификат опозива привеска</string>
+ <string name="msg_kc_notation_dup">Уклањам сувишни сертификат нотације</string>
+ <string name="msg_kc_notation_empty">Уклањам празни сертификат нотације</string>
<string name="msg_kc_sub">Обрађујем поткључ %s</string>
<string name="msg_kc_sub_bad">Уклањам неисправан повезујући сертификат поткључа</string>
<string name="msg_kc_sub_bad_err">Уклањам лош повезујући сертификат поткључа</string>
@@ -717,8 +763,23 @@
<string name="msg_kc_uid_revoke_old">Уклањам застарели сертификат опозива за кориснички ИД „%s“</string>
<string name="msg_kc_uid_no_cert">Није нађен исправан сопствени сертификат за кориснички ИД „%s“, уклањам из прстена</string>
<string name="msg_kc_uid_remove">Уклањам неисправан кориснички ИД „%s“</string>
- <string name="msg_kc_uid_dup">Уклањам дупли кориснички ИД „%s“. Тајни кључ је садржао два. Ово може да доведе до недостајућих сертификата!</string>
+ <string name="msg_kc_uid_dup">Уклањам дупли кориснички ИД „%s“. Привезак је садржао два. Ово може да доведе до недостајућих сертификата!</string>
<string name="msg_kc_uid_warn_encoding">ИД корисника није потврђен као УТФ-8!</string>
+ <string name="msg_kc_uat_jpeg">Обрађујем кориснички атрибут ЈПЕГ типа</string>
+ <string name="msg_kc_uat_unknown">Обрађујем кориснички атрибут непознатог типа</string>
+ <string name="msg_kc_uat_bad_err">Уклањам лош сопствени сертификат за кориснички атрибут</string>
+ <string name="msg_kc_uat_bad_local">Уклањам сертификат корисничког атрибута са заставицом „локални“</string>
+ <string name="msg_kc_uat_bad_time">Уклањам кориснички атрибут са временском ознаком у будућности</string>
+ <string name="msg_kc_uat_bad_type">Уклањам сертификат корисничког атрибута непознатог типа (%s)</string>
+ <string name="msg_kc_uat_bad">Уклањам лош сопствени сертификат за кориснички атрибут</string>
+ <string name="msg_kc_uat_cert_dup">Уклањам застарели сопствени сертификат за кориснички атрибут</string>
+ <string name="msg_kc_uat_dup">Уклањам дупли кориснички атрибут. Привезак је садржао два. Ово може да доведе до недостајућих сертификата!</string>
+ <string name="msg_kc_uat_foreign">Уклањам страни сертификат корисничког атрибута од</string>
+ <string name="msg_kc_uat_revoke_dup">Уклањам сувишни сертификат опозива за кориснички атрибут</string>
+ <string name="msg_kc_uat_revoke_old">Уклањам застарели сертификат опозива за кориснички атрибут</string>
+ <string name="msg_kc_uat_no_cert">Није нађен исправан сопствени сертификат за кориснички атрибут, уклањам из прстена</string>
+ <string name="msg_kc_uat_remove">Уклањам неисправан кориснички атрибут</string>
+ <string name="msg_kc_uat_warn_encoding">ИД корисника није потврђен као УТФ-8!</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_secret_dummy">Нађен је нови јавни поткључ, али генерисање лажног тајног поткључа није подржано!</string>
<string name="msg_mg_error_heterogeneous">Покушај спајања привезака са различитим отисцима!</string>
@@ -737,7 +798,7 @@
<string name="msg_cr_error_keysize_512">Величина кључа мора бити већа или једнака 512!</string>
<string name="msg_cr_error_no_curve">Није наведена величина кључа! Ово је грешка у програмирању, поднесите извештај о грешци!</string>
<string name="msg_cr_error_no_keysize">Није наведена елиптичка крива! Ово је грешка у програмирању, поднесите извештај о грешци!</string>
- <string name="msg_cr_error_internal_pgp">Унутрашња ПГП грешка!</string>
+ <string name="msg_cr_error_internal_pgp">Унутрашња ОпенПГП грешка!</string>
<string name="msg_cr_error_unknown_algo">Одређен је непознат алгоритам! Ово је грешка у програмирању, поднесите извештај о грешци!</string>
<string name="msg_cr_error_flags_dsa">Изабране су погрешне заставице кључа, ДСА не може да се користи за шифровање!</string>
<string name="msg_cr_error_flags_elgamal">Изабране су погрешне заставице кључа, Елгамал не може да се користи за потписивање!</string>
@@ -745,6 +806,7 @@
<string name="msg_cr_error_flags_ecdh">Изабране су погрешне заставице кључа, ЕЦДХ не може да се користи за потписивање!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Модификујем привезак %s</string>
+ <string name="msg_mf_error_divert_serial">Серијски број преусмеравање-у-картицу кључа мора бити 16 бита. Ово је грешка у програмирању, поднесите извештај о грешци!</string>
<string name="msg_mf_error_encode">Изузетак кодирања!</string>
<string name="msg_mf_error_fingerprint">Стварни отисак кључа не одговара очекиваном!</string>
<string name="msg_mf_error_keyid">Нема ИД-а кључа. Ово је унутрашња грешка, поднесите извештај о грешци!</string>
@@ -752,13 +814,16 @@
<string name="msg_mf_error_master_none">Нема главног сертификата на којем треба да се изврши радња! (Сви су опозвани?)</string>
<string name="msg_mf_error_noexist_primary">Наведен је лош примарни кориснички ИД!</string>
<string name="msg_mf_error_noexist_revoke">Наведен је лош кориснички ИД за опозив!</string>
+ <string name="msg_mf_error_restricted">Покушај извршења ограничене радње без лозинке! Ово је грешка у програмирању, поднесите извештај о грешци!</string>
<string name="msg_mf_error_revoked_primary">Опозвани кориснички ИД-ови не могу бити примарни!</string>
<string name="msg_mf_error_null_expiry">Датум истицања не може бити „исти као пре“ на стварању поткључа. Ово је грешка у програмирању, поднесите извештај о грешци!</string>
<string name="msg_mf_error_passphrase_master">Кобна грешка дешифровања главног кључа! Ово је вероватно грешка у програмирању, поднесите извештај о грешци!</string>
- <string name="msg_mf_error_pgp">Унутрашња ПГП грешка!</string>
+ <string name="msg_mf_error_pgp">Унутрашња ОпенПГП грешка!</string>
<string name="msg_mf_error_sig">Изузетак потписа!</string>
<string name="msg_mf_master">Модификујем главне сертификате</string>
- <string name="msg_mf_passphrase">Мењам лозинку за поткључ…</string>
+ <string name="msg_mf_notation_empty">Додајем празни пакет нотације</string>
+ <string name="msg_mf_notation_pin">Додајем ПИН пакет нотације</string>
+ <string name="msg_mf_passphrase">Мењам лозинку за привезак</string>
<string name="msg_mf_passphrase_key">Поново шифрујем поткључ %s новом лозинком</string>
<string name="msg_mf_passphrase_empty_retry">Постављање нове лозинке није успело, покушавам поново са празном старом лозинком</string>
<string name="msg_mf_passphrase_fail">Не могу да променим лозинку за поткључ! (Да ли се разликује од оне у осталим кључевима?)</string>
@@ -775,7 +840,10 @@
<string name="msg_mf_uid_add">Додајем кориснички ИД %s</string>
<string name="msg_mf_uid_primary">Постављам примарни кориснички ИД на %s</string>
<string name="msg_mf_uid_revoke">Опозивам кориснички ИД %s</string>
- <string name="msg_mf_uid_error_empty">Кориснички ИД не смије бити празан!</string>
+ <string name="msg_mf_uid_error_empty">Кориснички ИД не сме бити празан!</string>
+ <string name="msg_mf_uat_error_empty">Кориснички атрибут не сме бити празан!</string>
+ <string name="msg_mf_uat_add_image">Додајем кориснички атрибут типа слике</string>
+ <string name="msg_mf_uat_add_unknown">Додајем кориснички атрибут непознатог типа</string>
<string name="msg_mf_unlock_error">Грешка откључавања привеска!</string>
<string name="msg_mf_unlock">Откључавам привезак</string>
<!--Consolidate-->
@@ -796,6 +864,7 @@
<string name="msg_con_error_public">Грешка поновног увоза јавних кључева!</string>
<string name="msg_con_error_secret">Грешка поновног увоза тајних кључева!</string>
<string name="msg_con_recover">Настављам процес учвршћивања</string>
+ <string name="msg_con_recursive">Прескачем рекурзивно учвршћивање</string>
<string name="msg_con_recover_unknown">Настављам процес учвршћивања из непознатог стања</string>
<plurals name="msg_con_reimport_public">
<item quantity="one">Поново увозим %d јавни кључ</item>
@@ -811,6 +880,19 @@
<string name="msg_con_reimport_secret_skip">Нема тајних кључева за поновно увожење, прескачем…</string>
<string name="msg_con_warn_delete_public">Изузетак при брисању фајла јавног кеша</string>
<string name="msg_con_warn_delete_secret">Изузетак при брисању фајла тајног кеша</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">Извршавам радњу на кључу</string>
+ <string name="msg_ed_caching_new">Кеширам нову лозинку</string>
+ <string name="msg_ed_error_no_parcel">Недостаје SaveKeyringParcel! (ово је грешка, пријавите је)</string>
+ <string name="msg_ed_error_key_not_found">Кључ није нађен!</string>
+ <string name="msg_ed_fetching">Добављам кључ за модификовање (%s)</string>
+ <string name="msg_ed_success">Радња на кључу је успела</string>
+ <!--Promote key-->
+ <string name="msg_pr">Унапређујем јавни кључ у тајни кључ</string>
+ <string name="msg_pr_error_already_secret">Кључ је већ тајни кључ!</string>
+ <string name="msg_pr_error_key_not_found">Кључ није нађен!</string>
+ <string name="msg_pr_fetching">Добављам кључ за модификовање (%s)</string>
+ <string name="msg_pr_success">Кључ успешно унапређен</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">Уређивање НФЦ кључева (још) није подржано!</string>
<string name="msg_ek_error_dummy">Не могу да уредим кључ са огољеним главним кључем!</string>
@@ -819,11 +901,13 @@
<string name="msg_dc_askip_no_key">Подаци нису шифровани познатим кључем, прескачем…</string>
<string name="msg_dc_askip_not_allowed">Подаци нису шифровани дозвољеним кључем, прескачем…</string>
<string name="msg_dc_asym">Нађен блок асиметрично шифрованих података за кључ %s</string>
+ <string name="msg_dc_charset">Нађено заглавље кодирања: „%s“</string>
<string name="msg_dc_clear_data">Обрађујем дословне податке</string>
<string name="msg_dc_clear_decompress">Распакујем компресоване податке</string>
<string name="msg_dc_clear_meta_file">Име фајла: %s</string>
<string name="msg_dc_clear_meta_mime">МИМЕ тип: %s</string>
<string name="msg_dc_clear_meta_size">Величина: %s</string>
+ <string name="msg_dc_clear_meta_size_unknown">Величина није позната</string>
<string name="msg_dc_clear_meta_time">Време измене: %s</string>
<string name="msg_dc_clear_signature_bad">Провера потписа НИЈЕ У РЕДУ!</string>
<string name="msg_dc_clear_signature_check">Оверавам податке потписа</string>
@@ -833,11 +917,12 @@
<string name="msg_dc_error_bad_passphrase">Грешка откључавања кључа, погрешна лозинка!</string>
<string name="msg_dc_error_extract_key">Непозната грешка откључавања кључа!</string>
<string name="msg_dc_error_integrity_check">Грешка провере интегритета!</string>
+ <string name="msg_dc_error_integrity_missing">Недостаје провера интегритета! Ово може да се деси ако је апликација за шифровање застарела, или услед напада старијег издања.</string>
<string name="msg_dc_error_invalid_siglist">Нису нађени исправни подаци потписа!</string>
<string name="msg_dc_error_io">Наиђох на У/И изузетак током радње!</string>
<string name="msg_dc_error_no_data">Шифровани подаци нису нађени у току!</string>
<string name="msg_dc_error_no_key">Подаци шифровани познатим тајним кључем нису нађени у току!</string>
- <string name="msg_dc_error_pgp_exception">Наиђох на ПГП изузетак током радње!</string>
+ <string name="msg_dc_error_pgp_exception">Наиђох на ОпенПГП изузетак током радње!</string>
<string name="msg_dc_integrity_check_ok">Провера интегритета је у реду!</string>
<string name="msg_dc_ok_meta_only">Само су метаподаци затражени, прескачем дешифровање</string>
<string name="msg_dc_ok">У реду</string>
@@ -852,30 +937,52 @@
<string name="msg_dc_trail_sym">Наиђох на пратеће симетрично шифроване податке</string>
<string name="msg_dc_trail_unknown">Наиђох на пратеће податке непознатог типа</string>
<string name="msg_dc_unlocking">Откључавам тајни кључ</string>
+ <!--Messages for VerifySignedLiteralData operation-->
+ <string name="msg_vl">Почињем проверу потписа</string>
+ <string name="msg_vl_clear_meta_file">Име фајла: %s</string>
+ <string name="msg_vl_clear_meta_mime">МИМЕ тип: %s</string>
+ <string name="msg_vl_clear_meta_time">Време измене: %s</string>
+ <string name="msg_vl_clear_meta_size">Величина: %s</string>
+ <string name="msg_vl_clear_signature_check">Оверавам податке потписа</string>
+ <string name="msg_vl_error_integrity_check">Грешка провере интегритета!</string>
+ <string name="msg_vl_ok">У реду</string>
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">Припремам јавне кључеве за шифровање</string>
- <string name="msg_se_clearsign_only">Потписивање обичног текста није подржано!</string>
- <string name="msg_se_compressing">Припремам компресију</string>
- <string name="msg_se_encrypting">Шифрујем податке</string>
- <string name="msg_se_error_bad_passphrase">Нетачна лозинка!</string>
- <string name="msg_se_error_io">Наиђох на У/И изузетак током радње!</string>
- <string name="msg_se_error_key_sign">Изабрани кључ за потписивање не може да потпише податке!</string>
- <string name="msg_se_error_sign_key">Грешка добављања кључа за потписивање!</string>
- <string name="msg_se_error_nfc">Грешка НФЦ података!</string>
- <string name="msg_se_error_no_passphrase">Лозинка није дата!</string>
- <string name="msg_se_error_pgp">Унутрашња ПГП грешка!</string>
- <string name="msg_se_error_sig">Наиђох на изузетак ПГП потписивања!</string>
- <string name="msg_se_error_unlock">Непозната грешка откључавања кључа!</string>
- <string name="msg_se_key_ok">Шифрујем за кључ: %s</string>
- <string name="msg_se_key_unknown">Недостаје кључ за шифровање: %s</string>
- <string name="msg_se_key_warn">Лош кључ за шифровање: %s</string>
- <string name="msg_se_ok">Радња потписивања/шифровања је успела!</string>
- <string name="msg_se_pending_nfc">Потребан је НФЦ токен. захтевам унос корисника…</string>
- <string name="msg_se_pending_passphrase">Потребна је лозинка, захтевам унос корисника…</string>
- <string name="msg_se_signing">Потписујем податке (без шифровања)</string>
- <string name="msg_se_sigcrypting">Шифрујем податке са потписом</string>
- <string name="msg_se">Почињем радњу потписивања и/или шифровања</string>
- <string name="msg_se_symmetric">Припремам симетрично шифровање</string>
+ <string name="msg_se">Почињем радњу потписивања/шифровања</string>
+ <string name="msg_se_input_bytes">Обрађујем улаз низа бајтова</string>
+ <string name="msg_se_input_uri">Обрађујем УРИ унос</string>
+ <string name="msg_se_error_no_input">Унос није дат!</string>
+ <string name="msg_se_error_input_uri_not_found">Грешка отварања УРИ-ја за читање!</string>
+ <string name="msg_se_error_output_uri_not_found">Грешка отварања УРИ-ја за упис!</string>
+ <string name="msg_se_error_too_many_inputs">Наведено више улаза него излаза! Ово је грешка у програмирању, поднесите извештај о грешци!</string>
+ <string name="msg_se_warn_output_left">Преостали су излази али нема улаза. Ово је вероватно грешка у програмирању, поднесите извештај о грешци.</string>
+ <string name="msg_se_success">Радња потписивања/шифровања је успела!</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">Припремам јавне кључеве за шифровање</string>
+ <string name="msg_pse_clearsign_only">Потписивање обичног текста није подржано!</string>
+ <string name="msg_pse_compressing">Припремам компресију</string>
+ <string name="msg_pse_encrypting">Шифрујем податке</string>
+ <string name="msg_pse_error_bad_passphrase">Нетачна лозинка!</string>
+ <string name="msg_pse_error_hash_algo">Овај кључ не подржава захтевани хеш алгоритам!</string>
+ <string name="msg_pse_error_io">Наиђох на У/И изузетак током радње!</string>
+ <string name="msg_pse_error_key_sign">Изабрани кључ за потписивање не може да потпише податке!</string>
+ <string name="msg_pse_error_sign_key">Грешка добављања кључа за потписивање!</string>
+ <string name="msg_pse_error_nfc">Грешка НФЦ података!</string>
+ <string name="msg_pse_error_no_passphrase">Лозинка није дата!</string>
+ <string name="msg_pse_error_pgp">Унутрашња ОпенПГП грешка!</string>
+ <string name="msg_pse_error_sig">Наиђох на изузетак ОпенПГП потписивања!</string>
+ <string name="msg_pse_error_unlock">Непозната грешка откључавања кључа!</string>
+ <string name="msg_pse_key_ok">Шифрујем за кључ: %s</string>
+ <string name="msg_pse_key_unknown">Недостаје кључ за шифровање: %s</string>
+ <string name="msg_pse_key_warn">Лош кључ за шифровање: %s</string>
+ <string name="msg_pse_ok">Радња потписивања/шифровања је успела!</string>
+ <string name="msg_pse_pending_nfc">Потребан је НФЦ токен, захтевам унос корисника…</string>
+ <string name="msg_pse_pending_passphrase">Потребна је лозинка, захтевам унос корисника…</string>
+ <string name="msg_pse_signing">Потписујем податке (без шифровања)</string>
+ <string name="msg_pse_signing_cleartext">Правим обични текстуални потпис</string>
+ <string name="msg_pse_signing_detached">Правим одвојени потпис</string>
+ <string name="msg_pse_sigcrypting">Шифрујем податке са потписом</string>
+ <string name="msg_pse">Почињем радњу потписивања и/или шифровања</string>
+ <string name="msg_pse_symmetric">Припремам симетрично шифровање</string>
<string name="msg_crt_certifying">Генеришем сертификате</string>
<string name="msg_crt_certify_all">Оверавам све корисничке ИД-ове за кључ %s</string>
<plurals name="msg_crt_certify_some">
@@ -883,6 +990,7 @@
<item quantity="few">Оверавам %1$d корисничка ИД-а за кључ %2$s</item>
<item quantity="other">Оверавам %1$d корисничких ИД-ова за кључ %2$s</item>
</plurals>
+ <string name="msg_crt_error_self">Не могу да издам овакав самопотписани сертификат!</string>
<string name="msg_crt_error_master_not_found">Главни кључ није нађен!</string>
<string name="msg_crt_error_nothing">Нема оверених кључева!</string>
<string name="msg_crt_error_unlock">Грешка откључавања главног кључа!</string>
@@ -913,6 +1021,7 @@
<string name="msg_import_fingerprint_ok">Провера отиска је у реду</string>
<string name="msg_import_merge">Спајам добављене податке</string>
<string name="msg_import_error">Радња увоза није успела!</string>
+ <string name="msg_import_error_io">Радња увоза није успела због У/И грешке!</string>
<string name="msg_import_partial">Радња увоза је успела, са грешкама!</string>
<string name="msg_import_success">Радња увоза је успела!</string>
<plurals name="msg_export">
@@ -929,7 +1038,8 @@
<string name="msg_export_error_uri_open">Грешка отварања УРИ тока!</string>
<string name="msg_export_error_storage">Складиште није спремно за уписивање!</string>
<string name="msg_export_error_db">Грешка базе података!</string>
- <string name="msg_export_error_io">Улазно/излазна грешка!</string>
+ <string name="msg_export_error_io">Грешка улаза/излаза!</string>
+ <string name="msg_export_error_key">Грешка предобраде података кључа!</string>
<string name="msg_export_success">Радња извоза је успела</string>
<string name="msg_del_error_empty">Нема ништа за брисање!</string>
<string name="msg_del_error_multi_secret">Тајне кључеве можете брисати само појединачно!</string>
@@ -970,6 +1080,11 @@
<string name="passp_cache_notif_keys">Кеширане лозинке:</string>
<string name="passp_cache_notif_clear">Очисти кеш</string>
<string name="passp_cache_notif_pwd">Лозинка</string>
+ <!--First Time-->
+ <string name="first_time_text1">Преузмите вашу приватност помоћу Отвореног кључарника!</string>
+ <string name="first_time_create_key">Направи ми кључ</string>
+ <string name="first_time_import_key">Увези из фајла</string>
+ <string name="first_time_skip">Прескочи поставу</string>
<!--unsorted-->
<string name="section_certifier_id">Сертификатор</string>
<string name="section_cert">Детаљи сертификата</string>
@@ -979,6 +1094,8 @@
<string name="certs_text">Приказани су само потврђени сопствени сертификати и потврђени сертификати направљени вашим кључем.</string>
<string name="section_uids_to_certify">Идентитети за</string>
<string name="certify_text">Кључеви које увозите садрже „идентитете“: имена и е-адресе. Одредите за оверу само оне који одговарају ономе што очекујете.</string>
+ <string name="certify_fingerprint_text">Упоредите приказани отисак, знак по знак, са оним приказаним на другаревом уређају.</string>
+ <string name="certify_fingerprint_text2">Да ли се приказани отисци поклапају?</string>
<string name="label_revocation">Разлог опозива</string>
<string name="label_verify_status">Стање овере</string>
<string name="label_cert_type">Тип</string>
@@ -1000,9 +1117,32 @@
<string name="error_multi_not_supported">Упис више фајлова није подржан. Ово је ограничење у текућем издању Андроида.</string>
<string name="key_colon">Кључ:</string>
<string name="exchange_description">Да бисте почели размену кључева, са десне стране изаберите број учесника и додирните дугме „Почни размену“.\n\nБиће вам постављено још два питања да би се осигурало да су само исправни учесници у размени и да су њихови отисци тачни.</string>
- <!--First Time-->
- <string name="first_time_text1">Преузмите вашу приватност помоћу Отвореног кључарника!</string>
- <string name="first_time_create_key">Направи ми кључ</string>
- <string name="first_time_import_key">Увези из фајла</string>
- <string name="first_time_skip">Прескочи поставу</string>
+ <string name="btn_start_exchange">Почни размену</string>
+ <string name="user_id_none"><![CDATA[<ништа>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <string name="title_unlock_method">Одредите методу откључавања</string>
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Унесите лозинку</string>
+ <string name="passphrase">Лозинка</string>
+ <string name="noPassphrase">Без лозинке</string>
+ <string name="no_passphrase_set">Лозинка није постављена</string>
+ <string name="passphrases_match">Лозинке се поклапају</string>
+ <string name="passphrase_saved">Лозинка сачувана</string>
+ <string name="passphrase_invalid">Лозинка није исправна</string>
+ <string name="missing_passphrase">Недостаје лозинка</string>
+ <string name="passphrase_again">Поновите</string>
+ <string name="lockpattern">Шаблон закључавања</string>
+ <string name="lockpatternNFC">НФЦ + шаблон</string>
+ <string name="unlock_method">Метода откључавања</string>
+ <string name="set_passphrase">Постави лозинку</string>
+ <string name="draw_lockpattern">Нацртајте шаблон</string>
+ <string name="nfc_title">НФЦ</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Погрешна ознака. Покушајте поново.</string>
+ <string name="enable_nfc">Активирајте НФЦ у поставкама</string>
+ <string name="no_nfc_support">Овај уређај не подржава НФЦ</string>
+ <string name="nfc_write_succesful">Успешно уписах на НФЦ ознаку</string>
+ <string name="unlocked">Откључан</string>
+ <string name="nfc_settings">Поставке</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml
index 7d414d3f0..a24fe7ee7 100644
--- a/OpenKeychain/src/main/res/values-sv/strings.xml
+++ b/OpenKeychain/src/main/res/values-sv/strings.xml
@@ -9,13 +9,13 @@
<string name="title_encrypt_text">Kryptera text</string>
<string name="title_encrypt_files">Kryptera filer</string>
<string name="title_decrypt">Dekryptera</string>
- <string name="title_unlock">Lösenordsfras</string>
+ <string name="title_unlock">Lås upp nyckel</string>
<string name="title_add_subkey">Lägg till undernyckel</string>
<string name="title_edit_key">Redigera nyckel</string>
<string name="title_preferences">Inställningar</string>
<string name="title_cloud_search_preferences">Inställningar för molnsökning</string>
<string name="title_api_registered_apps">Appar</string>
- <string name="title_key_server_preference">Inställningar för nyckelserver</string>
+ <string name="title_key_server_preference">Nyckelservrar</string>
<string name="title_change_passphrase">Ändra lösenordsfras</string>
<string name="title_share_fingerprint_with">Dela fingeravtryck med…</string>
<string name="title_share_key">Dela nyckel med…</string>
@@ -34,6 +34,9 @@
<string name="title_help">Hjälp</string>
<string name="title_log_display">Logg</string>
<string name="title_create_key">Skapa nyckel</string>
+ <string name="title_exchange_keys">Utbyt nycklar</string>
+ <string name="title_advanced_key_info">Avancerad nyckelinfo</string>
+ <string name="title_keys">Nycklar</string>
<!--section-->
<string name="section_user_ids">Identiteter</string>
<string name="section_keys">Undernycklar</string>
@@ -52,6 +55,9 @@
<string name="section_key_to_certify">Nyckel att certifiera</string>
<string name="section_decrypt_files">Filer</string>
<string name="section_decrypt_text">Text</string>
+ <string name="section_certs">Certifikat</string>
+ <string name="section_encrypt">Kryptera</string>
+ <string name="section_decrypt">Dekryptera</string>
<!--button-->
<string name="btn_decrypt_verify_file">Dekryptera, verifiera och spara fil</string>
<string name="btn_decrypt_verify_message">Dekryptera och verifiera meddelande</string>
@@ -71,21 +77,25 @@
<string name="btn_create_key">Skapa nyckel</string>
<string name="btn_add_files">Lägg till fil(er)</string>
<string name="btn_add_share_decrypted_text">Dela dekrypterad text</string>
- <string name="btn_decrypt_clipboard">Dekryptera från urklipp</string>
+ <string name="btn_decrypt_clipboard">Dekryptera text från urklipp</string>
<string name="btn_decrypt_and_verify">och verifiera signaturer</string>
<string name="btn_decrypt_files">Dekryptera filer</string>
+ <string name="btn_encrypt_files">Kryptera filer</string>
+ <string name="btn_encrypt_text">Kryptera text</string>
<!--menu-->
<string name="menu_preferences">Inställningar</string>
<string name="menu_help">Hjälp</string>
<string name="menu_export_key">Exportera till fil</string>
<string name="menu_delete_key">Radera nyckel</string>
<string name="menu_create_key">Skapa min nyckel</string>
+ <string name="menu_import_existing_key">Importera från fil</string>
<string name="menu_search">Sök</string>
<string name="menu_beam_preferences">Beam-inställningar</string>
<string name="menu_key_edit_cancel">Avbryt</string>
<string name="menu_encrypt_to">Kryptera till…</string>
<string name="menu_select_all">Markera alla</string>
<string name="menu_add_keys">Lägg till nycklar</string>
+ <string name="menu_search_cloud">Sök i molnet</string>
<string name="menu_export_all_keys">Exportera alla nycklar</string>
<string name="menu_advanced">Visa avancerad information</string>
<!--label-->
@@ -102,8 +112,9 @@
<string name="label_file_ascii_armor">Aktivera ASCII-format</string>
<string name="label_write_version_header">Låt andra se att du använder OpenKeychain</string>
<string name="label_write_version_header_summary">Skriver \'OpenKeychain v2.7\' till OpenPGP-signaturer, chiffertext och exporterade nycklar.</string>
- <string name="label_use_default_yubikey_pin">Använd förvald Yubikey PIN</string>
- <string name="label_label_use_default_yubikey_pin_summary">Använder förvald PIN (123456) för att få åtkomst till Yubikeys via NFC</string>
+ <string name="label_use_default_yubikey_pin">Använd förvald YubiKey PIN</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Använd numeriska tangentbordet för YubiKey PIN</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Använder förvald PIN (123456) för att få åtkomst till YubiKeys via NFC</string>
<string name="label_asymmetric_from">Signerat av:</string>
<string name="label_to">Kryptera till:</string>
<string name="label_delete_after_encryption">Radera fil efter kryptering</string>
@@ -116,7 +127,7 @@
<string name="label_message_compression">Meddelandekompression</string>
<string name="label_file_compression">Filkompression</string>
<string name="label_keyservers">Nyckelservrar</string>
- <string name="label_key_id">nyckel-ID</string>
+ <string name="label_key_id">Nyckel-ID</string>
<string name="label_expiry">Går ut</string>
<string name="label_usage">Användning</string>
<string name="label_key_size">Nyckelstorlek</string>
@@ -125,10 +136,13 @@
<string name="label_name">Namn</string>
<string name="label_comment">Kommentar</string>
<string name="label_email">E-post</string>
+ <string name="label_send_key">Synkronisera med molnet</string>
<string name="label_fingerprint">Fingeravtryck</string>
<string name="expiry_date_dialog_title">Ställ in utgångsdatum</string>
<string name="label_first_keyserver_is_used">(Nyckelservern först i listan är den som föredras)</string>
+ <string name="label_preferred">föredraget</string>
<string name="user_id_no_name">&lt;inget namn&gt;</string>
+ <string name="none">&lt;ingen&gt;</string>
<string name="no_key">&lt;ingen nyckel&gt;</string>
<string name="can_encrypt">kan kryptera</string>
<string name="can_sign">kan signera</string>
@@ -144,7 +158,7 @@
<item quantity="one">%d nyckelserver</item>
<item quantity="other">%d nyckelservrar</item>
</plurals>
- <string name="secret_key">Privat nyckel</string>
+ <string name="secret_key">Privat nyckel:</string>
<!--choice-->
<string name="choice_none">Ingen</string>
<string name="choice_15secs">15 s</string>
@@ -180,10 +194,12 @@
<string name="passphrase_must_not_be_empty">Ange en lösenordsfras.</string>
<string name="passphrase_for_symmetric_encryption">Symmetrisk kryptering.</string>
<string name="passphrase_for">Ange lösenordsfras för \'%s\'</string>
- <string name="yubikey_pin_for">Ange PIN för att få åtkomst till Yubikey för \'%s\'</string>
+ <string name="pin_for">Ange PIN för \'%s\'</string>
+ <string name="yubikey_pin_for">Ange PIN för att få åtkomst till YubiKey för \'%s\'</string>
+ <string name="nfc_text">Håll YubiKey mot baksidan av din enhet.</string>
<string name="file_delete_confirmation">Vill du verkligen radera\n%s?</string>
<string name="file_delete_successful">Raderades.</string>
- <string name="no_file_selected">Välj en nyckel först.</string>
+ <string name="no_file_selected">Välj en fil först.</string>
<string name="encrypt_sign_successful">Signerades och/eller krypterades.</string>
<string name="encrypt_sign_clipboard_successful">Signerades och/eller krypterades till urklipp.</string>
<string name="enter_passphrase_twice">Ange lösenordsfrasen två gånger.</string>
@@ -227,11 +243,11 @@
<string name="error_no_signature_passphrase">ingen lösenordsfras angiven</string>
<string name="error_no_signature_key">ingen signaturnyckel angiven</string>
<string name="error_invalid_data">Inget giltigt krypterat eller signerat OpenPGP-innehåll!</string>
+ <string name="error_integrity_check_failed">integritetskontroll misslyckades! Data har modifierats!</string>
<string name="error_wrong_passphrase">fel lösenordsfras</string>
<string name="error_could_not_extract_private_key">kunde inte extrahera privat nyckel</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Du behöver Android 4.1 för att använda Androids NFC Beam-funktion!</string>
- <string name="error_nfc_needed">NFC är inte tillgängligt på din enhet!</string>
<string name="error_nothing_import">Inga nycklar hittades!</string>
<string name="error_contacts_key_id_missing">Det gick inte att hämta nyckel-ID:t från kontakter!</string>
<string name="error_generic_report_bug">Ett generiskt fel inträffade, skapa en ny buggrapport för OpenKeychain.</string>
@@ -247,6 +263,7 @@
<string name="decrypt_result_not_encrypted">Inte krypterat</string>
<string name="decrypt_result_action_show">Visa</string>
<string name="decrypt_result_action_Lookup">Sök efter</string>
+ <string name="decrypt_invalid_text">Antingen är signaturen ogiltig eller så har nyckeln återkallats/gått ut. Du kan inte vara säker på vem som skrev texten. Vill du fortfarande visa den?</string>
<string name="decrypt_invalid_button">Jag förstår riskerna, visa den!</string>
<!--Add keys-->
<string name="add_keys_my_key">Min nyckel:</string>
@@ -268,6 +285,7 @@
<string name="progress_modify">modifierar nyckelring…</string>
<string name="progress_modify_unlock">låser upp nyckelring…</string>
<string name="progress_modify_adduid">lägger till användar-ID:n…</string>
+ <string name="progress_modify_adduat">lägger till användarattribut...</string>
<string name="progress_modify_revokeuid">återkallar användar-ID:n…</string>
<string name="progress_modify_primaryuid">ändrar primärt användar-ID…</string>
<string name="progress_modify_subkeychange">modifierar undernycklar…</string>
@@ -299,8 +317,8 @@
<string name="progress_con_saving">konsolidera: sparar till cache…</string>
<string name="progress_con_reimport">konsolidera: återimporterar…</string>
<!--action strings-->
- <string name="hint_keyserver_search_hint">Namn/E-post/Nyckel-ID</string>
- <string name="hint_cloud_search_hint">Namn/E-post/Bevis/Nyckel…</string>
+ <string name="hint_keyserver_search_hint">Namn/e-post/nyckel-ID…</string>
+ <string name="hint_cloud_search_hint">Namn/e-post/bevis/nyckel…</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -340,8 +358,12 @@
<string name="import_import">Importera markerade nycklar</string>
<string name="import_qr_code_wrong">Något är fel med QR-koden! Försök igen!</string>
<string name="import_qr_code_too_short_fingerprint">Fingeravtryck är för kort (&lt; 16 tecken)</string>
+ <string name="import_qr_code_button">Skanna QR-kod</string>
+ <string name="import_qr_code_text">Håll din kamera över QR-koden!</string>
<!--Generic result toast-->
- <string name="view_log">Visa logg</string>
+ <string name="view_log">Detaljer</string>
+ <string name="with_warnings">, med varningar</string>
+ <string name="with_cancelled">, tills det avbryts</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Importerade nyckel</item>
@@ -374,6 +396,10 @@
<item quantity="one">Raderade en nyckel</item>
<item quantity="other">Raderade %1$d nycklar</item>
</plurals>
+ <plurals name="delete_ok_but_fail_2">
+ <item quantity="one">, men misslyckades med att radera en nyckel%2$s.</item>
+ <item quantity="other">, men misslyckades med att radera %1$d nycklar%2$s.</item>
+ </plurals>
<plurals name="delete_ok">
<item quantity="one">Raderade nyckel%2$s.</item>
<item quantity="other">Raderade %1$d nycklar%2$s.</item>
@@ -383,18 +409,26 @@
<item quantity="other">Fel vid radering av %1$d nycklar.</item>
</plurals>
<string name="delete_nothing">Inget att radera.</string>
+ <string name="delete_cancelled">Raderingsoperation avbruten.</string>
<!--Certify result toast-->
<plurals name="certify_keys_ok">
<item quantity="one">Certifierade nyckel%2$s.</item>
<item quantity="other">Certifierade %1$d nycklar%2$s.</item>
</plurals>
+ <plurals name="certify_keys_with_errors">
+ <item quantity="one">Certifiering misslyckades!</item>
+ <item quantity="other">Certifiering misslyckades för %d nycklar!</item>
+ </plurals>
+ <plurals name="certify_error">
+ <item quantity="one">Certifiering misslyckades!</item>
+ <item quantity="other">Certifiering av %d nycklar misslyckades!</item>
+ </plurals>
<!--Intent labels-->
<string name="intent_decrypt_file">Dekryptera fil med OpenKeychain</string>
<string name="intent_import_key">Importera nyckel med OpenKeychain</string>
<string name="intent_send_encrypt">Kryptera med OpenKeychain</string>
<string name="intent_send_decrypt">Dekryptera med OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Inga registrerade appar!\n\nEn lista med tredjepartsappar som stöds kan hittas under \'Hjälp\'! </string>
<string name="api_settings_show_info">Visa avancerad information</string>
<string name="api_settings_hide_info">Göm avancerad information</string>
<string name="api_settings_show_advanced">Visa avancerade inställningar</string>
@@ -405,15 +439,20 @@
<string name="api_settings_save">Spara</string>
<string name="api_settings_save_msg">Konto har sparats</string>
<string name="api_settings_cancel">Avbryt</string>
+ <string name="api_settings_revoke">Återkalla åtkomst</string>
<string name="api_settings_start">Starta app</string>
<string name="api_settings_delete_account">Radera konto</string>
<string name="api_settings_package_name">Paketnamn</string>
<string name="api_settings_package_signature">SHA-256 för paketsignatur</string>
- <string name="api_settings_accounts">Konton</string>
+ <string name="api_settings_accounts">Konton (övergivet API)</string>
+ <string name="api_settings_advanced">Avancerad information</string>
+ <string name="api_settings_allowed_keys">Tillåtna nycklar</string>
<string name="api_settings_settings">Inställningar</string>
<string name="api_settings_key">Kontonyckel:</string>
<string name="api_settings_accounts_empty">Inga konton kopplade till denna app.</string>
+ <string name="api_create_account_text">Ingen nyckel är konfigurerad för detta konto. Välj en av dina existerande nycklar eller skapa en ny.\nAppar kan endast dekryptera/signera med nycklarna som valts här!</string>
<string name="api_update_account_text">Nyckeln som sparats för detta konto har raderats. Välj en annan!\nAppar kan endast dekryptera/signera med nycklarna som valts här!</string>
+ <string name="api_register_text">Appen som visas vill kryptera/dekryptera meddelanden och signera dem i ditt namn.\nTillåt åtkomst?\n\nVARNING: Om du inte vet varför denna sida visas, neka åtkomst! Du kan återkalla åtkomst senare från \'Appar\' sidan.</string>
<string name="api_register_allow">Tillåt åtkomst</string>
<string name="api_register_disallow">Tillåt inte åtkomst</string>
<string name="api_register_error_select_key">Välj en nyckel!</string>
@@ -421,6 +460,7 @@
<string name="api_select_pub_keys_dublicates_text">Mer än en nyckel finns för dessa identiteter:</string>
<string name="api_select_pub_keys_text">Se över listan med mottagare!</string>
<string name="api_select_pub_keys_text_no_user_ids">Välj mottagare!</string>
+ <string name="api_error_wrong_signature">Signaturkontroll misslyckades! Har du installerat appen från en annan källa? Om du är säker på att det här inte är en attack, återkalla den här appens registrering i OpenKeychain och registrera sen om appen igen.</string>
<!--Share-->
<string name="share_qr_code_dialog_title">Dela med QR-kod</string>
<string name="share_nfc_dialog">Dela med NFC</string>
@@ -429,6 +469,7 @@
<item quantity="one">1 nyckel vald.</item>
<item quantity="other">%d nycklar valda.</item>
</plurals>
+ <string name="key_list_empty_text1">Inga nycklar hittades!</string>
<string name="key_list_filter_show_all">Visa alla nycklar</string>
<string name="key_list_filter_show_certified">Visa endast certifierade nycklar</string>
<!--Key view-->
@@ -449,8 +490,11 @@
<string name="user_id_info_certified_title">Certifierad</string>
<string name="user_id_info_certified_text">Den här identiteten har certifierats av dig.</string>
<string name="user_id_info_uncertified_title">Inte certifierad.</string>
+ <string name="user_id_info_uncertified_text">Den här identiteten har ännu inte certifierats. Du kan inte vara säker på att identiteten verkligen hänger ihop med en viss person.</string>
<string name="user_id_info_invalid_title">Ogiltig</string>
<string name="user_id_info_invalid_text">Något är fel med den här identiteten!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Ändra lösenordsfras</string>
<string name="edit_key_action_add_identity">Lägg till identitet</string>
@@ -471,6 +515,7 @@
<string name="edit_key_error_add_subkey">Lägg till åtminstone en undernyckel!</string>
<!--Create key-->
<string name="create_key_upload">Ladda upp nyckel till nyckelserver</string>
+ <string name="create_key_empty">Detta fält krävs</string>
<string name="create_key_passphrases_not_equal">Lösenordsfraser stämmer inte överens</string>
<string name="create_key_final_text">Du angav följande identitet:</string>
<string name="create_key_final_robot_text">Att skapa en nyckel kan ta ett tag, drick en kopp kaffe under tiden…</string>
@@ -478,14 +523,11 @@
<string name="create_key_custom">(anpassad nyckelkonfiguration)</string>
<string name="create_key_text">Ange ditt fullständiga namn, e-postadress och välj en lösenordsfras.</string>
<string name="create_key_hint_full_name">Fullständigt namn, t.ex. Kalle Svensson</string>
+ <string name="create_key_edit">Ändra nyckelkonfiguration</string>
<!--View key-->
- <string name="view_key_revoked">Den här nyckeln har återkallats!</string>
- <string name="view_key_expired">Den här nyckeln har gått ut!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Nycklar</string>
- <string name="nav_encrypt_text">Kryptera text</string>
- <string name="nav_encrypt_files">Kryptera filer</string>
- <string name="nav_decrypt">Dekryptera</string>
+ <string name="nav_encrypt_decrypt">Kryptera/Dekryptera</string>
<string name="nav_apps">Appar</string>
<string name="my_keys">Mina nycklar</string>
<!--hints-->
@@ -502,11 +544,16 @@
<string name="cert_verify_unavailable">nyckel inte tillgänglig</string>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
<string name="msg_internal_error">Intern fel!</string>
+ <string name="msg_cancelled">Operation avbruten.</string>
<!--Import Public log entries-->
<string name="msg_ip_bad_type_secret">Försökte att importera privat nyckelring som publik. Detta är en bugg, skicka en felrapport!</string>
<string name="msg_ip_delete_old_fail">Ingen gammal nyckel raderad (skapa en ny?)</string>
<string name="msg_ip_delete_old_ok">Raderade gammal nyckel från databas</string>
+ <string name="msg_ip_error_op_exc">Operationen misslyckades på grund av ett databasfel</string>
+ <string name="msg_ip_error_remote_ex">Operationen misslyckades på grund av ett internt fel</string>
<string name="msg_ip">Importerar publik nyckelring %s</string>
+ <string name="msg_ip_insert_keyring">Kodar nyckelringens data</string>
+ <string name="msg_ip_insert_keys">Läser nycklar</string>
<string name="msg_ip_prepare">Förebereder databasoperationer</string>
<string name="msg_ip_master">Bearbetar huvudnyckel %s</string>
<string name="msg_ip_master_expired">Nyckelring gick ut %s</string>
@@ -528,6 +575,8 @@
<string name="msg_ip_master_flags_xxsx">Huvudflaggor: signera</string>
<string name="msg_ip_master_flags_xxxa">Huvudflaggor: autentisera</string>
<string name="msg_ip_master_flags_xxxx">Huvudflaggor: ingen</string>
+ <string name="msg_ip_merge_public">Slår ihop importerade data med befintlig publik nyckelring</string>
+ <string name="msg_ip_merge_secret">Slår ihop importerade data med befintlig publik nyckelring</string>
<string name="msg_ip_subkey">Bearbetar undernyckel %s</string>
<string name="msg_ip_subkey_expired">Undernyckel gick ut %s</string>
<string name="msg_ip_subkey_expires">Undernyckel går ut %s</string>
@@ -553,28 +602,61 @@
<string name="msg_ip_reinsert_secret">Sätter in privat nyckel på nytt</string>
<string name="msg_ip_uid_cert_bad">Stötte på ett dåligt certifikat!</string>
<string name="msg_ip_uid_cert_error">Fel vid bearbetning av certifikat!</string>
+ <string name="msg_ip_uid_cert_nonrevoke">Har redan ett icke-återkalleligt certifikat, hoppar över.</string>
<string name="msg_ip_uid_cert_old">Certifikat är äldre än det förra, hoppar över.</string>
<string name="msg_ip_uid_cert_new">Certifikat är mer aktuellt, ersätter det förra.</string>
+ <string name="msg_ip_uid_cert_good">Hittade ett bra certifikat från %1$s</string>
+ <string name="msg_ip_uid_cert_good_revoke">Hittade bra certifikatåterkallning från %1$s</string>
<plurals name="msg_ip_uid_certs_unknown">
<item quantity="one">Hoppar över ett certifikat utfärdat av okända publika nycklar</item>
<item quantity="other">Hoppar över %s certifikat utfärdade av okända publika nycklar</item>
</plurals>
+ <string name="msg_ip_uid_classifying_zero">Klassificerar användar-ID:n (inga tillförlitliga nycklar tillgängliga)</string>
+ <plurals name="msg_ip_uid_classifying">
+ <item quantity="one">Klassificerar användar-ID:n (använder en tillförlitlig nyckel)</item>
+ <item quantity="other">Klassificerar användar-ID:n (använder %s tillförlitliga nycklar)</item>
+ </plurals>
+ <string name="msg_ip_uid_reorder">Ordnar om användar-ID:n</string>
+ <string name="msg_ip_uid_processing">Bearbetar användar-ID %s</string>
+ <string name="msg_ip_uid_revoked">Användar-ID är återkallat</string>
+ <string name="msg_ip_uat_processing_image">Bearbetar användarattribut av typen bild</string>
+ <string name="msg_ip_uat_processing_unknown">Bearbetar användarattribut av okänd typ</string>
+ <string name="msg_ip_uat_cert_bad">Stötte på ett dåligt certifikat!</string>
+ <string name="msg_ip_uat_cert_error">Fel vid bearbetning av certifikat!</string>
+ <string name="msg_ip_uat_cert_nonrevoke">Har redan ett icke-återkalleligt certifikat, hoppar över.</string>
+ <string name="msg_ip_uat_cert_old">Certifikat är äldre än det förra, hoppar över.</string>
+ <string name="msg_ip_uat_cert_new">Certifikat är mer aktuellt, ersätter det förra.</string>
+ <string name="msg_ip_uat_cert_good">Hittade ett bra certifikat från %1$s</string>
+ <string name="msg_ip_uat_cert_good_revoke">Hittade bra certifikatåterkallning från %1$s</string>
+ <plurals name="msg_ip_uat_certs_unknown">
+ <item quantity="one">Hoppar över ett certifikat utfärdat av en okänd publik nyckel</item>
+ <item quantity="other">Hoppar över %s certifikat utfärdade av okända publika nycklar</item>
+ </plurals>
+ <string name="msg_ip_uat_classifying">Klassificerar användarattribut</string>
+ <string name="msg_ip_uat_revoked">Användarattribut är återkallat</string>
+ <string name="msg_is_bad_type_public">Försökte att importera publik nyckelring som privat. Detta är en bugg, skicka en felrapport!</string>
<!--Import Secret log entries-->
<string name="msg_is">Importerar privat nyckel %s</string>
<string name="msg_is_db_exception">Databasfel!</string>
<string name="msg_is_importing_subkeys">Bearbetar privata undernycklar</string>
+ <string name="msg_is_error_io_exc">Fel vid kodning av nyckelring</string>
+ <string name="msg_is_merge_public">Slår ihop importerade data med befintlig publik nyckelring</string>
+ <string name="msg_is_merge_secret">Slår ihop importerade data med befintlig publik nyckelring</string>
<string name="msg_is_pubring_generate">Genererar publik nyckelring från privat nyckelring</string>
<string name="msg_is_subkey_nonexistent">Undernyckel %s inte tillgänglig i privat nyckelring</string>
<string name="msg_is_success_identical">Nyckelringen innehåller ingen ny information, inget att göra</string>
<string name="msg_is_success">Importerade privat nyckelring</string>
<!--Keyring Canonicalization log entries-->
<string name="msg_kc_error_v3">Den här nyckeln är skapad med OpenPGP version 3, vilken är en föråldrad version som inte längre stöds!</string>
+ <string name="msg_kc_error_no_uid">Nyckelringen har inga giltiga användar-ID:n!</string>
<string name="msg_kc_error_master_algo">Den här huvudnyckeln använder en okänd (%s) algoritm!</string>
<string name="msg_kc_master">Bearbetar huvudnyckel</string>
- <string name="msg_kc_master_bad_err">Tar bort dåligt återkallelsecertifikat för nyckelring</string>
- <string name="msg_kc_master_bad_time">Tar bort återkallelsecertifikat för nyckelring med framtida tidstämpel</string>
<string name="msg_kc_master_bad_type">Tar bort huvudnyckelcertifikat av okänd typ (%s)</string>
- <string name="msg_kc_master_bad">Tar bort dåligt återkallelsecertifikat för nyckelring</string>
+ <string name="msg_kc_master_bad_local">Tar bort huvudnyckelcertifikat med flaggan \"local\"</string>
+ <string name="msg_kc_master_bad_err">Tar bort dåligt huvudnyckelcertifikat</string>
+ <string name="msg_kc_master_bad_time">Tar bort återkallelsecertifikat för nyckelring med framtida tidstämpel</string>
+ <string name="msg_kc_master_bad">Tar bort dåligt huvudnyckelcertifikat</string>
+ <string name="msg_kc_master_local">Tar bort huvudnyckelcertifikat med flaggan \"local\"</string>
<string name="msg_kc_revoke_dup">Tar bort överflödigt återkallelsecertifikat för nyckelring</string>
<string name="msg_kc_sub">Bearbetar undernyckel %s</string>
<string name="msg_kc_sub_no_cert">Inget giltigt certifikat hittades för %s, tar bort från nyckelring</string>
@@ -582,17 +664,30 @@
<string name="msg_kc_sub_revoke_bad">Tar bort dåligt återkallelsecertifikat för undernyckel</string>
<string name="msg_kc_sub_revoke_dup">Tar bort överflödigt återkallelsecertifikat för undernyckel</string>
<string name="msg_kc_sub_unknown_algo">Undernyckel använder en okänd algoritm, importerar inte…</string>
+ <string name="msg_kc_uid_bad_err">Tar bort dåligt eget-certifikat för användar-ID \'%s\'</string>
+ <string name="msg_kc_uid_bad_time">Tar bort användar-ID med framtida tidstämpel</string>
+ <string name="msg_kc_uid_bad">Tar bort dåligt eget-certifikat för användar-ID \'%s\'</string>
+ <string name="msg_kc_uid_cert_dup">Tar bort föråldrat eget-certifikat för användar-ID \'%s\'</string>
+ <string name="msg_kc_uid_revoke_dup">Tar bort överflödigt återkallelsecertifikat för användar-ID \'%s\'</string>
+ <string name="msg_kc_uid_revoke_old">Tar bort föråldrat återkallelsecertifikat för användar-ID \'%s\'</string>
+ <string name="msg_kc_uid_no_cert">Inget giltigt eget-certifikat hittades för användar-ID \'%s\', tar bort från nyckelring</string>
+ <string name="msg_kc_uid_remove">Tar bort ogiltigt användar-ID \'%s\'</string>
<string name="msg_kc_uid_warn_encoding">Användar-ID verifierar inte som UTF-8!</string>
+ <string name="msg_kc_uat_remove">Tar bort ogiltigt användarattribut</string>
<!--Keyring merging log entries-->
<string name="msg_mg_error_heterogeneous">Försökte att slå ihop nyckelringar med olika fingeravtryck!</string>
+ <string name="msg_mg_error_encode">Allvarligt fel vid kodning av signatur!</string>
<string name="msg_mg_public">Slår ihop till publik nyckelring %s</string>
<string name="msg_mg_secret">Slår ihop till privat nyckelring %s</string>
<string name="msg_mg_new_subkey">Lägger till ny undernyckel %s</string>
+ <string name="msg_mg_found_new">Hittade %s nya certifikat i nyckelring</string>
+ <string name="msg_mg_unchanged">Inget att slå ihop</string>
<!--createSecretKeyRing-->
<string name="msg_cr">Genererar ny huvudnyckel</string>
+ <string name="msg_cr_error_no_user_id">Nyckelringar måste skapas med minst ett användar-ID!</string>
<string name="msg_cr_error_no_certify">Huvudnyckel måste ha en certifieringsflagga!</string>
<string name="msg_cr_error_keysize_512">Nyckelstorlek måste vara större eller lika med 512!</string>
- <string name="msg_cr_error_internal_pgp">Internt PGP-fel!</string>
+ <string name="msg_cr_error_internal_pgp">Internt OpenPGP-fel!</string>
<string name="msg_cr_error_unknown_algo">Okänd algoritm vald. Detta är ett programmeringsfel, skicka en buggrapport!</string>
<string name="msg_cr_error_flags_dsa">Dåliga nyckelflaggor valda, DSA kan inte användas för kryptering!</string>
<string name="msg_cr_error_flags_elgamal">Dåliga nyckelflaggor valda, ElGamal kan inte användas för signering!</string>
@@ -600,22 +695,33 @@
<string name="msg_cr_error_flags_ecdh">Dåliga nyckelflaggor valda, ECDH kan inte användas för signering!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Modifierar nyckelring %s</string>
+ <string name="msg_mf_error_fingerprint">Det verkliga nyckelfingeravtrycket stämmer inte överens med det som förväntades!</string>
<string name="msg_mf_error_keyid">Inget nyckel-ID. Det här är ett internt fel, skicka en buggrapport!</string>
- <string name="msg_mf_error_pgp">Internt PGP-fel!</string>
- <string name="msg_mf_passphrase">Ändrar lösenordsfras för nyckelring…</string>
+ <string name="msg_mf_error_noexist_primary">Dåligt primärt användar-ID angivet!</string>
+ <string name="msg_mf_error_revoked_primary">Återkallade användar-ID:n kan inte vara primära!</string>
+ <string name="msg_mf_error_pgp">Internt OpenPGP-fel!</string>
+ <string name="msg_mf_passphrase">Ändrar lösenordsfras för nyckelring</string>
<string name="msg_mf_passphrase_key">Krypterar undernyckel %s på nytt med ny lösenordsfras</string>
<string name="msg_mf_passphrase_empty_retry">Det gick inte att ställa in ny lösenordsfras, försök igen med en tom gammal lösenordsfras</string>
+ <string name="msg_mf_primary_replace_old">Ersätter certifikat för tidigare primärt användar-ID</string>
+ <string name="msg_mf_primary_new">Genererar nytt certifikat för nytt primärt användar-ID</string>
<string name="msg_mf_subkey_change">Modifierar undernyckel %s</string>
<string name="msg_mf_subkey_new">Lägger till ny undernyckel av typen %s</string>
<string name="msg_mf_subkey_new_id">Nytt undernyckel-ID: %s</string>
<string name="msg_mf_error_past_expiry">Utgångsdatum kan inte vara i det förflutna!</string>
<string name="msg_mf_subkey_revoke">Återkallar undernyckel %s</string>
<string name="msg_mf_subkey_strip">Rensar undernyckel %s</string>
+ <string name="msg_mf_uid_add">Lägger till användar-ID %s</string>
+ <string name="msg_mf_uid_primary">Ändrar primärt användar-ID till %s</string>
+ <string name="msg_mf_uid_revoke">Återkallar användar-ID %s</string>
<string name="msg_mf_uid_error_empty">Användar-ID får inte vara tomt!</string>
+ <string name="msg_mf_unlock">Låser upp nyckelring</string>
<!--Consolidate-->
<string name="msg_con">Konsoliderar databas</string>
<string name="msg_con_error_bad_state">Konsolidering startade medan ingen databas var cachad! Detta är förmodligen ett programmeringsfel, skicka en buggrapport.</string>
<string name="msg_con_save_secret">Sparar privata nyckelringar</string>
+ <string name="msg_con_save_public">Sparar publika nyckelringar</string>
+ <string name="msg_con_db_clear">Rensar databas</string>
<string name="msg_con_success">Konsoliderade databas</string>
<string name="msg_con_delete_public">Raderar cache-fil för publik nyckelring</string>
<string name="msg_con_delete_secret">Raderar cache-fil för privat nyckelring</string>
@@ -632,31 +738,59 @@
<item quantity="other">Återimporterar %d privata nycklar</item>
</plurals>
<string name="msg_con_reimport_secret_skip">Inga privata nycklar att återimportera, hoppar över…</string>
+ <!--Edit Key (higher level than modify)-->
+ <string name="msg_ed">Utför nyckeloperation</string>
+ <string name="msg_ed_caching_new">Cachar ny lösenordsfras</string>
+ <string name="msg_ed_error_key_not_found">Nyckel hittades inte!</string>
+ <string name="msg_ed_success">Nyckeloperation lyckades</string>
+ <!--Promote key-->
+ <string name="msg_pr_error_already_secret">Nyckeln är redan en privat nyckel!</string>
+ <string name="msg_pr_error_key_not_found">Nyckel hittades inte!</string>
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_divert">Det finns (ännu) inte stöd för att redigera NFC-nycklar!</string>
<string name="msg_ek_error_dummy">Kan inte redigera nyckelring med en rensad huvudnyckel!</string>
<string name="msg_ek_error_not_found">Nyckel hittades inte!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_askip_no_key">Data inte krypterade med känd nyckel, hoppar över…</string>
+ <string name="msg_dc_askip_not_allowed">Data inte krypterade med tillåten nyckel, hoppar över…</string>
<string name="msg_dc_asym">Hittade block med asymmetriskt krypterad data för nyckel %s</string>
<string name="msg_dc_clear_decompress">Packar upp komprimerad data</string>
+ <string name="msg_dc_clear_meta_file">Filnamn: %s</string>
+ <string name="msg_dc_clear_meta_mime">MIME-typ: %s</string>
+ <string name="msg_dc_clear_meta_size">Filstorlek: %s</string>
+ <string name="msg_dc_clear_signature_bad">Signaturkontroll INTE OK!</string>
<string name="msg_dc_clear_signature_check">Verifierar signaturdata</string>
+ <string name="msg_dc_clear_signature_ok">Signaturkontroll OK</string>
<string name="msg_dc_clear_signature">Sparar signaturdata till senare</string>
<string name="msg_dc_clear">Bearbetar klartextdata</string>
+ <string name="msg_dc_error_extract_key">Okänt fel vid upplåsning av nyckel</string>
+ <string name="msg_dc_error_integrity_check">Fel vid integritetskontroll!</string>
<string name="msg_dc_ok_meta_only">Endast metadata krävdes, hoppar över dekryptering</string>
+ <string name="msg_dc_ok">OK</string>
+ <string name="msg_dc_pass_cached">Använder lösenordsfras från cache</string>
<string name="msg_dc_prep_streams">Förbereder strömmar för dekryptering</string>
+ <string name="msg_dc">Startar dekrypteringsoperation…</string>
+ <string name="msg_dc_sym_skip">Symmetrisk data inte tillåten, hoppar över…</string>
<string name="msg_dc_sym">Hittade block med symmetriskt krypterad data</string>
<string name="msg_dc_unlocking">Låser upp privat nyckel</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
- <string name="msg_se_asymmetric">Förbereder publika nycklar för kryptering</string>
- <string name="msg_se_compressing">Förbereder kompression</string>
- <string name="msg_se_encrypting">Krypterar data</string>
- <string name="msg_se_error_bad_passphrase">Dålig lösenordsfras!</string>
- <string name="msg_se_error_key_sign">Den valda signeringsnyckeln kan inte signera data!</string>
- <string name="msg_se_error_pgp">Internt PGP-fel!</string>
- <string name="msg_se_sigcrypting">Krypterar data med signatur</string>
- <string name="msg_se_symmetric">Förbereder symmetrisk kryptering!</string>
+ <string name="msg_se_success">Signering/kryptering lyckades!</string>
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_pse_asymmetric">Förbereder publika nycklar för kryptering</string>
+ <string name="msg_pse_compressing">Förbereder komprimering</string>
+ <string name="msg_pse_encrypting">Krypterar data</string>
+ <string name="msg_pse_error_bad_passphrase">Dålig lösenordsfras!</string>
+ <string name="msg_pse_error_nfc">NFC datafel!</string>
+ <string name="msg_pse_error_no_passphrase">Ingen lösenordsfras angiven!</string>
+ <string name="msg_pse_error_pgp">Internt OpenPGP-fel!</string>
+ <string name="msg_pse_signing_cleartext">Skapar signatur i klartext</string>
+ <string name="msg_pse_sigcrypting">Krypterar data med signatur</string>
+ <string name="msg_pse_symmetric">Förbereder symmetrisk kryptering</string>
<string name="msg_crt_error_master_not_found">Huvudnyckel hittades inte!</string>
<string name="msg_crt_error_nothing">Inga nycklar certifierade!</string>
+ <string name="msg_crt_error_unlock">Fel vid upplåsning av huvudnyckel!</string>
+ <string name="msg_crt">Certifierar nyckelringar</string>
<string name="msg_crt_save">Sparar certifierad nyckel %s</string>
<string name="msg_crt_saving">Sparar nyckelringar</string>
<string name="msg_crt_unlock">Låser upp huvudnyckel</string>
@@ -666,12 +800,25 @@
<item quantity="one">Importerar nyckel</item>
<item quantity="other">Importerar %d nycklar</item>
</plurals>
- <string name="msg_import_partial">Import lyckades, med fel!</string>
+ <string name="msg_import_fetch_keyserver">Hämtar från nyckelserver: %s</string>
+ <string name="msg_import_fetch_keyserver_ok">Nyckelhämtning lyckades</string>
+ <string name="msg_import_keyserver">Använder nyckelserver %s</string>
+ <string name="msg_import_fingerprint_ok">Kontroll av fingeravtyck OK</string>
+ <string name="msg_import_merge">Slår ihop data som tagits emot</string>
+ <string name="msg_import_error">Importoperation misslyckades!</string>
+ <string name="msg_import_partial">Importoperation lyckades, med fel!</string>
+ <string name="msg_import_success">Importoperation lyckades!</string>
+ <plurals name="msg_export">
+ <item quantity="one">Exporterar en nyckel</item>
+ <item quantity="other">Exporterar %d nycklar</item>
+ </plurals>
<string name="msg_export_all">Exporterar alla nycklar</string>
<string name="msg_export_public">Exporterar publik nyckel %s</string>
<string name="msg_export_secret">Exporterar privat nyckel %s</string>
+ <string name="msg_export_error_fopen">Fel vid öppning av fil!</string>
+ <string name="msg_export_error_no_uri">Ingen URI specifierad!</string>
<string name="msg_export_error_db">Databasfel!</string>
- <string name="msg_export_success">Export lyckades</string>
+ <string name="msg_export_success">Exportoperation lyckades</string>
<string name="msg_del_error_empty">Inget att radera!</string>
<string name="msg_del_error_multi_secret">Privata nycklar kan bara raderas var för sig!</string>
<plurals name="msg_del">
@@ -679,7 +826,18 @@
<item quantity="other">Raderar %d nycklar</item>
</plurals>
<string name="msg_del_key">Raderar nyckel %s</string>
+ <string name="msg_del_key_fail">Misslyckades med att radera nyckel %s</string>
+ <plurals name="msg_del_ok">
+ <item quantity="one">Raderade nyckel</item>
+ <item quantity="other">Raderade %d nycklar</item>
+ </plurals>
+ <plurals name="msg_del_fail">
+ <item quantity="one">Misslyckades med att radera en nyckel</item>
+ <item quantity="other">Misslyckades med att radera %d nycklar</item>
+ </plurals>
+ <string name="msg_acc_saved">Konto sparat</string>
<string name="msg_download_success">Hämtning lyckades!</string>
+ <string name="msg_download_no_valid_keys">Inga giltiga nycklar hittades i fil/urklipp!</string>
<plurals name="error_import_non_pgp_part">
<item quantity="one">en del av den inlästa filen är ett giltigt OpenPGP-objekt men inte en OpenPGP-nyckel</item>
<item quantity="other">delar av den inlästa filen är giltiga OpenPGP-objekt men inte OpenPGP-nycklar</item>
@@ -690,10 +848,17 @@
<string name="passp_cache_notif_keys">Cachade lösenordsfraser:</string>
<string name="passp_cache_notif_clear">Rensa cache</string>
<string name="passp_cache_notif_pwd">Lösenordsfras</string>
+ <!--First Time-->
+ <string name="first_time_text1">Ta tillbaka din integritet med OpenKeychain!</string>
+ <string name="first_time_create_key">Skapa min nyckel!</string>
+ <string name="first_time_import_key">Importera från fil</string>
+ <string name="first_time_skip">Hoppa över inställning</string>
<!--unsorted-->
- <string name="section_cert">Certifikatdetaljer</string>
+ <string name="section_cert">Certifikatinformation</string>
<string name="label_user_id">Identitet</string>
+ <string name="unknown_uid">&lt;okänd&gt;</string>
<string name="empty_certs">Inga certifikat för den här nyckeln</string>
+ <string name="section_uids_to_certify">Identiteter för</string>
<string name="label_revocation">Anledning till återkallelse</string>
<string name="label_verify_status">Verifieringsstatus</string>
<string name="label_cert_type">Typ</string>
@@ -709,9 +874,32 @@
<string name="error_no_encrypt_subkey">Ingen krypteringsundernyckel tillgänglig!</string>
<string name="info_no_manual_account_creation">Skapa inte OpenKeychain-konton manuellt. \nFör mer information, se Hjälp.</string>
<string name="contact_show_key">Visa nyckel (%s)</string>
+ <string name="swipe_to_update">Dra nedåt för att uppdatera från nyckelserver</string>
<string name="error_no_file_selected">Välj åtminstone en fil att kryptera!</string>
+ <string name="error_multi_not_supported">Att spara flera filer stöds ej. Detta är en begränsning i nuvarande Android.</string>
<string name="key_colon">Nyckel:</string>
- <!--First Time-->
- <string name="first_time_create_key">Skapa min nyckel!</string>
- <string name="first_time_skip">Hoppa över inställning</string>
+ <string name="user_id_none"><![CDATA[<none>]]></string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <string name="enter_passphrase">Ange lösenordsfras</string>
+ <string name="passphrase">Lösenordsfras</string>
+ <string name="noPassphrase">Ingen lösenordsfras</string>
+ <string name="passphrases_match">Lösenordsfraser stämmer överens</string>
+ <string name="passphrase_saved">Lösenordsfras sparad</string>
+ <string name="passphrase_invalid">Lösenordsfras ogiltig</string>
+ <string name="missing_passphrase">Lösenordsfras saknas</string>
+ <string name="passphrase_again">Igen</string>
+ <string name="lockpattern">Låsmönster</string>
+ <string name="lockpatternNFC">NFC + Låsmönster</string>
+ <string name="unlock_method">Upplåsningmetod</string>
+ <string name="set_passphrase">Sätt lösenordsfras</string>
+ <string name="draw_lockpattern">Dra låsmönster</string>
+ <string name="nfc_title">NFC</string>
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
+ <string name="nfc_wrong_tag">Fel Tag. Försök igen.</string>
+ <string name="enable_nfc">Vänligen aktivera NFC i dina inställningar</string>
+ <string name="no_nfc_support">Denna enhet stöder inte NFC</string>
+ <string name="unlocked">Upplåst</string>
+ <string name="nfc_settings">Inställningar</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml
index c2aaaa741..7b6a976f5 100644
--- a/OpenKeychain/src/main/res/values-tr/strings.xml
+++ b/OpenKeychain/src/main/res/values-tr/strings.xml
@@ -8,19 +8,16 @@
<string name="title_select_secret_key">Anahtarını Seç</string>
<string name="title_encrypt_text">Metni Şifrele</string>
<string name="title_encrypt_files">Dosyaları Şifrele</string>
- <string name="title_decrypt">Çözümle</string>
- <string name="title_unlock">Parola</string>
+ <string name="title_decrypt">Şifre çöz</string>
<string name="title_add_subkey">Alt anahtar ekle</string>
<string name="title_edit_key">Anahtarı düzenle</string>
- <string name="title_preferences">Seçenekler</string>
<string name="title_cloud_search_preferences">Bulut Arama Seçenekleri</string>
<string name="title_api_registered_apps">Uygulamalar</string>
- <string name="title_key_server_preference">Anahtar Sunucusu Seçenekleri</string>
<string name="title_change_passphrase">Parolayı Değiştir</string>
- <string name="title_share_fingerprint_with">Parmakizini şu şekilde paylaş...</string>
- <string name="title_share_key">Anahtarı şu şekilde paylaş...</string>
- <string name="title_share_file">Dosyayı şu şekilde paylaş...</string>
- <string name="title_share_message">Mesajı şu şekilde paylaş...</string>
+ <string name="title_share_fingerprint_with">Parmak izini paylaş...</string>
+ <string name="title_share_key">Anahtarı paylaş...</string>
+ <string name="title_share_file">Dosyayı paylaş...</string>
+ <string name="title_share_message">Mesajı paylaş...</string>
<string name="title_encrypt_to_file">Dosyaya Şifrele</string>
<string name="title_decrypt_to_file">Dosyaya Çözümle</string>
<string name="title_import_keys">Anahtarları Al</string>
@@ -29,11 +26,13 @@
<string name="title_export_keys">Anahtarları Ver</string>
<string name="title_key_not_found">Anahtar Bulunamadı</string>
<string name="title_send_key">Anahtar Sunucusuna Yükle</string>
- <string name="title_certify_key">Kimlikleri Doğrula</string>
+ <string name="title_certify_key">Kimlikleri Tasdikle</string>
<string name="title_key_details">Anahtar Detayları</string>
<string name="title_help">Yardım</string>
<string name="title_log_display">Günlük</string>
<string name="title_create_key">Anahtar Oluştur</string>
+ <string name="title_exchange_keys">Anahtarları Değiş Tokuş Et</string>
+ <string name="title_advanced_key_info">Gelişmiş Anahtar Bilgisi</string>
<!--section-->
<string name="section_user_ids">Kimlikler</string>
<string name="section_keys">Alt anahtarlar</string>
@@ -42,21 +41,22 @@
<string name="section_defaults">Varsayılanlar</string>
<string name="section_advanced">Gelişmiş</string>
<string name="section_passphrase_cache">Parola Önbelleği</string>
- <string name="section_certify">Doğrula</string>
+ <string name="section_certify">Tasdik et</string>
<string name="section_actions">Eylemler</string>
<string name="section_share_key">Anahtar</string>
- <string name="section_certification_key">Anahtarınız sertifikalama için kullanıldı</string>
+ <string name="section_certification_key">Tasdik işlemi için kullanılan anahtarınız</string>
<string name="section_upload_key">Anahtarı Eşitle</string>
<string name="section_key_server">Anahtar Sunucusu</string>
- <string name="section_fingerprint">Parmakizi</string>
- <string name="section_key_to_certify">Doğrulanacak anahtar</string>
+ <string name="section_fingerprint">Parmak izi</string>
+ <string name="section_key_to_certify">Tasdik edilecek anahtar</string>
<string name="section_decrypt_files">Dosyalar</string>
<string name="section_decrypt_text">Metin</string>
+ <string name="section_certs">Sertifikalar</string>
<!--button-->
- <string name="btn_decrypt_verify_file">Dosyayı çözümle, doğrula ve kaydet</string>
- <string name="btn_decrypt_verify_message">Mesajı çözümle ve doğrula</string>
- <string name="btn_encrypt_file">Dosyayı şifrele ve kaydet</string>
- <string name="btn_encrypt_share_file">Dosyayı şifrele ve paylaş</string>
+ <string name="btn_decrypt_verify_file">Şifreyi çöz, doğrula ve dosyayı kaydet</string>
+ <string name="btn_decrypt_verify_message">Şifreyi çöz ve mesajı doğrula</string>
+ <string name="btn_encrypt_file">Şifrele ve dosyayı kaydet</string>
+ <string name="btn_encrypt_share_file">Şifrele ve dosyayı paylaş</string>
<string name="btn_save">Kaydet</string>
<string name="btn_do_not_save">İptal</string>
<string name="btn_delete">Sil</string>
@@ -66,24 +66,24 @@
<string name="btn_next">İleri</string>
<string name="btn_back">Geri</string>
<string name="btn_lookup_key">Anahtarı ara</string>
- <string name="btn_share_encrypted_signed">Mesajı şifrele ve paylaş</string>
- <string name="btn_view_cert_key">Sertifikalama anahtarını görüntüle</string>
+ <string name="btn_share_encrypted_signed">Şifrele ve mesajı paylaş</string>
+ <string name="btn_view_cert_key">Tasdikleme anahtarını görüntüle</string>
<string name="btn_create_key">Anahtar oluştur</string>
<string name="btn_add_files">Dosya(lar) ekle</string>
- <string name="btn_add_share_decrypted_text">Çözümlenmiş metni paylaş</string>
- <string name="btn_decrypt_clipboard">Panodan çözümle</string>
+ <string name="btn_add_share_decrypted_text">Şifresi çözülmüş metni paylaş</string>
<string name="btn_decrypt_and_verify">ve imzaları doğrula</string>
- <string name="btn_decrypt_files">Dosyaları çözümle</string>
+ <string name="btn_decrypt_files">Dosyaların şifresini çöz</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ımı oluştur</string>
+ <string name="menu_import_existing_key">Dosyadan al</string>
<string name="menu_search">Ara</string>
- <string name="menu_beam_preferences">Huzme ayarları</string>
+ <string name="menu_beam_preferences">NFC ayarları</string>
<string name="menu_key_edit_cancel">İptal</string>
- <string name="menu_encrypt_to">Buraya şifrele...</string>
+ <string name="menu_encrypt_to">Şuna şifrele...</string>
<string name="menu_select_all">Hepsini seç</string>
<string name="menu_add_keys">Anahtar ekle</string>
<string name="menu_export_all_keys">Tüm anahtarları ver</string>
@@ -95,22 +95,25 @@
<string name="label_file_colon">Dosya:</string>
<string name="label_no_passphrase">Parola Yok</string>
<string name="label_passphrase">Parola</string>
- <string name="label_unlock">Kilit Açılıyor...</string>
+ <string name="label_unlock">Kilit açılıyor...</string>
<string name="label_passphrase_again">Parolayı Tekrarla</string>
<string name="label_algorithm">Algoritma</string>
+ <string name="label_ascii_armor">ASCII formatında dosyalar</string>
+ <string name="label_file_ascii_armor">ASCII formatında çıktıları etkinleştir</string>
<string name="label_write_version_header">Diğerlerinin OpenKeychain kullandığını bilmesine izin ver</string>
- <string name="label_use_default_yubikey_pin">Yubikey PIN\'i varsayılan kullan</string>
- <string name="label_use_num_keypad_for_yubikey_pin">Yubikey PIN için numerik tuş takımını kullan</string>
- <string name="label_label_use_default_yubikey_pin_summary">NFC üzerinden Yunikeys\'e ulaşmak için varsayılan PIN (123456) kullanılıyor</string>
+ <string name="label_write_version_header_summary">OpenPGP imzalarına, şifrelenmiş metinlere ve dışa aktarılmış anahtarlara \'OpenKeychain v2.7\' yazar</string>
+ <string name="label_use_default_yubikey_pin">Varsayılan YubiKey PIN\'ini kullan</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">YubiKey PIN\'i için sayısal klavyeyi kullan</string>
+ <string name="label_label_use_default_yubikey_pin_summary">NFC üzerinden YubiKey\'e ulaşmak için varsayılan PIN\'i (123456) kullanır</string>
<string name="label_asymmetric_from">İmzalayan:</string>
- <string name="label_to">Buraya şifrele:</string>
+ <string name="label_to">Şuna şifrele:</string>
<string name="label_delete_after_encryption">Şifreleme sonrası dosyayı sil</string>
- <string name="label_delete_after_decryption">Çözümleme sonrası sil</string>
+ <string name="label_delete_after_decryption">Şifre çözme sonrasında sil</string>
<string name="label_encryption_algorithm">Şifreleme algoritması</string>
- <string name="label_hash_algorithm">Hash algoritması</string>
+ <string name="label_hash_algorithm">Özet algoritması</string>
<string name="label_symmetric">Parolayla şifrele</string>
<string name="label_passphrase_cache_ttl">Önbellek zamanı</string>
- <string name="label_passphrase_cache_subs">Altanahtar parola önbelleği</string>
+ <string name="label_passphrase_cache_subs">Parolaları altanahtarlara göre önbellekle</string>
<string name="label_message_compression">Mesaj sıkıştırma</string>
<string name="label_file_compression">Dosya sıkıştırma</string>
<string name="label_keyservers">Anahtar Sunucuları</string>
@@ -124,8 +127,10 @@
<string name="label_name">İsim</string>
<string name="label_comment">Yorum</string>
<string name="label_email">Eposta</string>
- <string name="label_fingerprint">Parmakizi</string>
- <string name="expiry_date_dialog_title">Son kullanma tarihini ayarla</string>
+ <string name="label_send_key">Bulut ile eşitle</string>
+ <string name="label_fingerprint">Parmak izi</string>
+ <string name="expiry_date_dialog_title">Zaman aşımı tarihini ayarla</string>
+ <string name="label_first_keyserver_is_used">(Listelenen ilk anahtar sunucu tercih edilecektir)</string>
<string name="label_preferred">tercih edilen</string>
<string name="user_id_no_name">&lt;isimsiz&gt;</string>
<string name="none">&lt;hiçbiri&gt;</string>
@@ -133,8 +138,8 @@
<string name="can_encrypt">şifreleyebilir</string>
<string name="can_sign">imzalayabilir</string>
<string name="can_certify">tasdikleyebilir</string>
- <string name="can_certify_not">doğrulanamaz</string>
- <string name="expired">tarihi geçmiş</string>
+ <string name="can_certify_not">tasdikleyemez</string>
+ <string name="expired">zaman aşımına uğramış</string>
<string name="revoked">yürürlükten kaldırılmış</string>
<plurals name="n_keys">
<item quantity="one">1 anahtar</item>
@@ -169,10 +174,10 @@
<string name="error">Hata</string>
<string name="error_message">Hata: %s</string>
<!--key flags-->
- <string name="flag_certify">Doğrula</string>
- <string name="flag_sign">İmzala</string>
- <string name="flag_encrypt">Şifrele</string>
- <string name="flag_authenticate">Yetkilendir</string>
+ <string name="flag_certify">Tasdikleme</string>
+ <string name="flag_sign">İmzalama</string>
+ <string name="flag_encrypt">Şifreleme</string>
+ <string name="flag_authenticate">Kimlik kanıtlama</string>
<!--sentences-->
<string name="wrong_passphrase">Yanlış parola.</string>
<string name="no_filemanager_installed">Uyumlu dosya yöneticisi yüklenmedi.</string>
@@ -180,55 +185,75 @@
<string name="passphrase_must_not_be_empty">Lütfen bir parola girin.</string>
<string name="passphrase_for_symmetric_encryption">Simetrik şifreleme.</string>
<string name="passphrase_for">\'%s\' için bir parola girin</string>
+ <string name="nfc_text">YubiKey\'inizi cihazınızın arkasında tutun.</string>
<string name="file_delete_confirmation">Silmek istediğinize emin misiniz\n%s?</string>
<string name="file_delete_successful">Başarıyla silindi.</string>
<string name="no_file_selected">Önce bir dosya seçin.</string>
<string name="encrypt_sign_successful">Başarıyla imzalandı ve/veya şifrelendi.</string>
- <string name="encrypt_sign_clipboard_successful">Panoya başarıyla imzalandı ve/veya şifrelendi.</string>
+ <string name="encrypt_sign_clipboard_successful">Kopyalama önbelleğine başarıyla imzalandı ve/veya şifrelendi.</string>
<string name="enter_passphrase_twice">Parolanızı iki kere girin.</string>
<string name="select_encryption_key">En az bir şifreleme anahtarı seçiniz.</string>
- <string name="select_encryption_or_signature_key">En az bir adet şifreleme anahtarı veya imza anahtarı seçiniz.</string>
- <string name="key_deletion_confirmation_multi">Seçilen tüm açık anahtarları silmek istiyor musunuz?\nBu işlemi geri alamazsınız!</string>
- <string name="public_key_deletetion_confirmation">\'%s\' genel anahtarını gerçekten silmek istiyor musunuz?\nBu geri alınamaz!</string>
- <string name="key_exported">1 anahtar başarıyla verildi.</string>
- <string name="keys_exported">%d anahtar başarıyla verildi.</string>
- <string name="no_keys_exported">Hiç anahtar verilmedi.</string>
+ <string name="select_encryption_or_signature_key">En az bir şifreleme anahtarı veya imza anahtarı seçiniz.</string>
+ <string name="specify_file_to_encrypt_to">Lütfen şifreleme sonucu hangi dosyanın oluşturulması gerektiğini belirtin.\nUYARI: Eğer dosya mevcutsa üzerine yazılacaktır.</string>
+ <string name="specify_file_to_decrypt_to">Lütfen şifre çözme sonucu hangi dosyanın oluşturulması gerektiğini belirtin.\nUYARI: Eğer dosya mevcutsa üzerine yazılacaktır.</string>
+ <string name="specify_file_to_export_to">Lütfen dışa aktarım için hangi dosyanın kullanılması gerektiğini belirtin.\nUYARI: Eğer dosya mevcutsa üzerine yazılacaktır.</string>
+ <string name="key_deletion_confirmation_multi">Seçilen tüm genel anahtarları gerçekten silmek istiyor musunuz?\nBu işlemi geri alamazsınız!</string>
+ <string name="secret_key_deletion_confirmation">\'%s\' ÖZEL anahtarını gerçekten silmek istiyor musunuz?\nBu işlemi geri alamazsınız!</string>
+ <string name="public_key_deletetion_confirmation">\'%s\' genel anahtarını gerçekten silmek istiyor musunuz?\nBu işlemi geri alamazsınız!</string>
+ <string name="also_export_secret_keys">Özel anahtarları da dışa aktar</string>
+ <string name="reinstall_openkeychain">Android için bilinen bir hataya denk geldiniz. Eğer kişilerinizi anahtarlarla eşlemek istiyorsanız, lütfen OpenKeychain uygulamasını yeniden yükleyin.</string>
+ <string name="key_exported">1 anahtar başarıyla dışa aktarıldı.</string>
+ <string name="keys_exported">%d anahtar başarıyla dışa aktarıldı.</string>
+ <string name="no_keys_exported">Hiçbir anahtar dışa aktarılmadı.</string>
<string name="key_creation_el_gamal_info">Not: sadece alt anahtarlar ElGamal destekler.</string>
<string name="key_not_found">Anahtar %08X bulunamadı.</string>
- <string name="list_empty">Liste boş!</string>
+ <plurals name="bad_keys_encountered">
+ <item quantity="one">%d bozuk özel anahtar yok sayıldı. Muhtemelen\n --export-secret-subkeys\nseçeneği ile dışa aktardınız. Onun yerine \n --export-secret-keys\nkullandığınıza emin olun.</item>
+ <item quantity="other">%d bozuk özel anahtar yok sayıldı. Muhtemelen\n --export-secret-subkeys\nseçeneği ile dışa aktardınız. Onun yerine \n --export-secret-keys\nkullandığınıza emin olun.</item>
+ </plurals>
+ <string name="list_empty">Bu liste boş!</string>
<string name="nfc_successful">Anahtar NFC Beam ile başarıyla gönderildi!</string>
- <string name="key_copied_to_clipboard">Anahtar panoya kopyalandı!</string>
- <string name="fingerprint_copied_to_clipboard">Parmakizi panoya kopyalandı!</string>
- <string name="key_too_big_for_sharing">Anatar bu yolla paylaşılamayacak kadar büyük!</string>
- <string name="text_copied_to_clipboard">Metin panoya kopyalandı!</string>
+ <string name="key_copied_to_clipboard">Anahtar kopyalama önbelleğine kopyalandı!</string>
+ <string name="fingerprint_copied_to_clipboard">Parmak izi kopyalama önbelleğine kopyalandı!</string>
+ <string name="select_key_to_certify">Lütfen tasdikleme için kullanılacak bir anahtar seçin!</string>
+ <string name="key_too_big_for_sharing">Anahtar bu yolla paylaşılamayacak kadar büyük!</string>
+ <string name="text_copied_to_clipboard">Metin kopyalama önbelleğine kopyalandı!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
- <string name="error_file_delete_failed">\'%s\' silme başarısız</string>
+ <string name="error_file_delete_failed">\'%s\' silmesi başarısız oldu</string>
<string name="error_file_not_found">dosya bulunamadı</string>
+ <string name="error_no_secret_key_found">uygun bir özel anahtar bulunamadı</string>
<string name="error_external_storage_not_ready">harici depolama hazır değil</string>
- <string name="error_key_size_minimum512bit">anahtar uzunluğu en az 512bit olmalı</string>
+ <string name="error_key_size_minimum512bit">anahtar boyutu en az 512bit olmalı</string>
<string name="error_unknown_algorithm_choice">bilinmeyen algoritma seçimi</string>
- <string name="error_user_id_no_email">eposta bulunamadı</string>
+ <string name="error_user_id_no_email">herhangi bir eposta bulunamadı</string>
<string name="error_key_needs_a_user_id">en az bir kimlik gerekli</string>
<string name="error_no_signature_passphrase">parola verilmedi</string>
<string name="error_no_signature_key">imza anahtarı verilmedi</string>
+ <string name="error_invalid_data">Geçerli olan şifrelenmiş ya da imzalanmış OpenPGP içeriği yok!</string>
<string name="error_integrity_check_failed">Bütünlük kontrolü başarısız! Veri değiştirilmiş!</string>
<string name="error_wrong_passphrase">yanlış parola</string>
+ <string name="error_could_not_extract_private_key">özel anahtar çıkarılamadı</string>
<!--errors without preceeding Error:-->
<string name="error_jelly_bean_needed">Android\'in NFC Beam özelliğini kullanabilmek için Android 4.1 kullanmalısınız!</string>
- <string name="error_nfc_needed">Cihazınız NFC desteklemiyor!</string>
<string name="error_nothing_import">Anahtar bulunamadı!</string>
- <string name="error_generic_report_bug">Genel bir hata oluştu. Lütfen OpenKeychain için bir hata raporu oluşturun.</string>
+ <string name="error_contacts_key_id_missing">Kişilerden anahtar ID getirme işlemi başarısız!</string>
+ <string name="error_generic_report_bug">Genel bir hata oluştu, lütfen OpenKeychain için yeni bir hata raporu oluşturun.</string>
<!--results shown after decryption/verification-->
<string name="decrypt_result_no_signature">İmzalanmadı</string>
<string name="decrypt_result_invalid_signature">Geçersiz imza!</string>
- <string name="decrypt_result_signature_uncertified">İmzalayan (doğrulanmadı!):</string>
+ <string name="decrypt_result_signature_uncertified">İmzalayan (tasdik edilmemiş!):</string>
<string name="decrypt_result_signature_certified">İmzalayan:</string>
+ <string name="decrypt_result_signature_expired_key">Anahtar zaman aşımına uğramış!</string>
+ <string name="decrypt_result_signature_revoked_key">Anahtar yürürlükten kaldırılmış!</string>
+ <string name="decrypt_result_signature_missing_key">Bilinmeyen açık anahtar</string>
<string name="decrypt_result_encrypted">Şifrelendi</string>
<string name="decrypt_result_not_encrypted">Şifrelenmedi</string>
<string name="decrypt_result_action_show">Göster</string>
<string name="decrypt_result_action_Lookup">Araştır</string>
+ <string name="decrypt_invalid_text">Ya imza geçersiz ya da anahtar yürürlükten kaldırılmış/zaman aşımına uğramış. Metni kimin yazdığından emin olamazsınız. Yine de görüntülemek istiyor musunuz?</string>
+ <string name="decrypt_invalid_button">Tehlikelerin farkındayım, görüntüle!</string>
<!--Add keys-->
<string name="add_keys_my_key">Anahtarım:</string>
<!--progress dialogs, usually ending in '…'-->
@@ -236,38 +261,52 @@
<string name="progress_cancel">İptal</string>
<string name="progress_cancelling">iptal ediliyor...</string>
<string name="progress_saving">kaydediliyor...</string>
- <string name="progress_importing">alıyor...</string>
- <string name="progress_exporting">veriyor...</string>
+ <string name="progress_importing">içe aktarılıyor...</string>
+ <string name="progress_exporting">dışa aktarılıyor...</string>
<string name="progress_uploading">yükleniyor...</string>
<string name="progress_building_key">anahtar oluşturuluyor...</string>
+ <string name="progress_building_master_key">ana anahtarlık oluşturuluyor...</string>
<string name="progress_generating_rsa">yeni RSA anahtarı oluşturuluyor...</string>
<string name="progress_generating_dsa">yeni DSA anahtarı oluşturuluyor...</string>
<string name="progress_generating_elgamal">yeni ElGamal anahtarı oluşturuluyor...</string>
<string name="progress_generating_ecdsa">yeni ECDSA anahtarı oluşturuluyor...</string>
<string name="progress_generating_ecdh">yeni ECDH anahtarı oluşturuluyor...</string>
- <string name="progress_modify_subkeyadd">alt anahtar ekleniyor...</string>
+ <string name="progress_modify">anahtarlık değiştiriliyor...</string>
+ <string name="progress_modify_unlock">anahtarlık açılıyor...</string>
+ <string name="progress_modify_adduid">kullanıcı IDleri ekleniyor...</string>
+ <string name="progress_modify_revokeuid">kullanıcı IDleri yürürlükten kaldırılıyor...</string>
+ <string name="progress_modify_primaryuid">birincil kullanıcı IDsi değiştiriliyor...</string>
+ <string name="progress_modify_subkeychange">altanahtarlar değiştiriliyor...</string>
+ <string name="progress_modify_subkeyrevoke">altanahtarlar yürürlükten kaldırılıyor...</string>
+ <string name="progress_modify_subkeystrip">altanahtarlar çıkarılıyor...</string>
+ <string name="progress_modify_subkeyadd">altanahtarlar ekleniyor...</string>
<string name="progress_modify_passphrase">parola değiştiriliyor...</string>
<plurals name="progress_exporting_key">
- <item quantity="one">anahtar veriliyor...</item>
- <item quantity="other">anahtarlar veriliyor...</item>
+ <item quantity="one">anahtar dışa aktarılıyor...</item>
+ <item quantity="other">anahtarlar dışa aktarılıyor...</item>
</plurals>
- <string name="progress_extracting_signature_key">imza anahtarı veriliyor...</string>
- <string name="progress_extracting_key">anahtarlar veriliyor...</string>
+ <string name="progress_extracting_signature_key">imza anahtarı çıkarılıyor...</string>
+ <string name="progress_extracting_key">anahtar çıkarılıyor...</string>
+ <string name="progress_preparing_streams">akışlar hazırlanıyor...</string>
<string name="progress_encrypting">veri şifreleniyor...</string>
- <string name="progress_decrypting">veri çözümleniyor...</string>
+ <string name="progress_decrypting">veri şifresi çözülüyor...</string>
<string name="progress_preparing_signature">imza hazırlanıyor...</string>
<string name="progress_generating_signature">imza oluşturuluyor...</string>
<string name="progress_processing_signature">imza işleniyor...</string>
<string name="progress_verifying_signature">imza doğrulanıyor...</string>
<string name="progress_signing">imzalanıyor...</string>
- <string name="progress_certifying">doğrulanıyor...</string>
+ <string name="progress_certifying">tasdikleniyor...</string>
<string name="progress_reading_data">veri okunuyor...</string>
<string name="progress_finding_key">anahtar bulunuyor...</string>
+ <string name="progress_decompressing_data">sıkıştırılmış veri açılıyor...</string>
<string name="progress_verifying_integrity">bütünlük doğrulanıyor...</string>
+ <string name="progress_deleting_securely">\'%s\' güvenlice siliniyor...</string>
<string name="progress_deleting">anahtarlar siliniyor...</string>
+ <string name="progress_con_saving">birleştir: önbelleğe kaydediliyor...</string>
+ <string name="progress_con_reimport">birleştir: yeniden içe aktarılıyor...</string>
<!--action strings-->
- <string name="hint_keyserver_search_hint">İsim/E-Posta/Anahtar Kimliği...</string>
- <string name="hint_cloud_search_hint">İsim/E-Posta/Kanıt/Anahtar...</string>
+ <string name="hint_keyserver_search_hint">İsim/Eposta/Anahtar ID...</string>
+ <string name="hint_cloud_search_hint">İsim/Eposta/Kanıt/Anahtar...</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -278,6 +317,9 @@
<string name="key_size_4096">4096</string>
<string name="key_size_8192">8192</string>
<string name="key_size_custom">Özel anahtar boyutu</string>
+ <string name="key_size_custom_info">Özel anahtar boyutunu yazın (bit):</string>
+ <string name="key_size_custom_info_rsa">RSA anahtar boyutu 1024\'ten büyük olmalı ve en çok 16384 olabilir. Ek olarak 8 in katı olmalı.</string>
+ <string name="key_size_custom_info_dsa">DSA anahtar boyutu en az 512 olmalı ve en çok 1024 olabilir. Ek olarak 64 ün katı olmalı.</string>
<!--elliptic curve names-->
<string name="key_curve_nist_p256">NIST P-256</string>
<string name="key_curve_nist_p384">NIST P-384</string>
@@ -292,31 +334,34 @@
<!--Help-->
<string name="help_tab_start">Başla</string>
<string name="help_tab_faq">SSS</string>
- <string name="help_tab_wot">Web of Trust</string>
+ <string name="help_tab_wot">Güven Ağı</string>
<string name="help_tab_nfc_beam">NFC Beam</string>
<string name="help_tab_changelog">Sürüm Notları</string>
<string name="help_tab_about">Hakkında</string>
<string name="help_about_version">Sürüm:</string>
<!--Import-->
<string name="import_tab_keyserver">Anahtar Sunucusu</string>
- <string name="import_tab_cloud">Bulut Arama</string>
- <string name="import_tab_direct">Dosya/Pano</string>
- <string name="import_tab_qr_code">QR Kod/NFC</string>
- <string name="import_import">Seçili anahtarları al</string>
+ <string name="import_tab_cloud">Bulutta Ara</string>
+ <string name="import_tab_direct">Dosya/Kopyalama önbelleği</string>
+ <string name="import_tab_qr_code">QR Kodu/NFC</string>
+ <string name="import_import">Seçili anahtarları içe aktar</string>
+ <string name="import_qr_code_wrong">QR Kodu hatalı! Lütfen tekrar deneyin!</string>
<string name="import_qr_code_too_short_fingerprint">Parmak izi çok kısa (&lt; 16 karakter)</string>
+ <string name="import_qr_code_button">QR Kodu Tara</string>
<!--Generic result toast-->
- <string name="view_log">Günlüğü Görüntüle</string>
+ <string name="with_warnings">, uyarılarla</string>
+ <string name="with_cancelled">, iptal edilene kadar</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
- <item quantity="one">Anahtar başarıyla alındı</item>
- <item quantity="other">%1$d anahtar başarıyla alındı</item>
+ <item quantity="one">Anahtar başarıyla içe aktarıldı</item>
+ <item quantity="other">%1$d anahtar başarıyla içe aktarıldı</item>
</plurals>
<plurals name="import_keys_with_errors">
<item quantity="one">Bir anahtar için alma başarısız.</item>
- <item quantity="other">%d anahtar için alma başarısız!</item>
+ <item quantity="other">%d anahtar için içe aktarma başarısız!</item>
</plurals>
- <string name="import_error_nothing">Alınacak bir şey yok.</string>
- <string name="import_error_nothing_cancelled">Alma iptal edildi.</string>
+ <string name="import_error_nothing">İçe aktarılacak bir şey yok.</string>
+ <string name="import_error_nothing_cancelled">İçe aktarma iptal edildi.</string>
<!--Delete result toast-->
<string name="delete_nothing">Silinecek bir şey yok.</string>
<string name="delete_cancelled">Silme işlemi iptal edildi.</string>
@@ -340,7 +385,6 @@
<string name="api_settings_start">Uygulamayı başlat</string>
<string name="api_settings_delete_account">Hesabı sil</string>
<string name="api_settings_package_name">Paket Adı</string>
- <string name="api_settings_accounts">Hesaplar</string>
<string name="api_settings_settings">Ayarlar</string>
<string name="api_settings_key">Hesap anahtarı:</string>
<string name="api_register_allow">Erişime izin ver</string>
@@ -373,13 +417,25 @@
<string name="key_view_tab_share">Paylaş</string>
<string name="key_view_tab_keys">Alt anahtarlar</string>
<string name="key_view_tab_certs">Sertifikalar</string>
+ <string name="user_id_info_revoked_title">Yürürlükten kaldırılmış</string>
+ <string name="user_id_info_revoked_text">Bu kimlik anahtar sahibi tarafından yürürlükten kaldırılmış. Artık geçerli değil.</string>
+ <string name="user_id_info_certified_title">Tasdiklenmiş</string>
+ <string name="user_id_info_certified_text">Bu kimlik sizin tarafınızdan tasdiklendi.</string>
+ <string name="user_id_info_uncertified_title">Tasdiklenmemiş</string>
+ <string name="user_id_info_uncertified_text">Bu kimlik henüz tasdiklenmemiş. Bu kimliğin belirli bir kişiye ait olduğundan emin olamazsınız.</string>
<string name="user_id_info_invalid_title">Geçersiz</string>
<string name="user_id_info_invalid_text">Bu kimlikle ilgili yanlış olan bazı şeyler var!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Parolayı Değiştir</string>
<string name="edit_key_action_add_identity">Kimlik Ekle</string>
<string name="edit_key_action_add_subkey">Alt anahtar Ekle</string>
<string name="edit_key_edit_user_id_title">Bir eylem seç!</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>Birincil Kimliğe geç</item>
+ <item>Kimliği Yürürlükten Kaldır</item>
+ </string-array>
<string name="edit_key_edit_subkey_title">Bir eylem seç!</string>
<string name="edit_key_new_subkey">yeni alt anahtar</string>
<string name="edit_key_select_flag">Lütfen en az bir bayrak seçiniz!</string>
@@ -392,16 +448,13 @@
<string name="create_key_final_text">Şu kimliği girdiniz:</string>
<string name="create_key_final_robot_text">Anahtar oluşturma biraz zaman alabilir, bu sırada bir çay için...</string>
<string name="create_key_rsa">(3 alt anahtar, RSA, 4096 bit)</string>
+ <string name="create_key_custom">(özel anahtar yapılandırması)</string>
<string name="create_key_text">Tam isminizi, e-posta adresinizi girin ve bir parola seçin.</string>
<string name="create_key_hint_full_name">Tam Ad, örneğin: Max Mustermann</string>
<string name="create_key_edit">Anahtar yapılandırmasını değiştir.</string>
<!--View key-->
- <string name="view_key_expired">Bu anahtarın son kullanma tarihi geçmiş!</string>
<!--Navigation Drawer-->
<string name="nav_keys">Anahtarlar</string>
- <string name="nav_encrypt_text">Metni şifrele</string>
- <string name="nav_encrypt_files">Dosyaları şifrele</string>
- <string name="nav_decrypt">Çözümle</string>
<string name="nav_apps">Uygulamalar</string>
<string name="my_keys">Anahtarlarım</string>
<!--hints-->
@@ -420,6 +473,7 @@
<string name="msg_ip_delete_old_ok">Eski anahtarları veritabanından sil</string>
<string name="msg_ip_prepare">Veritabanı işlemleri hazırlanıyor</string>
<string name="msg_ip_master">Ana anahtar %s işleniyor</string>
+ <string name="msg_ip_uid_cert_error">Sertifika işlenirken hata!</string>
<!--Import Secret log entries-->
<string name="msg_is_db_exception">Veritabanı hatası!</string>
<!--Keyring Canonicalization log entries-->
@@ -432,12 +486,22 @@
<!--modifySecretKeyRing-->
<string name="msg_mf_subkey_new_id">Yeni alt anahtar ID: %s</string>
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<string name="msg_ek_error_not_found">Anahtar bulunamadı!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_error_no_data">Akış içinde şifrelenmiş veri bulunamadı!</string>
+ <string name="msg_dc_error_no_key">Akış içinde bilinen özel anahtar ile şifrelenmiş veri bulunamadı!</string>
+ <string name="msg_dc_prep_streams">Çözümleme için akışlar hazırlanıyor</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<string name="msg_crt_warn_not_found">Anahtar bulunamadı!</string>
+ <string name="msg_import_keyserver">%s anahtar sunucusu kullanılıyor</string>
+ <string name="msg_import_fingerprint_ok">Parmakizi kontrolü TAMAM</string>
<string name="msg_export_all">Tüm anahtarları dışa aktarma</string>
+ <string name="msg_export_error_uri_open">URI akışı açılırken hata!</string>
<string name="msg_export_error_db">Veritabanı hatası!</string>
<string name="msg_export_error_io">Giriş/çıkış hatası!</string>
<string name="msg_export_success">Dışa aktarma işlemi başarılı</string>
@@ -447,22 +511,39 @@
<!--PassphraseCache-->
<string name="passp_cache_notif_clear">Önbelleği Temizle</string>
<string name="passp_cache_notif_pwd">Parola</string>
+ <!--First Time-->
+ <string name="first_time_text1">Gizliliğinizi OpenKeychain ile geri alın!</string>
+ <string name="first_time_create_key">Anahtarımı oluştur</string>
+ <string name="first_time_import_key">Dosyadan içe aktar</string>
+ <string name="first_time_skip">Kurulumu Atla</string>
<!--unsorted-->
<string name="section_cert">Sertifika Detayları</string>
<string name="label_user_id">Kimlik</string>
<string name="unknown_uid">&lt;bilinmeyen&gt;</string>
<string name="empty_certs">Bu anahtar için sertifika yok</string>
+ <string name="label_revocation">Yürürlükten Kaldırma Nedeni</string>
<string name="label_verify_status">Doğrulama Durumu</string>
<string name="label_cert_type">Tip</string>
<string name="error_key_not_found">Anahtar bulunamadı!</string>
+ <string name="error_key_processing">Anahtar işlenirken hata!</string>
+ <string name="key_stripped">çıkartıldı</string>
+ <string name="key_divert">AkıllıKart/NFC için yönlendir</string>
<string name="key_no_passphrase">parola yok</string>
<string name="key_unavailable">mevcut değil</string>
+ <string name="secret_cannot_multiple">Kendi anahtarlarınız yalnızca teker teker silinebilir!</string>
<string name="title_view_cert">Sertifika Ayrıntılarını Görüntüle</string>
<string name="unknown_algorithm">bilinmeyen</string>
<string name="can_sign_not">imzalanamadı</string>
+ <string name="error_no_encrypt_subkey">Şifreleme için kullanılabilecek altanahtar mevcut değil!</string>
+ <string name="info_no_manual_account_creation">OpenKeychain-hesaplarını kendiniz oluşturmayın.\nDaha fazla bilgi için Yardım bölümüne bakın.</string>
<string name="contact_show_key">Anahtarı göster (%s)</string>
+ <string name="swipe_to_update">Anahtar sunucudan güncelleme almak için parmağınızı aşağıya doğru kaydırın</string>
+ <string name="error_no_file_selected">Şifrelemek için en az bir dosya seçin!</string>
+ <string name="error_multi_not_supported">Birden çok dosyanın kaydedilmesi desteklenmiyor. Bu şu anki Android\'in bir kısıtlamasıdır.</string>
<string name="key_colon">Anahtar:</string>
- <!--First Time-->
- <string name="first_time_create_key">Anahtarımı oluştur</string>
- <string name="first_time_skip">Kurulumu Atla</string>
+ <string name="exchange_description">Anahtar değiş tokuşu başlatmak için sağ taraftan katılımcıların sayısını seçin ve \"Değiş tokuşu başlat\" tuşuna tıklayın.\n\nSadece istenilen katılımcıların değişim işleminde olduğundan ve parmak izlerinin doğruluğundan emin olmak için size iki soru daha sorulacak.</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml
index 80e920b8b..cf586b2d5 100644
--- a/OpenKeychain/src/main/res/values-uk/strings.xml
+++ b/OpenKeychain/src/main/res/values-uk/strings.xml
@@ -2,16 +2,17 @@
<resources>
<!--GENERAL: Please put all strings inside quotes as described in example 1 on
http://developer.android.com/guide/topics/resources/string-resource.html (scroll down to "Escaping apostrophes and quotes").-->
+ <string name="app_name">OpenKeychain</string>
<!--title-->
<string name="title_select_recipients">Вибрати ключі</string>
<string name="title_select_secret_key">Виберіть ваш ключ</string>
+ <string name="title_encrypt_text">Зашифрувати текст…</string>
+ <string name="title_encrypt_files">Зашифрувати файли</string>
<string name="title_decrypt">Розшифрувати</string>
- <string name="title_unlock">Парольна фраза</string>
<string name="title_add_subkey">Додати підключ</string>
<string name="title_edit_key">Редагувати ключ</string>
- <string name="title_preferences">Налаштування</string>
+ <string name="title_cloud_search_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_share_fingerprint_with">Поділитися відбитком із…</string>
<string name="title_share_key">Поділитися ключем з…</string>
@@ -20,6 +21,7 @@
<string name="title_encrypt_to_file">Зашифрувати до файлу</string>
<string name="title_decrypt_to_file">Розшифрувати до файлу</string>
<string name="title_import_keys">Імпортувати ключі</string>
+ <string name="title_add_keys">Додати ключі</string>
<string name="title_export_key">Експортувати ключ</string>
<string name="title_export_keys">Експортувати ключі</string>
<string name="title_key_not_found">Ключ не знайдено</string>
@@ -29,17 +31,27 @@
<string name="title_help">Довідка</string>
<string name="title_log_display">Журнал</string>
<string name="title_create_key">Створити ключ</string>
+ <string name="title_exchange_keys">Обміняти ключі</string>
+ <string name="title_advanced_key_info">Додаткова інформація про ключ</string>
<!--section-->
<string name="section_user_ids">Сутності</string>
<string name="section_keys">Підключі</string>
+ <string name="section_cloud_search">Хмарний пошук</string>
<string name="section_general">Загальне</string>
<string name="section_defaults">Типове</string>
<string name="section_advanced">Додаткове</string>
+ <string name="section_passphrase_cache">Кеш парольної фрази</string>
+ <string name="section_certify">Сертифікувати</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_fingerprint">Відбиток</string>
<string name="section_key_to_certify">Ключ для сертикації</string>
+ <string name="section_decrypt_files">Файли</string>
+ <string name="section_decrypt_text">Текст</string>
+ <string name="section_certs">Сертифікати</string>
<!--button-->
<string name="btn_decrypt_verify_file">Розшифрувати, перевірити та зберегти файл</string>
<string name="btn_decrypt_verify_message">Розшифрувати і перевірити повідомлення</string>
@@ -58,12 +70,16 @@
<string name="btn_view_cert_key">Переглянути ключ сертифікації</string>
<string name="btn_create_key">Створити ключ</string>
<string name="btn_add_files">Додати файл(и)</string>
+ <string name="btn_add_share_decrypted_text">Поширити розшифрований текст</string>
+ <string name="btn_decrypt_and_verify">і перевірити підписи</string>
+ <string name="btn_decrypt_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_import_existing_key">Імпорт з файлу</string>
<string name="menu_search">Пошук</string>
<string name="menu_beam_preferences">Налаштування променя</string>
<string name="menu_key_edit_cancel">Скасувати</string>
@@ -79,11 +95,27 @@
<string name="label_file_colon">Файл:</string>
<string name="label_no_passphrase">Без парольної фрази</string>
<string name="label_passphrase">Парольна фраза</string>
+ <string name="label_unlock">Розблоковується…</string>
<string name="label_passphrase_again">Повторити пароль</string>
<string name="label_algorithm">Алгоритм</string>
<string name="label_ascii_armor">Файл ASCII Armor</string>
+ <string name="label_file_ascii_armor">Увімкнути ASCII Armor</string>
<string name="label_write_version_header">Нехай інші дізнаються, що ви користуєтеся OpenKeychain</string>
<string name="label_write_version_header_summary">Напишіть \'OpenKeychain v2.7\' для підписів, зашифрованого тексту та експортованих ключів OpenPGP</string>
+ <string name="label_use_default_yubikey_pin">Вживати типовий YubiKey PIN</string>
+ <string name="label_use_num_keypad_for_yubikey_pin">Вживати цифрову клавіатуру для YubiKey PIN</string>
+ <string name="label_label_use_default_yubikey_pin_summary">Вживається типовий PIN (123456) для доступу до YubiKey чреез NFC</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_encryption_algorithm">Алгоритм шифрування</string>
+ <string name="label_hash_algorithm">Хеш алгоритм</string>
+ <string name="label_symmetric">Зашифрувати з парольною фразою</string>
+ <string name="label_passphrase_cache_ttl">Кешувати час</string>
+ <string name="label_passphrase_cache_subs">Кешувати парольні фрази за підключем</string>
+ <string name="label_message_compression">Стиснення повідомлення</string>
+ <string name="label_file_compression">Стиснення файлу</string>
<string name="label_keyservers">Сервери ключів</string>
<string name="label_key_id">ІД ключа</string>
<string name="label_creation">Створення</string>
@@ -95,8 +127,11 @@
<string name="label_name">Назва</string>
<string name="label_comment">Коментар</string>
<string name="label_email">Ел. пошта</string>
+ <string name="label_send_key">Синхронізувати із хмарою</string>
<string name="label_fingerprint">Відбиток</string>
<string name="expiry_date_dialog_title">Задати термін дії</string>
+ <string name="label_first_keyserver_is_used">(Перший наведений сервер ключів є бажаний)</string>
+ <string name="label_preferred">бажаний</string>
<string name="user_id_no_name">&lt;без імені&gt;</string>
<string name="none">&lt;жоден&gt;</string>
<string name="no_key">&lt;без ключа&gt;</string>
@@ -152,6 +187,7 @@
<string name="passphrase_must_not_be_empty">Будь ласка, введіть парольну фразу.</string>
<string name="passphrase_for_symmetric_encryption">Симетричне шифрування.</string>
<string name="passphrase_for">Введіть парольну фразу для \'%s\'</string>
+ <string name="file_delete_confirmation">Ви справді хочете вилучити\n%s?</string>
<string name="file_delete_successful">Успішно вилучено.</string>
<string name="no_file_selected">Виберіть спершу файл.</string>
<string name="encrypt_sign_successful">Успішно підписано та/або перевірено.</string>
@@ -159,18 +195,33 @@
<string name="enter_passphrase_twice">Введіть двічі парольну фразу.</string>
<string name="select_encryption_key">Виберіть принаймні один ключ шифрування.</string>
<string name="select_encryption_or_signature_key">Виберіть принаймні один ключ шифрування або ключ підпису.</string>
+ <string name="specify_file_to_encrypt_to">Будь ласка, виберіть файл для шифрування.\nУВАГА! Якщо файл існує, то він буде переписаний.</string>
+ <string name="specify_file_to_decrypt_to">Будь ласка, виберіть файл для розшифрування.\nУВАГА! Якщо файл існує, то він буде переписаний.</string>
+ <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="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_not_found">Не можливо знайти ключ %08X.</string>
+ <plurals name="bad_keys_encountered">
+ <item quantity="one">%d поганий секретний ключ проігнорований. Можливо ви експортували з параметром\n
+ --export-secret-subkeys\nЗробіть ваш експорт з --export-secret-keys\n натомість.</item>
+ <item quantity="few">%d погані секретні ключі проігноровані. Можливо ви експортували з параметром\n
+ --export-secret-subkeys\nЗробіть ваш експорт з --export-secret-keys\n натомість.</item>
+ <item quantity="other">%d поганих секретних ключів проігноровано. Можливо ви експортували з параметром\n
+ --export-secret-subkeys\nЗробіть ваш експорт з --export-secret-keys\n натомість.</item>
+ </plurals>
<string name="list_empty">Цей список - порожній!</string>
<string name="nfc_successful">Успішно надіслано ключ через промінь NFC!</string>
<string name="key_copied_to_clipboard">Ключ вже скопійовано у буфер обміну!</string>
<string name="fingerprint_copied_to_clipboard">Відбиток вже скопійовано до буфера обміну!</string>
<string name="select_key_to_certify">Будь ласка, виберіть ключ для використання у сертифікації!</string>
<string name="key_too_big_for_sharing">Ключ надто великий для цього способу поширення!</string>
+ <string name="text_copied_to_clipboard">Текст вже скопійовано у буфер обміну!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
@@ -189,12 +240,21 @@
<string name="error_could_not_extract_private_key">не можна витягти секретний ключ</string>
<!--errors without preceeding Error:-->
<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_generic_report_bug">Трапилася загальна помилка, будь ласка, створіть новий звіт про помилку для OpenKeychain.</string>
<!--results shown after decryption/verification-->
+ <string name="decrypt_result_no_signature">Не підписано</string>
<string name="decrypt_result_invalid_signature">Невірний підпис!</string>
+ <string name="decrypt_result_signature_uncertified">Підписано (не сертифіковано)</string>
+ <string name="decrypt_result_signature_expired_key">Термін дії ключа минув!</string>
+ <string name="decrypt_result_signature_revoked_key">Ключ вже відкликано!</string>
+ <string name="decrypt_result_signature_missing_key">Невідомий відкритий ключ</string>
+ <string name="decrypt_result_encrypted">Зашифровано</string>
+ <string name="decrypt_result_not_encrypted">Незашифровано</string>
+ <string name="decrypt_result_action_show">Показати</string>
+ <string name="decrypt_result_action_Lookup">Шукати</string>
<!--Add keys-->
+ <string name="add_keys_my_key">Мій ключ:</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">Готово.</string>
<string name="progress_cancel">Скасувати</string>
@@ -284,7 +344,6 @@
<string name="import_qr_code_wrong">Невірний штрих-код! Спробуйте знову!</string>
<string name="import_qr_code_too_short_fingerprint">Відбиток надто короткий (&lt; 16 символів)</string>
<!--Generic result toast-->
- <string name="view_log">Переглянути журнал</string>
<!--Import result toast-->
<plurals name="import_keys_added_and_updated_1">
<item quantity="one">Успішно імпортовано ключ.</item>
@@ -307,7 +366,10 @@
<item quantity="other">Успішно оновлено %1$d ключів%2$s.</item>
</plurals>
<string name="import_error_nothing">Нема що імпортувати.</string>
+ <string name="import_error_nothing_cancelled">Імпорт скасовано.</string>
<!--Delete result toast-->
+ <string name="delete_nothing">Нема що вилучати.</string>
+ <string name="delete_cancelled">Операція вилучення скасована.</string>
<!--Certify result toast-->
<!--Intent labels-->
<string name="intent_decrypt_file">Розшифрувати файл з OpenKeychain</string>
@@ -329,7 +391,7 @@
<string name="api_settings_delete_account">Видалити профіль</string>
<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_settings">Параметри</string>
<string name="api_settings_accounts_empty">Немає облікового запису приєднаного до цієї програми.</string>
<string name="api_register_allow">Дозволити доступ</string>
<string name="api_register_disallow">Не дозволити доступ</string>
@@ -348,19 +410,29 @@
<item quantity="few">%d ключі вибрано.</item>
<item quantity="other">%d ключів вибрано.</item>
</plurals>
+ <string name="key_list_empty_text1">Ключ не знайдено!</string>
+ <string name="key_list_filter_show_all">Показати усі ключі</string>
<!--Key view-->
<string name="key_view_action_edit">Редагувати ключ</string>
+ <string name="key_view_action_encrypt">Зашифрувати текст</string>
+ <string name="key_view_action_encrypt_files">файли</string>
<string name="key_view_action_certify">Сертифікувати сутності</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>
<string name="user_id_info_revoked_title">Відхилено</string>
<string name="user_id_info_revoked_text">Ця сутність вже відкликана власником ключа. Вона більше не дійсна.</string>
+ <string name="user_id_info_certified_title">Сертифіковано</string>
+ <string name="user_id_info_uncertified_title">Несертифіковано</string>
<string name="user_id_info_invalid_title">Недійсна</string>
<string name="user_id_info_invalid_text">Щось неправильне у цій сутності!</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<string name="edit_key_action_change_passphrase">Змінити пароль</string>
<string name="edit_key_action_add_identity">Додати сутність</string>
@@ -368,7 +440,10 @@
<string name="edit_key_edit_user_id_title">Виберіть дію!</string>
<string name="edit_key_edit_user_id_revoked">Ця сутність вже відкликана. Це не можна скасувати.</string>
<string name="edit_key_edit_subkey_title">Виберіть дію!</string>
+ <string name="edit_key_new_subkey">новий підключ</string>
<string name="edit_key_select_flag">Будь ласка, виберіть хоча б один прапор!</string>
+ <string name="edit_key_error_add_identity">Додати хоча б одну сутність!</string>
+ <string name="edit_key_error_add_subkey">Додати хоча б один підключ!</string>
<!--Create key-->
<string name="create_key_upload">Відвантажити ключ на сервер ключів</string>
<string name="create_key_empty">Це поле - обов\'язкове</string>
@@ -377,8 +452,6 @@
<string name="create_key_text">Введіть ваше повне ім\'я, електронну адреса та оберіть парольну фразу.</string>
<string name="create_key_hint_full_name">Повне ім\'я, наприклад Степан Бандера</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_apps">Програми</string>
@@ -386,6 +459,7 @@
<string name="drawer_close">Закрити панель навігації</string>
<string name="my_keys">Мої ключі</string>
<!--hints-->
+ <string name="encrypt_content_edit_text_hint">Набрати текст</string>
<!--certs-->
<string name="cert_default">типово</string>
<string name="cert_none">жоден</string>
@@ -397,12 +471,17 @@
<string name="cert_verify_error">Помилка!</string>
<string name="cert_verify_unavailable">Недоступний ключ</string>
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
+ <string name="msg_internal_error">Внутрішня помилка!</string>
+ <string name="msg_cancelled">Операція скасована.</string>
<!--Import Public log entries-->
<string name="msg_ip_apply_batch">Застосовується пакетна операція вставки.</string>
<string name="msg_ip_bad_type_secret">Спробували імпортувати секретну в\'язку як публічну. Це вада. Будь ласка, відправте звіт!</string>
<string name="msg_ip_delete_old_fail">Нема вилученого старого ключа (створюється новий?)</string>
<string name="msg_ip_delete_old_ok">Вилучений старий ключ з бази даних</string>
<string name="msg_ip_encode_fail">Операція не вдалася через помилку кодування</string>
+ <string name="msg_ip_error_io_exc">Операція не вдалася через помилку введення/виведення</string>
+ <string name="msg_ip_error_op_exc">Операція не вдалася через помилку бази даних</string>
+ <string name="msg_ip_error_remote_ex">Операція не вдалася через внутрішню помилку</string>
<string name="msg_ip">Імпортується публічна в\'язка %s</string>
<string name="msg_ip_insert_keyring">Шифруються дані із в\'язки</string>
<string name="msg_ip_insert_keys">Аналізуються ключі</string>
@@ -423,12 +502,14 @@
<item quantity="few">Ігнорується %s сертифікати, виданих невідомими відкритими ключами</item>
<item quantity="other">Ігнорується %s сертифікатів, виданих невідомими відкритими ключами</item>
</plurals>
+ <string name="msg_ip_uid_revoked">ІД користувача відхилене</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>
<string name="msg_is_importing_subkeys">Опрацьовуються секретні підключі</string>
+ <string name="msg_is_error_io_exc">Помилка шифрування в’язки</string>
<string name="msg_is_pubring_generate">Генерується публічна в\'язка із секретної</string>
<string name="msg_is_success_identical">В\'язка не містить нових даних. Нема що робити.</string>
<string name="msg_is_success">Успішно імпортована секретна в\'язка</string>
@@ -456,12 +537,12 @@
<string name="msg_mg_secret">Злиття у секретну в\'язку %s</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_certify">Основний ключ повинен мати прапорець certify!</string>
<string name="msg_cr_error_keysize_512">Розмір ключа має бути більшим або рівним 512!</string>
- <string name="msg_cr_error_internal_pgp">Внутрішня помилка PGP!</string>
<!--modifySecretKeyRing-->
<string name="msg_mr">Змінюється в\'язка %s</string>
<string name="msg_mf_error_encode">Виняток шифрування!</string>
@@ -469,23 +550,47 @@
<string name="msg_mf_error_keyid">Немає ІД ключа. Це внутрішня помилка! Будь ласка, надішліть звіт про ваду!</string>
<string name="msg_mf_error_integrity">Внутрішня помилка - збій перевірки цілісності!</string>
<string name="msg_mf_error_master_none">Не знайдено основного сертифікату для операцій! (Усе відкликано?)</string>
+ <string name="msg_mf_error_noexist_primary">Вказаний поганий ІД первинного користувача!</string>
+ <string name="msg_mf_error_noexist_revoke">Вказаний поганий ІД первинного користувача!</string>
+ <string name="msg_mf_error_revoked_primary">ІД відхилених користувачів не може бути первинним!</string>
<string name="msg_mf_error_sig">Виняток підпису!</string>
<string name="msg_mf_master">Змінюються основі сертифікації</string>
+ <string name="msg_mf_primary_replace_old">Замінюється сертифікат ІД попереднього первинного користувача</string>
+ <string name="msg_mf_primary_new">Генерується новий сертифікат для ІД нового первинного користувача</string>
<string name="msg_mf_subkey_change">Змінюється підключ %s</string>
<string name="msg_mf_error_subkey_missing">Спробували працювати із втраченим підключем %s!</string>
+ <string name="msg_mf_subkey_new">Додається новий підключ типу %s</string>
<string name="msg_mf_subkey_new_id">Новий ід підключа: %s</string>
<string name="msg_mf_error_past_expiry">Дата завершення дії не може бути у минулому!</string>
<string name="msg_mf_subkey_revoke">Відкликається підключ %s</string>
<string name="msg_mf_success">Успішно модифіковано в\'язку</string>
+ <string name="msg_mf_uid_add">Додається ід користувача %s</string>
+ <string name="msg_mf_uid_primary">Змінюється первинне ІД користувача на %s</string>
+ <string name="msg_mf_uid_revoke">Відхилення ІД користувача %s</string>
<string name="msg_mf_uid_error_empty">ІД користувача не повинно бути порожнім!</string>
<string name="msg_mf_unlock_error">Помилка розблокування в\'язки!</string>
<string name="msg_mf_unlock">Розблоковується в\'язка</string>
<!--Consolidate-->
+ <string name="msg_con_save_secret">Збереження секретних в\'язок</string>
+ <string name="msg_con_save_public">Збереження публічних в\'язок</string>
+ <string name="msg_con_db_clear">Очищення бази даних</string>
+ <string name="msg_con_error_db">Помилка відкриття бази даних!</string>
<string name="msg_con_error_public">Помилка повторного імпорту публічних ключів!</string>
<string name="msg_con_error_secret">Помилка повторного імпорту секретних ключів!</string>
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
+ <string name="msg_ek_error_not_found">Ключ не знайдено!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_clear_meta_file">Назва файла: %s</string>
+ <string name="msg_dc_clear_meta_mime">Тип MIME: %s</string>
+ <string name="msg_dc_clear_meta_size">Розмір файла: %s</string>
+ <string name="msg_dc_clear_meta_time">Час зміни: %s</string>
+ <string name="msg_dc_error_integrity_check">Помилка перевірки цілісності!</string>
+ <string name="msg_dc_ok">Гаразд</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<plurals name="error_import_non_pgp_part">
<item quantity="one">частина завантаженого файлу є вірним об\'єктом OpenPGP, але не ключем OpenPGP</item>
<item quantity="few">частини завантаженого файлу є вірним об\'єктом OpenPGP, але не ключем OpenPGP</item>
@@ -496,6 +601,10 @@
<string name="passp_cache_notif_n_keys">OpenKeychain має %d кешованих парольних фраз</string>
<string name="passp_cache_notif_keys">Кешовані парольні фрази:</string>
<string name="passp_cache_notif_clear">Очистити кеш</string>
+ <!--First Time-->
+ <string name="first_time_text1">Заберіть вашу приватність із OpenKeychain!</string>
+ <string name="first_time_create_key">Створити мій ключ</string>
+ <string name="first_time_skip">Пропустити установку</string>
<!--unsorted-->
<string name="section_certifier_id">Ким підписаний</string>
<string name="section_cert">Дані сертифікату</string>
@@ -514,8 +623,8 @@
<string name="can_sign_not">не можна підписати</string>
<string name="error_no_encrypt_subkey">Жодний підключ шифрування недоступний!</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_skip">Пропустити установку</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml b/OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml
deleted file mode 100644
index 0b6c4c4f5..000000000
--- a/OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- Generated with http://android-holo-colors.com -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-
- <style name="ButtonKeychainTheme" parent="android:Widget.Holo.Light.Button">
- <item name="android:background">@drawable/keychaintheme_btn_default_holo_light</item>
- </style>
-
- <style name="ImageButtonKeychainTheme" parent="android:Widget.Holo.Light.ImageButton">
- <item name="android:background">@drawable/keychaintheme_btn_default_holo_light</item>
- </style>
-
- <style name="SpinnerKeychainTheme" parent="android:Widget.Holo.Light.Spinner">
- <item name="android:background">@drawable/keychaintheme_spinner_background_holo_light</item>
- <item name="android:dropDownSelector">@drawable/keychaintheme_list_selector_holo_light</item>
- </style>
-
- <style name="ProgressBarKeychainTheme" parent="android:Widget.Holo.Light.ProgressBar.Horizontal">
- <item name="android:progressDrawable">@drawable/keychaintheme_progress_horizontal_holo_light</item>
- <item name="android:indeterminateDrawable">@drawable/keychaintheme_progress_indeterminate_horizontal_holo_light</item>
- </style>
-
- <style name="SectionHeader">
- <item name="android:drawableBottom">@drawable/section_header</item>
- <item name="android:drawablePadding">4dp</item>
- <item name="android:layout_marginTop">8dp</item>
- <item name="android:paddingLeft">8dp</item>
- <item name="android:textAllCaps">true</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">@color/emphasis</item>
- <item name="android:textSize">14sp</item>
- </style>
-
-</resources>
diff --git a/OpenKeychain/src/main/res/values-v11/themes_keychaintheme.xml b/OpenKeychain/src/main/res/values-v11/themes_keychaintheme.xml
deleted file mode 100644
index 4f13f81c6..000000000
--- a/OpenKeychain/src/main/res/values-v11/themes_keychaintheme.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- Generated with http://android-holo-colors.com -->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-
- <style name="KeychainTheme" parent="@style/_KeychainTheme"/>
-
- <style name="_KeychainTheme" parent="Theme.AppCompat.Light">
-
- <item name="android:editTextBackground">@drawable/keychaintheme_edit_text_holo_light</item>
-
- <item name="android:listChoiceIndicatorMultiple">@drawable/keychaintheme_btn_check_holo_light</item>
-
- <item name="android:buttonStyle">@style/ButtonKeychainTheme</item>
-
- <item name="android:imageButtonStyle">@style/ImageButtonKeychainTheme</item>
-
- <item name="android:dropDownSpinnerStyle">@style/SpinnerKeychainTheme</item>
-
- <item name="android:progressBarStyleHorizontal">@style/ProgressBarKeychainTheme</item>
-
- <item name="android:listChoiceBackgroundIndicator">@drawable/keychaintheme_list_selector_holo_light</item>
-
- <item name="android:activatedBackgroundIndicator">@drawable/keychaintheme_activated_background_holo_light</item>
-
- <item name="android:fastScrollThumbDrawable">@drawable/apptheme_fastscroll_thumb_holo</item>
-
- <item name="android:selectableItemBackground">@drawable/keychaintheme_list_selector_holo_light</item>
-
- </style>
-
-</resources>
diff --git a/OpenKeychain/src/main/res/values-v21/dimens.xml b/OpenKeychain/src/main/res/values-v21/dimens.xml
new file mode 100644
index 000000000..7e07ae0f9
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-v21/dimens.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!--
+ Status bar height according to
+ http://www.google.com/design/spec/layout/structure.html#structure-system-bars
+ -->
+ <dimen name="statusbar_height">24dp</dimen>
+ <!-- 120dp + statusbar_height -->
+ <dimen name="big_toolbar">141dp</dimen>
+ <dimen name="huge_toolbar">243dp</dimen>
+</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values-v21/themes.xml b/OpenKeychain/src/main/res/values-v21/themes.xml
new file mode 100644
index 000000000..b47026e5b
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-v21/themes.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <style name="KeychainTheme" parent="KeychainTheme.Base">
+ <item name="android:windowTranslucentStatus">true</item>
+
+ <!-- enable window content transitions -->
+ <item name="android:windowContentTransitions">true</item>
+ <item name="android:windowAllowEnterTransitionOverlap">true</item>
+ <item name="android:windowAllowReturnTransitionOverlap">true</item>
+ <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
+ <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
+
+ </style>
+</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
index 86fd2b4ac..b6ab2c8a4 100644
--- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
@@ -9,13 +9,10 @@
<string name="title_encrypt_text">加密文字</string>
<string name="title_encrypt_files">加密檔案</string>
<string name="title_decrypt">解密</string>
- <string name="title_unlock">口令</string>
<string name="title_add_subkey">新增子金鑰</string>
<string name="title_edit_key">編輯金鑰</string>
- <string name="title_preferences">偏好設定</string>
- <string name="title_cloud_search_preferences">雲端檢索設定</string>
+ <string name="title_cloud_search_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_share_fingerprint_with">分享指紋…</string>
<string name="title_share_key">分享金鑰…</string>
@@ -24,6 +21,7 @@
<string name="title_encrypt_to_file">加密到檔案</string>
<string name="title_decrypt_to_file">解密到檔案</string>
<string name="title_import_keys">匯入金鑰</string>
+ <string name="title_add_keys">新增金鑰</string>
<string name="title_export_key">匯出金鑰</string>
<string name="title_export_keys">匯出所有金鑰</string>
<string name="title_key_not_found">找不到金鑰</string>
@@ -33,13 +31,16 @@
<string name="title_help">說明</string>
<string name="title_log_display">紀錄</string>
<string name="title_create_key">建立金鑰</string>
+ <string name="title_exchange_keys">交換金鑰</string>
+ <string name="title_advanced_key_info">進階資訊</string>
<!--section-->
<string name="section_user_ids">身份</string>
<string name="section_keys">子金鑰</string>
- <string name="section_cloud_search">雲端檢索</string>
+ <string name="section_cloud_search">雲端查詢</string>
<string name="section_general">一般</string>
<string name="section_defaults">預設</string>
<string name="section_advanced">進階</string>
+ <string name="section_passphrase_cache">口令快取</string>
<string name="section_certification_key">用來簽署的私鑰</string>
<string name="section_key_server">金鑰伺服器</string>
<string name="section_fingerprint">指紋</string>
@@ -65,7 +66,6 @@
<string name="btn_create_key">建立金鑰</string>
<string name="btn_add_files">加入檔案</string>
<string name="btn_add_share_decrypted_text">解密並分享訊息</string>
- <string name="btn_decrypt_clipboard">解密剪貼簿的內容</string>
<string name="btn_decrypt_and_verify">並且驗證簽名</string>
<string name="btn_decrypt_files">解密檔案</string>
<!--menu-->
@@ -74,6 +74,7 @@
<string name="menu_export_key">匯出到檔案</string>
<string name="menu_delete_key">刪除金鑰</string>
<string name="menu_create_key">建立金鑰</string>
+ <string name="menu_import_existing_key">從檔案匯入</string>
<string name="menu_search">搜尋</string>
<string name="menu_beam_preferences">Beam 設定</string>
<string name="menu_key_edit_cancel">取消</string>
@@ -91,8 +92,6 @@
<string name="label_algorithm">演算法</string>
<string name="label_write_version_header">讓別人知道我在使用OpenKeychain</string>
<string name="label_write_version_header_summary">在簽名、密文與匯出的金鑰裡寫入\'OpenKeychain v2.7\'</string>
- <string name="label_use_default_yubikey_pin">使用預設的Yubikey PIN</string>
- <string name="label_label_use_default_yubikey_pin_summary">使用預設的PIN (123456)來通過NFC存取Yubikeys</string>
<string name="label_asymmetric_from">簽名自:</string>
<string name="label_to">加密給:</string>
<string name="label_delete_after_encryption">加密後刪除檔案</string>
@@ -100,6 +99,7 @@
<string name="label_encryption_algorithm">加密演算法</string>
<string name="label_hash_algorithm">雜湊演算法</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>
<string name="label_keyservers">金鑰伺服器</string>
@@ -113,6 +113,7 @@
<string name="label_name">名字</string>
<string name="label_comment">註記</string>
<string name="label_email">Email</string>
+ <string name="label_send_key">與雲端同步</string>
<string name="label_fingerprint">指紋</string>
<string name="expiry_date_dialog_title">設定效期</string>
<string name="can_encrypt">可以加密</string>
@@ -151,28 +152,61 @@
<string name="flag_authenticate">驗證</string>
<!--sentences-->
<string name="wrong_passphrase">口令錯誤。</string>
+ <string name="no_filemanager_installed">找不到相容的檔案管理員。</string>
+ <string name="passphrases_do_not_match">口令不相符。</string>
+ <string name="passphrase_must_not_be_empty">請輸入口令。</string>
<string name="passphrase_for_symmetric_encryption">對稱加密。</string>
+ <string name="file_delete_confirmation">你確定要刪除\n%s?</string>
<string name="file_delete_successful">刪除成功。</string>
+ <string name="no_file_selected">請先選擇檔案。</string>
+ <string name="encrypt_sign_successful">成功簽名並/或加密。</string>
+ <string name="encrypt_sign_clipboard_successful">成功簽名並/或加密到剪貼簿。</string>
+ <string name="enter_passphrase_twice">重複輸入口令</string>
+ <string name="select_encryption_key">選擇至少一把加密金鑰。</string>
+ <string name="select_encryption_or_signature_key">選擇至少一把加密或簽名金鑰。</string>
+ <string name="specify_file_to_encrypt_to">請選擇要將檔案加密到哪。\n警告:已經存在的檔案將被覆蓋。</string>
+ <string name="specify_file_to_decrypt_to">請選擇要將檔案解密到哪。\n警告:已經存在的檔案將被覆蓋。</string>
+ <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="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="nfc_successful">NFC Beam發送金鑰成功!</string>
<string name="key_copied_to_clipboard">金鑰已複製到剪貼簿!</string>
<string name="fingerprint_copied_to_clipboard">指紋已複製到剪貼簿!</string>
+ <string name="select_key_to_certify">請選擇要用來認證的金鑰!</string>
<string name="key_too_big_for_sharing">金鑰太大無法使用此方式分享!</string>
<string name="text_copied_to_clipboard">文字已複製到剪貼簿!</string>
<!--errors
no punctuation, all lowercase,
they will be put after "error_message", e.g. "Error: file not found"-->
+ <string name="error_file_delete_failed">刪除%s失敗</string>
<string name="error_file_not_found">找不到檔案</string>
<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_user_id_no_email">沒有找到電子郵件</string>
+ <string name="error_key_needs_a_user_id">需要至少一個身分識別</string>
+ <string name="error_no_signature_passphrase">沒有提供口令</string>
+ <string name="error_no_signature_key">找不到簽名金鑰</string>
+ <string name="error_integrity_check_failed">完整性檢查失敗!資料已被修改!</string>
<string name="error_wrong_passphrase">口令錯誤</string>
+ <string name="error_could_not_extract_private_key">無法抽取私鑰</string>
<!--errors without preceeding Error:-->
- <string name="error_nfc_needed">您的裝置不支援NFC!</string>
+ <string name="error_jelly_bean_needed">需要Android 4.1以上才能使用NFC Beam功能!</string>
+ <string name="error_nothing_import">找不到金鑰!</string>
<!--results shown after decryption/verification-->
+ <string name="decrypt_result_no_signature">尚未簽名</string>
<string name="decrypt_result_invalid_signature">無效的簽章!</string>
+ <string name="decrypt_result_signature_expired_key">金鑰已過期!</string>
+ <string name="decrypt_result_signature_revoked_key">金鑰已被撤銷!</string>
+ <string name="decrypt_result_signature_missing_key">未知的公鑰</string>
+ <string name="decrypt_result_encrypted">已加密</string>
+ <string name="decrypt_result_not_encrypted">未加密</string>
+ <string name="decrypt_invalid_text">簽名無效或是金鑰已經過期/被撤銷,無法確認訊息內容的作者。是否繼續顯示?</string>
+ <string name="decrypt_invalid_button">我明白這樣做的風險,顯示它!</string>
<!--Add keys-->
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">完成。</string>
@@ -182,43 +216,240 @@
<string name="progress_importing">匯入中…</string>
<string name="progress_exporting">匯出中…</string>
<string name="progress_uploading">正在上傳…</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_generating_ecdsa">正在產生新的ECDSA金鑰…</string>
+ <string name="progress_generating_ecdh">正在產生新的ECDH金鑰…</string>
+ <string name="progress_modify">正在變更鑰匙圈…</string>
+ <string name="progress_modify_unlock">正在解鎖鑰匙圈…</string>
+ <string name="progress_modify_adduid">正在新增使用者身份…</string>
+ <string name="progress_modify_revokeuid">正在撤銷使用者身份…</string>
+ <string name="progress_modify_primaryuid">正在變更主要使用者身份…</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>
+ <string name="progress_extracting_signature_key">正在抽取簽名金鑰…</string>
+ <string name="progress_extracting_key">正在抽取金鑰…</string>
+ <string name="progress_preparing_streams">正在準備串流…</string>
+ <string name="progress_encrypting">正在加密資料…</string>
+ <string name="progress_decrypting">正在解密資料…</string>
+ <string name="progress_preparing_signature">正在準備簽名…</string>
+ <string name="progress_generating_signature">正在產生簽名…</string>
+ <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>
+ <string name="progress_verifying_integrity">正在驗證完整性…</string>
+ <string name="progress_deleting">正在刪除金鑰…</string>
<!--action strings-->
<!--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">自訂金鑰長度</string>
<!--elliptic curve names-->
+ <string name="key_curve_nist_p256">NIST P-256</string>
+ <string name="key_curve_nist_p384">NIST P-384</string>
+ <string name="key_curve_nist_p521">NIST P-521</string>
<!--not in for now, see SaveKeyringParcel
<string name="key_curve_bp_p256">"Brainpool P-256"</string>
<string name="key_curve_bp_p384">"Brainpool P-384"</string>
<string name="key_curve_bp_p512">"Brainpool P-512"</string>-->
<!--compression-->
+ <string name="compression_fast">快</string>
+ <string name="compression_very_slow">非常慢</string>
<!--Help-->
+ <string name="help_tab_start">快速上手</string>
+ <string name="help_tab_faq">常見問題</string>
+ <string name="help_tab_wot">信任網</string>
+ <string name="help_tab_nfc_beam">NFC Beam</string>
+ <string name="help_tab_changelog">更新紀錄</string>
+ <string name="help_tab_about">關於</string>
+ <string name="help_about_version">版本:</string>
<!--Import-->
+ <string name="import_tab_keyserver">金鑰伺服器</string>
+ <string name="import_tab_cloud">雲端查詢</string>
+ <string name="import_tab_direct">檔案/剪貼簿</string>
+ <string name="import_tab_qr_code">二維條碼/NFC</string>
+ <string name="import_import">匯入選擇的金鑰</string>
+ <string name="import_qr_code_button">掃描二維條碼</string>
<!--Generic result toast-->
<!--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>
+ </plurals>
+ <plurals name="import_keys_added">
+ <item quantity="other">成功匯入%1$d金鑰%2$s。</item>
+ </plurals>
+ <plurals name="import_keys_updated">
+ <item quantity="other">成功更新%1$d金鑰%2$s。</item>
+ </plurals>
+ <string name="import_error_nothing">沒有東西可以匯入。</string>
+ <string name="import_error_nothing_cancelled">匯入已取消。</string>
<!--Delete result toast-->
+ <string name="delete_nothing">沒有東西可以刪除。</string>
+ <string name="delete_cancelled">刪除已取消。</string>
<!--Certify result toast-->
<!--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_settings_show_info">顯示進階資訊</string>
+ <string name="api_settings_hide_info">隱藏進階資訊</string>
+ <string name="api_settings_show_advanced">顯示進階設定</string>
+ <string name="api_settings_hide_advanced">隱藏進階設定</string>
+ <string name="api_settings_no_key">沒有選擇金鑰</string>
+ <string name="api_settings_select_key">選擇金鑰</string>
+ <string name="api_settings_create_key">為此帳戶建立金鑰</string>
+ <string name="api_settings_save">儲存</string>
+ <string name="api_settings_save_msg">帳戶已儲存</string>
+ <string name="api_settings_cancel">取消</string>
+ <string name="api_settings_revoke">撤銷存取</string>
+ <string name="api_settings_start">開啟應用程式</string>
+ <string name="api_settings_delete_account">移除帳戶</string>
+ <string name="api_settings_settings">設定</string>
+ <string name="api_settings_key">帳戶金鑰:</string>
+ <string name="api_settings_accounts_empty">沒有帳戶被指派給這個應用程式。</string>
+ <string name="api_create_account_text">這個帳戶尚未設置金鑰,請指派一個現有金鑰或是建立新的。\n應用程式只能使用這邊所選的金鑰進行解密/簽名。</string>
+ <string name="api_update_account_text">此帳戶指定的金鑰已被刪除,請重新選擇一個。\n應用程式只能使用這邊所選的金鑰進行解密/簽名。</string>
+ <string name="api_register_text">應用程式試圖以您的名義加/解密訊息並簽名,是否允許存取?\n\n警告:如果你不知道為什麼出現這個畫面,請拒絕存取!你可以稍後在〝應用程式〞畫面撤銷存取。</string>
+ <string name="api_register_allow">允許存取</string>
+ <string name="api_register_disallow">拒絕存取</string>
+ <string name="api_error_wrong_signature">簽名檢查失敗!你是否從其他來源安裝此應用?如果你確定這不是個攻擊,撤銷並重新註冊應用程式到OpenKeychain。</string>
<!--Share-->
+ <string name="share_qr_code_dialog_title">以二維條碼分享</string>
+ <string name="share_nfc_dialog">以NFC分享</string>
<!--Key list-->
+ <string name="key_list_empty_text1">找不到金鑰!</string>
<!--Key view-->
+ <string name="key_view_action_edit">編輯金鑰</string>
+ <string name="key_view_action_encrypt">加密文字</string>
+ <string name="key_view_action_encrypt_files">檔案</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="user_id_info_revoked_title">已撤銷</string>
+ <string name="user_id_info_revoked_text">這個身分識別被金鑰持有人撤銷,已不再有效。</string>
+ <string name="user_id_info_certified_title">已認證</string>
+ <string name="user_id_info_certified_text">這個身分識別已經過你的認證。</string>
+ <string name="user_id_info_uncertified_title">未認證</string>
+ <string name="user_id_info_uncertified_text">這個身分識別尚未經過認證,你不能確認這個身分識別是否屬於真的某個人。</string>
+ <string name="user_id_info_invalid_title">無效</string>
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
+ <string name="edit_key_action_change_passphrase">變更口令</string>
+ <string name="edit_key_action_add_identity">新增身分識別</string>
+ <string name="edit_key_action_add_subkey">新增子金鑰</string>
+ <string-array name="edit_key_edit_user_id">
+ <item>變更為主身分識別</item>
+ <item>撤銷身分識別</item>
+ </string-array>
+ <string name="edit_key_edit_user_id_revoked">這個身分識別已被撤銷。此動作無法還原。</string>
+ <string-array name="edit_key_edit_subkey">
+ <item>變更到期日</item>
+ <item>撤銷子金鑰</item>
+ <item>Strip Subkey</item>
+ </string-array>
+ <string name="edit_key_error_add_identity">新增至少一組身分識別!</string>
+ <string name="edit_key_error_add_subkey">新增至少一組子金鑰!</string>
<!--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_robot_text">建立金鑰可能需要一點時間,來杯咖啡吧…</string>
+ <string name="create_key_text">輸入你的全名、電子郵件,並選擇一組口令。</string>
<!--View key-->
<!--Navigation Drawer-->
+ <string name="nav_keys">金鑰</string>
+ <string name="nav_apps">應用程式</string>
+ <string name="my_keys">我的金鑰</string>
<!--hints-->
<!--certs-->
<!--LogType log messages. Errors should have _ERROR_ in their name and end with a !-->
<!--Import Public log entries-->
<!--Import Secret log entries-->
+ <string name="msg_is_db_exception">資料庫錯誤!</string>
+ <string name="msg_is_merge_public">將匯入的資料合併至公鑰鑰匙圈</string>
+ <string name="msg_is_merge_secret">將匯入的資料合併至密鑰鑰匙圈</string>
+ <string name="msg_is_pubring_generate">從密鑰鑰匙圈產生公鑰鑰匙圈</string>
+ <string name="msg_is_success_identical">鑰匙圈沒有新資料,不必進行操作</string>
+ <string name="msg_is_success">成功匯入密鑰鑰匙圈</string>
<!--Keyring Canonicalization log entries-->
<!--Keyring merging log entries-->
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
+ <string name="msg_ek_error_not_found">找不到金鑰!</string>
<!--Messages for DecryptVerify operation-->
+ <string name="msg_dc_error_invalid_siglist">找不到有效的簽名資訊!</string>
+ <string name="msg_dc">開始解密…</string>
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
+ <string name="msg_crt_warn_not_found">找不到金鑰!</string>
+ <string name="msg_crt_warn_cert_failed">產生認證失敗!</string>
+ <string name="msg_crt_warn_save_failed">儲存失敗!</string>
+ <string name="msg_crt_upload_success">成功上傳金鑰到伺服器</string>
+ <string name="msg_import_fetch_error">無法取得金鑰!(網路問題?)</string>
+ <string name="msg_import_fetch_keybase">從keybase.io取回:%s</string>
+ <string name="msg_import_fetch_keyserver_error">無法從keybase取得金鑰!</string>
+ <string name="msg_import_fetch_keyserver">從金鑰伺服器取回:%s</string>
+ <string name="msg_import_fetch_keyserver_ok">成功取得金鑰</string>
+ <string name="msg_import_keyserver">使用金鑰伺服器%s</string>
+ <string name="msg_import_fingerprint_ok">指紋檢查正確</string>
+ <string name="msg_import_merge">正在合併取得的資料</string>
+ <string name="msg_export_error_db">資料庫錯誤!</string>
+ <string name="msg_export_error_io">輸入/輸出錯誤!</string>
+ <string name="msg_export_success">匯出處理成功</string>
+ <string name="msg_del_error_empty">沒有東西可以刪除!</string>
+ <string name="msg_del_error_multi_secret">密鑰只能分別刪除!</string>
+ <string name="msg_acc_saved">帳戶已儲存</string>
+ <string name="msg_download_success">下載成功!</string>
+ <string name="msg_download_no_valid_keys">在檔案/剪貼簿中找不到有效的金鑰!</string>
+ <string name="msg_download_query_failed">查詢金鑰的時候發生錯誤。</string>
<!--PassphraseCache-->
- <!--unsorted-->
+ <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>
<!--First Time-->
+ <!--unsorted-->
+ <string name="empty_certs">這把金鑰未經過認證</string>
+ <string name="certs_text">只有有效的自簽署認證以及經由你的金鑰簽署的有效認證會被顯示在這。</string>
+ <string name="label_revocation">撤銷原因</string>
+ <string name="error_key_not_found">找不到金鑰!</string>
+ <string name="key_no_passphrase">沒有口令</string>
+ <string name="key_unavailable">無法使用</string>
+ <string name="title_view_cert">查看認證內容</string>
+ <string name="unknown_algorithm">未知</string>
+ <string name="error_no_encrypt_subkey">沒有可供加密的子金鑰!</string>
+ <string name="info_no_manual_account_creation">請不要自行建立OpenKeychain帳戶。\n更多資訊請參考說明。</string>
+ <string name="exchange_description">要發起金鑰交換,先在右邊選擇與會人數,然後點選〝開始交換〞。\n\n接下來會詢問你兩個問題,以確保會議成員與交換的指紋是正確的。</string>
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml
index 8dd85050d..209350332 100644
--- a/OpenKeychain/src/main/res/values-zh/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh/strings.xml
@@ -7,11 +7,8 @@
<string name="title_encrypt_text">加密文本</string>
<string name="title_encrypt_files">加密文件</string>
<string name="title_decrypt">解密</string>
- <string name="title_unlock">密码</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_share_fingerprint_with">分享签名</string>
<string name="title_share_key">分享密钥</string>
@@ -57,7 +54,6 @@
<string name="btn_create_key">创建密钥</string>
<string name="btn_add_files">添加密钥</string>
<string name="btn_add_share_decrypted_text">添加并分享加密后的文本</string>
- <string name="btn_decrypt_clipboard">从剪贴板复制并解密</string>
<string name="btn_decrypt_and_verify">解密并验证</string>
<string name="btn_decrypt_files">解密文件</string>
<!--menu-->
@@ -217,6 +213,8 @@
<string name="share_nfc_dialog">使用NFC分享</string>
<!--Key list-->
<!--Key view-->
+ <!--Key trust-->
+ <!--keybase proof stuff-->
<!--Edit key-->
<!--Create key-->
<!--View key-->
@@ -231,10 +229,18 @@
<!--createSecretKeyRing-->
<!--modifySecretKeyRing-->
<!--Consolidate-->
+ <!--Edit Key (higher level than modify)-->
+ <!--Promote key-->
<!--Other messages used in OperationLogs-->
<!--Messages for DecryptVerify operation-->
+ <!--Messages for VerifySignedLiteralData operation-->
<!--Messages for SignEncrypt operation-->
+ <!--Messages for PgpSignEncrypt operation-->
<!--PassphraseCache-->
- <!--unsorted-->
<!--First Time-->
+ <!--unsorted-->
+ <!--Passphrase wizard-->
+ <!--TODO: rename all the things!-->
+ <!--<string name="enter_passphrase_twice">Enter passphrase twice</string>-->
+ <!--<string name="nfc_text">Please place a NFC tag near your device</string>-->
</resources>
diff --git a/OpenKeychain/src/main/res/values/attr.xml b/OpenKeychain/src/main/res/values/attr.xml
index 5dfa03987..98ce1c364 100644
--- a/OpenKeychain/src/main/res/values/attr.xml
+++ b/OpenKeychain/src/main/res/values/attr.xml
@@ -6,4 +6,13 @@
<attr name="unFoldedLabel" format="string" />
</declare-styleable>
+ <declare-styleable name="AspectRatioImageView">
+ <attr name="aspectRatio" format="float" />
+ <attr name="aspectRatioEnabled" format="boolean" />
+ <attr name="dominantMeasurement">
+ <enum name="width" value="0" />
+ <enum name="height" value="1" />
+ </attr>
+ </declare-styleable>
+
</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/colors.xml b/OpenKeychain/src/main/res/values/colors.xml
index a21f949d1..c49e06b4b 100644
--- a/OpenKeychain/src/main/res/values/colors.xml
+++ b/OpenKeychain/src/main/res/values/colors.xml
@@ -1,8 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <color name="emphasis">#aa66cc</color>
- <color name="emphasis_dark">#9933cc</color>
+ <!-- Main theme colors -->
+
+ <!-- green colors from OpenKeychain logo bottom right -->
+ <!-- your app branding color for the app bar -->
+ <color name="primary">#7bad45</color>
+ <!-- darker variant for the status bar and contextual app bars -->
+ <color name="primary_dark">#6c983d</color>
+ <!-- theme UI controls like checkboxes and text fields -->
+ <color name="accent">#2196F3</color>
+
+ <!-- Other colors -->
+
+ <color name="primary_light">#C8E6C9</color>
+ <color name="fab">@color/accent</color>
+ <color name="fab_pressed">#1976D2</color>
+ <color name="primary_text">#212121</color>
+ <color name="secondary_text">#727272</color>
+ <color name="icons">#FFFFFF</color>
+ <color name="divider">#B6B6B6</color>
+
+ <color name="header_text">#212121</color>
+ <!-- item selection, search highlight -->
+ <color name="emphasis">@color/accent</color>
+
<color name="bg_gray">#cecbce</color>
<color name="tertiary_text_light">#808080</color>
<color name="alert">#ffdd3333</color>
@@ -10,14 +32,33 @@
<color name="holo_gray_light">#33999999</color>
<color name="holo_gray_bright">#33CCCCCC</color>
- <!-- http://developer.android.com/design/style/color.html -->
- <color name="android_red_light">#ffff4444</color>
- <color name="android_red_dark">#ffCC0000</color>
- <color name="android_orange_light">#ffffbb33</color>
- <color name="android_orange_dark">#ffFF8800</color>
- <color name="android_green_light">#ff99cc00</color>
- <color name="android_green_dark">#ff669900</color>
- <color name="android_purple_light">#ffaa66cc</color>
- <color name="android_purple_dark">#ff9933CC</color>
+ <!-- tabs -->
+ <color name="tab_text">#70FFFFFF</color>
+ <color name="tab_text_selected">#FFFFFF</color>
+ <color name="tab_indicator">#FFFFFF</color>
+
+
+ <!-- floating action buttons -->
+ <color name="black_semi_transparent">#B2000000</color>
+ <color name="background">#e5e5e5</color>
+ <color name="half_black">#808080</color>
+ <color name="white">#fafafa</color>
+ <color name="white_pressed">#f1f1f1</color>
+
+ <!--
+ http://www.google.com/design/spec/style/color.html#color-color-palette
+ light = normal color
+ dark = 900
+
+ exception: green
+ -->
+ <color name="android_red_light">#f44336</color>
+ <color name="android_red_dark">#b71c1c</color>
+ <color name="android_orange_light">#ff9800</color>
+ <color name="android_orange_dark">#e65100</color>
+ <color name="android_green_light">@color/primary</color>
+ <color name="android_green_dark">@color/primary_dark</color>
+ <color name="android_purple_light">#673ab7</color>
+ <color name="android_purple_dark">#311b92</color>
</resources>
diff --git a/OpenKeychain/src/main/res/values/dimens.xml b/OpenKeychain/src/main/res/values/dimens.xml
index e1a7749f0..434a0a171 100644
--- a/OpenKeychain/src/main/res/values/dimens.xml
+++ b/OpenKeychain/src/main/res/values/dimens.xml
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="drawer_size">240dp</dimen>
- <dimen name="drawer_content_padding">0dp</dimen>
+ <!-- on Android < 5, we do not color the status bar, thus 0dp! -->
+ <dimen name="statusbar_height">0dp</dimen>
+ <dimen name="big_toolbar">120dp</dimen>
+ <dimen name="huge_toolbar">222dp</dimen>
</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 5eba28921..b9f892687 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -18,10 +18,10 @@
<string name="title_add_subkey">"Add subkey"</string>
<string name="title_edit_key">"Edit Key"</string>
<string name="title_linked_create">"Create a Linked Identity"</string>
- <string name="title_preferences">"Preferences"</string>
+ <string name="title_preferences">"Settings"</string>
<string name="title_cloud_search_preferences">"Cloud Search Preferences"</string>
<string name="title_api_registered_apps">"Apps"</string>
- <string name="title_key_server_preference">"Keyserver Preference"</string>
+ <string name="title_key_server_preference">"Keyservers"</string>
<string name="title_change_passphrase">"Change Passphrase"</string>
<string name="title_share_fingerprint_with">"Share fingerprint with…"</string>
<string name="title_share_key">"Share key with…"</string>
@@ -42,9 +42,13 @@
<string name="title_create_key">"Create Key"</string>
<string name="title_exchange_keys">"Exchange Keys"</string>
<string name="title_advanced_key_info">"Advanced Key Info"</string>
+ <string name="title_keys">"Keys"</string>
<!-- section -->
<string name="section_user_ids">"Identities"</string>
+ <string name="section_should_you_trust">"Should you trust this key?"</string>
+ <string name="section_proof_details">Proof verification</string>
+ <string name="section_cloud_evidence">"Proofs from the cloud"</string>
<string name="section_keys">"Subkeys"</string>
<string name="section_cloud_search">"Cloud search"</string>
<string name="section_general">"General"</string>
@@ -62,6 +66,8 @@
<string name="section_decrypt_files">"Files"</string>
<string name="section_decrypt_text">"Text"</string>
<string name="section_certs">"Certificates"</string>
+ <string name="section_encrypt">"Encrypt"</string>
+ <string name="section_decrypt">"Decrypt"</string>
<!-- button -->
<string name="btn_decrypt_verify_file">"Decrypt, verify, and save file"</string>
@@ -76,15 +82,19 @@
<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_no">"No"</string>
+ <string name="btn_match">"Fingerprints match"</string>
<string name="btn_lookup_key">"Lookup key"</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>
<string name="btn_add_share_decrypted_text">"Share decrypted text"</string>
- <string name="btn_decrypt_clipboard">"Decrypt from clipboard"</string>
+ <string name="btn_decrypt_clipboard">"Decrypt text from clipboard"</string>
<string name="btn_decrypt_and_verify">"and verify signatures"</string>
<string name="btn_decrypt_files">"Decrypt files"</string>
+ <string name="btn_encrypt_files">"Encrypt files"</string>
+ <string name="btn_encrypt_text">"Encrypt text"</string>
<!-- menu -->
<string name="menu_preferences">"Settings"</string>
@@ -94,13 +104,16 @@
<string name="menu_create_key">"Create my key"</string>
<string name="menu_import_existing_key">"Import from file"</string>
<string name="menu_search">"Search"</string>
+ <string name="menu_nfc_preferences">"NFC settings"</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>
<string name="menu_select_all">"Select all"</string>
<string name="menu_add_keys">"Add keys"</string>
+ <string name="menu_search_cloud">"Search cloud"</string>
<string name="menu_export_all_keys">"Export all keys"</string>
<string name="menu_advanced">"Show advanced info"</string>
+ <string name="menu_certify_fingerprint">"Verify via fingerprint comparison"</string>
<!-- label -->
<string name="label_message">"Message"</string>
@@ -267,7 +280,8 @@
<!-- errors without preceeding Error: -->
<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_nfc_needed">"NFC must be enabled!"</string>
+ <string name="error_beam_needed">"Beam must be enabled!"</string>
<string name="error_nothing_import">"No keys found!"</string>
<string name="error_contacts_key_id_missing">"Retrieving the key ID from contacts failed!"</string>
<string name="error_generic_report_bug">"A generic error occurred, please create a new bug report for OpenKeychain."</string>
@@ -395,9 +409,10 @@
<string name="import_qr_code_wrong">"QR Code malformed! Please try again!"</string>
<string name="import_qr_code_too_short_fingerprint">"Fingerprint is too short (&lt; 16 characters)"</string>
<string name="import_qr_code_button">"Scan QR Code"</string>
+ <string name="import_qr_code_text">"Place your camera over the QR Code!"</string>
<!-- Generic result toast -->
- <string name="view_log">"View Log"</string>
+ <string name="view_log">"Details"</string>
<string name="with_warnings">", with warnings"</string>
<string name="with_cancelled">", until cancelled"</string>
@@ -470,7 +485,6 @@
<string name="intent_send_decrypt">"Decrypt with OpenKeychain"</string>
<!-- Remote API -->
- <string name="api_no_apps">"No registered apps!\n\nA list of supported third-party applications can be found in 'Help'!"</string>
<string name="api_settings_show_info">"Show advanced information"</string>
<string name="api_settings_hide_info">"Hide advanced information"</string>
<string name="api_settings_show_advanced">"Show advanced settings"</string>
@@ -486,7 +500,9 @@
<string name="api_settings_delete_account">"Delete account"</string>
<string name="api_settings_package_name">"Package Name"</string>
<string name="api_settings_package_signature">"SHA-256 of Package Signature"</string>
- <string name="api_settings_accounts">"Accounts"</string>
+ <string name="api_settings_accounts">"Accounts (deprecated API)"</string>
+ <string name="api_settings_advanced">"Advanced Information"</string>
+ <string name="api_settings_allowed_keys">"Allowed Keys"</string>
<string name="api_settings_settings">"Settings"</string>
<string name="api_settings_key">"Account key:"</string>
<string name="api_settings_accounts_empty">"No accounts attached to this app."</string>
@@ -529,6 +545,7 @@
<string name="key_view_tab_share">"Share"</string>
<string name="key_view_tab_keys">"Subkeys"</string>
<string name="key_view_tab_certs">"Certificates"</string>
+ <string name="key_view_tab_keybase">"Keybase.io"</string>
<string name="user_id_info_revoked_title">"Revoked"</string>
<string name="user_id_info_revoked_text">"This identity has been revoked by the key owner. It is no longer valid."</string>
<string name="user_id_info_certified_title">"Certified"</string>
@@ -538,6 +555,48 @@
<string name="user_id_info_invalid_title">"Invalid"</string>
<string name="user_id_info_invalid_text">"Something is wrong with this identity!"</string>
+ <!-- Key trust -->
+ <string name="key_trust_already_verified">"You have already certified this key!"</string>
+ <string name="key_trust_it_is_yours">"This is one of your keys!"</string>
+ <string name="key_trust_maybe">"This key is neither revoked nor expired.\nYou haven’t certified it, but you may choose to trust it."</string>
+ <string name="key_trust_revoked">"This key has been revoked by its owner. You should not trust it."</string>
+ <string name="key_trust_expired">"This key has expired. You should not trust it."</string>
+ <string name="key_trust_old_keys">" It may be OK to use this to decrypt an old message dating from the time when this key was valid."</string>
+ <string name="key_trust_no_cloud_evidence">"No proof from the cloud on this key’s trustworthiness."</string>
+ <string name="key_trust_start_cloud_search">"Start search"</string>
+ <string name="key_trust_results_prefix">"Keybase.io offers “proofs” which assert that the owner of this key: "</string>
+ <string name="key_trust_header_text">"Note: Keybase.io proofs are an experimental feature of OpenKeychain. We encourage you to scan QR Codes or exchange keys via NFC in addition to verifying them."</string>
+
+ <!-- keybase proof stuff -->
+ <string name="keybase_narrative_twitter">"Posts to Twitter as"</string>
+ <string name="keybase_narrative_github">"Is known on GitHub as"</string>
+ <string name="keybase_narrative_dns">"Controls the domain name(s)"</string>
+ <string name="keybase_narrative_web_site">"Can post to the Web site(s)"</string>
+ <string name="keybase_narrative_reddit">"Posts to Reddit as"</string>
+ <string name="keybase_narrative_coinbase">"Is known on Coinbase as"</string>
+ <string name="keybase_narrative_hackernews">"Posts to Hacker News as"</string>
+ <string name="keybase_narrative_unknown">"Unknown proof type"</string>
+ <string name="keybase_proof_failure">"Unfortunately this proof cannot be verified."</string>
+ <string name="keybase_unknown_proof_failure">"Unrecognized problem with proof checker"</string>
+ <string name="keybase_problem_fetching_evidence">"Problem with proof"</string>
+ <string name="keybase_key_mismatch">"Key fingerprint doesn’t match that in proof post"</string>
+ <string name="keybase_dns_query_failure">"DNS TXT Record retrieval failed"</string>
+ <string name="keybase_no_prover_found">"No proof checker found for"</string>
+ <string name="keybase_message_payload_mismatch">"Decrypted proof post does not match expected value"</string>
+ <string name="keybase_message_fetching_data">"Fetching proof"</string>
+ <string name="keybase_proof_succeeded">"This proof has been verified!"</string>
+ <string name="keybase_a_post">"A post"</string>
+ <string name="keybase_fetched_from">"fetched from"</string>
+ <string name="keybase_for_the_domain">"for the domain"</string>
+ <string name="keybase_contained_signature">"contains a message which could only have been created by the owner of this key."</string>
+ <string name="keybase_twitter_proof">"A tweet"</string>
+ <string name="keybase_dns_proof">"A DNS TXT record"</string>
+ <string name="keybase_web_site_proof">"A text file"</string>
+ <string name="keybase_github_proof">"A gist"</string>
+ <string name="keybase_reddit_proof">"A JSON file"</string>
+ <string name="keybase_reddit_attribution">"attributed by Reddit to"</string>
+ <string name="keybase_verify">"Verify"</string>
+
<!-- Edit key -->
<string name="edit_key_action_change_passphrase">"Change Passphrase"</string>
<string name="edit_key_action_add_identity">"Add Identity"</string>
@@ -563,7 +622,7 @@
<string name="edit_key_error_add_subkey">"Add at least one subkey!"</string>
<!-- Create key -->
- <string name="create_key_upload">"Upload key to keyserver"</string>
+ <string name="create_key_upload">"Synchronize with the cloud"</string>
<string name="create_key_empty">"This field is required"</string>
<string name="create_key_passphrases_not_equal">"Passphrases do not match"</string>
<string name="create_key_final_text">"You entered the following identity:"</string>
@@ -575,14 +634,16 @@
<string name="create_key_edit">"Change key configuration"</string>
<!-- View key -->
- <string name="view_key_revoked">"This key has been revoked!"</string>
- <string name="view_key_expired">"This key is expired!"</string>
+ <string name="view_key_revoked">"Revoked: Key must not be used anymore!"</string>
+ <string name="view_key_expired">"Expired: The contact needs to extend the key's validity!"</string>
+ <string name="view_key_expired_secret">"Expired: You can extend the keys validity by editing it!"</string>
+ <string name="view_key_my_key">"My Key"</string>
+ <string name="view_key_verified">"Verified Key"</string>
+ <string name="view_key_unverified">"Unverified: Scan QR Code to verify key!"</string>
<!-- Navigation Drawer -->
<string name="nav_keys">"Keys"</string>
- <string name="nav_encrypt_text">"Encrypt text"</string>
- <string name="nav_encrypt_files">"Encrypt files"</string>
- <string name="nav_decrypt">"Decrypt"</string>
+ <string name="nav_encrypt_decrypt">"Encrypt/Decrypt"</string>
<string name="nav_apps">"Apps"</string>
<string name="drawer_open">"Open navigation drawer"</string>
<string name="drawer_close">"Close navigation drawer"</string>
@@ -731,19 +792,19 @@
<string name="msg_kc_error_dup_key">"Subkey %s occurs twice in keyring. Keyring is malformed, not importing!"</string>
<string name="msg_kc_master">"Processing master key"</string>
<string name="msg_kc_master_bad_type">"Removing master key certificate of unknown type (%s)"</string>
- <string name="msg_kc_master_bad_local">"Removing master key certificate with "local" flag"</string>
+ <string name="msg_kc_master_bad_local">"Removing master key certificate with 'local' flag"</string>
<string name="msg_kc_master_bad_err">"Removing bad master key certificate"</string>
<string name="msg_kc_master_bad_time">"Removing keyring revocation certificate with future timestamp"</string>
<string name="msg_kc_master_bad_type_uid">"Removing user ID certificate in bad position"</string>
<string name="msg_kc_master_bad">"Removing bad master key certificate"</string>
- <string name="msg_kc_master_local">"Removing master key certificate with "local" flag"</string>
+ <string name="msg_kc_master_local">"Removing master key certificate with 'local' flag"</string>
<string name="msg_kc_revoke_dup">"Removing redundant keyring revocation certificate"</string>
<string name="msg_kc_notation_dup">"Removing redundant notation certificate"</string>
<string name="msg_kc_notation_empty">"Removing empty notation certificate"</string>
<string name="msg_kc_sub">"Processing subkey %s"</string>
<string name="msg_kc_sub_bad">"Removing invalid subkey binding certificate"</string>
<string name="msg_kc_sub_bad_err">"Removing bad subkey binding certificate"</string>
- <string name="msg_kc_sub_bad_local">"Removing subkey binding certificate with "local" flag"</string>
+ <string name="msg_kc_sub_bad_local">"Removing subkey binding certificate with 'local' flag"</string>
<string name="msg_kc_sub_bad_keyid">"Subkey binding issuer id mismatch"</string>
<string name="msg_kc_sub_bad_time">"Removing subkey binding certificate with future timestamp"</string>
<string name="msg_kc_sub_bad_type">"Unknown subkey certificate type: %s"</string>
@@ -825,6 +886,7 @@
<!-- modifySecretKeyRing -->
<string name="msg_mr">"Modifying keyring %s"</string>
+ <string name="msg_mf_error_divert_serial">"The serial number of a divert-to-card key must be 16 bytes! This is a programming error, please file a bug report!"</string>
<string name="msg_mf_error_encode">"Encoding exception!"</string>
<string name="msg_mf_error_fingerprint">"Actual key fingerprint does not match the expected one!"</string>
<string name="msg_mf_error_keyid">"No key ID. This is an internal error, please file a bug report!"</string>
@@ -832,6 +894,7 @@
<string name="msg_mf_error_master_none">"No master certificate found to operate on! (All revoked?)"</string>
<string name="msg_mf_error_noexist_primary">"Bad primary user ID specified!"</string>
<string name="msg_mf_error_noexist_revoke">"Bad user ID for revocation specified!"</string>
+ <string name="msg_mf_error_restricted">"Tried to execute restricted operation without passphrase! This is a programming error, please file a bug report!"</string>
<string name="msg_mf_error_revoked_primary">"Revoked user IDs cannot be primary!"</string>
<string name="msg_mf_error_null_expiry">"Expiry time cannot be "same as before" on subkey creation. This is a programming error, please file a bug report!"</string>
<string name="msg_mf_error_passphrase_master">"Fatal error decrypting master key! This is likely a programming error, please file a bug report!"</string>
@@ -882,6 +945,7 @@
<string name="msg_con_error_public">"Error reimporting public keys!"</string>
<string name="msg_con_error_secret">"Error reimporting secret keys!"</string>
<string name="msg_con_recover">"Resuming consolidation process"</string>
+ <string name="msg_con_recursive">"Skipping recursive consolidation"</string>
<string name="msg_con_recover_unknown">"Resuming consolidation process from unknown state"</string>
<plurals name="msg_con_reimport_public">
<item quantity="one">"Reimporting one public key"</item>
@@ -904,6 +968,13 @@
<string name="msg_ed_fetching">"Fetching key to modify (%s)"</string>
<string name="msg_ed_success">"Key operation successful"</string>
+ <!-- Promote key -->
+ <string name="msg_pr">"Promoting public key to secret key"</string>
+ <string name="msg_pr_error_already_secret">"Key is already a secret key!"</string>
+ <string name="msg_pr_error_key_not_found">"Key not found!"</string>
+ <string name="msg_pr_fetching">"Fetching key to modify (%s)"</string>
+ <string name="msg_pr_success">"Key successfully promoted"</string>
+
<!-- Other messages used in OperationLogs -->
<string name="msg_ek_error_divert">"Editing of NFC keys is not (yet) supported!"</string>
<string name="msg_ek_error_dummy">"Cannot edit keyring with stripped master key!"</string>
@@ -913,11 +984,13 @@
<string name="msg_dc_askip_no_key">"Data not encrypted with known key, skipping…"</string>
<string name="msg_dc_askip_not_allowed">"Data not encrypted with allowed key, skipping…"</string>
<string name="msg_dc_asym">"Found block of asymmetrically encrypted data for key %s"</string>
+ <string name="msg_dc_charset">"Found charset header: '%s'"</string>
<string name="msg_dc_clear_data">"Processing literal data"</string>
<string name="msg_dc_clear_decompress">"Unpacking compressed data"</string>
<string name="msg_dc_clear_meta_file">"Filename: %s"</string>
<string name="msg_dc_clear_meta_mime">"MIME type: %s"</string>
- <string name="msg_dc_clear_meta_size">"Filesize: %s"</string>
+ <string name="msg_dc_clear_meta_size">"File size: %s"</string>
+ <string name="msg_dc_clear_meta_size_unknown">"File size is unknown"</string>
<string name="msg_dc_clear_meta_time">"Modification time: %s"</string>
<string name="msg_dc_clear_signature_bad">"Signature check NOT OK!"</string>
<string name="msg_dc_clear_signature_check">"Verifying signature data"</string>
@@ -948,30 +1021,57 @@
<string name="msg_dc_trail_unknown">"Encountered trailing data of unknown type"</string>
<string name="msg_dc_unlocking">"Unlocking secret key"</string>
+ <!-- Messages for VerifySignedLiteralData operation -->
+ <string name="msg_vl">"Starting signature check"</string>
+ <string name="msg_vl_error_no_siglist">"No signature list in signed literal data"</string>
+ <string name="msg_vl_error_wrong_key">"Message not signed with right key"</string>
+ <string name="msg_vl_error_missing_literal">"No payload in signed literal data"</string>
+ <string name="msg_vl_clear_meta_file">"Filename: %s"</string>
+ <string name="msg_vl_clear_meta_mime">"MIME type: %s"</string>
+ <string name="msg_vl_clear_meta_time">"Modification time: %s"</string>
+ <string name="msg_vl_clear_meta_size">"Filesize: %s"</string>
+ <string name="msg_vl_clear_signature_check">"Verifying signature data"</string>
+ <string name="msg_vl_error_integrity_check">"Integrity check error!"</string>
+ <string name="msg_vl_ok">"OK"</string>
+
<!-- Messages for SignEncrypt operation -->
- <string name="msg_se_asymmetric">"Preparing public keys for encryption"</string>
- <string name="msg_se_clearsign_only">"Signing of cleartext input not supported!"</string>
- <string name="msg_se_compressing">"Preparing compression"</string>
- <string name="msg_se_encrypting">"Encrypting data"</string>
- <string name="msg_se_error_bad_passphrase">"Bad passphrase!"</string>
- <string name="msg_se_error_io">"Encountered IO Exception during operation!"</string>
- <string name="msg_se_error_key_sign">"Selected signing key cannot sign data!"</string>
- <string name="msg_se_error_sign_key">"Error fetching signing key!"</string>
- <string name="msg_se_error_nfc">"NFC data error!"</string>
- <string name="msg_se_error_no_passphrase">"No passphrase provided!"</string>
- <string name="msg_se_error_pgp">"Internal OpenPGP error!"</string>
- <string name="msg_se_error_sig">"Encountered OpenPGP signature exception!"</string>
- <string name="msg_se_error_unlock">"Unknown error unlocking key!"</string>
- <string name="msg_se_key_ok">"Encrypting for key: %s"</string>
- <string name="msg_se_key_unknown">"Missing key for encryption: %s"</string>
- <string name="msg_se_key_warn">"Bad key for encryption: %s"</string>
- <string name="msg_se_ok">"Sign/Encrypt operation successful!"</string>
- <string name="msg_se_pending_nfc">"NFC token required, requesting user input…"</string>
- <string name="msg_se_pending_passphrase">"Passphrase required, requesting user input…"</string>
- <string name="msg_se_signing">"Signing data (without encryption)"</string>
- <string name="msg_se_sigcrypting">"Encrypting data with signature"</string>
- <string name="msg_se">"Starting sign and/or encrypt operation"</string>
- <string name="msg_se_symmetric">"Preparing symmetric encryption"</string>
+ <string name="msg_se">"Starting sign/encrypt operation"</string>
+ <string name="msg_se_input_bytes">"Processing input from byte array"</string>
+ <string name="msg_se_input_uri">"Processing input from URI"</string>
+ <string name="msg_se_error_no_input">"No input given!"</string>
+ <string name="msg_se_error_input_uri_not_found">"Error opening URI for reading!"</string>
+ <string name="msg_se_error_output_uri_not_found">"Error opening URI for writing!"</string>
+ <string name="msg_se_error_too_many_inputs">"More inputs than outputs specified! This is probably a programming error, please report!"</string>
+ <string name="msg_se_warn_output_left">"Got outputs left but no inputs. This is probably a programming error, please report!"</string>
+ <string name="msg_se_success">"Sign/encrypt operation successful"</string>
+
+ <!-- Messages for PgpSignEncrypt operation -->
+ <string name="msg_pse_asymmetric">"Preparing public keys for encryption"</string>
+ <string name="msg_pse_clearsign_only">"Signing of cleartext input not supported!"</string>
+ <string name="msg_pse_compressing">"Preparing compression"</string>
+ <string name="msg_pse_encrypting">"Encrypting data"</string>
+ <string name="msg_pse_error_bad_passphrase">"Bad passphrase!"</string>
+ <string name="msg_pse_error_hash_algo">"Requested hashing algorithm is not supported by this key!"</string>
+ <string name="msg_pse_error_io">"Encountered IO Exception during operation!"</string>
+ <string name="msg_pse_error_key_sign">"Selected signing key cannot sign data!"</string>
+ <string name="msg_pse_error_sign_key">"Error fetching signing key!"</string>
+ <string name="msg_pse_error_nfc">"NFC data error!"</string>
+ <string name="msg_pse_error_no_passphrase">"No passphrase provided!"</string>
+ <string name="msg_pse_error_pgp">"Internal OpenPGP error!"</string>
+ <string name="msg_pse_error_sig">"Encountered OpenPGP signature exception!"</string>
+ <string name="msg_pse_error_unlock">"Unknown error unlocking key!"</string>
+ <string name="msg_pse_key_ok">"Encrypting for key: %s"</string>
+ <string name="msg_pse_key_unknown">"Missing key for encryption: %s"</string>
+ <string name="msg_pse_key_warn">"Bad key for encryption: %s"</string>
+ <string name="msg_pse_ok">"Sign/Encrypt operation successful!"</string>
+ <string name="msg_pse_pending_nfc">"NFC token required, requesting user input…"</string>
+ <string name="msg_pse_pending_passphrase">"Passphrase required, requesting user input…"</string>
+ <string name="msg_pse_signing">"Signing data (without encryption)"</string>
+ <string name="msg_pse_signing_cleartext">"Creating cleartext signature"</string>
+ <string name="msg_pse_signing_detached">"Creating detached signature"</string>
+ <string name="msg_pse_sigcrypting">"Encrypting data with signature"</string>
+ <string name="msg_pse">"Starting sign and/or encrypt operation"</string>
+ <string name="msg_pse_symmetric">"Preparing symmetric encryption"</string>
<string name="msg_crt_certifying">"Generating certifications"</string>
<string name="msg_crt_certify_all">"Certifying all user IDs for key %s"</string>
@@ -1011,6 +1111,7 @@
<string name="msg_import_fingerprint_ok">"Fingerprint check OK"</string>
<string name="msg_import_merge">"Merging retrieved data"</string>
<string name="msg_import_error">"Import operation failed!"</string>
+ <string name="msg_import_error_io">"Import operation failed due to i/o error!"</string>
<string name="msg_import_partial">"Import operation successful, with errors!"</string>
<string name="msg_import_success">"Import operation successful!"</string>
@@ -1102,6 +1203,8 @@
<string name="certs_text">"Only validated self-certificates and validated certificates created with your keys are displayed here."</string>
<string name="section_uids_to_certify">"Identities for "</string>
<string name="certify_text">"The keys you are importing contain “identities”: names and emails. Select exactly those for certification which match what you expected."</string>
+ <string name="certify_fingerprint_text">"Compare the displayed fingerprint, character by character, with the one displayed on your partners device."</string>
+ <string name="certify_fingerprint_text2">"Do the displayed fingerprints match?"</string>
<string name="label_revocation">"Revocation Reason"</string>
<string name="label_verify_status">"Verification Status"</string>
<string name="label_cert_type">"Type"</string>
@@ -1123,6 +1226,7 @@
<string name="error_multi_not_supported">"Saving of multiple files not supported. This is a limitation on current Android."</string>
<string name="key_colon">"Key:"</string>
<string name="exchange_description">"To start a key exchange, choose the number of participants on the right side, then hit the “Start exchange” button.\n\nYou will be asked two more questions to make sure only the right participants are in the exchange and their fingerprints are correct."</string>
+ <string name="btn_start_exchange">"Start exchange"</string>
<string name="user_id_none"><![CDATA[<none>]]></string>
<!-- Passphrase wizard -->
diff --git a/OpenKeychain/src/main/res/values/styles.xml b/OpenKeychain/src/main/res/values/styles.xml
index 27cd1546a..8d8797bf0 100644
--- a/OpenKeychain/src/main/res/values/styles.xml
+++ b/OpenKeychain/src/main/res/values/styles.xml
@@ -1,23 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <!-- Used in Android < 4 -->
- <style name="KeychainTheme" parent="@style/Theme.AppCompat.Light">
- <item name="android:alertDialogStyle">@style/CustomDialogTheme</item>
- </style>
-
- <!-- Ugly fix to make content background of Dialogs on Android < 4 white not black! -->
- <style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
- <item name="android:fullDark">@drawable/popup_full_bright</item>
- <!--<item name="android:topDark">@android:drawable/popup_full_dark</item>-->
- <item name="android:centerDark">@drawable/popup_center_bright</item>
- <!--<item name="android:bottomDark">@android:drawable/popup_bottom_dark</item>-->
- <!--<item name="fullBright">@android:drawable/popup_full_bright</item>-->
- <!--<item name="topBright">@android:drawable/popup_top_bright</item>-->
- <!--<item name="centerBright">@android:drawable/popup_center_bright</item>-->
- <!--<item name="bottomBright">@android:drawable/popup_bottom_bright</item>-->
- <!--<item name="bottomMedium">@android:drawable/popup_bottom_medium</item>-->
- <!--<item name="centerMedium">@android:drawable/popup_center_medium</item>-->
+ <style name="CardViewHeader">
+ <item name="android:drawableBottom">@drawable/cardview_header</item>
+ <item name="android:drawablePadding">16dp</item>
+ <item name="android:layout_marginTop">16dp</item>
+ <item name="android:paddingLeft">16dp</item>
+ <item name="android:textStyle">normal</item>
+ <item name="android:textColor">@color/header_text</item>
+ <item name="android:textSize">17sp</item>
</style>
<style name="SectionHeader">
@@ -26,7 +17,7 @@
<item name="android:layout_marginTop">8dp</item>
<item name="android:paddingLeft">8dp</item>
<item name="android:textStyle">bold</item>
- <item name="android:textColor">@color/emphasis</item>
+ <item name="android:textColor">@color/header_text</item>
<item name="android:textSize">14sp</item>
</style>
@@ -34,4 +25,9 @@
<item name="android:background">@drawable/selector_transparent_button</item>
</style>
+ <style name="FabMenuStyle">
+ <item name="android:background">@drawable/fab_label_background</item>
+ <item name="android:textColor">@color/white</item>
+ </style>
+
</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/themes.xml b/OpenKeychain/src/main/res/values/themes.xml
new file mode 100644
index 000000000..c87895c01
--- /dev/null
+++ b/OpenKeychain/src/main/res/values/themes.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <style name="KeychainTheme" parent="KeychainTheme.Base" />
+
+ <style name="KeychainTheme.Base" parent="Theme.AppCompat.Light">
+ <item name="colorPrimary">@color/primary</item>
+ <item name="colorPrimaryDark">@color/primary_dark</item>
+ <item name="colorAccent">@color/accent</item>
+
+ <item name="android:windowNoTitle">true</item>
+ <!-- remove actionbar, we use toolbar! -->
+ <item name="windowActionBar">false</item>
+ <!-- multi selection should overlay Toolbar! http://stackoverflow.com/a/26450875 -->
+ <item name="windowActionModeOverlay">true</item>
+ <item name="searchViewStyle">@style/MySearchViewStyle</item>
+
+ <!-- Navigation Drawer library -->
+ <item name="drawerType">@integer/DRAWERTYPE_IMAGE</item>
+ <!-- dark action bar... -->
+ <item name="theme">@style/ThemeOverlay.AppCompat.Dark</item>
+ <!-- ...but light popup menu (white background) -->
+ <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
+ <item name="drawerColor">#fafafa</item>
+ <item name="singleAccount">false</item>
+ <item name="sectionStyle">@style/MaterialSectionTheme.Light</item>
+ <item name="subheaderStyle">@style/MaterialSubheaderTheme.Light</item>
+ <item name="multipaneSupport">false</item>
+ <item name="rippleBackport">false</item>
+ <item name="uniqueToolbarColor">false</item>
+ </style>
+
+ <!-- http://android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html -->
+ <style name="MySearchViewStyle" parent="Widget.AppCompat.SearchView">
+ <!-- Background for the search query section (e.g. EditText) -->
+ <!--<item name="queryBackground">...</item>-->
+ <!-- Background for the actions section (e.g. voice, submit) -->
+ <!--<item name="submitBackground">...</item>-->
+ <!-- Close button icon -->
+ <item name="closeIcon">@drawable/ic_close_white_24dp</item>
+ <!-- Search button icon -->
+ <!--<item name="searchIcon">...</item>-->
+ <!-- Go/commit button icon -->
+ <!--<item name="goIcon">...</item>-->
+ <!-- Voice search button icon -->
+ <!--<item name="voiceIcon">...</item>-->
+ <!-- Commit icon shown in the query suggestion row -->
+ <!--<item name="commitIcon">...</item>-->
+ <!-- Layout for query suggestion rows -->
+ <!--<item name="suggestionRowLayout">...</item>-->
+ </style>
+</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/xml/preference_headers.xml b/OpenKeychain/src/main/res/xml/preference_headers.xml
index dd7f1c3e6..347394b06 100644
--- a/OpenKeychain/src/main/res/xml/preference_headers.xml
+++ b/OpenKeychain/src/main/res/xml/preference_headers.xml
@@ -1,8 +1,8 @@
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
- android:fragment="org.sufficientlysecure.keychain.ui.PreferencesActivity$CloudSearchPrefsFragment"
+ android:fragment="org.sufficientlysecure.keychain.ui.SettingsActivity$CloudSearchPrefsFragment"
android:title="@string/section_cloud_search" />
<header
- android:fragment="org.sufficientlysecure.keychain.ui.PreferencesActivity$AdvancedPrefsFragment"
+ android:fragment="org.sufficientlysecure.keychain.ui.SettingsActivity$AdvancedPrefsFragment"
android:title="@string/section_advanced" />
</preference-headers>
diff --git a/OpenKeychain/src/main/res/xml/preference_headers_legacy.xml b/OpenKeychain/src/main/res/xml/preference_headers_legacy.xml
deleted file mode 100644
index 47b0a0920..000000000
--- a/OpenKeychain/src/main/res/xml/preference_headers_legacy.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
- <Preference
- android:title="@string/section_general" >
- <intent
- android:action="org.sufficientlysecure.keychain.ui.PREFS_GEN" />
- </Preference>
- <Preference
- android:title="@string/section_advanced" >
- <intent
- android:action="org.sufficientlysecure.keychain.ui.PREFS_ADV" />
- </Preference>
-</PreferenceScreen>