working on bug 666601

This commit is contained in:
mgroves 2011-02-03 07:09:03 -05:00
parent 795f1ec3f8
commit 0aee8ad048
22 changed files with 129 additions and 203 deletions

View file

@ -40,7 +40,7 @@ namespace MonoStockPortfolio.Core
public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.W("Upgrade", "Nothing to upgrade");
Log.Warn("Upgrade", "Nothing to upgrade");
}
}
}

View file

@ -31,11 +31,7 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="FileHelpers">
<HintPath>..\libs\FileHelpers.dll</HintPath>
</Reference>
<Reference Include="Mono.Android" />
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
@ -52,9 +48,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\IPortfolioService.cs" />
<Compile Include="Services\PortfolioService.cs" />
<Compile Include="StockData\DummyStockDataProvider.cs" />
<Compile Include="StockData\IStockDataProvider.cs" />
<Compile Include="StockData\YahooFinanceStockData.cs" />
<Compile Include="StockData\YahooStockDataProvider.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MonoStockPortfolio.Entities\MonoStockPortfolio.Entities.csproj">

View file

@ -66,7 +66,7 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories
}
catch (SQLiteException)
{
Log.E("DeletePortfolio", "SQLiteException => Id = " + portfolioId);
Log.Error("DeletePortfolio", "SQLiteException => Id = " + portfolioId);
}
finally
{
@ -147,23 +147,23 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories
private void UpdateExistingPortfolio(Portfolio portfolio)
{
var portfolioID = portfolio.ID ?? -1;
Log.E("UpdateExistingPortfolio", "Portfolios updated: " + Db.Update(PORTFOLIO_TABLE_NAME, GetPortfolioContentValues(portfolio), "id = " + portfolioID, null));
Log.Error("UpdateExistingPortfolio", "Portfolios updated: " + Db.Update(PORTFOLIO_TABLE_NAME, GetPortfolioContentValues(portfolio), "id = " + portfolioID, null));
}
private void InsertNewPortfolio(Portfolio portfolio)
{
Log.E("InsertNewPortfolio", "Portfolios inserted: " + Db.Insert(PORTFOLIO_TABLE_NAME, null, GetPortfolioContentValues(portfolio)));
Log.Error("InsertNewPortfolio", "Portfolios inserted: " + Db.Insert(PORTFOLIO_TABLE_NAME, null, GetPortfolioContentValues(portfolio)));
}
private void UpdateExistingPosition(Position position)
{
var positionID = position.ID ?? -1;
Log.E("UpdateExistingPosition", "Positions updated: " + Db.Update(POSITION_TABLE_NAME, GetPositionContentValues(position), "id = " + positionID, null));
Log.Error("UpdateExistingPosition", "Positions updated: " + Db.Update(POSITION_TABLE_NAME, GetPositionContentValues(position), "id = " + positionID, null));
}
private void InsertNewPosition(Position position)
{
Log.E("InsertNewPosition", "Positions inserted: " + Db.Insert(POSITION_TABLE_NAME, null, GetPositionContentValues(position)));
Log.Error("InsertNewPosition", "Positions inserted: " + Db.Insert(POSITION_TABLE_NAME, null, GetPositionContentValues(position)));
}
private static ContentValues GetPortfolioContentValues(Portfolio portfolio)

View file

@ -50,7 +50,7 @@ namespace MonoStockPortfolio.Core.Services
}
catch (Exception ex)
{
Log.E("GetDetailedItems", ex.ToString());
Log.Error("GetDetailedItems", ex.ToString());
throw;
}
}

View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using MonoStockPortfolio.Entities;
namespace MonoStockPortfolio.Core.StockData
{
public class DummyStockDataProvider : IStockDataProvider
{
public IEnumerable<StockQuote> GetStockQuotes(IEnumerable<string> enumerable)
{
throw new NotImplementedException();
}
}
}

View file

@ -1,29 +0,0 @@
using FileHelpers;
namespace MonoStockPortfolio.Core.StockData
{
[DelimitedRecord(",")]
public class YahooFinanceStockData
{
[FieldQuoted(QuoteMode.OptionalForBoth)]
public string Ticker;
public decimal LastTradePrice;
[FieldQuoted(QuoteMode.OptionalForBoth)]
public string Name;
public string Volume;
public decimal Change;
[FieldQuoted(QuoteMode.OptionalForBoth)]
public string LastTradeTime;
[FieldQuoted(QuoteMode.OptionalForBoth)]
public string RealTimeLastTradeWithTime;
[FieldQuoted(QuoteMode.OptionalForBoth)]
public string ChangeRealTime;
}
}

View file

@ -1,105 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using Android.Util;
using FileHelpers;
using MonoStockPortfolio.Entities;
namespace MonoStockPortfolio.Core.StockData
{
public class YahooStockDataProvider : IStockDataProvider
{
private const string LAST_TRADE_PRICE_ONLY = "l1";
private const string NAME = "n";
private const string VOLUME = "v";
private const string TICKER_SYMBOL = "s";
private const string CHANGE = "c1";
private const string LAST_TRADE_TIME = "t1";
private const string REAL_TIME_LAST_TRADE_WITH_TIME = "k1";
private const string REAL_TIME_CHANGE = "c6";
// http://www.gummy-stuff.org/Yahoo-data.htm
// http://finance.yahoo.com/d/quotes.csv?s= a BUNCH of
// STOCK SYMBOLS separated by "+" &f=a bunch of special tags
public IEnumerable<StockQuote> GetStockQuotes(IEnumerable<string> tickers)
{
string url = "http://finance.yahoo.com/d/quotes.csv?s=";
url += string.Join("+", tickers.ToArray());
url += "&f=";
url += TICKER_SYMBOL;
url += LAST_TRADE_PRICE_ONLY;
url += NAME;
url += VOLUME;
url += CHANGE;
url += LAST_TRADE_TIME;
url += REAL_TIME_LAST_TRADE_WITH_TIME;
url += REAL_TIME_CHANGE;
string resultCsv = ScrapeUrl(url);
var yahooQuoteData = ParseCsvIntoStockQuotes(resultCsv);
foreach (var quote in yahooQuoteData)
{
yield return MapYahooData(quote);
}
}
private static StockQuote MapYahooData(YahooFinanceStockData data)
{
if(data == null)
{
return null;
}
var stock = new StockQuote();
stock.Name = data.Name;
stock.LastTradePrice = data.LastTradePrice;
stock.Ticker = data.Ticker;
stock.Volume = data.Volume;
stock.Change = data.Change;
stock.LastTradeTime = data.LastTradeTime;
stock.RealTimeLastTradePrice = decimal.Parse(data.RealTimeLastTradeWithTime
.Replace("<b>", "")
.Replace("</b>", "")
.Replace("N/A -", "")
.Trim()
);
stock.ChangeRealTime = data.ChangeRealTime;
return stock;
}
private static IList<YahooFinanceStockData> ParseCsvIntoStockQuotes(string csv)
{
var engine = new FileHelperEngine(typeof(YahooFinanceStockData));
var stockQuotes = engine.ReadString(csv) as YahooFinanceStockData[];
if(stockQuotes == null)
{
throw new ArgumentException("Could not parse CSV input");
}
return stockQuotes;
}
private static string ScrapeUrl(string url)
{
try
{
string resultCsv;
var req = WebRequest.Create(url);
var resp = req.GetResponse();
using (var sr = new StreamReader(resp.GetResponseStream()))
{
resultCsv = sr.ReadToEnd();
sr.Close();
}
return resultCsv;
}
catch (Exception ex)
{
Log.E("ScrapeUrlException", ex.ToString());
throw;
}
}
}
}

View file

@ -31,7 +31,6 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />

View file

@ -8,11 +8,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libs", "libs", "{643BA3D4-E
libs\FileHelpers.dll = libs\FileHelpers.dll
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assets", "assets", "{4EE7F6AD-B8A9-4402-800E-E4C8AE0FF8FB}"
ProjectSection(SolutionItems) = preProject
assets\UInotes.txt = assets\UInotes.txt
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoStockPortfolio.Core", "MonoStockPortfolio.Core\MonoStockPortfolio.Core.csproj", "{251E7BB4-CFE2-4DE4-9E2A-AAE1AF41C8CB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoStockPortfolio.Entities", "MonoStockPortfolio.Entities\MonoStockPortfolio.Entities.csproj", "{05A57650-3B41-46FF-9EAD-9112B5EFBEED}"

View file

@ -21,7 +21,7 @@ namespace MonoStockPortfolio.Activites
{
base.OnCreate(bundle);
AddPreferencesFromResource(Resource.layout.config);
AddPreferencesFromResource(Resource.Layout.config);
_stockItemsConfig = StockItemPreference.BuildList(_repo.GetStockItems()).ToArray();

View file

@ -16,7 +16,7 @@ namespace MonoStockPortfolio.Activites
{
base.OnCreate(bundle);
SetContentView(Resource.layout.addportfolio);
SetContentView(Resource.Layout.addportfolio);
WireUpEvents();

View file

@ -8,7 +8,7 @@ namespace MonoStockPortfolio.Activites
public static string Extra_PortfolioID { get { return "monoStockPortfolio.EditPortfolioActivity.PortfolioID"; } }
public long ThisPortfolioId { get { return Intent.GetLongExtra(Extra_PortfolioID, -1); } }
protected Button SaveButton { get { return FindViewById<Button>(Resource.id.btnSave); } }
protected EditText PortfolioName { get { return FindViewById<EditText>(Resource.id.portfolioName); } }
protected Button SaveButton { get { return FindViewById<Button>(Resource.Id.btnSave); } }
protected EditText PortfolioName { get { return FindViewById<EditText>(Resource.Id.portfolioName); } }
}
}

View file

@ -16,7 +16,7 @@ namespace MonoStockPortfolio.Activites
{
base.OnCreate(bundle);
SetContentView(Resource.layout.addposition);
SetContentView(Resource.Layout.addposition);
var positionId = ThisPositionId;
if (positionId != -1)

View file

@ -10,9 +10,9 @@ namespace MonoStockPortfolio.Activites
public static string Extra_PositionID { get { return "monoStockPortfolio.EditPositionActivity.PositionID"; } }
public long ThisPositionId { get { return Intent.GetLongExtra(Extra_PositionID, -1); } }
protected EditText TickerTextBox { get { return FindViewById<EditText>(Resource.id.addPositionTicker); } }
protected EditText PriceTextBox { get { return FindViewById<EditText>(Resource.id.addPositionPrice); } }
protected EditText SharesTextBox { get { return FindViewById<EditText>(Resource.id.addPositionShares); } }
protected Button SaveButton { get { return FindViewById<Button>(Resource.id.addPositionSaveButton); } }
protected EditText TickerTextBox { get { return FindViewById<EditText>(Resource.Id.addPositionTicker); } }
protected EditText PriceTextBox { get { return FindViewById<EditText>(Resource.Id.addPositionPrice); } }
protected EditText SharesTextBox { get { return FindViewById<EditText>(Resource.Id.addPositionShares); } }
protected Button SaveButton { get { return FindViewById<Button>(Resource.Id.addPositionSaveButton); } }
}
}

View file

@ -23,7 +23,7 @@ namespace MonoStockPortfolio.Activites
{
base.OnCreate(bundle);
SetContentView(Resource.layout.main);
SetContentView(Resource.Layout.main);
RefreshList();
@ -34,7 +34,7 @@ namespace MonoStockPortfolio.Activites
{
_portfolios = _repo.GetAllPortfolios();
var listAdapter = new ArrayAdapter<string>(this, Android.R.Layout.SimpleListItem1, _portfolios.Select(p => p.Name).ToList());
var listAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, _portfolios.Select(p => p.Name).ToList());
PortfolioListView.Adapter = listAdapter;
}
@ -83,9 +83,9 @@ namespace MonoStockPortfolio.Activites
public override bool OnCreateOptionsMenu(IMenu menu)
{
var configItem = menu.Add(0, 1, 1, "Config");
configItem.SetIcon(Android.R.Drawable.IcMenuPreferences);
configItem.SetIcon(Android.Resource.Drawable.IcMenuPreferences);
var exitItem = menu.Add(0, 1, 1, "Exit");
exitItem.SetIcon(Android.R.Drawable.IcMenuCloseClearCancel);
exitItem.SetIcon(Android.Resource.Drawable.IcMenuCloseClearCancel);
return true;
}

View file

@ -6,7 +6,7 @@ namespace MonoStockPortfolio.Activites
{
public static string ClassName { get { return "monostockportfolio.activites.MainActivity"; } }
protected Button AddPortfolioButton { get { return FindViewById<Button>(Resource.id.btnAddPortfolio); } }
protected ListView PortfolioListView { get { return FindViewById<ListView>(Resource.id.portfolioList); } }
protected Button AddPortfolioButton { get { return FindViewById<Button>(Resource.Id.btnAddPortfolio); } }
protected ListView PortfolioListView { get { return FindViewById<ListView>(Resource.Id.portfolioList); } }
}
}

View file

@ -27,7 +27,7 @@ namespace MonoStockPortfolio.Activites
{
base.OnCreate(bundle);
SetContentView(Resource.layout.portfolio);
SetContentView(Resource.Layout.portfolio);
Refresh();
@ -39,7 +39,7 @@ namespace MonoStockPortfolio.Activites
public override bool OnCreateOptionsMenu(IMenu menu)
{
var item = menu.Add(0,1,1,"Refresh");
item.SetIcon(Resource.drawable.ic_menu_refresh);
item.SetIcon(Resource.Drawable.ic_menu_refresh);
return true;
}
@ -115,7 +115,7 @@ namespace MonoStockPortfolio.Activites
private void ShowMessage(string message)
{
var listAdapter = new ArrayAdapter<string>(this, Android.R.Layout.SimpleListItem1, new[] {message});
var listAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, new[] { message });
QuoteListview.Adapter = listAdapter;
}
@ -134,10 +134,10 @@ namespace MonoStockPortfolio.Activites
var textItem = new TextView(this);
textItem.Text = stockDataItem.GetStringValue();
textItem.SetWidth(cellwidth);
textItem.SetTextColor(Resources.GetColor(Android.R.Color.Black));
textItem.SetTextColor(Resources.GetColor(Android.Resource.Color.Black));
QuoteListviewHeader.AddView(textItem);
}
QuoteListviewHeader.SetBackgroundResource(Android.R.Color.BackgroundLight);
QuoteListviewHeader.SetBackgroundResource(Android.Resource.Color.BackgroundLight);
}
public class PositionArrayAdapter : GenericArrayAdapter<PositionResultsViewModel>

View file

@ -9,8 +9,8 @@ namespace MonoStockPortfolio.Activites
public static string Extra_PortfolioID { get { return "monoStockPortfolio.PortfolioActivity.PortfolioID"; } }
public long ThisPortofolioId { get { return Intent.GetLongExtra(Extra_PortfolioID, -1); } }
protected ListView QuoteListview { get { return FindViewById<ListView>(Resource.id.quoteListview); } }
protected Button AddPositionButton { get { return FindViewById<Button>(Resource.id.btnAddPosition); } }
protected LinearLayout QuoteListviewHeader { get { return FindViewById<LinearLayout>(Resource.id.quoteHeaderLayout); } }
protected ListView QuoteListview { get { return FindViewById<ListView>(Resource.Id.quoteListview); } }
protected Button AddPositionButton { get { return FindViewById<Button>(Resource.Id.btnAddPosition); } }
protected LinearLayout QuoteListviewHeader { get { return FindViewById<LinearLayout>(Resource.Id.quoteHeaderLayout); } }
}
}

View file

@ -5,18 +5,18 @@ namespace MonoStockPortfolio.Framework
{
public class IoCAttribute : LocationInterceptionAspect
{
public override void OnGetValue(LocationInterceptionArgs args)
public sealed override void OnGetValue(LocationInterceptionArgs args)
{
if (ServiceLocator.Context == null)
{
var activityContext= (Context)args.Instance;
var activityContext = (Context)args.Instance;
ServiceLocator.Context = activityContext.ApplicationContext.ApplicationContext;
}
var locationType = args.Location.LocationType;
var instantiation = ServiceLocator.Get(locationType);
if(instantiation != null)
if (instantiation != null)
{
args.SetNewValue(instantiation);
}

View file

@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using Android.Content;
using MonoStockPortfolio.Core.Config;
using MonoStockPortfolio.Core.PortfolioRepositories;
using MonoStockPortfolio.Core.Services;
using MonoStockPortfolio.Core.StockData;
using MonoStockPortfolio.Entities;
using TinyIoC;
namespace MonoStockPortfolio.Framework
@ -27,12 +29,60 @@ namespace MonoStockPortfolio.Framework
var container = TinyIoCContainer.Current;
container.Register<Context>(Context);
container.Register<IStockDataProvider, YahooStockDataProvider>().AsMultiInstance();
container.Register<IPortfolioService, PortfolioService>().AsMultiInstance();
container.Register<IPortfolioRepository, AndroidSqlitePortfolioRepository>().AsMultiInstance();
container.Register<IConfigRepository, AndroidSqliteConfigRepository>().AsMultiInstance();
container.Register<IStockDataProvider, DummyStockDataProvider>().AsMultiInstance(); // works
container.Register<IPortfolioService, PortfolioService>().AsMultiInstance(); // works
container.Register<IPortfolioRepository, Whatever>().AsMultiInstance(); // error
//container.Register<IConfigRepository, AndroidSqliteConfigRepository>().AsMultiInstance(); // error
return container;
}
}
public class Whatever : IPortfolioRepository
{
public IList<Portfolio> GetAllPortfolios()
{
throw new NotImplementedException();
}
public void SavePortfolio(Portfolio portfolio)
{
throw new NotImplementedException();
}
public void DeletePortfolioById(int portfolioId)
{
throw new NotImplementedException();
}
public Portfolio GetPortfolioById(long portfolioId)
{
throw new NotImplementedException();
}
public Portfolio GetPortfolioByName(string portfolioName)
{
throw new NotImplementedException();
}
public IList<Position> GetAllPositions(long portfolioId)
{
throw new NotImplementedException();
}
public void SavePosition(Position position)
{
throw new NotImplementedException();
}
public void DeletePositionById(long positionId)
{
throw new NotImplementedException();
}
public Position GetPositionById(long positionId)
{
throw new NotImplementedException();
}
}
}

View file

@ -40,7 +40,7 @@
<Reference Include="mscorlib" />
<Reference Include="PostSharp.SL, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b13fd38b8f9c99d7, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\libs\PostSharp.SL.dll</HintPath>
<HintPath>..\..\..\Program Files (x86)\PostSharp 2.0\Reference Assemblies\Silverlight 3.0\PostSharp.SL.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@ -59,7 +59,6 @@
<Compile Include="Framework\ActivityExtensions.cs" />
<Compile Include="Framework\ContextExtensions.cs" />
<Compile Include="Framework\GenericArrayAdapter.cs" />
<Compile Include="Framework\IoCAttribute.cs" />
<Compile Include="Activites\MainActivity.designer.cs">
<DependentUpon>MainActivity.cs</DependentUpon>
</Compile>
@ -69,6 +68,7 @@
<Compile Include="Activites\PortfolioActivity.designer.cs">
<DependentUpon>PortfolioActivity.cs</DependentUpon>
</Compile>
<Compile Include="Framework\IoCAttribute.cs" />
<Compile Include="Framework\ServiceLocator.cs" />
<Compile Include="Framework\TinyIoC.cs" />
<Compile Include="Resources\Resource.Designer.cs" />
@ -77,9 +77,7 @@
<Compile Include="Framework\FormValidator.cs" />
</ItemGroup>
<ItemGroup>
<None Include="PostSharp.Custom.targets">
<SubType>Designer</SubType>
</None>
<None Include="PostSharp.Custom.targets" />
<None Include="Resources\AboutResources.txt" />
</ItemGroup>
<ItemGroup>
@ -119,17 +117,26 @@
</AndroidResource>
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\icon.png" />
<AndroidResource Include="Resources\drawable-ldpi\icon.png" />
<AndroidResource Include="Resources\drawable-mdpi\icon.png" />
<AndroidResource Include="Resources\layout\config.xml" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\ic_menu_refresh.png" />
<AndroidResource Include="Resources\drawable-ldpi\ic_menu_refresh.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-hdpi\icon.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\ic_menu_refresh.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\layout\config.xml" />
<AndroidResource Include="Resources\drawable-mdpi\icon.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-ldpi\ic_menu_refresh.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-ldpi\icon.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View file

@ -15,15 +15,15 @@ namespace MonoStockPortfolio
public partial class Resource
{
public partial class attr
public partial class Attribute
{
private attr()
private Attribute()
{
}
}
public partial class drawable
public partial class Drawable
{
// aapt resource value: 0x7f020000
@ -32,12 +32,12 @@ namespace MonoStockPortfolio
// aapt resource value: 0x7f020001
public const int icon = 2130837505;
private drawable()
private Drawable()
{
}
}
public partial class id
public partial class Id
{
// aapt resource value: 0x7f050004
@ -73,12 +73,12 @@ namespace MonoStockPortfolio
// aapt resource value: 0x7f05000a
public const int quoteListview = 2131034122;
private id()
private Id()
{
}
}
public partial class layout
public partial class Layout
{
// aapt resource value: 0x7f030000
@ -96,12 +96,12 @@ namespace MonoStockPortfolio
// aapt resource value: 0x7f030004
public const int portfolio = 2130903044;
private layout()
private Layout()
{
}
}
public partial class @string
public partial class String
{
// aapt resource value: 0x7f040001
@ -110,7 +110,7 @@ namespace MonoStockPortfolio
// aapt resource value: 0x7f040000
public const int hello = 2130968576;
private @string()
private String()
{
}
}