Skip to content

Commit

Permalink
Merge pull request #1702 from PrismLibrary/PlatformSpecificViewRegist…
Browse files Browse the repository at this point in the history
…ration

Platform specific view registration
  • Loading branch information
dansiegel committed Feb 19, 2019
2 parents 508b5c8 + c8f208f commit 2109273
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
using Prism.Navigation;
using Prism.Services;
using Xamarin.Forms;
using Xamarin.Forms.Mocks;
using Xunit;
using Xunit.Abstractions;

Expand Down Expand Up @@ -143,6 +144,40 @@ public async Task Navigate_UnregisteredView_ThrowException()
Assert.Contains("missing", result.Exception.ToString(), StringComparison.OrdinalIgnoreCase);
}

[Theory]
[InlineData(typeof(AutowireView), TargetIdiom.Unsupported)]
[InlineData(typeof(AutowireViewTablet), TargetIdiom.Tablet)]
public async Task NavigationUses_IdiomSpecificView(Type viewType, TargetIdiom idiom)
{
Device.SetIdiom(idiom);
var initializer = new XunitPlatformInitializer(_testOutputHelper);
var app = new PrismApplicationMockPlatformAware(initializer);

Assert.True(app.Initialized);
await app.NavigationService.NavigateAsync("AutowireView");
Assert.IsType(viewType, app.MainPage);
Assert.IsType<AutowireViewModel>(app.MainPage.BindingContext);

Device.SetIdiom(TargetIdiom.Unsupported);
}

[Theory]
[InlineData(typeof(ViewAMock), "Test")]
[InlineData(typeof(ViewAMockAndroid), Device.Android)]
public async Task NavigationUses_PlatformSpecificView(Type viewType, string runtimePlatform)
{
MockForms.UpdateRuntimePlatform(runtimePlatform);
var initializer = new XunitPlatformInitializer(_testOutputHelper);
var app = new PrismApplicationMockPlatformAware(initializer);

Assert.True(app.Initialized);
await app.NavigationService.NavigateAsync("ViewAMock");
Assert.IsType(viewType, app.MainPage);
Assert.IsType<ViewModelAMock>(app.MainPage.BindingContext);

MockForms.UpdateRuntimePlatform("Test");
}

[Fact]
public async Task Navigate_Key()
{
Expand Down
5 changes: 5 additions & 0 deletions Source/Xamarin/Prism.DI.Forms.Tests/MockForms.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public static void Init(string runtimePlatform = "Test")
OpenUriAction = null;
}

public static void UpdateRuntimePlatform(string runtimePlatform)
{
Device.PlatformServices = new PlatformServices(runtimePlatform);
}

private class PlatformServices : IPlatformServices
{
public PlatformServices(string runtimePlatform)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using Prism.DI.Forms.Tests.Mocks.Modules;
using Prism.DI.Forms.Tests.Mocks.Services;
using Prism.DI.Forms.Tests.Mocks.ViewModels;
using Prism.DI.Forms.Tests.Mocks.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Navigation;
using Xamarin.Forms;
using Prism.Logging;
using Prism.Forms.Tests.Mocks.Logging;
using Prism.Mvvm;
#if Autofac
using Prism.Autofac;
using Autofac;
#elif DryIoc
using Prism.DryIoc;
using DryIoc;
#elif Ninject
using Prism.Ninject;
using Ninject;
#elif Unity
using Prism.Unity;
using Unity;
#endif

namespace Prism.DI.Forms.Tests
{
public class PrismApplicationMockPlatformAware : PrismApplicationMock
{
public PrismApplicationMockPlatformAware(IPlatformInitializer platformInitializer)
: base(platformInitializer)
{
}

public PrismApplicationMockPlatformAware(IPlatformInitializer platformInitializer, Page startPage)
: base(platformInitializer, startPage)
{
}

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<NavigationPage>();

containerRegistry.RegisterForNavigationOnIdiom<AutowireView, AutowireViewModel>(tabletView: typeof(AutowireViewTablet));
containerRegistry.RegisterForNavigationOnPlatform<ViewAMock, ViewModelAMock>(new Platform<ViewAMockAndroid>(AppModel.RuntimePlatform.Android));

DependencyService.Register<IDependencyServiceMock, DependencyServiceMock>();
ViewModelLocationProvider.Register<PartialView, PartialViewModel>();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Prism.Mvvm;
using Xamarin.Forms;

namespace Prism.DI.Forms.Tests.Mocks.Views
{
public class AutowireViewTablet : Page
{
public AutowireViewTablet()
{
ViewModelLocator.SetAutowireViewModel(this, true);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Prism.Mvvm;
using Xamarin.Forms;

namespace Prism.DI.Forms.Tests.Mocks.Views
{
public class ViewAMockAndroid : Page
{
public ViewAMockAndroid()
{
ViewModelLocator.SetAutowireViewModel(this, true);
}
}
}
13 changes: 8 additions & 5 deletions Source/Xamarin/Prism.Forms/Ioc/IContainerRegistryExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Linq;
using Xamarin.Forms;

namespace Prism.Ioc
Expand Down Expand Up @@ -126,13 +127,15 @@ public static void RegisterForNavigation(this IContainerRegistry containerRegist
if (string.IsNullOrWhiteSpace(name))
name = typeof(TView).Name;

foreach (var platform in platforms)
if(platforms.Any(x => x.RuntimePlatform.ToString() == Device.RuntimePlatform))
{
if (Device.RuntimePlatform == platform.RuntimePlatform.ToString())
containerRegistry.RegisterForNavigationWithViewModel<TViewModel>(platform.ViewType, name);
var platform = platforms.First(x => x.RuntimePlatform.ToString() == Device.RuntimePlatform);
containerRegistry.RegisterForNavigationWithViewModel<TViewModel>(platform.ViewType, name);
}
else
{
containerRegistry.RegisterForNavigation<TView, TViewModel>(name);
}

containerRegistry.RegisterForNavigation<TView, TViewModel>(name);
}

/// <summary>
Expand Down

0 comments on commit 2109273

Please sign in to comment.