From ee41a600b1dccda3574e1fb59c0721c26c158ca8 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Tue, 11 Feb 2025 13:18:23 +0100 Subject: [PATCH] fix potential crashes on old Android versions when registering receivers (after upgrade to support target sdk 34) --- .../softkeyboard/KP2AKeyboard.java | 30 +++++++++++++++---- src/keepass2android-app/EntryActivity.cs | 5 ++-- src/keepass2android-app/LockCloseActivity.cs | 3 +- .../LockCloseListActivity.cs | 3 +- .../LockingClosePreferenceActivity.cs | 3 +- src/keepass2android-app/PasswordActivity.cs | 3 +- src/keepass2android-app/QuickUnlock.cs | 3 +- .../SelectCurrentDbActivity.cs | 3 +- src/keepass2android-app/app/App.cs | 2 +- .../services/CopyToClipboardService.cs | 6 ++-- .../services/OngoingNotificationsService.cs | 5 ++-- 11 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java index 0443c4888..128391312 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java @@ -356,7 +356,13 @@ public void onCreate() { pFilter.addAction("android.intent.action.PACKAGE_ADDED"); pFilter.addAction("android.intent.action.PACKAGE_REPLACED"); pFilter.addAction("android.intent.action.PACKAGE_REMOVED"); - registerReceiver(mPluginManager, pFilter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + registerReceiver(mPluginManager, pFilter, RECEIVER_EXPORTED); + } + else + { + registerReceiver(mPluginManager, pFilter); + } LatinIMEUtil.GCUtils.getInstance().reset(); @@ -375,16 +381,28 @@ public void onCreate() { // register to receive ringer mode changes for silent mode IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); - registerReceiver(mSilentModeReceiver, filter); - + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + registerReceiver(mSilentModeReceiver, filter, RECEIVER_EXPORTED); + } + else + { + registerReceiver(mSilentModeReceiver, filter); + } + prefs.registerOnSharedPreferenceChangeListener(this); //check if we have KP2A data available: - mHadKp2aData = mShowKp2aKeyboard = keepass2android.kbbridge.KeyboardData.hasData(); + mHadKp2aData = mShowKp2aKeyboard = KeyboardData.hasData(); mClearKeyboardReceiver = new ClearKeyboardBroadcastReceiver(); - registerReceiver(mClearKeyboardReceiver, new IntentFilter(get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this))); - android.util.Log.d("KP2AK", "registered receiver for clear keyboard broadcast: "+get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + registerReceiver(mClearKeyboardReceiver, new IntentFilter(get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this)), RECEIVER_EXPORTED); + } + else + { + registerReceiver(mClearKeyboardReceiver, new IntentFilter(get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this))); + } + Log.d("KP2AK", "registered receiver for clear keyboard broadcast: "+get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this)); } diff --git a/src/keepass2android-app/EntryActivity.cs b/src/keepass2android-app/EntryActivity.cs index 62450f1f2..832e850a3 100644 --- a/src/keepass2android-app/EntryActivity.cs +++ b/src/keepass2android-app/EntryActivity.cs @@ -53,6 +53,7 @@ You should have received a copy of the GNU General Public License using KeeTrayTOTP.Libraries; using Boolean = Java.Lang.Boolean; using Android.Util; +using AndroidX.Core.Content; using Google.Android.Material.Dialog; using keepass2android; @@ -491,9 +492,9 @@ protected override void OnCreate(Bundle savedInstanceState) App.Kp2a.LastOpenedEntry = new PwEntryOutput(Entry, App.Kp2a.CurrentDb); _pluginActionReceiver = new PluginActionReceiver(this); - RegisterReceiver(_pluginActionReceiver, new IntentFilter(Strings.ActionAddEntryAction), ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _pluginActionReceiver, new IntentFilter(Strings.ActionAddEntryAction), (int)ReceiverFlags.Exported); _pluginFieldReceiver = new PluginFieldReceiver(this); - RegisterReceiver(_pluginFieldReceiver, new IntentFilter(Strings.ActionSetEntryField), ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _pluginFieldReceiver, new IntentFilter(Strings.ActionSetEntryField), (int)ReceiverFlags.Exported); var notifyPluginsOnOpenThread = new Thread(NotifyPluginsOnOpen); notifyPluginsOnOpenThread.Start(); diff --git a/src/keepass2android-app/LockCloseActivity.cs b/src/keepass2android-app/LockCloseActivity.cs index 57b6f1989..57ae28a36 100644 --- a/src/keepass2android-app/LockCloseActivity.cs +++ b/src/keepass2android-app/LockCloseActivity.cs @@ -21,6 +21,7 @@ You should have received a copy of the GNU General Public License using Android.Preferences; using Android.Runtime; using Android.Views; +using AndroidX.Core.Content; using KeePassLib.Serialization; namespace keepass2android @@ -69,7 +70,7 @@ protected override void OnCreate(Bundle savedInstanceState) IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.DatabaseLocked); filter.AddAction(Intent.ActionScreenOff); - RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported); } protected override void OnDestroy() diff --git a/src/keepass2android-app/LockCloseListActivity.cs b/src/keepass2android-app/LockCloseListActivity.cs index 94cad492c..7815a4c6a 100644 --- a/src/keepass2android-app/LockCloseListActivity.cs +++ b/src/keepass2android-app/LockCloseListActivity.cs @@ -21,6 +21,7 @@ You should have received a copy of the GNU General Public License using Android.Preferences; using Android.Runtime; using Android.Views; +using AndroidX.Core.Content; using KeePassLib.Serialization; namespace keepass2android @@ -55,7 +56,7 @@ protected override void OnCreate(Bundle savedInstanceState) filter.AddAction(Intents.DatabaseLocked); filter.AddAction(Intent.ActionScreenOff); - RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported); } diff --git a/src/keepass2android-app/LockingClosePreferenceActivity.cs b/src/keepass2android-app/LockingClosePreferenceActivity.cs index 0e0884097..7b59faa10 100644 --- a/src/keepass2android-app/LockingClosePreferenceActivity.cs +++ b/src/keepass2android-app/LockingClosePreferenceActivity.cs @@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License using System; using Android.Content; using Android.OS; +using AndroidX.Core.Content; using KeePassLib.Serialization; namespace keepass2android @@ -39,7 +40,7 @@ protected override void OnCreate(Bundle savedInstanceState) _intentReceiver = new LockCloseActivityBroadcastReceiver(this); IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.DatabaseLocked); - RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported); } protected override void OnResume() { diff --git a/src/keepass2android-app/PasswordActivity.cs b/src/keepass2android-app/PasswordActivity.cs index 10d09449a..ae50b99a5 100644 --- a/src/keepass2android-app/PasswordActivity.cs +++ b/src/keepass2android-app/PasswordActivity.cs @@ -65,6 +65,7 @@ You should have received a copy of the GNU General Public License using Exception = System.Exception; using String = System.String; using Toolbar = AndroidX.AppCompat.Widget.Toolbar; +using AndroidX.Core.Content; namespace keepass2android { @@ -647,7 +648,7 @@ protected override void OnCreate(Bundle savedInstanceState) _intentReceiver = new PasswordActivityBroadcastReceiver(this); IntentFilter filter = new IntentFilter(); filter.AddAction(Intent.ActionScreenOff); - RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported); //use FlagSecure to make sure the last (revealed) character of the master password is not visible in recent apps diff --git a/src/keepass2android-app/QuickUnlock.cs b/src/keepass2android-app/QuickUnlock.cs index b5ff813ea..71cea014a 100644 --- a/src/keepass2android-app/QuickUnlock.cs +++ b/src/keepass2android-app/QuickUnlock.cs @@ -34,6 +34,7 @@ You should have received a copy of the GNU General Public License using KeePassLib; using KeePassLib.Serialization; using Toolbar = AndroidX.AppCompat.Widget.Toolbar; +using AndroidX.Core.Content; namespace keepass2android { @@ -153,7 +154,7 @@ protected override void OnCreate(Bundle bundle) _intentReceiver = new QuickUnlockBroadcastReceiver(this); IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.DatabaseLocked); - RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported); Util.SetNoPersonalizedLearning(FindViewById(Resource.Id.QuickUnlock_password)); diff --git a/src/keepass2android-app/SelectCurrentDbActivity.cs b/src/keepass2android-app/SelectCurrentDbActivity.cs index 26f270cae..f31195774 100644 --- a/src/keepass2android-app/SelectCurrentDbActivity.cs +++ b/src/keepass2android-app/SelectCurrentDbActivity.cs @@ -26,6 +26,7 @@ using KeePassLib.Serialization; using Console = System.Console; using Object = Java.Lang.Object; +using AndroidX.Core.Content; namespace keepass2android { @@ -343,7 +344,7 @@ protected override void OnStart() IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.DatabaseLocked); filter.AddAction(Intent.ActionScreenOff); - RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported); } } diff --git a/src/keepass2android-app/app/App.cs b/src/keepass2android-app/app/App.cs index 510c5d34b..00f73cf27 100644 --- a/src/keepass2android-app/app/App.cs +++ b/src/keepass2android-app/app/App.cs @@ -1342,7 +1342,7 @@ public override void OnCreate() intentFilter.AddAction(Intents.LockDatabase); intentFilter.AddAction(Intents.LockDatabaseByTimeout); intentFilter.AddAction(Intents.CloseDatabase); - Context.RegisterReceiver(broadcastReceiver, intentFilter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(Context, broadcastReceiver, intentFilter, (int)ReceiverFlags.Exported); //ZXing.Net.Mobile.Forms.Android.Platform.Init(); } diff --git a/src/keepass2android-app/services/CopyToClipboardService.cs b/src/keepass2android-app/services/CopyToClipboardService.cs index fff79c56c..074ba3758 100644 --- a/src/keepass2android-app/services/CopyToClipboardService.cs +++ b/src/keepass2android-app/services/CopyToClipboardService.cs @@ -39,6 +39,7 @@ You should have received a copy of the GNU General Public License using keepass2android; using KeePassLib.Serialization; using PluginTOTP; +using AndroidX.Core.Content; namespace keepass2android { @@ -322,7 +323,8 @@ public override StartCommandResult OnStartCommand(Intent intent, StartCommandFla _stopOnLockBroadcastReceiver = new StopOnLockBroadcastReceiver(this); IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.DatabaseLocked); - RegisterReceiver(_stopOnLockBroadcastReceiver, filter, ReceiverFlags.Exported); + + ContextCompat.RegisterReceiver(this, _stopOnLockBroadcastReceiver, filter, (int)ReceiverFlags.Exported); } if ((intent.Action == Intents.ShowNotification) || (intent.Action == Intents.UpdateKeyboard)) @@ -529,7 +531,7 @@ public void DisplayAccessNotifications(PwEntryOutput entry, bool activateKeyboar _notificationDeletedBroadcastReceiver = new NotificationDeletedBroadcastReceiver(this); IntentFilter deletefilter = new IntentFilter(); deletefilter.AddAction(ActionNotificationCancelled); - RegisterReceiver(_notificationDeletedBroadcastReceiver, deletefilter, ReceiverFlags.Exported); + ContextCompat.RegisterReceiver(this, _notificationDeletedBroadcastReceiver, deletefilter, (int)ReceiverFlags.Exported); } } diff --git a/src/keepass2android-app/services/OngoingNotificationsService.cs b/src/keepass2android-app/services/OngoingNotificationsService.cs index 4dbb0e337..3ba4fc42e 100644 --- a/src/keepass2android-app/services/OngoingNotificationsService.cs +++ b/src/keepass2android-app/services/OngoingNotificationsService.cs @@ -23,6 +23,7 @@ You should have received a copy of the GNU General Public License using Android.OS; using Android.Preferences; using AndroidX.Core.App; +using AndroidX.Core.Content; using keepass2android; using KeePassLib.Utility; @@ -60,8 +61,8 @@ public override void OnCreate() _screenOffReceiver = new ScreenOffReceiver(); IntentFilter filter = new IntentFilter(); filter.AddAction(Intent.ActionScreenOff); - RegisterReceiver(_screenOffReceiver, filter, ReceiverFlags.Exported); - } + ContextCompat.RegisterReceiver(this, _screenOffReceiver, filter, (int)ReceiverFlags.Exported); + } public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)