Skip to content
This repository has been archived by the owner on Nov 2, 2021. It is now read-only.

Commit

Permalink
Replaced string Navigation Parameter with NavigationParameters class,…
Browse files Browse the repository at this point in the history
… which is based on a string Dictionary. This allows for more complex Navigation data.
  • Loading branch information
WilliamABradley committed Feb 6, 2018
1 parent 593bb25 commit 820daaf
Show file tree
Hide file tree
Showing 19 changed files with 184 additions and 74 deletions.
20 changes: 20 additions & 0 deletions Core/Models/NavigationParameters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// ******************************************************************
// Copyright (c) William Bradley
// This code is licensed under the MIT License (MIT).
// THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************

using System.Collections.Generic;

namespace PlatformBindings.Models
{
public class NavigationParameters : Dictionary<string, string>
{
}
}
8 changes: 4 additions & 4 deletions Core/Services/NavigationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ public void Navigate(object Page)
Navigator.Navigate(Page);
}

public void Navigate(object Page, string Parameter)
public void Navigate(object Page, NavigationParameters Parameters)
{
Navigator.Navigate(Page, Parameter);
Navigator.Navigate(Page, Parameters);
}

public void Navigate(object Page, string Parameter, bool ClearBackStack)
public void Navigate(object Page, NavigationParameters Parameters, bool ClearBackStack)
{
Navigator.Navigate(Page, Parameter, ClearBackStack);
Navigator.Navigate(Page, Parameters, ClearBackStack);
}

public abstract void GoBack();
Expand Down
51 changes: 29 additions & 22 deletions Core/Services/Navigator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************

using PlatformBindings.Models;

namespace PlatformBindings.Services
{
/// <summary>
Expand All @@ -22,15 +24,21 @@ public abstract class Navigator
/// </summary>
/// <param name="Page">Page to Navigate to.</param>
/// <returns>Navigation Handled</returns>
public abstract bool Navigate(object Page);
public bool Navigate(object Page)
{
return Navigate(Page, null);
}

/// <summary>
/// Navigates to the requested Page, supplying a Parameter.
/// </summary>
/// <param name="Page">Page to Navigate to.</param>
/// <param name="Parameter">Parameter, can be serialised.</param>
/// <returns>Navigation Handled</returns>
public abstract bool Navigate(object Page, string Parameter);
public bool Navigate(object Page, NavigationParameters Parameters)
{
return Navigate(Page, Parameters, false);
}

/// <summary>
/// Navigates to the requested Page, supplying a Parameter.
Expand All @@ -39,12 +47,15 @@ public abstract class Navigator
/// <param name="Parameter">Parameter, can be serialised.</param>
/// <param name="ClearBackStack">Clear the Navigation Back Stack?</param>
/// <returns>Navigation Handled</returns>
public abstract bool Navigate(object Page, string Parameter, bool ClearBackStack);
public virtual bool Navigate(object Page, NavigationParameters Parameters, bool ClearBackStack)
{
return false;
}

/// <summary>
/// Gets the Parameter from the Current Page's Navigation Event.
/// </summary>
public abstract string Parameter { get; }
public abstract NavigationParameters Parameters { get; }
}

/// <summary>
Expand All @@ -60,31 +71,27 @@ public abstract class Navigator<TPageIdentifier> : Navigator
/// <param name="Parameter">Parameter, can be serialised.</param>
/// <param name="ClearBackStack">Clear the Navigation Back Stack?</param>
/// <returns>Navigation Handled</returns>
public abstract bool Navigate(TPageIdentifier Page, string Parameter, bool ClearBackStack);
public abstract bool Navigate(TPageIdentifier Page, NavigationParameters Parameters, bool ClearBackStack);

/// <summary>
/// Checks Casting
/// Navigates to the requested Page, supplying a Parameter.
/// </summary>
/// <param name="Page"></param>
/// <returns></returns>
public override bool Navigate(object Page)
/// <param name="Page">Page to Navigate to.</param>
/// <param name="Parameter">Parameter, can be serialised.</param>
/// <returns>Navigation Handled</returns>
public bool Navigate(TPageIdentifier Page, NavigationParameters Parameters)
{
return Navigate(Page, null);
return Navigate(Page, Parameters, false);
}

/// <summary>
/// Checks casting for Valid Navigation.
/// Navigates to the requested Page, supplying a Parameter.
/// </summary>
/// <param name="Page">Page to Navigate to (Must derrive of Generic)</param>
/// <param name="Parameter">Page Parameter.</param>
/// <param name="Page">Page to Navigate to.</param>
/// <returns>Navigation Handled</returns>
public override bool Navigate(object Page, string Parameter)
public bool Navigate(TPageIdentifier Page)
{
if (Page is TPageIdentifier generic)
{
return Navigate(generic, Parameter, false);
}
else return false;
return Navigate(Page, null);
}

/// <summary>
Expand All @@ -94,13 +101,13 @@ public override bool Navigate(object Page, string Parameter)
/// <param name="Parameter">Page Parameter.</param>
/// <param name="ClearBackStack">Clear the Navigation Back Stack?</param>
/// <returns>Navigation Handled</returns>
public override bool Navigate(object Page, string Parameter, bool ClearBackStack)
public override bool Navigate(object Page, NavigationParameters Parameters, bool ClearBackStack)
{
if (Page is TPageIdentifier generic)
{
return Navigate(generic, Parameter, ClearBackStack);
return Navigate(generic, Parameters, ClearBackStack);
}
else return false;
else return base.Navigate(Page, Parameters, ClearBackStack);
}
}
}
4 changes: 3 additions & 1 deletion Platform/PlatformBindings-Platform.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<DevInstrumentationEnabled>True</DevInstrumentationEnabled>
<AndroidResgenFile>Platforms\Android\Resources\Resource.Designer.cs</AndroidResgenFile>
<!-- Not needed yet.
<AndroidResgenFile>Platforms\Android\Resources\Resource.Designer.cs</AndroidResgenFile>
-->
</PropertyGroup>

<!-- Platform Requirements -->
Expand Down
12 changes: 12 additions & 0 deletions Platform/Platforms/Android/Resources/Resource.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 30 additions & 10 deletions Platform/Platforms/Android/Services/AndroidActivityNavigator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@

using Android.App;
using Android.Content;
using Newtonsoft.Json;
using PlatformBindings.Activities;
using PlatformBindings.Common;
using PlatformBindings.Models;
using System;

namespace PlatformBindings.Services
Expand All @@ -37,26 +39,34 @@ private void ActivityHandler_ActivityChanged(object sender, EventArgs e)
}
}

protected virtual bool InternalNavigate(Type Type, string Parameter)
protected virtual bool InternalNavigate(Type Type)
{
return InternalNavigate(Type, Parameter, true);
return InternalNavigate(Type, null, true);
}

protected virtual bool InternalNavigate(Type Type, string Parameter, bool ShowBack)
protected virtual bool InternalNavigate(Type Type, NavigationParameters Parameters)
{
return InternalNavigate(Type, Parameter, ShowBack, false);
return InternalNavigate(Type, Parameters, true);
}

protected virtual bool InternalNavigate(Type Type, string Parameter, bool ShowBack, bool ClearBackStack)
protected virtual bool InternalNavigate(Type Type, NavigationParameters Parameters, bool ShowBack)
{
return InternalNavigate(Type, Parameters, ShowBack, false);
}

protected virtual bool InternalNavigate(Type Type, NavigationParameters Parameters, bool ShowBack, bool ClearBackStack)
{
var activity = CurrentActivity;

var intent = new Intent(activity, Type);
intent.PutExtra("ShowBack", ShowBack);
if (!string.IsNullOrWhiteSpace(Parameter))

if (Parameters != null)
{
intent.PutExtra("Parameter", Parameter);
var param = JsonConvert.SerializeObject(Parameters);
intent.PutExtra(ParameterKey, param);
}

if (ClearBackStack)
{
intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
Expand All @@ -65,15 +75,25 @@ protected virtual bool InternalNavigate(Type Type, string Parameter, bool ShowBa
return true;
}

public override string Parameter
public override NavigationParameters Parameters
{
get
{
var intent = CurrentActivity?.Intent;
return intent?.GetStringExtra("Parameter");
try
{
var intent = CurrentActivity?.Intent;
var param = intent?.GetStringExtra(ParameterKey);
return JsonConvert.DeserializeObject<NavigationParameters>(param);
}
catch
{
return null;
}
}
}

private Activity CurrentActivity => AndroidHelpers.GetCurrentActivity();

private const string ParameterKey = "Parameters";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

using Android.App;
using PlatformBindings.Common;
using PlatformBindings.Models;

namespace PlatformBindings.Services
{
Expand All @@ -24,10 +25,10 @@ public abstract class AndroidFragmentNavigator<T> : Navigator<T>
/// <param name="Parameter">Parameter to remember after the Navigation.</param>
/// <param name="ClearBackStack">Removes the ability to go to the previous Fragment.</param>
/// <returns>Navigation Handled</returns>
protected bool NavigatePrimaryFragment(Fragment Fragment, string Parameter, bool ClearBackStack)
protected bool NavigatePrimaryFragment(Fragment Fragment, NavigationParameters Parameters, bool ClearBackStack)
{
var currentNavigationActivity = Manager.PrimaryNavigationFragment;
_Parameter = Parameter;
_Parameters = Parameters;

var transaction = Manager.BeginTransaction();
transaction.Replace(currentNavigationActivity.Id, Fragment);
Expand All @@ -40,12 +41,12 @@ protected bool NavigatePrimaryFragment(Fragment Fragment, string Parameter, bool
return true;
}

public override string Parameter => _Parameter;
public override NavigationParameters Parameters => _Parameters;

/// <summary>
/// Parameter Storage, as Fragment Navigation doesn't natively support Parameters that I'm aware of.
/// </summary>
protected string _Parameter { get; set; }
protected NavigationParameters _Parameters { get; set; }

public FragmentManager Manager => AndroidHelpers.GetCurrentActivity().FragmentManager;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Android.Support.V4.App;
using Android.Support.V7.App;
using PlatformBindings.Common;
using PlatformBindings.Models;

namespace PlatformBindings.Services.Compat
{
Expand All @@ -25,10 +26,10 @@ public abstract class AndroidCompatFragmentNavigator<T> : Navigator<T>
/// <param name="Parameter">Parameter to remember after the Navigation.</param>
/// <param name="ClearBackStack">Removes the ability to go to the previous Fragment.</param>
/// <returns>Navigation Handled</returns>
protected bool NavigatePrimaryFragment(Fragment Fragment, string Parameter, bool ClearBackStack)
protected bool NavigatePrimaryFragment(Fragment Fragment, NavigationParameters Parameters, bool ClearBackStack)
{
var currentNavigationActivity = Manager.PrimaryNavigationFragment;
_Parameter = Parameter;
_Parameters = Parameters;

var transaction = Manager.BeginTransaction();
transaction.Replace(currentNavigationActivity.Id, Fragment);
Expand All @@ -41,12 +42,12 @@ protected bool NavigatePrimaryFragment(Fragment Fragment, string Parameter, bool
return true;
}

public override string Parameter => _Parameter;
public override NavigationParameters Parameters => _Parameters;

/// <summary>
/// Parameter Storage, as Fragment Navigation doesn't natively support Parameters that I'm aware of.
/// </summary>
protected string _Parameter { get; set; }
protected NavigationParameters _Parameters { get; set; }

public FragmentManager Manager => ((AppCompatActivity)AndroidHelpers.GetCurrentActivity())?.SupportFragmentManager;
}
Expand Down
22 changes: 17 additions & 5 deletions Platform/Platforms/UWP/Services/UWPNavigator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************

using Newtonsoft.Json;
using PlatformBindings.Common;
using PlatformBindings.Models;
using System;
using Windows.UI.Xaml.Controls;

Expand All @@ -26,23 +28,33 @@ public UWPNavigator(Frame Frame)

private void Frame_Navigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
_Parameter = (string)e.Parameter;
var param = (string)e.Parameter;
_Parameters = param != null ? JsonConvert.DeserializeObject<NavigationParameters>(param) : null;
}

protected virtual bool InternalNavigate(Type Type, string Parameter, bool ShowBackButton = false, bool ClearBackStack = false)
protected virtual bool InternalNavigate(Type Type, NavigationParameters Parameters, bool ShowBackButton = false, bool ClearBackStack = false)
{
PlatformBindingHelpers.OnUIThread(() =>
{
Frame.Navigate(Type, Parameter);
if (Parameters != null)
{
var parameterStr = JsonConvert.SerializeObject(Parameters);
Frame.Navigate(Type, parameterStr);
}
else
{
Frame.Navigate(Type);
}

AppServices.Current.UI.NavigationManager.ShowBackButton = ShowBackButton;

if (ClearBackStack) Frame.BackStack.Clear();
});
return true;
}

public override string Parameter => _Parameter;
private string _Parameter;
public override NavigationParameters Parameters => _Parameters;
private NavigationParameters _Parameters;

private Frame Frame { get; }
}
Expand Down
Loading

0 comments on commit 820daaf

Please sign in to comment.