using System; using System.Collections.Generic; using System.Device.Location; using System.Linq; using Hammock; using MahTweets.Mobile.Core; using MahTweets.Mobile.Core.Models; using MahTweets.Mobile.Core.Services; using Newtonsoft.Json; namespace MahTweets.Mobile.ViewModels { public class TrendsViewModel : MahViewModelBase { public ThreadSafeObservableCollection Trends { get; set; } public ThreadSafeObservableCollection LocalTrends { get; set; } private readonly ILocationService _locationService; private readonly INavigationService _navigationService; public TrendsViewModel(INavigationService navigationService, ILocationService locationService) { _navigationService = navigationService; _locationService = locationService; Trends = new ThreadSafeObservableCollection(); LocalTrends = new ThreadSafeObservableCollection(); } private void LoadTrends(int woeid, Action> callback) { RestClient r = new RestClient() { Authority = "http://api.whatthetrend.com/api/", HasElevatedPermissions = true }; var request = new RestRequest { Path = "trends.json", VersionPath = "v2", }; request.AddParameter("api_key", "37c4ba9d7ab4801b7ec684fbfd95734cc9a4b747"); if (woeid != 0) request.AddParameter("woeid", woeid.ToString()); r.BeginRequest(request, (req, res, state) => { if (!String.IsNullOrEmpty(res.Content)) { try { var trends = JsonConvert.DeserializeObject(res.Content); trends.Trends.Reverse(); callback(trends.Trends); } catch { } } }); } private void LoadTrends(Action> callback) { LoadTrends(0, callback); } public void Search(Trend trend) { var term = ((String.IsNullOrEmpty(trend.Query)) ? trend.Name : trend.Query); _navigationService.Navigate(new Uri("/Views/SearchView.xaml?term=" + Uri.EscapeDataString(term), UriKind.RelativeOrAbsolute)); } public void LoadLocalTrends() { if (LocalTrends.Any()) return; AddWork(_locationService.BeginGetLocation, _locationService.EndGetLocation) .WhenComplete(c => { if (c.Error != null && c.Error.GetType() == typeof(NoLocationDataException)) { } else { if (c.Result == null) return; RestClient r = new RestClient() { Authority = "http://api.twitter.com/1/trends/", HasElevatedPermissions = true }; var request = new RestRequest { Path = "available.json", }; request.AddParameter("lat", c.Result.Latitude.ToString()); request.AddParameter("long", c.Result.Longitude.ToString()); r.BeginRequest(request, (req, res, state) => { if (String.IsNullOrEmpty(res.Content)) return; try { var locations = JsonConvert.DeserializeObject>(res.Content); var closest = locations.FirstOrDefault(); if (closest != null) LoadTrends(closest.Woeid, (results) => results.ForEach(t => LocalTrends.Add(t))); } catch { } }); } }) .PerformWork(); } public void LoadGlobalTrends() { if (!Trends.Any()) LoadTrends((results) => { results.ForEach(t => Trends.Add(t)); }); } } }