From 5cf8b8450dc2d6d7ccc10f9ab9a3d7ac6985f744 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Sat, 24 May 2014 07:19:50 +0200 Subject: [PATCH] moved broadcast receiver for copy to clipboard outside of service. This allows to receive the broadcast even if the app was killed. We can display at a message then. added permission for broadcast to prevent malicious apps from copying to clipboard without the user action --- .../Properties/AssemblyInfo.cs | 4 + .../Resources/Resource.designer.cs | 304 ++++++++++-------- .../Resources/values/strings.xml | 3 + src/keepass2android/app/AppTask.cs | 6 +- src/keepass2android/intents/Intents.cs | 1 + src/keepass2android/keepass2android.csproj | 1 + .../services/CopyToClipboardService.cs | 169 ++++++---- 7 files changed, 279 insertions(+), 209 deletions(-) diff --git a/src/keepass2android/Properties/AssemblyInfo.cs b/src/keepass2android/Properties/AssemblyInfo.cs index 0bdde333..3dfc3679 100644 --- a/src/keepass2android/Properties/AssemblyInfo.cs +++ b/src/keepass2android/Properties/AssemblyInfo.cs @@ -17,6 +17,8 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file using System.Reflection; using System.Runtime.CompilerServices; using Android.App; +using Android.Content.PM; +using keepass2android; // Information about this assembly is defined by the following attributes. // Change them to the values specific to your project. @@ -42,3 +44,5 @@ using Android.App; //[assembly: AssemblyDelaySign(false)] //[assembly: AssemblyKeyFile("")] +[assembly: Permission(Name = "keepass2android."+AppNames.PackagePart+".permission.CopyToClipboard", Label = "CopyToClipboard", ProtectionLevel=Protection.Signature)] +[assembly: UsesPermission(Name = "keepass2android." + AppNames.PackagePart + ".permission.CopyToClipboard")] diff --git a/src/keepass2android/Resources/Resource.designer.cs b/src/keepass2android/Resources/Resource.designer.cs index a674782b..9feed729 100644 --- a/src/keepass2android/Resources/Resource.designer.cs +++ b/src/keepass2android/Resources/Resource.designer.cs @@ -3431,59 +3431,59 @@ namespace keepass2android // aapt resource value: 0x7f090271 public const int CannotMoveGroupHere = 2131296881; - // aapt resource value: 0x7f0902b8 - public const int CertificateFailure = 2131296952; - - // aapt resource value: 0x7f0902b7 - public const int CertificateWarning = 2131296951; - - // aapt resource value: 0x7f0902c9 - public const int ChangeLog = 2131296969; - - // aapt resource value: 0x7f0902c8 - public const int ChangeLog_0_7 = 2131296968; - - // aapt resource value: 0x7f0902c6 - public const int ChangeLog_0_8 = 2131296966; - - // aapt resource value: 0x7f0902c5 - public const int ChangeLog_0_8_1 = 2131296965; - - // aapt resource value: 0x7f0902c4 - public const int ChangeLog_0_8_2 = 2131296964; - - // aapt resource value: 0x7f0902c3 - public const int ChangeLog_0_8_3 = 2131296963; - - // aapt resource value: 0x7f0902c2 - public const int ChangeLog_0_8_4 = 2131296962; - - // aapt resource value: 0x7f0902c1 - public const int ChangeLog_0_8_5 = 2131296961; - - // aapt resource value: 0x7f0902c0 - public const int ChangeLog_0_8_6 = 2131296960; - - // aapt resource value: 0x7f0902bf - public const int ChangeLog_0_9 = 2131296959; - - // aapt resource value: 0x7f0902be - public const int ChangeLog_0_9_1 = 2131296958; - // aapt resource value: 0x7f0902bd - public const int ChangeLog_0_9_2 = 2131296957; + public const int CertificateFailure = 2131296957; // aapt resource value: 0x7f0902bc - public const int ChangeLog_0_9_3 = 2131296956; + public const int CertificateWarning = 2131296956; - // aapt resource value: 0x7f0902bb - public const int ChangeLog_0_9_3_r5 = 2131296955; + // aapt resource value: 0x7f0902cf + public const int ChangeLog = 2131296975; + + // aapt resource value: 0x7f0902ce + public const int ChangeLog_0_7 = 2131296974; + + // aapt resource value: 0x7f0902cc + public const int ChangeLog_0_8 = 2131296972; + + // aapt resource value: 0x7f0902cb + public const int ChangeLog_0_8_1 = 2131296971; + + // aapt resource value: 0x7f0902ca + public const int ChangeLog_0_8_2 = 2131296970; + + // aapt resource value: 0x7f0902c9 + public const int ChangeLog_0_8_3 = 2131296969; + + // aapt resource value: 0x7f0902c8 + public const int ChangeLog_0_8_4 = 2131296968; // aapt resource value: 0x7f0902c7 - public const int ChangeLog_keptDonate = 2131296967; + public const int ChangeLog_0_8_5 = 2131296967; - // aapt resource value: 0x7f0902ba - public const int ChangeLog_title = 2131296954; + // aapt resource value: 0x7f0902c6 + public const int ChangeLog_0_8_6 = 2131296966; + + // aapt resource value: 0x7f0902c5 + public const int ChangeLog_0_9 = 2131296965; + + // aapt resource value: 0x7f0902c4 + public const int ChangeLog_0_9_1 = 2131296964; + + // aapt resource value: 0x7f0902c3 + public const int ChangeLog_0_9_2 = 2131296963; + + // aapt resource value: 0x7f0902c2 + public const int ChangeLog_0_9_3 = 2131296962; + + // aapt resource value: 0x7f0902c1 + public const int ChangeLog_0_9_3_r5 = 2131296961; + + // aapt resource value: 0x7f0902cd + public const int ChangeLog_keptDonate = 2131296973; + + // aapt resource value: 0x7f0902c0 + public const int ChangeLog_title = 2131296960; // aapt resource value: 0x7f090123 public const int CheckForFileChangesOnSave_key = 2131296547; @@ -3518,14 +3518,20 @@ namespace keepass2android // aapt resource value: 0x7f090263 public const int CouldNotSaveToRemote = 2131296867; - // aapt resource value: 0x7f090298 - public const int CouldntLoadOtpAuxFile = 2131296920; + // aapt resource value: 0x7f0902a5 + public const int CouldntLoadChalAuxFile = 2131296933; + + // aapt resource value: 0x7f0902a6 + public const int CouldntLoadChalAuxFile_Hint = 2131296934; // aapt resource value: 0x7f090299 - public const int CouldntLoadOtpAuxFile_Hint = 2131296921; + public const int CouldntLoadOtpAuxFile = 2131296921; - // aapt resource value: 0x7f09029f - public const int CouldntParseOtpSecret = 2131296927; + // aapt resource value: 0x7f09029a + public const int CouldntLoadOtpAuxFile_Hint = 2131296922; + + // aapt resource value: 0x7f0902a0 + public const int CouldntParseOtpSecret = 2131296928; // aapt resource value: 0x7f090134 public const int CreditsText = 2131296564; @@ -3548,8 +3554,11 @@ namespace keepass2android // aapt resource value: 0x7f09026f public const int ErrorOcurred = 2131296879; - // aapt resource value: 0x7f0902a1 - public const int ErrorUpdatingOtpAuxFile = 2131296929; + // aapt resource value: 0x7f0902a7 + public const int ErrorUpdatingChalAuxFile = 2131296935; + + // aapt resource value: 0x7f0902a2 + public const int ErrorUpdatingOtpAuxFile = 2131296930; // aapt resource value: 0x7f09014e public const int FileHandling_prefs = 2131296590; @@ -3626,8 +3635,8 @@ namespace keepass2android // aapt resource value: 0x7f090235 public const int OpenKp2aKeyboardAutomatically_title = 2131296821; - // aapt resource value: 0x7f0902a0 - public const int OtpKeyError = 2131296928; + // aapt resource value: 0x7f0902a1 + public const int OtpKeyError = 2131296929; // aapt resource value: 0x7f090255 public const int ParsingDatabase = 2131296853; @@ -3722,29 +3731,29 @@ namespace keepass2android // aapt resource value: 0x7f09025f public const int RestoringRemoteFile = 2131296863; - // aapt resource value: 0x7f0902b1 - public const int SCOPE_CURRENT_ENTRY_explanation = 2131296945; - - // aapt resource value: 0x7f0902b0 - public const int SCOPE_CURRENT_ENTRY_title = 2131296944; - - // aapt resource value: 0x7f0902af - public const int SCOPE_DATABASE_ACTIONS_explanation = 2131296943; - - // aapt resource value: 0x7f0902ae - public const int SCOPE_DATABASE_ACTIONS_title = 2131296942; - - // aapt resource value: 0x7f0902b3 - public const int SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation = 2131296947; - - // aapt resource value: 0x7f0902b2 - public const int SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_title = 2131296946; + // aapt resource value: 0x7f0902b6 + public const int SCOPE_CURRENT_ENTRY_explanation = 2131296950; // aapt resource value: 0x7f0902b5 - public const int SCOPE_QUERY_CREDENTIALS_explanation = 2131296949; + public const int SCOPE_CURRENT_ENTRY_title = 2131296949; // aapt resource value: 0x7f0902b4 - public const int SCOPE_QUERY_CREDENTIALS_title = 2131296948; + public const int SCOPE_DATABASE_ACTIONS_explanation = 2131296948; + + // aapt resource value: 0x7f0902b3 + public const int SCOPE_DATABASE_ACTIONS_title = 2131296947; + + // aapt resource value: 0x7f0902b8 + public const int SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation = 2131296952; + + // aapt resource value: 0x7f0902b7 + public const int SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_title = 2131296951; + + // aapt resource value: 0x7f0902ba + public const int SCOPE_QUERY_CREDENTIALS_explanation = 2131296954; + + // aapt resource value: 0x7f0902b9 + public const int SCOPE_QUERY_CREDENTIALS_title = 2131296953; // aapt resource value: 0x7f090210 public const int SaveAttachmentDialog_open = 2131296784; @@ -3764,8 +3773,8 @@ namespace keepass2android // aapt resource value: 0x7f090211 public const int SaveAttachment_doneMessage = 2131296785; - // aapt resource value: 0x7f0902a2 - public const int SavingOtpAuxFile = 2131296930; + // aapt resource value: 0x7f0902a3 + public const int SavingOtpAuxFile = 2131296931; // aapt resource value: 0x7f090251 public const int SettingPassword = 2131296849; @@ -3872,6 +3881,9 @@ namespace keepass2android // aapt resource value: 0x7f09025a public const int YesSynchronize = 2131296858; + // aapt resource value: 0x7f090298 + public const int YubiChallengeNotInstalled = 2131296920; + // aapt resource value: 0x7f090131 public const int about_feedback = 2131296561; @@ -4250,6 +4262,9 @@ namespace keepass2android // aapt resource value: 0x7f090157 public const int available_through_keyboard = 2131296599; + // aapt resource value: 0x7f0902a4 + public const int bad_resp = 2131296932; + // aapt resource value: 0x7f090055 public const int bigram_suggestion = 2131296341; @@ -4259,11 +4274,11 @@ namespace keepass2android // aapt resource value: 0x7f090151 public const int brackets = 2131296593; - // aapt resource value: 0x7f0902ce - public const int browser_intall_text = 2131296974; + // aapt resource value: 0x7f0902d4 + public const int browser_intall_text = 2131296980; - // aapt resource value: 0x7f0902cf - public const int building_search_idx = 2131296975; + // aapt resource value: 0x7f0902d5 + public const int building_search_idx = 2131296981; // aapt resource value: 0x7f09028c public const int button_change_location = 2131296908; @@ -4394,14 +4409,14 @@ namespace keepass2android // aapt resource value: 0x7f090101 public const int db_key = 2131296513; - // aapt resource value: 0x7f0902d0 - public const int decrypting_db = 2131296976; + // aapt resource value: 0x7f0902d6 + public const int decrypting_db = 2131296982; - // aapt resource value: 0x7f0902d1 - public const int decrypting_entry = 2131296977; + // aapt resource value: 0x7f0902d7 + public const int decrypting_entry = 2131296983; - // aapt resource value: 0x7f0902d2 - public const int default_checkbox = 2131296978; + // aapt resource value: 0x7f0902d8 + public const int default_checkbox = 2131296984; // aapt resource value: 0x7f0900f3 public const int default_file_path = 2131296499; @@ -4424,8 +4439,8 @@ namespace keepass2android // aapt resource value: 0x7f090108 public const int design_key = 2131296520; - // aapt resource value: 0x7f0902ca - public const int design_title = 2131296970; + // aapt resource value: 0x7f0902d0 + public const int design_title = 2131296976; // aapt resource value: 0x7f09015e public const int digits = 2131296606; @@ -4457,11 +4472,11 @@ namespace keepass2android // aapt resource value: 0x7f090160 public const int ellipsis = 2131296608; - // aapt resource value: 0x7f0902cc - public const int enable_plugin_question = 2131296972; + // aapt resource value: 0x7f0902d2 + public const int enable_plugin_question = 2131296978; - // aapt resource value: 0x7f0902cb - public const int enable_plugin_title = 2131296971; + // aapt resource value: 0x7f0902d1 + public const int enable_plugin_title = 2131296977; // aapt resource value: 0x7f0901fe public const int enable_quickunlock = 2131296766; @@ -4493,8 +4508,8 @@ namespace keepass2android // aapt resource value: 0x7f090162 public const int entry_accessed = 2131296610; - // aapt resource value: 0x7f0902d3 - public const int entry_and_or = 2131296979; + // aapt resource value: 0x7f0902d9 + public const int entry_and_or = 2131296985; // aapt resource value: 0x7f090172 public const int entry_binaries = 2131296626; @@ -4547,8 +4562,8 @@ namespace keepass2android // aapt resource value: 0x7f090294 public const int error_adding_keyfile = 2131296916; - // aapt resource value: 0x7f0902d4 - public const int error_arc4 = 2131296980; + // aapt resource value: 0x7f0902da + public const int error_arc4 = 2131296986; // aapt resource value: 0x7f090173 public const int error_can_not_handle_uri = 2131296627; @@ -4589,8 +4604,8 @@ namespace keepass2android // aapt resource value: 0x7f09017e public const int error_nopass = 2131296638; - // aapt resource value: 0x7f0902d5 - public const int error_out_of_memory = 2131296981; + // aapt resource value: 0x7f0902db + public const int error_out_of_memory = 2131296987; // aapt resource value: 0x7f09017f public const int error_pass_gen_type = 2131296639; @@ -4601,8 +4616,8 @@ namespace keepass2android // aapt resource value: 0x7f090181 public const int error_rounds_not_number = 2131296641; - // aapt resource value: 0x7f0902d6 - public const int error_rounds_too_large = 2131296982; + // aapt resource value: 0x7f0902dc + public const int error_rounds_too_large = 2131296988; // aapt resource value: 0x7f090216 public const int error_string_key = 2131296790; @@ -4619,8 +4634,8 @@ namespace keepass2android // aapt resource value: 0x7f0901d1 public const int export_database_successful = 2131296721; - // aapt resource value: 0x7f0902b9 - public const int export_fileformats_title = 2131296953; + // aapt resource value: 0x7f0902be + public const int export_fileformats_title = 2131296958; // aapt resource value: 0x7f090150 public const int export_prefs = 2131296592; @@ -4685,8 +4700,8 @@ namespace keepass2android // aapt resource value: 0x7f090186 public const int generate_password = 2131296646; - // aapt resource value: 0x7f0902b6 - public const int get_regular_version = 2131296950; + // aapt resource value: 0x7f0902bb + public const int get_regular_version = 2131296955; // aapt resource value: 0x7f090187 public const int group = 2131296647; @@ -4790,11 +4805,11 @@ namespace keepass2android // aapt resource value: 0x7f0901dd public const int insert_element_here = 2131296733; - // aapt resource value: 0x7f0902d7 - public const int install_from_market = 2131296983; + // aapt resource value: 0x7f0902dd + public const int install_from_market = 2131296989; - // aapt resource value: 0x7f0902d8 - public const int install_from_website = 2131296984; + // aapt resource value: 0x7f0902de + public const int install_from_website = 2131296990; // aapt resource value: 0x7f090196 public const int invalid_algorithm = 2131296662; @@ -4829,6 +4844,9 @@ namespace keepass2android // aapt resource value: 0x7f090145 public const int kill_app_label = 2131296581; + // aapt resource value: 0x7f0902bf + public const int killed_by_os = 2131296959; + // aapt resource value: 0x7f0900ab public const int kp2a_auto_fill = 2131296427; @@ -4940,8 +4958,8 @@ namespace keepass2android // aapt resource value: 0x7f09019b public const int list_size_title = 2131296667; - // aapt resource value: 0x7f0902a3 - public const int loading = 2131296931; + // aapt resource value: 0x7f0902a8 + public const int loading = 2131296936; // aapt resource value: 0x7f09019d public const int loading_database = 2131296669; @@ -5003,8 +5021,8 @@ namespace keepass2android // aapt resource value: 0x7f0901ad public const int menu_hide_password = 2131296685; - // aapt resource value: 0x7f0902d9 - public const int menu_homepage = 2131296985; + // aapt resource value: 0x7f0902df + public const int menu_homepage = 2131296991; // aapt resource value: 0x7f0901ae public const int menu_lock = 2131296686; @@ -5087,14 +5105,14 @@ namespace keepass2android // aapt resource value: 0x7f09026e public const int otp_aux_file = 2131296878; - // aapt resource value: 0x7f09029c - public const int otp_discarded_because_db_open = 2131296924; - - // aapt resource value: 0x7f09029a - public const int otp_discarded_because_no_db = 2131296922; + // aapt resource value: 0x7f09029d + public const int otp_discarded_because_db_open = 2131296925; // aapt resource value: 0x7f09029b - public const int otp_discarded_no_space = 2131296923; + public const int otp_discarded_because_no_db = 2131296923; + + // aapt resource value: 0x7f09029c + public const int otp_discarded_no_space = 2131296924; // aapt resource value: 0x7f090296 public const int otp_explanation = 2131296918; @@ -5102,11 +5120,11 @@ namespace keepass2android // aapt resource value: 0x7f090297 public const int otp_hint = 2131296919; - // aapt resource value: 0x7f09029d - public const int otps_pending = 2131296925; - // aapt resource value: 0x7f09029e - public const int otpsecret_hint = 2131296926; + public const int otps_pending = 2131296926; + + // aapt resource value: 0x7f09029f + public const int otpsecret_hint = 2131296927; // aapt resource value: 0x7f0901bf public const int pass_filename = 2131296703; @@ -5129,32 +5147,32 @@ namespace keepass2android // aapt resource value: 0x7f0901eb public const int please_note = 2131296747; - // aapt resource value: 0x7f0902a7 - public const int plugin_author = 2131296935; + // aapt resource value: 0x7f0902ac + public const int plugin_author = 2131296940; - // aapt resource value: 0x7f0902a6 - public const int plugin_description = 2131296934; + // aapt resource value: 0x7f0902ab + public const int plugin_description = 2131296939; - // aapt resource value: 0x7f0902a9 - public const int plugin_disabled = 2131296937; - - // aapt resource value: 0x7f0902a8 - public const int plugin_enabled = 2131296936; + // aapt resource value: 0x7f0902ae + public const int plugin_disabled = 2131296942; // aapt resource value: 0x7f0902ad - public const int plugin_enabled_checkbox = 2131296941; + public const int plugin_enabled = 2131296941; - // aapt resource value: 0x7f0902a5 - public const int plugin_packagename = 2131296933; + // aapt resource value: 0x7f0902b2 + public const int plugin_enabled_checkbox = 2131296946; // aapt resource value: 0x7f0902aa - public const int plugin_web = 2131296938; + public const int plugin_packagename = 2131296938; - // aapt resource value: 0x7f0902a4 - public const int plugins = 2131296932; + // aapt resource value: 0x7f0902af + public const int plugin_web = 2131296943; - // aapt resource value: 0x7f0902cd - public const int plugins_text = 2131296973; + // aapt resource value: 0x7f0902a9 + public const int plugins = 2131296937; + + // aapt resource value: 0x7f0902d3 + public const int plugins_text = 2131296979; // aapt resource value: 0x7f09008d public const int popular_domain_0 = 2131296397; @@ -5225,11 +5243,11 @@ namespace keepass2android // aapt resource value: 0x7f090219 public const int protection = 2131296793; - // aapt resource value: 0x7f0902ac - public const int query_credentials = 2131296940; + // aapt resource value: 0x7f0902b1 + public const int query_credentials = 2131296945; - // aapt resource value: 0x7f0902ab - public const int query_credentials_for_url = 2131296939; + // aapt resource value: 0x7f0902b0 + public const int query_credentials_for_url = 2131296944; // aapt resource value: 0x7f09004b public const int quick_fixes = 2131296331; diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index d2c0e276..a273ca4a 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -398,6 +398,7 @@ Load auxiliary fileā€¦ Enter the next One-time-passwords (OTPs). Swipe your Yubikey NEO at the back of your device to enter via NFC. OTP %1$d + Could not find an app that can handle the challenge. Please install Yubichallenge from Google Play. Could not load auxiliary OTP file! Please use the OtpKeyProv plugin in KeePass 2.x (PC) to configure your database for use with OTPs! Please select database first. OTP is discarded for security reasons. @@ -449,6 +450,8 @@ Error: Server certificate validation failed! Install appropriate root certificate on your device or see settings! Select file format + + Sorry! Keepass2Android was killed by the Android OS! For security reasons, Keepass2Android did not persist your selected credentials on disk, so you need to re-open your database. Note: This should happen only very rarely. If it does, please drop me a message at crocoapps@gmail.com. Change log diff --git a/src/keepass2android/app/AppTask.cs b/src/keepass2android/app/AppTask.cs index 387c83f9..be49318d 100644 --- a/src/keepass2android/app/AppTask.cs +++ b/src/keepass2android/app/AppTask.cs @@ -376,7 +376,11 @@ namespace keepass2android { //show the notifications activity.StartNotificationsService(CloseAfterCreate); - + } + else + { + //to avoid getting into inconsistent state (LastOpenedEntry and Notifications): clear notifications: + CopyToClipboardService.CancelNotifications(activity); } if (CloseAfterCreate) { diff --git a/src/keepass2android/intents/Intents.cs b/src/keepass2android/intents/Intents.cs index 76c40b0b..c8d07ef0 100644 --- a/src/keepass2android/intents/Intents.cs +++ b/src/keepass2android/intents/Intents.cs @@ -54,6 +54,7 @@ namespace keepass2android public const String UpdateKeyboard = "keepass2android.update_keyboard"; public const String CopyStringToClipboard = "keepass2android.copy_string_to_clipboard"; public const String ActivateKeyboard = "keepass2android.activate_keyboard"; + public const String ClearNotificationsAndData = "keepass2android.ClearNotificationsAndData"; } } diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj index 8db79c6c..b41cec80 100644 --- a/src/keepass2android/keepass2android.csproj +++ b/src/keepass2android/keepass2android.csproj @@ -95,6 +95,7 @@ + diff --git a/src/keepass2android/services/CopyToClipboardService.cs b/src/keepass2android/services/CopyToClipboardService.cs index 5e820760..f625caa9 100644 --- a/src/keepass2android/services/CopyToClipboardService.cs +++ b/src/keepass2android/services/CopyToClipboardService.cs @@ -57,12 +57,26 @@ namespace keepass2android ctx.StartService(i); } + static public void ActivateKeyboard(Context ctx) + { + Intent i = new Intent(ctx, typeof(CopyToClipboardService)); + i.SetAction(Intents.ActivateKeyboard); + ctx.StartService(i); + } + + public static void CancelNotifications(Context ctx) + { + + Intent i = new Intent(ctx, typeof(CopyToClipboardService)); + i.SetAction(Intents.ClearNotificationsAndData); + ctx.StartService(i); + } + public CopyToClipboardService (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { } - CopyToClipboardBroadcastReceiver _copyToClipBroadcastReceiver; NotificationDeletedBroadcastReceiver _notificationDeletedBroadcastReceiver; StopOnLockBroadcastReceiver _stopOnLockBroadcastReceiver; @@ -121,7 +135,7 @@ namespace keepass2android bool closeAfterCreate = intent.GetBooleanExtra(EntryActivity.KeyCloseAfterCreate, false); DisplayAccessNotifications(entry, closeAfterCreate); } - else + else //UpdateKeyboard { //this action is received when the data in the entry has changed (e.g. by plugins) //update the keyboard data. @@ -135,6 +149,15 @@ namespace keepass2android TimeoutCopyToClipboard(intent.GetStringExtra(_stringtocopy)); } + if (intent.Action == Intents.ActivateKeyboard) + { + ActivateKp2aKeyboard(); + } + if (intent.Action == Intents.ClearNotificationsAndData) + { + ClearNotifications(); + } + return StartCommandResult.RedeliverIntent; } @@ -158,10 +181,6 @@ namespace keepass2android { UnregisterReceiver(_stopOnLockBroadcastReceiver); } - if (_copyToClipBroadcastReceiver != null) - { - UnregisterReceiver(_copyToClipBroadcastReceiver); - } if (_notificationDeletedBroadcastReceiver != null) { UnregisterReceiver(_notificationDeletedBroadcastReceiver); @@ -201,14 +220,7 @@ namespace keepass2android public void DisplayAccessNotifications(PwEntryOutput entry, bool closeAfterCreate) { - // Notification Manager - _notificationManager = (NotificationManager)GetSystemService(NotificationService); - - _notificationManager.Cancel(NotifyPassword); - _notificationManager.Cancel(NotifyUsername); - _notificationManager.Cancel(NotifyKeyboard); - _numElementsToWaitFor = 0; - bool hadKeyboardData = ClearKeyboard(false); //do not broadcast if the keyboard was changed + var hadKeyboardData = ClearNotifications(); String entryName = entry.OutputStrings.ReadSafe(PwDefs.TitleField); @@ -255,7 +267,7 @@ namespace keepass2android // automatically bring up the Keyboard selection dialog if ((closeAfterCreate) && prefs.GetBoolean(GetString(Resource.String.OpenKp2aKeyboardAutomatically_key), Resources.GetBoolean(Resource.Boolean.OpenKp2aKeyboardAutomatically_default))) { - ActivateKp2aKeyboard(this); + ActivateKp2aKeyboard(); } } @@ -272,13 +284,10 @@ namespace keepass2android return; } - _copyToClipBroadcastReceiver = new CopyToClipboardBroadcastReceiver(entry, this); - IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.CopyUsername); filter.AddAction(Intents.CopyPassword); filter.AddAction(Intents.CheckKeyboard); - RegisterReceiver(_copyToClipBroadcastReceiver, filter); //register receiver to get notified when notifications are discarded in which case we can shutdown the service _notificationDeletedBroadcastReceiver = new NotificationDeletedBroadcastReceiver(this); @@ -287,6 +296,19 @@ namespace keepass2android RegisterReceiver(_notificationDeletedBroadcastReceiver, deletefilter); } + private bool ClearNotifications() + { +// Notification Manager + _notificationManager = (NotificationManager) GetSystemService(NotificationService); + + _notificationManager.Cancel(NotifyPassword); + _notificationManager.Cancel(NotifyUsername); + _notificationManager.Cancel(NotifyKeyboard); + _numElementsToWaitFor = 0; + bool hadKeyboardData = ClearKeyboard(false); //do not broadcast if the keyboard was changed + return hadKeyboardData; + } + bool MakeAccessibleForKeyboard(PwEntryOutput entry) { #if EXCLUDE_KEYBOARD @@ -434,6 +456,7 @@ namespace keepass2android Notification notify = new Notification(drawableResId, desc, Java.Lang.JavaSystem.CurrentTimeMillis()); Intent intent = new Intent(intentText); + intent.SetPackage(PackageName); PendingIntent pending = PendingIntent.GetBroadcast(this, descResId, intent, PendingIntentFlags.CancelCurrent); notify.SetLatestEventInfo(this, title, desc, pending); @@ -460,43 +483,7 @@ namespace keepass2android } } - class CopyToClipboardBroadcastReceiver: BroadcastReceiver - { - readonly CopyToClipboardService _service; - readonly PwEntryOutput _entry; - - public CopyToClipboardBroadcastReceiver(PwEntryOutput entry, CopyToClipboardService service) - { - _entry = entry; - _service = service; - } - - - public override void OnReceive(Context context, Intent intent) - { - String action = intent.Action; - - if (action.Equals(Intents.CopyUsername)) - { - String username = _entry.OutputStrings.ReadSafe(PwDefs.UserNameField); - if (username.Length > 0) - { - _service.TimeoutCopyToClipboard(username); - } - } else if (action.Equals(Intents.CopyPassword)) - { - String password = _entry.OutputStrings.ReadSafe(PwDefs.PasswordField); - if (password.Length > 0) - { - _service.TimeoutCopyToClipboard(password); - } - } else if (action.Equals(Intents.CheckKeyboard)) - { - ActivateKp2aKeyboard(_service); - } - } - - }; + class NotificationDeletedBroadcastReceiver: BroadcastReceiver { @@ -517,18 +504,18 @@ namespace keepass2android #endregion } - internal static void ActivateKp2aKeyboard(CopyToClipboardService service) + internal void ActivateKp2aKeyboard() { string currentIme = Android.Provider.Settings.Secure.GetString( - service.ContentResolver, + ContentResolver, Android.Provider.Settings.Secure.DefaultInputMethod); - string kp2aIme = service.PackageName + "/keepass2android.softkeyboard.KP2AKeyboard"; + string kp2aIme = PackageName + "/keepass2android.softkeyboard.KP2AKeyboard"; - InputMethodManager imeManager = (InputMethodManager)service.ApplicationContext.GetSystemService(InputMethodService); + InputMethodManager imeManager = (InputMethodManager)ApplicationContext.GetSystemService(InputMethodService); if (imeManager == null) { - Toast.MakeText(service, Resource.String.not_possible_im_picker, ToastLength.Long).Show(); + Toast.MakeText(this, Resource.String.not_possible_im_picker, ToastLength.Long).Show(); return; } @@ -543,20 +530,72 @@ namespace keepass2android if (!inputMethodProperties.Any(imi => imi.Id.Equals(kp2aIme))) { - Toast.MakeText(service, Resource.String.please_activate_keyboard, ToastLength.Long).Show(); + Toast.MakeText(this, Resource.String.please_activate_keyboard, ToastLength.Long).Show(); Intent settingsIntent = new Intent(Android.Provider.Settings.ActionInputMethodSettings); settingsIntent.SetFlags(ActivityFlags.NewTask); - service.StartActivity(settingsIntent); + StartActivity(settingsIntent); } else { #if !EXCLUDE_KEYBOARD - Keepass2android.Kbbridge.ImeSwitcher.SwitchToKeyboard(service, kp2aIme, false); + Keepass2android.Kbbridge.ImeSwitcher.SwitchToKeyboard(this, kp2aIme, false); #endif } } } - - } + + + } + + [BroadcastReceiver(Permission = "keepass2android." + AppNames.PackagePart + ".permission.CopyToClipboard")] + [IntentFilter(new[] { Intents.CopyUsername, Intents.CopyPassword, Intents.CheckKeyboard })] + class CopyToClipboardBroadcastReceiver : BroadcastReceiver + { + public CopyToClipboardBroadcastReceiver(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) + { + } + + + public CopyToClipboardBroadcastReceiver() + { + } + + public override void OnReceive(Context context, Intent intent) + { + String action = intent.Action; + + //check if we have a last opened entry + //this should always be non-null, but if the OS has killed the app, it might occur. + if (App.Kp2a.GetDb().LastOpenedEntry == null) + { + Intent i = new Intent(context, typeof (AppKilledInfo)); + i.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask); + context.StartActivity(i); + return; + } + + if (action.Equals(Intents.CopyUsername)) + { + String username = App.Kp2a.GetDb().LastOpenedEntry.OutputStrings.ReadSafe(PwDefs.UserNameField); + if (username.Length > 0) + { + CopyToClipboardService.CopyValueToClipboardWithTimeout(context, username); + } + } + else if (action.Equals(Intents.CopyPassword)) + { + String password = App.Kp2a.GetDb().LastOpenedEntry.OutputStrings.ReadSafe(PwDefs.PasswordField); + if (password.Length > 0) + { + CopyToClipboardService.CopyValueToClipboardWithTimeout(context, password); + } + } + else if (action.Equals(Intents.CheckKeyboard)) + { + CopyToClipboardService.ActivateKeyboard(context); + } + } + + }; }