aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-05-14 16:02:28 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-05-14 16:02:28 +0200
commit2f95100d88954db389cba8e615390795d121c1c8 (patch)
tree1bf4ffb29bb83fac33ba2ed7c84fb1d6a8af2bd4 /OpenKeychain/src/main
parent90ac60b6db0637fbefbce5cb2cd80a64f5bb708d (diff)
parent638554f2560b3c5fd36ca9b4ba205cb5a999b84b (diff)
downloadopen-keychain-2f95100d88954db389cba8e615390795d121c1c8.tar.gz
open-keychain-2f95100d88954db389cba8e615390795d121c1c8.tar.bz2
open-keychain-2f95100d88954db389cba8e615390795d121c1c8.zip
Merge remote-tracking branch 'origin/master' into wrapped-key-ring
Conflicts: 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/ui/CertifyKeyActivity.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java OpenKeychain/src/main/res/values/strings.xml
Diffstat (limited to 'OpenKeychain/src/main')
-rw-r--r--OpenKeychain/src/main/AndroidManifest.xml18
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ActionBarHelper.java19
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java)20
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java)5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeyServer.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java)22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java161
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java65
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java243
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java43
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java28
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java66
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java39
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java30
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java15
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java50
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java50
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java120
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java54
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java79
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java78
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java25
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java85
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java274
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java35
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java128
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java255
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java308
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java107
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/PagerTabStripAdapter.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyKeysAdapter.java44
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java49
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java40
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java147
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UnderlineTextView.java69
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java73
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeychainServiceListener.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/QrCodeUtils.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java318
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java211
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.pngbin0 -> 260 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin0 -> 467 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.pngbin0 -> 381 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.pngbin0 -> 398 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.pngbin0 -> 884 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.pngbin0 -> 485 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.pngbin0 -> 497 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.pngbin0 -> 473 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.pngbin0 -> 458 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.pngbin0 -> 497 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.pngbin0 -> 953 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.pngbin0 -> 356 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_depth0.pngbin0 -> 900 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_self.pngbin0 -> 757 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin0 -> 402 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin0 -> 361 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin0 -> 413 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_holo_light.pngbin0 -> 242 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin0 -> 423 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin0 -> 800 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin0 -> 624 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin0 -> 1699 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_holo_light.pngbin0 -> 1519 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin0 -> 803 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin0 -> 330 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin0 -> 422 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin0 -> 400 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin0 -> 406 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin0 -> 390 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin0 -> 1398 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin0 -> 717 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin0 -> 1467 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_holo_light.pngbin0 -> 736 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin0 -> 1574 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin0 -> 2383 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin0 -> 1169 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin0 -> 2199 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_holo_light.pngbin0 -> 1402 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin0 -> 1908 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_activated_holo.9.pngbin0 -> 115 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_focused_holo.9.pngbin0 -> 139 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_longpressed_holo.9.pngbin0 -> 115 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_pressed_holo_light.9.pngbin0 -> 115 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin0 -> 189 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_bg_holo_light.9.pngbin0 -> 175 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_primary_holo_light.9.pngbin0 -> 381 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_secondary_holo_light.9.pngbin0 -> 149 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin0 -> 729 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin0 -> 810 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin0 -> 913 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin0 -> 954 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin0 -> 840 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin0 -> 960 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin0 -> 761 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin0 -> 832 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_default_holo_light.9.pngbin0 -> 304 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin0 -> 378 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_focused_holo_light.9.pngbin0 -> 499 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin0 -> 359 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_activated_holo_light.9.pngbin0 -> 199 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_default_holo_light.9.pngbin0 -> 187 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin0 -> 1208 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin0 -> 1116 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_focused_holo_light.9.pngbin0 -> 298 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.pngbin0 -> 169 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin0 -> 306 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.pngbin0 -> 288 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.pngbin0 -> 324 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.pngbin0 -> 587 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.pngbin0 -> 343 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.pngbin0 -> 404 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.pngbin0 -> 361 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.pngbin0 -> 348 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.pngbin0 -> 375 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.pngbin0 -> 594 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.pngbin0 -> 291 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_depth0.pngbin0 -> 688 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_self.pngbin0 -> 555 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin0 -> 300 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin0 -> 329 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin0 -> 319 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_holo_light.pngbin0 -> 183 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin0 -> 289 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin0 -> 592 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin0 -> 508 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin0 -> 1100 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_holo_light.pngbin0 -> 1004 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin0 -> 554 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin0 -> 232 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin0 -> 313 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin0 -> 286 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin0 -> 276 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin0 -> 265 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin0 -> 778 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin0 -> 479 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin0 -> 802 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_holo_light.pngbin0 -> 451 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin0 -> 962 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin0 -> 1278 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin0 -> 736 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin0 -> 1184 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_holo_light.pngbin0 -> 847 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin0 -> 1118 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_activated_holo.9.pngbin0 -> 110 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_focused_holo.9.pngbin0 -> 117 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_longpressed_holo.9.pngbin0 -> 110 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_pressed_holo_light.9.pngbin0 -> 110 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin0 -> 171 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_bg_holo_light.9.pngbin0 -> 161 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_primary_holo_light.9.pngbin0 -> 270 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_secondary_holo_light.9.pngbin0 -> 135 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin0 -> 413 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin0 -> 485 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin0 -> 539 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin0 -> 521 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin0 -> 506 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin0 -> 538 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin0 -> 489 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin0 -> 507 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_default_holo_light.9.pngbin0 -> 237 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin0 -> 274 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_focused_holo_light.9.pngbin0 -> 390 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin0 -> 279 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_activated_holo_light.9.pngbin0 -> 165 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_default_holo_light.9.pngbin0 -> 151 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin0 -> 1133 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin0 -> 1094 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_focused_holo_light.9.pngbin0 -> 264 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.pngbin0 -> 324 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin0 -> 613 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.pngbin0 -> 353 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.pngbin0 -> 552 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.pngbin0 -> 1179 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.pngbin0 -> 566 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.pngbin0 -> 648 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.pngbin0 -> 623 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.pngbin0 -> 494 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.pngbin0 -> 531 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.pngbin0 -> 1231 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.pngbin0 -> 477 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_depth0.pngbin0 -> 1091 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_self.pngbin0 -> 940 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin0 -> 462 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin0 -> 375 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin0 -> 479 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_holo_light.pngbin0 -> 293 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin0 -> 549 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin0 -> 1059 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin0 -> 762 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin0 -> 2921 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_holo_light.pngbin0 -> 2651 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin0 -> 1134 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin0 -> 390 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin0 -> 541 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin0 -> 443 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin0 -> 520 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin0 -> 507 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin0 -> 2082 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin0 -> 919 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin0 -> 2161 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_holo_light.pngbin0 -> 950 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin0 -> 2235 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin0 -> 3484 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin0 -> 1643 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin0 -> 3568 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_holo_light.pngbin0 -> 2467 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin0 -> 2683 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_activated_holo.9.pngbin0 -> 121 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_focused_holo.9.pngbin0 -> 154 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_longpressed_holo.9.pngbin0 -> 121 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_pressed_holo_light.9.pngbin0 -> 121 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin0 -> 188 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_bg_holo_light.9.pngbin0 -> 178 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_primary_holo_light.9.pngbin0 -> 477 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_secondary_holo_light.9.pngbin0 -> 150 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin0 -> 821 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin0 -> 989 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin0 -> 1187 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin0 -> 1135 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin0 -> 1083 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin0 -> 1190 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin0 -> 1069 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin0 -> 1055 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_default_holo_light.9.pngbin0 -> 392 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin0 -> 420 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_focused_holo_light.9.pngbin0 -> 659 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin0 -> 507 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_activated_holo_light.9.pngbin0 -> 237 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_default_holo_light.9.pngbin0 -> 220 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin0 -> 1176 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin0 -> 1116 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_focused_holo_light.9.pngbin0 -> 434 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.pngbin0 -> 3272 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.pngbin0 -> 15207 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apps_pgpauth.pngbin0 -> 16342 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.pngbin0 -> 600 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.pngbin0 -> 911 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.pngbin0 -> 470 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.pngbin0 -> 650 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.pngbin0 -> 1670 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.pngbin0 -> 823 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.pngbin0 -> 925 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.pngbin0 -> 890 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.pngbin0 -> 687 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.pngbin0 -> 778 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.pngbin0 -> 1863 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.pngbin0 -> 588 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_depth0.pngbin0 -> 1366 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_self.pngbin0 -> 1282 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.pngbin0 -> 455 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_holo_light.pngbin0 -> 1177 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_focused_holo_light.pngbin0 -> 538 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_holo_light.pngbin0 -> 329 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_pressed_holo_light.pngbin0 -> 598 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.pngbin0 -> 1117 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_holo_light.pngbin0 -> 1574 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_focused_holo_light.pngbin0 -> 3942 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_holo_light.pngbin0 -> 3606 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_pressed_holo_light.pngbin0 -> 1155 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.pngbin0 -> 544 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_holo_light.9.pngbin0 -> 1643 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_focused_holo_light.9.pngbin0 -> 834 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_normal_holo_light.9.pngbin0 -> 890 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_pressed_holo_light.9.pngbin0 -> 823 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.pngbin0 -> 2511 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_holo_light.pngbin0 -> 2208 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_focused_holo_light.pngbin0 -> 2720 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_holo_light.pngbin0 -> 1490 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_pressed_holo_light.pngbin0 -> 3039 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.pngbin0 -> 4515 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_holo_light.pngbin0 -> 3894 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_focused_holo_light.pngbin0 -> 4895 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_holo_light.pngbin0 -> 3657 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_pressed_holo_light.pngbin0 -> 3544 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_activated_holo.9.pngbin0 -> 133 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_focused_holo.9.pngbin0 -> 158 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_longpressed_holo.9.pngbin0 -> 133 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_pressed_holo_light.9.pngbin0 -> 133 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_selector_disabled_holo_light.9.pngbin0 -> 280 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_bg_holo_light.9.pngbin0 -> 1084 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_primary_holo_light.9.pngbin0 -> 847 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_secondary_holo_light.9.pngbin0 -> 147 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo1.pngbin0 -> 1328 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo2.pngbin0 -> 1631 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo3.pngbin0 -> 1909 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo4.pngbin0 -> 1906 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo5.pngbin0 -> 1801 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo6.pngbin0 -> 1947 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo7.pngbin0 -> 1745 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo8.pngbin0 -> 1748 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_default_holo_light.9.pngbin0 -> 443 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_disabled_holo_light.9.pngbin0 -> 1326 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_focused_holo_light.9.pngbin0 -> 696 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_pressed_holo_light.9.pngbin0 -> 630 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_activated_holo_light.9.pngbin0 -> 338 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_default_holo_light.9.pngbin0 -> 325 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.pngbin0 -> 464 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_holo_light.9.pngbin0 -> 315 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_focused_holo_light.9.pngbin0 -> 513 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml20
-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/selector_transparent_button.xml4
-rw-r--r--OpenKeychain/src/main/res/layout/certify_key_activity.xml40
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml36
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml67
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_result_include.xml44
-rw-r--r--OpenKeychain/src/main/res/layout/edit_key_activity.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml34
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_message_fragment.xml69
-rw-r--r--OpenKeychain/src/main/res/layout/help_activity.xml5
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_activity.xml23
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml51
-rw-r--r--OpenKeychain/src/main/res/layout/import_keys_list_entry.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_fragment.xml137
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_header.xml7
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_item.xml18
-rw-r--r--OpenKeychain/src/main/res/layout/loader_layout.xml39
-rw-r--r--OpenKeychain/src/main/res/layout/upload_key_activity.xml (renamed from OpenKeychain/src/main/res/layout/key_server_export.xml)37
-rw-r--r--OpenKeychain/src/main/res/layout/view_cert_activity.xml37
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_activity.xml44
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_certs_header.xml7
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_certs_item.xml10
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml32
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_keys_item.xml142
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_main_fragment.xml281
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_share_fragment.xml178
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_userids_item.xml44
-rw-r--r--OpenKeychain/src/main/res/menu/api_app_settings.xml6
-rw-r--r--OpenKeychain/src/main/res/menu/key_view.xml51
-rw-r--r--OpenKeychain/src/main/res/menu/view_cert.xml9
-rw-r--r--OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_about.html2
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_changelog.html14
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_nfc_beam.html8
-rw-r--r--OpenKeychain/src/main/res/raw-de/help_start.html19
-rw-r--r--OpenKeychain/src/main/res/raw-el/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-el/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-es/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-et/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-fa-rIR/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-fr/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-it-rIT/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_changelog.html10
-rw-r--r--OpenKeychain/src/main/res/raw-ja/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-ko/help_about.html49
-rw-r--r--OpenKeychain/src/main/res/raw-ko/help_changelog.html156
-rw-r--r--OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html12
-rw-r--r--OpenKeychain/src/main/res/raw-ko/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-nl-rNL/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-pl/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-ru/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-sl/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-tr/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-uk/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_changelog.html8
-rw-r--r--OpenKeychain/src/main/res/raw-zh/help_start.html5
-rw-r--r--OpenKeychain/src/main/res/raw/help_about.html1
-rw-r--r--OpenKeychain/src/main/res/raw/help_changelog.html9
-rw-r--r--OpenKeychain/src/main/res/raw/help_start.html6
-rw-r--r--OpenKeychain/src/main/res/values-cs-rCZ/strings.xml3
-rw-r--r--OpenKeychain/src/main/res/values-de/strings.xml96
-rw-r--r--OpenKeychain/src/main/res/values-el/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-es/strings.xml66
-rw-r--r--OpenKeychain/src/main/res/values-et/strings.xml4
-rw-r--r--OpenKeychain/src/main/res/values-fa-rIR/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-fr/strings.xml68
-rw-r--r--OpenKeychain/src/main/res/values-it-rIT/strings.xml62
-rw-r--r--OpenKeychain/src/main/res/values-ja/strings.xml54
-rw-r--r--OpenKeychain/src/main/res/values-ko/strings.xml31
-rw-r--r--OpenKeychain/src/main/res/values-nl-rNL/strings.xml10
-rw-r--r--OpenKeychain/src/main/res/values-pl/strings.xml26
-rw-r--r--OpenKeychain/src/main/res/values-ru/strings.xml24
-rw-r--r--OpenKeychain/src/main/res/values-sl/strings.xml62
-rw-r--r--OpenKeychain/src/main/res/values-tr/strings.xml8
-rw-r--r--OpenKeychain/src/main/res/values-uk/strings.xml23
-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-v14/styles.xml18
-rw-r--r--OpenKeychain/src/main/res/values-zh/strings.xml8
-rw-r--r--OpenKeychain/src/main/res/values/arrays.xml1
-rw-r--r--OpenKeychain/src/main/res/values/colors.xml17
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml66
-rw-r--r--OpenKeychain/src/main/res/values/styles.xml7
439 files changed, 4652 insertions, 1993 deletions
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index caefafb54..f4007c098 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -3,8 +3,8 @@
xmlns:tools="http://schemas.android.com/tools"
package="org.sufficientlysecure.keychain"
android:installLocation="auto"
- android:versionCode="26100"
- android:versionName="2.6.1">
+ android:versionCode="27000"
+ android:versionName="2.7">
<!--
General remarks
@@ -232,7 +232,12 @@
<activity
android:name=".ui.UploadKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_send_key" />
+ android:label="@string/title_send_key"
+ android:parentActivityName=".ui.ViewKeyActivity">
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".ui.ViewKeyActivity" />
+ </activity>
<activity
android:name=".ui.PreferencesActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
@@ -254,7 +259,12 @@
<activity
android:name=".ui.CertifyKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_certify_key" />
+ android:label="@string/title_certify_key"
+ android:parentActivityName=".ui.ViewKeyActivity">
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".ui.ViewKeyActivity" />
+ </activity>
<activity
android:name=".ui.ImportKeysActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
index 866888bb2..f911318a0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
@@ -18,6 +18,9 @@
package org.sufficientlysecure.keychain;
import android.app.Application;
+import android.content.Context;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
import android.os.Environment;
import org.spongycastle.jce.provider.BouncyCastleProvider;
@@ -70,5 +73,22 @@ public class KeychainApplication extends Application {
// that the directory doesn't exist at this point
}
}
+
+ brandGlowEffect(getApplicationContext(),
+ getApplicationContext().getResources().getColor(R.color.emphasis));
+ }
+
+ static void brandGlowEffect(Context context, int brandColor) {
+ // terrible hack to brand the edge overscroll glow effect
+ // https://gist.github.com/menny/7878762#file-brandgloweffect_full-java
+
+ //glow
+ int glowDrawableId = context.getResources().getIdentifier("overscroll_glow", "drawable", "android");
+ Drawable androidGlow = context.getResources().getDrawable(glowDrawableId);
+ androidGlow.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN);
+ //edge
+ int edgeDrawableId = context.getResources().getIdentifier("overscroll_edge", "drawable", "android");
+ Drawable androidEdge = context.getResources().getDrawable(edgeDrawableId);
+ androidEdge.setColorFilter(brandColor, PorterDuff.Mode.SRC_IN);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ActionBarHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ActionBarHelper.java
index 72b6d9e1d..46e7936ce 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ActionBarHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ActionBarHelper.java
@@ -33,25 +33,6 @@ import org.sufficientlysecure.keychain.util.Log;
public class ActionBarHelper {
/**
- * Set actionbar without home button if called from another app
- *
- * @param activity
- */
- public static void setBackButton(ActionBarActivity activity) {
- final ActionBar actionBar = activity.getSupportActionBar();
- Log.d(Constants.TAG, "calling package (only set when using startActivityForResult)="
- + activity.getCallingPackage());
- if (activity.getCallingPackage() != null
- && activity.getCallingPackage().equals(Constants.PACKAGE_NAME)) {
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setHomeButtonEnabled(true);
- } else {
- actionBar.setDisplayHomeAsUpEnabled(false);
- actionBar.setHomeButtonEnabled(false);
- }
- }
-
- /**
* Sets custom view on ActionBar for Done/Cancel activities
*
* @param actionBar
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
index f22fcd4b8..d7d73cf3d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/FileHelper.java
@@ -112,16 +112,18 @@ public class FileHelper {
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {"_data"};
- Cursor cursor = null;
-
+ Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
try {
- cursor = context.getContentResolver().query(uri, projection, null, null, null);
- int columnIndex = cursor.getColumnIndexOrThrow("_data");
- if (cursor.moveToFirst()) {
+ if (cursor != null && cursor.moveToFirst()) {
+ int columnIndex = cursor.getColumnIndexOrThrow("_data");
return cursor.getString(columnIndex);
}
} catch (Exception e) {
// Eat it
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java
index cf658b0b6..85ce6bfcc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.sufficientlysecure.keychain.util;
+package org.sufficientlysecure.keychain.keyimport;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
@@ -32,9 +32,8 @@ import org.apache.http.util.EntityUtils;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.util.Log;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
@@ -167,21 +166,6 @@ public class HkpKeyServer extends KeyServer {
mPort = port;
}
- private static String readAll(InputStream in, String encoding) throws IOException {
- ByteArrayOutputStream raw = new ByteArrayOutputStream();
-
- byte buffer[] = new byte[1 << 16];
- int n = 0;
- while ((n = in.read(buffer)) != -1) {
- raw.write(buffer, 0, n);
- }
-
- if (encoding == null) {
- encoding = "utf8";
- }
- return raw.toString(encoding);
- }
-
private String query(String request) throws QueryException, HttpError {
InetAddress ips[];
try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
index b06852af4..1199290e0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
@@ -15,12 +15,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-package org.sufficientlysecure.keychain.ui.adapter;
+package org.sufficientlysecure.keychain.keyimport;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
-import android.util.SparseArray;
import org.spongycastle.bcpg.SignatureSubpacketTags;
import org.spongycastle.openpgp.PGPKeyRing;
@@ -203,7 +202,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
* Constructor for later querying from keyserver
*/
public ImportKeysListEntry() {
- // keys from keyserver are always public keys
+ // keys from keyserver are always public keys; from keybase too
secretKey = false;
// do not select by default
mSelected = false;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeyServer.java
index 2b97165ac..d6ebca5a6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeyServer.java
@@ -16,10 +16,11 @@
* limitations under the License.
*/
-package org.sufficientlysecure.keychain.util;
-
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+package org.sufficientlysecure.keychain.keyimport;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.List;
public abstract class KeyServer {
@@ -49,4 +50,19 @@ public abstract class KeyServer {
abstract String get(String keyIdHex) throws QueryException;
abstract void add(String armoredKey) throws AddKeyException;
+
+ public static String readAll(InputStream in, String encoding) throws IOException {
+ ByteArrayOutputStream raw = new ByteArrayOutputStream();
+
+ byte buffer[] = new byte[1 << 16];
+ int n = 0;
+ while ((n = in.read(buffer)) != -1) {
+ raw.write(buffer, 0, n);
+ }
+
+ if (encoding == null) {
+ encoding = "utf8";
+ }
+ return raw.toString(encoding);
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
new file mode 100644
index 000000000..7ffe123c0
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -0,0 +1,161 @@
+/*
+ * 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.keyimport;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.util.JWalk;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.util.WeakHashMap;
+
+public class KeybaseKeyServer extends KeyServer {
+
+ private WeakHashMap<String, String> mKeyCache = new WeakHashMap<String, String>();
+
+ @Override
+ public ArrayList<ImportKeysListEntry> search(String query) throws QueryException, TooManyResponses,
+ InsufficientQuery {
+ ArrayList<ImportKeysListEntry> results = new ArrayList<ImportKeysListEntry>();
+
+ JSONObject fromQuery = getFromKeybase("_/api/1.0/user/autocomplete.json?q=", query);
+ try {
+
+ JSONArray matches = JWalk.getArray(fromQuery, "completions");
+ for (int i = 0; i < matches.length(); i++) {
+ JSONObject match = matches.getJSONObject(i);
+
+ // only list them if they have a key
+ if (JWalk.optObject(match, "components", "key_fingerprint") != null) {
+ results.add(makeEntry(match));
+ }
+ }
+ } catch (Exception e) {
+ throw new QueryException("Unexpected structure in keybase search result: " + e.getMessage());
+ }
+
+ return results;
+ }
+
+ private JSONObject getUser(String keybaseID) throws QueryException {
+ try {
+ return getFromKeybase("_/api/1.0/user/lookup.json?username=", keybaseID);
+ } catch (Exception e) {
+ String detail = "";
+ if (keybaseID != null) {
+ detail = ". Query was for user '" + keybaseID + "'";
+ }
+ throw new QueryException(e.getMessage() + detail);
+ }
+ }
+
+ private ImportKeysListEntry makeEntry(JSONObject match) throws QueryException, JSONException {
+
+ String keybaseID = JWalk.getString(match, "components", "username", "val");
+ String key_fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val");
+ key_fingerprint = key_fingerprint.replace(" ", "").toUpperCase();
+ match = getUser(keybaseID);
+
+ final ImportKeysListEntry entry = new ImportKeysListEntry();
+
+ // TODO: Fix; have suggested keybase provide this value to avoid search-time crypto calls
+ entry.setBitStrength(4096);
+ entry.setAlgorithm("RSA");
+ entry.setKeyIdHex("0x" + key_fingerprint);
+ entry.setRevoked(false);
+
+ // ctime
+ final long creationDate = JWalk.getLong(match, "them", "public_keys", "primary", "ctime");
+ final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+ tmpGreg.setTimeInMillis(creationDate * 1000);
+ entry.setDate(tmpGreg.getTime());
+
+ // key bits
+ // we have to fetch the user object to construct the search-result list, so we might as
+ // well (weakly) remember the key, in case they try to import it
+ mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle"));
+
+ // String displayName = JWalk.getString(match, "them", "profile", "full_name");
+ ArrayList<String> userIds = new ArrayList<String>();
+ String name = "keybase.io/" + keybaseID + " <" + keybaseID + "@keybase.io>";
+ userIds.add(name);
+ userIds.add(keybaseID);
+ entry.setUserIds(userIds);
+ entry.setPrimaryUserId(name);
+ return entry;
+ }
+
+ private JSONObject getFromKeybase(String path, String query) throws QueryException {
+ try {
+ String url = "https://keybase.io/" + path + URLEncoder.encode(query, "utf8");
+ Log.d(Constants.TAG, "keybase query: " + url);
+
+ URL realUrl = new URL(url);
+ HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
+ conn.setConnectTimeout(5000); // TODO: Reasonable values for keybase
+ conn.setReadTimeout(25000);
+ conn.connect();
+ int response = conn.getResponseCode();
+ if (response >= 200 && response < 300) {
+ String text = readAll(conn.getInputStream(), conn.getContentEncoding());
+ try {
+ JSONObject json = new JSONObject(text);
+ if (JWalk.getInt(json, "status", "code") != 0) {
+ throw new QueryException("Keybase autocomplete search failed");
+ }
+ return json;
+ } catch (JSONException e) {
+ throw new QueryException("Keybase.io query returned broken JSON");
+ }
+ } else {
+ String message = readAll(conn.getErrorStream(), conn.getContentEncoding());
+ throw new QueryException("Keybase.io query error (status=" + response +
+ "): " + message);
+ }
+ } catch (Exception e) {
+ throw new QueryException("Keybase.io query error");
+ }
+ }
+
+ @Override
+ public String get(String id) throws QueryException {
+ String key = mKeyCache.get(id);
+ if (key == null) {
+ try {
+ JSONObject user = getUser(id);
+ key = JWalk.getString(user, "them", "public_keys", "primary", "bundle");
+ } catch (Exception e) {
+ throw new QueryException(e.getMessage());
+ }
+ }
+ return key;
+ }
+
+ @Override
+ public void add(String armoredKey) throws AddKeyException {
+ throw new AddKeyException();
+ }
+} \ No newline at end of file
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java
index a7e1bd603..a0d2d5cea 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java
@@ -36,11 +36,10 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
-import org.sufficientlysecure.keychain.util.HkpKeyServer;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.keyimport.HkpKeyServer;
import org.sufficientlysecure.keychain.util.IterableIterator;
-import org.sufficientlysecure.keychain.util.KeyServer.AddKeyException;
-import org.sufficientlysecure.keychain.util.KeychainServiceListener;
+import org.sufficientlysecure.keychain.keyimport.KeyServer.AddKeyException;
import org.sufficientlysecure.keychain.util.Log;
import java.io.ByteArrayOutputStream;
@@ -51,6 +50,11 @@ import java.util.List;
public class PgpImportExport {
+ // TODO: is this really used?
+ public interface KeychainServiceListener {
+ boolean hasServiceStopped();
+ }
+
private Context mContext;
private Progressable mProgressable;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
index ccbbb3719..96ee3f10a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
@@ -181,8 +181,6 @@ public class PgpSignEncrypt {
}
/**
- * TODO: test this option!
- *
* @param encryptToSigner
* @return
*/
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 061f91176..68726d3e0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -255,53 +255,60 @@ public class KeychainDatabase extends SQLiteOpenHelper {
}
}.getReadableDatabase();
- Cursor c = null;
+ Cursor cursor = null;
try {
// we insert in two steps: first, all public keys that have secret keys
- c = db.rawQuery("SELECT key_ring_data FROM key_rings WHERE type = 1 OR EXISTS ("
+ cursor = db.rawQuery("SELECT key_ring_data FROM key_rings WHERE type = 1 OR EXISTS ("
+ " SELECT 1 FROM key_rings d2 WHERE key_rings.master_key_id = d2.master_key_id"
+ " AND d2.type = 1) ORDER BY type ASC", null);
- Log.d(Constants.TAG, "Importing " + c.getCount() + " secret keyrings from apg.db...");
- for (int i = 0; i < c.getCount(); i++) {
- c.moveToPosition(i);
- byte[] data = c.getBlob(0);
- PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
- ProviderHelper providerHelper = new ProviderHelper(context);
- if (ring instanceof PGPPublicKeyRing)
- providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
- else if (ring instanceof PGPSecretKeyRing)
- providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
- else {
- Log.e(Constants.TAG, "Unknown blob data type!");
+ Log.d(Constants.TAG, "Importing " + cursor.getCount() + " secret keyrings from apg.db...");
+ if (cursor != null) {
+ for (int i = 0; i < cursor.getCount(); i++) {
+ cursor.moveToPosition(i);
+ byte[] data = cursor.getBlob(0);
+ PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
+ ProviderHelper providerHelper = new ProviderHelper(context);
+ if (ring instanceof PGPPublicKeyRing)
+ providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
+ else if (ring instanceof PGPSecretKeyRing)
+ providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
+ else {
+ Log.e(Constants.TAG, "Unknown blob data type!");
+ }
}
}
+ if (cursor != null) {
+ cursor.close();
+ }
// afterwards, insert all keys, starting with public keys that have secret keys, then
// secret keys, then all others. this order is necessary to ensure all certifications
// are recognized properly.
- c = db.rawQuery("SELECT key_ring_data FROM key_rings ORDER BY (type = 0 AND EXISTS ("
+ cursor = db.rawQuery("SELECT key_ring_data FROM key_rings ORDER BY (type = 0 AND EXISTS ("
+ " SELECT 1 FROM key_rings d2 WHERE key_rings.master_key_id = d2.master_key_id AND"
+ " d2.type = 1)) DESC, type DESC", null);
// import from old database
- Log.d(Constants.TAG, "Importing " + c.getCount() + " keyrings from apg.db...");
- for (int i = 0; i < c.getCount(); i++) {
- c.moveToPosition(i);
- byte[] data = c.getBlob(0);
- PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
- ProviderHelper providerHelper = new ProviderHelper(context);
- if (ring instanceof PGPPublicKeyRing) {
- providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
- } else if (ring instanceof PGPSecretKeyRing) {
- providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
- } else {
- Log.e(Constants.TAG, "Unknown blob data type!");
+ Log.d(Constants.TAG, "Importing " + cursor.getCount() + " keyrings from apg.db...");
+ if (cursor != null) {
+ for (int i = 0; i < cursor.getCount(); i++) {
+ cursor.moveToPosition(i);
+ byte[] data = cursor.getBlob(0);
+ PGPKeyRing ring = PgpConversionHelper.BytesToPGPKeyRing(data);
+ ProviderHelper providerHelper = new ProviderHelper(context);
+ if (ring instanceof PGPPublicKeyRing) {
+ providerHelper.saveKeyRing((PGPPublicKeyRing) ring);
+ } else if (ring instanceof PGPSecretKeyRing) {
+ providerHelper.saveKeyRing((PGPSecretKeyRing) ring);
+ } else {
+ Log.e(Constants.TAG, "Unknown blob data type!");
+ }
}
}
} catch (IOException e) {
Log.e(Constants.TAG, "Error importing apg.db!", e);
} finally {
- if (c != null) {
- c.close();
+ if (cursor != null) {
+ cursor.close();
}
if (db != null) {
db.close();
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 c67c2eca4..9f6314329 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
@@ -567,20 +567,21 @@ public class KeychainProvider extends ContentProvider {
}
SQLiteDatabase db = getDb().getReadableDatabase();
- Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, having, orderBy);
-
- // Tell the cursor what uri to watch, so it knows when its source data changes
- c.setNotificationUri(getContext().getContentResolver(), uri);
+ Cursor cursor = qb.query(db, projection, selection, selectionArgs, groupBy, having, orderBy);
+ if (cursor != null) {
+ // Tell the cursor what uri to watch, so it knows when its source data changes
+ cursor.setNotificationUri(getContext().getContentResolver(), uri);
+ }
if (Constants.DEBUG) {
Log.d(Constants.TAG,
"Query: "
+ qb.buildQuery(projection, selection, selectionArgs, null, null,
orderBy, null));
- Log.d(Constants.TAG, "Cursor: " + DatabaseUtils.dumpCursorToString(c));
+ Log.d(Constants.TAG, "Cursor: " + DatabaseUtils.dumpCursorToString(cursor));
}
- return c;
+ return cursor;
}
/**
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 0784a0f33..18035eefe 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -26,6 +26,7 @@ import android.database.Cursor;
import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.RemoteException;
+import android.support.v4.util.LongSparseArray;
import org.spongycastle.bcpg.ArmoredOutputStream;
import org.spongycastle.bcpg.S2K;
@@ -103,36 +104,38 @@ public class ProviderHelper {
throws NotFoundException {
Cursor cursor = mContentResolver.query(uri, proj, null, null, null);
- HashMap<String, Object> result = new HashMap<String, Object>(proj.length);
- if (cursor != null && cursor.moveToFirst()) {
- int pos = 0;
- for (String p : proj) {
- switch (types[pos]) {
- case FIELD_TYPE_NULL:
- result.put(p, cursor.isNull(pos));
- break;
- case FIELD_TYPE_INTEGER:
- result.put(p, cursor.getLong(pos));
- break;
- case FIELD_TYPE_FLOAT:
- result.put(p, cursor.getFloat(pos));
- break;
- case FIELD_TYPE_STRING:
- result.put(p, cursor.getString(pos));
- break;
- case FIELD_TYPE_BLOB:
- result.put(p, cursor.getBlob(pos));
- break;
+ try {
+ HashMap<String, Object> result = new HashMap<String, Object>(proj.length);
+ if (cursor != null && cursor.moveToFirst()) {
+ int pos = 0;
+ for (String p : proj) {
+ switch (types[pos]) {
+ case FIELD_TYPE_NULL:
+ result.put(p, cursor.isNull(pos));
+ break;
+ case FIELD_TYPE_INTEGER:
+ result.put(p, cursor.getLong(pos));
+ break;
+ case FIELD_TYPE_FLOAT:
+ result.put(p, cursor.getFloat(pos));
+ break;
+ case FIELD_TYPE_STRING:
+ result.put(p, cursor.getString(pos));
+ break;
+ case FIELD_TYPE_BLOB:
+ result.put(p, cursor.getBlob(pos));
+ break;
+ }
+ pos += 1;
}
- pos += 1;
}
- }
- if (cursor != null) {
- cursor.close();
+ return result;
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
-
- return result;
}
public Object getUnifiedData(long masterKeyId, String column, int type)
@@ -172,22 +175,24 @@ public class ProviderHelper {
}
@Deprecated
- public Map<Long, PGPKeyRing> getPGPKeyRings(Uri queryUri) {
+ public LongSparseArray<PGPKeyRing> getPGPKeyRings(Uri queryUri) {
Cursor cursor = mContentResolver.query(queryUri,
new String[]{KeyRingData.MASTER_KEY_ID, KeyRingData.KEY_RING_DATA},
null, null, null);
- Map<Long, PGPKeyRing> result = new HashMap<Long, PGPKeyRing>(cursor.getCount());
- if (cursor != null && cursor.moveToFirst()) do {
- long masterKeyId = cursor.getLong(0);
- byte[] data = cursor.getBlob(1);
- if (data != null) {
- result.put(masterKeyId, PgpConversionHelper.BytesToPGPKeyRing(data));
+ LongSparseArray<PGPKeyRing> result = new LongSparseArray<PGPKeyRing>(cursor.getCount());
+ try {
+ if (cursor != null && cursor.moveToFirst()) do {
+ long masterKeyId = cursor.getLong(0);
+ byte[] data = cursor.getBlob(1);
+ if (data != null) {
+ result.put(masterKeyId, PgpConversionHelper.BytesToPGPKeyRing(data));
+ }
+ } while (cursor.moveToNext());
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
- } while (cursor.moveToNext());
-
- if (cursor != null) {
- cursor.close();
}
return result;
@@ -255,11 +260,11 @@ public class ProviderHelper {
@Deprecated
public PGPKeyRing getPGPKeyRing(Uri queryUri) throws NotFoundException {
- Map<Long, PGPKeyRing> result = getPGPKeyRings(queryUri);
- if (result.isEmpty()) {
+ LongSparseArray<PGPKeyRing> result = getPGPKeyRings(queryUri);
+ if (result.size() == 0) {
throw new NotFoundException("PGPKeyRing object not found!");
} else {
- return result.values().iterator().next();
+ return result.valueAt(0);
}
}
@@ -312,7 +317,7 @@ public class ProviderHelper {
}
// get a list of owned secret keys, for verification filtering
- Map<Long, PGPKeyRing> allKeyRings = getPGPKeyRings(KeyRingData.buildSecretKeyRingUri());
+ LongSparseArray<PGPKeyRing> allKeyRings = getPGPKeyRings(KeyRingData.buildSecretKeyRingUri());
// special case: available secret keys verify themselves!
if (secretRing != null)
allKeyRings.put(secretRing.getSecretKey().getKeyID(), secretRing);
@@ -350,7 +355,7 @@ public class ProviderHelper {
}
}
// verify signatures from known private keys
- if (allKeyRings.containsKey(certId)) {
+ if (allKeyRings.indexOfKey(certId) >= 0) {
// mark them as verified
cert.init(new JcaPGPContentVerifierBuilderProvider().setProvider(
Constants.BOUNCY_CASTLE_PROVIDER_NAME),
@@ -634,27 +639,29 @@ public class ProviderHelper {
}, inMasterKeyList, null, null);
}
- if (cursor != null) {
- int masterIdCol = cursor.getColumnIndex(KeyRingData.MASTER_KEY_ID);
- int dataCol = cursor.getColumnIndex(KeyRingData.KEY_RING_DATA);
- if (cursor.moveToFirst()) {
- do {
- Log.d(Constants.TAG, "masterKeyId: " + cursor.getLong(masterIdCol));
-
- byte[] data = cursor.getBlob(dataCol);
-
- // get actual keyring data blob and write it to ByteArrayOutputStream
- try {
- output.add(getKeyRingAsArmoredString(data));
- } catch (IOException e) {
- Log.e(Constants.TAG, "IOException", e);
- }
- } while (cursor.moveToNext());
+ try {
+ if (cursor != null) {
+ int masterIdCol = cursor.getColumnIndex(KeyRingData.MASTER_KEY_ID);
+ int dataCol = cursor.getColumnIndex(KeyRingData.KEY_RING_DATA);
+ if (cursor.moveToFirst()) {
+ do {
+ Log.d(Constants.TAG, "masterKeyId: " + cursor.getLong(masterIdCol));
+
+ byte[] data = cursor.getBlob(dataCol);
+
+ // get actual keyring data blob and write it to ByteArrayOutputStream
+ try {
+ output.add(getKeyRingAsArmoredString(data));
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException", e);
+ }
+ } while (cursor.moveToNext());
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
- }
-
- if (cursor != null) {
- cursor.close();
}
if (output.size() > 0) {
@@ -668,17 +675,19 @@ public class ProviderHelper {
Cursor cursor = mContentResolver.query(ApiApps.CONTENT_URI, null, null, null, null);
ArrayList<String> packageNames = new ArrayList<String>();
- if (cursor != null) {
- int packageNameCol = cursor.getColumnIndex(ApiApps.PACKAGE_NAME);
- if (cursor.moveToFirst()) {
- do {
- packageNames.add(cursor.getString(packageNameCol));
- } while (cursor.moveToNext());
+ try {
+ if (cursor != null) {
+ int packageNameCol = cursor.getColumnIndex(ApiApps.PACKAGE_NAME);
+ if (cursor.moveToFirst()) {
+ do {
+ packageNames.add(cursor.getString(packageNameCol));
+ } while (cursor.moveToNext());
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
- }
-
- if (cursor != null) {
- cursor.close();
}
return packageNames;
@@ -726,13 +735,19 @@ public class ProviderHelper {
public AppSettings getApiAppSettings(Uri uri) {
AppSettings settings = null;
- Cursor cur = mContentResolver.query(uri, null, null, null, null);
- if (cur != null && cur.moveToFirst()) {
- settings = new AppSettings();
- settings.setPackageName(cur.getString(
- cur.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)));
- settings.setPackageSignature(cur.getBlob(
- cur.getColumnIndex(KeychainContract.ApiApps.PACKAGE_SIGNATURE)));
+ Cursor cursor = mContentResolver.query(uri, null, null, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ settings = new AppSettings();
+ settings.setPackageName(cursor.getString(
+ cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_NAME)));
+ settings.setPackageSignature(cursor.getBlob(
+ cursor.getColumnIndex(KeychainContract.ApiApps.PACKAGE_SIGNATURE)));
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
return settings;
@@ -741,20 +756,26 @@ public class ProviderHelper {
public AccountSettings getApiAccountSettings(Uri accountUri) {
AccountSettings settings = null;
- Cursor cur = mContentResolver.query(accountUri, null, null, null, null);
- if (cur != null && cur.moveToFirst()) {
- settings = new AccountSettings();
-
- settings.setAccountName(cur.getString(
- cur.getColumnIndex(KeychainContract.ApiAccounts.ACCOUNT_NAME)));
- settings.setKeyId(cur.getLong(
- cur.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID)));
- settings.setCompression(cur.getInt(
- cur.getColumnIndexOrThrow(KeychainContract.ApiAccounts.COMPRESSION)));
- settings.setHashAlgorithm(cur.getInt(
- cur.getColumnIndexOrThrow(KeychainContract.ApiAccounts.HASH_ALORITHM)));
- settings.setEncryptionAlgorithm(cur.getInt(
- cur.getColumnIndexOrThrow(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM)));
+ Cursor cursor = mContentResolver.query(accountUri, null, null, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ settings = new AccountSettings();
+
+ settings.setAccountName(cursor.getString(
+ cursor.getColumnIndex(KeychainContract.ApiAccounts.ACCOUNT_NAME)));
+ settings.setKeyId(cursor.getLong(
+ cursor.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID)));
+ settings.setCompression(cursor.getInt(
+ cursor.getColumnIndexOrThrow(KeychainContract.ApiAccounts.COMPRESSION)));
+ settings.setHashAlgorithm(cursor.getInt(
+ cursor.getColumnIndexOrThrow(KeychainContract.ApiAccounts.HASH_ALORITHM)));
+ settings.setEncryptionAlgorithm(cursor.getInt(
+ cursor.getColumnIndexOrThrow(KeychainContract.ApiAccounts.ENCRYPTION_ALGORITHM)));
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
return settings;
@@ -764,10 +785,16 @@ public class ProviderHelper {
Set<Long> keyIds = new HashSet<Long>();
Cursor cursor = mContentResolver.query(uri, null, null, null, null);
- if (cursor != null) {
- int keyIdColumn = cursor.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID);
- while (cursor.moveToNext()) {
- keyIds.add(cursor.getLong(keyIdColumn));
+ try {
+ if (cursor != null) {
+ int keyIdColumn = cursor.getColumnIndex(KeychainContract.ApiAccounts.KEY_ID);
+ while (cursor.moveToNext()) {
+ keyIds.add(cursor.getLong(keyIdColumn));
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
}
}
@@ -780,18 +807,18 @@ public class ProviderHelper {
String[] projection = new String[]{ApiApps.PACKAGE_SIGNATURE};
Cursor cursor = mContentResolver.query(queryUri, projection, null, null, null);
+ try {
+ byte[] signature = null;
+ if (cursor != null && cursor.moveToFirst()) {
+ int signatureCol = 0;
- byte[] signature = null;
- if (cursor != null && cursor.moveToFirst()) {
- int signatureCol = 0;
-
- signature = cursor.getBlob(signatureCol);
- }
-
- if (cursor != null) {
- cursor.close();
+ signature = cursor.getBlob(signatureCol);
+ }
+ return signature;
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
-
- return signature;
}
}
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 8a247a11b..58aa2ece8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -42,6 +42,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.ui.ImportKeysActivity;
+import org.sufficientlysecure.keychain.ui.ViewKeyActivity;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
@@ -69,19 +70,25 @@ public class OpenPgpService extends RemoteService {
for (String email : encryptionUserIds) {
Uri uri = KeyRings.buildUnifiedKeyRingsFindByEmailUri(email);
- Cursor cur = getContentResolver().query(uri, null, null, null, null);
- if (cur.moveToFirst()) {
- long id = cur.getLong(cur.getColumnIndex(KeyRings.MASTER_KEY_ID));
- keyIds.add(id);
- } else {
- missingUserIdsCheck = true;
- missingUserIds.add(email);
- Log.d(Constants.TAG, "user id missing");
- }
- if (cur.moveToNext()) {
- duplicateUserIdsCheck = true;
- duplicateUserIds.add(email);
- Log.d(Constants.TAG, "more than one user id with the same email");
+ Cursor cursor = getContentResolver().query(uri, null, null, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ long id = cursor.getLong(cursor.getColumnIndex(KeyRings.MASTER_KEY_ID));
+ keyIds.add(id);
+ } else {
+ missingUserIdsCheck = true;
+ missingUserIds.add(email);
+ Log.d(Constants.TAG, "user id missing");
+ }
+ if (cursor != null && cursor.moveToNext()) {
+ duplicateUserIdsCheck = true;
+ duplicateUserIds.add(email);
+ Log.d(Constants.TAG, "more than one user id with the same email");
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
}
@@ -417,7 +424,15 @@ public class OpenPgpService extends RemoteService {
Intent result = new Intent();
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- // TODO: also return PendingIntent that opens the key view activity
+ // also return PendingIntent that opens the key view activity
+ Intent intent = new Intent(getBaseContext(), ViewKeyActivity.class);
+ intent.setData(KeyRings.buildGenericKeyRingUri(Long.toString(masterKeyId)));
+
+ PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
+ intent,
+ PendingIntent.FLAG_CANCEL_CURRENT);
+
+ result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
return result;
} catch (ProviderHelper.NotFoundException e) {
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 c6637c058..8df341f9e 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
@@ -40,6 +40,9 @@ public class AppSettingsActivity extends ActionBarActivity {
private AppSettingsFragment mSettingsFragment;
private AccountsListFragment mAccountsListFragment;
+ // model
+ AppSettings mAppSettings;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -80,22 +83,39 @@ public class AppSettingsActivity extends ActionBarActivity {
case R.id.menu_api_settings_revoke:
revokeAccess();
return true;
+ case R.id.menu_api_settings_start:
+ startApp();
+ return true;
}
return super.onOptionsItemSelected(item);
}
+ private void startApp() {
+ Intent i;
+ PackageManager manager = getPackageManager();
+ try {
+ i = manager.getLaunchIntentForPackage(mAppSettings.getPackageName());
+ if (i == null)
+ throw new PackageManager.NameNotFoundException();
+ i.addCategory(Intent.CATEGORY_LAUNCHER);
+ startActivity(i);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(Constants.TAG, "startApp", e);
+ }
+ }
+
private void loadData(Bundle savedInstanceState, Uri appUri) {
- AppSettings settings = new ProviderHelper(this).getApiAppSettings(appUri);
- mSettingsFragment.setAppSettings(settings);
+ mAppSettings = new ProviderHelper(this).getApiAppSettings(appUri);
+ mSettingsFragment.setAppSettings(mAppSettings);
String appName;
PackageManager pm = getPackageManager();
try {
- ApplicationInfo ai = pm.getApplicationInfo(settings.getPackageName(), 0);
+ ApplicationInfo ai = pm.getApplicationInfo(mAppSettings.getPackageName(), 0);
appName = (String) pm.getApplicationLabel(ai);
} catch (PackageManager.NameNotFoundException e) {
// fallback
- appName = settings.getPackageName();
+ appName = mAppSettings.getPackageName();
}
setTitle(appName);
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 2fd1ad3b5..d0b958844 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
@@ -250,7 +250,7 @@ public class RemoteServiceActivity extends ActionBarActivity {
// set text on view
HtmlTextView textView = (HtmlTextView) findViewById(R.id.api_select_pub_keys_text);
- textView.setHtmlFromString(text);
+ textView.setHtmlFromString(text, true);
/* Load select pub keys fragment */
// Check that the activity is using the layout version with
@@ -292,7 +292,7 @@ public class RemoteServiceActivity extends ActionBarActivity {
// set text on view
HtmlTextView textView = (HtmlTextView) findViewById(R.id.api_app_error_message_text);
- textView.setHtmlFromString(text);
+ textView.setHtmlFromString(text, true);
} else {
Log.e(Constants.TAG, "Action does not exist!");
setResult(RESULT_CANCELED);
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 5365ed62c..ff599aaa1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -50,10 +50,10 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
-import org.sufficientlysecure.keychain.util.HkpKeyServer;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.keyimport.HkpKeyServer;
import org.sufficientlysecure.keychain.util.InputData;
-import org.sufficientlysecure.keychain.util.KeychainServiceListener;
+import org.sufficientlysecure.keychain.keyimport.KeybaseKeyServer;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressScaler;
@@ -75,7 +75,7 @@ import java.util.List;
* after doing them.
*/
public class KeychainIntentService extends IntentService
- implements Progressable, KeychainServiceListener {
+ implements Progressable, PgpImportExport.KeychainServiceListener {
/* extras that can be given by intent */
public static final String EXTRA_MESSENGER = "messenger";
@@ -99,6 +99,7 @@ public class KeychainIntentService extends IntentService
public static final String ACTION_UPLOAD_KEYRING = Constants.INTENT_PREFIX + "UPLOAD_KEYRING";
public static final String ACTION_DOWNLOAD_AND_IMPORT_KEYS = Constants.INTENT_PREFIX + "QUERY_KEYRING";
+ public static final String ACTION_IMPORT_KEYBASE_KEYS = Constants.INTENT_PREFIX + "DOWNLOAD_KEYBASE";
public static final String ACTION_CERTIFY_KEYRING = Constants.INTENT_PREFIX + "SIGN_KEYRING";
@@ -319,6 +320,7 @@ public class KeychainIntentService extends IntentService
.setEncryptionMasterKeyIds(encryptionKeyIds)
.setSymmetricPassphrase(symmetricPassphrase)
.setSignatureMasterKeyId(signatureKeyId)
+ .setEncryptToSigner(true)
.setSignatureHashAlgorithm(
Preferences.getPreferences(this).getDefaultHashAlgorithm())
.setSignaturePassphrase(
@@ -681,8 +683,7 @@ public class KeychainIntentService extends IntentService
new String[]{KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET},
selection, null, null);
try {
- cursor.moveToFirst();
- do {
+ if (cursor != null && cursor.moveToFirst()) do {
// export public either way
publicMasterKeyIds.add(cursor.getLong(0));
// add secret if available (and requested)
@@ -690,7 +691,9 @@ public class KeychainIntentService extends IntentService
secretMasterKeyIds.add(cursor.getLong(0));
} while (cursor.moveToNext());
} finally {
- cursor.close();
+ if (cursor != null) {
+ cursor.close();
+ }
}
PgpImportExport pgpImportExport = new PgpImportExport(this, this, this);
@@ -729,6 +732,55 @@ public class KeychainIntentService extends IntentService
} catch (Exception e) {
sendErrorToHandler(e);
}
+ } else if (ACTION_IMPORT_KEYBASE_KEYS.equals(action)) {
+ ArrayList<ImportKeysListEntry> entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST);
+
+ try {
+ KeybaseKeyServer server = new KeybaseKeyServer();
+ for (ImportKeysListEntry entry : entries) {
+ // the keybase handle is in userId(1)
+ String keybaseID = entry.getUserIds().get(1);
+ byte[] downloadedKeyBytes = server.get(keybaseID).getBytes();
+
+ // create PGPKeyRing object based on downloaded armored key
+ PGPKeyRing downloadedKey = null;
+ BufferedInputStream bufferedInput =
+ new BufferedInputStream(new ByteArrayInputStream(downloadedKeyBytes));
+ if (bufferedInput.available() > 0) {
+ InputStream in = PGPUtil.getDecoderStream(bufferedInput);
+ PGPObjectFactory objectFactory = new PGPObjectFactory(in);
+
+ // get first object in block
+ Object obj;
+ if ((obj = objectFactory.nextObject()) != null) {
+
+ if (obj instanceof PGPKeyRing) {
+ downloadedKey = (PGPKeyRing) obj;
+ } else {
+ throw new PgpGeneralException("Object not recognized as PGPKeyRing!");
+ }
+ }
+ }
+
+ // save key bytes in entry object for doing the
+ // actual import afterwards
+ entry.setBytes(downloadedKey.getEncoded());
+ }
+
+ Intent importIntent = new Intent(this, KeychainIntentService.class);
+ importIntent.setAction(ACTION_IMPORT_KEYRING);
+ Bundle importData = new Bundle();
+ importData.putParcelableArrayList(IMPORT_KEY_LIST, entries);
+ importIntent.putExtra(EXTRA_DATA, importData);
+ importIntent.putExtra(EXTRA_MESSENGER, mMessenger);
+
+ // now import it with this service
+ onHandleIntent(importIntent);
+
+ // result is handled in ACTION_IMPORT_KEYRING
+ } catch (Exception e) {
+ sendErrorToHandler(e);
+ }
} else if (ACTION_DOWNLOAD_AND_IMPORT_KEYS.equals(action)) {
try {
ArrayList<ImportKeysListEntry> entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST);
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 8f0a3ab8d..d5d02081a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java
@@ -24,7 +24,8 @@ import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
-import android.widget.Toast;
+
+import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;
@@ -99,9 +100,9 @@ public class KeychainIntentServiceHandler extends Handler {
// show error from service
if (data.containsKey(DATA_ERROR)) {
- Toast.makeText(mActivity,
+ AppMsg.makeText(mActivity,
mActivity.getString(R.string.error_message, data.getString(DATA_ERROR)),
- Toast.LENGTH_SHORT).show();
+ AppMsg.STYLE_ALERT).show();
}
break;
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 eb8ef003c..6c74818a5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java
@@ -26,10 +26,11 @@ import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.LoaderManager;
+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.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
@@ -40,7 +41,6 @@ import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
-import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
@@ -64,7 +64,7 @@ import java.util.ArrayList;
*/
public class CertifyKeyActivity extends ActionBarActivity implements
SelectSecretKeyLayoutFragment.SelectSecretKeyCallback, LoaderManager.LoaderCallbacks<Cursor> {
- private BootstrapButton mSignButton;
+ private View mSignButton;
private CheckBox mUploadKeyCheckbox;
private Spinner mSelectKeyserverSpinner;
@@ -86,20 +86,16 @@ public class CertifyKeyActivity extends ActionBarActivity implements
setContentView(R.layout.certify_key_activity);
- final ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayShowTitleEnabled(true);
- actionBar.setDisplayHomeAsUpEnabled(false);
- actionBar.setHomeButtonEnabled(false);
-
mSelectKeyFragment = (SelectSecretKeyLayoutFragment) getSupportFragmentManager()
.findFragmentById(R.id.sign_key_select_key_fragment);
mSelectKeyFragment.setCallback(this);
mSelectKeyFragment.setFilterCertify(true);
- mSelectKeyserverSpinner = (Spinner) findViewById(R.id.sign_key_keyserver);
+ mSelectKeyserverSpinner = (Spinner) findViewById(R.id.upload_key_keyserver);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, Preferences.getPreferences(this)
- .getKeyServers());
+ .getKeyServers()
+ );
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSelectKeyserverSpinner.setAdapter(adapter);
@@ -122,14 +118,14 @@ public class CertifyKeyActivity extends ActionBarActivity implements
}
});
- mSignButton = (BootstrapButton) findViewById(R.id.sign_key_sign_button);
+ mSignButton = findViewById(R.id.sign_key_sign_button);
mSignButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mPubKeyId != 0) {
if (mMasterKeyId == 0) {
- mSelectKeyFragment.setError(getString(R.string.select_key_to_sign));
+ mSelectKeyFragment.setError(getString(R.string.select_key_to_certify));
} else {
initiateSigning();
}
@@ -145,7 +141,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
}
Log.e(Constants.TAG, "uri: " + mDataUri);
- mUserIds = (ListView) findViewById(R.id.user_ids);
+ mUserIds = (ListView) findViewById(R.id.view_key_user_ids);
mUserIdsAdapter = new ViewKeyUserIdsAdapter(this, null, 0, true);
mUserIds.setAdapter(mUserIdsAdapter);
@@ -201,7 +197,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
byte[] fingerprintBlob = data.getBlob(INDEX_FINGERPRINT);
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
- ((TextView) findViewById(R.id.fingerprint))
+ ((TextView) findViewById(R.id.view_key_fingerprint))
.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
}
break;
@@ -318,7 +314,7 @@ public class CertifyKeyActivity extends ActionBarActivity implements
// fill values for this action
Bundle data = new Bundle();
- Spinner keyServer = (Spinner) findViewById(R.id.sign_key_keyserver);
+ Spinner keyServer = (Spinner) findViewById(R.id.upload_key_keyserver);
String server = (String) keyServer.getSelectedItem();
data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, server);
@@ -359,4 +355,17 @@ public class CertifyKeyActivity extends ActionBarActivity implements
public void onKeySelected(long secretKeyId) {
mMasterKeyId = secretKeyId;
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ Intent viewIntent = NavUtils.getParentActivityIntent(this);
+ viewIntent.setData(KeyRings.buildGenericKeyRingUri(mDataUri));
+ NavUtils.navigateUpTo(this, viewIntent);
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
index 1877a43b5..5b21be6e4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
@@ -27,7 +27,6 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.pgp.PgpHelper;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
@@ -68,9 +67,6 @@ public class DecryptActivity extends DrawerActivity {
setContentView(R.layout.decrypt_activity);
- // set actionbar without home button if called from another app
- ActionBarHelper.setBackButton(this);
-
initView();
setupDrawerNavigation(savedInstanceState);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java
index 0f88ee753..d953e2591 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java
@@ -54,7 +54,7 @@ public class DecryptFileFragment extends DecryptFragment {
private EditText mFilename;
private CheckBox mDeleteAfter;
private BootstrapButton mBrowse;
- private BootstrapButton mDecryptButton;
+ private View mDecryptButton;
private String mInputFilename = null;
private String mOutputFilename = null;
@@ -71,7 +71,7 @@ public class DecryptFileFragment extends DecryptFragment {
mFilename = (EditText) view.findViewById(R.id.decrypt_file_filename);
mBrowse = (BootstrapButton) view.findViewById(R.id.decrypt_file_browse);
mDeleteAfter = (CheckBox) view.findViewById(R.id.decrypt_file_delete_after_decryption);
- mDecryptButton = (BootstrapButton) view.findViewById(R.id.decrypt_file_action_decrypt);
+ mDecryptButton = view.findViewById(R.id.decrypt_file_action_decrypt);
mBrowse.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FileHelper.openFile(DecryptFileFragment.this, mFilename.getText().toString(), "*/*",
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 6bb2209ea..955f8324e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
@@ -192,7 +192,7 @@ public class DecryptFragment extends Fragment {
mLookupKey.setVisibility(View.GONE);
// successful decryption-only
- mResultLayout.setBackgroundColor(getResources().getColor(R.color.result_blue));
+ mResultLayout.setBackgroundColor(getResources().getColor(R.color.result_purple));
mResultText.setText(R.string.decrypt_result_decrypted);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java
index 454ee4415..daa48b526 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java
@@ -47,8 +47,8 @@ public class DecryptMessageFragment extends DecryptFragment {
// view
private EditText mMessage;
- private BootstrapButton mDecryptButton;
- private BootstrapButton mDecryptFromCLipboardButton;
+ private View mDecryptButton;
+ private View mDecryptFromCLipboardButton;
// model
private String mCiphertext;
@@ -61,8 +61,8 @@ public class DecryptMessageFragment extends DecryptFragment {
View view = inflater.inflate(R.layout.decrypt_message_fragment, container, false);
mMessage = (EditText) view.findViewById(R.id.message);
- mDecryptButton = (BootstrapButton) view.findViewById(R.id.action_decrypt);
- mDecryptFromCLipboardButton = (BootstrapButton) view.findViewById(R.id.action_decrypt_from_clipboard);
+ mDecryptButton = view.findViewById(R.id.action_decrypt);
+ mDecryptFromCLipboardButton = view.findViewById(R.id.action_decrypt_from_clipboard);
mDecryptButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@@ -108,11 +108,11 @@ public class DecryptMessageFragment extends DecryptFragment {
mCiphertext = matcher.group(1);
decryptStart(null);
} else {
- AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_INFO)
+ AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT)
.show();
}
} else {
- AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_INFO)
+ AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT)
.show();
}
}
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 529ea62a3..fdcb98976 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java
@@ -60,6 +60,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
+import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.widget.Editor;
@@ -502,7 +503,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
int curID = 0;
for (String userID : userIDs) {
if (userID.equals("") && (!userID.equals(originalIDs.get(curID)) || newIDs.get(curID))) {
- AlertDialog.Builder alert = new AlertDialog.Builder(
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(
EditKeyActivity.this);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
@@ -525,7 +526,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
}
);
alert.setCancelable(false);
- alert.create().show();
+ alert.show();
return;
}
curID++;
@@ -614,7 +615,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
private void cancelClicked() {
if (needsSaving()) { //ask if we want to save
- AlertDialog.Builder alert = new AlertDialog.Builder(
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(
EditKeyActivity.this);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
@@ -637,7 +638,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
}
});
alert.setCancelable(false);
- alert.create().show();
+ alert.show();
} else {
setResult(RESULT_CANCELED);
finish();
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 6c71c641f..39d4a09bc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
@@ -27,7 +27,6 @@ import android.widget.Toast;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.helper.FileHelper;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.util.Log;
@@ -145,26 +144,28 @@ public class EncryptActivity extends DrawerActivity implements
setContentView(R.layout.encrypt_activity);
- // set actionbar without home button if called from another app
- ActionBarHelper.setBackButton(this);
-
initView();
- setupDrawerNavigation(savedInstanceState);
+ // if called with an intent action, do not init drawer navigation
+ if (ACTION_ENCRYPT.equals(getIntent().getAction())) {
+ // TODO: back button to key?
+ } else {
+ setupDrawerNavigation(savedInstanceState);
+ }
// Handle intent actions
handleActions(getIntent());
mTabsAdapterMode.addTab(EncryptAsymmetricFragment.class,
- mAsymmetricFragmentBundle, getString(R.string.label_asymmetric));
+ mAsymmetricFragmentBundle, getString(R.string.label_asymmetric));
mTabsAdapterMode.addTab(EncryptSymmetricFragment.class,
- mSymmetricFragmentBundle, getString(R.string.label_symmetric));
+ mSymmetricFragmentBundle, getString(R.string.label_symmetric));
mViewPagerMode.setCurrentItem(mSwitchToMode);
mTabsAdapterContent.addTab(EncryptMessageFragment.class,
- mMessageFragmentBundle, getString(R.string.label_message));
+ mMessageFragmentBundle, getString(R.string.label_message));
mTabsAdapterContent.addTab(EncryptFileFragment.class,
- mFileFragmentBundle, getString(R.string.label_file));
+ mFileFragmentBundle, getString(R.string.label_file));
mViewPagerContent.setCurrentItem(mSwitchToContent);
}
@@ -217,9 +218,9 @@ public class EncryptActivity extends DrawerActivity implements
// preselect keys given by intent
mAsymmetricFragmentBundle.putLongArray(EncryptAsymmetricFragment.ARG_ENCRYPTION_KEY_IDS,
- encryptionKeyIds);
+ encryptionKeyIds);
mAsymmetricFragmentBundle.putLong(EncryptAsymmetricFragment.ARG_SIGNATURE_KEY_ID,
- signatureKeyId);
+ signatureKeyId);
mSwitchToMode = PAGER_MODE_ASYMMETRIC;
/**
@@ -241,9 +242,10 @@ public class EncryptActivity extends DrawerActivity implements
} else {
Log.e(Constants.TAG,
"Direct binary data without actual file in filesystem is not supported " +
- "by Intents. Please use the Remote Service API!");
- Toast.makeText(this, R.string.error_only_files_are_supported, Toast.LENGTH_LONG)
- .show();
+ "by Intents. Please use the Remote Service API!"
+ );
+ Toast.makeText(this, R.string.error_only_files_are_supported,
+ Toast.LENGTH_LONG).show();
// end activity
finish();
}
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 0b6449cda..2b0c94f22 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java
@@ -220,9 +220,6 @@ public class EncryptAsymmetricFragment extends Fragment {
private void selectPublicKeys() {
Intent intent = new Intent(getActivity(), SelectPublicKeyActivity.class);
Vector<Long> keyIds = new Vector<Long>();
- if (mSecretKeyId != 0) {
- keyIds.add(mSecretKeyId);
- }
if (mEncryptionKeyIds != null && mEncryptionKeyIds.length > 0) {
for (int i = 0; i < mEncryptionKeyIds.length; ++i) {
keyIds.add(mEncryptionKeyIds[i]);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java
index b8ac59dac..d150abdeb 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java
@@ -67,7 +67,7 @@ public class EncryptFileFragment extends Fragment {
private CheckBox mDeleteAfter = null;
private CheckBox mShareAfter = null;
private BootstrapButton mBrowse = null;
- private BootstrapButton mEncryptFile;
+ private View mEncryptFile;
private FileDialogFragment mFileDialog;
@@ -92,7 +92,7 @@ public class EncryptFileFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.encrypt_file_fragment, container, false);
- mEncryptFile = (BootstrapButton) view.findViewById(R.id.action_encrypt_file);
+ mEncryptFile = view.findViewById(R.id.action_encrypt_file);
mEncryptFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java
index 0a1a3474a..4c35806e5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java
@@ -28,9 +28,8 @@ import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.EditText;
+import android.widget.TextView;
-import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
@@ -46,9 +45,9 @@ import org.sufficientlysecure.keychain.util.Log;
public class EncryptMessageFragment extends Fragment {
public static final String ARG_TEXT = "text";
- private EditText mMessage = null;
- private BootstrapButton mEncryptShare;
- private BootstrapButton mEncryptClipboard;
+ private TextView mMessage = null;
+ private View mEncryptShare;
+ private View mEncryptClipboard;
private EncryptActivityInterface mEncryptInterface;
@@ -70,9 +69,9 @@ public class EncryptMessageFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.encrypt_message_fragment, container, false);
- mMessage = (EditText) view.findViewById(R.id.message);
- mEncryptClipboard = (BootstrapButton) view.findViewById(R.id.action_encrypt_clipboard);
- mEncryptShare = (BootstrapButton) view.findViewById(R.id.action_encrypt_share);
+ mMessage = (TextView) view.findViewById(R.id.message);
+ mEncryptClipboard = view.findViewById(R.id.action_encrypt_clipboard);
+ mEncryptShare = view.findViewById(R.id.action_encrypt_share);
mEncryptClipboard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java
index ec9f3a759..5909970af 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpAboutFragment.java
@@ -45,7 +45,7 @@ public class HelpAboutFragment extends Fragment {
HtmlTextView aboutTextView = (HtmlTextView) view.findViewById(R.id.help_about_text);
// load html from raw resource (Parsing handled by HtmlTextView library)
- aboutTextView.setHtmlFromRawResource(getActivity(), R.raw.help_about);
+ aboutTextView.setHtmlFromRawResource(getActivity(), R.raw.help_about, true);
// no flickering when clicking textview for Android < 4
aboutTextView.setTextColor(getResources().getColor(android.R.color.black));
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 e81bc1563..cf7446a58 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpActivity.java
@@ -24,7 +24,9 @@ import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter;
+import org.sufficientlysecure.keychain.util.SlidingTabLayout;
public class HelpActivity extends ActionBarActivity {
public static final String EXTRA_SELECTED_TAB = "selected_tab";
@@ -37,25 +39,27 @@ public class HelpActivity extends ActionBarActivity {
public static final int TAB_ABOUT = 5;
ViewPager mViewPager;
- TabsAdapter mTabsAdapter;
+ private PagerTabStripAdapter mTabsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.help_activity);
-
- mViewPager = (ViewPager) findViewById(R.id.pager);
-
final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setHomeButtonEnabled(false);
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- mTabsAdapter = new TabsAdapter(this, mViewPager);
+ setContentView(R.layout.help_activity);
+
+ mViewPager = (ViewPager) findViewById(R.id.pager);
+ SlidingTabLayout slidingTabLayout =
+ (SlidingTabLayout) findViewById(R.id.sliding_tab_layout);
+
+ mTabsAdapter = new PagerTabStripAdapter(this);
+ mViewPager.setAdapter(mTabsAdapter);
- int selectedTab = 0;
+ int selectedTab = TAB_START;
Intent intent = getIntent();
if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) {
selectedTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
@@ -63,30 +67,36 @@ public class HelpActivity extends ActionBarActivity {
Bundle startBundle = new Bundle();
startBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_start);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_start)),
- HelpHtmlFragment.class, startBundle, (selectedTab == TAB_START));
+ mTabsAdapter.addTab(HelpHtmlFragment.class, startBundle,
+ getString(R.string.help_tab_start));
Bundle faqBundle = new Bundle();
faqBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_faq);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_faq)),
- HelpHtmlFragment.class, faqBundle, (selectedTab == TAB_FAQ));
+ mTabsAdapter.addTab(HelpHtmlFragment.class, faqBundle,
+ getString(R.string.help_tab_faq));
Bundle wotBundle = new Bundle();
wotBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_wot);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_wot)),
- HelpHtmlFragment.class, wotBundle, (selectedTab == TAB_WOT));
+ mTabsAdapter.addTab(HelpHtmlFragment.class, wotBundle,
+ getString(R.string.help_tab_wot));
Bundle nfcBundle = new Bundle();
nfcBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_nfc_beam);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_nfc_beam)),
- HelpHtmlFragment.class, nfcBundle, (selectedTab == TAB_NFC));
+ mTabsAdapter.addTab(HelpHtmlFragment.class, nfcBundle,
+ getString(R.string.help_tab_nfc_beam));
Bundle changelogBundle = new Bundle();
changelogBundle.putInt(HelpHtmlFragment.ARG_HTML_FILE, R.raw.help_changelog);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_changelog)),
- HelpHtmlFragment.class, changelogBundle, (selectedTab == TAB_CHANGELOG));
+ mTabsAdapter.addTab(HelpHtmlFragment.class, changelogBundle,
+ getString(R.string.help_tab_changelog));
+
+ mTabsAdapter.addTab(HelpAboutFragment.class, null,
+ getString(R.string.help_tab_about));
+
+ // NOTE: must be after adding the tabs!
+ slidingTabLayout.setViewPager(mViewPager);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.help_tab_about)),
- HelpAboutFragment.class, null, (selectedTab == TAB_ABOUT));
+ // switch to tab selected by extra
+ mViewPager.setCurrentItem(selectedTab);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java
index 98c84e5e3..a3f0ef614 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpHtmlFragment.java
@@ -66,7 +66,7 @@ public class HelpHtmlFragment extends Fragment {
scroller.addView(text);
// load html from raw resource (Parsing handled by HtmlTextView library)
- text.setHtmlFromRawResource(getActivity(), mHtmlFile);
+ text.setHtmlFromRawResource(getActivity(), mHtmlFile, true);
// no flickering when clicking textview for Android < 4
text.setTextColor(getResources().getColor(android.R.color.black));
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 0fccd668f..35076287b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -38,16 +38,14 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
-import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.ui.dialog.BadImportKeyDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
@@ -62,6 +60,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
+ "IMPORT_KEY_FROM_KEYSERVER";
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN = Constants.INTENT_PREFIX
+ "IMPORT_KEY_FROM_KEY_SERVER_AND_RETURN";
+ public static final String ACTION_IMPORT_KEY_FROM_KEYBASE = Constants.INTENT_PREFIX
+ + "IMPORT_KEY_FROM_KEYBASE";
// Actions for internal use only:
public static final String ACTION_IMPORT_KEY_FROM_FILE = Constants.INTENT_PREFIX
@@ -85,20 +85,22 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
private ImportKeysListFragment mListFragment;
private String[] mNavigationStrings;
private Fragment mCurrentFragment;
- private BootstrapButton mImportButton;
+ private View mImportButton;
private static final Class[] NAVIGATION_CLASSES = new Class[]{
ImportKeysServerFragment.class,
ImportKeysFileFragment.class,
ImportKeysQrCodeFragment.class,
ImportKeysClipboardFragment.class,
- ImportKeysNFCFragment.class
+ ImportKeysNFCFragment.class,
+ ImportKeysKeybaseFragment.class
};
private static final int NAV_SERVER = 0;
private static final int NAV_FILE = 1;
private static final int NAV_QR_CODE = 2;
private static final int NAV_CLIPBOARD = 3;
private static final int NAV_NFC = 4;
+ private static final int NAV_KEYBASE = 5;
private int mCurrentNavPosition = -1;
@@ -108,7 +110,7 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
setContentView(R.layout.import_keys_activity);
- mImportButton = (BootstrapButton) findViewById(R.id.import_import);
+ mImportButton = findViewById(R.id.import_import);
mImportButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@@ -121,7 +123,6 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) {
setTitle(R.string.nav_import);
} else {
- ActionBarHelper.setBackButton(this);
getSupportActionBar().setDisplayShowTitleEnabled(false);
// set drop down navigation
@@ -238,6 +239,12 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
// no immediate actions!
startListFragment(savedInstanceState, null, null, null);
+ } else if (ACTION_IMPORT_KEY_FROM_KEYBASE.equals(action)) {
+ // NOTE: this only displays the appropriate fragment, no actions are taken
+ loadNavFragment(NAV_KEYBASE, null);
+
+ // no immediate actions!
+ startListFragment(savedInstanceState, null, null, null);
} else {
startListFragment(savedInstanceState, null, null, null);
}
@@ -340,8 +347,8 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
startListFragment(savedInstanceState, null, null, query);
}
- public void loadCallback(byte[] importData, Uri dataUri, String serverQuery, String keyServer) {
- mListFragment.loadNew(importData, dataUri, serverQuery, keyServer);
+ public void loadCallback(byte[] importData, Uri dataUri, String serverQuery, String keyServer, String keybaseQuery) {
+ mListFragment.loadNew(importData, dataUri, serverQuery, keyServer, keybaseQuery);
}
/**
@@ -449,6 +456,31 @@ public class ImportKeysActivity extends ActionBarActivity implements ActionBar.O
// start service with intent
startService(intent);
+ } else if (mListFragment.getKeybaseQuery() != null) {
+ // Send all information needed to service to query keys in other thread
+ Intent intent = new Intent(this, KeychainIntentService.class);
+
+ intent.setAction(KeychainIntentService.ACTION_IMPORT_KEYBASE_KEYS);
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ // get selected key entries
+ ArrayList<ImportKeysListEntry> selectedEntries = mListFragment.getSelectedData();
+ data.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, selectedEntries);
+
+ 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);
+
} else {
AppMsg.makeText(this, R.string.error_nothing_import, AppMsg.STYLE_ALERT).show();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
index 412fbddd8..f331358fa 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysClipboardFragment.java
@@ -71,7 +71,7 @@ public class ImportKeysClipboardFragment extends Fragment {
return;
}
}
- mImportActivity.loadCallback(sendText.getBytes(), null, null, null);
+ mImportActivity.loadCallback(sendText.getBytes(), null, null, null, null);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
index dc5333a8f..51f961aab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysFileFragment.java
@@ -85,7 +85,7 @@ public class ImportKeysFileFragment extends Fragment {
if (resultCode == Activity.RESULT_OK && data != null) {
// load data
- mImportActivity.loadCallback(null, data.getData(), null, null);
+ mImportActivity.loadCallback(null, data.getData(), null, null, null);
}
break;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
new file mode 100644
index 000000000..a996079c9
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysKeybaseFragment.java
@@ -0,0 +1,120 @@
+/*
+ * 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.content.Context;
+import android.support.v4.app.Fragment;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.beardedhen.androidbootstrap.BootstrapButton;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.util.Log;
+
+/**
+ * Import public keys from the Keybase.io directory. First cut: just raw search.
+ * TODO: make a pick list of the people you’re following on keybase
+ */
+public class ImportKeysKeybaseFragment extends Fragment {
+
+ private ImportKeysActivity mImportActivity;
+ private BootstrapButton mSearchButton;
+ private EditText mQueryEditText;
+
+ public static final String ARG_QUERY = "query";
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static ImportKeysKeybaseFragment newInstance() {
+ ImportKeysKeybaseFragment frag = new ImportKeysKeybaseFragment();
+
+ Bundle args = new Bundle();
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ /**
+ * Inflate the layout for this fragment
+ */
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.import_keys_keybase_fragment, container, false);
+
+ mQueryEditText = (EditText) view.findViewById(R.id.import_keybase_query);
+
+ mSearchButton = (BootstrapButton) view.findViewById(R.id.import_keybase_search);
+ mSearchButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String query = mQueryEditText.getText().toString();
+ search(query);
+
+ // close keyboard after pressing search
+ InputMethodManager imm =
+ (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(mQueryEditText.getWindowToken(), 0);
+ }
+ });
+
+ mQueryEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ String query = mQueryEditText.getText().toString();
+ search(query);
+
+ // Don't return true to let the keyboard close itself after pressing search
+ return false;
+ }
+ return false;
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mImportActivity = (ImportKeysActivity) getActivity();
+
+ // set displayed values
+ if (getArguments() != null) {
+ if (getArguments().containsKey(ARG_QUERY)) {
+ String query = getArguments().getString(ARG_QUERY);
+ mQueryEditText.setText(query, TextView.BufferType.EDITABLE);
+ }
+ }
+ }
+
+ private void search(String query) {
+ mImportActivity.loadCallback(null, null, null, null, query);
+ }
+}
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 3a6c384e8..bf6abcd6f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -33,11 +33,12 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.Preferences;
import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter;
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListKeybaseLoader;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader;
import org.sufficientlysecure.keychain.util.InputData;
-import org.sufficientlysecure.keychain.util.KeyServer;
+import org.sufficientlysecure.keychain.keyimport.KeyServer;
import org.sufficientlysecure.keychain.util.Log;
import java.io.ByteArrayInputStream;
@@ -60,9 +61,11 @@ public class ImportKeysListFragment extends ListFragment implements
private Uri mDataUri;
private String mServerQuery;
private String mKeyServer;
+ private String mKeybaseQuery;
private static final int LOADER_ID_BYTES = 0;
private static final int LOADER_ID_SERVER_QUERY = 1;
+ private static final int LOADER_ID_KEYBASE = 2;
public byte[] getKeyBytes() {
return mKeyBytes;
@@ -76,6 +79,10 @@ public class ImportKeysListFragment extends ListFragment implements
return mServerQuery;
}
+ public String getKeybaseQuery() {
+ return mKeybaseQuery;
+ }
+
public String getKeyServer() {
return mKeyServer;
}
@@ -148,6 +155,16 @@ public class ImportKeysListFragment extends ListFragment implements
// give arguments to onCreateLoader()
getLoaderManager().initLoader(LOADER_ID_SERVER_QUERY, null, this);
}
+
+ if (mKeybaseQuery != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ // Prepare the loader. Either re-connect with an existing one,
+ // or start a new one.
+ // give arguments to onCreateLoader()
+ getLoaderManager().initLoader(LOADER_ID_KEYBASE, null, this);
+ }
}
@Override
@@ -157,16 +174,18 @@ public class ImportKeysListFragment extends ListFragment implements
// Select checkbox!
// Update underlying data and notify adapter of change. The adapter will
// update the view automatically.
+
ImportKeysListEntry entry = mAdapter.getItem(position);
entry.setSelected(!entry.isSelected());
mAdapter.notifyDataSetChanged();
}
- public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer) {
+ public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer, String keybaseQuery) {
mKeyBytes = keyBytes;
mDataUri = dataUri;
mServerQuery = serverQuery;
mKeyServer = keyServer;
+ mKeybaseQuery = keybaseQuery;
if (mKeyBytes != null || mDataUri != null) {
// Start out with a progress indicator.
@@ -181,6 +200,13 @@ public class ImportKeysListFragment extends ListFragment implements
getLoaderManager().restartLoader(LOADER_ID_SERVER_QUERY, null, this);
}
+
+ if (mKeybaseQuery != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ getLoaderManager().restartLoader(LOADER_ID_KEYBASE, null, this);
+ }
}
@Override
@@ -194,6 +220,9 @@ public class ImportKeysListFragment extends ListFragment implements
case LOADER_ID_SERVER_QUERY: {
return new ImportKeysListServerLoader(getActivity(), mServerQuery, mKeyServer);
}
+ case LOADER_ID_KEYBASE: {
+ return new ImportKeysListKeybaseLoader(getActivity(), mKeybaseQuery);
+ }
default:
return null;
@@ -248,7 +277,7 @@ public class ImportKeysListFragment extends ListFragment implements
if (error == null) {
AppMsg.makeText(
getActivity(), getResources().getQuantityString(R.plurals.keys_found,
- mAdapter.getCount(), mAdapter.getCount()),
+ mAdapter.getCount(), mAdapter.getCount()),
AppMsg.STYLE_INFO
).show();
} else if (error instanceof KeyServer.InsufficientQuery) {
@@ -263,6 +292,19 @@ public class ImportKeysListFragment extends ListFragment implements
}
break;
+ case LOADER_ID_KEYBASE:
+
+ if (error == null) {
+ AppMsg.makeText(
+ getActivity(), getResources().getQuantityString(R.plurals.keys_found,
+ mAdapter.getCount(), mAdapter.getCount()),
+ AppMsg.STYLE_INFO
+ ).show();
+ } else if (error instanceof KeyServer.QueryException) {
+ AppMsg.makeText(getActivity(), R.string.error_keyserver_query,
+ AppMsg.STYLE_ALERT).show();
+ }
+
default:
break;
}
@@ -279,6 +321,10 @@ public class ImportKeysListFragment extends ListFragment implements
// Clear the data in the adapter.
mAdapter.clear();
break;
+ case LOADER_ID_KEYBASE:
+ // Clear the data in the adapter.
+ mAdapter.clear();
+ break;
default:
break;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
index 65d463456..22b56e1ab 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysQrCodeFragment.java
@@ -117,7 +117,7 @@ public class ImportKeysQrCodeFragment extends Fragment {
// is this a full key encoded as qr code?
if (scannedContent.startsWith("-----BEGIN PGP")) {
- mImportActivity.loadCallback(scannedContent.getBytes(), null, null, null);
+ mImportActivity.loadCallback(scannedContent.getBytes(), null, null, null, null);
return;
}
@@ -197,7 +197,7 @@ public class ImportKeysQrCodeFragment extends Fragment {
for (String in : mScannedContent) {
result += in;
}
- mImportActivity.loadCallback(result.getBytes(), null, null, null);
+ mImportActivity.loadCallback(result.getBytes(), null, null, null, null);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
index 82fe2fc4c..9e3d88ff5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysServerFragment.java
@@ -151,7 +151,7 @@ public class ImportKeysServerFragment extends Fragment {
}
private void search(String query, String keyServer) {
- mImportActivity.loadCallback(null, null, query, keyServer);
+ mImportActivity.loadCallback(null, null, query, keyServer, null);
}
}
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 82f65a962..3fd958bcc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -29,7 +29,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -45,11 +44,10 @@ import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
-import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@@ -77,18 +75,13 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
* Public key list with sticky list headers. It does _not_ extend ListFragment because it uses
* StickyListHeaders library which does not extend upon ListView.
*/
-public class KeyListFragment extends Fragment
+public class KeyListFragment extends LoaderFragment
implements SearchView.OnQueryTextListener, AdapterView.OnItemClickListener,
LoaderManager.LoaderCallbacks<Cursor> {
private KeyListAdapter mAdapter;
private StickyListHeadersListView mStickyList;
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- boolean mListShown;
- View mProgressContainer;
- View mListContainer;
-
private String mCurQuery;
private SearchView mSearchView;
// empty list layout
@@ -100,14 +93,15 @@ public class KeyListFragment extends Fragment
* Load custom layout with StickyListView from library
*/
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View root = inflater.inflate(R.layout.key_list_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.key_list_fragment, getContainer());
- mStickyList = (StickyListHeadersListView) root.findViewById(R.id.key_list_list);
+ mStickyList = (StickyListHeadersListView) view.findViewById(R.id.key_list_list);
mStickyList.setOnItemClickListener(this);
// empty view
- mButtonEmptyCreate = (BootstrapButton) root.findViewById(R.id.key_list_empty_button_create);
+ mButtonEmptyCreate = (BootstrapButton) view.findViewById(R.id.key_list_empty_button_create);
mButtonEmptyCreate.setOnClickListener(new OnClickListener() {
@Override
@@ -119,7 +113,7 @@ public class KeyListFragment extends Fragment
startActivityForResult(intent, 0);
}
});
- mButtonEmptyImport = (BootstrapButton) root.findViewById(R.id.key_list_empty_button_import);
+ mButtonEmptyImport = (BootstrapButton) view.findViewById(R.id.key_list_empty_button_import);
mButtonEmptyImport.setOnClickListener(new OnClickListener() {
@Override
@@ -130,11 +124,6 @@ public class KeyListFragment extends Fragment
}
});
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- mListContainer = root.findViewById(R.id.key_list_list_container);
- mProgressContainer = root.findViewById(R.id.key_list_progress_container);
- mListShown = true;
-
return root;
}
@@ -233,9 +222,8 @@ public class KeyListFragment extends Fragment
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
- // NOTE: Not supported by StickyListHeader, but reimplemented here
// Start out with a progress indicator.
- setListShown(false);
+ setContentShown(false);
// Create an empty adapter we will use to display the loaded data.
mAdapter = new KeyListAdapter(getActivity(), null, 0);
@@ -297,12 +285,11 @@ public class KeyListFragment extends Fragment
// this view is made visible if no data is available
mStickyList.setEmptyView(getActivity().findViewById(R.id.key_list_empty));
- // NOTE: Not supported by StickyListHeader, but reimplemented here
// The list should now be shown.
if (isResumed()) {
- setListShown(true);
+ setContentShown(true);
} else {
- setListShownNoAnimation(true);
+ setContentShownNoAnimation(true);
}
}
@@ -380,6 +367,9 @@ public class KeyListFragment extends Fragment
// 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);
+
// Erase search result without focus
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
@@ -414,43 +404,6 @@ public class KeyListFragment extends Fragment
return true;
}
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- public void setListShown(boolean shown, boolean animate) {
- if (mListShown == shown) {
- return;
- }
- mListShown = shown;
- if (shown) {
- if (animate) {
- mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_out));
- mListContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_in));
- }
- mProgressContainer.setVisibility(View.GONE);
- mListContainer.setVisibility(View.VISIBLE);
- } else {
- if (animate) {
- mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_in));
- mListContainer.startAnimation(AnimationUtils.loadAnimation(
- getActivity(), android.R.anim.fade_out));
- }
- mProgressContainer.setVisibility(View.VISIBLE);
- mListContainer.setVisibility(View.INVISIBLE);
- }
- }
-
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- public void setListShown(boolean shown) {
- setListShown(shown, true);
- }
-
- // rebuild functionality of ListFragment, http://stackoverflow.com/a/12504097
- public void setListShownNoAnimation(boolean shown) {
- setListShown(shown, false);
- }
-
/**
* Implements StickyListHeadersAdapter from library
*/
@@ -475,7 +428,7 @@ public class KeyListFragment extends Fragment
TextView mMainUserIdRest;
View mStatusDivider;
FrameLayout mStatusLayout;
- Button mButton;
+ ImageButton mButton;
TextView mRevoked;
ImageView mVerified;
}
@@ -488,7 +441,7 @@ public class KeyListFragment extends Fragment
holder.mMainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
holder.mStatusDivider = (View) view.findViewById(R.id.status_divider);
holder.mStatusLayout = (FrameLayout) view.findViewById(R.id.status_layout);
- holder.mButton = (Button) view.findViewById(R.id.edit);
+ holder.mButton = (ImageButton) view.findViewById(R.id.edit);
holder.mRevoked = (TextView) view.findViewById(R.id.revoked);
holder.mVerified = (ImageView) view.findViewById(R.id.verified);
view.setTag(holder);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java
new file mode 100644
index 000000000..87ab1bb8c
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LoaderFragment.java
@@ -0,0 +1,78 @@
+package org.sufficientlysecure.keychain.ui;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
+
+import org.sufficientlysecure.keychain.R;
+
+/** This is a fragment helper class, which implements a generic
+ * progressbar/container view.
+ *
+ * To use it in a fragment, simply subclass, use onCreateView to create the
+ * layout's root view, and ues getContainer() as root view of your subclass.
+ * The layout shows a progress bar by default, and can be switched to the
+ * actual contents by calling setContentShown().
+ *
+ */
+public class LoaderFragment extends Fragment {
+ private boolean mContentShown;
+ private View mProgressContainer;
+ private ViewGroup mContainer;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View root = inflater.inflate(R.layout.loader_layout, container, false);
+
+ mContentShown = true;
+ mContainer = (ViewGroup) root.findViewById(R.id.loader_container);
+ mProgressContainer = root.findViewById(R.id.loader_progress);
+
+ // content is not shown (by visibility statuses in the layout files)
+ mContentShown = false;
+
+ return root;
+
+ }
+
+ protected ViewGroup getContainer() {
+ return mContainer;
+ }
+
+ public void setContentShown(boolean shown, boolean animate) {
+ if (mContentShown == shown) {
+ return;
+ }
+ mContentShown = shown;
+ if (shown) {
+ if (animate) {
+ mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_out));
+ mContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_in));
+ }
+ mProgressContainer.setVisibility(View.GONE);
+ mContainer.setVisibility(View.VISIBLE);
+ } else {
+ if (animate) {
+ mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_in));
+ mContainer.startAnimation(AnimationUtils.loadAnimation(
+ getActivity(), android.R.anim.fade_out));
+ }
+ mProgressContainer.setVisibility(View.VISIBLE);
+ mContainer.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ public void setContentShown(boolean shown) {
+ setContentShown(shown, true);
+ }
+
+ public void setContentShownNoAnimation(boolean shown) {
+ setContentShown(shown, false);
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java
index 6de03198e..38a0c8478 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java
@@ -56,7 +56,7 @@ public class SelectSecretKeyFragment extends ListFragment implements
Bundle args = new Bundle();
args.putBoolean(ARG_FILTER_CERTIFY, filterCertify);
- args.putBoolean(ARG_FILTER_CERTIFY, filterSign);
+ args.putBoolean(ARG_FILTER_SIGN, filterSign);
frag.setArguments(args);
return frag;
@@ -124,7 +124,8 @@ public class SelectSecretKeyFragment extends ListFragment implements
KeyRings.CAN_CERTIFY,
// has sign may be any subkey
KeyRings.HAS_SIGN,
- KeyRings.HAS_ANY_SECRET
+ KeyRings.HAS_ANY_SECRET,
+ KeyRings.HAS_SECRET
};
String where = KeyRings.HAS_ANY_SECRET + " = 1";
@@ -158,7 +159,7 @@ public class SelectSecretKeyFragment extends ListFragment implements
private class SelectSecretKeyCursorAdapter extends SelectKeyCursorAdapter {
- private int mIndexHasSign, mIndexCanCertify;
+ private int mIndexHasSign, mIndexCanCertify, mIndexHasSecret;
public SelectSecretKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) {
super(context, c, flags, listView);
@@ -170,6 +171,7 @@ public class SelectSecretKeyFragment extends ListFragment implements
if (cursor != null) {
mIndexCanCertify = cursor.getColumnIndexOrThrow(KeyRings.CAN_CERTIFY);
mIndexHasSign = cursor.getColumnIndexOrThrow(KeyRings.HAS_SIGN);
+ mIndexHasSecret = cursor.getColumnIndexOrThrow(KeyRings.HAS_SECRET);
}
}
@@ -187,7 +189,8 @@ public class SelectSecretKeyFragment extends ListFragment implements
// Check if key is viable for our purposes (certify or sign)
if(mFilterCertify) {
// Only enable if can certify
- if (cursor.getInt(mIndexCanCertify) == 0) {
+ if (cursor.getInt(mIndexCanCertify) == 0
+ || cursor.getInt(mIndexHasSecret) == 0) {
h.status.setText(R.string.can_certify_not);
} else {
h.status.setText(R.string.can_certify);
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 97a2af645..dbd1b7507 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -23,15 +23,15 @@ import android.net.Uri;
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;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
-import com.beardedhen.androidbootstrap.BootstrapButton;
-
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.Preferences;
@@ -44,7 +44,7 @@ import org.sufficientlysecure.keychain.util.Log;
* Sends the selected public key to a keyserver
*/
public class UploadKeyActivity extends ActionBarActivity {
- private BootstrapButton mUploadButton;
+ private View mUploadButton;
private Spinner mKeyServerSpinner;
private Uri mDataUri;
@@ -53,10 +53,10 @@ public class UploadKeyActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.key_server_export);
+ setContentView(R.layout.upload_key_activity);
- mUploadButton = (BootstrapButton) findViewById(R.id.btn_export_to_server);
- mKeyServerSpinner = (Spinner) findViewById(R.id.sign_key_keyserver);
+ mUploadButton = findViewById(R.id.upload_key_action_upload);
+ mKeyServerSpinner = (Spinner) findViewById(R.id.upload_key_keyserver);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, Preferences.getPreferences(this)
@@ -129,4 +129,17 @@ public class UploadKeyActivity extends ActionBarActivity {
// start service with intent
startService(intent);
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home: {
+ Intent viewIntent = NavUtils.getParentActivityIntent(this);
+ viewIntent.setData(KeychainContract.KeyRings.buildGenericKeyRingUri(mDataUri));
+ NavUtils.navigateUpTo(this, viewIntent);
+ return true;
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
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 1d2b50faa..cf7fdcd89 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java
@@ -28,7 +28,6 @@ import android.support.v4.content.Loader;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateFormat;
-import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
@@ -73,11 +72,12 @@ public class ViewCertActivity extends ActionBarActivity
private Uri mDataUri;
- private long mSignerKeyId;
+ private long mCertifierKeyId;
- private TextView mSigneeKey, mSigneeUid, mAlgorithm, mType, mRReason, mCreation;
- private TextView mSignerKey, mSignerUid, mStatus;
+ private TextView mSigneeKey, mSigneeUid, mAlgorithm, mType, mReason, mCreation;
+ private TextView mCertifierKey, mCertifierUid, mStatus;
private View mRowReason;
+ private View mViewCertifierButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -93,14 +93,16 @@ public class ViewCertActivity extends ActionBarActivity
mSigneeUid = (TextView) findViewById(R.id.signee_uid);
mAlgorithm = (TextView) findViewById(R.id.algorithm);
mType = (TextView) findViewById(R.id.signature_type);
- mRReason = (TextView) findViewById(R.id.reason);
+ mReason = (TextView) findViewById(R.id.reason);
mCreation = (TextView) findViewById(R.id.creation);
- mSignerKey = (TextView) findViewById(R.id.signer_key_id);
- mSignerUid = (TextView) findViewById(R.id.signer_uid);
+ mCertifierKey = (TextView) findViewById(R.id.signer_key_id);
+ mCertifierUid = (TextView) findViewById(R.id.signer_uid);
mRowReason = findViewById(R.id.row_reason);
+ mViewCertifierButton = findViewById(R.id.view_cert_view_cert_key);
+
mDataUri = getIntent().getData();
if (mDataUri == null) {
Log.e(Constants.TAG, "Intent data missing. Should be Uri of key!");
@@ -121,7 +123,7 @@ public class ViewCertActivity extends ActionBarActivity
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data.moveToFirst()) {
- String signeeKey = "0x" + PgpKeyHelper.convertKeyIdToHex(data.getLong(INDEX_MASTER_KEY_ID));
+ String signeeKey = PgpKeyHelper.convertKeyIdToHex(data.getLong(INDEX_MASTER_KEY_ID));
mSigneeKey.setText(signeeKey);
String signeeUid = data.getString(INDEX_USER_ID);
@@ -130,22 +132,24 @@ public class ViewCertActivity extends ActionBarActivity
Date creationDate = new Date(data.getLong(INDEX_CREATION) * 1000);
mCreation.setText(DateFormat.getDateFormat(getApplicationContext()).format(creationDate));
- mSignerKeyId = data.getLong(INDEX_KEY_ID_CERTIFIER);
- String signerKey = "0x" + PgpKeyHelper.convertKeyIdToHex(mSignerKeyId);
- mSignerKey.setText(signerKey);
+ mCertifierKeyId = data.getLong(INDEX_KEY_ID_CERTIFIER);
+ String certifierKey = PgpKeyHelper.convertKeyIdToHex(mCertifierKeyId);
+ mCertifierKey.setText(certifierKey);
- String signerUid = data.getString(INDEX_SIGNER_UID);
- if (signerUid != null) {
- mSignerUid.setText(signerUid);
+ String certifierUid = data.getString(INDEX_SIGNER_UID);
+ if (certifierUid != null) {
+ mCertifierUid.setText(certifierUid);
} else {
- mSignerUid.setText(R.string.unknown_uid);
+ mCertifierUid.setText(R.string.unknown_uid);
}
PGPSignature sig = PgpConversionHelper.BytesToPGPSignature(data.getBlob(INDEX_DATA));
try {
ProviderHelper providerHelper = new ProviderHelper(this);
+
CachedPublicKeyRing signeeRing = providerHelper.getCachedPublicKeyRing(data.getLong(INDEX_MASTER_KEY_ID));
CachedPublicKeyRing signerRing = providerHelper.getCachedPublicKeyRing(sig.getKeyID());
+
try {
signerRing.getSubkey().initSignature(sig);
if (signeeRing.getSubkey().verifySignature(sig, signeeUid)) {
@@ -191,25 +195,39 @@ public class ViewCertActivity extends ActionBarActivity
p = new RevocationReason(false, p.getData());
}
String reason = ((RevocationReason) p).getRevocationDescription();
- mRReason.setText(reason);
+ mReason.setText(reason);
mRowReason.setVisibility(View.VISIBLE);
}
break;
}
}
}
- }
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
- }
+ // can't do this before the data is initialized
+ mViewCertifierButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent viewIntent = new Intent(ViewCertActivity.this, ViewKeyActivity.class);
+ try {
+ ProviderHelper providerHelper = new ProviderHelper(ViewCertActivity.this);
+ long signerMasterKeyId = providerHelper.getMasterKeyId(
+ KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mCertifierKeyId))
+ );
+ viewIntent.setData(KeyRings.buildGenericKeyRingUri(
+ Long.toString(signerMasterKeyId))
+ );
+ startActivity(viewIntent);
+ } catch (ProviderHelper.NotFoundException e) {
+ // TODO notify user of this, maybe offer download?
+ Log.e(Constants.TAG, "key not found!", e);
+ }
+ }
+ });
+ }
@Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- getMenuInflater().inflate(R.menu.view_cert, menu);
- return true;
+ public void onLoaderReset(Loader<Cursor> loader) {
}
@Override
@@ -221,25 +239,6 @@ public class ViewCertActivity extends ActionBarActivity
NavUtils.navigateUpTo(this, viewIntent);
return true;
}
- case R.id.menu_view_cert_view_signer:
- // can't do this before the data is initialized
- Intent viewIntent = new Intent(this, ViewKeyActivity.class);
-
- try {
- ProviderHelper providerHelper = new ProviderHelper(this);
- long signerMasterKeyId = providerHelper.getMasterKeyId(
- KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mSignerKeyId))
- );
- viewIntent.setData(KeyRings.buildGenericKeyRingUri(
- Long.toString(signerMasterKeyId))
- );
- startActivity(viewIntent);
- } catch (ProviderHelper.NotFoundException e) {
- // TODO notify user of this, maybe offer download?
- Log.e(Constants.TAG, "key not found!", e);
- }
-
- return true;
}
return super.onOptionsItemSelected(item);
}
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 79f409663..bed116f5f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.ui;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
+import android.database.Cursor;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
@@ -31,41 +32,54 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+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.view.Menu;
import android.view.MenuItem;
+import android.view.View;
import android.view.Window;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter;
-import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment;
-import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment;
+import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.SlidingTabLayout;
import java.io.IOException;
+import java.util.Date;
import java.util.HashMap;
-public class ViewKeyActivity extends ActionBarActivity {
+public class ViewKeyActivity extends ActionBarActivity implements
+ LoaderManager.LoaderCallbacks<Cursor> {
ExportHelper mExportHelper;
ProviderHelper mProviderHelper;
protected Uri mDataUri;
- public static final String EXTRA_SELECTED_TAB = "selectedTab";
+ public static final String EXTRA_SELECTED_TAB = "selected_tab";
+ public static final int TAB_MAIN = 0;
+ public static final int TAB_SHARE = 1;
+ public static final int TAB_KEYS = 2;
+ public static final int TAB_CERTS = 3;
- ViewPager mViewPager;
- TabsAdapter mTabsAdapter;
+ // view
+ private ViewPager mViewPager;
+ private SlidingTabLayout mSlidingTabLayout;
+ private PagerTabStripAdapter mTabsAdapter;
+ private View mStatusDivider;
+ private View mStatusRevoked;
+ private View mStatusExpired;
public static final int REQUEST_CODE_LOOKUP_KEY = 0x00007006;
@@ -76,6 +90,9 @@ public class ViewKeyActivity extends ActionBarActivity {
private byte[] mNfcKeyringBytes;
private static final int NFC_SENT = 1;
+ private static final int LOADER_ID_UNIFIED = 0;
+
+
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
@@ -89,33 +106,71 @@ public class ViewKeyActivity extends ActionBarActivity {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setIcon(android.R.color.transparent);
actionBar.setHomeButtonEnabled(true);
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
setContentView(R.layout.view_key_activity);
- mViewPager = (ViewPager) findViewById(R.id.pager);
+ mStatusDivider = findViewById(R.id.status_divider);
+ mStatusRevoked = findViewById(R.id.view_key_revoked);
+ mStatusExpired = findViewById(R.id.view_key_expired);
- mTabsAdapter = new TabsAdapter(this, mViewPager);
+ mViewPager = (ViewPager) findViewById(R.id.view_key_pager);
+ mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.view_key_sliding_tab_layout);
- int selectedTab = 0;
+ mTabsAdapter = new PagerTabStripAdapter(this);
+ mViewPager.setAdapter(mTabsAdapter);
+
+ int switchToTab = TAB_MAIN;
Intent intent = getIntent();
if (intent.getExtras() != null && intent.getExtras().containsKey(EXTRA_SELECTED_TAB)) {
- selectedTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
+ switchToTab = intent.getExtras().getInt(EXTRA_SELECTED_TAB);
+ }
+
+ Uri dataUri = getIntent().getData();
+ if (dataUri == null) {
+ Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
+ finish();
+ return;
}
- mDataUri = getIntent().getData();
+ loadData(dataUri);
- initNfc(mDataUri);
+ initNfc(dataUri);
Bundle mainBundle = new Bundle();
- mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, mDataUri);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.key_view_tab_main)),
- ViewKeyMainFragment.class, mainBundle, (selectedTab == 0));
+ mainBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyMainFragment.class,
+ mainBundle, getString(R.string.key_view_tab_main));
+
+ Bundle shareBundle = new Bundle();
+ shareBundle.putParcelable(ViewKeyMainFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyShareFragment.class,
+ mainBundle, getString(R.string.key_view_tab_share));
+
+ Bundle keyDetailsBundle = new Bundle();
+ keyDetailsBundle.putParcelable(ViewKeyKeysFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyKeysFragment.class,
+ keyDetailsBundle, getString(R.string.key_view_tab_keys));
Bundle certBundle = new Bundle();
- certBundle.putParcelable(ViewKeyCertsFragment.ARG_DATA_URI, mDataUri);
- mTabsAdapter.addTab(actionBar.newTab().setText(getString(R.string.key_view_tab_certs)),
- ViewKeyCertsFragment.class, certBundle, (selectedTab == 1));
+ certBundle.putParcelable(ViewKeyCertsFragment.ARG_DATA_URI, dataUri);
+ mTabsAdapter.addTab(ViewKeyCertsFragment.class,
+ certBundle, getString(R.string.key_view_tab_certs));
+
+ // NOTE: must be after adding the tabs!
+ mSlidingTabLayout.setViewPager(mViewPager);
+
+ // switch to tab selected by extra
+ mViewPager.setCurrentItem(switchToTab);
+ }
+
+ 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.
+ getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
}
@Override
@@ -143,24 +198,6 @@ public class ViewKeyActivity extends ActionBarActivity {
case R.id.menu_key_view_export_file:
exportToFile(mDataUri, mExportHelper, mProviderHelper);
return true;
- case R.id.menu_key_view_share_default_fingerprint:
- shareKey(mDataUri, true, mProviderHelper);
- return true;
- case R.id.menu_key_view_share_default:
- shareKey(mDataUri, false, mProviderHelper);
- return true;
- case R.id.menu_key_view_share_qr_code_fingerprint:
- shareKeyQrCode(mDataUri, true);
- return true;
- case R.id.menu_key_view_share_qr_code:
- shareKeyQrCode(mDataUri, false);
- return true;
- case R.id.menu_key_view_share_nfc:
- shareNfc();
- return true;
- case R.id.menu_key_view_share_clipboard:
- copyToClipboard(mDataUri, mProviderHelper);
- return true;
case R.id.menu_key_view_delete: {
deleteKey(mDataUri, mExportHelper);
return true;
@@ -209,84 +246,6 @@ public class ViewKeyActivity extends ActionBarActivity {
startActivityForResult(queryIntent, REQUEST_CODE_LOOKUP_KEY);
}
- private void shareKey(Uri dataUri, boolean fingerprintOnly, ProviderHelper providerHelper)
- throws ProviderHelper.NotFoundException {
- String content = null;
- if (fingerprintOnly) {
- byte[] data = (byte[]) providerHelper.getGenericData(
- KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri),
- KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
- if (data != null) {
- String fingerprint = PgpKeyHelper.convertFingerprintToHex(data);
- content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
- } else {
- AppMsg.makeText(this, "Bad key selected!",
- AppMsg.STYLE_ALERT).show();
- return;
- }
- } else {
- // get public keyring as ascii armored string
- try {
- Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
- content = providerHelper.getKeyRingAsArmoredString(uri);
-
- // Android will fail with android.os.TransactionTooLargeException if key is too big
- // see http://www.lonestarprod.com/?p=34
- if (content.length() >= 86389) {
- AppMsg.makeText(this, R.string.key_too_big_for_sharing,
- AppMsg.STYLE_ALERT).show();
- return;
- }
- } catch (IOException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- AppMsg.makeText(this, R.string.error_invalid_data, AppMsg.STYLE_ALERT).show();
- } catch (ProviderHelper.NotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
- }
- }
-
- if (content != null) {
- // let user choose application
- Intent sendIntent = new Intent(Intent.ACTION_SEND);
- sendIntent.putExtra(Intent.EXTRA_TEXT, content);
- sendIntent.setType("text/plain");
- startActivity(Intent.createChooser(sendIntent,
- getResources().getText(R.string.action_share_key_with)));
- } else {
- Log.e(Constants.TAG, "content is null!");
- }
- }
-
- private void shareKeyQrCode(Uri dataUri, boolean fingerprintOnly) {
- ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(dataUri,
- fingerprintOnly);
- dialog.show(getSupportFragmentManager(), "shareQrCodeDialog");
- }
-
- private void copyToClipboard(Uri dataUri, ProviderHelper providerHelper) {
- // get public keyring as ascii armored string
- try {
- Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
- String keyringArmored = providerHelper.getKeyRingAsArmoredString(uri);
-
- ClipboardReflection.copyToClipboard(this, keyringArmored);
- AppMsg.makeText(this, R.string.key_copied_to_clipboard, AppMsg.STYLE_INFO)
- .show();
- } catch (IOException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- AppMsg.makeText(this, R.string.error_key_processing, AppMsg.STYLE_ALERT).show();
- } catch (ProviderHelper.NotFoundException e) {
- Log.e(Constants.TAG, "key not found!", e);
- AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
- }
- }
-
- private void shareNfc() {
- ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance();
- dialog.show(getSupportFragmentManager(), "shareNfcDialog");
- }
-
private void deleteKey(Uri dataUri, ExportHelper exportHelper) {
// Message is received after key is deleted
Handler returnHandler = new Handler() {
@@ -409,4 +368,85 @@ public class ViewKeyActivity extends ActionBarActivity {
}
};
+ 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,
+
+ };
+ 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;
+
+ @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);
+ }
+
+ 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 = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_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_UNIFIED_MASTER_KEY_ID);
+ String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId);
+ getSupportActionBar().setSubtitle(keyIdStr);
+
+ // If this key is revoked, it cannot be used for anything!
+ if (data.getInt(INDEX_UNIFIED_IS_REVOKED) != 0) {
+ mStatusDivider.setVisibility(View.VISIBLE);
+ mStatusRevoked.setVisibility(View.VISIBLE);
+ mStatusExpired.setVisibility(View.GONE);
+ } else {
+ mStatusRevoked.setVisibility(View.GONE);
+
+ Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000);
+ if (!data.isNull(INDEX_UNIFIED_EXPIRY) && expiryDate.before(new Date())) {
+ mStatusDivider.setVisibility(View.VISIBLE);
+ mStatusExpired.setVisibility(View.VISIBLE);
+ } else {
+ mStatusDivider.setVisibility(View.GONE);
+ mStatusExpired.setVisibility(View.GONE);
+ }
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
index 3c4135715..d5658586d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyCertsFragment.java
@@ -23,7 +23,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -46,7 +45,7 @@ import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
-public class ViewKeyCertsFragment extends Fragment
+public class ViewKeyCertsFragment extends LoaderFragment
implements LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
// These are the rows that we will retrieve.
@@ -75,19 +74,23 @@ public class ViewKeyCertsFragment extends Fragment
private Uri mDataUri;
+ // starting with 4 for this fragment
+ private static final int LOADER_ID = 4;
+
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.view_key_certs_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View root = super.onCreateView(inflater, superContainer, savedInstanceState);
+ View view = inflater.inflate(R.layout.view_key_certs_fragment, getContainer());
+
+ mStickyList = (StickyListHeadersListView) view.findViewById(R.id.list);
- return view;
+ return root;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- mStickyList = (StickyListHeadersListView) getActivity().findViewById(R.id.list);
-
if (!getArguments().containsKey(ARG_DATA_URI)) {
Log.e(Constants.TAG, "Data missing. Should be Uri of key!");
getActivity().finish();
@@ -112,11 +115,12 @@ public class ViewKeyCertsFragment extends Fragment
mAdapter = new CertListAdapter(getActivity(), null);
mStickyList.setAdapter(mAdapter);
- getLoaderManager().initLoader(0, null, this);
+ getLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
return new CursorLoader(getActivity(), mDataUri, PROJECTION, null, null, SORT_ORDER);
@@ -129,6 +133,8 @@ public class ViewKeyCertsFragment extends Fragment
mAdapter.swapCursor(data);
mStickyList.setAdapter(mAdapter);
+
+ setContentShown(true);
}
/**
@@ -208,11 +214,18 @@ public class ViewKeyCertsFragment extends Fragment
// set name and stuff, common to both key types
TextView wSignerKeyId = (TextView) view.findViewById(R.id.signerKeyId);
- TextView wSignerUserId = (TextView) view.findViewById(R.id.signerUserId);
+ TextView wSignerName = (TextView) view.findViewById(R.id.signerName);
TextView wSignStatus = (TextView) view.findViewById(R.id.signStatus);
String signerKeyId = PgpKeyHelper.convertKeyIdToHex(cursor.getLong(mIndexSignerKeyId));
- String signerUserId = cursor.getString(mIndexSignerUserId);
+ String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexSignerUserId));
+ if (userId[0] != null) {
+ wSignerName.setText(userId[0]);
+ } else {
+ wSignerName.setText(R.string.user_id_no_name);
+ }
+ wSignerKeyId.setText(signerKeyId);
+
switch (cursor.getInt(mIndexType)) {
case PGPSignature.DEFAULT_CERTIFICATION: // 0x10
wSignStatus.setText(R.string.cert_default);
@@ -231,8 +244,6 @@ public class ViewKeyCertsFragment extends Fragment
break;
}
- wSignerUserId.setText(signerUserId);
- wSignerKeyId.setText(signerKeyId);
view.setTag(R.id.tag_mki, cursor.getLong(mIndexMasterKeyId));
view.setTag(R.id.tag_rank, cursor.getLong(mIndexRank));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
new file mode 100644
index 000000000..fb228f032
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyKeysFragment.java
@@ -0,0 +1,128 @@
+/*
+ * 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.database.Cursor;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.text.format.DateFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
+import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.Date;
+
+
+public class ViewKeyKeysFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private ListView mKeys;
+
+ private ViewKeyKeysAdapter mKeysAdapter;
+
+ 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_keys_fragment, getContainer());
+
+ mKeys = (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) {
+ mDataUri = dataUri;
+
+ Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
+
+ mKeysAdapter = new ViewKeyKeysAdapter(getActivity(), null, 0);
+ mKeys.setAdapter(mKeysAdapter);
+
+ // Prepare the loaders. Either re-connect with an existing ones,
+ // or start new ones.
+ getLoaderManager().initLoader(0, null, this);
+ }
+
+ static final String[] KEYS_PROJECTION = new String[] {
+ Keys._ID,
+ Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET,
+ Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED,
+ Keys.CREATION, Keys.EXPIRY, Keys.FINGERPRINT
+ };
+
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ setContentShown(false);
+ Uri baseUri = Keys.buildKeysUri(mDataUri);
+ return new CursorLoader(getActivity(), baseUri, KEYS_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.)
+ mKeysAdapter.swapCursor(data);
+
+ 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) {
+ mKeysAdapter.swapCursor(null);
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
index ef4da3010..026417776 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java
@@ -19,90 +19,64 @@ package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.database.Cursor;
-import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
-import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.LinearLayout;
import android.widget.ListView;
-import android.widget.TextView;
-import com.beardedhen.androidbootstrap.BootstrapButton;
+import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
-import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
+import org.sufficientlysecure.keychain.R;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.KeychainContract.UserIds;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
-import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter;
import org.sufficientlysecure.keychain.ui.adapter.ViewKeyUserIdsAdapter;
import org.sufficientlysecure.keychain.util.Log;
import java.util.Date;
-
-public class ViewKeyMainFragment extends Fragment implements
+public class ViewKeyMainFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
public static final String ARG_DATA_URI = "uri";
- private LinearLayout mContainer;
- private TextView mName;
- private TextView mEmail;
- private TextView mComment;
- private TextView mAlgorithm;
- private TextView mKeyId;
- private TextView mExpiry;
- private TextView mCreation;
- private TextView mFingerprint;
- private TextView mSecretKey;
- private BootstrapButton mActionEdit;
- private BootstrapButton mActionEncrypt;
- private BootstrapButton mActionCertify;
+ private View mActionEdit;
+ private View mActionEditDivider;
+ private View mActionEncrypt;
+ private View mActionCertify;
+ private View mActionCertifyDivider;
private ListView mUserIds;
- private ListView mKeys;
private static final int LOADER_ID_UNIFIED = 0;
private static final int LOADER_ID_USER_IDS = 1;
- private static final int LOADER_ID_KEYS = 2;
+
+ // conservative attitude
+ private boolean mHasEncrypt = true;
private ViewKeyUserIdsAdapter mUserIdsAdapter;
- private ViewKeyKeysAdapter mKeysAdapter;
private Uri mDataUri;
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.view_key_main_fragment, container, false);
-
- mContainer = (LinearLayout) view.findViewById(R.id.container);
- mName = (TextView) view.findViewById(R.id.name);
- mEmail = (TextView) view.findViewById(R.id.email);
- mComment = (TextView) view.findViewById(R.id.comment);
- mKeyId = (TextView) view.findViewById(R.id.key_id);
- mAlgorithm = (TextView) view.findViewById(R.id.algorithm);
- mCreation = (TextView) view.findViewById(R.id.creation);
- mExpiry = (TextView) view.findViewById(R.id.expiry);
- mFingerprint = (TextView) view.findViewById(R.id.fingerprint);
- mSecretKey = (TextView) view.findViewById(R.id.secret_key);
- mUserIds = (ListView) view.findViewById(R.id.user_ids);
- mKeys = (ListView) view.findViewById(R.id.keys);
- mActionEdit = (BootstrapButton) view.findViewById(R.id.action_edit);
- mActionEncrypt = (BootstrapButton) view.findViewById(R.id.action_encrypt);
- mActionCertify = (BootstrapButton) view.findViewById(R.id.action_certify);
-
- return view;
+ 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);
+ mActionEdit = view.findViewById(R.id.view_key_action_edit);
+ mActionEditDivider = view.findViewById(R.id.view_key_action_edit_divider);
+ mActionEncrypt = view.findViewById(R.id.view_key_action_encrypt);
+ mActionCertify = view.findViewById(R.id.view_key_action_certify);
+ mActionCertifyDivider = view.findViewById(R.id.view_key_action_certify_divider);
+
+ return root;
}
@Override
@@ -120,14 +94,6 @@ public class ViewKeyMainFragment extends Fragment implements
}
private void loadData(Uri dataUri) {
- if (dataUri.equals(mDataUri)) {
- Log.d(Constants.TAG, "Same URI, no need to load the data again!");
- return;
- }
-
- getActivity().setProgressBarIndeterminateVisibility(true);
- mContainer.setVisibility(View.GONE);
-
mDataUri = dataUri;
Log.i(Constants.TAG, "mDataUri: " + mDataUri.toString());
@@ -135,52 +101,42 @@ public class ViewKeyMainFragment extends Fragment implements
mActionEncrypt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- encryptToContact(mDataUri);
+ encrypt(mDataUri);
}
});
mActionCertify.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
- certifyKey(mDataUri);
+ certify(mDataUri);
+ }
+ });
+ mActionEdit.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View view) {
+ editKey(mDataUri);
}
});
mUserIdsAdapter = new ViewKeyUserIdsAdapter(getActivity(), null, 0);
mUserIds.setAdapter(mUserIdsAdapter);
- mKeysAdapter = new ViewKeyKeysAdapter(getActivity(), null, 0);
- mKeys.setAdapter(mKeysAdapter);
-
// Prepare the loaders. Either re-connect with an existing ones,
// or start new ones.
- getActivity().getSupportLoaderManager().initLoader(LOADER_ID_UNIFIED, null, this);
- getActivity().getSupportLoaderManager().initLoader(LOADER_ID_USER_IDS, null, this);
- getActivity().getSupportLoaderManager().initLoader(LOADER_ID_KEYS, null, this);
+ 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.USER_ID, KeyRings.FINGERPRINT,
- KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY,
-
+ 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_MKI = 1;
+ static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
- static final int INDEX_UNIFIED_UID = 3;
- static final int INDEX_UNIFIED_FINGERPRINT = 4;
- static final int INDEX_UNIFIED_ALGORITHM = 5;
- static final int INDEX_UNIFIED_KEY_SIZE = 6;
- static final int INDEX_UNIFIED_CREATION = 7;
- static final int INDEX_UNIFIED_EXPIRY = 8;
-
- static final String[] KEYS_PROJECTION = new String[] {
- Keys._ID,
- Keys.KEY_ID, Keys.RANK, Keys.ALGORITHM, Keys.KEY_SIZE, Keys.HAS_SECRET,
- Keys.CAN_CERTIFY, Keys.CAN_ENCRYPT, Keys.CAN_SIGN, Keys.IS_REVOKED,
- Keys.CREATION, Keys.EXPIRY, Keys.FINGERPRINT
- };
- static final int KEYS_INDEX_CAN_ENCRYPT = 7;
+ 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);
@@ -188,11 +144,8 @@ public class ViewKeyMainFragment extends Fragment implements
}
case LOADER_ID_USER_IDS: {
Uri baseUri = UserIds.buildUserIdsUri(mDataUri);
- return new CursorLoader(getActivity(), baseUri, ViewKeyUserIdsAdapter.USER_IDS_PROJECTION, null, null, null);
- }
- case LOADER_ID_KEYS: {
- Uri baseUri = Keys.buildKeysUri(mDataUri);
- return new CursorLoader(getActivity(), baseUri, KEYS_PROJECTION, null, null, null);
+ return new CursorLoader(getActivity(), baseUri,
+ ViewKeyUserIdsAdapter.USER_IDS_PROJECTION, null, null, null);
}
default:
@@ -205,7 +158,7 @@ public class ViewKeyMainFragment extends Fragment implements
* because the notification triggers faster than the activity closes.
*/
// Avoid NullPointerExceptions...
- if(data.getCount() == 0) {
+ if (data.getCount() == 0) {
return;
}
// Swap the new cursor in. (The framework will take care of closing the
@@ -213,80 +166,43 @@ public class ViewKeyMainFragment extends Fragment implements
switch (loader.getId()) {
case LOADER_ID_UNIFIED: {
if (data.moveToFirst()) {
- // get name, email, and comment from USER_ID
- String[] mainUserId = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_UID));
- if (mainUserId[0] != null) {
- getActivity().setTitle(mainUserId[0]);
- mName.setText(mainUserId[0]);
- } else {
- getActivity().setTitle(R.string.user_id_no_name);
- mName.setText(R.string.user_id_no_name);
- }
- mEmail.setText(mainUserId[1]);
- mComment.setText(mainUserId[2]);
-
if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
- mSecretKey.setTextColor(getResources().getColor(R.color.emphasis));
- mSecretKey.setText(R.string.secret_key_yes);
+ // certify button
+ mActionCertify.setVisibility(View.GONE);
+ mActionCertifyDivider.setVisibility(View.GONE);
// edit button
mActionEdit.setVisibility(View.VISIBLE);
- mActionEdit.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- Intent editIntent = new Intent(getActivity(), EditKeyActivity.class);
- editIntent.setData(
- KeyRingData.buildSecretKeyRingUri(mDataUri));
- editIntent.setAction(EditKeyActivity.ACTION_EDIT_KEY);
- startActivityForResult(editIntent, 0);
- }
- });
+ mActionEditDivider.setVisibility(View.VISIBLE);
} else {
- mSecretKey.setTextColor(Color.BLACK);
- mSecretKey.setText(getResources().getString(R.string.secret_key_no));
-
// certify button
mActionCertify.setVisibility(View.VISIBLE);
+ mActionCertifyDivider.setVisibility(View.VISIBLE);
+
// edit button
mActionEdit.setVisibility(View.GONE);
+ mActionEditDivider.setVisibility(View.GONE);
}
- // get key id from MASTER_KEY_ID
- long masterKeyId = data.getLong(INDEX_UNIFIED_MKI);
- String keyIdStr = PgpKeyHelper.convertKeyIdToHex(masterKeyId);
- mKeyId.setText(keyIdStr);
-
- // get creation date from CREATION
- if (data.isNull(INDEX_UNIFIED_CREATION)) {
- mCreation.setText(R.string.none);
+ // 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);
+ mActionEncrypt.setEnabled(false);
} else {
- Date creationDate = new Date(data.getLong(INDEX_UNIFIED_CREATION) * 1000);
-
- mCreation.setText(
- DateFormat.getDateFormat(getActivity().getApplicationContext()).format(
- creationDate));
- }
+ mActionEdit.setEnabled(true);
- // get expiry date from EXPIRY
- if (data.isNull(INDEX_UNIFIED_EXPIRY)) {
- mExpiry.setText(R.string.none);
- } else {
Date expiryDate = new Date(data.getLong(INDEX_UNIFIED_EXPIRY) * 1000);
-
- mExpiry.setText(
- DateFormat.getDateFormat(getActivity().getApplicationContext()).format(
- expiryDate));
+ if (!data.isNull(INDEX_UNIFIED_EXPIRY) && expiryDate.before(new Date())) {
+ mActionCertify.setEnabled(false);
+ mActionEncrypt.setEnabled(false);
+ } else {
+ mActionCertify.setEnabled(true);
+ mActionEncrypt.setEnabled(true);
+ }
}
- String algorithmStr = PgpKeyHelper.getAlgorithmInfo(
- getActivity(),
- data.getInt(INDEX_UNIFIED_ALGORITHM),
- data.getInt(INDEX_UNIFIED_KEY_SIZE)
- );
- mAlgorithm.setText(algorithmStr);
-
- byte[] fingerprintBlob = data.getBlob(INDEX_UNIFIED_FINGERPRINT);
- String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
- mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
+ mHasEncrypt = data.getInt(INDEX_UNIFIED_HAS_ENCRYPT) != 0;
break;
}
@@ -296,26 +212,8 @@ public class ViewKeyMainFragment extends Fragment implements
mUserIdsAdapter.swapCursor(data);
break;
- case LOADER_ID_KEYS:
- // hide encrypt button if no encryption key is available
- // TODO: do with subquery!
- boolean canEncrypt = false;
- data.moveToFirst();
- do {
- if (data.getInt(KEYS_INDEX_CAN_ENCRYPT) == 1) {
- canEncrypt = true;
- break;
- }
- } while (data.moveToNext());
- if (!canEncrypt) {
- mActionEncrypt.setVisibility(View.GONE);
- }
-
- mKeysAdapter.swapCursor(data);
- break;
}
- getActivity().setProgressBarIndeterminateVisibility(false);
- mContainer.setVisibility(View.VISIBLE);
+ setContentShown(true);
}
/**
@@ -327,16 +225,18 @@ public class ViewKeyMainFragment extends Fragment implements
case LOADER_ID_USER_IDS:
mUserIdsAdapter.swapCursor(null);
break;
- case LOADER_ID_KEYS:
- mKeysAdapter.swapCursor(null);
- break;
}
}
- private void encryptToContact(Uri dataUri) {
+ private void encrypt(Uri dataUri) {
+ // If there is no encryption key, don't bother.
+ if (!mHasEncrypt) {
+ AppMsg.makeText(getActivity(), R.string.error_no_encrypt_subkey, AppMsg.STYLE_ALERT).show();
+ return;
+ }
try {
long keyId = new ProviderHelper(getActivity()).extractOrGetMasterKeyId(dataUri);
- long[] encryptionKeyIds = new long[]{ keyId };
+ long[] encryptionKeyIds = new long[]{keyId};
Intent intent = new Intent(getActivity(), EncryptActivity.class);
intent.setAction(EncryptActivity.ACTION_ENCRYPT);
intent.putExtra(EncryptActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds);
@@ -347,10 +247,17 @@ public class ViewKeyMainFragment extends Fragment implements
}
}
- private void certifyKey(Uri dataUri) {
+ private void certify(Uri dataUri) {
Intent signIntent = new Intent(getActivity(), CertifyKeyActivity.class);
signIntent.setData(dataUri);
startActivity(signIntent);
}
+ private void editKey(Uri dataUri) {
+ Intent editIntent = new Intent(getActivity(), EditKeyActivity.class);
+ editIntent.setData(KeychainContract.KeyRingData.buildSecretKeyRingUri(dataUri));
+ editIntent.setAction(EditKeyActivity.ACTION_EDIT_KEY);
+ startActivityForResult(editIntent, 0);
+ }
+
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
new file mode 100644
index 000000000..b3655133d
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java
@@ -0,0 +1,308 @@
+/*
+ * 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.annotation.TargetApi;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.devspark.appmsg.AppMsg;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
+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.dialog.ShareQrCodeDialogFragment;
+import org.sufficientlysecure.keychain.util.Log;
+import org.sufficientlysecure.keychain.util.QrCodeUtils;
+
+import java.io.IOException;
+
+
+public class ViewKeyShareFragment extends LoaderFragment implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+
+ public static final String ARG_DATA_URI = "uri";
+
+ private TextView mFingerprint;
+ private ImageView mFingerprintQrCode;
+ private View mFingerprintShareButton;
+ private View mFingerprintClipboardButton;
+ private View mKeyShareButton;
+ private View mKeyClipboardButton;
+ private View mNfcHelpButton;
+ private View mNfcPrefsButton;
+
+ ProviderHelper mProviderHelper;
+
+ private static final int QR_CODE_SIZE = 1000;
+
+ private static final int LOADER_ID_UNIFIED = 0;
+
+ 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_share_fragment, getContainer());
+
+ mProviderHelper = new ProviderHelper(ViewKeyShareFragment.this.getActivity());
+
+ mFingerprint = (TextView) view.findViewById(R.id.view_key_fingerprint);
+ mFingerprintQrCode = (ImageView) view.findViewById(R.id.view_key_fingerprint_qr_code_image);
+ 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);
+ mNfcHelpButton = view.findViewById(R.id.view_key_action_nfc_help);
+ mNfcPrefsButton = view.findViewById(R.id.view_key_action_nfc_prefs);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ mNfcPrefsButton.setVisibility(View.VISIBLE);
+ } else {
+ mNfcPrefsButton.setVisibility(View.GONE);
+ }
+
+ mFingerprintQrCode.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showQrCodeDialog();
+ }
+ });
+
+ mFingerprintShareButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, true, false);
+ }
+ });
+ mFingerprintClipboardButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, true, true);
+ }
+ });
+ mKeyShareButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, false, false);
+ }
+ });
+ mKeyClipboardButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ share(mDataUri, mProviderHelper, false, true);
+ }
+ });
+ mNfcHelpButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showNfcHelpDialog();
+ }
+ });
+ mNfcPrefsButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showNfcPrefs();
+ }
+ });
+
+ return root;
+ }
+
+ private void share(Uri dataUri, ProviderHelper providerHelper, boolean fingerprintOnly,
+ boolean toClipboard) {
+ try {
+ String content;
+ if (fingerprintOnly) {
+ byte[] data = (byte[]) providerHelper.getGenericData(
+ KeyRings.buildUnifiedKeyRingUri(dataUri),
+ Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
+ String fingerprint = PgpKeyHelper.convertFingerprintToHex(data);
+ content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ } else {
+ // get public keyring as ascii armored string
+ Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
+ content = providerHelper.getKeyRingAsArmoredString(uri);
+ }
+
+ if (toClipboard) {
+ ClipboardReflection.copyToClipboard(getActivity(), content);
+ String message;
+ if (fingerprintOnly) {
+ message = getResources().getString(R.string.fingerprint_copied_to_clipboard);
+ } else {
+ message = getResources().getString(R.string.key_copied_to_clipboard);
+ }
+ AppMsg.makeText(getActivity(), message, AppMsg.STYLE_INFO).show();
+ } else {
+ // Android will fail with android.os.TransactionTooLargeException if key is too big
+ // see http://www.lonestarprod.com/?p=34
+ if (content.length() >= 86389) {
+ AppMsg.makeText(getActivity(), R.string.key_too_big_for_sharing,
+ AppMsg.STYLE_ALERT).show();
+ return;
+ }
+
+ // let user choose application
+ Intent sendIntent = new Intent(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, content);
+ sendIntent.setType("text/plain");
+ String title;
+ if (fingerprintOnly) {
+ title = getResources().getString(R.string.title_share_fingerprint_with);
+ } else {
+ title = getResources().getString(R.string.title_share_key);
+ }
+ startActivity(Intent.createChooser(sendIntent, title));
+ }
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "error processing key!", e);
+ AppMsg.makeText(getActivity(), R.string.error_key_processing, AppMsg.STYLE_ALERT).show();
+ } catch (ProviderHelper.NotFoundException e) {
+ Log.e(Constants.TAG, "key not found!", e);
+ AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
+ }
+ }
+
+ private void showQrCodeDialog() {
+ ShareQrCodeDialogFragment dialog = ShareQrCodeDialogFragment.newInstance(mDataUri);
+ dialog.show(ViewKeyShareFragment.this.getActivity().getSupportFragmentManager(), "shareQrCodeDialog");
+ }
+
+ private void showNfcHelpDialog() {
+ ShareNfcDialogFragment dialog = ShareNfcDialogFragment.newInstance();
+ dialog.show(getActivity().getSupportFragmentManager(), "shareNfcDialog");
+ }
+
+ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+ private void showNfcPrefs() {
+ Intent intentSettings = new Intent(
+ Settings.ACTION_NFCSHARING_SETTINGS);
+ startActivity(intentSettings);
+ }
+
+ @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.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET,
+ KeyRings.USER_ID, KeyRings.FINGERPRINT,
+ KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY,
+
+ };
+ static final int INDEX_UNIFIED_MASTER_KEY_ID = 1;
+ static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
+ static final int INDEX_UNIFIED_USER_ID = 3;
+ static final int INDEX_UNIFIED_FINGERPRINT = 4;
+ static final int INDEX_UNIFIED_ALGORITHM = 5;
+ static final int INDEX_UNIFIED_KEY_SIZE = 6;
+ static final int INDEX_UNIFIED_CREATION = 7;
+ static final int INDEX_UNIFIED_EXPIRY = 8;
+
+ 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 = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
+ mFingerprint.setText(PgpKeyHelper.colorizeFingerprint(fingerprint));
+
+ String qrCodeContent = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ mFingerprintQrCode.setImageBitmap(
+ QrCodeUtils.getQRCodeBitmap(qrCodeContent, QR_CODE_SIZE)
+ );
+
+ 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) {
+ }
+}
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 f4fa7f3bf..9d323c822 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
@@ -28,10 +28,10 @@ import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import java.util.ArrayList;
@@ -106,7 +106,7 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
holder.mainUserId = (TextView) convertView.findViewById(R.id.mainUserId);
holder.mainUserIdRest = (TextView) convertView.findViewById(R.id.mainUserIdRest);
holder.keyId = (TextView) convertView.findViewById(R.id.keyId);
- holder.fingerprint = (TextView) convertView.findViewById(R.id.fingerprint);
+ holder.fingerprint = (TextView) convertView.findViewById(R.id.view_key_fingerprint);
holder.algorithm = (TextView) convertView.findViewById(R.id.algorithm);
holder.status = (TextView) convertView.findViewById(R.id.status);
holder.userIdsList = (LinearLayout) convertView.findViewById(R.id.user_ids_list);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java
new file mode 100644
index 000000000..420880522
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListKeybaseLoader.java
@@ -0,0 +1,107 @@
+/*
+ * 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.adapter;
+
+import android.content.Context;
+import android.support.v4.content.AsyncTaskLoader;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.keyimport.KeyServer;
+import org.sufficientlysecure.keychain.keyimport.KeybaseKeyServer;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.ArrayList;
+
+public class ImportKeysListKeybaseLoader
+ extends AsyncTaskLoader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
+ Context mContext;
+
+ String mKeybaseQuery;
+
+ private ArrayList<ImportKeysListEntry> mEntryList = new ArrayList<ImportKeysListEntry>();
+ private AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> mEntryListWrapper;
+
+ public ImportKeysListKeybaseLoader(Context context, String keybaseQuery) {
+ super(context);
+ mContext = context;
+ mKeybaseQuery = keybaseQuery;
+ }
+
+ @Override
+ public AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> loadInBackground() {
+
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null);
+
+ if (mKeybaseQuery == null) {
+ Log.e(Constants.TAG, "mKeybaseQery is null!");
+ return mEntryListWrapper;
+ }
+
+ queryServer(mKeybaseQuery);
+
+ return mEntryListWrapper;
+ }
+
+ @Override
+ protected void onReset() {
+ super.onReset();
+
+ // Ensure the loader is stopped
+ onStopLoading();
+ }
+
+ @Override
+ protected void onStartLoading() {
+ forceLoad();
+ }
+
+ @Override
+ protected void onStopLoading() {
+ cancelLoad();
+ }
+
+ @Override
+ public void deliverResult(AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> data) {
+ super.deliverResult(data);
+ }
+
+ /**
+ * Query keybase
+ */
+ private void queryServer(String query) {
+
+ KeybaseKeyServer server = new KeybaseKeyServer();
+ try {
+ ArrayList<ImportKeysListEntry> searchResult = server.search(query);
+
+ mEntryList.clear();
+
+ mEntryList.addAll(searchResult);
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null);
+ } catch (KeyServer.InsufficientQuery e) {
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
+ } catch (KeyServer.QueryException e) {
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
+ } catch (KeyServer.TooManyResponses e) {
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
+ }
+
+ }
+
+}
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 3fd5d5daf..b6c829677 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,6 +24,7 @@ import org.spongycastle.openpgp.PGPKeyRing;
import org.spongycastle.openpgp.PGPObjectFactory;
import org.spongycastle.openpgp.PGPUtil;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.PositionAwareInputStream;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java
index 838aeefee..4175592d6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java
@@ -21,8 +21,9 @@ import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.util.HkpKeyServer;
-import org.sufficientlysecure.keychain.util.KeyServer;
+import org.sufficientlysecure.keychain.keyimport.HkpKeyServer;
+import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.keyimport.KeyServer;
import org.sufficientlysecure.keychain.util.Log;
import java.util.ArrayList;
@@ -116,13 +117,10 @@ public class ImportKeysListServerLoader
}
mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null);
} catch (KeyServer.InsufficientQuery e) {
- Log.e(Constants.TAG, "InsufficientQuery", e);
mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
} catch (KeyServer.QueryException e) {
- Log.e(Constants.TAG, "QueryException", e);
mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
} catch (KeyServer.TooManyResponses e) {
- Log.e(Constants.TAG, "TooManyResponses", e);
mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
}
}
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 fd864eb09..977740567 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
@@ -17,7 +17,7 @@
package org.sufficientlysecure.keychain.ui.adapter;
-import android.content.Context;
+import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
@@ -26,8 +26,8 @@ import android.support.v7.app.ActionBarActivity;
import java.util.ArrayList;
public class PagerTabStripAdapter extends FragmentPagerAdapter {
- private final Context mContext;
- private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+ protected final Activity mActivity;
+ protected final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
public final Class<?> clss;
@@ -43,7 +43,7 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter {
public PagerTabStripAdapter(ActionBarActivity activity) {
super(activity.getSupportFragmentManager());
- mContext = activity;
+ mActivity = activity;
}
public void addTab(Class<?> clss, Bundle args, String title) {
@@ -60,7 +60,7 @@ public class PagerTabStripAdapter extends FragmentPagerAdapter {
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
- return Fragment.instantiate(mContext, info.clss.getName(), info.args);
+ return Fragment.instantiate(mActivity, info.clss.getName(), info.args);
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyKeysAdapter.java
index 9e26e559f..f4942a2a0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyKeysAdapter.java
@@ -121,35 +121,17 @@ public class ViewKeyKeysAdapter extends CursorAdapter {
keyId.setText(keyIdStr);
// may be set with additional "stripped" later on
if (hasAnySecret && cursor.getInt(mIndexHasSecret) == 0) {
- keyDetails.setText("(" + algorithmStr + ", " +
- context.getString(R.string.key_stripped) + ")");
+ keyDetails.setText(algorithmStr + ", " +
+ context.getString(R.string.key_stripped));
} else {
- keyDetails.setText("(" + algorithmStr + ")");
+ keyDetails.setText(algorithmStr);
}
- if (cursor.getInt(mIndexRank) == 0) {
- masterKeyIcon.setVisibility(View.INVISIBLE);
- } else {
- masterKeyIcon.setVisibility(View.VISIBLE);
- }
-
- if (cursor.getInt(mIndexCanCertify) != 1) {
- certifyIcon.setVisibility(View.GONE);
- } else {
- certifyIcon.setVisibility(View.VISIBLE);
- }
-
- if (cursor.getInt(mIndexCanEncrypt) != 1) {
- encryptIcon.setVisibility(View.GONE);
- } else {
- encryptIcon.setVisibility(View.VISIBLE);
- }
-
- if (cursor.getInt(mIndexCanSign) != 1) {
- signIcon.setVisibility(View.GONE);
- } else {
- signIcon.setVisibility(View.VISIBLE);
- }
+ // Set icons according to properties
+ masterKeyIcon.setVisibility(cursor.getInt(mIndexRank) == 0 ? View.VISIBLE : View.INVISIBLE);
+ certifyIcon.setVisibility(cursor.getInt(mIndexCanCertify) != 0 ? View.VISIBLE : View.GONE);
+ encryptIcon.setVisibility(cursor.getInt(mIndexCanEncrypt) != 0 ? View.VISIBLE : View.GONE);
+ signIcon.setVisibility(cursor.getInt(mIndexCanSign) != 0 ? View.VISIBLE : View.GONE);
boolean valid = true;
if (cursor.getInt(mIndexRevokedKey) > 0) {
@@ -168,13 +150,13 @@ public class ViewKeyKeysAdapter extends CursorAdapter {
Date expiryDate = new Date(cursor.getLong(mIndexExpiry) * 1000);
valid = valid && expiryDate.after(new Date());
- keyExpiry.setText("(" +
+ keyExpiry.setText(
context.getString(R.string.label_expiry) + ": " +
- DateFormat.getDateFormat(context).format(expiryDate) + ")");
-
- keyExpiry.setVisibility(View.VISIBLE);
+ DateFormat.getDateFormat(context).format(expiryDate));
} else {
- keyExpiry.setVisibility(View.GONE);
+ keyExpiry.setText(
+ context.getString(R.string.label_expiry) + ": " +
+ context.getString(R.string.none));
}
// if key is expired or revoked, strike through text
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
index 52e6dec92..64452e8b4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ViewKeyUserIdsAdapter.java
@@ -27,6 +27,7 @@ import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
@@ -106,46 +107,58 @@ public class ViewKeyUserIdsAdapter extends CursorAdapter implements AdapterView.
@Override
public void bindView(View view, Context context, Cursor cursor) {
- TextView vRank = (TextView) view.findViewById(R.id.rank);
- TextView vUserId = (TextView) view.findViewById(R.id.userId);
+ TextView vName = (TextView) view.findViewById(R.id.userId);
TextView vAddress = (TextView) view.findViewById(R.id.address);
+ TextView vComment = (TextView) view.findViewById(R.id.comment);
ImageView vVerified = (ImageView) view.findViewById(R.id.certified);
- if (cursor.getInt(mIsPrimary) > 0) {
- vRank.setText("+");
- } else {
- vRank.setText(Integer.toString(cursor.getInt(mIndexRank)));
- }
-
String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexUserId));
if (userId[0] != null) {
- vUserId.setText(userId[0]);
+ vName.setText(userId[0]);
+ } else {
+ vName.setText(R.string.user_id_no_name);
+ }
+ if (userId[1] != null) {
+ vAddress.setText(userId[1]);
+ vAddress.setVisibility(View.VISIBLE);
} else {
- vUserId.setText(R.string.user_id_no_name);
+ vAddress.setVisibility(View.GONE);
+ }
+ if (userId[2] != null) {
+ vComment.setText(userId[2]);
+ vComment.setVisibility(View.VISIBLE);
+ } else {
+ vComment.setVisibility(View.GONE);
}
- vAddress.setText(userId[1]);
+
+ // show small star icon for primary user ids
+ boolean isPrimary = cursor.getInt(mIsPrimary) != 0;
if (cursor.getInt(mIsRevoked) > 0) {
- vRank.setText(" ");
+
+ // set revocation icon (can this even be primary?)
vVerified.setImageResource(R.drawable.key_certify_revoke);
// disable and strike through text for revoked user ids
- vUserId.setEnabled(false);
+ vName.setEnabled(false);
vAddress.setEnabled(false);
- vUserId.setText(OtherHelper.strikeOutText(vUserId.getText()));
+ vName.setText(OtherHelper.strikeOutText(vName.getText()));
vAddress.setText(OtherHelper.strikeOutText(vAddress.getText()));
} else {
- vUserId.setEnabled(true);
+ vName.setEnabled(true);
vAddress.setEnabled(true);
int verified = cursor.getInt(mVerifiedId);
- // TODO introduce own resources for this :)
switch (verified) {
case Certs.VERIFIED_SECRET:
- vVerified.setImageResource(R.drawable.key_certify_ok_depth0);
+ vVerified.setImageResource(isPrimary
+ ? R.drawable.key_certify_primary_ok_depth0
+ : R.drawable.key_certify_ok_depth0);
break;
case Certs.VERIFIED_SELF:
- vVerified.setImageResource(R.drawable.key_certify_ok_self);
+ vVerified.setImageResource(isPrimary
+ ? R.drawable.key_certify_primary_ok_self
+ : R.drawable.key_certify_ok_self);
break;
default:
vVerified.setImageResource(R.drawable.key_certify_error);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
index 35e464423..19cf27259 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/BadImportKeyDialogFragment.java
@@ -17,7 +17,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
@@ -50,7 +49,7 @@ public class BadImportKeyDialogFragment extends DialogFragment {
final FragmentActivity activity = getActivity();
final int badImport = getArguments().getInt(ARG_BAD_IMPORT);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
alert.setTitle(R.string.warning);
alert.setMessage(activity.getResources()
@@ -63,6 +62,6 @@ public class BadImportKeyDialogFragment extends DialogFragment {
});
alert.setCancelable(true);
- return alert.create();
+ return alert.show();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
index c71bc160a..6c012cb94 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CreateKeyDialogFragment.java
@@ -83,7 +83,7 @@ public class CreateKeyDialogFragment extends DialogFragment {
final int childCount = getArguments().getInt(ARG_EDITOR_CHILD_COUNT);
mInflater = context.getLayoutInflater();
- AlertDialog.Builder dialog = new AlertDialog.Builder(context);
+ CustomAlertDialogBuilder dialog = new CustomAlertDialogBuilder(context);
View view = mInflater.inflate(R.layout.create_key_dialog, null);
dialog.setView(view);
@@ -146,7 +146,7 @@ public class CreateKeyDialogFragment extends DialogFragment {
}
});
- final AlertDialog alertDialog = dialog.create();
+ final AlertDialog alertDialog = dialog.show();
mCustomKeyEditText.addTextChangedListener(new TextWatcher() {
@Override
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
new file mode 100644
index 000000000..4b40b7ef1
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java
@@ -0,0 +1,40 @@
+package org.sufficientlysecure.keychain.ui.dialog;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.View;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.R;
+
+/** This class extends AlertDiaog.Builder, styling the header using emphasis color.
+ * Note that this class is a huge hack, because dialog boxes aren't easily stylable.
+ * Also, the dialog NEEDS to be called with show() directly, not create(), otherwise
+ * the order of internal operations will lead to a crash!
+ */
+public class CustomAlertDialogBuilder extends AlertDialog.Builder {
+
+ public CustomAlertDialogBuilder(Activity activity) {
+ super(activity);
+ }
+
+ @Override
+ public AlertDialog show() {
+ AlertDialog dialog = super.show();
+
+ 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));
+ }
+
+ 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));
+ }
+
+ 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 37dec70cd..b42a79993 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
@@ -17,7 +17,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
@@ -59,7 +58,7 @@ public class DeleteFileDialogFragment extends DialogFragment {
final String deleteFile = getArguments().getString(ARG_DELETE_FILE);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setIcon(R.drawable.ic_dialog_alert_holo_light);
@@ -120,6 +119,6 @@ public class DeleteFileDialogFragment extends DialogFragment {
});
alert.setCancelable(true);
- return alert.create();
+ return alert.show();
}
}
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 93cdef5e3..01d2fae6a 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
@@ -17,7 +17,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
@@ -73,7 +72,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
final long[] masterKeyIds = getArguments().getLongArray(ARG_DELETE_MASTER_KEY_IDS);
- AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(activity);
// Setup custom View to display in AlertDialog
LayoutInflater inflater = activity.getLayoutInflater();
@@ -144,7 +143,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
}
});
- return builder.create();
+ return builder.show();
}
/**
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 6a5baf658..24f93bed7 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
@@ -97,7 +97,7 @@ public class FileDialogFragment extends DialogFragment {
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(title);
View view = inflater.inflate(R.layout.file_dialog, null);
@@ -157,7 +157,7 @@ public class FileDialogFragment extends DialogFragment {
dismiss();
}
});
- return alert.create();
+ return alert.show();
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java
index 9b5581cc7..cc653e58c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java
@@ -134,7 +134,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
final long secretKeyId = getArguments().getLong(ARG_SECRET_KEY_ID);
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(R.string.title_authentication);
@@ -243,7 +243,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
});
mCanKB = true;
- return alert.create();
+ return alert.show();
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
index e5db22a04..04bec3282 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SetPassphraseDialogFragment.java
@@ -81,7 +81,7 @@ public class SetPassphraseDialogFragment extends DialogFragment implements OnEdi
int title = getArguments().getInt(ARG_TITLE);
mMessenger = getArguments().getParcelable(ARG_MESSENGER);
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(title);
alert.setMessage(R.string.enter_passphrase_twice);
@@ -135,7 +135,7 @@ public class SetPassphraseDialogFragment extends DialogFragment implements OnEdi
}
});
- return alert.create();
+ return alert.show();
}
@Override
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
index 15df53dcc..961f92f03 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareNfcDialogFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.annotation.TargetApi;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
@@ -51,7 +50,7 @@ public class ShareNfcDialogFragment extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
- AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
alert.setTitle(R.string.share_nfc_dialog);
alert.setCancelable(true);
@@ -78,7 +77,7 @@ public class ShareNfcDialogFragment extends DialogFragment {
+ getString(R.string.error_nfc_needed));
} else {
// nfc works...
- textView.setHtmlFromRawResource(getActivity(), R.raw.nfc_beam_share);
+ textView.setHtmlFromRawResource(getActivity(), R.raw.nfc_beam_share, true);
alert.setNegativeButton(R.string.menu_beam_preferences,
new DialogInterface.OnClickListener() {
@@ -93,6 +92,6 @@ public class ShareNfcDialogFragment extends DialogFragment {
}
}
- return alert.create();
+ return alert.show();
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
index fe50c759b..24608784b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java
@@ -18,14 +18,12 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
@@ -34,37 +32,26 @@ import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.QrCodeUtils;
-import java.io.IOException;
-import java.util.ArrayList;
-
public class ShareQrCodeDialogFragment extends DialogFragment {
private static final String ARG_KEY_URI = "uri";
- private static final String ARG_FINGERPRINT_ONLY = "fingerprint_only";
private ImageView mImage;
private TextView mText;
- private boolean mFingerprintOnly;
-
- private ArrayList<String> mContentList;
- private int mCounter;
-
private static final int QR_CODE_SIZE = 1000;
/**
* Creates new instance of this dialog fragment
*/
- public static ShareQrCodeDialogFragment newInstance(Uri dataUri, boolean fingerprintOnly) {
+ public static ShareQrCodeDialogFragment newInstance(Uri dataUri) {
ShareQrCodeDialogFragment frag = new ShareQrCodeDialogFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_KEY_URI, dataUri);
- args.putBoolean(ARG_FINGERPRINT_ONLY, fingerprintOnly);
frag.setArguments(args);
@@ -79,9 +66,8 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
final Activity activity = getActivity();
Uri dataUri = getArguments().getParcelable(ARG_KEY_URI);
- mFingerprintOnly = getArguments().getBoolean(ARG_FINGERPRINT_ONLY);
- AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(getActivity());
alert.setTitle(R.string.share_qr_code_dialog_title);
LayoutInflater inflater = activity.getLayoutInflater();
@@ -94,131 +80,32 @@ public class ShareQrCodeDialogFragment extends DialogFragment {
ProviderHelper providerHelper = new ProviderHelper(getActivity());
String content;
try {
- if (mFingerprintOnly) {
- alert.setPositiveButton(R.string.btn_okay, null);
-
- byte[] blob = (byte[]) providerHelper.getGenericData(
- KeyRings.buildUnifiedKeyRingUri(dataUri),
- KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
- if (blob == null) {
- Log.e(Constants.TAG, "key not found!");
- AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
- return null;
- }
-
- String fingerprint = PgpKeyHelper.convertFingerprintToHex(blob);
- mText.setText(getString(R.string.share_qr_code_dialog_fingerprint_text) + " " + fingerprint);
- content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
- setQrCode(content);
- } else {
- mText.setText(R.string.share_qr_code_dialog_start);
-
- try {
- Uri uri = KeychainContract.KeyRingData.buildPublicKeyRingUri(dataUri);
- content = providerHelper.getKeyRingAsArmoredString(uri);
- } catch (IOException e) {
- Log.e(Constants.TAG, "error processing key!", e);
- AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT).show();
- return null;
- }
-
- // OnClickListener are set in onResume to prevent automatic dismissing of Dialogs
- // http://bit.ly/O5vfaR
- alert.setPositiveButton(R.string.btn_next, null);
- alert.setNegativeButton(android.R.string.cancel, null);
-
- mContentList = splitString(content, 1000);
-
- // start with first
- mCounter = 0;
- updatePartsQrCode();
+ alert.setPositiveButton(R.string.btn_okay, null);
+
+ byte[] blob = (byte[]) providerHelper.getGenericData(
+ KeyRings.buildUnifiedKeyRingUri(dataUri),
+ KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
+ if (blob == null) {
+ Log.e(Constants.TAG, "key not found!");
+ AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
+ return null;
}
+
+ String fingerprint = PgpKeyHelper.convertFingerprintToHex(blob);
+ mText.setText(getString(R.string.share_qr_code_dialog_fingerprint_text) + " " + fingerprint);
+ content = Constants.FINGERPRINT_SCHEME + ":" + fingerprint;
+ setQrCode(content);
} catch (ProviderHelper.NotFoundException e) {
Log.e(Constants.TAG, "key not found!", e);
AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show();
return null;
}
- return alert.create();
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- if (!mFingerprintOnly) {
- AlertDialog alertDialog = (AlertDialog) getDialog();
- final Button backButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
- final Button nextButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-
- backButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mCounter > 0) {
- mCounter--;
- updatePartsQrCode();
- updateDialog(backButton, nextButton);
- } else {
- dismiss();
- }
- }
- });
- nextButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
-
- if (mCounter < mContentList.size() - 1) {
- mCounter++;
- updatePartsQrCode();
- updateDialog(backButton, nextButton);
- } else {
- dismiss();
- }
- }
- });
- }
- }
-
- private void updatePartsQrCode() {
- // Content: <counter>,<size>,<content>
- setQrCode(mCounter + "," + mContentList.size() + "," + mContentList.get(mCounter));
+ return alert.show();
}
private void setQrCode(String data) {
mImage.setImageBitmap(QrCodeUtils.getQRCodeBitmap(data, QR_CODE_SIZE));
}
- private void updateDialog(Button backButton, Button nextButton) {
- if (mCounter == 0) {
- backButton.setText(android.R.string.cancel);
- } else {
- backButton.setText(R.string.btn_back);
- }
- if (mCounter == mContentList.size() - 1) {
- nextButton.setText(android.R.string.ok);
- } else {
- nextButton.setText(R.string.btn_next);
- }
-
- mText.setText(getResources().getString(R.string.share_qr_code_dialog_progress,
- mCounter + 1, mContentList.size()));
- }
-
- /**
- * Split String by number of characters
- *
- * @param text
- * @param size
- * @return
- */
- private ArrayList<String> splitString(String text, int size) {
- ArrayList<String> strings = new ArrayList<String>();
- int index = 0;
- while (index < text.length()) {
- strings.add(text.substring(index, Math.min(index + size, text.length())));
- index += size;
- }
-
- return strings;
- }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UnderlineTextView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UnderlineTextView.java
deleted file mode 100644
index 937a48e48..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/UnderlineTextView.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2013 Eric Frohnhoefer
- *
- * 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.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.widget.TextView;
-
-/**
- * Copied from StickyListHeaders lib example
- *
- * @author Eric Frohnhoefer
- */
-public class UnderlineTextView extends TextView {
- private final Paint mPaint = new Paint();
- private int mUnderlineHeight = 0;
-
- public UnderlineTextView(Context context) {
- this(context, null);
- }
-
- public UnderlineTextView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public UnderlineTextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- init(context, attrs);
- }
-
- private void init(Context context, AttributeSet attrs) {
- Resources r = getResources();
- mUnderlineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2,
- r.getDisplayMetrics());
- }
-
- @Override
- public void setPadding(int left, int top, int right, int bottom) {
- super.setPadding(left, top, right, bottom + mUnderlineHeight);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- // Draw the underline the same color as the text
- mPaint.setColor(getTextColors().getDefaultColor());
- canvas.drawRect(0, getHeight() - mUnderlineHeight, getWidth(), getHeight(), mPaint);
- }
-}
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 5793d7438..f89ffd139 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/InputData.java
@@ -19,6 +19,9 @@ package org.sufficientlysecure.keychain.util;
import java.io.InputStream;
+/**
+ * Wrapper to include size besides an InputStream
+ */
public class InputData {
private PositionAwareInputStream mInputStream;
private long mSize;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java
index ad1aab146..68b402124 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/IntentIntegratorSupportV4.java
@@ -22,6 +22,8 @@ import android.support.v4.app.Fragment;
import com.google.zxing.integration.android.IntentIntegrator;
/**
+ * Copied from older Barcode Scanner Integration library
+ *
* IntentIntegrator for the V4 Android compatibility package.
*
* @author Lachezar Dobrev
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java
new file mode 100644
index 000000000..7ae1d8fab
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/JWalk.java
@@ -0,0 +1,73 @@
+/*
+ * 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.util;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Minimal hierarchy selector
+ */
+public class JWalk {
+
+ public static int getInt(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getInt(path[path.length - 1]);
+ }
+
+ public static long getLong(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getLong(path[path.length - 1]);
+ }
+
+ public static String getString(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getString(path[path.length - 1]);
+ }
+
+ public static JSONArray getArray(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.getJSONArray(path[path.length - 1]);
+ }
+
+ public static JSONObject optObject(JSONObject json, String... path) throws JSONException {
+ json = walk(json, path);
+ return json.optJSONObject(path[path.length - 1]);
+ }
+
+ private static JSONObject walk(JSONObject json, String... path) throws JSONException {
+ int len = path.length - 1;
+ int pathIndex = 0;
+ try {
+ while (pathIndex < len) {
+ json = json.getJSONObject(path[pathIndex]);
+ pathIndex++;
+ }
+ } catch (JSONException e) {
+ // try to give ’em a nice-looking error
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < len; i++) {
+ sb.append(path[i]).append('.');
+ }
+ sb.append(path[len]);
+ throw new JSONException("JWalk error at step " + pathIndex + " of " + sb);
+ }
+ return json;
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeychainServiceListener.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeychainServiceListener.java
deleted file mode 100644
index b205bd556..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/KeychainServiceListener.java
+++ /dev/null
@@ -1,22 +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.util;
-
-public interface KeychainServiceListener {
- boolean hasServiceStopped();
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/QrCodeUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/QrCodeUtils.java
index cd9e56394..28e567d76 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/QrCodeUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/QrCodeUtils.java
@@ -32,6 +32,9 @@ import org.sufficientlysecure.keychain.Constants;
import java.util.Hashtable;
+/**
+ * Copied from Bitcoin Wallet
+ */
public class QrCodeUtils {
public static final QRCodeWriter QR_CODE_WRITER = new QRCodeWriter();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java
new file mode 100644
index 000000000..065034be1
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabLayout.java
@@ -0,0 +1,318 @@
+/*
+ * 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.util;
+
+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/util/SlidingTabStrip.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java
new file mode 100644
index 000000000..9ce6f943e
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/SlidingTabStrip.java
@@ -0,0 +1,211 @@
+/*
+ * 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.util;
+
+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/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png b/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png
new file mode 100644
index 000000000..0ddafab03
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png
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
new file mode 100644
index 000000000..c062b17f8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png
new file mode 100644
index 000000000..22327391e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_copy.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png
new file mode 100644
index 000000000..1f3d06519
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_download.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png
new file mode 100644
index 000000000..5f7c6eff3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_edit.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png
new file mode 100644
index 000000000..38051d8d6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_good.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png
new file mode 100644
index 000000000..382d314ca
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_help.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png
new file mode 100644
index 000000000..a1804b2c1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_important_small.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png
new file mode 100644
index 000000000..9438aa597
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_paste.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png
new file mode 100644
index 000000000..869f0014b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_play.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png
new file mode 100644
index 000000000..0eb78f7c7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_settings.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png
new file mode 100644
index 000000000..b53640176
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/ic_action_upload.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_depth0.png b/OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_depth0.png
new file mode 100644
index 000000000..026869c14
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_depth0.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_self.png b/OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_self.png
new file mode 100644
index 000000000..12d2e026e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/key_certify_primary_ok_self.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
new file mode 100644
index 000000000..f74fcdd8d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..9dbad9b92
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..58a99014e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_focused_holo_light.png
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
new file mode 100644
index 000000000..b1b52b23a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_holo_light.png
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
new file mode 100644
index 000000000..e5f0ddf50
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..1d06ee46f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..cd02122be
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..0f9718950
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_focused_holo_light.png
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
new file mode 100644
index 000000000..8db606b56
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_holo_light.png
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
new file mode 100644
index 000000000..313698a88
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_check_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..8ee0aa89c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..6a2a92cce
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..e6ce2835c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_focused_holo_light.9.png
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
new file mode 100644
index 000000000..55139e939
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_normal_holo_light.9.png
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
new file mode 100644
index 000000000..aaae193fb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_default_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..0dc2a75ab
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..25e8e1ba5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..0c22251f3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_focused_holo_light.png
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
new file mode 100644
index 000000000..932257123
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_holo_light.png
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
new file mode 100644
index 000000000..065e49a12
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..82eb795b8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..6e61b5287
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..fbee3366d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_focused_holo_light.png
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
new file mode 100644
index 000000000..eda8002eb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_holo_light.png
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
new file mode 100644
index 000000000..7f66e282f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..e98c2a4d2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_activated_holo.9.png
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
new file mode 100644
index 000000000..84d9006eb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_focused_holo.9.png
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
new file mode 100644
index 000000000..e9196aa82
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_longpressed_holo.9.png
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
new file mode 100644
index 000000000..895e51bdf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..ca8e9a277
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_list_selector_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..3f12166d2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_bg_holo_light.9.png
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
new file mode 100644
index 000000000..c14605dab
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_primary_holo_light.9.png
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
new file mode 100644
index 000000000..60aefe181
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progress_secondary_holo_light.9.png
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
new file mode 100644
index 000000000..b9977dedb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo1.png
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
new file mode 100644
index 000000000..88601174a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo2.png
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
new file mode 100644
index 000000000..6cd634a91
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo3.png
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
new file mode 100644
index 000000000..9456cf4e1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo4.png
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
new file mode 100644
index 000000000..fc6c57e16
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo5.png
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
new file mode 100644
index 000000000..3c2e03356
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo6.png
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
new file mode 100644
index 000000000..2618d0e50
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo7.png
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
new file mode 100644
index 000000000..56745c26b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_progressbar_indeterminate_holo8.png
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
new file mode 100644
index 000000000..a02ebb450
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_default_holo_light.9.png
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
new file mode 100644
index 000000000..d0d94197b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..12c3cd5af
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_focused_holo_light.9.png
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
new file mode 100644
index 000000000..35f8ec52a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_spinner_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..70691cddc
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_activated_holo_light.9.png
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
new file mode 100644
index 000000000..d5ac69c23
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_default_holo_light.9.png
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
new file mode 100644
index 000000000..b70db4e10
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..a77d66d99
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..257eba9a0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/keychaintheme_textfield_focused_holo_light.9.png
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
new file mode 100644
index 000000000..ebffb16a0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.png
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
new file mode 100644
index 000000000..b6739b564
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png
new file mode 100644
index 000000000..713482020
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_copy.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png
new file mode 100644
index 000000000..c2ead0cef
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_download.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png
new file mode 100644
index 000000000..650b4d899
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_edit.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png
new file mode 100644
index 000000000..13967b30a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_good.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png
new file mode 100644
index 000000000..5876cdea4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_help.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png
new file mode 100644
index 000000000..11a25b504
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_important_small.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png
new file mode 100644
index 000000000..940aae781
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_paste.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png
new file mode 100644
index 000000000..5f3bf86fd
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_play.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png
new file mode 100644
index 000000000..c290e5902
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_settings.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png
new file mode 100644
index 000000000..5bef3ca81
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/ic_action_upload.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_depth0.png b/OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_depth0.png
new file mode 100644
index 000000000..c376a2897
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_depth0.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_self.png b/OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_self.png
new file mode 100644
index 000000000..45a261b24
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/key_certify_primary_ok_self.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
new file mode 100644
index 000000000..d7be4f996
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..db190430c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..2c5949eb9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_focused_holo_light.png
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
new file mode 100644
index 000000000..f5eaf804b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_holo_light.png
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
new file mode 100644
index 000000000..c237545b1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..d5e0ef543
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..20e2aab12
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..d12f33b7d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_focused_holo_light.png
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
new file mode 100644
index 000000000..517ea4302
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_holo_light.png
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
new file mode 100644
index 000000000..09f2df11f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_check_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..c6a653217
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..d424a0e77
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..dca8db91f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_focused_holo_light.9.png
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
new file mode 100644
index 000000000..502f762af
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_normal_holo_light.9.png
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
new file mode 100644
index 000000000..693371f44
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_default_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..ef648d9df
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..a67375ec8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..aefa6e2c7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_focused_holo_light.png
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
new file mode 100644
index 000000000..590c37c6c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_holo_light.png
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
new file mode 100644
index 000000000..ad8341be4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..fa981c2f4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..4583c3e1f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..b7421f31a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_focused_holo_light.png
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
new file mode 100644
index 000000000..0f3beeea6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_holo_light.png
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
new file mode 100644
index 000000000..7d47196e4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..aa1130332
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_activated_holo.9.png
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
new file mode 100644
index 000000000..8d1b4af83
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_focused_holo.9.png
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
new file mode 100644
index 000000000..ba6538fbe
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_longpressed_holo.9.png
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
new file mode 100644
index 000000000..886a6ee0c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..42cb6463e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_list_selector_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..780b4b256
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_bg_holo_light.9.png
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
new file mode 100644
index 000000000..fdb236d7c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_primary_holo_light.9.png
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
new file mode 100644
index 000000000..64b72e8ee
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progress_secondary_holo_light.9.png
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
new file mode 100644
index 000000000..0cff52503
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo1.png
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
new file mode 100644
index 000000000..3a290e871
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo2.png
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
new file mode 100644
index 000000000..d6b4a1326
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo3.png
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
new file mode 100644
index 000000000..98061c845
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo4.png
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
new file mode 100644
index 000000000..cf130fdf2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo5.png
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
new file mode 100644
index 000000000..72d43ea01
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo6.png
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
new file mode 100644
index 000000000..6a7307dcf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo7.png
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
new file mode 100644
index 000000000..0d3cb5fe7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_progressbar_indeterminate_holo8.png
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
new file mode 100644
index 000000000..574ea43ba
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_default_holo_light.9.png
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
new file mode 100644
index 000000000..a78d6c082
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..33c452dcd
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_focused_holo_light.9.png
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
new file mode 100644
index 000000000..3636d59d4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_spinner_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..4569d71a9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_activated_holo_light.9.png
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
new file mode 100644
index 000000000..47302c93e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_default_holo_light.9.png
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
new file mode 100644
index 000000000..0d5ea839d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..ea6d2f74b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..39ca1ffda
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/keychaintheme_textfield_focused_holo_light.9.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
new file mode 100644
index 000000000..7c5e21eeb
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.png
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
new file mode 100644
index 000000000..86814b45d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png
new file mode 100644
index 000000000..5ddf15139
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_copy.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png
new file mode 100644
index 000000000..38a3aeea6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_download.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png
new file mode 100644
index 000000000..8ab436d87
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_edit.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png
new file mode 100644
index 000000000..0bb45d2c0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_good.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png
new file mode 100644
index 000000000..19a9df332
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_help.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png
new file mode 100644
index 000000000..40ca1572c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_important_small.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png
new file mode 100644
index 000000000..5fa309cd8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_paste.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png
new file mode 100644
index 000000000..7f709bbf1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_play.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png
new file mode 100644
index 000000000..999d0f0d8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_settings.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png
new file mode 100644
index 000000000..27af9a43c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/ic_action_upload.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_depth0.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_depth0.png
new file mode 100644
index 000000000..de6614246
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_depth0.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_self.png b/OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_self.png
new file mode 100644
index 000000000..ce10da099
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/key_certify_primary_ok_self.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
new file mode 100644
index 000000000..0b0606462
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..6a364bbe3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..65d850957
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_focused_holo_light.png
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
new file mode 100644
index 000000000..a1c2005a8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_holo_light.png
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
new file mode 100644
index 000000000..7ae2fad2b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..80ad53ff0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..d705b4204
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..b72dea7f8
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_focused_holo_light.png
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
new file mode 100644
index 000000000..f24991826
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_holo_light.png
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
new file mode 100644
index 000000000..db233e702
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_check_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..5c122118e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..b410d238e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..e738f8218
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_focused_holo_light.9.png
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
new file mode 100644
index 000000000..8bb32617b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_normal_holo_light.9.png
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
new file mode 100644
index 000000000..06d1d1e75
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_default_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..83af2dcc3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..1030a801a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..b02c9b6d1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_focused_holo_light.png
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
new file mode 100644
index 000000000..2360f30be
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_holo_light.png
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
new file mode 100644
index 000000000..0bbf8a326
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..1a2ed89db
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..5741490d3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..306e47e71
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_focused_holo_light.png
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
new file mode 100644
index 000000000..d22876cb2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_holo_light.png
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
new file mode 100644
index 000000000..c6a6d833d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..6a24d21e7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_activated_holo.9.png
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
new file mode 100644
index 000000000..430387245
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_focused_holo.9.png
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
new file mode 100644
index 000000000..22ab07906
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_longpressed_holo.9.png
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
new file mode 100644
index 000000000..541163853
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..c6a7d4d87
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_list_selector_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..cbd19ac4f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_bg_holo_light.9.png
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
new file mode 100644
index 000000000..9e08305f5
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_primary_holo_light.9.png
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
new file mode 100644
index 000000000..95c75a6db
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progress_secondary_holo_light.9.png
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
new file mode 100644
index 000000000..06f79cba3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo1.png
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
new file mode 100644
index 000000000..f7bae4cef
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo2.png
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
new file mode 100644
index 000000000..fc5808cbf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo3.png
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
new file mode 100644
index 000000000..ef108bdf4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo4.png
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
new file mode 100644
index 000000000..f826eee36
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo5.png
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
new file mode 100644
index 000000000..dfd468fe9
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo6.png
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
new file mode 100644
index 000000000..6a223873c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo7.png
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
new file mode 100644
index 000000000..27a2832af
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_progressbar_indeterminate_holo8.png
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
new file mode 100644
index 000000000..10458c01a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_default_holo_light.9.png
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
new file mode 100644
index 000000000..fe541269e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..e4d7abf4d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_focused_holo_light.9.png
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
new file mode 100644
index 000000000..9d4c6e5a2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_spinner_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..dc19219cf
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_activated_holo_light.9.png
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
new file mode 100644
index 000000000..f0ad55a66
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_default_holo_light.9.png
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
new file mode 100644
index 000000000..40a28cf70
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..4ffdd869e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..b84a6fed1
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/keychaintheme_textfield_focused_holo_light.9.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png
new file mode 100644
index 000000000..9dbbdd971
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_conversations.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png
new file mode 100644
index 000000000..970c536b7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_k9.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/apps_pgpauth.png b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_pgpauth.png
new file mode 100644
index 000000000..4cf6a6770
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/apps_pgpauth.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
new file mode 100644
index 000000000..5e4818bfc
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.png
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
new file mode 100644
index 000000000..7dd89e1f4
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png
new file mode 100644
index 000000000..a0508df8c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_copy.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png
new file mode 100644
index 000000000..ef7785a48
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_download.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png
new file mode 100644
index 000000000..f2b2078b0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_edit.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png
new file mode 100644
index 000000000..fda51ad86
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_good.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png
new file mode 100644
index 000000000..c5a34319b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_help.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png
new file mode 100644
index 000000000..44754152f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_important_small.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png
new file mode 100644
index 000000000..3589aeb55
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_paste.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png
new file mode 100644
index 000000000..df5994710
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_play.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png
new file mode 100644
index 000000000..530227e2d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_settings.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png
new file mode 100644
index 000000000..48a0cd149
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/ic_action_upload.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_depth0.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_depth0.png
new file mode 100644
index 000000000..1b52ef04d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_depth0.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_self.png b/OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_self.png
new file mode 100644
index 000000000..baa1c00d2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/key_certify_primary_ok_self.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
new file mode 100644
index 000000000..c0fdc45b0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..47a63730b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..911bad8a3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_focused_holo_light.png
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
new file mode 100644
index 000000000..310ab257c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_holo_light.png
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
new file mode 100644
index 000000000..773206f63
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..456471129
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..013c1f6ee
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..e67994690
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_focused_holo_light.png
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
new file mode 100644
index 000000000..0c5038fc0
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_holo_light.png
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
new file mode 100644
index 000000000..4b0e39517
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_check_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..e90491aee
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..b4c90d408
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..a0ba2a3a2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_focused_holo_light.9.png
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
new file mode 100644
index 000000000..24daa6b8a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_normal_holo_light.9.png
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
new file mode 100644
index 000000000..9c808dd2c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_default_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..78ab31858
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..06f0cc78c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_disabled_holo_light.png
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
new file mode 100644
index 000000000..2af5bf37b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_focused_holo_light.png
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
new file mode 100644
index 000000000..7d6fa76cd
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_holo_light.png
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
new file mode 100644
index 000000000..9fe2ebfce
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_off_pressed_holo_light.png
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
new file mode 100644
index 000000000..01e04d15e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_focused_holo_light.png
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
new file mode 100644
index 000000000..adb730439
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_disabled_holo_light.png
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
new file mode 100644
index 000000000..90c4cac28
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_focused_holo_light.png
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
new file mode 100644
index 000000000..7860fc848
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_holo_light.png
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
new file mode 100644
index 000000000..58108fc4e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_btn_radio_on_pressed_holo_light.png
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
new file mode 100644
index 000000000..b3b0da723
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_activated_holo.9.png
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
new file mode 100644
index 000000000..0458c7f37
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_focused_holo.9.png
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
new file mode 100644
index 000000000..82036b6b7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_longpressed_holo.9.png
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
new file mode 100644
index 000000000..c7b06aa6a
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..70bc9f282
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_list_selector_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..fb146c339
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_bg_holo_light.9.png
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
new file mode 100644
index 000000000..f89b6477b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_primary_holo_light.9.png
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
new file mode 100644
index 000000000..30a079d6e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progress_secondary_holo_light.9.png
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
new file mode 100644
index 000000000..ca952535f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo1.png
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
new file mode 100644
index 000000000..88804968f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo2.png
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
new file mode 100644
index 000000000..580a9cf9c
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo3.png
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
new file mode 100644
index 000000000..8ce77b135
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo4.png
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
new file mode 100644
index 000000000..9c17f17a2
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo5.png
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
new file mode 100644
index 000000000..2cab8426e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo6.png
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
new file mode 100644
index 000000000..18d252948
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo7.png
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
new file mode 100644
index 000000000..d0632ca2d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_progressbar_indeterminate_holo8.png
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
new file mode 100644
index 000000000..f9facd05d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_default_holo_light.9.png
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
new file mode 100644
index 000000000..4cef09547
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..f7a9f7c55
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_focused_holo_light.9.png
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
new file mode 100644
index 000000000..62ac88d40
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_spinner_pressed_holo_light.9.png
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
new file mode 100644
index 000000000..733255647
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_activated_holo_light.9.png
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
new file mode 100644
index 000000000..6db1dd0aa
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_default_holo_light.9.png
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
new file mode 100644
index 000000000..d157d7d60
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_focused_holo_light.9.png
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
new file mode 100644
index 000000000..c91f7da91
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_disabled_holo_light.9.png
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
new file mode 100644
index 000000000..01af8180e
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/keychaintheme_textfield_focused_holo_light.9.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
new file mode 100644
index 000000000..e7121f083
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml
@@ -0,0 +1,20 @@
+<?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/keychaintheme_activated_background_holo_light.xml b/OpenKeychain/src/main/res/drawable/keychaintheme_activated_background_holo_light.xml
new file mode 100644
index 000000000..60415e926
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_activated_background_holo_light.xml
@@ -0,0 +1,20 @@
+<?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
new file mode 100644
index 000000000..62567cb98
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_btn_check_holo_light.xml
@@ -0,0 +1,65 @@
+<?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
new file mode 100644
index 000000000..c9261f53b
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_btn_default_holo_light.xml
@@ -0,0 +1,32 @@
+<?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
new file mode 100644
index 000000000..eeba95d4f
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_btn_radio_holo_light.xml
@@ -0,0 +1,59 @@
+<?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
new file mode 100644
index 000000000..7acab984d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_edit_text_holo_light.xml
@@ -0,0 +1,25 @@
+<?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
new file mode 100644
index 000000000..b385d2f92
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_item_background_holo_light.xml
@@ -0,0 +1,26 @@
+<?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
new file mode 100644
index 000000000..2a5561b22
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_background_transition_holo_light.xml
@@ -0,0 +1,20 @@
+<?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
new file mode 100644
index 000000000..17164fd1d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_list_selector_holo_light.xml
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 000000000..a99f756f6
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_progress_horizontal_holo_light.xml
@@ -0,0 +1,32 @@
+<?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
new file mode 100644
index 000000000..79c050e47
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_progress_indeterminate_horizontal_holo_light.xml
@@ -0,0 +1,30 @@
+<?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
new file mode 100644
index 000000000..e82b1c2f3
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_searchview_holo_light.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 000000000..9fbb83f95
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/keychaintheme_spinner_background_holo_light.xml
@@ -0,0 +1,25 @@
+<?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/selector_transparent_button.xml b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml
index a2cacf0ad..ed856f281 100644
--- a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml
+++ b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Borderless Buttons for API < 11, see http://stackoverflow.com/a/14663170 -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
- <item android:state_pressed="true" android:drawable="@color/emphasis" />
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true" android:drawable="@color/bg_gray" />
<item android:drawable="@android:color/transparent" />
</selector> \ 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 0ae46a261..bb43fa805 100644
--- a/OpenKeychain/src/main/res/layout/certify_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/certify_key_activity.xml
@@ -35,12 +35,13 @@
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="14dp"
- android:text="KEY TO SIGN" />
+ android:text="@string/section_key_to_certify" />
<TableLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
+ android:layout_marginLeft="8dp"
android:shrinkColumns="1">
<TableRow
@@ -93,7 +94,7 @@
android:text="@string/label_fingerprint" />
<TextView
- android:id="@+id/fingerprint"
+ android:id="@+id/view_key_fingerprint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:typeface="monospace" />
@@ -108,10 +109,10 @@
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="14dp"
- android:text="@string/section_uids_to_sign" />
+ android:text="@string/section_uids_to_certify" />
<org.sufficientlysecure.keychain.ui.widget.FixedListView
- android:id="@+id/user_ids"
+ android:id="@+id/view_key_user_ids"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants" />
@@ -134,22 +135,37 @@
android:text="@string/label_send_key" />
<Spinner
- android:id="@+id/sign_key_keyserver"
+ android:id="@+id/upload_key_keyserver"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp"
android:enabled="false" />
- <com.beardedhen.androidbootstrap.BootstrapButton
+ <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/sign_key_sign_button"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:layout_marginBottom="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="60dp"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="14dp"
- android:text="@string/btn_certify"
- bootstrapbutton:bb_icon_left="fa-pencil"
- bootstrapbutton:bb_type="info" />
+ android:layout_height="match_parent"
+ android:text="@string/key_view_action_certify"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_action_good"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="@style/SelectableItem" />
+
</LinearLayout>
</ScrollView> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
index 597652713..d1db1c782 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_file_fragment.xml
@@ -65,27 +65,29 @@
android:layout_height="match_parent">
<TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:text="@string/section_decrypt_verify"
- android:layout_above="@+id/decrypt_file_action_decrypt"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
-
- <com.beardedhen.androidbootstrap.BootstrapButton
android:id="@+id/decrypt_file_action_decrypt"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:text="@string/btn_decrypt_verify"
- bootstrapbutton:bb_icon_left="fa-unlock"
- bootstrapbutton:bb_type="info"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:text="@string/btn_decrypt_verify_file"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:drawableRight="@drawable/ic_action_save"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
+ android:layout_alignParentStart="true"
+ android:layout_marginBottom="8dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_above="@+id/decrypt_file_action_decrypt" />
</RelativeLayout>
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml
index 831d7e888..0db581910 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_message_fragment.xml
@@ -37,43 +37,52 @@
android:scrollHorizontally="true"
android:layout_weight="1" />
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/section_decrypt_verify"
- android:id="@+id/decrypt_message_section" />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
<LinearLayout
- android:id="@+id/decrypt_buttons"
+ android:id="@+id/action_decrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:orientation="horizontal"
+ android:layout_marginBottom="8dp">
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/action_decrypt"
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginRight="4dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:layout_weight="1"
- android:text="@string/btn_decrypt_verify"
- bootstrapbutton:bb_icon_left="fa-unlock"
- bootstrapbutton:bb_type="info" />
+ <TextView
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:text="@string/btn_decrypt_verify_message"
+ android:gravity="center_vertical"
+ android:layout_weight="1" />
- <com.beardedhen.androidbootstrap.BootstrapButton
+ <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/action_decrypt_from_clipboard"
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginLeft="4dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:layout_weight="1"
- android:text="@string/btn_decrypt_verify_clipboard"
- bootstrapbutton:bb_icon_left="fa-clipboard"
- bootstrapbutton:bb_type="info" />
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_paste"
+ android:layout_gravity="center_vertical"
+ style="@style/SelectableItem" />
+
</LinearLayout>
+
</LinearLayout>
+
</LinearLayout>
+
</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/decrypt_result_include.xml b/OpenKeychain/src/main/res/layout/decrypt_result_include.xml
index 70faa1d80..3bc78d325 100644
--- a/OpenKeychain/src/main/res/layout/decrypt_result_include.xml
+++ b/OpenKeychain/src/main/res/layout/decrypt_result_include.xml
@@ -9,7 +9,13 @@
android:paddingRight="16dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
- android:background="@color/result_blue">
+ android:background="@color/result_purple">
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginTop="4dp" />
<TextView
android:id="@+id/result_text"
@@ -17,14 +23,24 @@
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="result text"
- android:textColor="@color/white" />
+ android:textColor="@color/white"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
<RelativeLayout
android:id="@+id/result_signature"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:layout_marginBottom="8dp"
+ android:layout_marginTop="8dp">
<RelativeLayout
android:layout_width="wrap_content"
@@ -67,17 +83,17 @@
android:layout_toRightOf="@+id/result_signature_image"
android:textColor="@color/white" />
- </RelativeLayout>
+ <com.beardedhen.androidbootstrap.BootstrapButton
+ android:id="@+id/lookup_key"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/btn_lookup_key"
+ bootstrapbutton:bb_icon_left="fa-download"
+ bootstrapbutton:bb_type="info"
+ bootstrapbutton:bb_size="small"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true" />
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/lookup_key"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:text="@string/btn_lookup_key"
- bootstrapbutton:bb_icon_left="fa-download"
- bootstrapbutton:bb_type="info"
- bootstrapbutton:bb_size="small" />
+ </RelativeLayout>
</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/edit_key_activity.xml b/OpenKeychain/src/main/res/layout/edit_key_activity.xml
index fc4422cf0..1ce5c096f 100644
--- a/OpenKeychain/src/main/res/layout/edit_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/edit_key_activity.xml
@@ -33,7 +33,7 @@
android:padding="4dp"
android:text="@string/btn_set_passphrase"
bootstrapbutton:bb_icon_left="fa-pencil"
- bootstrapbutton:bb_type="info" />
+ bootstrapbutton:bb_type="default" />
<LinearLayout
android:id="@+id/edit_key_container"
diff --git a/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml
index efc4b4641..c8aaf77b8 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_file_fragment.xml
@@ -59,27 +59,29 @@
android:layout_height="match_parent">
<TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:text="@string/section_encrypt_and_or_sign"
- android:layout_above="@+id/action_encrypt_file"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
-
- <com.beardedhen.androidbootstrap.BootstrapButton
android:id="@+id/action_encrypt_file"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
android:text="@string/btn_encrypt_file"
- bootstrapbutton:bb_icon_left="fa-lock"
- bootstrapbutton:bb_type="info"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:drawableRight="@drawable/ic_action_save"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true" />
+ android:layout_alignParentStart="true"
+ android:layout_marginBottom="8dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_above="@+id/action_encrypt_file" />
</RelativeLayout>
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/encrypt_message_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_message_fragment.xml
index 1fa338426..fab983fa5 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_message_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_message_fragment.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
@@ -22,41 +21,51 @@
android:hint="@string/encrypt_content_edit_text_hint"
android:layout_weight="1" />
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/section_encrypt_and_or_sign" />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
<LinearLayout
+ android:id="@+id/action_encrypt_share"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/action_encrypt_share"
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginRight="4dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:layout_weight="1"
- android:text="@string/btn_share"
- bootstrapbutton:bb_icon_left="fa-share-square"
- bootstrapbutton:bb_type="info" />
-
- <com.beardedhen.androidbootstrap.BootstrapButton
+ 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="0dp"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:text="@string/btn_share_encrypted_signed"
+ android:drawableRight="@drawable/ic_action_share"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:layout_weight="1" />
+
+ <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/action_encrypt_clipboard"
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginLeft="4dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:layout_weight="1"
- android:text="@string/btn_clipboard"
- bootstrapbutton:bb_icon_left="fa-clipboard"
- bootstrapbutton:bb_type="info" />
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_copy"
+ android:layout_gravity="center_vertical"
+ style="@style/SelectableItem" />
</LinearLayout>
+
</LinearLayout>
</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/help_activity.xml b/OpenKeychain/src/main/res/layout/help_activity.xml
index 58e4919dc..76ba183b7 100644
--- a/OpenKeychain/src/main/res/layout/help_activity.xml
+++ b/OpenKeychain/src/main/res/layout/help_activity.xml
@@ -4,6 +4,11 @@
android:layout_height="match_parent"
android:orientation="vertical" >
+ <org.sufficientlysecure.keychain.util.SlidingTabLayout
+ android:id="@+id/sliding_tab_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
diff --git a/OpenKeychain/src/main/res/layout/import_keys_activity.xml b/OpenKeychain/src/main/res/layout/import_keys_activity.xml
index eb1333704..876374700 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_activity.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_activity.xml
@@ -25,15 +25,26 @@
android:paddingLeft="16dp"
android:paddingRight="16dp">
- <com.beardedhen.androidbootstrap.BootstrapButton
+ <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:layout_marginBottom="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
+ android:layout_height="match_parent"
android:text="@string/import_import"
- bootstrapbutton:bb_icon_left="fa-download"
- bootstrapbutton:bb_type="info" />
+ 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>
diff --git a/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
new file mode 100644
index 000000000..248581342
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/import_keys_keybase_fragment.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <EditText
+ android:id="@+id/import_keybase_query"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="top|left"
+ android:hint="@string/hint_keybase_search"
+ android:imeOptions="actionSearch"
+ android:inputType="textNoSuggestions"
+ android:singleLine="true"
+ android:lines="1"
+ android:maxLines="1"
+ android:minLines="1"
+ android:layout_gravity="center_vertical" />
+
+ <com.beardedhen.androidbootstrap.BootstrapButton
+ android:id="@+id/import_keybase_search"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="10dp"
+ bootstrapbutton:bb_icon_left="fa-search"
+ bootstrapbutton:bb_roundedCorners="true"
+ bootstrapbutton:bb_size="default"
+ bootstrapbutton:bb_type="default" />
+ </LinearLayout>
+
+ <!--
+ <com.beardedhen.androidbootstrap.BootstrapButton
+ android:id="@+id/import_keybase_button"
+ android:layout_width="match_parent"
+ android:layout_height="70dp"
+ android:layout_margin="10dp"
+ android:text="@string/import_keybase_button"
+ bootstrapbutton:bb_size="default"
+ bootstrapbutton:bb_type="default" />
+ -->
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
index ba8ff91ca..f5ec71abe 100644
--- a/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
+++ b/OpenKeychain/src/main/res/layout/import_keys_list_entry.xml
@@ -106,7 +106,7 @@
android:typeface="monospace" />
<TextView
- android:id="@+id/fingerprint"
+ android:id="@+id/view_key_fingerprint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0000 0000 0000 0000 0000\n0000 0000 0000 0000 0000"
diff --git a/OpenKeychain/src/main/res/layout/key_list_fragment.xml b/OpenKeychain/src/main/res/layout/key_list_fragment.xml
index 951f8d729..c02854668 100644
--- a/OpenKeychain/src/main/res/layout/key_list_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_fragment.xml
@@ -6,103 +6,74 @@
android:orientation="vertical">
<!--rebuild functionality of ListFragment -->
+
+ <se.emilsjolander.stickylistheaders.StickyListHeadersListView
+ 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" />
+
<LinearLayout
- android:id="@+id/key_list_progress_container"
- android:orientation="vertical"
+ android:id="@+id/key_list_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:visibility="visible"
- android:gravity="center">
+ android:gravity="center"
+ android:orientation="vertical"
+ android:visibility="visible">
- <ProgressBar
- style="?android:attr/progressBarStyleLarge"
+ <TextView
android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="@string/key_list_empty_text1"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
+ android:gravity="center"
android:text=""
- android:paddingTop="4dip"
- android:singleLine="true" />
-
- </LinearLayout>
+ android:textAppearance="?android:attr/textAppearanceLarge" />
- <FrameLayout
- android:id="@+id/key_list_list_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <se.emilsjolander.stickylistheaders.StickyListHeadersListView
- 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" />
-
- <LinearLayout
- android:id="@+id/key_list_empty"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
android:gravity="center"
- android:orientation="vertical"
- android:visibility="gone">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text="@string/key_list_empty_text1"
- android:textAppearance="?android:attr/textAppearanceLarge" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:text=""
- android:textAppearance="?android:attr/textAppearanceLarge" />
+ android:text="@string/key_list_empty_text2"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp"
- android:gravity="center"
- android:text="@string/key_list_empty_text2"
- android:textAppearance="?android:attr/textAppearanceSmall" />
-
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/key_list_empty_button_create"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp"
- android:text="@string/key_list_empty_button_create"
- bootstrapbutton:bb_icon_left="fa-plus"
- bootstrapbutton:bb_type="default" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp"
- android:gravity="center"
- android:text="@string/key_list_empty_text3"
- android:textAppearance="?android:attr/textAppearanceSmall" />
+ <com.beardedhen.androidbootstrap.BootstrapButton
+ android:id="@+id/key_list_empty_button_create"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
+ android:text="@string/key_list_empty_button_create"
+ bootstrapbutton:bb_icon_left="fa-plus"
+ bootstrapbutton:bb_type="default" />
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/key_list_empty_button_import"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp"
- android:text="@string/key_list_empty_button_import"
- bootstrapbutton:bb_icon_left="fa-download"
- bootstrapbutton:bb_type="default" />
- </LinearLayout>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
+ android:gravity="center"
+ android:text="@string/key_list_empty_text3"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
- </FrameLayout>
+ <com.beardedhen.androidbootstrap.BootstrapButton
+ android:id="@+id/key_list_empty_button_import"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
+ android:text="@string/key_list_empty_button_import"
+ bootstrapbutton:bb_icon_left="fa-download"
+ bootstrapbutton:bb_type="default" />
+ </LinearLayout>
</FrameLayout>
diff --git a/OpenKeychain/src/main/res/layout/key_list_header.xml b/OpenKeychain/src/main/res/layout/key_list_header.xml
index de7bdbd5c..8cb0d4262 100644
--- a/OpenKeychain/src/main/res/layout/key_list_header.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_header.xml
@@ -3,15 +3,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" >
- <org.sufficientlysecure.keychain.ui.widget.UnderlineTextView
+ <TextView
+ style="@style/SectionHeader"
android:id="@+id/stickylist_header_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|left"
- android:padding="8dp"
- android:textColor="@color/emphasis"
- android:textSize="17sp"
- android:textStyle="bold"
android:text="header text" />
<TextView
diff --git a/OpenKeychain/src/main/res/layout/key_list_item.xml b/OpenKeychain/src/main/res/layout/key_list_item.xml
index 4676a624d..73a20bd2e 100644
--- a/OpenKeychain/src/main/res/layout/key_list_item.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_item.xml
@@ -48,31 +48,33 @@
<FrameLayout
android:id="@+id/status_layout"
- android:layout_width="80dp"
+ android:layout_width="wrap_content"
android:layout_height="match_parent">
- <Button
- android:background="@drawable/selector_transparent_button"
+ <ImageButton
+ android:id="@+id/edit"
+ style="@style/SelectableItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:id="@+id/edit"
android:focusable="false"
android:enabled="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/black"
- android:text="@string/edit" />
+ android:src="@drawable/ic_action_edit"
+ android:text="@string/edit"
+ android:padding="12dp" />
<TextView
android:id="@+id/revoked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="8dp"
android:singleLine="true"
android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="@string/revoked"
android:textColor="#e00"
- android:layout_gravity="center" />
+ android:layout_gravity="center"
+ android:padding="12dp" />
<ImageView
android:layout_width="wrap_content"
@@ -80,7 +82,7 @@
android:id="@+id/verified"
android:layout_gravity="center"
android:src="@drawable/key_certify_ok_depth0"
- android:paddingLeft="25dp" />
+ android:padding="16dp" />
</FrameLayout>
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/loader_layout.xml b/OpenKeychain/src/main/res/layout/loader_layout.xml
new file mode 100644
index 000000000..50252d27c
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/loader_layout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!--rebuild functionality of ListFragment -->
+ <LinearLayout
+ android:id="@+id/loader_progress"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center">
+
+ <ProgressBar
+ style="?android:attr/progressBarStyleLarge"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text=""
+ android:paddingTop="4dip"
+ android:singleLine="true" />
+
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/loader_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone">
+
+ </FrameLayout>
+
+</FrameLayout>
diff --git a/OpenKeychain/src/main/res/layout/key_server_export.xml b/OpenKeychain/src/main/res/layout/upload_key_activity.xml
index 6031bf7c7..5a6f732d5 100644
--- a/OpenKeychain/src/main/res/layout/key_server_export.xml
+++ b/OpenKeychain/src/main/res/layout/upload_key_activity.xml
@@ -2,14 +2,14 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent" >
+ android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
- android:orientation="vertical" >
+ android:orientation="vertical">
<TextView
style="@style/SectionHeader"
@@ -18,23 +18,38 @@
android:layout_marginBottom="4dp"
android:layout_marginTop="14dp"
android:text="@string/section_key_server" />
-
+
<Spinner
- android:id="@+id/sign_key_keyserver"
+ android:id="@+id/upload_key_keyserver"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp" />
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/btn_export_to_server"
- android:layout_width="match_parent"
- android:layout_height="60dp"
- android:layout_marginBottom="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"
- bootstrapbutton:bb_icon_left="fa-upload"
- bootstrapbutton:bb_type="info" />
+ 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> \ 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 76bf91757..66c635599 100644
--- a/OpenKeychain/src/main/res/layout/view_cert_activity.xml
+++ b/OpenKeychain/src/main/res/layout/view_cert_activity.xml
@@ -42,8 +42,9 @@
android:text="@string/section_cert" />
<TableLayout
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
android:layout_weight="1"
android:stretchColumns="1">
@@ -159,11 +160,13 @@
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="14dp"
- android:text="@string/section_signer_id" />
+ android:text="@string/section_certifier_id" />
<TableLayout
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginBottom="4dp"
android:layout_weight="1"
android:stretchColumns="1">
@@ -190,19 +193,41 @@
android:id="@+id/label_algorithm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
+ android:layout_gravity="top"
android:paddingRight="10dip"
- android:text="@string/label_email" />
+ 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"/>
+ 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 58e4919dc..f43aade25 100644
--- a/OpenKeychain/src/main/res/layout/view_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_activity.xml
@@ -2,11 +2,49 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical" >
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="This key is expired!"
+ android:id="@+id/view_key_expired"
+ android:textColor="@color/alert"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:gravity="center_vertical|center_horizontal"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp"
+ android:visibility="gone" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="This key has been revoked!"
+ android:id="@+id/view_key_revoked"
+ android:textColor="@color/alert"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:gravity="center_vertical|center_horizontal"
+ android:visibility="gone"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:visibility="gone"
+ android:id="@+id/status_divider" />
+
+ <org.sufficientlysecure.keychain.util.SlidingTabLayout
+ android:id="@+id/view_key_sliding_tab_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
<android.support.v4.view.ViewPager
- android:id="@+id/pager"
+ android:id="@+id/view_key_pager"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="0px"
+ android:layout_weight="1"
+ android:background="@android:color/white" />
</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_certs_header.xml
index 037203dbd..f99c012c9 100644
--- a/OpenKeychain/src/main/res/layout/view_key_certs_header.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_certs_header.xml
@@ -3,15 +3,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" >
- <org.sufficientlysecure.keychain.ui.widget.UnderlineTextView
+ <TextView
+ style="@style/SectionHeader"
android:id="@+id/stickylist_header_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|left"
- android:padding="8dp"
- android:textColor="@color/emphasis"
- android:textSize="14sp"
- android:textStyle="bold"
android:text="header text" />
<TextView
diff --git a/OpenKeychain/src/main/res/layout/view_key_certs_item.xml b/OpenKeychain/src/main/res/layout/view_key_certs_item.xml
index de7570818..e84a98cdb 100644
--- a/OpenKeychain/src/main/res/layout/view_key_certs_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_certs_item.xml
@@ -12,22 +12,22 @@
android:focusable="false">
<TextView
- android:id="@+id/signerKeyId"
+ android:id="@+id/signerName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="signer key id"
+ android:text="signer name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
- android:id="@+id/signerUserId"
+ android:id="@+id/signerKeyId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="&lt;user@example.com>"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_below="@+id/signerKeyId"
+ android:layout_below="@+id/signerName"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
@@ -38,7 +38,7 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="status"
android:visibility="visible"
- android:layout_above="@+id/signerUserId"
+ android:layout_above="@+id/signerKeyId"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="10dp" />
diff --git a/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml
new file mode 100644
index 000000000..caea22341
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_keys_fragment.xml
@@ -0,0 +1,32 @@
+<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="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:layout_marginTop="8dp"
+ android:text="@string/section_keys" />
+
+ <org.sufficientlysecure.keychain.ui.widget.FixedListView
+ android:id="@+id/keys"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp" />
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/OpenKeychain/src/main/res/layout/view_key_keys_item.xml b/OpenKeychain/src/main/res/layout/view_key_keys_item.xml
index 66cd4d7b5..13feaf2cc 100644
--- a/OpenKeychain/src/main/res/layout/view_key_keys_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_keys_item.xml
@@ -1,83 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
- android:paddingLeft="8dip"
- android:paddingRight="3dip">
+ android:paddingRight="3dip"
+ android:singleLine="true">
<ImageView
android:id="@+id/ic_masterKey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:paddingRight="6dip"
- android:layout_alignParentLeft="true"
- android:src="@drawable/key_small" />
-
- <TextView
- android:id="@+id/keyId"
- android:layout_toRightOf="@+id/ic_masterKey"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="2dip"
- android:text="@string/label_key_id"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:typeface="monospace" />
+ android:src="@drawable/key_small"
+ android:layout_marginLeft="8dp" />
<LinearLayout
- android:layout_width="wrap_content"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_alignParentEnd="true"
- android:paddingBottom="2dip"
- android:paddingTop="2dip"
- android:id="@+id/linearLayout">
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp">
- <ImageView
- android:id="@+id/ic_revokedKey"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:src="@drawable/revoked_key_small" />
+ android:orientation="horizontal"
+ android:paddingBottom="2dip"
+ android:paddingTop="2dip">
- <ImageView
- android:id="@+id/ic_certifyKey"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/certify_small" />
+ <TextView
+ android:id="@+id/keyId"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:text="@string/label_key_id"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:typeface="monospace"
+ android:layout_weight="1" />
- <ImageView
- android:id="@+id/ic_encryptKey"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/encrypted_small" />
+ <ImageView
+ android:id="@+id/ic_certifyKey"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/certify_small"
+ android:layout_marginLeft="8dp"
+ android:layout_gravity="center_vertical" />
- <ImageView
- android:id="@+id/ic_signKey"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/signed_small" />
- </LinearLayout>
+ <ImageView
+ android:id="@+id/ic_encryptKey"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/encrypted_small"
+ android:layout_marginLeft="8dp"
+ android:layout_gravity="center_vertical" />
- <TextView
- android:id="@+id/keyDetails"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="(RSA, 1024bit)"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_below="@+id/ic_masterKey"
- android:layout_toRightOf="@+id/ic_masterKey" />
+ <ImageView
+ android:id="@+id/ic_signKey"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/signed_small"
+ android:layout_marginLeft="8dp"
+ android:layout_gravity="center_vertical" />
- <TextView
- android:id="@+id/keyExpiry"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right"
- android:text="@string/label_expiry"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_alignTop="@+id/keyDetails"
- android:layout_alignRight="@+id/linearLayout"
- android:layout_alignEnd="@+id/linearLayout" />
+ <ImageView
+ android:id="@+id/ic_revokedKey"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/revoked_key_small"
+ android:layout_marginLeft="8dp"
+ android:layout_gravity="center_vertical" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:id="@+id/keyDetails"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip"
+ android:text="RSA, 1024bit"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_weight="1" />
+
+ <TextView
+ android:id="@+id/keyExpiry"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Expiry: 4/7/2016"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_gravity="right" />
+ </LinearLayout>
+
+ </LinearLayout>
-</RelativeLayout>
+</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml
index e3448c39f..d93420a99 100644
--- a/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_main_fragment.xml
@@ -1,5 +1,4 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -12,253 +11,91 @@
android:descendantFocusability="beforeDescendants"
android:orientation="vertical"
android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:id="@+id/container">
+ 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_master_user_id" />
-
- <TableLayout
- android:layout_width="wrap_content"
android:layout_height="0dp"
- 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_name" />
-
- <TextView
- android:id="@+id/name"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_email" />
-
- <TextView
- android:id="@+id/email"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:paddingRight="10dip"
- android:text="@string/label_comment" />
-
- <TextView
- android:id="@+id/comment"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="" />
- </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_master_key" />
+ android:layout_marginTop="8dp"
+ android:text="@string/section_user_ids"
+ android:layout_weight="1" />
- <TableLayout
- android:layout_width="wrap_content"
+ <org.sufficientlysecure.keychain.ui.widget.FixedListView
+ android:id="@+id/view_key_user_ids"
+ android:layout_width="match_parent"
android:layout_height="0dp"
- android:layout_weight="1"
- android:shrinkColumns="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/key_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text=""
- android:typeface="monospace" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:id="@+id/label_algorithm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_algorithm" />
-
- <TextView
- android:id="@+id/algorithm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="5dip"
- android:text="" />
- </TableRow>
-
- <TableRow
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:id="@+id/tableRow">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_fingerprint" />
-
- <TextView
- android:id="@+id/fingerprint"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:typeface="monospace" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_creation" />
-
- <TextView
- android:id="@+id/creation"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_expiry" />
-
- <TextView
- android:id="@+id/expiry"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </TableRow>
-
- <TableRow>
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingRight="10dip"
- android:text="@string/label_secret_key" />
-
- <TextView
- android:id="@+id/secret_key"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </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_user_ids" />
+ android:layout_weight="1" />
- <org.sufficientlysecure.keychain.ui.widget.FixedListView
- android:id="@+id/user_ids"
+ <View
+ android:id="@+id/view_key_action_certify_divider"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
<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_keys" />
-
- <org.sufficientlysecure.keychain.ui.widget.FixedListView
- android:id="@+id/keys"
+ android:id="@+id/view_key_action_certify"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="match_parent"
+ android:text="@string/key_view_action_certify"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/ic_action_good"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ style="@style/SelectableItem" />
<TextView
style="@style/SectionHeader"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_marginTop="14dp"
- android:text="@string/section_actions" />
+ android:text="@string/section_actions"
+ android:layout_weight="1" />
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/action_edit"
+ <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="50dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ style="@style/SelectableItem"
android:text="@string/key_view_action_edit"
- bootstrapbutton:bb_icon_left="fa-key"
- bootstrapbutton:bb_type="info"
- android:visibility="gone" />
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_action_edit"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/action_encrypt"
+ <View
+ android:id="@+id/view_key_action_edit_divider"
android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:text="@string/key_view_action_encrypt"
- bootstrapbutton:bb_icon_left="fa-lock"
- bootstrapbutton:bb_type="info" />
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
- <com.beardedhen.androidbootstrap.BootstrapButton
- android:id="@+id/action_certify"
+ <TextView
+ android:id="@+id/view_key_action_encrypt"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:layout_marginBottom="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
- android:layout_height="50dp"
- android:layout_marginTop="4dp"
- android:layout_marginBottom="4dp"
- android:text="@string/key_view_action_certify"
- bootstrapbutton:bb_icon_left="fa-pencil"
- bootstrapbutton:bb_type="info" />
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:text="@string/key_view_action_encrypt"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_action_secure"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
new file mode 100644
index 000000000..67c2e241a
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/view_key_share_fragment.xml
@@ -0,0 +1,178 @@
+<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_fingerprint"
+ android:layout_weight="1" />
+
+ <LinearLayout
+ android:id="@+id/view_key_action_fingerprint_share"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/view_key_fingerprint"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:text=""
+ android:layout_weight="1"
+ android:typeface="monospace"
+ android:drawableRight="@drawable/ic_action_share"
+ 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_fingerprint_clipboard"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_copy"
+ android:layout_gravity="center_vertical"
+ style="@style/SelectableItem" />
+
+ </LinearLayout>
+
+
+ <View
+ android:layout_width="match_parent"
+ 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:layout_width="match_parent"
+ android:layout_height="200dp"
+ android:layout_gravity="center_horizontal"
+ android:layout_weight="1"
+ style="@style/SelectableItem" />
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="14dp"
+ android:text="@string/section_share_key"
+ android:layout_weight="1" />
+
+ <LinearLayout
+ android:id="@+id/view_key_action_key_share"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:orientation="horizontal">
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:text="@string/key_view_action_share_with"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_action_share"
+ 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_key_clipboard"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_copy"
+ android:layout_gravity="center_vertical"
+ style="@style/SelectableItem" />
+
+ </LinearLayout>
+
+ <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="wrap_content"
+ android:minHeight="?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_userids_item.xml b/OpenKeychain/src/main/res/layout/view_key_userids_item.xml
index e56355ff3..2f4041f8c 100644
--- a/OpenKeychain/src/main/res/layout/view_key_userids_item.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_userids_item.xml
@@ -2,6 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal"
android:paddingRight="3dip"
android:singleLine="true">
@@ -13,24 +14,38 @@
android:clickable="false"
android:focusable="false" />
- <TextView
- android:id="@+id/rank"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="22dp"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="0"
- android:paddingLeft="10dp"
- android:paddingRight="10dp"
+ android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical"
- android:width="30sp" />
+ android:orientation="vertical">
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/certified"
+ android:src="@drawable/key_certify_ok_self"
+ android:layout_gravity="center_horizontal" />
+
+ </LinearLayout>
<LinearLayout
android:orientation="vertical"
+ android:layout_gravity="center_vertical"
android:layout_width="0dip"
+ android:layout_marginLeft="8dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<TextView
+ android:id="@+id/address"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="alice@example.com"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
android:id="@+id/userId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -38,20 +53,13 @@
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
- android:id="@+id/address"
+ android:id="@+id/comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="alice@example.com"
+ android:textColor="@color/tertiary_text_light"
+ android:text="comment"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:id="@+id/certified"
- android:src="@drawable/key_certify_ok_self"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp" />
-
</LinearLayout>
diff --git a/OpenKeychain/src/main/res/menu/api_app_settings.xml b/OpenKeychain/src/main/res/menu/api_app_settings.xml
index a21db6708..1233e4f6e 100644
--- a/OpenKeychain/src/main/res/menu/api_app_settings.xml
+++ b/OpenKeychain/src/main/res/menu/api_app_settings.xml
@@ -3,6 +3,12 @@
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"
+ app:showAsAction="always" />
+
+ <item
android:id="@+id/menu_api_settings_revoke"
android:title="@string/api_settings_revoke"
app:showAsAction="never" />
diff --git a/OpenKeychain/src/main/res/menu/key_view.xml b/OpenKeychain/src/main/res/menu/key_view.xml
index 2f5697a0f..864016801 100644
--- a/OpenKeychain/src/main/res/menu/key_view.xml
+++ b/OpenKeychain/src/main/res/menu/key_view.xml
@@ -3,53 +3,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
- android:id="@+id/menu_key_view_share"
- android:icon="@drawable/ic_action_share"
- app:showAsAction="always"
- android:title="@string/menu_share">
- <menu>
- <item
- android:id="@+id/menu_key_view_share_fingerprint_title"
- app:showAsAction="never"
- android:title="@string/menu_share_title_fingerprint">
- <menu>
- <item
- android:id="@+id/menu_key_view_share_default_fingerprint"
- app:showAsAction="never"
- android:title="@string/menu_share_default_fingerprint" />
- <item
- android:id="@+id/menu_key_view_share_qr_code_fingerprint"
- app:showAsAction="never"
- android:title="@string/menu_share_qr_code_fingerprint" />
- </menu>
- </item>
- <item
- android:id="@+id/menu_key_view_share_title"
- app:showAsAction="never"
- android:title="@string/menu_share_title">
- <menu>
- <item
- android:id="@+id/menu_key_view_share_default"
- app:showAsAction="never"
- android:title="@string/menu_share_default" />
- <item
- android:id="@+id/menu_key_view_share_qr_code"
- app:showAsAction="never"
- android:title="@string/menu_share_qr_code" />
- <item
- android:id="@+id/menu_key_view_share_nfc"
- app:showAsAction="never"
- android:title="@string/menu_share_nfc" />
- <item
- android:id="@+id/menu_key_view_share_clipboard"
- app:showAsAction="never"
- android:title="@string/menu_copy_to_clipboard" />
- </menu>
- </item>
- </menu>
- </item>
-
- <item
android:id="@+id/menu_key_keyserver"
android:icon="@drawable/ic_action_cloud"
app:showAsAction="always"
@@ -69,13 +22,13 @@
<item
android:id="@+id/menu_key_view_export_file"
android:icon="@drawable/ic_action_import_export"
- app:showAsAction="ifRoom"
+ app:showAsAction="never"
android:title="@string/menu_export_key" />
<item
android:id="@+id/menu_key_view_delete"
android:icon="@drawable/ic_action_discard"
- app:showAsAction="ifRoom"
+ app:showAsAction="never"
android:title="@string/menu_delete_key" />
</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/menu/view_cert.xml b/OpenKeychain/src/main/res/menu/view_cert.xml
deleted file mode 100644
index 8c8e455c7..000000000
--- a/OpenKeychain/src/main/res/menu/view_cert.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?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_view_cert_view_signer"
- app:showAsAction="never"
- android:title="View signing key" />
-</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html b/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-cs-rCZ/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html b/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html
+++ b/OpenKeychain/src/main/res/raw-cs-rCZ/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-de/help_about.html b/OpenKeychain/src/main/res/raw-de/help_about.html
index b356c9897..c40267e73 100644
--- a/OpenKeychain/src/main/res/raw-de/help_about.html
+++ b/OpenKeychain/src/main/res/raw-de/help_about.html
@@ -22,7 +22,7 @@
</ul>
<h2>Entwickler APG 1.x</h2>
<ul>
-<li>Thialfihar (Lead developer)</li>
+<li>Thialfihar (Hauptentwickler)</li>
<li>'Senecaso' (QR-Code, Schlüssel signtieren, Schlüssel hochladen)</li>
<li>Markus Doits</li>
</ul>
diff --git a/OpenKeychain/src/main/res/raw-de/help_changelog.html b/OpenKeychain/src/main/res/raw-de/help_changelog.html
index e1640f2b3..4f8206bf7 100644
--- a/OpenKeychain/src/main/res/raw-de/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-de/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
@@ -57,7 +65,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<ul>
<li>new design with navigation drawer</li>
<li>Neus Design für die Liste der öffentlichen Schlüssel</li>
-<li>new public key view</li>
+<li>Neue Ansicht für öffentliche Schlüssel</li>
<li>Fehler beim Schlüsselimport behoben</li>
<li>key cross-certification (thanks to Ash Hughes)</li>
<li>handle UTF-8 passwords properly (thanks to Ash Hughes)</li>
@@ -82,7 +90,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
<li>Schlüssel signieren</li>
<li>Schlüssel auf den Server hochladen</li>
<li>Importprobleme behoben</li>
-<li>new AIDL API</li>
+<li>neue AIDL API</li>
</ul>
<h2>1.0.8</h2>
<ul>
@@ -137,7 +145,7 @@ Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Pa
</ul>
<h2>1.0.0</h2>
<ul>
-<li>K-9 Mail integration, APG supporting beta build of K-9 Mail</li>
+<li>K-9 Mail integration, APG unterstützt beta build von K-9 Mail</li>
<li>Unterstützung von mehr Filemanagern (einschließlich ASTRO)</li>
<li>Slowenische Übersetzung</li>
<li>Neue Datenbank, viel schneller, weniger Speicherbedarf</li>
diff --git a/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html
index 88492731c..6fb3d6dd1 100644
--- a/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html
+++ b/OpenKeychain/src/main/res/raw-de/help_nfc_beam.html
@@ -1,12 +1,12 @@
<html>
<head></head>
<body>
-<h2>How to receive keys</h2>
+<h2>Wie werden Schlüssel empfangen</h2>
<ol>
-<li>Go to your partners contacts and open the contact you want to share.</li>
-<li>Hold the two devices back to back (they have to be almost touching) and you’ll feel a vibration.</li>
+<li>Gehen Sie zu Ihren Kontakten und öffnen Sie den Kontakt, den Sie teilen wollen.</li>
+<li>Halten sie die zwei Geräte Rückseitig aneinander (sie müssen sich fast berühren) und sie werden ein Vibrieren fühlen.</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>Tippen sie die Karte an und der Inhalt wird dann auf Ihr Gerät geladen.</li>
</ol>
</body>
</html>
diff --git a/OpenKeychain/src/main/res/raw-de/help_start.html b/OpenKeychain/src/main/res/raw-de/help_start.html
deleted file mode 100644
index f21fc2141..000000000
--- a/OpenKeychain/src/main/res/raw-de/help_start.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<html>
-<head></head>
-<body>
-<h2>Los gehts</h2>
-<p>First you need a personal secret key. Create one via the option menus in "Keys" or import existing secret keys. Afterwards, you can download your friends' keys or exchange them via QR Codes or NFC.</p>
-
-<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
-
-<h2>Ich habe einen Fehler in OpenKeychain gefunden!</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>Unterstützen</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>Übersetzungen</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-el/help_changelog.html b/OpenKeychain/src/main/res/raw-el/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-el/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-el/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-el/help_start.html b/OpenKeychain/src/main/res/raw-el/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-el/help_start.html
+++ b/OpenKeychain/src/main/res/raw-el/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-es/help_changelog.html b/OpenKeychain/src/main/res/raw-es/help_changelog.html
index 4398e086d..b86d29adb 100644
--- a/OpenKeychain/src/main/res/raw-es/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-es/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>algunas reparaciones para fallos recurrentes</li>
diff --git a/OpenKeychain/src/main/res/raw-es/help_start.html b/OpenKeychain/src/main/res/raw-es/help_start.html
index eeb6e1535..d9eaa90b5 100644
--- a/OpenKeychain/src/main/res/raw-es/help_start.html
+++ b/OpenKeychain/src/main/res/raw-es/help_start.html
@@ -6,6 +6,11 @@
<p>Es recomendable que instales <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> para una mejor selección de archivos y <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> para escanear los códigos QR generados. Pulsando en los enlaces se abrirá Google Play o F-Droid.</p>
+<h2>Aplicaciones</h2>
+<p>Varias aplicaciones soportan OpenKeychain para cifrar/firmar sus comunicaciones privadas:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversaciones</a>: Cliente Jabber/XMPP</p>
+<p><img src="apps_k9">K-9 Mail: ¡Soporte para OpenKeychain disponible en la actual <a href="https://github.com/k9mail/k-9/releases/tag/4.904">versión alfa</a>!</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-et/help_changelog.html b/OpenKeychain/src/main/res/raw-et/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-et/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-et/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-et/help_start.html b/OpenKeychain/src/main/res/raw-et/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-et/help_start.html
+++ b/OpenKeychain/src/main/res/raw-et/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-fa-rIR/help_changelog.html b/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-fa-rIR/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-fa-rIR/help_start.html b/OpenKeychain/src/main/res/raw-fa-rIR/help_start.html
index bf15b21f0..e8c04c7ae 100644
--- a/OpenKeychain/src/main/res/raw-fa-rIR/help_start.html
+++ b/OpenKeychain/src/main/res/raw-fa-rIR/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-fr/help_changelog.html b/OpenKeychain/src/main/res/raw-fr/help_changelog.html
index 698d73df1..3a8b958c8 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>quelques correctifs de bogues de régression</li>
diff --git a/OpenKeychain/src/main/res/raw-fr/help_start.html b/OpenKeychain/src/main/res/raw-fr/help_start.html
index 5b8a062ba..114bc3d81 100644
--- a/OpenKeychain/src/main/res/raw-fr/help_start.html
+++ b/OpenKeychain/src/main/res/raw-fr/help_start.html
@@ -6,6 +6,11 @@
<p>Il vous est recommendé d'installer le <a href="market://details?id=org.openintents.filemanager">gestionnaire de fichiers OI</a> pour sa fonction améliorée de séléction des fichiers et le <a href="market://details?id=com.google.zxing.client.android">lecteur de codes à barres</a> pour balayer les codes QR générés. Cliquer sur les liens ouvrira Google Play Store ou F-Droid pour l'installation.</p>
+<h2>Applications</h2>
+<p>Plusieurs applications prennent en charge OpenKeychain pour chiffrer/signer vos communications privées :</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a> : un client Jabber/XMPP</p>
+<p><img src="apps_k9">K-9 Mail : la prise en charge d'OpenKeychain est disponible dans la <a href="https://github.com/k9mail/k-9/releases/tag/4.904">version alpha</a> actuelle !</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-it-rIT/help_changelog.html b/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html
index cb9443a48..b2d67ca80 100644
--- a/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-it-rIT/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>alcune correzioni per i bug di regressione</li>
diff --git a/OpenKeychain/src/main/res/raw-it-rIT/help_start.html b/OpenKeychain/src/main/res/raw-it-rIT/help_start.html
index de6418e5d..77866bc8c 100644
--- a/OpenKeychain/src/main/res/raw-it-rIT/help_start.html
+++ b/OpenKeychain/src/main/res/raw-it-rIT/help_start.html
@@ -6,6 +6,11 @@
<p>Si raccomanda di installare <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> per una migliore selezione dei file e <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> per scansionare i codici QR. I collegamenti verranno aperti in Google Play Store o F-Droid per l'installazione.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-ja/help_changelog.html b/OpenKeychain/src/main/res/raw-ja/help_changelog.html
index c7f943602..4bf40cbc3 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>いくつかのリグレッションバグ修正</li>
@@ -25,7 +33,7 @@
また、以下の人達(アルファベット順)の作ってくれたいくつもののさなパッチや相当数のパッチにも:
Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p>
<ul>
-<li>新しい統合キーリスト</li>
+<li>新しい統合鍵リスト</li>
<li>鍵指紋のカラー化</li>
<li>鍵サーバのポート設定のサポート</li>
<li>弱い鍵の生成が可能だったのを無効化</li>
diff --git a/OpenKeychain/src/main/res/raw-ja/help_start.html b/OpenKeychain/src/main/res/raw-ja/help_start.html
index 13154ce47..502d4adb8 100644
--- a/OpenKeychain/src/main/res/raw-ja/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ja/help_start.html
@@ -6,6 +6,11 @@
<p>ファイルの選択を拡張するには<a href="market://details?id=org.openintents.filemanager">OI File Manager</a>、<a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>を生成したQRコードのスキャンのため、それぞれのインストールを必要とします。 リンクをクリックして、Google Play Store上かF-Droidからインストールしてください。</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</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-ko/help_about.html b/OpenKeychain/src/main/res/raw-ko/help_about.html
new file mode 100644
index 000000000..ae7e16aae
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ko/help_about.html
@@ -0,0 +1,49 @@
+<html>
+<head></head>
+<body>
+<p><a href="http://www.openkeychain.org">http://www.openkeychain.org</a></p>
+<p><a href="http://www.openkeychain.org">OpenKeychain</a> is an OpenPGP implementation for Android.</p>
+<p>License: GPLv3+</p>
+
+<h2>Developers OpenKeychain</h2>
+<ul>
+<li>Dominik Schürmann (Lead developer)</li>
+<li>Ash Hughes (crypto patches)</li>
+<li>Brian C. Barnes</li>
+<li>Bahtiar 'kalkin' Gadimov (UI)</li>
+<li>Daniel Hammann</li>
+<li>Daniel Haß</li>
+<li>Greg Witczak</li>
+<li>Miroojin Bakshi</li>
+<li>Nikhil Peter Raj</li>
+<li>Paul Sarbinowski</li>
+<li>Sreeram Boyapati</li>
+<li>Vincent Breitmoser</li>
+</ul>
+<h2>Developers APG 1.x</h2>
+<ul>
+<li>Thialfihar (Lead developer)</li>
+<li>'Senecaso' (QRCode, sign key, upload key)</li>
+<li>Markus Doits</li>
+</ul>
+<h2>Libraries</h2>
+<ul>
+<li>
+<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v4</a> (Apache License v2)</li>
+<li>
+<a href="http://developer.android.com/tools/support-library/index.html">Android Support Library v7 'appcompat'</a> (Apache License v2)</li>
+<li>
+<a href="https://github.com/emilsjolander/StickyListHeaders">StickyListHeaders</a> (Apache License v2)</li>
+<li>
+<a href="https://github.com/Bearded-Hen/Android-Bootstrap">Android-Bootstrap</a> (MIT License)</li>
+<li>
+<a href="http://code.google.com/p/zxing/">ZXing</a> (Apache License v2)</li>
+<li>
+<a href="http://rtyley.github.com/spongycastle/">SpongyCastle</a> (MIT X11 License)</li>
+<li>
+<a href="https://github.com/dschuermann/html-textview">HtmlTextView</a> (Apache License v2)</li>
+<li>
+<a href="https://github.com/johnkil/Android-AppMsg">Android AppMsg Library</a> (Apache License v2)</li>
+</ul>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ko/help_changelog.html b/OpenKeychain/src/main/res/raw-ko/help_changelog.html
new file mode 100644
index 000000000..ebada67f9
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ko/help_changelog.html
@@ -0,0 +1,156 @@
+<html>
+<head></head>
+<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
+<h2>2.6.1</h2>
+<ul>
+<li>some fixes for regression bugs</li>
+</ul>
+<h2>2.6</h2>
+<ul>
+<li>key certifications (thanks to Vincent Breitmoser)</li>
+<li>support for GnuPG partial secret keys (thanks to Vincent Breitmoser)</li>
+<li>new design for signature verification</li>
+<li>custom key length (thanks to Greg Witczak)</li>
+<li>fix share-functionality from other apps</li>
+</ul>
+<h2>2.5</h2>
+<ul>
+<li>fix decryption of symmetric pgp messages/files</li>
+<li>refactored edit key screen (thanks to Ash Hughes)</li>
+<li>new modern design for encrypt/decrypt screens</li>
+<li>OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)</li>
+</ul>
+<h2>2.4</h2>
+<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
+Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):
+Daniel Hammann, Daniel Haß, Greg Witczak, Miroojin Bakshi, Nikhil Peter Raj, Paul Sarbinowski, Sreeram Boyapati, Vincent Breitmoser.</p>
+<ul>
+<li>new unified key list</li>
+<li>colorized key fingerprint</li>
+<li>support for keyserver ports</li>
+<li>deactivate possibility to generate weak keys</li>
+<li>much more internal work on the API</li>
+<li>certify user ids</li>
+<li>keyserver query based on machine-readable output</li>
+<li>lock navigation drawer on tablets</li>
+<li>suggestions for emails on creation of keys</li>
+<li>search in public key lists</li>
+<li>and much more improvements and fixes…</li>
+</ul>
+<h2>2.3.1</h2>
+<ul>
+<li>hotfix for crash when upgrading from old versions</li>
+</ul>
+<h2>2.3</h2>
+<ul>
+<li>remove unnecessary export of public keys when exporting secret key (thanks to Ash Hughes)</li>
+<li>fix setting expiry dates on keys (thanks to Ash Hughes)</li>
+<li>more internal fixes when editing keys (thanks to Ash Hughes)</li>
+<li>querying keyservers directly from the import screen</li>
+<li>fix layout and dialog style on Android 2.2-3.0</li>
+<li>fix crash on keys with empty user ids</li>
+<li>fix crash and empty lists when coming back from signing screen</li>
+<li>Bouncy Castle (cryptography library) updated from 1.47 to 1.50 and build from source</li>
+<li>fix upload of key from signing screen</li>
+</ul>
+<h2>2.2</h2>
+<ul>
+<li>new design with navigation drawer</li>
+<li>new public key list design</li>
+<li>new public key view</li>
+<li>bug fixes for importing of keys</li>
+<li>key cross-certification (thanks to Ash Hughes)</li>
+<li>handle UTF-8 passwords properly (thanks to Ash Hughes)</li>
+<li>first version with new languages (thanks to the contributors on Transifex)</li>
+<li>sharing of keys via QR Codes fixed and improved</li>
+<li>package signature verification for API</li>
+</ul>
+<h2>2.1.1</h2>
+<ul>
+<li>API Updates, preparation for K-9 Mail integration</li>
+</ul>
+<h2>2.1</h2>
+<ul>
+<li>lots of bug fixes</li>
+<li>new API for developers</li>
+<li>PRNG bug fix by Google</li>
+</ul>
+<h2>2.0</h2>
+<ul>
+<li>complete redesign</li>
+<li>share public keys via qr codes, nfc beam</li>
+<li>sign keys</li>
+<li>upload keys to server</li>
+<li>fixes import issues</li>
+<li>new AIDL API</li>
+</ul>
+<h2>1.0.8</h2>
+<ul>
+<li>basic keyserver support</li>
+<li>app2sd</li>
+<li>more choices for pass phrase cache: 1, 2, 4, 8, hours</li>
+<li>translations: Norwegian (thanks, Sander Danielsen), Chinese (thanks, Zhang Fredrick)</li>
+<li>bugfixes</li>
+<li>optimizations</li>
+</ul>
+<h2>1.0.7</h2>
+<ul>
+<li>fixed problem with signature verification of texts with trailing newline</li>
+<li>more options for pass phrase cache time to live (20, 40, 60 mins)</li>
+</ul>
+<h2>1.0.6</h2>
+<ul>
+<li>account adding crash on Froyo fixed</li>
+<li>secure file deletion</li>
+<li>option to delete key file after import</li>
+<li>stream encryption/decryption (gallery, etc.)</li>
+<li>new options (language, force v3 signatures)</li>
+<li>interface changes</li>
+<li>bugfixes</li>
+</ul>
+<h2>1.0.5</h2>
+<ul>
+<li>German and Italian translation</li>
+<li>much smaller package, due to reduced BC sources</li>
+<li>new preferences GUI</li>
+<li>layout adjustment for localization</li>
+<li>signature bugfix</li>
+</ul>
+<h2>1.0.4</h2>
+<ul>
+<li>fixed another crash caused by some SDK bug with query builder</li>
+</ul>
+<h2>1.0.3</h2>
+<ul>
+<li>fixed crashes during encryption/signing and possibly key export</li>
+</ul>
+<h2>1.0.2</h2>
+<ul>
+<li>filterable key lists</li>
+<li>smarter pre-selection of encryption keys</li>
+<li>new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li>
+<li>fixes and additional features (key preselection) for K-9 Mail, new beta build available</li>
+</ul>
+<h2>1.0.1</h2>
+<ul>
+<li>GMail account listing was broken in 1.0.0, fixed again</li>
+</ul>
+<h2>1.0.0</h2>
+<ul>
+<li>K-9 Mail integration, APG supporting beta build of K-9 Mail</li>
+<li>support of more file managers (including ASTRO)</li>
+<li>Slovenian translation</li>
+<li>new database, much faster, less memory usage</li>
+<li>defined Intents and content provider for other apps</li>
+<li>bugfixes</li>
+</ul>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html b/OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html
new file mode 100644
index 000000000..88492731c
--- /dev/null
+++ b/OpenKeychain/src/main/res/raw-ko/help_nfc_beam.html
@@ -0,0 +1,12 @@
+<html>
+<head></head>
+<body>
+<h2>How to receive keys</h2>
+<ol>
+<li>Go to your partners contacts and open the contact you want to share.</li>
+<li>Hold the two devices back to back (they have to be almost touching) and you’ll feel a vibration.</li>
+<li>After it vibrates you’ll see the content on your partners device turn into a card-like object with Star Trek warp speed-looking animation in the background.</li>
+<li>Tap the card and the content will then load on the your device.</li>
+</ol>
+</body>
+</html>
diff --git a/OpenKeychain/src/main/res/raw-ko/help_start.html b/OpenKeychain/src/main/res/raw-ko/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-ko/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ko/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-nl-rNL/help_changelog.html b/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-nl-rNL/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-nl-rNL/help_start.html b/OpenKeychain/src/main/res/raw-nl-rNL/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-nl-rNL/help_start.html
+++ b/OpenKeychain/src/main/res/raw-nl-rNL/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-pl/help_changelog.html b/OpenKeychain/src/main/res/raw-pl/help_changelog.html
index 9c1e65c92..8fce6c475 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>kilka poprawionych błędów regresji</li>
diff --git a/OpenKeychain/src/main/res/raw-pl/help_start.html b/OpenKeychain/src/main/res/raw-pl/help_start.html
index de157b232..ca10ec4b1 100644
--- a/OpenKeychain/src/main/res/raw-pl/help_start.html
+++ b/OpenKeychain/src/main/res/raw-pl/help_start.html
@@ -6,6 +6,11 @@
<p>Zalecana jest instalacja menadżera plików <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> w celu zapewnienia wygodniejszego wyboru plików oraz programu <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a>, który jest w stanie skanować wygenerowane kody QR. Kliknięcie na powyższe linki przekieruje Cię do sklepu Google Play / F-Droid.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-ru/help_changelog.html b/OpenKeychain/src/main/res/raw-ru/help_changelog.html
index c547a1303..cbd689629 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>исправления найденных ошибок</li>
diff --git a/OpenKeychain/src/main/res/raw-ru/help_start.html b/OpenKeychain/src/main/res/raw-ru/help_start.html
index c0fa7383d..022b80afc 100644
--- a/OpenKeychain/src/main/res/raw-ru/help_start.html
+++ b/OpenKeychain/src/main/res/raw-ru/help_start.html
@@ -6,6 +6,11 @@
<p>Рекомендуется установить <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> для удобного выбора файлов и <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> для распознавания QR кодов. Перейдите по ссылкам на соответствующие страницы Google Play или F-Droid для дальнейшей установки.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</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-sl/help_changelog.html b/OpenKeychain/src/main/res/raw-sl/help_changelog.html
index 8420d43f3..bc282fc66 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-sl/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>popravki hroščev ob posodobitvi iz prejšnjih različic</li>
diff --git a/OpenKeychain/src/main/res/raw-sl/help_start.html b/OpenKeychain/src/main/res/raw-sl/help_start.html
index 7ca44ddb2..2b78e289a 100644
--- a/OpenKeychain/src/main/res/raw-sl/help_start.html
+++ b/OpenKeychain/src/main/res/raw-sl/help_start.html
@@ -6,6 +6,11 @@
<p>Priporočamo, da namestite aplikaciji <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> za boljše delo z datotekami in <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> za skeniranje kod QR. Klik na povezavi bo odprl trgovino Google Play Store ali F-Droid za namestitev.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-tr/help_changelog.html b/OpenKeychain/src/main/res/raw-tr/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-tr/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-tr/help_start.html b/OpenKeychain/src/main/res/raw-tr/help_start.html
index 6c60c1778..6ded872ea 100644
--- a/OpenKeychain/src/main/res/raw-tr/help_start.html
+++ b/OpenKeychain/src/main/res/raw-tr/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-uk/help_changelog.html b/OpenKeychain/src/main/res/raw-uk/help_changelog.html
index 1c07d1cdc..e47c6bf98 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-uk/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-uk/help_start.html b/OpenKeychain/src/main/res/raw-uk/help_start.html
index a3c112bd1..1a4a7fab0 100644
--- a/OpenKeychain/src/main/res/raw-uk/help_start.html
+++ b/OpenKeychain/src/main/res/raw-uk/help_start.html
@@ -6,6 +6,11 @@
<p>Рекомендуємо вам встановити <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> для поліпшеного виділення файлів та <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> для сканування згенерованих штрих-кодів. Натискання посилань відкриє Google Play або F-Droid для встановлення.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!</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-zh/help_changelog.html b/OpenKeychain/src/main/res/raw-zh/help_changelog.html
index f983e2bb1..ebada67f9 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw-zh/help_changelog.html
@@ -1,6 +1,14 @@
<html>
<head></head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw-zh/help_start.html b/OpenKeychain/src/main/res/raw-zh/help_start.html
index 52a8b6f7c..7abb144a0 100644
--- a/OpenKeychain/src/main/res/raw-zh/help_start.html
+++ b/OpenKeychain/src/main/res/raw-zh/help_start.html
@@ -6,6 +6,11 @@
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:</p>
+<p><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations">Conversations</a>: Jabber/XMPP client</p>
+<p><img src="apps_k9">K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</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/help_about.html b/OpenKeychain/src/main/res/raw/help_about.html
index 847168446..a9178d515 100644
--- a/OpenKeychain/src/main/res/raw/help_about.html
+++ b/OpenKeychain/src/main/res/raw/help_about.html
@@ -23,6 +23,7 @@ And don't add newlines before or after p tags because of transifex -->
<li>Paul Sarbinowski</li>
<li>Sreeram Boyapati</li>
<li>Vincent Breitmoser</li>
+<li>Tim Bray</li>
</ul>
<h2>Developers APG 1.x</h2>
diff --git a/OpenKeychain/src/main/res/raw/help_changelog.html b/OpenKeychain/src/main/res/raw/help_changelog.html
index dd3c0e81a..779aa696f 100644
--- a/OpenKeychain/src/main/res/raw/help_changelog.html
+++ b/OpenKeychain/src/main/res/raw/help_changelog.html
@@ -5,6 +5,15 @@ And don't add newlines before or after p tags because of transifex -->
<head>
</head>
<body>
+<h2>2.7</h2>
+<ul>
+<li>Purple! (Dominik, Vincent)</li>
+<li>New key view design (Dominik, Vincent)</li>
+<li>New flat Android buttons (Dominik, Vincent)</li>
+<li>API fixes (Dominik)</li>
+<li>Keybase.io import (Tim Bray)</li>
+</ul>
+
<h2>2.6.1</h2>
<ul>
<li>some fixes for regression bugs</li>
diff --git a/OpenKeychain/src/main/res/raw/help_start.html b/OpenKeychain/src/main/res/raw/help_start.html
index 4b2bdf722..26386d3d4 100644
--- a/OpenKeychain/src/main/res/raw/help_start.html
+++ b/OpenKeychain/src/main/res/raw/help_start.html
@@ -10,6 +10,12 @@ And don't add newlines before or after p tags because of transifex -->
<p>It is recommended that you install <a href="market://details?id=org.openintents.filemanager">OI File Manager</a> for enhanced file selection and <a href="market://details?id=com.google.zxing.client.android">Barcode Scanner</a> to scan generated QR Codes. Clicking on the links will open Google Play Store or F-Droid for installation.</p>
+<h2>Applications</h2>
+<p>Several applications support OpenKeychain to encrypt/sign your private communication:
+<br/><img src="apps_k9"/><br/>K-9 Mail: OpenKeychain support available in current <a href="https://github.com/k9mail/k-9/releases/tag/4.904">alpha build</a>!
+<br/><a href="market://details?id=eu.siacs.conversations"><img src="apps_conversations"/><br/>Conversations</a>: Jabber/XMPP client
+<br/><a href="market://details?id=org.lf_net.pgpunlocker"><img src="apps_pgpauth"/><br/>PGPAuth</a>: App to send a PGP-signed request to a server to open or close $thing</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-cs-rCZ/strings.xml b/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml
index 204b28c38..c3d7cc4c9 100644
--- a/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml
+++ b/OpenKeychain/src/main/res/values-cs-rCZ/strings.xml
@@ -19,7 +19,6 @@
<string name="title_send_key">Nahrát na server s klíči</string>
<string name="title_help">Nápověda</string>
<!--section-->
- <string name="section_keys">Klíče</string>
<!--button-->
<!--menu-->
<!--label-->
@@ -44,6 +43,6 @@
<!--Key view-->
<!--Navigation Drawer-->
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<!--unsorted-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 801e3cc42..61d4fc642 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -13,7 +13,9 @@
<string name="title_key_server_preference">Schlüsselserver</string>
<string name="title_change_passphrase">Passphrase ändern</string>
<string name="title_set_passphrase">Passwort setzen</string>
- <string name="title_share_with">Teilen mit...</string>
+ <string name="title_share_with">Teilen über...</string>
+ <string name="title_share_fingerprint_with">Teile Fingerabdruck über…</string>
+ <string name="title_share_key">Teile Schlüssel über...</string>
<string name="title_share_file">Datei teilen mit…</string>
<string name="title_encrypt_to_file">In eine Datei verschlüsseln</string>
<string name="title_decrypt_to_file">In eine Datei entschlüsseln</string>
@@ -22,28 +24,32 @@
<string name="title_export_keys">Schlüssel exportieren</string>
<string name="title_key_not_found">Schlüssel nicht gefunden</string>
<string name="title_send_key">Auf Schlüsselserver hochladen</string>
- <string name="title_certify_key">Schlüssel beglaubigen</string>
+ <string name="title_certify_key">Identitäten beglaubigen</string>
<string name="title_key_details">Schlüsseldetails</string>
<string name="title_help">Hilfe</string>
<!--section-->
- <string name="section_user_ids">Benutzer-IDs</string>
- <string name="section_keys">Schlüssel</string>
+ <string name="section_user_ids">Identitäten</string>
+ <string name="section_keys">Unterschlüssel</string>
<string name="section_general">Allgemein</string>
<string name="section_defaults">Standardwerte</string>
<string name="section_advanced">Fortgeschrittene Einstellungen</string>
<string name="section_master_key">Hauptschlüssel</string>
- <string name="section_master_user_id">Hauptbenutzer-ID</string>
+ <string name="section_master_user_id">Hauptidentität</string>
<string name="section_actions">Aktionen</string>
+ <string name="section_share_key">Gesamter Schlüssel</string>
<string name="section_certification_key">Mit diesem Schlüssel beglaubigen</string>
<string name="section_upload_key">Schlüssel hochladen</string>
<string name="section_key_server">Schlüsselserver</string>
<string name="section_encrypt_and_or_sign">Verschlüsseln und/oder Signieren</string>
<string name="section_decrypt_verify">Entschlüsseln und Verifizieren</string>
+ <string name="section_fingerprint">Fingerabdruck</string>
+ <string name="section_key_to_certify">Zu beglaubigender Schlüssel</string>
<!--button-->
<string name="btn_certify">Beglaubigen</string>
- <string name="btn_decrypt_verify">Entschlüsseln und Verifizieren</string>
+ <string name="btn_decrypt_verify_file">Datei entschlüsseln, verifizieren und speichern</string>
+ <string name="btn_decrypt_verify_message">Entschlüsseln und verifizieren</string>
<string name="btn_decrypt_verify_clipboard">Aus der Zwischenablage</string>
- <string name="btn_encrypt_file">Datei verschlüsseln</string>
+ <string name="btn_encrypt_file">Datei verschlüsseln und speichern</string>
<string name="btn_save">Speichern</string>
<string name="btn_do_not_save">Abbrechen</string>
<string name="btn_delete">Löschen</string>
@@ -59,6 +65,8 @@
<string name="btn_lookup_key">Schlüssel nachschlagen</string>
<string name="btn_encryption_advanced_settings_show">Erweiterte Einstellungen anzeigen</string>
<string name="btn_encryption_advanced_settings_hide">Erweiterte Einstellungen verbergen</string>
+ <string name="btn_share_encrypted_signed">Verschlüsselt/signierten Text teilen…</string>
+ <string name="btn_view_cert_key">Beglaubigungsschlüssel anzeigen</string>
<!--menu-->
<string name="menu_preferences">Einstellungen</string>
<string name="menu_help">Hilfe</string>
@@ -71,6 +79,7 @@
<string name="menu_create_key_expert">Schlüssel erstellen (Experte)</string>
<string name="menu_search">Suchen</string>
<string name="menu_import_from_key_server">Schlüsselserver</string>
+ <string name="menu_import_from_keybase">Keybase.io</string>
<string name="menu_key_server">Schlüsselserver…</string>
<string name="menu_update_key">Von einem Schlüsselserver aktualisieren</string>
<string name="menu_export_key_to_server">Auf Schlüsselserver hochladen</string>
@@ -116,7 +125,7 @@
<string name="label_expiry">Ablaufdatum</string>
<string name="label_usage">Verwendungszweck</string>
<string name="label_key_size">Schlüssellänge</string>
- <string name="label_main_user_id">Hauptbenutzer-ID</string>
+ <string name="label_main_user_id">Hauptidentität</string>
<string name="label_name">Name</string>
<string name="label_comment">Kommentar</string>
<string name="label_email">E-Mail</string>
@@ -136,11 +145,15 @@
<string name="can_certify">kann bestätigen</string>
<string name="can_certify_not">kann nicht bestätigen</string>
<string name="expired">abgelaufen</string>
- <string name="revoked">zurückgezogen</string>
+ <string name="revoked">widerrufen</string>
<plurals name="n_keys">
<item quantity="one">1 Schlüssel</item>
<item quantity="other">%d Schlüssel</item>
</plurals>
+ <plurals name="n_keyservers">
+ <item quantity="one">%d Schlüsselserver</item>
+ <item quantity="other">%d Schlüsselserver</item>
+ </plurals>
<string name="secret_key">Privater Schlüssel:</string>
<!--choice-->
<string name="choice_none">Keine</string>
@@ -190,7 +203,7 @@
<string name="key_deletion_confirmation_multi">Möchtest du wirklich alle ausgewählten öffentlichen Schlüssel löschen?\nDies kann nicht rückgängig gemacht werden!</string>
<string name="secret_key_deletion_confirmation">Soll der PRIVATE Schlüssel \'%s\' wirklich gelöscht werden?\nDies kann nicht rückgängig gemacht werden!</string>
<string name="ask_save_changed_key">Es wurden am Schlüsselbund Veränderungen vorgenommen. Sollen dies gespeichert werden?</string>
- <string name="ask_empty_id_ok">Es wurde eine leere Nutzer ID hinzugefügt. Sind sie sicher das sie forfahren wollen?</string>
+ <string name="ask_empty_id_ok">Es wurde eine leere Identität hinzugefügt. Wirklich fortfahren?</string>
<string name="public_key_deletetion_confirmation">Soll der öffentliche Schlüssel \'%s\' wirklich gelöscht werden?\nDies kann nicht rückgängig gemacht werden! </string>
<string name="also_export_secret_keys">Private Schlüssel auch exportieren</string>
<plurals name="keys_added_and_updated_1">
@@ -225,11 +238,13 @@
<item quantity="other">%d schlechte private Schlüssel ignoriert. Evtl. wurden sie mit folgender Option exportiert:\n --export-secret-subkeys\nUnbedingt mit der Option \n --export-secret-keys\nexportieren.</item>
</plurals>
<string name="key_send_success">Schlüssel wurde erfolgreich hochgeladen.</string>
- <string name="key_certify_success">Schlüssel erfolgreich beglaubigt</string>
+ <string name="key_certify_success">Identitäten erfolgreich beglaubigt</string>
<string name="list_empty">Diese Liste ist leer!</string>
+ <string name="nfc_successful">Schlüssel erfolgreich mit NFC-Beam gesendet!</string>
<string name="key_copied_to_clipboard">Schlüssel wurde in die Zwischenablage kopiert!</string>
+ <string name="fingerprint_copied_to_clipboard">Fingerabdruck wurde in die Zwischenablage kopiert!</string>
<string name="key_has_already_been_certified">Schlüssel wurde bereits beglaubigt</string>
- <string name="select_key_to_sign">Bitte wähle einen Signaturschlüssel!</string>
+ <string name="select_key_to_certify">Bitte wähle einen Schlüssel um zu Beglaubigen!</string>
<string name="key_too_big_for_sharing">Schlüssel ist zu groß um so geteilt zu werden!</string>
<!--errors
no punctuation, all lowercase,
@@ -242,8 +257,8 @@
<string name="error_master_key_must_not_be_el_gamal">Der Hauptschlüssel kann kein ElGamal Schlüssel sein</string>
<string name="error_unknown_algorithm_choice">Unbekannte Auswahl für Algorithmus</string>
<string name="error_user_id_no_email">keine E-Mail gefunden</string>
- <string name="error_key_needs_a_user_id">Mindestens eine Benutzer-ID wird benötigt</string>
- <string name="error_main_user_id_must_not_be_empty">Hauptbenutzer-ID darf nicht leer sein</string>
+ <string name="error_key_needs_a_user_id">Mindestens eine Identität wird benötigt</string>
+ <string name="error_main_user_id_must_not_be_empty">Hauptidentität darf nicht leer sein</string>
<string name="error_key_needs_master_key">Mindestens ein Hauptschlüssel wird benötigt</string>
<string name="error_no_signature_passphrase">kein Passwort angegeben</string>
<string name="error_no_signature_key">kein Signaturschlüssel angegeben</string>
@@ -324,8 +339,8 @@
<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">Individuelle Schlüsselgröße</string>
- <string name="key_size_custom_info">Geben Sie benutzerdefinierte Schlüssellänge an (in Bit):</string>
+ <string name="key_size_custom">Benutzerdefinierte Schlüssellänge</string>
+ <string name="key_size_custom_info">Benutzerdefinierte Schlüssellänge (in Bit):</string>
<string name="key_size_custom_info_rsa">Die RSA-Schlüssellänge muss größer als 1024 sein und höchstens 8192 sein. Auch muss sie ein Mehrfaches von 8 sein.</string>
<string name="key_size_custom_info_dsa">Die DSA-Schlüssellänge muss mindestens 512 und höchstens 1024 sein. Auch muss sie ein Mehrfaches von 64 sein.</string>
<!--compression-->
@@ -355,12 +370,11 @@
<string name="import_nfc_help_button">Hilfe</string>
<string name="import_clipboard_button">Schlüssel aus der Zwischenablage einfügen</string>
<!--Intent labels-->
- <string name="intent_decrypt_file">Datei mit OpenKeychain entschlüsseln</string>
- <string name="intent_import_key">Schlüssel mit OpenKeychain importieren</string>
- <string name="intent_send_encrypt">Mit OpenKeychain verschlüsseln</string>
- <string name="intent_send_decrypt">Mit OpenKeychain entschlüsseln</string>
+ <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 Anwendungen vorhanden!\n\nAnwendungen können Zugriff auf OpenKeychain anfordern. Nachdem Zugriff erlaubt wurde, werden diese hier aufgelistet.</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>
@@ -376,12 +390,13 @@
<string name="api_settings_package_signature">SHA-256 der Paketsignatur</string>
<string name="api_settings_accounts">Konten</string>
<string name="api_settings_accounts_empty">Keine Accounts mit dieser App verknüpft.</string>
+ <string name="api_create_account_text">Die Anwendung erfordert die Erstellung eines neuen Accounts. Bitte wähle einen existierenden Schlüssel oder erstelle einen neuen.\nAnwendungen sind auf die Nutzung der Schlüssel beschränkt, die du hier auswählst!</string>
<string name="api_register_text">Folgende Anwendung beantragt Zugriff auf OpenKeychains API.\nZugriff erlauben?\n\nVORSICHT: Sollten Sie nicht wissen, warum diese Anfrage erscheint, sollten Sie den Zugriff nicht erlauben! Sie können Zugriffe später über das Menü \'Registrierte Anwendungen\' widerrufen.</string>
<string name="api_register_allow">Zugriff erlauben</string>
<string name="api_register_disallow">Zugriff verbieten</string>
<string name="api_register_error_select_key">Bitte einen Schlüssel auswählen!</string>
- <string name="api_select_pub_keys_missing_text">Für diese Benutzer-IDs wurden keine öffentlichen Schlüssel gefunden:</string>
- <string name="api_select_pub_keys_dublicates_text">Für diese Benutzer-IDs existieren mehrere öffentliche Schlüssel:</string>
+ <string name="api_select_pub_keys_missing_text">Für diese Identität wurden keine öffentlichen Schlüssel gefunden:</string>
+ <string name="api_select_pub_keys_dublicates_text">Für diese Identität existieren mehrere öffentliche Schlüssel:</string>
<string name="api_select_pub_keys_text">Bitte die Liste der Empfänger überprüfen!</string>
<string name="api_error_wrong_signature">Signaturüberprüfung fehlgeschlagen! Haben Sie diese Anwendung aus einer anderen Quelle installiert? Wenn Sie eine Attacke ausschliessen können, sollten Sie die Registrierung der App in OpenKeychain widerrufen und die Anwendung erneut registrieren.</string>
<!--Share-->
@@ -401,10 +416,14 @@
<string name="key_list_empty_button_create">deinen eigenen Schlüssel erstellst</string>
<string name="key_list_empty_button_import">existierende Schlüssel importierst.</string>
<!--Key view-->
- <string name="key_view_action_edit">Diesen Schlüssel bearbeiten</string>
+ <string name="key_view_action_edit">Schlüssel bearbeiten</string>
<string name="key_view_action_encrypt">Mit diesem Schlüssel verschlüsseln</string>
- <string name="key_view_action_certify">Diesen Schlüssel beglaubigen</string>
- <string name="key_view_tab_main">Info</string>
+ <string name="key_view_action_certify">Identitäten beglaubigen</string>
+ <string name="key_view_action_share_with">Teilen über...</string>
+ <string name="key_view_action_share_nfc">Teilen über NFC (Geräte Rückseite an Rückseite halten)</string>
+ <string name="key_view_tab_main">Informationen</string>
+ <string name="key_view_tab_share">Teilen</string>
+ <string name="key_view_tab_keys">Unterschlüssel</string>
<string name="key_view_tab_certs">Beglaubigungen</string>
<!--Navigation Drawer-->
<string name="nav_keys">Schlüssel</string>
@@ -420,30 +439,35 @@
<string name="secret_key_yes">verfügbar</string>
<string name="secret_key_no">nicht verfügbar</string>
<!--hints-->
- <string name="encrypt_content_edit_text_hint">Hier die Nachricht schreiben welche verschlüsselt und/oder signiert werden soll...</string>
- <string name="decrypt_content_edit_text_hint">Hier den verslüsselten Text eingeben um ihn zu entschlüsseln und/oder zu überprüfen</string>
- <!--certifications-->
- <string name="cert_default">Grundeinstellung</string>
+ <string name="encrypt_content_edit_text_hint">Hier den Text schreiben welche verschlüsselt und/oder signiert werden soll...</string>
+ <string name="decrypt_content_edit_text_hint">Hier den verschlüsselten Text eingeben um ihn zu entschlüsseln und/oder zu verifzieren…</string>
+ <!--certs-->
+ <string name="cert_default">normal</string>
<string name="cert_none">kein</string>
+ <string name="cert_casual">einfach überprüft</string>
<string name="cert_positive">positiv</string>
- <string name="cert_revoke">Wiederrufen</string>
+ <string name="cert_revoke">widerrufen</string>
<string name="cert_verify_ok">OK</string>
<string name="cert_verify_failed">fehlgeschlagen!</string>
<string name="cert_verify_error">Fehler!</string>
<string name="cert_verify_unavailable">Schlüssel nicht verfügbar</string>
<!--unsorted-->
- <string name="section_signer_id">Unterzeichner</string>
+ <string name="section_certifier_id">Beglaubiger</string>
<string name="section_cert">Zertifikatdetails</string>
- <string name="label_user_id">Nutzer ID</string>
+ <string name="label_user_id">Identität</string>
<string name="unknown_uid">&lt;unbekannt&gt;</string>
- <string name="empty_certs">Kein Zertifikat für diesen Schlüssel</string>
- <string name="section_uids_to_sign">Benutzer-IDs, die beglaubigt werden sollen</string>
+ <string name="empty_certs">Keine Beglaubigungen für diesen Schlüssel</string>
+ <string name="section_uids_to_certify">Zu beglaubigende Identitäten</string>
<string name="label_revocation">Widerrufsgrund</string>
- <string name="label_verify_status">Verificationsstatus</string>
+ <string name="label_verify_status">Verifikationsstatus</string>
<string name="label_cert_type">Typ</string>
<string name="error_key_not_found">Schlüssel nicht gefunden!</string>
<string name="error_key_processing">Fehler bei der Verarbeitung des Schlüssels!</string>
<string name="no_subkey">Unterschlüssel nicht verfügbar</string>
+ <string name="key_stripped">nicht verfügbar</string>
<string name="secret_cannot_multiple">Geheime Schlüssel können nur einzeln gelöscht werden!</string>
<string name="title_view_cert">Zertifikatdetails anzeigen</string>
+ <string name="unknown_algorithm">unbekannt</string>
+ <string name="can_sign_not">Kann nicht unterschreiben</string>
+ <string name="error_no_encrypt_subkey">Kein Unterschlüssel zum Verschlüsseln verfügbar!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-el/strings.xml b/OpenKeychain/src/main/res/values-el/strings.xml
index e5ba3e0b9..9a9e74223 100644
--- a/OpenKeychain/src/main/res/values-el/strings.xml
+++ b/OpenKeychain/src/main/res/values-el/strings.xml
@@ -48,6 +48,6 @@
<!--Key view-->
<!--Navigation Drawer-->
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<!--unsorted-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index 207503b3f..dd628f87a 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -14,6 +14,8 @@
<string name="title_change_passphrase">Cambiar frase de contraseña</string>
<string name="title_set_passphrase">Establecer frase de contraseña</string>
<string name="title_share_with">Compartir con...</string>
+ <string name="title_share_fingerprint_with">Compartir huella de validación de clave con...</string>
+ <string name="title_share_key">Compartir clave con...</string>
<string name="title_share_file">Compartir fichero con...</string>
<string name="title_encrypt_to_file">Cifrar hacia archivo</string>
<string name="title_decrypt_to_file">Descifrar hacia archivo</string>
@@ -22,28 +24,32 @@
<string name="title_export_keys">Exportar claves</string>
<string name="title_key_not_found">Clave no encontrada</string>
<string name="title_send_key">Cargar al servidor de claves</string>
- <string name="title_certify_key">Certificar clave</string>
+ <string name="title_certify_key">Certificar identidades</string>
<string name="title_key_details">Detalles de la clave</string>
<string name="title_help">Ayuda</string>
<!--section-->
- <string name="section_user_ids">IDs de usuario</string>
- <string name="section_keys">Claves</string>
+ <string name="section_user_ids">Identidades</string>
+ <string name="section_keys">Subclaves</string>
<string name="section_general">General</string>
<string name="section_defaults">Predeterminados</string>
<string name="section_advanced">Avanzado</string>
<string name="section_master_key">Clave maestra</string>
- <string name="section_master_user_id">ID del usuario principal</string>
+ <string name="section_master_user_id">Identidad primaria</string>
<string name="section_actions">Acciones</string>
+ <string name="section_share_key">Clave completa</string>
<string name="section_certification_key">Tu clave usada para las certificaciones</string>
<string name="section_upload_key">Cargar clave</string>
<string name="section_key_server">Servidor de claves</string>
<string name="section_encrypt_and_or_sign">Cifrar y/o firmar</string>
<string name="section_decrypt_verify">Descifrar y verificar</string>
+ <string name="section_fingerprint">Huella de validación de clave</string>
+ <string name="section_key_to_certify">Clave a ser certificada</string>
<!--button-->
<string name="btn_certify">Certificar</string>
- <string name="btn_decrypt_verify">Descifrar y verificar</string>
+ <string name="btn_decrypt_verify_file">Descifrar, verificar, y guardar fichero</string>
+ <string name="btn_decrypt_verify_message">Descifrar y verificar mensaje</string>
<string name="btn_decrypt_verify_clipboard">Desde el portapapeles</string>
- <string name="btn_encrypt_file">Cifrar archivo</string>
+ <string name="btn_encrypt_file">Cifrar y guardar fichero</string>
<string name="btn_save">Guardar</string>
<string name="btn_do_not_save">Cancelar</string>
<string name="btn_delete">Eliminar</string>
@@ -59,6 +65,8 @@
<string name="btn_lookup_key">Buscar clave</string>
<string name="btn_encryption_advanced_settings_show">Mostrar ajustes avanzados</string>
<string name="btn_encryption_advanced_settings_hide">Ocultar ajustes avanzados</string>
+ <string name="btn_share_encrypted_signed">Compartir mensaje cifrado/firmado...</string>
+ <string name="btn_view_cert_key">Ver clave de verificación</string>
<!--menu-->
<string name="menu_preferences">Ajustes</string>
<string name="menu_help">Ayuda</string>
@@ -71,6 +79,7 @@
<string name="menu_create_key_expert">Crear clave (experto)</string>
<string name="menu_search">Buscar</string>
<string name="menu_import_from_key_server">Servidor de claves...</string>
+ <string name="menu_import_from_keybase">Importar desde Keybase.io</string>
<string name="menu_key_server">Servidor de claves...</string>
<string name="menu_update_key">Actualizar desde servidor de claves</string>
<string name="menu_export_key_to_server">Cargar al servidor de claves</string>
@@ -116,7 +125,7 @@
<string name="label_expiry">Caducidad</string>
<string name="label_usage">Uso</string>
<string name="label_key_size">Tamaño de clave</string>
- <string name="label_main_user_id">ID del usuario principal</string>
+ <string name="label_main_user_id">Identidad primaria</string>
<string name="label_name">Nombre</string>
<string name="label_comment">Comentario</string>
<string name="label_email">Email</string>
@@ -194,7 +203,7 @@
<string name="key_deletion_confirmation_multi">¿De veras quiere borrar todas las claves públicas seleccionadas?\n¡No puede deshacer esto!</string>
<string name="secret_key_deletion_confirmation">¿Quieres realmente borrar la clave SECRETA \'%s\'?\n¡No podrás deshacerlo!</string>
<string name="ask_save_changed_key">Has hecho cambios en el almacén de claves, ¿quieres guardarlos?</string>
- <string name="ask_empty_id_ok">Has añadido una ID de usuario vacía, ¿Estás seguro que quieres continuar?</string>
+ <string name="ask_empty_id_ok">Ha añadido una identidad vacía, ¿está seguro de que quiere continuar?</string>
<string name="public_key_deletetion_confirmation">¿De veras quiere borrar la clave pública \'%s\'?\n¡No puede deshacer esto!</string>
<string name="also_export_secret_keys">¿Exportar también las claves secretas?</string>
<plurals name="keys_added_and_updated_1">
@@ -229,12 +238,13 @@
<item quantity="other">%d malas claves secretas ignoradas. Quizás hayas exportado con la opción\n--export-secret-subkeys\nAsegúrate de que exportas con\n--export-secret-keys\nen su lugar.</item>
</plurals>
<string name="key_send_success">Clave cargada al servidor satisfactoriamente</string>
- <string name="key_certify_success">Clave certificada con éxito</string>
+ <string name="key_certify_success">Identidades certificadas con éxito</string>
<string name="list_empty">¡Esta lista está vacía!</string>
<string name="nfc_successful">¡Clave enviada con éxito vía NFC Beam (haz NFC)!</string>
<string name="key_copied_to_clipboard">¡La clave ha sido copiada al portapapeles!</string>
+ <string name="fingerprint_copied_to_clipboard">¡La huella de validación de clave se ha copiado al portapapeles!</string>
<string name="key_has_already_been_certified">¡La clave ya ha sido certificada!</string>
- <string name="select_key_to_sign">¡Por favor, selecciona la clave que se usará para firmar!</string>
+ <string name="select_key_to_certify">Por favor ¡seleccione una clave para ser usada en certificación!</string>
<string name="key_too_big_for_sharing">¡La clave es demasiado grande para ser compartida de esta forma!</string>
<!--errors
no punctuation, all lowercase,
@@ -247,8 +257,8 @@
<string name="error_master_key_must_not_be_el_gamal">la clave maestra no puede ser una clave ElGamal</string>
<string name="error_unknown_algorithm_choice">elegido algoritmo desconocido</string>
<string name="error_user_id_no_email">no se ha encontrado un email</string>
- <string name="error_key_needs_a_user_id">necesitas al menos una ID de usuario</string>
- <string name="error_main_user_id_must_not_be_empty">la ID del usuario principal no puede estar vacía</string>
+ <string name="error_key_needs_a_user_id">necesita al menos una identidad</string>
+ <string name="error_main_user_id_must_not_be_empty">la identidad primaria no debe estar vacía</string>
<string name="error_key_needs_master_key">necesitas al menos una clave maestra</string>
<string name="error_no_signature_passphrase">no has proporcionado una frase de contraseña</string>
<string name="error_no_signature_key">no has proporcionado una clave de firma</string>
@@ -320,6 +330,7 @@
<string name="hint_public_keys">Buscar claves públicas</string>
<string name="hint_secret_keys">Buscar claves secretas</string>
<string name="action_share_key_with">Compartir la clave con...</string>
+ <string name="hint_keybase_search">Buscar en Keybase.io</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -359,13 +370,14 @@
<string name="import_nfc_text">Para recibir las claves a través de NFC, el dispositivo tiene que estar desbloqueado.</string>
<string name="import_nfc_help_button">Ayuda</string>
<string name="import_clipboard_button">Tomar la clave desde el portapapeles</string>
+ <string name="import_keybase_button">Obtener clave desde Keybase.io</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Descifrar archivo con OpenKeychain</string>
<string name="intent_import_key">Importar clave con OpenKeychain</string>
<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\nLas aplicaciones de terceros pueden pedir permiso de acceso a OpenKeychain. Después de obtener acceso, serán enumeradas aquí.</string>
+ <string name="api_no_apps">¡No hay aplicaciones registradas!\n\n¡Una lista de aplicaciones soportadas de terceros puede encontrarse en \'Ayuda\'!</string>
<string name="api_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>
@@ -376,6 +388,7 @@
<string name="api_settings_save">Guardar</string>
<string name="api_settings_cancel">Cancelar</string>
<string name="api_settings_revoke">Revocar acceso</string>
+ <string name="api_settings_start">Iniciar aplicación</string>
<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>
@@ -386,8 +399,8 @@
<string name="api_register_allow">Permitir el acceso</string>
<string name="api_register_disallow">Denegar el acceso</string>
<string name="api_register_error_select_key">¡Por favor, selecciona una clave!</string>
- <string name="api_select_pub_keys_missing_text">No se han encontrado claves públicas para estas IDs de usuario:</string>
- <string name="api_select_pub_keys_dublicates_text">Existe más de una clave pública para estos IDs de usuario:</string>
+ <string name="api_select_pub_keys_missing_text">No se encontraron claves públicas para estas identidades:</string>
+ <string name="api_select_pub_keys_dublicates_text">Existe más de una clave pública para estas identidades:</string>
<string name="api_select_pub_keys_text">¡Por favor, revisa la lista de destinatarios!</string>
<string name="api_error_wrong_signature">¡La comprobación de la firma ha fallado! ¿Has instalado esta app desde una fuente distinta? Si estás seguro de que esto no es un ataque, revoca el registro de esta app en OpenKeychain y regístrala de nuevo.</string>
<!--Share-->
@@ -407,11 +420,15 @@
<string name="key_list_empty_button_create">crear tu propia clave</string>
<string name="key_list_empty_button_import">importar claves</string>
<!--Key view-->
- <string name="key_view_action_edit">Editar esta clave</string>
+ <string name="key_view_action_edit">Editar clave</string>
<string name="key_view_action_encrypt">Cifrar con esta clave</string>
- <string name="key_view_action_certify">Certificar esta clave</string>
- <string name="key_view_tab_main">Información</string>
- <string name="key_view_tab_certs">Certificaciones</string>
+ <string name="key_view_action_certify">Certificar identidades</string>
+ <string name="key_view_action_share_with">Compartir con...</string>
+ <string name="key_view_action_share_nfc">Compartir sobre NFC juntando los dispositivos por el reverso</string>
+ <string name="key_view_tab_main">Información principal</string>
+ <string name="key_view_tab_share">Compartir</string>
+ <string name="key_view_tab_keys">Subclaves</string>
+ <string name="key_view_tab_certs">Certificados</string>
<!--Navigation Drawer-->
<string name="nav_keys">Claves</string>
<string name="nav_encrypt">Firmar y cifrar</string>
@@ -428,23 +445,23 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Escribe aquí el mensaje que quieras cifrar y/o firmar...</string>
<string name="decrypt_content_edit_text_hint">Introduce aquí el texto cifrado para descifrarlo y/o verificarlo...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">predeterminado</string>
<string name="cert_none">ninguno</string>
<string name="cert_casual">casual</string>
<string name="cert_positive">positivo</string>
- <string name="cert_revoke">revocar</string>
+ <string name="cert_revoke">revocada</string>
<string name="cert_verify_ok">correcto</string>
<string name="cert_verify_failed">¡falló!</string>
<string name="cert_verify_error">¡error!</string>
<string name="cert_verify_unavailable">clave no disponible</string>
<!--unsorted-->
- <string name="section_signer_id">Firmante</string>
+ <string name="section_certifier_id">Certificador</string>
<string name="section_cert">Detalles del certificado</string>
- <string name="label_user_id">Identificador del usuario</string>
+ <string name="label_user_id">Identidad</string>
<string name="unknown_uid">&lt;desconocido&gt;</string>
<string name="empty_certs">No hay certificados para esta clave</string>
- <string name="section_uids_to_sign">IDs de usuario para firmar</string>
+ <string name="section_uids_to_certify">Identidades a certificar</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>
@@ -456,4 +473,5 @@
<string name="title_view_cert">Ver detalles del certificado</string>
<string name="unknown_algorithm">desconocido</string>
<string name="can_sign_not">no puede firmarse</string>
+ <string name="error_no_encrypt_subkey">¡No hay subclave de cifrado disponible!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-et/strings.xml b/OpenKeychain/src/main/res/values-et/strings.xml
index 62172f138..3b18bd0df 100644
--- a/OpenKeychain/src/main/res/values-et/strings.xml
+++ b/OpenKeychain/src/main/res/values-et/strings.xml
@@ -19,8 +19,6 @@
<string name="title_send_key">Lae võtmeserverisse</string>
<string name="title_help">Abi</string>
<!--section-->
- <string name="section_user_ids">Kasutaja ID-d</string>
- <string name="section_keys">Võtmed</string>
<string name="section_general">Üldine</string>
<string name="section_defaults">Vaikeseaded</string>
<!--button-->
@@ -103,6 +101,6 @@
<!--Key view-->
<!--Navigation Drawer-->
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<!--unsorted-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-fa-rIR/strings.xml b/OpenKeychain/src/main/res/values-fa-rIR/strings.xml
index 10047ae91..e3d3a6493 100644
--- a/OpenKeychain/src/main/res/values-fa-rIR/strings.xml
+++ b/OpenKeychain/src/main/res/values-fa-rIR/strings.xml
@@ -26,6 +26,6 @@
<!--Key view-->
<!--Navigation Drawer-->
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<!--unsorted-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index fa45c789d..575ce8085 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -14,6 +14,8 @@
<string name="title_change_passphrase">Modifier la phrase de passe</string>
<string name="title_set_passphrase">Définir la phrase de passe</string>
<string name="title_share_with">Partager avec...</string>
+ <string name="title_share_fingerprint_with">Partager l\'empreinte avec...</string>
+ <string name="title_share_key">Partager la clef avec...</string>
<string name="title_share_file">Partager le fichier avec...</string>
<string name="title_encrypt_to_file">Chiffrer vers un fichier</string>
<string name="title_decrypt_to_file">Déchiffrer vers un fichier</string>
@@ -22,28 +24,32 @@
<string name="title_export_keys">Exporter les clefs</string>
<string name="title_key_not_found">Clef introuvable</string>
<string name="title_send_key">Téléverser vers le serveur de clefs</string>
- <string name="title_certify_key">Certifier la clef</string>
+ <string name="title_certify_key">Certifier les identités</string>
<string name="title_key_details">Détails sur la clef</string>
<string name="title_help">Aide</string>
<!--section-->
- <string name="section_user_ids">IDs utilisateurs</string>
- <string name="section_keys">Clefs</string>
+ <string name="section_user_ids">identités</string>
+ <string name="section_keys">Sous-clefs</string>
<string name="section_general">Général</string>
<string name="section_defaults">Valeurs par défaut</string>
<string name="section_advanced">Avancé</string>
<string name="section_master_key">Clef maîtresse</string>
- <string name="section_master_user_id">ID utilisateur maître</string>
+ <string name="section_master_user_id">Identité principale</string>
<string name="section_actions">Actions</string>
+ <string name="section_share_key">Clef entière</string>
<string name="section_certification_key">Votre clef utilisée pour la certification</string>
<string name="section_upload_key">Téléverser la clef</string>
<string name="section_key_server">Serveur de clefs</string>
<string name="section_encrypt_and_or_sign">Chiffrer et/ou signer</string>
<string name="section_decrypt_verify">Déchiffrer et vérifier</string>
+ <string name="section_fingerprint">Empreinte</string>
+ <string name="section_key_to_certify">Clef à certifier !</string>
<!--button-->
<string name="btn_certify">Certifier</string>
- <string name="btn_decrypt_verify">Déchiffrer et vérifier</string>
+ <string name="btn_decrypt_verify_file">Déchiffrer, vérifier et enregistrer le fichier</string>
+ <string name="btn_decrypt_verify_message">Déchiffrer et enregistrer le message</string>
<string name="btn_decrypt_verify_clipboard">À partir du presse-papiers</string>
- <string name="btn_encrypt_file">Chiffrer le fichier</string>
+ <string name="btn_encrypt_file">Chiffrer et enregistrer le fichier</string>
<string name="btn_save">Enregistrer</string>
<string name="btn_do_not_save">Annuler</string>
<string name="btn_delete">Supprimer</string>
@@ -59,6 +65,8 @@
<string name="btn_lookup_key">Rechercher la clef</string>
<string name="btn_encryption_advanced_settings_show">Afficher les paramètres avancés</string>
<string name="btn_encryption_advanced_settings_hide">Masquer les paramètres avancés</string>
+ <string name="btn_share_encrypted_signed">Partager le message chiffré/signé...</string>
+ <string name="btn_view_cert_key">Voir la clef de certification</string>
<!--menu-->
<string name="menu_preferences">Paramètres</string>
<string name="menu_help">Aide</string>
@@ -71,6 +79,7 @@
<string name="menu_create_key_expert">Créer une clef (expert)</string>
<string name="menu_search">Rechercher</string>
<string name="menu_import_from_key_server">Serveur de clefs</string>
+ <string name="menu_import_from_keybase">Importer depuis Keybase.io</string>
<string name="menu_key_server">Serveur de clefs...</string>
<string name="menu_update_key">Mettre à jour depuis le serveur de clefs</string>
<string name="menu_export_key_to_server">Téléverser vers le serveur de clefs</string>
@@ -116,7 +125,7 @@
<string name="label_expiry">Expiration</string>
<string name="label_usage">Utilisation</string>
<string name="label_key_size">Taille de la clef</string>
- <string name="label_main_user_id">ID utilisateur principal</string>
+ <string name="label_main_user_id">Identité principale</string>
<string name="label_name">Nom</string>
<string name="label_comment">Commentaire</string>
<string name="label_email">Courriel</string>
@@ -194,9 +203,9 @@
<string name="key_deletion_confirmation_multi">Voulez-vous vraiment supprimer toutes les clefs publiques choisies ?\nCeci est irréversible !</string>
<string name="secret_key_deletion_confirmation">Voulez-vous vraiment supprimer la clef SECRÈTE %s ?\nVous ne pourrez pas la restituer !</string>
<string name="ask_save_changed_key">Vous avez apporté des changements au trousseau, voulez-vous l\'enregistrer ?</string>
- <string name="ask_empty_id_ok">Vous avez ajouté un ID utilisateur vide, êtes-vous certain de vouloir continuer?</string>
+ <string name="ask_empty_id_ok">Vous avez ajouté une identité vide, êtes-vous certain de vouloir continuer ?</string>
<string name="public_key_deletetion_confirmation">Voulez-vous vraiment supprimer la clef publique %s ?\nCeci est irréversible !</string>
- <string name="also_export_secret_keys">Exporter aussi les clefs secrètes?</string>
+ <string name="also_export_secret_keys">Exporter aussi les clefs secrètes ?</string>
<plurals name="keys_added_and_updated_1">
<item quantity="one">%d clef ajoutée avec succès</item>
<item quantity="other">%d clefs ajoutées avec succès</item>
@@ -229,12 +238,13 @@
<item quantity="other">%d mauvaises clefs ignorées. Vous avez peut-être exporté avec l\'option\n --export-secret-subkeys\nAssurez-vous d\'exporter plutôt avec\n --export-secret-keys.</item>
</plurals>
<string name="key_send_success">Clef téléversée vers le serveur avec succès</string>
- <string name="key_certify_success">Clef certifiée avec succès</string>
+ <string name="key_certify_success">Identités certifiées avec succès</string>
<string name="list_empty">Cette liste est vide !</string>
<string name="nfc_successful">Clef envoyée par Beam NFC avec succès |</string>
<string name="key_copied_to_clipboard">La clef a été copié vers le presse-papiers !</string>
+ <string name="fingerprint_copied_to_clipboard">L\'empreinte a été copié vers le presse-papiers !</string>
<string name="key_has_already_been_certified">La clef a déjà été certifiée !</string>
- <string name="select_key_to_sign">Veuillez choisir une clef a utiliser pour la signature !</string>
+ <string name="select_key_to_certify">Veuillez choisir une clef à utiliser pour la certification !</string>
<string name="key_too_big_for_sharing">La clef est trop grosse pour être partagée ainsi !</string>
<!--errors
no punctuation, all lowercase,
@@ -247,8 +257,8 @@
<string name="error_master_key_must_not_be_el_gamal">la clef maîtresse ne peut être une clef ElGama</string>
<string name="error_unknown_algorithm_choice">choix d\'algorhitme inconnu</string>
<string name="error_user_id_no_email">aucun courriel trouvé</string>
- <string name="error_key_needs_a_user_id">vous avez besoin d\'au moins un ID utilisateur</string>
- <string name="error_main_user_id_must_not_be_empty">l\'ID utilisateur principal ne doit pas être vide</string>
+ <string name="error_key_needs_a_user_id">au moins une identité est nécessaire</string>
+ <string name="error_main_user_id_must_not_be_empty">l\'identité principale ne doit pas être vide</string>
<string name="error_key_needs_master_key">au moins une clef maîtresse est nécessaire</string>
<string name="error_no_signature_passphrase">aucune phrase de passe n\'a été donnée</string>
<string name="error_no_signature_key">aucune clef de signature n\'a été donnée</string>
@@ -320,6 +330,7 @@
<string name="hint_public_keys">Rechercher des clefs publiques</string>
<string name="hint_secret_keys">Rechercher des clefs secrètes</string>
<string name="action_share_key_with">Partager la clef avec...</string>
+ <string name="hint_keybase_search">Rechercher dans Keybase.io</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -359,13 +370,14 @@
<string name="import_nfc_text">Pour recevoir des clefs par la NFC, les appareils doivent être déverrouillés.</string>
<string name="import_nfc_help_button">Aide</string>
<string name="import_clipboard_button">Obtenir la clef depuis le presse-papiers</string>
+ <string name="import_keybase_button">Obtenir la clef depuis Keybase.io</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Déchiffrer le fichier avec OpenKeychain</string>
<string name="intent_import_key">Importer la clef avec OpenKeychain</string>
<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\nLes applications tierces peuvent demander l\'accès à OpenKeychain. Après avoir autorisé l\'accès, elles seront listées ici.</string>
+ <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>
@@ -376,6 +388,7 @@
<string name="api_settings_save">Enregistrer</string>
<string name="api_settings_cancel">Annuler</string>
<string name="api_settings_revoke">Révoquer l\'accès</string>
+ <string name="api_settings_start">Lancer l\'application</string>
<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>
@@ -386,8 +399,8 @@
<string name="api_register_allow">Permettre l\'accès</string>
<string name="api_register_disallow">Enlever l\'accès</string>
<string name="api_register_error_select_key">Veuillez choisir une clef !</string>
- <string name="api_select_pub_keys_missing_text">Aucune clef publique n\'a été trouvée pour ces IDs utilisateur :</string>
- <string name="api_select_pub_keys_dublicates_text">Plus d\'une clef publique existe pour ces IDs utilisateur</string>
+ <string name="api_select_pub_keys_missing_text">Aucune clef publique n\'a été trouvée pour ces identités :</string>
+ <string name="api_select_pub_keys_dublicates_text">Plus d\'une clef publique existe pour ces identités :</string>
<string name="api_select_pub_keys_text">Veuillez revoir la liste des destinataires !</string>
<string name="api_error_wrong_signature">La vérification de la signature a échoué ! Avez-vous installé cette appli à partir d\'une source différente ? Si vous êtes sûr que ce n\'est pas une attaque, révoquez l\'enregistrement de cette appli dans OpenKeychain et enregistrez-la à nouveau.</string>
<!--Share-->
@@ -407,11 +420,15 @@
<string name="key_list_empty_button_create">créer votre propre clef</string>
<string name="key_list_empty_button_import">Importer des clefs.</string>
<!--Key view-->
- <string name="key_view_action_edit">Modifier cette clef</string>
+ <string name="key_view_action_edit">Modifier la clef</string>
<string name="key_view_action_encrypt">Chiffrer avec cette clef</string>
- <string name="key_view_action_certify">Certifier cette clef</string>
- <string name="key_view_tab_main">Infos</string>
- <string name="key_view_tab_certs">Certifications</string>
+ <string name="key_view_action_certify">Certifier les identités</string>
+ <string name="key_view_action_share_with">Partager avec...</string>
+ <string name="key_view_action_share_nfc">Partager par NFC en tenant les appareils dos à dos</string>
+ <string name="key_view_tab_main">Infos principales</string>
+ <string name="key_view_tab_share">Partager</string>
+ <string name="key_view_tab_keys">Sous-clefs</string>
+ <string name="key_view_tab_certs">Certificats</string>
<!--Navigation Drawer-->
<string name="nav_keys">Clefs</string>
<string name="nav_encrypt">Signer et chiffrer</string>
@@ -428,23 +445,23 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Écrire ici le message à chiffrer et/ou signer...</string>
<string name="decrypt_content_edit_text_hint">Saisir le cryptogramme à déchiffrer et/ou à vérifier ici...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">valeur par défaut</string>
<string name="cert_none">aucun</string>
<string name="cert_casual">rapide</string>
<string name="cert_positive">positif</string>
- <string name="cert_revoke">révoquer</string>
+ <string name="cert_revoke">révoqué</string>
<string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">échec!</string>
<string name="cert_verify_error">erreur!</string>
<string name="cert_verify_unavailable">clef non disponible</string>
<!--unsorted-->
- <string name="section_signer_id">Signataire</string>
+ <string name="section_certifier_id">Certificateur</string>
<string name="section_cert">Détails du certificat</string>
- <string name="label_user_id">ID utilisateur</string>
+ <string name="label_user_id">identité</string>
<string name="unknown_uid">&lt;inconnu&gt;</string>
<string name="empty_certs">Aucun certificat pour cette clef</string>
- <string name="section_uids_to_sign">ID utilisateur pour signer</string>
+ <string name="section_uids_to_certify">Identités à certifier</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>
@@ -456,4 +473,5 @@
<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>
</resources>
diff --git a/OpenKeychain/src/main/res/values-it-rIT/strings.xml b/OpenKeychain/src/main/res/values-it-rIT/strings.xml
index c652f85d9..b951bcf71 100644
--- a/OpenKeychain/src/main/res/values-it-rIT/strings.xml
+++ b/OpenKeychain/src/main/res/values-it-rIT/strings.xml
@@ -14,6 +14,8 @@
<string name="title_change_passphrase">Cambia Frase Di Accesso</string>
<string name="title_set_passphrase">Imposta Frase di Accesso</string>
<string name="title_share_with">Condividi con...</string>
+ <string name="title_share_fingerprint_with">Condivi impronta con...</string>
+ <string name="title_share_key">Condividi chiave con...</string>
<string name="title_share_file">Condividi file con...</string>
<string name="title_encrypt_to_file">Codifica File</string>
<string name="title_decrypt_to_file">Decodifica File</string>
@@ -22,28 +24,32 @@
<string name="title_export_keys">Esporta Chiavi</string>
<string name="title_key_not_found">Chiave Non Trovata</string>
<string name="title_send_key">Carica sul Server delle Chiavi</string>
- <string name="title_certify_key">Certifica Chiave</string>
+ <string name="title_certify_key">Certifica identità</string>
<string name="title_key_details">Dettagli Chiave</string>
<string name="title_help">Aiuto</string>
<!--section-->
- <string name="section_user_ids">ID Utente</string>
- <string name="section_keys">Chiavi</string>
+ <string name="section_user_ids">Identità</string>
+ <string name="section_keys">Sottochiavi</string>
<string name="section_general">Generale</string>
<string name="section_defaults">Predefiniti</string>
<string name="section_advanced">Avanzato</string>
<string name="section_master_key">Chiave Principale</string>
- <string name="section_master_user_id">ID Utente Principale</string>
+ <string name="section_master_user_id">Identità Primaria</string>
<string name="section_actions">Azioni</string>
+ <string name="section_share_key">Intera chiave</string>
<string name="section_certification_key">La Tua Chiave usata per la certificazione</string>
<string name="section_upload_key">Carica Chiave</string>
<string name="section_key_server">Server delle Chiavi</string>
<string name="section_encrypt_and_or_sign">Codifica e/o Firma</string>
<string name="section_decrypt_verify">Decodifica e Verifica</string>
+ <string name="section_fingerprint">Impronta</string>
+ <string name="section_key_to_certify">Chiave da certificare</string>
<!--button-->
<string name="btn_certify">Certifica</string>
- <string name="btn_decrypt_verify">Decodifica e Verifica</string>
+ <string name="btn_decrypt_verify_file">Decodifica, verifica e salva su file</string>
+ <string name="btn_decrypt_verify_message">Decodifica e verifica messaggio</string>
<string name="btn_decrypt_verify_clipboard">Dagli Appunti</string>
- <string name="btn_encrypt_file">Codifica File</string>
+ <string name="btn_encrypt_file">Codifica e salva file</string>
<string name="btn_save">Salva</string>
<string name="btn_do_not_save">Annulla</string>
<string name="btn_delete">Elimina</string>
@@ -59,6 +65,8 @@
<string name="btn_lookup_key">Chiave di ricerca</string>
<string name="btn_encryption_advanced_settings_show">Mostra impostazioni avanzate</string>
<string name="btn_encryption_advanced_settings_hide">Nascondi impostazioni avanzate</string>
+ <string name="btn_share_encrypted_signed">Condividi messaggio codificato/firmato...</string>
+ <string name="btn_view_cert_key">Mostra chiave di certificazione</string>
<!--menu-->
<string name="menu_preferences">Impostazioni</string>
<string name="menu_help">Aiuto</string>
@@ -71,6 +79,7 @@
<string name="menu_create_key_expert">Crea chiave (avanzato)</string>
<string name="menu_search">Cerca</string>
<string name="menu_import_from_key_server">Server delle Chiavi</string>
+ <string name="menu_import_from_keybase">Importa da Keybase.io</string>
<string name="menu_key_server">Server delle Chiavi...</string>
<string name="menu_update_key">Aggiorna dal server delle chiavi</string>
<string name="menu_export_key_to_server">Carica chiave nel server</string>
@@ -116,7 +125,7 @@
<string name="label_expiry">Scadenza</string>
<string name="label_usage">Utilizzo</string>
<string name="label_key_size">Dimensione Chiave</string>
- <string name="label_main_user_id">ID Utente Principale</string>
+ <string name="label_main_user_id">Identità Primaria</string>
<string name="label_name">Nome</string>
<string name="label_comment">Commento</string>
<string name="label_email">Email</string>
@@ -194,7 +203,7 @@
<string name="key_deletion_confirmation_multi">Vuoi veramente eliminare tutte le chiavi pubbliche selezionate?\nNon potrai annullare!</string>
<string name="secret_key_deletion_confirmation">Vuoi veramente eliminare la chiave PRIVATA \'%s\'?\nNon potrai annullare!</string>
<string name="ask_save_changed_key">Hai apportato modifiche al tuo portachiavi, vuoi salvarlo?</string>
- <string name="ask_empty_id_ok">È stato aggiunto un ID utente vuoto, sei sicuro di voler continuare?</string>
+ <string name="ask_empty_id_ok">Hai aggiunto una identità vuota, sei sicuro di voler continuare?</string>
<string name="public_key_deletetion_confirmation">Vuoi veramente eliminare la chiave pubblica \'%s\'?\nNon potrai annullare!</string>
<string name="also_export_secret_keys">Esportare anche le chiavi segrete?</string>
<plurals name="keys_added_and_updated_1">
@@ -229,12 +238,13 @@
<item quantity="other">%d chiavi private non valide ignorate. Forse hai esportato con opzione\n--export-secret-subkeys\nAssicurati di esportare con\n--export-secret-keys\ninvece.</item>
</plurals>
<string name="key_send_success">Chiave caricata con successo sul server</string>
- <string name="key_certify_success">Chiave certrificata correttamente</string>
+ <string name="key_certify_success">Identità certificata correttamente</string>
<string name="list_empty">Lista vuota!</string>
<string name="nfc_successful">Chiave correttamente inviata tramite NFC Beam!</string>
<string name="key_copied_to_clipboard">Chiave copiata negli appunti!</string>
+ <string name="fingerprint_copied_to_clipboard">Impronta copiata negli appunti!</string>
<string name="key_has_already_been_certified">La chiave è già certificata!</string>
- <string name="select_key_to_sign">Per favore seleziona la chiave per la firma!</string>
+ <string name="select_key_to_certify">Per favore seleziona una chiave per la certificazione!</string>
<string name="key_too_big_for_sharing">Chiave troppo grande per essere condivisa in questo modo!</string>
<!--errors
no punctuation, all lowercase,
@@ -247,8 +257,8 @@
<string name="error_master_key_must_not_be_el_gamal">La chiave principale non puo\' essere ElGamal</string>
<string name="error_unknown_algorithm_choice">opzione algoritmo sconosciuta</string>
<string name="error_user_id_no_email">Nessuna email trovata</string>
- <string name="error_key_needs_a_user_id">necessario almeno un id utente</string>
- <string name="error_main_user_id_must_not_be_empty">id utente principale non puo\' essere vuoto</string>
+ <string name="error_key_needs_a_user_id">neccessaria almeno una identità</string>
+ <string name="error_main_user_id_must_not_be_empty">L\'identità primaria non può essere vuota</string>
<string name="error_key_needs_master_key">necessaria almeno una chiave principale</string>
<string name="error_no_signature_passphrase">nessuna frase di accesso inserita</string>
<string name="error_no_signature_key">nessuna chiave di firma inserita</string>
@@ -320,6 +330,7 @@
<string name="hint_public_keys">Ricerca Chiavi Pubbliche</string>
<string name="hint_secret_keys">Cerca Chiave Privata</string>
<string name="action_share_key_with">Condividi chiave con...</string>
+ <string name="hint_keybase_search">Cerca Keybase.io</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -359,13 +370,13 @@
<string name="import_nfc_text">Per ricevere le chiavi via NFC, il dispositivo deve essere sbloccato.</string>
<string name="import_nfc_help_button">Aiuto</string>
<string name="import_clipboard_button">Ottieni chiave dagli appunti</string>
+ <string name="import_keybase_button">Ottieni chiave da Keybase.io</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Decodifica File con OpenKeychain</string>
<string name="intent_import_key">Importa Chiave con OpenKeychain</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 app registrata!\n\nApp di terze parti possono richiedere l\'accesso a OpenKeychain. Dopo aver concesso l\'accesso, le app saranno elencate qui.</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>
@@ -386,8 +397,8 @@
<string name="api_register_allow">Permetti accesso</string>
<string name="api_register_disallow">Nega accesso</string>
<string name="api_register_error_select_key">Per favore selezionare una chiave!</string>
- <string name="api_select_pub_keys_missing_text">Nessuna chiave pubblica trovata per id utente:</string>
- <string name="api_select_pub_keys_dublicates_text">Esistono piu\' di una chiave pubblica per gli id utenti:</string>
+ <string name="api_select_pub_keys_missing_text">Nessuna chiave pubblica trovata per queste identità:</string>
+ <string name="api_select_pub_keys_dublicates_text">Esistono piu\' di una chiave pubblica per queste identità:</string>
<string name="api_select_pub_keys_text">Per favore ricontrolla la lista destinatari!</string>
<string name="api_error_wrong_signature">Controllo della firma fallito! Hai installato questa app da una fonte diversa? Se sei sicuro che non sia un attacco, revoca la registrazione di questa app in OpenKeychain e dopo registra di nuovo l\'app.</string>
<!--Share-->
@@ -409,9 +420,13 @@
<!--Key view-->
<string name="key_view_action_edit">Modifica chiave</string>
<string name="key_view_action_encrypt">Codifica con questa chiave</string>
- <string name="key_view_action_certify">Certifica questa chiave</string>
- <string name="key_view_tab_main">Info</string>
- <string name="key_view_tab_certs">Certificazioni</string>
+ <string name="key_view_action_certify">Certifica identità</string>
+ <string name="key_view_action_share_with">Condividi con...</string>
+ <string name="key_view_action_share_nfc">Condividi con NFC tenendo i dispositivi a stretto contatto</string>
+ <string name="key_view_tab_main">Info Principale</string>
+ <string name="key_view_tab_share">Condividi</string>
+ <string name="key_view_tab_keys">Sottochiavi</string>
+ <string name="key_view_tab_certs">Certificati</string>
<!--Navigation Drawer-->
<string name="nav_keys">Chiavi</string>
<string name="nav_encrypt">Firma e Codifica</string>
@@ -428,23 +443,23 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Scrivi qui il messaggio da codificare e/o firmare...</string>
<string name="decrypt_content_edit_text_hint">Inserisci il testo cifrato qui per la decodifica e/o verifica...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">predefiniti</string>
<string name="cert_none">nessuno</string>
<string name="cert_casual">casuale</string>
<string name="cert_positive">positivo</string>
- <string name="cert_revoke">revoca</string>
+ <string name="cert_revoke">revocato</string>
<string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">fallito!</string>
<string name="cert_verify_error">errore!</string>
<string name="cert_verify_unavailable">chiave non disponibile</string>
<!--unsorted-->
- <string name="section_signer_id">Firmatario</string>
+ <string name="section_certifier_id">Certificatore</string>
<string name="section_cert">Dettagli Certificato</string>
- <string name="label_user_id">ID Utente</string>
+ <string name="label_user_id">Identit</string>
<string name="unknown_uid">&lt;sconosciuto&gt;</string>
<string name="empty_certs">Nessun certificato per questa chiave</string>
- <string name="section_uids_to_sign">ID Utente da firmare</string>
+ <string name="section_uids_to_certify">Identità da certificare</string>
<string name="label_revocation">Ragione della Revoca</string>
<string name="label_verify_status">Stato Verifica</string>
<string name="label_cert_type">Tipo</string>
@@ -456,4 +471,5 @@
<string name="title_view_cert">Visualizza Dettagli Certificati</string>
<string name="unknown_algorithm">sconosciuto</string>
<string name="can_sign_not">non può firmare</string>
+ <string name="error_no_encrypt_subkey">Nessuna sottochiave di codifica disponibile!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml
index e3b4d559a..1bcf4553b 100644
--- a/OpenKeychain/src/main/res/values-ja/strings.xml
+++ b/OpenKeychain/src/main/res/values-ja/strings.xml
@@ -14,6 +14,8 @@
<string name="title_change_passphrase">パスフレーズの変更</string>
<string name="title_set_passphrase">パスフレーズの設定</string>
<string name="title_share_with">...で共有</string>
+ <string name="title_share_fingerprint_with">...で指紋の共有</string>
+ <string name="title_share_key">...で鍵の共有</string>
<string name="title_share_file">...でファイルの共有</string>
<string name="title_encrypt_to_file">暗号化してファイルに</string>
<string name="title_decrypt_to_file">復号化してファイルに</string>
@@ -22,28 +24,32 @@
<string name="title_export_keys">複数鍵のエクスポート</string>
<string name="title_key_not_found">鍵が見当りません</string>
<string name="title_send_key">鍵サーバへアップロード</string>
- <string name="title_certify_key">証明鍵</string>
+ <string name="title_certify_key">ユーザID検証</string>
<string name="title_key_details">鍵の概要</string>
<string name="title_help">ヘルプ</string>
<!--section-->
<string name="section_user_ids">ユーザID</string>
- <string name="section_keys">鍵</string>
+ <string name="section_keys">副鍵</string>
<string name="section_general">一般</string>
<string name="section_defaults">デフォルト</string>
<string name="section_advanced">拡張</string>
<string name="section_master_key">主鍵</string>
- <string name="section_master_user_id">主ユーザID</string>
+ <string name="section_master_user_id">メインのユーザID</string>
<string name="section_actions">アクション</string>
+ <string name="section_share_key">すべての鍵</string>
<string name="section_certification_key">あなたの鍵を証明に利用します</string>
<string name="section_upload_key">鍵のアップロード</string>
<string name="section_key_server">鍵サーバ</string>
<string name="section_encrypt_and_or_sign">暗号化/署名</string>
<string name="section_decrypt_verify">復号化と検証</string>
+ <string name="section_fingerprint">指紋</string>
+ <string name="section_key_to_certify">鍵は検証されています。</string>
<!--button-->
<string name="btn_certify">証明</string>
- <string name="btn_decrypt_verify">復号化と検証</string>
+ <string name="btn_decrypt_verify_file">復号化と検証、そしてファイルの保存</string>
+ <string name="btn_decrypt_verify_message">メッセージの復号化と検証</string>
<string name="btn_decrypt_verify_clipboard">クリップボードから</string>
- <string name="btn_encrypt_file">ファイル暗号化</string>
+ <string name="btn_encrypt_file">暗号化してファイルを保存</string>
<string name="btn_save">保存</string>
<string name="btn_do_not_save">キャンセル</string>
<string name="btn_delete">削除</string>
@@ -59,6 +65,8 @@
<string name="btn_lookup_key">鍵検出</string>
<string name="btn_encryption_advanced_settings_show">拡張設定を表示</string>
<string name="btn_encryption_advanced_settings_hide">拡張設定を隠す</string>
+ <string name="btn_share_encrypted_signed">暗号化/署名メッセージの共有...</string>
+ <string name="btn_view_cert_key">検証した鍵を見る</string>
<!--menu-->
<string name="menu_preferences">設定</string>
<string name="menu_help">ヘルプ</string>
@@ -71,6 +79,7 @@
<string name="menu_create_key_expert">鍵の生成(上級)</string>
<string name="menu_search">検索</string>
<string name="menu_import_from_key_server">鍵サーバ</string>
+ <string name="menu_import_from_keybase">Keybase.ioからのインポート</string>
<string name="menu_key_server">鍵サーバ...</string>
<string name="menu_update_key">鍵サーバからの更新</string>
<string name="menu_export_key_to_server">鍵サーバへのアップロード</string>
@@ -116,7 +125,7 @@
<string name="label_expiry">満了</string>
<string name="label_usage">使い方</string>
<string name="label_key_size">鍵サイズ</string>
- <string name="label_main_user_id">主ユーザID</string>
+ <string name="label_main_user_id">メインのユーザID</string>
<string name="label_name">名前</string>
<string name="label_comment">コメント</string>
<string name="label_email">Eメールアドレス</string>
@@ -168,7 +177,7 @@
<string name="flag_certify">証明</string>
<string name="flag_sign">署名</string>
<string name="flag_encrypt">暗号化</string>
- <string name="flag_authenticate">証明</string>
+ <string name="flag_authenticate">認証</string>
<!--sentences-->
<string name="wrong_passphrase">良くないパスフレーズ</string>
<string name="set_a_passphrase">最初にパスフレーズを設定してください。</string>
@@ -191,7 +200,7 @@
<string name="key_deletion_confirmation_multi">選択したすべての公開鍵を削除して本当に良いのですか?\nこれは元に戻せません!</string>
<string name="secret_key_deletion_confirmation">秘密鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string>
<string name="ask_save_changed_key">あなたは鍵輪に変更を加えました、これを保存しますか?</string>
- <string name="ask_empty_id_ok">あなたは空のユーザーIDを追加しました、このまま続けますか?</string>
+ <string name="ask_empty_id_ok">あなたは空のユーザIDを追加しました、このまま続けますか?</string>
<string name="public_key_deletetion_confirmation">公開鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string>
<string name="also_export_secret_keys">秘密鍵もエクスポートしますか?</string>
<plurals name="keys_added_and_updated_1">
@@ -220,12 +229,13 @@
<item quantity="other">%d の問題ある鍵を無視しました。 おそらく次のオプションでエクスポートしています\n --export-secret-subkeys\n代りに次のオプションでエクスポートしてください。\n --export-secret-keys</item>
</plurals>
<string name="key_send_success">鍵を鍵サーバにアップロードしました</string>
- <string name="key_certify_success">鍵を検証しました</string>
+ <string name="key_certify_success">ユーザIDの検証に成功</string>
<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="key_has_already_been_certified">鍵はすでに検証されています!</string>
- <string name="select_key_to_sign">署名に使う鍵を選択して下さい!</string>
+ <string name="select_key_to_certify">検証に使う鍵を選択して下さい!</string>
<string name="key_too_big_for_sharing">この共有方法では鍵が大きすぎます!</string>
<!--errors
no punctuation, all lowercase,
@@ -239,7 +249,7 @@
<string name="error_unknown_algorithm_choice">未知のアルゴリズムを選択しています</string>
<string name="error_user_id_no_email">メールが見付かりません</string>
<string name="error_key_needs_a_user_id">最低でも1つのユーザIDが必要です</string>
- <string name="error_main_user_id_must_not_be_empty">主ユーザIDは空にすることはできません</string>
+ <string name="error_main_user_id_must_not_be_empty">メインのユーザIDは空にすることはできません</string>
<string name="error_key_needs_master_key">主鍵が最低でも1つ必要です</string>
<string name="error_no_signature_passphrase">パスフレーズが与えられていません</string>
<string name="error_no_signature_key">署名鍵を与えられていません</string>
@@ -308,6 +318,7 @@
<string name="hint_public_keys">公開鍵の検索</string>
<string name="hint_secret_keys">秘密鍵の検索</string>
<string name="action_share_key_with">...で鍵の共有</string>
+ <string name="hint_keybase_search">Keybase.ioでの検索</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -346,13 +357,14 @@
<string name="import_nfc_text">NFCで鍵を受信しました、デバイスのロックを解除する必要があります。</string>
<string name="import_nfc_help_button">ヘルプ</string>
<string name="import_clipboard_button">クリップボードから鍵を取得</string>
+ <string name="import_keybase_button">Keybase.ioから鍵を取得</string>
<!--Intent labels-->
<string name="intent_decrypt_file">OpenKeychainでファイルを復号化</string>
<string name="intent_import_key">OpenKeychainに鍵をインポート</string>
<string name="intent_send_encrypt">OpenKeychainで暗号化</string>
<string name="intent_send_decrypt">OpenKeychainで復号化</string>
<!--Remote API-->
- <string name="api_no_apps">登録されていないアプリケーション!\n\nサードパーティアプリケーションはOpenKeychainにアクセスを要求できます。アクセスを与えた後、それらはここにリストされます。</string>
+ <string name="api_no_apps">未登録のアプリケーションです!\n\n\"ヘルプ\"のサードパーティ製アプリケーションのサポートリストにあるかを見てください!</string>
<string name="api_settings_show_info">詳細情報を表示</string>
<string name="api_settings_hide_info">詳細情報を非表示</string>
<string name="api_settings_show_advanced">拡張設定を表示</string>
@@ -363,6 +375,7 @@
<string name="api_settings_save">保存</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>
@@ -393,10 +406,14 @@
<string name="key_list_empty_button_create">あなた所有の鍵を作る</string>
<string name="key_list_empty_button_import">鍵のインポート。</string>
<!--Key view-->
- <string name="key_view_action_edit">この鍵の編集</string>
+ <string name="key_view_action_edit">鍵の編集</string>
<string name="key_view_action_encrypt">この鍵で暗号化</string>
- <string name="key_view_action_certify">この鍵で検証</string>
+ <string name="key_view_action_certify">ユーザID検証</string>
+ <string name="key_view_action_share_with">...で共有</string>
+ <string name="key_view_action_share_nfc">デバイスの後ろ同士を固定してNFC経由で共有</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>
<!--Navigation Drawer-->
<string name="nav_keys">鍵</string>
@@ -414,7 +431,7 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">ここに書いたメッセージを暗号化/署名..</string>
<string name="decrypt_content_edit_text_hint">ここに入力された暗号化テキストを復号化/検証...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">デフォルト</string>
<string name="cert_none">無し</string>
<string name="cert_casual">因果</string>
@@ -425,12 +442,12 @@
<string name="cert_verify_error">エラー!</string>
<string name="cert_verify_unavailable">鍵がありません</string>
<!--unsorted-->
- <string name="section_signer_id">署名者</string>
+ <string name="section_certifier_id">検証者</string>
<string name="section_cert">証明の詳細</string>
- <string name="label_user_id">ユーザーID</string>
+ <string name="label_user_id">ユーザID</string>
<string name="unknown_uid">&lt;不明&gt;</string>
<string name="empty_certs">この鍵に証明がない</string>
- <string name="section_uids_to_sign">署名に使うユーザーID</string>
+ <string name="section_uids_to_certify">ユーザIDを検証</string>
<string name="label_revocation">破棄の理由</string>
<string name="label_verify_status">検証ステータス</string>
<string name="label_cert_type">種別</string>
@@ -442,4 +459,5 @@
<string name="title_view_cert">証明の詳細を見る</string>
<string name="unknown_algorithm">不明</string>
<string name="can_sign_not">署名不可</string>
+ <string name="error_no_encrypt_subkey">暗号化の副鍵がありません!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-ko/strings.xml b/OpenKeychain/src/main/res/values-ko/strings.xml
new file mode 100644
index 000000000..e3d3a6493
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-ko/strings.xml
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--title-->
+ <!--section-->
+ <!--button-->
+ <!--menu-->
+ <!--label-->
+ <!--choice-->
+ <!--key flags-->
+ <!--sentences-->
+ <!--errors
+ no punctuation, all lowercase,
+ they will be put after "error_message", e.g. "Error: file not found"-->
+ <!--errors without preceeding Error:-->
+ <!--results shown after decryption/verification-->
+ <!--progress dialogs, usually ending in '…'-->
+ <!--action strings-->
+ <!--key bit length selections-->
+ <!--compression-->
+ <!--Help-->
+ <!--Import-->
+ <!--Intent labels-->
+ <!--Remote API-->
+ <!--Share-->
+ <!--Key list-->
+ <!--Key view-->
+ <!--Navigation Drawer-->
+ <!--hints-->
+ <!--certs-->
+ <!--unsorted-->
+</resources>
diff --git a/OpenKeychain/src/main/res/values-nl-rNL/strings.xml b/OpenKeychain/src/main/res/values-nl-rNL/strings.xml
index a4d1744b8..bf6d7f911 100644
--- a/OpenKeychain/src/main/res/values-nl-rNL/strings.xml
+++ b/OpenKeychain/src/main/res/values-nl-rNL/strings.xml
@@ -19,13 +19,10 @@
<string name="title_key_not_found">Sleutel niet gevonden</string>
<string name="title_help">Help</string>
<!--section-->
- <string name="section_user_ids">Gebruikers-id\'s</string>
- <string name="section_keys">Sleutels</string>
<string name="section_general">Algemeen</string>
<string name="section_defaults">Standaard</string>
<string name="section_advanced">Geavanceerd</string>
<!--button-->
- <string name="btn_encrypt_file">Bestand versleutelen</string>
<string name="btn_save">Opslaan</string>
<string name="btn_do_not_save">Annuleren</string>
<string name="btn_delete">Verwijderen</string>
@@ -65,7 +62,6 @@
<string name="label_expiry">Verlopen</string>
<string name="label_usage">Gebruik</string>
<string name="label_key_size">Sleutelgrootte</string>
- <string name="label_main_user_id">Hoofdgebruikers-id</string>
<string name="label_name">Naam</string>
<string name="label_comment">Opmerking</string>
<string name="label_email">E-mailadres</string>
@@ -125,8 +121,6 @@
<string name="error_key_size_minimum512bit">sleutelgrootte moet minstens 512-bits zijn</string>
<string name="error_master_key_must_not_be_el_gamal">de hoofdsleutel kan geen ElGamal-sleutel zijn</string>
<string name="error_unknown_algorithm_choice">onbekende algoritmekeuze</string>
- <string name="error_key_needs_a_user_id">ten minste één gebruiksers-id vereist</string>
- <string name="error_main_user_id_must_not_be_empty">hoofdgebruikers-id kan niet leeg zijn</string>
<string name="error_key_needs_master_key">ten minste een hoofdsleutel is vereist</string>
<string name="error_no_signature_passphrase">geen wachtwoord opgegeven</string>
<string name="error_no_signature_key">geen ondertekeningssleutel opgegeven</string>
@@ -192,8 +186,6 @@
<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 publieke sleutels gevonden voor deze gebruiker-id\'s:</string>
- <string name="api_select_pub_keys_dublicates_text">Meer dan een publieke sleutel gevonden voor deze gebruikers-id\'s:</string>
<string name="api_select_pub_keys_text">Bekijkt u a.u.b. de ontvangers</string>
<!--Share-->
<string name="share_qr_code_dialog_start">U gaat door alle QR-codes met \'Volgende\', en scant ze een voor een.</string>
@@ -201,6 +193,6 @@
<!--Key view-->
<!--Navigation Drawer-->
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<!--unsorted-->
</resources>
diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml
index d72e78546..2f327c9bd 100644
--- a/OpenKeychain/src/main/res/values-pl/strings.xml
+++ b/OpenKeychain/src/main/res/values-pl/strings.xml
@@ -13,7 +13,6 @@
<string name="title_key_server_preference">Właściwości serwera kluczy</string>
<string name="title_change_passphrase">Zmień hasło</string>
<string name="title_set_passphrase">Ustaw hasło</string>
- <string name="title_share_with">Udostępnij...</string>
<string name="title_share_file">Udostępnij plik...</string>
<string name="title_encrypt_to_file">Zaszyfruj do pliku</string>
<string name="title_decrypt_to_file">Odszyfruj do pliku</string>
@@ -22,17 +21,13 @@
<string name="title_export_keys">Eksportuj klucze</string>
<string name="title_key_not_found">Nie znaleziono klucza</string>
<string name="title_send_key">Wyślij do serwera kluczy</string>
- <string name="title_certify_key">Certyfikuj klucz</string>
<string name="title_key_details">Szczegóły klucza</string>
<string name="title_help">Pomoc</string>
<!--section-->
- <string name="section_user_ids">Identyfikator użytkownika</string>
- <string name="section_keys">Klucze</string>
<string name="section_general">Ogólne</string>
<string name="section_defaults">Domyślne</string>
<string name="section_advanced">Zaawansowane</string>
<string name="section_master_key">Klucz główny</string>
- <string name="section_master_user_id">Główny identyfikator użytkownika</string>
<string name="section_actions">Działania</string>
<string name="section_certification_key">Twój klucz użyty do certyfikacji</string>
<string name="section_upload_key">Wyślij klucz</string>
@@ -41,9 +36,7 @@
<string name="section_decrypt_verify">Deszyfruj i weryfikuj</string>
<!--button-->
<string name="btn_certify">Certyfikuj</string>
- <string name="btn_decrypt_verify">Deszyfruj i weryfikuj</string>
<string name="btn_decrypt_verify_clipboard">Ze schowka</string>
- <string name="btn_encrypt_file">Zaszyfruj plik</string>
<string name="btn_save">Zapisz</string>
<string name="btn_do_not_save">Anuluj</string>
<string name="btn_delete">Usuń</string>
@@ -116,7 +109,6 @@
<string name="label_expiry">Wygaśnięcia</string>
<string name="label_usage">Wykorzystanie</string>
<string name="label_key_size">Rozmiar klucza</string>
- <string name="label_main_user_id">Identyfikator głównego użytkownika</string>
<string name="label_name">Imię</string>
<string name="label_comment">Komentarz</string>
<string name="label_email">Adres email</string>
@@ -197,7 +189,6 @@
<string name="key_deletion_confirmation_multi">Czy na pewno chcesz usunąć wszystkie zaznaczone klucze publiczne?\nTej operacji nie można cofnąć!</string>
<string name="secret_key_deletion_confirmation">Czy na pewno chcesz usunąć klucz prywatny \'%s\'?\nNie można cofnąć tej operacji!</string>
<string name="ask_save_changed_key">Zostały dokonane zmiany w pęku kluczy, czy chcesz je zachować?</string>
- <string name="ask_empty_id_ok">Dodałeś pusty identyfikator użytkownika, czy na pewno chcesz kontynuować?</string>
<string name="public_key_deletetion_confirmation">Czy na pewno chcesz usunąć klucz publiczny \'%s\'?\nNie można cofnąć tej operacji!</string>
<string name="also_export_secret_keys">Czy wyeksportować również klucze prywatne?</string>
<plurals name="keys_added_and_updated_1">
@@ -238,12 +229,10 @@
<item quantity="other">zignorowano %d niepoprawnych kluczy prywatnych. Prawdopodobnie zostały wyeksportowane przy uzyciu opcji\n --export-secret-subkeys\nUpewnij się że eksportujesz je z opcją\n --export-secret-keys\nktóra jest poprawna.</item>
</plurals>
<string name="key_send_success">Pomyślnie wysłano klucz na serwer</string>
- <string name="key_certify_success">Pomyślnie podpisano klucz</string>
<string name="list_empty">Lista jest pusta!</string>
<string name="nfc_successful">Pomyślnie wysłano klucz przez NFC Beam!</string>
<string name="key_copied_to_clipboard">Klucz został skopiowany do schowka!</string>
<string name="key_has_already_been_certified">Klucz został już wcześniej certyfikowany!</string>
- <string name="select_key_to_sign">Wybierz klucz, który zostanie użyty do podpisania!</string>
<string name="key_too_big_for_sharing">Klucz ma za duży rozmiar by być udostępniony w ten sposób!</string>
<!--errors
no punctuation, all lowercase,
@@ -256,8 +245,6 @@
<string name="error_master_key_must_not_be_el_gamal">klucz EnGamal nie może być kluczem głównym</string>
<string name="error_unknown_algorithm_choice">wybrano nieznany algorytm</string>
<string name="error_user_id_no_email">nie znaleziono adresu email</string>
- <string name="error_key_needs_a_user_id">potrzeba co najmniej jednego identyfikatora użytkownika</string>
- <string name="error_main_user_id_must_not_be_empty">główny identyfikator użytkownika nie może być pusty</string>
<string name="error_key_needs_master_key">potrzeba co najmniej klucza głównego</string>
<string name="error_no_signature_passphrase">nie podano hasła</string>
<string name="error_no_signature_key">nie podano klucza podpisu</string>
@@ -378,7 +365,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\nZewnętrzne aplikacje mogą żądać dostępu do OpenKeychain. Po przyznaniu dostępu, będa wyświetlone tutaj.</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>
@@ -399,8 +385,6 @@
<string name="api_register_allow">Zezwól na dostęp</string>
<string name="api_register_disallow">Odmów dostępu</string>
<string name="api_register_error_select_key">Wybierz klucz!</string>
- <string name="api_select_pub_keys_missing_text">Nie znaleziono kluczy publiczych dla tych identyfikatorów użytkownika:</string>
- <string name="api_select_pub_keys_dublicates_text">Więcej niż jeden klucz publiczny istnieje dla tych identyfikatorów użytkownika:</string>
<string name="api_select_pub_keys_text">Proszę przejrzeć listę adresatów!</string>
<string name="api_error_wrong_signature">Sprawdzanie podpisu zakończone niepowodzeniem! Czy zainstalowałeś tę aplikację z innego źródła? Jeżeli jesteś pewien, że nie jest to atak, odwołaj rejestrację teg aplikacji w OpenKeychain, a następnie zarejestruj ją ponownie.</string>
<!--Share-->
@@ -421,11 +405,7 @@
<string name="key_list_empty_button_create">tworzenie własnego klucza</string>
<string name="key_list_empty_button_import">importowanie kluczy.</string>
<!--Key view-->
- <string name="key_view_action_edit">Edytuj ten klucz</string>
<string name="key_view_action_encrypt">Zaszyfruj korzystając z tego klucza</string>
- <string name="key_view_action_certify">Certyfikuj ten klucz</string>
- <string name="key_view_tab_main">Informacje</string>
- <string name="key_view_tab_certs">Certyfikaty</string>
<!--Navigation Drawer-->
<string name="nav_keys">Klucze</string>
<string name="nav_encrypt">Podpisz i zaszyfruj</string>
@@ -442,23 +422,19 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Wpisz tutaj wiadomość do zaszyfrowania i/lub podpisania...</string>
<string name="decrypt_content_edit_text_hint">Wpisz tutaj tekst do zaszyfrowania i/lub zweryfikowania...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">domyślny</string>
<string name="cert_none">żaden</string>
<string name="cert_casual">typowy</string>
<string name="cert_positive">pozytywny</string>
- <string name="cert_revoke">odwołaj</string>
<string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">niepowodzenie!</string>
<string name="cert_verify_error">błąd!</string>
<string name="cert_verify_unavailable">klucz niedostępny</string>
<!--unsorted-->
- <string name="section_signer_id">Podpisujący</string>
<string name="section_cert">Szczegóły certyfikatu</string>
- <string name="label_user_id">Identyfikator użytkownika</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_sign">Identyfikator użytkownika do podpisu</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>
diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml
index 7b304b914..b51bcbde2 100644
--- a/OpenKeychain/src/main/res/values-ru/strings.xml
+++ b/OpenKeychain/src/main/res/values-ru/strings.xml
@@ -20,17 +20,13 @@
<string name="title_export_keys">Экспорт ключей</string>
<string name="title_key_not_found">Ключ не найден</string>
<string name="title_send_key">Загрузить на сервер ключей</string>
- <string name="title_certify_key">Сертифицировать ключ</string>
<string name="title_key_details">Сведения о ключе</string>
<string name="title_help">Помощь</string>
<!--section-->
- <string name="section_user_ids">ID пользователя</string>
- <string name="section_keys">Ключи</string>
<string name="section_general">Приложение</string>
<string name="section_defaults">Алгоритмы</string>
<string name="section_advanced">Дополнительно</string>
<string name="section_master_key">Основной ключ</string>
- <string name="section_master_user_id">Владелец</string>
<string name="section_actions">Действия</string>
<string name="section_certification_key">Ваш ключ для сертификации</string>
<string name="section_upload_key">Загрузить ключ</string>
@@ -39,9 +35,7 @@
<string name="section_decrypt_verify">Расшифровать и проверить</string>
<!--button-->
<string name="btn_certify">Сертифицировать</string>
- <string name="btn_decrypt_verify">Расшифровать и проверить</string>
<string name="btn_decrypt_verify_clipboard">Из буфера обмена</string>
- <string name="btn_encrypt_file">Зашифровать файл</string>
<string name="btn_save">Сохранить</string>
<string name="btn_do_not_save">Отмена</string>
<string name="btn_delete">Удалить</string>
@@ -114,7 +108,6 @@
<string name="label_expiry">Годен до...</string>
<string name="label_usage">Применение</string>
<string name="label_key_size">Размер ключа</string>
- <string name="label_main_user_id">Основной ID пользователя</string>
<string name="label_name">Имя</string>
<string name="label_comment">Комментарий</string>
<string name="label_email">Email</string>
@@ -189,7 +182,6 @@
<string name="specify_file_to_export_to">Пожалуйста, выберите файл для экспорта.\nВНИМАНИЕ! Если файл существует, он будет перезаписан.</string>
<string name="key_deletion_confirmation_multi">Вы уверены, что хотите удалить выбранные ключи?\nЭто действие нельзя отменить!</string>
<string name="secret_key_deletion_confirmation">Вы уверены, что ходите удалить СЕКРЕТНЫЙ ключ \'%s\'?\nЭто действие нельзя отменить!</string>
- <string name="ask_empty_id_ok">Вы добавили пустой ID пользователя. Вы уверены, что хотите продолжить?</string>
<string name="public_key_deletetion_confirmation">Вы правда хотите удалить публичный ключ \'%s\'?\nЭто действие нельзя отменить!</string>
<string name="also_export_secret_keys">Экспортировать секретные ключи?</string>
<plurals name="keys_added_and_updated_1">
@@ -234,7 +226,6 @@
<string name="nfc_successful">Ключ успешно передан через NFC!</string>
<string name="key_copied_to_clipboard">Ключ скопирован в буфер обмена!</string>
<string name="key_has_already_been_certified">Ключ уже был сертифицирован ранее!</string>
- <string name="select_key_to_sign">Выберите ключ, используемый для подписи!</string>
<string name="key_too_big_for_sharing">Ключ слишком большой для этого способа передачи!</string>
<!--errors
no punctuation, all lowercase,
@@ -247,8 +238,6 @@
<string name="error_master_key_must_not_be_el_gamal">ключ ElGamal не может быть основным</string>
<string name="error_unknown_algorithm_choice">выбран неизвестный алгоритм</string>
<string name="error_user_id_no_email">email не найден</string>
- <string name="error_key_needs_a_user_id">необходим хотя бы один id пользователя</string>
- <string name="error_main_user_id_must_not_be_empty">основная запись пользователя не может быть пустой</string>
<string name="error_key_needs_master_key">необходим основной ключ</string>
<string name="error_no_signature_passphrase">пароль не задан</string>
<string name="error_no_signature_key">ключ для подписи не задан</string>
@@ -365,7 +354,6 @@
<string name="intent_send_encrypt">OpenKeychain: Зашифровать</string>
<string name="intent_send_decrypt">OpenKeychain: Расшифровать</string>
<!--Remote API-->
- <string name="api_no_apps">Нет связанных программ!\n\nСторонние программы могут запросить доступ к OpenKeychain, после чего они будут отражаться здесь.</string>
<string name="api_settings_show_info">Показать подробную информацию</string>
<string name="api_settings_hide_info">Скрыть подробную информацию</string>
<string name="api_settings_show_advanced">Показать расширенные настройки</string>
@@ -386,8 +374,6 @@
<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">Для этих id не найдены публичные ключи:</string>
- <string name="api_select_pub_keys_dublicates_text">Для этих id найдено более одного ключа:</string>
<string name="api_select_pub_keys_text">Пожалуйста, проверьте получателей!</string>
<string name="api_error_wrong_signature">Проверка подписи пакета не удалась! Если вы установили программу из другого источника, отзовите для неё доступ к этой программе или обновите право доступа.</string>
<!--Share-->
@@ -408,11 +394,7 @@
<string name="key_list_empty_button_create">создать свой ключ</string>
<string name="key_list_empty_button_import">Импортировать ключи</string>
<!--Key view-->
- <string name="key_view_action_edit">Изменить ключ</string>
<string name="key_view_action_encrypt">Зашифровать этим ключом</string>
- <string name="key_view_action_certify">Сертифицировать этот ключ</string>
- <string name="key_view_tab_main">Информация</string>
- <string name="key_view_tab_certs">Сертификация</string>
<!--Navigation Drawer-->
<string name="nav_keys">Ключи</string>
<string name="nav_encrypt">Подписать и зашифровать</string>
@@ -429,21 +411,17 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Напишите сообщение здесь, что бы зашифровать и/или подписать...</string>
<string name="decrypt_content_edit_text_hint">Введите сюда шифр для расшифровки и/или проверки...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">по умолчанию</string>
<string name="cert_none">нет</string>
- <string name="cert_revoke">отозвать</string>
<string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">сбой!</string>
<string name="cert_verify_error">ошибка!</string>
<string name="cert_verify_unavailable">ключ не доступен</string>
<!--unsorted-->
- <string name="section_signer_id">Подписант</string>
<string name="section_cert">Детали сертификации</string>
- <string name="label_user_id">ID пользователя</string>
<string name="unknown_uid">&lt;неизв.&gt;</string>
<string name="empty_certs">Этот ключ не сертифицирован</string>
- <string name="section_uids_to_sign">Подписываемые ID пользователя</string>
<string name="label_revocation">Причина отзыва</string>
<string name="label_verify_status">Статус верификации</string>
<string name="label_cert_type">Тип</string>
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index d0c70dc73..f80db4b6c 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -14,6 +14,8 @@
<string name="title_change_passphrase">Spremeni geslo</string>
<string name="title_set_passphrase">Določi geslo</string>
<string name="title_share_with">Deli z...</string>
+ <string name="title_share_fingerprint_with">Deli prstni odtis z...</string>
+ <string name="title_share_key">Deli ključ z...</string>
<string name="title_share_file">Deli datoteko z...</string>
<string name="title_encrypt_to_file">Šifriraj v datoteko</string>
<string name="title_decrypt_to_file">Dešifriraj v datoteko</string>
@@ -22,28 +24,32 @@
<string name="title_export_keys">Izvozi ključe</string>
<string name="title_key_not_found">Ključ ni bil najden</string>
<string name="title_send_key">Naloži na strežnik</string>
- <string name="title_certify_key">Overi ključ</string>
+ <string name="title_certify_key">Overi identiteto</string>
<string name="title_key_details">Podrobnosti o ključu</string>
<string name="title_help">Pomoč</string>
<!--section-->
- <string name="section_user_ids">Uporabniški ID-ji</string>
- <string name="section_keys">Ključi</string>
+ <string name="section_user_ids">Identitete</string>
+ <string name="section_keys">Podključi</string>
<string name="section_general">Splošno</string>
<string name="section_defaults">Privzeto</string>
<string name="section_advanced">Napredno</string>
<string name="section_master_key">Glavni ključ</string>
- <string name="section_master_user_id">Glavni ID uporabnika</string>
+ <string name="section_master_user_id">Glavna identiteta</string>
<string name="section_actions">Ravnanja</string>
+ <string name="section_share_key">Cel ključ</string>
<string name="section_certification_key">Vaš ključ, uporabljan za overitev</string>
<string name="section_upload_key">Naloži ključ</string>
<string name="section_key_server">Strežnik</string>
<string name="section_encrypt_and_or_sign">Šifriraj in/ali podpiši</string>
<string name="section_decrypt_verify">Dešifriraj in preveri</string>
+ <string name="section_fingerprint">Prstnim odtisom</string>
+ <string name="section_key_to_certify">Ključi za overjanje</string>
<!--button-->
<string name="btn_certify">Overi</string>
- <string name="btn_decrypt_verify">Dešifriraj in preveri</string>
+ <string name="btn_decrypt_verify_file">Dešifriraj, preveri in shrani</string>
+ <string name="btn_decrypt_verify_message">Dešifriraj in preveri sporočilo</string>
<string name="btn_decrypt_verify_clipboard">Iz odložišča</string>
- <string name="btn_encrypt_file">Šifriraj datoteko</string>
+ <string name="btn_encrypt_file">Šifriraj in shrani datoteko</string>
<string name="btn_save">Shrani</string>
<string name="btn_do_not_save">Prekliči</string>
<string name="btn_delete">Izbriši</string>
@@ -59,6 +65,8 @@
<string name="btn_lookup_key">Išči ključ</string>
<string name="btn_encryption_advanced_settings_show">Prikaži napredne nstavitve</string>
<string name="btn_encryption_advanced_settings_hide">Skrij napredne nastavitve</string>
+ <string name="btn_share_encrypted_signed">Deli šifrirano/podpisano sporočilo...</string>
+ <string name="btn_view_cert_key">Poglej ključ za overjanje</string>
<!--menu-->
<string name="menu_preferences">Nastavitve</string>
<string name="menu_help">Pomoč</string>
@@ -71,6 +79,7 @@
<string name="menu_create_key_expert">Ustvari ključ (napredno)</string>
<string name="menu_search">Išči</string>
<string name="menu_import_from_key_server">Strežnik</string>
+ <string name="menu_import_from_keybase">Uvozi iz Keybase.io</string>
<string name="menu_key_server">Strežnik...</string>
<string name="menu_update_key">Posodobi s strežnika</string>
<string name="menu_export_key_to_server">Naloži na strežnik</string>
@@ -116,7 +125,7 @@
<string name="label_expiry">Pretek</string>
<string name="label_usage">Uporaba</string>
<string name="label_key_size">Velikost ključa</string>
- <string name="label_main_user_id">Glavni ID uporabnika</string>
+ <string name="label_main_user_id">Glavna identiteta</string>
<string name="label_name">Ime</string>
<string name="label_comment">Komentar</string>
<string name="label_email">E-pošta</string>
@@ -200,7 +209,7 @@
<string name="key_deletion_confirmation_multi">Ali res želite izbrisati vse izbrane javne ključe?\nTega koraka ne boste mogli preklicati!</string>
<string name="secret_key_deletion_confirmation">Ali res želite izbrisati ZASEBNI ključ \'%s\'?\nTega koraka ne boste mogli preklicati!</string>
<string name="ask_save_changed_key">Vnesli ste spremembe v vaš \'keyring\'. Jih želite shraniti?</string>
- <string name="ask_empty_id_ok">Dodali ste prezen uporabniški iD! Ste prepričani, da želite nadaljevati?</string>
+ <string name="ask_empty_id_ok">Dodali ste prazno identiteto, ali res želite nadaljevati?</string>
<string name="public_key_deletetion_confirmation">Ali res želite izbrisati javni ključ \'%s\'?\nTega koraka ne boste mogli preklicati!</string>
<string name="also_export_secret_keys">Želite izvoziti tudi zasebne ključe?</string>
<plurals name="keys_added_and_updated_1">
@@ -247,12 +256,13 @@
<item quantity="other">Neupoštevanih %d slabih zasebnih ključev. Morda so bili izvoženi na način\n --export-secret-subkeys\nPoskrbite, da bodo izvoženi z\n --export-secret-keys</item>
</plurals>
<string name="key_send_success">Ključ je bil uspešno naložen na strežnik.</string>
- <string name="key_certify_success">Uspešno overjen ključ</string>
+ <string name="key_certify_success">Uspešno overjene identitete</string>
<string name="list_empty">Lista je prazna!</string>
<string name="nfc_successful">Ključ uspešno poslan preko NFC Beam!</string>
<string name="key_copied_to_clipboard">Ključ je bil prekopiran v odložišče!</string>
+ <string name="fingerprint_copied_to_clipboard">Prstni odtis je bil prekopiran v odložišče!</string>
<string name="key_has_already_been_certified">Ključ je že bil overjen!</string>
- <string name="select_key_to_sign">Izberite ključ, ki ga boste uporabljali za podpisovanje</string>
+ <string name="select_key_to_certify">Izberite ključ, ki ga boste uporabljali za overjanje!</string>
<string name="key_too_big_for_sharing">Ključ je prevelik za delitev na ta način!</string>
<!--errors
no punctuation, all lowercase,
@@ -265,8 +275,8 @@
<string name="error_master_key_must_not_be_el_gamal">glavni ključ ne more biti ElGamal</string>
<string name="error_unknown_algorithm_choice">neznana izbira algoritma</string>
<string name="error_user_id_no_email">najti ni nobene e-pošte</string>
- <string name="error_key_needs_a_user_id">potrebujem vsaj en uporabniški ID</string>
- <string name="error_main_user_id_must_not_be_empty">glavni uporabniški ID ne more biti prazen</string>
+ <string name="error_key_needs_a_user_id">potrebujete vsaj eno identiteto</string>
+ <string name="error_main_user_id_must_not_be_empty">glavna identiteta ne more biti prazna</string>
<string name="error_key_needs_master_key">potrebujem vsaj glavni ključ</string>
<string name="error_no_signature_passphrase">dano ni bilo nobeno geslo</string>
<string name="error_no_signature_key">dan ni bil noben podpisni ključ</string>
@@ -344,6 +354,7 @@
<string name="hint_public_keys">Iskanje javnih ključev</string>
<string name="hint_secret_keys">Iskanje zasebnih ključev</string>
<string name="action_share_key_with">Deli ključ z...</string>
+ <string name="hint_keybase_search">Išči v Keybase.io</string>
<!--key bit length selections-->
<string name="key_size_512">512</string>
<string name="key_size_768">768</string>
@@ -385,13 +396,13 @@
<string name="import_nfc_text">Za prejem ključev preko NFC mora biti naprava odklenjena.</string>
<string name="import_nfc_help_button">Pomoč</string>
<string name="import_clipboard_button">Pridobi ključ iz odložišča</string>
+ <string name="import_keybase_button">Pridobi ključ iz Keybase.io</string>
<!--Intent labels-->
<string name="intent_decrypt_file">Dešifriraj datoteko z OpenKeychain</string>
<string name="intent_import_key">Uvozi ključ z OpenKeychain</string>
<string name="intent_send_encrypt">Šifriraj z OpenKeychain</string>
<string name="intent_send_decrypt">Dešifriraj z OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Ni nobene prijavljene aplikacije!\n\nDruge aplikacije lahko zahtevajo dostop do aplikacije OpenKeychain. Po potrditvi dostopa bodo navedene tukaj.</string>
<string name="api_settings_show_info">Pokaži dodatne informacije</string>
<string name="api_settings_hide_info">Skrij dodatne informacije</string>
<string name="api_settings_show_advanced">Pokaži napredne nastavitve</string>
@@ -412,8 +423,8 @@
<string name="api_register_allow">Dovoli dostop</string>
<string name="api_register_disallow">Zavrni dostop</string>
<string name="api_register_error_select_key">Izberite ključ!</string>
- <string name="api_select_pub_keys_missing_text">Za naslednje uporabniške ID-je ni bil najden noben javni ključ:</string>
- <string name="api_select_pub_keys_dublicates_text">Za naslednje uporabniške ID-je obstaja več kot en javni ključ:</string>
+ <string name="api_select_pub_keys_missing_text">Za te identitete ni bil najden noben javni ključ:</string>
+ <string name="api_select_pub_keys_dublicates_text">Za te identitete obstaja več ključev:</string>
<string name="api_select_pub_keys_text">Preverite seznam prejemnikov!</string>
<string name="api_error_wrong_signature">Preverjanje podpisa ni uspelo! Ste namestili to aplikacijo iz drugega vira? Če ste prepričani, da to ni napad, prekličite registracijo te aplikacije v OpenKeychain in jo izvedite znova.</string>
<!--Share-->
@@ -437,9 +448,13 @@
<!--Key view-->
<string name="key_view_action_edit">Uredi ključ</string>
<string name="key_view_action_encrypt">Šifriraj s tem ključem</string>
- <string name="key_view_action_certify">Overi ta kluč</string>
- <string name="key_view_tab_main">Info</string>
- <string name="key_view_tab_certs">Overitve</string>
+ <string name="key_view_action_certify">Overi identitete</string>
+ <string name="key_view_action_share_with">Deli z...</string>
+ <string name="key_view_action_share_nfc">Deli preko NFC z držanjem hrbtov dveh telefonov skupaj</string>
+ <string name="key_view_tab_main">Glavne informacije</string>
+ <string name="key_view_tab_share">Deli</string>
+ <string name="key_view_tab_keys">Podključi</string>
+ <string name="key_view_tab_certs">Certifikati</string>
<!--Navigation Drawer-->
<string name="nav_keys">Ključi</string>
<string name="nav_encrypt">Podpiši in šifriraj</string>
@@ -456,23 +471,23 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Tu zapišite sporočilo, ki ga želite šifrirati in/ali podpisati...</string>
<string name="decrypt_content_edit_text_hint">Tu vnesite tajnopis za dešifriranje in/ali overbo...</string>
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">privzeto</string>
<string name="cert_none">brez</string>
<string name="cert_casual">navadno</string>
<string name="cert_positive">pozitivno</string>
- <string name="cert_revoke">preklic</string>
+ <string name="cert_revoke">preklicano</string>
<string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">neuspešno!</string>
<string name="cert_verify_error">napaka!</string>
<string name="cert_verify_unavailable">ključ ni na voljo</string>
<!--unsorted-->
- <string name="section_signer_id">Podpisnik</string>
+ <string name="section_certifier_id">Overovitelj</string>
<string name="section_cert">Podrobnosti potrdil</string>
- <string name="label_user_id">ID uporabnika</string>
+ <string name="label_user_id">Identiteta</string>
<string name="unknown_uid">&lt;neznan&gt;</string>
<string name="empty_certs">Ni potrdil za ta ključ</string>
- <string name="section_uids_to_sign">Uporabniški ID-ji za podpisovanje</string>
+ <string name="section_uids_to_certify">Identitete za overitev</string>
<string name="label_revocation">Razlog za preklic</string>
<string name="label_verify_status">Status preverjanja</string>
<string name="label_cert_type">Vrsta</string>
@@ -484,4 +499,5 @@
<string name="title_view_cert">Preglej podrobosti certifikata</string>
<string name="unknown_algorithm">neznan</string>
<string name="can_sign_not">ne more podpisati</string>
+ <string name="error_no_encrypt_subkey">Ni nobenega podključa za šifriranje!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml
index dfb060fb2..1205095aa 100644
--- a/OpenKeychain/src/main/res/values-tr/strings.xml
+++ b/OpenKeychain/src/main/res/values-tr/strings.xml
@@ -15,8 +15,6 @@
<string name="title_key_details">Anahtar Detayları</string>
<string name="title_help">Yardım</string>
<!--section-->
- <string name="section_user_ids">Kullanıcı IDleri</string>
- <string name="section_keys">Anahtarlar</string>
<string name="section_general">Genel</string>
<string name="section_defaults">Varsayılanlar</string>
<string name="section_advanced">Gelişmiş</string>
@@ -167,8 +165,6 @@
<!--Key list-->
<string name="key_list_empty_text3">ya da</string>
<!--Key view-->
- <string name="key_view_action_edit">Bu anahtarı düzenle</string>
- <string name="key_view_tab_main">Bilgi</string>
<!--Navigation Drawer-->
<string name="nav_keys">Anahtarlar</string>
<string name="edit">Düzenle</string>
@@ -177,14 +173,12 @@
<string name="secret_key_yes">mevcut</string>
<string name="secret_key_no">mevcut değil</string>
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<string name="cert_default">varsayılan</string>
<string name="cert_verify_ok">tamam</string>
<string name="cert_verify_failed">başarısız!</string>
<string name="cert_verify_error">hata!</string>
<string name="cert_verify_unavailable">anahtar mevcut değil</string>
<!--unsorted-->
- <string name="section_signer_id">İmzalayan</string>
- <string name="label_user_id">Kullanıcı ID</string>
<string name="can_sign_not">imzalanamadı</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml
index 91f7305f6..54204a044 100644
--- a/OpenKeychain/src/main/res/values-uk/strings.xml
+++ b/OpenKeychain/src/main/res/values-uk/strings.xml
@@ -20,17 +20,13 @@
<string name="title_export_keys">Експортувати ключі</string>
<string name="title_key_not_found">Ключ не знайдено</string>
<string name="title_send_key">Завантажити на сервер ключів</string>
- <string name="title_certify_key">Сертифікувати ключ</string>
<string name="title_key_details">Подробиці про ключ</string>
<string name="title_help">Довідка</string>
<!--section-->
- <string name="section_user_ids">ІД користувача</string>
- <string name="section_keys">Ключі</string>
<string name="section_general">Загальне</string>
<string name="section_defaults">Типове</string>
<string name="section_advanced">Додаткове</string>
<string name="section_master_key">Основний ключ</string>
- <string name="section_master_user_id">ІД основного ключа</string>
<string name="section_actions">Дії</string>
<string name="section_certification_key">Ваш ключ використаний для сертифікації</string>
<string name="section_upload_key">Завантажити ключ</string>
@@ -39,9 +35,7 @@
<string name="section_decrypt_verify">Розшифрувати і Перевірити</string>
<!--button-->
<string name="btn_certify">Сертифікувати</string>
- <string name="btn_decrypt_verify">Розшифрувати і Перевірити</string>
<string name="btn_decrypt_verify_clipboard">З буфера обміну</string>
- <string name="btn_encrypt_file">Шифрувати файл</string>
<string name="btn_save">Зберегти</string>
<string name="btn_do_not_save">Скасувати</string>
<string name="btn_delete">Вилучити</string>
@@ -113,7 +107,6 @@
<string name="label_expiry">Закінчення</string>
<string name="label_usage">Використання</string>
<string name="label_key_size">Розмір ключа</string>
- <string name="label_main_user_id">ІД основного користувача</string>
<string name="label_name">Назва</string>
<string name="label_comment">Коментар</string>
<string name="label_email">Ел. пошта</string>
@@ -184,7 +177,6 @@
<string name="key_deletion_confirmation_multi">Ви справді хочете вилучити усі вибрані відкриті ключі?\nВи не зможете це відмінити!</string>
<string name="secret_key_deletion_confirmation">Ви справді хочете вилучити секретний ключ \'%s\'?\nВи не зможете це відмінити!</string>
<string name="ask_save_changed_key">Ви внесли зміни до в\'язки ключів, ви б хотіли. Волієте їх зберегти?</string>
- <string name="ask_empty_id_ok">Ви вже додали порожній ідентифікатор користувача. Справді хочете продовжити?</string>
<string name="public_key_deletetion_confirmation">Ви справді хочете вилучити відкритий ключ \'%s\'?\nВи не зможете це відмінити!</string>
<string name="also_export_secret_keys">Також експортувати секретні ключі?</string>
<plurals name="keys_added_and_updated_1">
@@ -227,7 +219,6 @@
<string name="key_send_success">Успішно завантажено ключ на сервер</string>
<string name="list_empty">Цей список - порожній!</string>
<string name="key_copied_to_clipboard">Ключ вже скопійовано у буфер обміну!</string>
- <string name="select_key_to_sign">Будь ласка, виберіть ключ, використаний для підписування!</string>
<string name="key_too_big_for_sharing">Ключ надто великий для цього способу поширення!</string>
<!--errors
no punctuation, all lowercase,
@@ -240,8 +231,6 @@
<string name="error_master_key_must_not_be_el_gamal">основний ключ не може бути ключем ElGamal</string>
<string name="error_unknown_algorithm_choice">вибір невідомого алгоритму</string>
<string name="error_user_id_no_email">жодного листа не знайдено</string>
- <string name="error_key_needs_a_user_id">потрібний хоча б один ІД користувача</string>
- <string name="error_main_user_id_must_not_be_empty">ІД основного користувача не має бути порожнім</string>
<string name="error_key_needs_master_key">потрібний хоча б один основний ключ</string>
<string name="error_no_signature_passphrase">не подано парольної фрази</string>
<string name="error_no_signature_key">не подано ключ підпису</string>
@@ -359,7 +348,6 @@
<string name="intent_send_encrypt">Зашифрувати з OpenKeychain</string>
<string name="intent_send_decrypt">Розшифрувати з OpenKeychain</string>
<!--Remote API-->
- <string name="api_no_apps">Нема зареєстрованих програм!\n\nСтороні програми можуть вимагати доступ до OpenPGP Keychain. Після надання доступу вони будуть наведені тут.</string>
<string name="api_settings_show_info">Показати додаткову інформацію</string>
<string name="api_settings_hide_info">Приховати додаткову інформацію</string>
<string name="api_settings_show_advanced">Показати додаткові налаштування</string>
@@ -380,8 +368,6 @@
<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_error_wrong_signature">Перевірка підпису пакету не вдалася! Може ви встановили програму з іншого джерела? Якщо ви впевнені, що це не атака, то відкличте реєстрацію програми у OpenKeychain та знову зареєструйте її.</string>
<!--Share-->
@@ -402,9 +388,6 @@
<string name="key_list_empty_button_create">створюється ваш власний ключ</string>
<string name="key_list_empty_button_import">імпортуюся ключі.</string>
<!--Key view-->
- <string name="key_view_action_edit">Редагувати цей ключ</string>
- <string name="key_view_tab_main">Інформація</string>
- <string name="key_view_tab_certs">Сертифікати</string>
<!--Navigation Drawer-->
<string name="nav_encrypt">Підписати і зашифрувати</string>
<string name="nav_decrypt">Розшифрувати і Перевірити</string>
@@ -420,22 +403,18 @@
<!--hints-->
<string name="encrypt_content_edit_text_hint">Напишіть повідомлення для шифрування та/або підпису…</string>
<string name="decrypt_content_edit_text_hint">Уведіть зашифрований текст тут для його розшифрування та/або перевірки…</string>
- <!--certifications-->
+ <!--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">Гаразд</string>
<string name="cert_verify_failed">Невдача!</string>
<string name="cert_verify_error">Помилка!</string>
<string name="cert_verify_unavailable">Недоступний ключ</string>
<!--unsorted-->
- <string name="section_signer_id">Підписувач</string>
<string name="section_cert">Дані сертифікату</string>
- <string name="label_user_id">ІД користувача</string>
<string name="empty_certs">Немає сертифікатів для цього ключа</string>
- <string name="section_uids_to_sign">ІД користувача для реєстрації</string>
<string name="label_revocation">Причина відхилення</string>
<string name="label_verify_status">Стан перевірки</string>
<string name="label_cert_type">Тип</string>
diff --git a/OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml b/OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml
new file mode 100644
index 000000000..0b6c4c4f5
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-v11/styles_keychaintheme.xml
@@ -0,0 +1,35 @@
+<?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
new file mode 100644
index 000000000..4f13f81c6
--- /dev/null
+++ b/OpenKeychain/src/main/res/values-v11/themes_keychaintheme.xml
@@ -0,0 +1,32 @@
+<?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-v14/styles.xml b/OpenKeychain/src/main/res/values-v14/styles.xml
deleted file mode 100644
index 4f8c45117..000000000
--- a/OpenKeychain/src/main/res/values-v14/styles.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <!-- Used in Android >= 4 -->
-
- <style name="KeychainTheme" parent="@style/Theme.AppCompat.Light">
- </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">4dp</item>
- <item name="android:textAllCaps">true</item>
- <item name="android:textColor">@color/emphasis</item>
- <item name="android:textSize">14sp</item>
- </style>
-
-</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values-zh/strings.xml b/OpenKeychain/src/main/res/values-zh/strings.xml
index 6783f809f..8dfb6b2ca 100644
--- a/OpenKeychain/src/main/res/values-zh/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh/strings.xml
@@ -21,8 +21,6 @@
<string name="title_send_key">上传到密钥服务器</string>
<string name="title_help">帮助</string>
<!--section-->
- <string name="section_user_ids">用户ID</string>
- <string name="section_keys">密钥</string>
<string name="section_general">常规</string>
<string name="section_defaults">缺省</string>
<string name="section_advanced">高级</string>
@@ -30,8 +28,6 @@
<string name="section_key_server">密钥服务器</string>
<string name="section_decrypt_verify">解密并验证</string>
<!--button-->
- <string name="btn_decrypt_verify">解密并验证</string>
- <string name="btn_encrypt_file">加密文件</string>
<string name="btn_save">保存</string>
<string name="btn_do_not_save">取消</string>
<string name="btn_delete">删除</string>
@@ -104,8 +100,6 @@
<string name="error_external_storage_not_ready">外置存储没有准备好</string>
<string name="error_key_size_minimum512bit">密钥的大小必须至少512位</string>
<string name="error_unknown_algorithm_choice">位置的算法选择</string>
- <string name="error_key_needs_a_user_id">需要至少一个用户id</string>
- <string name="error_main_user_id_must_not_be_empty">主用户id不能是空的</string>
<string name="error_key_needs_master_key">需要至少一个主密钥</string>
<string name="error_no_signature_passphrase">没有提供密语</string>
<string name="error_no_signature_key">没有提供密钥</string>
@@ -161,6 +155,6 @@
<!--Navigation Drawer-->
<string name="nav_import">导入密钥</string>
<!--hints-->
- <!--certifications-->
+ <!--certs-->
<!--unsorted-->
</resources>
diff --git a/OpenKeychain/src/main/res/values/arrays.xml b/OpenKeychain/src/main/res/values/arrays.xml
index 4173d49e4..699c02aff 100644
--- a/OpenKeychain/src/main/res/values/arrays.xml
+++ b/OpenKeychain/src/main/res/values/arrays.xml
@@ -54,6 +54,7 @@
<item>@string/menu_import_from_qr_code</item>
<item>@string/import_from_clipboard</item>
<item>@string/menu_import_from_nfc</item>
+ <item>@string/menu_import_from_keybase</item>
</string-array>
</resources>
diff --git a/OpenKeychain/src/main/res/values/colors.xml b/OpenKeychain/src/main/res/values/colors.xml
index 0f0b2a600..c0042d215 100644
--- a/OpenKeychain/src/main/res/values/colors.xml
+++ b/OpenKeychain/src/main/res/values/colors.xml
@@ -1,11 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <color name="emphasis">#31b6e7</color>
+ <color name="emphasis">#aa66cc</color>
+ <color name="emphasis_dark">#9933cc</color>
<color name="bg_gray">#cecbce</color>
+ <color name="tertiary_text_light">#808080</color>
- <color name="result_red">#FF4444</color>
- <color name="result_orange">#FFBB33</color>
- <color name="result_green">#99CC00</color>
- <color name="result_blue">#33B5E5</color>
-</resources> \ No newline at end of file
+ <color name="holo_gray_light">#33999999</color>
+ <color name="holo_gray_bright">#33CCCCCC</color>
+
+ <color name="result_red">#ffff4444</color>
+ <color name="result_orange">#ffffbb33</color>
+ <color name="result_green">#ff99cc00</color>
+ <color name="result_purple">#aa66cc</color>
+</resources>
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 72a1b38cc..194984062 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -15,6 +15,8 @@
<string name="title_change_passphrase">Change Passphrase</string>
<string name="title_set_passphrase">Set Passphrase</string>
<string name="title_share_with">Share with…</string>
+ <string name="title_share_fingerprint_with">Share fingerprint with…</string>
+ <string name="title_share_key">Share key with…</string>
<string name="title_share_file">Share file with…</string>
<string name="title_encrypt_to_file">Encrypt To File</string>
<string name="title_decrypt_to_file">Decrypt To File</string>
@@ -23,30 +25,34 @@
<string name="title_export_keys">Export Keys</string>
<string name="title_key_not_found">Key Not Found</string>
<string name="title_send_key">Upload to Keyserver</string>
- <string name="title_certify_key">Certify Key</string>
+ <string name="title_certify_key">Certify Identities</string>
<string name="title_key_details">Key Details</string>
<string name="title_help">Help</string>
<!-- section -->
- <string name="section_user_ids">User IDs</string>
- <string name="section_keys">Keys</string>
+ <string name="section_user_ids">Identities</string>
+ <string name="section_keys">Subkeys</string>
<string name="section_general">General</string>
<string name="section_defaults">Defaults</string>
<string name="section_advanced">Advanced</string>
<string name="section_master_key">Master Key</string>
- <string name="section_master_user_id">Master User ID</string>
+ <string name="section_master_user_id">Primary Identity</string>
<string name="section_actions">Actions</string>
+ <string name="section_share_key">Whole key</string>
<string name="section_certification_key">Your Key used for certification</string>
<string name="section_upload_key">Upload Key</string>
<string name="section_key_server">Keyserver</string>
<string name="section_encrypt_and_or_sign">Encrypt and/or Sign</string>
<string name="section_decrypt_verify">Decrypt and Verify</string>
+ <string name="section_fingerprint">Fingerprint</string>
+ <string name="section_key_to_certify">Key to be certified</string>
<!-- button -->
<string name="btn_certify">Certify</string>
- <string name="btn_decrypt_verify">Decrypt and Verify</string>
+ <string name="btn_decrypt_verify_file">Decrypt, verify, and save file</string>
+ <string name="btn_decrypt_verify_message">Decrypt and verify message</string>
<string name="btn_decrypt_verify_clipboard">From Clipboard</string>
- <string name="btn_encrypt_file">Encrypt File</string>
+ <string name="btn_encrypt_file">Encrypt and save file</string>
<string name="btn_save">Save</string>
<string name="btn_do_not_save">Cancel</string>
<string name="btn_delete">Delete</string>
@@ -62,6 +68,8 @@
<string name="btn_lookup_key">Lookup key</string>
<string name="btn_encryption_advanced_settings_show">Show advanced settings</string>
<string name="btn_encryption_advanced_settings_hide">Hide advanced settings</string>
+ <string name="btn_share_encrypted_signed">Share encrypted/signed message…</string>
+ <string name="btn_view_cert_key">View certification key</string>
<!-- menu -->
<string name="menu_preferences">Settings</string>
@@ -75,6 +83,7 @@
<string name="menu_create_key_expert">Create key (expert)</string>
<string name="menu_search">Search</string>
<string name="menu_import_from_key_server">Keyserver</string>
+ <string name="menu_import_from_keybase">Import from Keybase.io</string>
<string name="menu_key_server">Keyserver…</string>
<string name="menu_update_key">Update from keyserver</string>
<string name="menu_export_key_to_server">Upload to key server</string>
@@ -121,7 +130,7 @@
<string name="label_expiry">Expiry</string>
<string name="label_usage">Usage</string>
<string name="label_key_size">Key Size</string>
- <string name="label_main_user_id">Main User ID</string>
+ <string name="label_main_user_id">Primary identity</string>
<string name="label_name">Name</string>
<string name="label_comment">Comment</string>
<string name="label_email">Email</string>
@@ -207,7 +216,7 @@
<string name="key_deletion_confirmation_multi">Do you really want to delete all selected public keys?\nYou can\'t undo this!</string>
<string name="secret_key_deletion_confirmation">Do you really want to delete the SECRET key \'%s\'?\nYou can\'t undo this!</string>
<string name="ask_save_changed_key">You have made changes to the keyring, would you like to save it?</string>
- <string name="ask_empty_id_ok">You have added an empty user ID, are you sure you want to continue?</string>
+ <string name="ask_empty_id_ok">You have added an empty identity, are you sure you want to continue?</string>
<string name="public_key_deletetion_confirmation">Do you really want to delete the public key \'%s\'?\nYou can\'t undo this!</string>
<string name="also_export_secret_keys">Also export secret keys?</string>
@@ -247,12 +256,13 @@
</plurals>
<string name="key_send_success">Successfully uploaded key to server</string>
- <string name="key_certify_success">Successfully certified key</string>
+ <string name="key_certify_success">Successfully certified identities</string>
<string name="list_empty">This list is empty!</string>
<string name="nfc_successful">Successfully sent key with NFC Beam!</string>
<string name="key_copied_to_clipboard">Key has been copied to the clipboard!</string>
+ <string name="fingerprint_copied_to_clipboard">Fingerprint has been copied to the clipboard!</string>
<string name="key_has_already_been_certified">Key has already been certified!</string>
- <string name="select_key_to_sign">Please select a key to be used for signing!</string>
+ <string name="select_key_to_certify">Please select a key to be used for certification!</string>
<string name="key_too_big_for_sharing">Key is too big to be shared this way!</string>
<!--
@@ -268,8 +278,8 @@
<string name="error_master_key_must_not_be_el_gamal">the master key cannot be an ElGamal key</string>
<string name="error_unknown_algorithm_choice">unknown algorithm choice</string>
<string name="error_user_id_no_email">no email found</string>
- <string name="error_key_needs_a_user_id">need at least one user id</string>
- <string name="error_main_user_id_must_not_be_empty">main user id must not be empty</string>
+ <string name="error_key_needs_a_user_id">need at least one identity</string>
+ <string name="error_main_user_id_must_not_be_empty">primary identity must not be empty</string>
<string name="error_key_needs_master_key">need at least a master key</string>
<string name="error_no_signature_passphrase">no passphrase given</string>
<string name="error_no_signature_key">no signature key given</string>
@@ -348,6 +358,7 @@
<string name="hint_public_keys">Search Public Keys</string>
<string name="hint_secret_keys">Search Secret Keys</string>
<string name="action_share_key_with">Share Key with…</string>
+ <string name="hint_keybase_search">Search Keybase.io</string>
<!-- key bit length selections -->
<string name="key_size_512">512</string>
@@ -393,6 +404,7 @@
<string name="import_nfc_text">To receive keys via NFC, the device needs to be unlocked.</string>
<string name="import_nfc_help_button">Help</string>
<string name="import_clipboard_button">Get key from clipboard</string>
+ <string name="import_keybase_button">Get key from Keybase.io</string>
<!-- Intent labels -->
<string name="intent_decrypt_file">Decrypt File with OpenKeychain</string>
@@ -401,7 +413,7 @@
<string name="intent_send_decrypt">Decrypt with OpenKeychain</string>
<!-- Remote API -->
- <string name="api_no_apps">No registered applications!\n\nThird-party applications can request access to OpenKeychain. After granting access, they will be listed here.</string>
+ <string name="api_no_apps">No registered applications!\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>
@@ -412,6 +424,7 @@
<string name="api_settings_save">Save</string>
<string name="api_settings_cancel">Cancel</string>
<string name="api_settings_revoke">Revoke access</string>
+ <string name="api_settings_start">Start application</string>
<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>
@@ -422,8 +435,8 @@
<string name="api_register_allow">Allow access</string>
<string name="api_register_disallow">Disallow access</string>
<string name="api_register_error_select_key">Please select a key!</string>
- <string name="api_select_pub_keys_missing_text">No public keys were found for these user ids:</string>
- <string name="api_select_pub_keys_dublicates_text">More than one public key exist for these user ids:</string>
+ <string name="api_select_pub_keys_missing_text">No public keys were found for these identities:</string>
+ <string name="api_select_pub_keys_dublicates_text">More than one public key exist for these identities:</string>
<string name="api_select_pub_keys_text">Please review the list of recipients!</string>
<string name="api_error_wrong_signature">Signature check failed! Have you installed this app from a different source? If you are sure that this is not an attack, revoke this app\'s registration in OpenKeychain and then register the app again.</string>
@@ -447,11 +460,15 @@
<string name="key_list_empty_button_import">importing keys.</string>
<!-- Key view -->
- <string name="key_view_action_edit">Edit this key</string>
+ <string name="key_view_action_edit">Edit key</string>
<string name="key_view_action_encrypt">Encrypt with this key</string>
- <string name="key_view_action_certify">Certify this key</string>
- <string name="key_view_tab_main">Info</string>
- <string name="key_view_tab_certs">Certifications</string>
+ <string name="key_view_action_certify">Certify identities</string>
+ <string name="key_view_action_share_with">Share with…</string>
+ <string name="key_view_action_share_nfc">Share over NFC by holding the devices back to back</string>
+ <string name="key_view_tab_main">Main Info</string>
+ <string name="key_view_tab_share">Share</string>
+ <string name="key_view_tab_keys">Subkeys</string>
+ <string name="key_view_tab_certs">Certificates</string>
<!-- Navigation Drawer -->
<string name="nav_keys">Keys</string>
@@ -471,24 +488,24 @@
<string name="encrypt_content_edit_text_hint">Write message here to encrypt and/or sign…</string>
<string name="decrypt_content_edit_text_hint">Enter ciphertext here to decrypt and/or verify…</string>
- <!-- certifications -->
+ <!-- certs -->
<string name="cert_default">default</string>
<string name="cert_none">none</string>
<string name="cert_casual">casual</string>
<string name="cert_positive">positive</string>
- <string name="cert_revoke">revoke</string>
+ <string name="cert_revoke">revoked</string>
<string name="cert_verify_ok">ok</string>
<string name="cert_verify_failed">failed!</string>
<string name="cert_verify_error">error!</string>
<string name="cert_verify_unavailable">key unavailable</string>
<!-- unsorted -->
- <string name="section_signer_id">Signer</string>
+ <string name="section_certifier_id">Certifier</string>
<string name="section_cert">Certificate Details</string>
- <string name="label_user_id">User ID</string>
+ <string name="label_user_id">Identity</string>
<string name="unknown_uid">&lt;unknown&gt;</string>
<string name="empty_certs">No certificates for this key</string>
- <string name="section_uids_to_sign">User IDs to sign</string>
+ <string name="section_uids_to_certify">Identities to certify</string>
<string name="label_revocation">Revocation Reason</string>
<string name="label_verify_status">Verification Status</string>
<string name="label_cert_type">Type</string>
@@ -501,5 +518,6 @@
<string name="unknown_algorithm">unknown</string>
<string name="can_sign_not">cannot sign</string>
<string name="error_encoding">Encoding error</string>
+ <string name="error_no_encrypt_subkey">No encryption subkey available!</string>
</resources>
diff --git a/OpenKeychain/src/main/res/values/styles.xml b/OpenKeychain/src/main/res/values/styles.xml
index f03d72605..27cd1546a 100644
--- a/OpenKeychain/src/main/res/values/styles.xml
+++ b/OpenKeychain/src/main/res/values/styles.xml
@@ -2,7 +2,6 @@
<resources>
<!-- Used in Android < 4 -->
-
<style name="KeychainTheme" parent="@style/Theme.AppCompat.Light">
<item name="android:alertDialogStyle">@style/CustomDialogTheme</item>
</style>
@@ -25,10 +24,14 @@
<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">4dp</item>
+ <item name="android:paddingLeft">8dp</item>
+ <item name="android:textStyle">bold</item>
<item name="android:textColor">@color/emphasis</item>
<item name="android:textSize">14sp</item>
</style>
+ <style name="SelectableItem">
+ <item name="android:background">@drawable/selector_transparent_button</item>
+ </style>
</resources> \ No newline at end of file