From 4910c73a5e006a23721f5d98052c0e478f6cdaec Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Fri, 31 Mar 2023 08:00:44 +0200 Subject: [PATCH] fix to potential crash when reloading database --- src/keepass2android/app/App.cs | 34 ++++++++++++++++-------- src/keepass2android/views/PwGroupView.cs | 11 +++++--- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index 19f05407..81b0aa7d 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -475,22 +475,26 @@ namespace keepass2android builder.SetMessage(activity.GetString(Resource.String.AskReloadFile)); - builder.SetPositiveButton(activity.GetString(Android.Resource.String.Yes), + bool buttonPressed = false; + + builder.SetPositiveButton(activity.GetString(Android.Resource.String.Yes), (dlgSender, dlgEvt) => - { + { + buttonPressed = true; CurrentDb.ReloadRequested = true; activity.SetResult(KeePass.ExitReloadDb); activity.Finish(); if (actionOnResult != null) - { - actionOnResult(true); - actionOnResult = null; + { + actionOnResult(true); + actionOnResult = null; } }); builder.SetNegativeButton(activity.GetString(Android.Resource.String.No), (dlgSender, dlgEvt) => - { - if (actionOnResult != null) + { + buttonPressed = true; + if (actionOnResult != null) { actionOnResult(false); actionOnResult = null; @@ -501,10 +505,18 @@ namespace keepass2android Dialog dialog = builder.Create(); dialog.SetOnDismissListener(new Util.DismissListener(() => - { - if (actionOnResult != null) - actionOnResult(false); - })); + { + //dismiss can be called when we're calling activity.Finish() during button press. + //don't do anything then. + if (buttonPressed) + return; + + if (actionOnResult != null) + { + actionOnResult(false); + actionOnResult = null; + } + })); dialog.Show(); } diff --git a/src/keepass2android/views/PwGroupView.cs b/src/keepass2android/views/PwGroupView.cs index 832c9f33..bb281fd5 100644 --- a/src/keepass2android/views/PwGroupView.cs +++ b/src/keepass2android/views/PwGroupView.cs @@ -77,10 +77,15 @@ namespace keepass2android.view AddView(gv, lp); } - private void PopulateView(View gv, PwGroup pw) { + private void PopulateView(View gv, PwGroup pw) + { _pwGroup = pw; - - ImageView iv = (ImageView) gv.FindViewById(Resource.Id.icon); + Kp2aLog.Log($"Populating group view {_groupBaseActivity.IsFinishing} {pw.Name}"); + + if (_groupBaseActivity.IsFinishing) + return; + + ImageView iv = (ImageView) gv.FindViewById(Resource.Id.icon); Database db = App.Kp2a.FindDatabaseForElement(pw); db.DrawableFactory.AssignDrawableTo(iv, _groupBaseActivity, db.KpDatabase, pw.IconId, pw.CustomIconUuid, true); gv.FindViewById(Resource.Id.icon).Visibility = ViewStates.Visible;