From 2995b198576989de1953bb158262a6c1f0af5655 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Thu, 7 Dec 2023 17:03:23 -0600
Subject: [PATCH 01/14] Allow a Parent Coordinator to finish its children

---
 Float.Core/UX/CoordinatorParent.cs  | 19 +++++++++++++++++++
 Float.Core/UX/ICoordinatorParent.cs |  8 ++++++++
 2 files changed, 27 insertions(+)

diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index 0fa9386..9201371 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -15,6 +15,11 @@ public abstract class CoordinatorParent : Coordinator, ICoordinatorParent
         /// </summary>
         readonly List<ICoordinator> childCoordinators = new ();
 
+        /// <summary>
+        /// The event args that have been used as we are waiting to finish all the children before closing the parent.
+        /// </summary>
+        EventArgs waitingToFinishEventArgs = null;
+
         /// <summary>
         /// Gets a value indicating whether this <see cref="CoordinatorParent"/> has children.
         /// </summary>
@@ -98,6 +103,14 @@ public virtual void RemoveChild(ICoordinator coordinator)
             }
         }
 
+        /// <inheritdoc />
+        public virtual void FinishFamily(EventArgs args)
+        {
+            waitingToFinishEventArgs = args;
+            NavigationContext?.DismissPageAsync(false);
+            NavigationContext?.Reset(false);
+        }
+
         /// <summary>
         /// Use to determine if this coordinator already contains a certain type of child coordinator.
         /// </summary>
@@ -149,6 +162,12 @@ protected virtual void HandleChildFinish(object sender, EventArgs args)
             {
                 RemoveChild(child);
             }
+
+            if (!HasChildren && waitingToFinishEventArgs != null)
+            {
+                Finish(waitingToFinishEventArgs);
+                waitingToFinishEventArgs = null;
+            }
         }
     }
 }
diff --git a/Float.Core/UX/ICoordinatorParent.cs b/Float.Core/UX/ICoordinatorParent.cs
index 7170ebd..17322d0 100644
--- a/Float.Core/UX/ICoordinatorParent.cs
+++ b/Float.Core/UX/ICoordinatorParent.cs
@@ -1,3 +1,5 @@
+using System;
+
 namespace Float.Core.UX
 {
     /// <summary>
@@ -16,5 +18,11 @@ public interface ICoordinatorParent
         /// </summary>
         /// <param name="coordinator">The coordinator to remove.</param>
         void RemoveChild(ICoordinator coordinator);
+
+        /// <summary>
+        /// Ensures all the children can properly finish before the parent finishes.
+        /// </summary>
+        /// <param name="args">The event args.</param>
+        void FinishFamily(EventArgs args);
     }
 }

From 1aef92bc3a5c1200df1bdaa7de08fc53e1ab3311 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Tue, 12 Dec 2023 17:08:09 -0600
Subject: [PATCH 02/14] Added a RequestFinish method

---
 Float.Core/UX/Coordinator.cs        | 34 +++++++++++++++++++++++++++
 Float.Core/UX/CoordinatorParent.cs  | 36 ++++++++++++++++++++++-------
 Float.Core/UX/ICoordinator.cs       |  8 +++++++
 Float.Core/UX/ICoordinatorParent.cs |  7 +-----
 4 files changed, 71 insertions(+), 14 deletions(-)

diff --git a/Float.Core/UX/Coordinator.cs b/Float.Core/UX/Coordinator.cs
index c0a579a..644c09e 100644
--- a/Float.Core/UX/Coordinator.cs
+++ b/Float.Core/UX/Coordinator.cs
@@ -26,6 +26,11 @@ public abstract class Coordinator : ICoordinator
         /// </summary>
         Page managedPage;
 
+        /// <summary>
+        /// The event args that are pending a finish.
+        /// </summary>
+        EventArgs waitingToFinishEventArgs;
+
         /// <summary>
         /// Occurs when this coordinator is started.
         /// </summary>
@@ -93,6 +98,35 @@ public virtual void Start()
             isStarted = true;
         }
 
+        /// <inheritdoc/>
+        public Task<bool> RequestFinish(EventArgs args)
+        {
+            return Task.FromResult(HandleFinishRequested(this, args));
+        }
+
+        /// <summary>
+        /// Handles when a finish is requested.
+        /// </summary>
+        /// <param name="coordinator">The coordinator that has requested this coordinator to finish.</param>
+        /// <param name="eventArgs">The event args.</param>
+        /// <returns>A value indicating whether this finished.</returns>
+        public virtual bool HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        {
+            if (this == coordinator)
+            {
+                if (managedPage == null)
+                {
+                    Finish(eventArgs);
+                    return true;
+                }
+
+                waitingToFinishEventArgs = eventArgs;
+                NavigationContext.Reset(false);
+            }
+
+            return false;
+        }
+
         /// <summary>
         /// Returning a page here will allow the coordinator to automatically
         /// manage itself based on the state of the UI.
diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index 9201371..579e281 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Threading.Tasks;
 using Float.Core.Extensions;
 
 namespace Float.Core.UX
@@ -103,14 +104,6 @@ public virtual void RemoveChild(ICoordinator coordinator)
             }
         }
 
-        /// <inheritdoc />
-        public virtual void FinishFamily(EventArgs args)
-        {
-            waitingToFinishEventArgs = args;
-            NavigationContext?.DismissPageAsync(false);
-            NavigationContext?.Reset(false);
-        }
-
         /// <summary>
         /// Use to determine if this coordinator already contains a certain type of child coordinator.
         /// </summary>
@@ -130,6 +123,33 @@ public override string ToString()
             return $"[{GetType()}, Children: {string.Join(",", childCoordinators)}]";
         }
 
+        /// <summary>
+        /// Handles the finish request.
+        /// </summary>
+        /// <param name="coordinator">The calling coordinator.</param>
+        /// <param name="eventArgs">The event args.</param>
+        /// <returns>A value indicating whether this finished.</returns>
+        public override bool HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        {
+            var didFinish = true;
+
+            waitingToFinishEventArgs = eventArgs;
+
+            foreach (var eachChild in ChildCoordinators)
+            {
+                if (eachChild is Coordinator childCoordinator)
+                {
+                    var finished = childCoordinator.HandleFinishRequested(childCoordinator, eventArgs);
+                    if (!finished)
+                    {
+                        didFinish = false;
+                    }
+                }
+            }
+
+            return didFinish;
+        }
+
         /// <inheritdoc />
         protected override void Finish(EventArgs args)
         {
diff --git a/Float.Core/UX/ICoordinator.cs b/Float.Core/UX/ICoordinator.cs
index c1cb38c..bd9bf5f 100644
--- a/Float.Core/UX/ICoordinator.cs
+++ b/Float.Core/UX/ICoordinator.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Threading.Tasks;
 
 namespace Float.Core.UX
 {
@@ -23,5 +24,12 @@ public interface ICoordinator
         /// </summary>
         /// <param name="navigationContext">The navigation context for this coordinator.</param>
         void Start(INavigationContext navigationContext);
+
+        /// <summary>
+        /// Requests that a coordinator will finish.
+        /// </summary>
+        /// <param name="eventArgs">The event args.</param>
+        /// <returns>A task, with a boolean indicating whether this did finish.</returns>
+        Task<bool> RequestFinish(EventArgs eventArgs);
     }
 }
diff --git a/Float.Core/UX/ICoordinatorParent.cs b/Float.Core/UX/ICoordinatorParent.cs
index 17322d0..3379eee 100644
--- a/Float.Core/UX/ICoordinatorParent.cs
+++ b/Float.Core/UX/ICoordinatorParent.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Threading.Tasks;
 
 namespace Float.Core.UX
 {
@@ -18,11 +19,5 @@ public interface ICoordinatorParent
         /// </summary>
         /// <param name="coordinator">The coordinator to remove.</param>
         void RemoveChild(ICoordinator coordinator);
-
-        /// <summary>
-        /// Ensures all the children can properly finish before the parent finishes.
-        /// </summary>
-        /// <param name="args">The event args.</param>
-        void FinishFamily(EventArgs args);
     }
 }

From 1281eebb4eedfc1334a3a8bcf5a13a5bf52a74e5 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Thu, 14 Dec 2023 16:42:43 -0600
Subject: [PATCH 03/14] Adjustments from comments

---
 Float.Core/UX/Coordinator.cs        | 12 +++++++-----
 Float.Core/UX/CoordinatorParent.cs  | 23 +++++++++++++++--------
 Float.Core/UX/ICoordinator.cs       | 29 +++++++++++++++++++++++++++--
 Float.Core/UX/ICoordinatorParent.cs |  3 ---
 4 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/Float.Core/UX/Coordinator.cs b/Float.Core/UX/Coordinator.cs
index 644c09e..938a41e 100644
--- a/Float.Core/UX/Coordinator.cs
+++ b/Float.Core/UX/Coordinator.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Threading.Tasks;
 using Xamarin.Forms;
+using static Float.Core.UX.ICoordinator;
 
 namespace Float.Core.UX
 {
@@ -99,9 +100,9 @@ public virtual void Start()
         }
 
         /// <inheritdoc/>
-        public Task<bool> RequestFinish(EventArgs args)
+        public CoordinatorRequestFinishStatus RequestFinish(EventArgs args)
         {
-            return Task.FromResult(HandleFinishRequested(this, args));
+            return HandleFinishRequested(this, args);
         }
 
         /// <summary>
@@ -110,21 +111,22 @@ public Task<bool> RequestFinish(EventArgs args)
         /// <param name="coordinator">The coordinator that has requested this coordinator to finish.</param>
         /// <param name="eventArgs">The event args.</param>
         /// <returns>A value indicating whether this finished.</returns>
-        public virtual bool HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        public virtual CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
             if (this == coordinator)
             {
                 if (managedPage == null)
                 {
                     Finish(eventArgs);
-                    return true;
+                    return CoordinatorRequestFinishStatus.FinishedImmediately;
                 }
 
                 waitingToFinishEventArgs = eventArgs;
                 NavigationContext.Reset(false);
+                return CoordinatorRequestFinishStatus.PendingFinish;
             }
 
-            return false;
+            return CoordinatorRequestFinishStatus.Unknown;
         }
 
         /// <summary>
diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index 579e281..86b1a33 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
-using System.Threading.Tasks;
 using Float.Core.Extensions;
+using static Float.Core.UX.ICoordinator;
 
 namespace Float.Core.UX
 {
@@ -129,25 +129,32 @@ public override string ToString()
         /// <param name="coordinator">The calling coordinator.</param>
         /// <param name="eventArgs">The event args.</param>
         /// <returns>A value indicating whether this finished.</returns>
-        public override bool HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        public override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
-            var didFinish = true;
-
             waitingToFinishEventArgs = eventArgs;
 
+            CoordinatorRequestFinishStatus? status = null;
+
             foreach (var eachChild in ChildCoordinators)
             {
                 if (eachChild is Coordinator childCoordinator)
                 {
-                    var finished = childCoordinator.HandleFinishRequested(childCoordinator, eventArgs);
-                    if (!finished)
+                    var freshStatus = childCoordinator.HandleFinishRequested(childCoordinator, eventArgs);
+
+                    if (status == null)
+                    {
+                        status = freshStatus;
+                    }
+
+                    // If every child finishes with the same status we can return that, otherwise unknown seems to be the best option.
+                    if (freshStatus != status)
                     {
-                        didFinish = false;
+                        status = CoordinatorRequestFinishStatus.Unknown;
                     }
                 }
             }
 
-            return didFinish;
+            return status ?? CoordinatorRequestFinishStatus.Unknown;
         }
 
         /// <inheritdoc />
diff --git a/Float.Core/UX/ICoordinator.cs b/Float.Core/UX/ICoordinator.cs
index bd9bf5f..825e88f 100644
--- a/Float.Core/UX/ICoordinator.cs
+++ b/Float.Core/UX/ICoordinator.cs
@@ -1,5 +1,4 @@
 using System;
-using System.Threading.Tasks;
 
 namespace Float.Core.UX
 {
@@ -19,6 +18,32 @@ public interface ICoordinator
         /// </summary>
         event EventHandler<EventArgs> Finished;
 
+        /// <summary>
+        /// An enum for the possible results of a coordinator's RequestFinish.
+        /// </summary>
+        public enum CoordinatorRequestFinishStatus
+        {
+            /// <summary>
+            /// The coordinator RequestFinish finished immediately.
+            /// </summary>
+            FinishedImmediately,
+
+            /// <summary>
+            /// The coordinator RequestFinish is pending a finish.
+            /// </summary>
+            PendingFinish,
+
+            /// <summary>
+            /// The coordinator RequestFinish will not complete.
+            /// </summary>
+            WillNotFinish,
+
+            /// <summary>
+            /// The coordinator RequestFinish's status is unknown.
+            /// </summary>
+            Unknown,
+        }
+
         /// <summary>
         /// Implementing classes should use this to start this coordinator.
         /// </summary>
@@ -30,6 +55,6 @@ public interface ICoordinator
         /// </summary>
         /// <param name="eventArgs">The event args.</param>
         /// <returns>A task, with a boolean indicating whether this did finish.</returns>
-        Task<bool> RequestFinish(EventArgs eventArgs);
+        CoordinatorRequestFinishStatus RequestFinish(EventArgs eventArgs);
     }
 }
diff --git a/Float.Core/UX/ICoordinatorParent.cs b/Float.Core/UX/ICoordinatorParent.cs
index 3379eee..7170ebd 100644
--- a/Float.Core/UX/ICoordinatorParent.cs
+++ b/Float.Core/UX/ICoordinatorParent.cs
@@ -1,6 +1,3 @@
-using System;
-using System.Threading.Tasks;
-
 namespace Float.Core.UX
 {
     /// <summary>

From 9f5390f0545e94c53c5d52d4ddf90ba0f45a7517 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Fri, 15 Dec 2023 11:30:35 -0600
Subject: [PATCH 04/14] Few changes

---
 Float.Core/UX/Coordinator.cs       | 33 ++++++++++++++++--------------
 Float.Core/UX/CoordinatorParent.cs | 24 +++++++---------------
 2 files changed, 25 insertions(+), 32 deletions(-)

diff --git a/Float.Core/UX/Coordinator.cs b/Float.Core/UX/Coordinator.cs
index 938a41e..1c9a0f8 100644
--- a/Float.Core/UX/Coordinator.cs
+++ b/Float.Core/UX/Coordinator.cs
@@ -27,11 +27,6 @@ public abstract class Coordinator : ICoordinator
         /// </summary>
         Page managedPage;
 
-        /// <summary>
-        /// The event args that are pending a finish.
-        /// </summary>
-        EventArgs waitingToFinishEventArgs;
-
         /// <summary>
         /// Occurs when this coordinator is started.
         /// </summary>
@@ -60,6 +55,14 @@ public abstract class Coordinator : ICoordinator
         /// <value><c>true</c> if is finished; otherwise, <c>false</c>.</value>
         protected bool IsFinished => isFinished;
 
+        /// <summary>
+        /// Gets or sets the event args that are pending a finish.
+        /// </summary>
+        /// <value>
+        /// The event args that are pending a finish.
+        /// </value>
+        protected EventArgs WaitingToFinishEventArgs { get; set; }
+
         /// <inheritdoc />
         public virtual void Start(INavigationContext context)
         {
@@ -121,12 +124,12 @@ public virtual CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator
                     return CoordinatorRequestFinishStatus.FinishedImmediately;
                 }
 
-                waitingToFinishEventArgs = eventArgs;
+                WaitingToFinishEventArgs = eventArgs;
                 NavigationContext.Reset(false);
                 return CoordinatorRequestFinishStatus.PendingFinish;
             }
 
-            return CoordinatorRequestFinishStatus.Unknown;
+            return CoordinatorRequestFinishStatus.WillNotFinish;
         }
 
         /// <summary>
@@ -162,6 +165,7 @@ protected virtual void Finish(EventArgs args)
             }
 
             managedPage = null;
+            WaitingToFinishEventArgs = null;
 
             if (NavigationContext != null)
             {
@@ -239,17 +243,16 @@ void HandleNavigation(object sender, NavigationEventArgs args)
             switch (args.Type)
             {
                 case NavigationEventArgs.NavigationType.Popped:
+                case NavigationEventArgs.NavigationType.Reset:
                     if (args.Page == managedPage && !IsFinished)
                     {
-                        Finish(EventArgs.Empty);
-                    }
+                        if (WaitingToFinishEventArgs == null)
+                        {
+                            Finish(EventArgs.Empty);
+                            return;
+                        }
 
-                    break;
-
-                case NavigationEventArgs.NavigationType.Reset:
-                    if (args.Page != managedPage && !IsFinished)
-                    {
-                        Finish(EventArgs.Empty);
+                        Finish(WaitingToFinishEventArgs);
                     }
 
                     break;
diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index 86b1a33..57ba577 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -16,11 +16,6 @@ public abstract class CoordinatorParent : Coordinator, ICoordinatorParent
         /// </summary>
         readonly List<ICoordinator> childCoordinators = new ();
 
-        /// <summary>
-        /// The event args that have been used as we are waiting to finish all the children before closing the parent.
-        /// </summary>
-        EventArgs waitingToFinishEventArgs = null;
-
         /// <summary>
         /// Gets a value indicating whether this <see cref="CoordinatorParent"/> has children.
         /// </summary>
@@ -123,15 +118,10 @@ public override string ToString()
             return $"[{GetType()}, Children: {string.Join(",", childCoordinators)}]";
         }
 
-        /// <summary>
-        /// Handles the finish request.
-        /// </summary>
-        /// <param name="coordinator">The calling coordinator.</param>
-        /// <param name="eventArgs">The event args.</param>
-        /// <returns>A value indicating whether this finished.</returns>
+        /// <inheritdoc />
         public override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
-            waitingToFinishEventArgs = eventArgs;
+            WaitingToFinishEventArgs = eventArgs;
 
             CoordinatorRequestFinishStatus? status = null;
 
@@ -139,7 +129,7 @@ public override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinato
             {
                 if (eachChild is Coordinator childCoordinator)
                 {
-                    var freshStatus = childCoordinator.HandleFinishRequested(childCoordinator, eventArgs);
+                    var freshStatus = childCoordinator.HandleFinishRequested(this, eventArgs);
 
                     if (status == null)
                     {
@@ -154,7 +144,7 @@ public override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinato
                 }
             }
 
-            return status ?? CoordinatorRequestFinishStatus.Unknown;
+            return status ?? base.HandleFinishRequested(coordinator, eventArgs);
         }
 
         /// <inheritdoc />
@@ -190,10 +180,10 @@ protected virtual void HandleChildFinish(object sender, EventArgs args)
                 RemoveChild(child);
             }
 
-            if (!HasChildren && waitingToFinishEventArgs != null)
+            if (!HasChildren && WaitingToFinishEventArgs != null)
             {
-                Finish(waitingToFinishEventArgs);
-                waitingToFinishEventArgs = null;
+                Finish(WaitingToFinishEventArgs);
+                WaitingToFinishEventArgs = null;
             }
         }
     }

From cabe1022d07b6ec56ab5bcf023b823c269bfcaf4 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Fri, 5 Jan 2024 07:48:44 -0600
Subject: [PATCH 05/14] More changes for temporary safe keeping

---
 Float.Core/Float.Core.csproj       |  1 -
 Float.Core/UX/Coordinator.cs       | 16 ++++++++++++++--
 Float.Core/UX/CoordinatorParent.cs | 19 +++----------------
 3 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/Float.Core/Float.Core.csproj b/Float.Core/Float.Core.csproj
index ec13c4a..448288f 100644
--- a/Float.Core/Float.Core.csproj
+++ b/Float.Core/Float.Core.csproj
@@ -11,7 +11,6 @@
     <Title>$(AssemblyName)</Title>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <LangVersion>9.0</LangVersion>
-    <ReleaseVersion>1.0.0</ReleaseVersion>
     <Version></Version>
     <UseMaui>true</UseMaui>
   </PropertyGroup>
diff --git a/Float.Core/UX/Coordinator.cs b/Float.Core/UX/Coordinator.cs
index 5e691d9..e8a63bc 100644
--- a/Float.Core/UX/Coordinator.cs
+++ b/Float.Core/UX/Coordinator.cs
@@ -119,7 +119,7 @@ public CoordinatorRequestFinishStatus RequestFinish(EventArgs args)
         /// <param name="coordinator">The coordinator that has requested this coordinator to finish.</param>
         /// <param name="eventArgs">The event args.</param>
         /// <returns>A value indicating whether this finished.</returns>
-        public virtual CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        protected virtual CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
             if (this == coordinator)
             {
@@ -248,7 +248,6 @@ void HandleNavigation(object sender, NavigationEventArgs args)
             switch (args.Type)
             {
                 case NavigationEventArgs.NavigationType.Popped:
-                case NavigationEventArgs.NavigationType.Reset:
                     if (args.Page == managedPage && !IsFinished)
                     {
                         if (WaitingToFinishEventArgs == null)
@@ -260,6 +259,19 @@ void HandleNavigation(object sender, NavigationEventArgs args)
                         Finish(WaitingToFinishEventArgs);
                     }
 
+                    break;
+                case NavigationEventArgs.NavigationType.Reset:
+                    if (args.Page != managedPage && !IsFinished)
+                    {
+                        if (WaitingToFinishEventArgs == null)
+                        {
+                            Finish(EventArgs.Empty);
+                            return;
+                        }
+
+                        Finish(WaitingToFinishEventArgs);
+                    }
+
                     break;
             }
         }
diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index 57ba577..a152a84 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -119,32 +119,19 @@ public override string ToString()
         }
 
         /// <inheritdoc />
-        public override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        protected override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
             WaitingToFinishEventArgs = eventArgs;
 
-            CoordinatorRequestFinishStatus? status = null;
-
             foreach (var eachChild in ChildCoordinators)
             {
                 if (eachChild is Coordinator childCoordinator)
                 {
-                    var freshStatus = childCoordinator.HandleFinishRequested(this, eventArgs);
-
-                    if (status == null)
-                    {
-                        status = freshStatus;
-                    }
-
-                    // If every child finishes with the same status we can return that, otherwise unknown seems to be the best option.
-                    if (freshStatus != status)
-                    {
-                        status = CoordinatorRequestFinishStatus.Unknown;
-                    }
+                    childCoordinator.HandleFinishRequested(this, eventArgs);
                 }
             }
 
-            return status ?? base.HandleFinishRequested(coordinator, eventArgs);
+            return base.HandleFinishRequested(coordinator, eventArgs);
         }
 
         /// <inheritdoc />

From dd684f9463cdd018e1eeb6f2a376e0898f5ecb4e Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Fri, 5 Jan 2024 14:37:55 -0600
Subject: [PATCH 06/14] Request finish

---
 Float.Core/UX/CoordinatorParent.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index a152a84..cbb49fb 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -127,7 +127,7 @@ protected override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordin
             {
                 if (eachChild is Coordinator childCoordinator)
                 {
-                    childCoordinator.HandleFinishRequested(this, eventArgs);
+                    childCoordinator.RequestFinish(eventArgs);
                 }
             }
 

From 016353e72290bb41e5bef6db038df6431e4af627 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Fri, 5 Jan 2024 17:01:26 -0600
Subject: [PATCH 07/14] Changes just to see

---
 Float.Core/Float.Core.csproj       |  1 +
 Float.Core/UX/Coordinator.cs       | 11 +++++------
 Float.Core/UX/CoordinatorParent.cs |  3 +--
 3 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/Float.Core/Float.Core.csproj b/Float.Core/Float.Core.csproj
index 448288f..ec13c4a 100644
--- a/Float.Core/Float.Core.csproj
+++ b/Float.Core/Float.Core.csproj
@@ -11,6 +11,7 @@
     <Title>$(AssemblyName)</Title>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <LangVersion>9.0</LangVersion>
+    <ReleaseVersion>1.0.0</ReleaseVersion>
     <Version></Version>
     <UseMaui>true</UseMaui>
   </PropertyGroup>
diff --git a/Float.Core/UX/Coordinator.cs b/Float.Core/UX/Coordinator.cs
index e8a63bc..a157755 100644
--- a/Float.Core/UX/Coordinator.cs
+++ b/Float.Core/UX/Coordinator.cs
@@ -1,6 +1,5 @@
 using System;
 using System.Threading.Tasks;
-using static Float.Core.UX.ICoordinator;
 #if NETSTANDARD
 using Xamarin.Forms;
 #else
@@ -108,7 +107,7 @@ public virtual void Start()
         }
 
         /// <inheritdoc/>
-        public CoordinatorRequestFinishStatus RequestFinish(EventArgs args)
+        public ICoordinator.CoordinatorRequestFinishStatus RequestFinish(EventArgs args)
         {
             return HandleFinishRequested(this, args);
         }
@@ -119,22 +118,22 @@ public CoordinatorRequestFinishStatus RequestFinish(EventArgs args)
         /// <param name="coordinator">The coordinator that has requested this coordinator to finish.</param>
         /// <param name="eventArgs">The event args.</param>
         /// <returns>A value indicating whether this finished.</returns>
-        protected virtual CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        protected virtual ICoordinator.CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
             if (this == coordinator)
             {
                 if (managedPage == null)
                 {
                     Finish(eventArgs);
-                    return CoordinatorRequestFinishStatus.FinishedImmediately;
+                    return ICoordinator.CoordinatorRequestFinishStatus.FinishedImmediately;
                 }
 
                 WaitingToFinishEventArgs = eventArgs;
                 NavigationContext.Reset(false);
-                return CoordinatorRequestFinishStatus.PendingFinish;
+                return ICoordinator.CoordinatorRequestFinishStatus.PendingFinish;
             }
 
-            return CoordinatorRequestFinishStatus.WillNotFinish;
+            return ICoordinator.CoordinatorRequestFinishStatus.WillNotFinish;
         }
 
         /// <summary>
diff --git a/Float.Core/UX/CoordinatorParent.cs b/Float.Core/UX/CoordinatorParent.cs
index cbb49fb..b9955e1 100644
--- a/Float.Core/UX/CoordinatorParent.cs
+++ b/Float.Core/UX/CoordinatorParent.cs
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using Float.Core.Extensions;
-using static Float.Core.UX.ICoordinator;
 
 namespace Float.Core.UX
 {
@@ -119,7 +118,7 @@ public override string ToString()
         }
 
         /// <inheritdoc />
-        protected override CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
+        protected override ICoordinator.CoordinatorRequestFinishStatus HandleFinishRequested(ICoordinator coordinator, EventArgs eventArgs)
         {
             WaitingToFinishEventArgs = eventArgs;
 

From f8b84e0e1e314e0c5288ac1cb562a1df70b6d9dd Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Mon, 15 Jan 2024 15:31:50 -0600
Subject: [PATCH 08/14] Part I Maybe

---
 .github/workflows/test.yml   |  4 ++--
 Float.Core.sln               | 25 ++++++++++++++++++++-----
 Float.Core/Float.Core.csproj | 18 ++++++++++++++++++
 3 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 4529991..1295ba7 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -22,9 +22,9 @@ jobs:
       - name: Restore dependencies
         run: dotnet restore
       - name: Build
-        run: dotnet build --configuration Release --no-restore
+        run: dotnet build --configuration MAUI --no-restore -f net7.0
       - name: Test
-        run: dotnet test --configuration Release --no-build --verbosity normal --logger:"trx;"
+        run: dotnet test --configuration  MAUI --no-restore -f net7.0 --no-build --verbosity normal --logger:"trx;"
       - name: Publish Test Results
         uses: EnricoMi/publish-unit-test-result-action@v2
         if: always()
diff --git a/Float.Core.sln b/Float.Core.sln
index 30db125..ed9e683 100644
--- a/Float.Core.sln
+++ b/Float.Core.sln
@@ -3,27 +3,42 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float.Core", "Float.Core\Float.Core.csproj", "{0AF193E3-D9AF-4551-B853-177F15FDC639}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float.Core.Tests", "Float.Core.Tests\Float.Core.Tests.csproj", "{CD4538B9-EBD5-4340-B44A-890DDCEFC31E}"
+Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Float.Core.Tests", "Float.Core.Tests\Float.Core.Tests.csproj", "{0302630F-9229-48C3-BF66-0A8E7384A3DF}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
 		Release|Any CPU = Release|Any CPU
+		MAUI|Any CPU = MAUI|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{0AF193E3-D9AF-4551-B853-177F15FDC639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{0AF193E3-D9AF-4551-B853-177F15FDC639}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0AF193E3-D9AF-4551-B853-177F15FDC639}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0AF193E3-D9AF-4551-B853-177F15FDC639}.Release|Any CPU.Build.0 = Release|Any CPU
-		{CD4538B9-EBD5-4340-B44A-890DDCEFC31E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{CD4538B9-EBD5-4340-B44A-890DDCEFC31E}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CD4538B9-EBD5-4340-B44A-890DDCEFC31E}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{CD4538B9-EBD5-4340-B44A-890DDCEFC31E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0AF193E3-D9AF-4551-B853-177F15FDC639}.MAUI|Any CPU.ActiveCfg = MAUI|Any CPU
+		{0AF193E3-D9AF-4551-B853-177F15FDC639}.MAUI|Any CPU.Build.0 = MAUI|Any CPU
+		{0302630F-9229-48C3-BF66-0A8E7384A3DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0302630F-9229-48C3-BF66-0A8E7384A3DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0302630F-9229-48C3-BF66-0A8E7384A3DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0302630F-9229-48C3-BF66-0A8E7384A3DF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0302630F-9229-48C3-BF66-0A8E7384A3DF}.MAUI|Any CPU.ActiveCfg = MAUI|Any CPU
 	EndGlobalSection
 	GlobalSection(MonoDevelopProperties) = preSolution
 		Policies = $0
 		$0.StandardHeader = $1
 		$1.IncludeInNewFiles = False
 		$0.VersionControlPolicy = $2
+		$0.DotNetNamingPolicy = $3
+		$3.DirectoryNamespaceAssociation = PrefixedHierarchical
+		$0.TextStylePolicy = $4
+		$4.inheritsSet = null
+		$4.scope = text/x-csharp
+		$0.CSharpFormattingPolicy = $5
+		$5.scope = text/x-csharp
+		$0.TextStylePolicy = $6
+		$6.FileWidth = 80
+		$6.TabsToSpaces = True
+		$6.scope = text/plain
 	EndGlobalSection
 EndGlobal
diff --git a/Float.Core/Float.Core.csproj b/Float.Core/Float.Core.csproj
index ec13c4a..93b401d 100644
--- a/Float.Core/Float.Core.csproj
+++ b/Float.Core/Float.Core.csproj
@@ -14,6 +14,7 @@
     <ReleaseVersion>1.0.0</ReleaseVersion>
     <Version></Version>
     <UseMaui>true</UseMaui>
+    <Configurations>Release;MAUI;Debug</Configurations>
   </PropertyGroup>
   <ItemGroup>
     <AdditionalFiles Include="$(SolutionDir)\stylecop.json" />
@@ -31,6 +32,23 @@
     <PackageLicenseExpression>MIT</PackageLicenseExpression>
     <PackageReadmeFile>readme.md</PackageReadmeFile>
   </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DefineConstants>TRACE;RELEASE;</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'MAUI|AnyCPU' ">
+    <IntermediateOutputPath>obj\MAUI</IntermediateOutputPath>
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\MAUI</OutputPath>
+    <DefineConstants>TRACE;DEBUG;MAUI;</DefineConstants>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\MAUI\Float.Core.xml</DocumentationFile>
+    <NoWarn></NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DefineConstants>TRACE;DEBUG;</DefineConstants>
+  </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="Float.TinCan" Version="1.0.3.30" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118">

From b3f9469ad283b175e87a34905b14c17f83ec1c10 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Mon, 15 Jan 2024 15:49:56 -0600
Subject: [PATCH 09/14] Part II

---
 .github/workflows/test.yml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 1295ba7..325697c 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -21,8 +21,10 @@ jobs:
         run: dotnet workload restore
       - name: Restore dependencies
         run: dotnet restore
-      - name: Build
+      - name: Build MAUI
         run: dotnet build --configuration MAUI --no-restore -f net7.0
+      - name: Build Legacy
+        run: dotnet build --configuration MAUI --no-restore -f netstandard2
       - name: Test
         run: dotnet test --configuration  MAUI --no-restore -f net7.0 --no-build --verbosity normal --logger:"trx;"
       - name: Publish Test Results

From 419e2a98706cd17f456ff064b1e6a0a3a3be52a0 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Mon, 15 Jan 2024 17:06:14 -0600
Subject: [PATCH 10/14] Remove net6.0

---
 Float.Core/Float.Core.csproj | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Float.Core/Float.Core.csproj b/Float.Core/Float.Core.csproj
index 93b401d..4a8621b 100644
--- a/Float.Core/Float.Core.csproj
+++ b/Float.Core/Float.Core.csproj
@@ -1,6 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFrameworks>netstandard2;net6.0;net7.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2;net7.0</TargetFrameworks>
     <AssemblyName>Float.Core</AssemblyName>
     <AssemblyAuthor>Float</AssemblyAuthor>
     <AssemblyDescription>Common utility code used by Float projects.</AssemblyDescription>

From 1f265fd0abce816489016560449c6f36213f85e1 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Tue, 16 Jan 2024 13:51:36 -0600
Subject: [PATCH 11/14] Test

---
 .github/workflows/test.yml | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 325697c..077a761 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -22,9 +22,7 @@ jobs:
       - name: Restore dependencies
         run: dotnet restore
       - name: Build MAUI
-        run: dotnet build --configuration MAUI --no-restore -f net7.0
-      - name: Build Legacy
-        run: dotnet build --configuration MAUI --no-restore -f netstandard2
+        run: dotnet build --configuration MAUI --no-restore
       - name: Test
         run: dotnet test --configuration  MAUI --no-restore -f net7.0 --no-build --verbosity normal --logger:"trx;"
       - name: Publish Test Results

From 3c997ff517c36d647bb99d8dbe42f727a03e06a2 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Tue, 16 Jan 2024 15:15:26 -0600
Subject: [PATCH 12/14] A test

---
 .github/workflows/test.yml | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 077a761..9fa9bf1 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -21,8 +21,14 @@ jobs:
         run: dotnet workload restore
       - name: Restore dependencies
         run: dotnet restore
-      - name: Build MAUI
-        run: dotnet build --configuration MAUI --no-restore
+      - name: Build
+        run: dotnet build --configuration Release --no-restore
+      - name: Save Artifact
+        uses: actions/upload-artifact@v3
+        with:
+          name: bin
+          path: ./Float.Core/bin/Release/Float.Core/
+          retention-days: 5 
       - name: Test
         run: dotnet test --configuration  MAUI --no-restore -f net7.0 --no-build --verbosity normal --logger:"trx;"
       - name: Publish Test Results

From 30e8eefb6ca81538c189db33b82643bc95711798 Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Tue, 16 Jan 2024 15:32:06 -0600
Subject: [PATCH 13/14] Tests change

---
 Float.Core.Tests/Float.Core.Tests.csproj | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Float.Core.Tests/Float.Core.Tests.csproj b/Float.Core.Tests/Float.Core.Tests.csproj
index 9d16ce2..d4cc849 100644
--- a/Float.Core.Tests/Float.Core.Tests.csproj
+++ b/Float.Core.Tests/Float.Core.Tests.csproj
@@ -1,6 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFrameworks>netcoreapp3.1;net6.0;net7.0</TargetFrameworks>
+    <TargetFrameworks>netcoreapp3.1;net7.0</TargetFrameworks>
     <IsPackable>false</IsPackable>
     <LangVersion>9.0</LangVersion>
     <UseMaui>true</UseMaui>

From 8a9b1847562ed5f444134e48fc6cf600d8799a0c Mon Sep 17 00:00:00 2001
From: Eric Busch <ebusch@gowithfloat.com>
Date: Tue, 16 Jan 2024 15:45:36 -0600
Subject: [PATCH 14/14] Another attempt

---
 .github/workflows/test.yml | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 9fa9bf1..2f7bbcc 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -23,11 +23,13 @@ jobs:
         run: dotnet restore
       - name: Build
         run: dotnet build --configuration Release --no-restore
+      - name: Pack
+        run: dotnet pack --configuration Release --no-restore
       - name: Save Artifact
         uses: actions/upload-artifact@v3
         with:
-          name: bin
-          path: ./Float.Core/bin/Release/Float.Core/
+          name: nupkg
+          path: ./Float.Core/obj/Release/
           retention-days: 5 
       - name: Test
         run: dotnet test --configuration  MAUI --no-restore -f net7.0 --no-build --verbosity normal --logger:"trx;"