Skip to content

Instantly share code, notes, and snippets.

@mgroves
Created March 6, 2011 15:28
Show Gist options
  • Save mgroves/857356 to your computer and use it in GitHub Desktop.
Save mgroves/857356 to your computer and use it in GitHub Desktop.
MVP pattern in MonoDroid
public interface IMainView
{
void RefreshList(IList<string> portfolioNames);
void StartAddPortfolioActivity();
void StartViewPortfolioActivity(long portfolioId);
void StartEditPortfolioActivity(int itemId);
void StartConfigActivity();
void ExitApplication();
}
public interface IMainPresenter
{
void Initialize(IMainView view);
void RefreshPortfolioList();
void AddNewPortfolio();
void ViewPortfolio(int portfolioPosition);
void DeletePortfolio(int itemId);
void EditPortfolio(int itemId);
void GotoConfig();
void ExitApplication();
int GetPortfolioIdForContextMenu(string selectedPortfolioName);
}
public class MainPresenter : IMainPresenter
{
private IPortfolioRepository _repo;
private IMainView _currentView;
private IList<Portfolio> _portfolios;
private IList<Portfolio> Portfolios
{
get
{
return _portfolios ?? (_portfolios = _repo.GetAllPortfolios());
}
}
public MainPresenter(IPortfolioRepository portfolioRepository)
{
_repo = portfolioRepository;
}
public void Initialize(IMainView view)
{
_currentView = view;
RefreshPortfolioList();
}
public void RefreshPortfolioList()
{
var portfolioNames = Portfolios.Select(p => p.Name).ToList();
_currentView.RefreshList(portfolioNames);
}
public void AddNewPortfolio()
{
_currentView.StartAddPortfolioActivity();
}
public void ViewPortfolio(int portfolioPosition)
{
// why is _currentView null?
_currentView.StartViewPortfolioActivity(Portfolios[portfolioPosition].ID ?? -1);
}
public void DeletePortfolio(int itemId)
{
_repo.DeletePortfolioById(itemId);
}
public void EditPortfolio(int itemId)
{
_currentView.StartEditPortfolioActivity(itemId);
}
public void GotoConfig()
{
_currentView.StartConfigActivity();
}
public void ExitApplication()
{
_currentView.ExitApplication();
}
public int GetPortfolioIdForContextMenu(string selectedPortfolioName)
{
var selectedPortfolio = _repo.GetPortfolioByName(selectedPortfolioName);
var id = (int)(selectedPortfolio.ID ?? -1);
return id;
}
}
[Activity(Label = "Stock Portfolio", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity, IMainView
{
[LazyView(Resource.Id.btnAddPortfolio)] protected Button AddPortfolioButton;
[LazyView(Resource.Id.portfolioList)] protected ListView PortfolioListView;
[IoC] IMainPresenter _presenter;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.main);
_presenter.Initialize(this);
WireUpEvents();
}
#region IMainView implementation
public void RefreshList(IList<string> portfolioNames)
{
var listAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, portfolioNames);
PortfolioListView.Adapter = listAdapter;
}
public void ExitApplication()
{
Finish();
}
public void StartEditPortfolioActivity(int itemId)
{
var intent = EditPortfolioActivity.EditIntent(this, itemId);
StartActivityForResult(intent, 0);
}
public void StartConfigActivity()
{
var intent = ConfigActivity.GotoIntent(this);
StartActivityForResult(intent, 0);
}
public void StartViewPortfolioActivity(long portfolioId)
{
var intent = PortfolioActivity.ViewIntent(this, portfolioId);
StartActivityForResult(intent, 0);
}
public void StartAddPortfolioActivity()
{
var intent = EditPortfolioActivity.AddIntent(this);
StartActivityForResult(intent, 0);
}
#endregion
private void WireUpEvents()
{
AddPortfolioButton.Click += addPortfolioButton_Click;
PortfolioListView.ItemClick += listView_ItemClick;
RegisterForContextMenu(PortfolioListView);
}
public override void OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo)
{
base.OnCreateContextMenu(menu, v, menuInfo);
var info = (AdapterView.AdapterContextMenuInfo)menuInfo;
var selectedPortfolioName = ((TextView)info.TargetView).Text.ToS();
var id = _presenter.GetPortfolioIdForContextMenu(selectedPortfolioName);
menu.SetHeaderTitle("Options".ToJ());
menu.Add(0, id, 1, "Rename".ToJ());
menu.Add(0, id, 2, "Delete".ToJ());
}
public override bool OnContextItemSelected(IMenuItem item)
{
if (item.TitleFormatted.ToS() == "Rename")
{
// Edit
_presenter.EditPortfolio(item.ItemId);
return true;
}
if (item.TitleFormatted.ToS() == "Delete")
{
// Delete
_presenter.DeletePortfolio(item.ItemId);
_presenter.RefreshPortfolioList();
return true;
}
return base.OnContextItemSelected(item);
}
public override bool OnCreateOptionsMenu(IMenu menu)
{
var configItem = menu.Add(0, 1, 1, "Config".ToJ());
configItem.SetIcon(Android.Resource.Drawable.IcMenuPreferences);
var exitItem = menu.Add(0, 1, 1, "Exit".ToJ());
exitItem.SetIcon(Android.Resource.Drawable.IcMenuCloseClearCancel);
return true;
}
public override bool OnOptionsItemSelected(IMenuItem item)
{
switch (item.TitleFormatted.ToS())
{
case "Config":
_presenter.GotoConfig();
return true;
case "Exit":
_presenter.ExitApplication();
return true;
default:
return base.OnOptionsItemSelected(item);
}
}
private void listView_ItemClick(object sender, ItemEventArgs e)
{
_presenter.ViewPortfolio(e.Position);
}
private void addPortfolioButton_Click(object sender, EventArgs e)
{
_presenter.AddNewPortfolio();
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
_presenter.RefreshPortfolioList();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment