Skip to content

Commit

Permalink
Merge pull request #1601 from MvvmCross/eventhooks
Browse files Browse the repository at this point in the history
Create view events in Viewmodels
  • Loading branch information
martijn00 committed Feb 15, 2017
2 parents bf3fb22 + c46e148 commit b6d3461
Show file tree
Hide file tree
Showing 86 changed files with 2,570 additions and 48 deletions.
Expand Up @@ -59,7 +59,18 @@ protected override void OnCreate(Bundle bundle)

base.OnCreate(bundle);

if (bundle == null)
var rootView = Window.DecorView.RootView;

EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
rootView.ViewTreeObserver.GlobalLayout -= onGlobalLayout;
ViewModel.Appeared();
};

rootView.ViewTreeObserver.GlobalLayout += onGlobalLayout;

if (bundle == null)
HandleIntent(Intent);
else
{
Expand Down Expand Up @@ -454,6 +465,19 @@ public virtual bool Close(IMvxViewModel viewModel)
CloseFragment(frag.Tag, frag.ContentId);
return true;
}

public override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
ViewModel.Appearing();
}

public override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
ViewModel.Disappearing(); // we don't have anywhere to get this info
ViewModel.Disappeared();
}
}

public abstract class MvxCachingFragmentActivity<TViewModel>
Expand Down
Expand Up @@ -56,6 +56,36 @@ protected void EnsureBindingContextSet(Bundle b0)
}

public virtual string UniqueImmutableCacheTag => Tag;

public override void OnDestroy()
{
base.OnDestroy();
ViewModel?.Destroy();
}

public override void OnStart()
{
base.OnStart();
ViewModel.Appearing();
}

public override void OnResume()
{
base.OnResume();
ViewModel.Appeared();
}

public override void OnPause()
{
base.OnPause();
ViewModel.Disappearing();
}

public override void OnStop()
{
base.OnStop();
ViewModel.Disappeared();
}
}

public abstract class MvxDialogFragment<TViewModel>
Expand Down
Expand Up @@ -73,6 +73,36 @@ public virtual void OnViewModelSet()
}

public virtual string UniqueImmutableCacheTag => Tag;

public override void OnDestroy()
{
base.OnDestroy();
ViewModel?.Destroy();
}

public override void OnStart()
{
base.OnStart();
ViewModel.Appearing();
}

public override void OnResume()
{
base.OnResume();
ViewModel.Appeared();
}

public override void OnPause()
{
base.OnPause();
ViewModel.Disappearing();
}

public override void OnStop()
{
base.OnStop();
ViewModel.Disappeared();
}
}

public abstract class MvxFragment<TViewModel>
Expand Down
Expand Up @@ -61,13 +61,36 @@ protected virtual void OnViewModelSet()
public override void SetContentView(int layoutResId)
{
var view = this.BindingInflate(layoutResId, null);

EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
view.ViewTreeObserver.GlobalLayout -= onGlobalLayout;
ViewModel.Appeared();
};

view.ViewTreeObserver.GlobalLayout += onGlobalLayout;

SetContentView(view);
}

protected override void AttachBaseContext(Context @base)
{
base.AttachBaseContext(MvxContextWrapper.Wrap(@base, this));
}

public override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
ViewModel.Appearing();
}

public override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
ViewModel.Disappearing(); // we don't have anywhere to get this info
ViewModel.Disappeared();
}
}

public abstract class MvxFragmentActivity<TViewModel>
Expand Down
Expand Up @@ -86,6 +86,18 @@ protected override void OnCreate(Bundle savedInstanceState)
base.OnCreate(savedInstanceState);

SetContentView(_layoutId);

var rootView = Window.DecorView.RootView;

EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
rootView.ViewTreeObserver.GlobalLayout -= onGlobalLayout;
ViewModel.Appeared();
};

rootView.ViewTreeObserver.GlobalLayout += onGlobalLayout;

InitializeTabHost(savedInstanceState);

if (savedInstanceState != null)
Expand Down Expand Up @@ -205,5 +217,18 @@ protected virtual string FragmentJavaName(Type fragmentType)
public virtual void OnTabFragmentChanging(string tag, FragmentTransaction transaction)
{
}

public override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
ViewModel.Appearing();
}

public override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
ViewModel.Disappearing(); // we don't have anywhere to get this info
ViewModel.Disappeared();
}
}
}
10 changes: 10 additions & 0 deletions MvvmCross/Core/Core/ViewModels/IMvxViewModel.cs
Expand Up @@ -11,12 +11,22 @@ public interface IMvxViewModel
{
MvxRequestedBy RequestedBy { get; set; }

void Appearing();

void Appeared();

void Disappearing();

void Disappeared();

void Init(IMvxBundle parameters);

void ReloadState(IMvxBundle state);

void Start();

void Destroy ();

void SaveState(IMvxBundle state);
}
}
21 changes: 20 additions & 1 deletion MvvmCross/Core/Core/ViewModels/MvxViewModel.cs
Expand Up @@ -19,8 +19,23 @@ protected MvxViewModel()
{
this.RequestedBy = MvxRequestedBy.Unknown;
}
public MvxRequestedBy RequestedBy { get; set; }

public MvxRequestedBy RequestedBy { get; set; }
public virtual void Appearing()
{
}

public virtual void Appeared()
{
}

public virtual void Disappearing()
{
}

public virtual void Disappeared()
{
}

public void Init(IMvxBundle parameters)
{
Expand All @@ -36,6 +51,10 @@ public virtual void Start()
{
}

public virtual void Destroy ()
{
}

public void SaveState(IMvxBundle state)
{
this.SaveStateToBundle(state);
Expand Down
27 changes: 26 additions & 1 deletion MvvmCross/Droid/Droid/Views/MvxActivity.cs
Expand Up @@ -5,6 +5,8 @@
//
// Project Lead - Stuart Lodge, @slodge, me@slodge.com

using Android.Views;

namespace MvvmCross.Droid.Views
{
using System;
Expand Down Expand Up @@ -59,7 +61,17 @@ public void MvxInternalStartActivityForResult(Intent intent, int requestCode)
public override void SetContentView(int layoutResId)
{
var view = this.BindingInflate(layoutResId, null);
this.SetContentView(view);

EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
view.ViewTreeObserver.GlobalLayout -= onGlobalLayout;
ViewModel.Appeared();
};

view.ViewTreeObserver.GlobalLayout += onGlobalLayout;

SetContentView(view);
}

protected virtual void OnViewModelSet()
Expand All @@ -76,6 +88,19 @@ protected override void AttachBaseContext(Context @base)
}
base.AttachBaseContext(MvxContextWrapper.Wrap(@base, this));
}

public override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
ViewModel.Appearing();
}

public override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
ViewModel.Disappearing(); // we don't have anywhere to get this info
ViewModel.Disappeared();
}
}

public abstract class MvxActivity<TViewModel>
Expand Down
23 changes: 23 additions & 0 deletions MvvmCross/Droid/Droid/Views/MvxTabActivity.cs
Expand Up @@ -67,13 +67,36 @@ protected virtual void OnViewModelSet()
public override void SetContentView(int layoutResId)
{
var view = this.BindingInflate(layoutResId, null);

EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
view.ViewTreeObserver.GlobalLayout -= onGlobalLayout;
ViewModel.Appeared();
};

view.ViewTreeObserver.GlobalLayout += onGlobalLayout;

this.SetContentView(view);
}

protected override void AttachBaseContext(Context @base)
{
base.AttachBaseContext(MvxContextWrapper.Wrap(@base, this));
}

public override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
ViewModel.Appearing();
}

public override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
ViewModel.Disappearing(); // we don't have anywhere to get this info
ViewModel.Disappeared();
}
}

[Obsolete("TabActivity is obsolete. Use ViewPager + Indicator or any other Activity with Toolbar support.")]
Expand Down
30 changes: 26 additions & 4 deletions MvvmCross/Droid/FullFragging/Caching/MvxCachingFragmentActivity.cs
Expand Up @@ -11,11 +11,9 @@
using Android.App;
using Android.OS;
using Android.Runtime;
using MvvmCross.Binding.Droid.BindingContext;
using MvvmCross.Core.ViewModels;
using MvvmCross.Core.Views;
using MvvmCross.Droid.Shared.Attributes;
using MvvmCross.Droid.FullFragging.Fragments;
using MvvmCross.Droid.Platform;
using MvvmCross.Droid.Views;
using MvvmCross.Platform;
Expand Down Expand Up @@ -345,7 +343,18 @@ protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);

if (bundle == null) {
var rootView = Window.DecorView.RootView;

EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
rootView.ViewTreeObserver.GlobalLayout -= onGlobalLayout;
ViewModel.Appeared();
};

rootView.ViewTreeObserver.GlobalLayout += onGlobalLayout;

if (bundle == null) {
var fragmentRequestText = Intent.Extras?.GetString (ViewModelRequestBundleKey);
if (fragmentRequestText == null)
return;
Expand Down Expand Up @@ -447,7 +456,20 @@ public virtual bool Close(IMvxViewModel viewModel)
CloseFragment(frag.Tag, frag.ContentId);
return true;
}
}

public override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
ViewModel.Appearing();
}

public override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
ViewModel.Disappearing(); // we don't have anywhere to get this info
ViewModel.Disappeared();
}
}

public abstract class MvxCachingFragmentActivity<TViewModel>
: MvxCachingFragmentActivity
Expand Down

0 comments on commit b6d3461

Please sign in to comment.