public async Task LoadRemoteAppSettings(bool overrideCache = false) { var remoteSettings = await GetRemoteAppSettings(overrideCache); if(remoteSettings != null) try { var fields = typeof(AppSettings).GetRuntimeFields(); var a = new Dictionary<string, object>(); MvxJsonConverter mvxJsonConverter = new MvxJsonConverter(); a = mvxJsonConverter.DeserializeObject<Dictionary<string,object>>(remoteSettings); foreach (FieldInfo field in fields) { var value = a[field.Name]; //JSON.Net converts all numeric values to Int64 which breaks things =) //http://stackoverflow.com/questions/16683784/expression-convert-object-of-type-system-int64-cannot-be-converted-to-type-s if (value.GetType() == typeof(Int64)) value = Convert.ToInt32(value); else if(value.GetType() == typeof(JArray)) { if (field.FieldType == typeof(UrlSource[])) { JArray jArray = value as JArray; List<UrlSource> urlSourceList = new List<UrlSource>(); foreach (var item in jArray) urlSourceList.Add(new UrlSource { Url = item["Url"].ToString(), Group = item["Group"].ToString(), Type = item["Type"].ToString() }); value = urlSourceList.ToArray(); } else if (field.FieldType == typeof(string[])) { JArray jArray = value as JArray; List<string> stringList = new List<string>(); foreach (var item in jArray) stringList.Add(item.ToString()); value = stringList.ToArray(); } } field.SetValue(null, value); } } catch(Exception e) { ServiceLocator.MessageService.ShowErrorAsync("Error Loading RemoteAppSettings: " + e.Message, "RemoteAppSettings Error"); } }
private async Task LoadDataService(IDataService dataService, bool overrideCache = false) { List <Item> currentItems = new List <Item>(); bool loadedFromCache = false; if (fileStore != null) { string lastRefreshText; if (fileStore.TryReadTextFile("LastRefresh-" + dataService.GetType().ToString(), out lastRefreshText)) { var lastRefreshTime = DateTime.Parse(lastRefreshText); var timeSinceLastRefreshInMinutes = (DateTime.Now - lastRefreshTime).TotalMinutes; //has cache expired? if (overrideCache || timeSinceLastRefreshInMinutes > AppSettings.CacheIntervalInMinutes) { currentItems = await dataService.GetItems(); } else //load from cache { string cachedItemsText; pool.WaitOne(); try { if (fileStore.TryReadTextFile("CachedItems-" + dataService.GetType().ToString(), out cachedItemsText)) { currentItems = mvxJsonConverter.DeserializeObject <List <Item> >(cachedItemsText); loadedFromCache = true; } } catch { ServiceLocator.MessageService.ShowErrorAsync("Error Deserializing " + dataService.GetType().ToString(), "Error loading cache"); } finally { pool.Release(); } } } else { currentItems = await dataService.GetItems(); } } try { if (!loadedFromCache && currentItems.Count > 0) { if (fileStore.Exists("CachedItems-" + dataService.GetType().ToString())) { fileStore.DeleteFile("CachedItems-" + dataService.GetType().ToString()); } if (fileStore.Exists("LastRefresh-" + dataService.GetType().ToString())) { fileStore.DeleteFile("LastRefresh-" + dataService.GetType().ToString()); } fileStore.WriteFile("CachedItems-" + dataService.GetType().ToString(), mvxJsonConverter.SerializeObject(currentItems)); fileStore.WriteFile("LastRefresh-" + dataService.GetType().ToString(), DateTime.Now.ToString()); } items.AddRange(currentItems); } catch { ServiceLocator.MessageService.ShowErrorAsync("Error retrieving items from " + dataService.GetType().ToString() + "\n\nPossible Causes:\nNo internet connection\nRemote Service unavailable", "Application Error"); } }
public async Task LoadRemoteAppSettings(bool overrideCache = false) { var remoteSettings = await GetRemoteAppSettings(overrideCache); if (remoteSettings != null) { try { var fields = typeof(AppSettings).GetRuntimeFields(); var a = new Dictionary <string, object>(); MvxJsonConverter mvxJsonConverter = new MvxJsonConverter(); a = mvxJsonConverter.DeserializeObject <Dictionary <string, object> >(remoteSettings); foreach (FieldInfo field in fields) { var value = a[field.Name]; //JSON.Net converts all numeric values to Int64 which breaks things =) //http://stackoverflow.com/questions/16683784/expression-convert-object-of-type-system-int64-cannot-be-converted-to-type-s if (value.GetType() == typeof(Int64)) { value = Convert.ToInt32(value); } else if (value.GetType() == typeof(JArray)) { if (field.FieldType == typeof(UrlSource[])) { JArray jArray = value as JArray; List <UrlSource> urlSourceList = new List <UrlSource>(); foreach (var item in jArray) { urlSourceList.Add(new UrlSource { Url = item["Url"].ToString(), Group = item["Group"].ToString(), Type = item["Type"].ToString() }); } value = urlSourceList.ToArray(); } else if (field.FieldType == typeof(string[])) { JArray jArray = value as JArray; List <string> stringList = new List <string>(); foreach (var item in jArray) { stringList.Add(item.ToString()); } value = stringList.ToArray(); } } field.SetValue(null, value); } } catch (Exception e) { ServiceLocator.MessageService.ShowErrorAsync("Error Loading RemoteAppSettings: " + e.Message, "RemoteAppSettings Error"); } } }
/// <summary> /// Loads Items from our Azure Mobile Service and sort into grouped enumerable /// </summary> private async void LoadItems(bool overrideCache = false) { IsBusy = true; List<Item> items = new List<Item>(); MvxJsonConverter mvxJsonConverter = new MvxJsonConverter(); var fileStore = Mvx.Resolve<IMvxFileStore>(); foreach (var dataService in EnabledDataServices) { List<Item> currentItems = new List<Item>(); bool loadedFromCache = false; if (fileStore != null) { string lastRefreshText; if (fileStore.TryReadTextFile("LastRefresh-" + dataService.GetType().ToString(), out lastRefreshText)) { var lastRefreshTime = DateTime.Parse(lastRefreshText); //has cache expired? if (overrideCache || (DateTime.Now - lastRefreshTime).Minutes > AppSettings.CacheIntervalInMinutes) { currentItems = await dataService.GetItems(); } else //load from cache { string cachedItemsText; if (fileStore.TryReadTextFile("CachedItems-" + dataService.GetType().ToString(), out cachedItemsText)) { currentItems = mvxJsonConverter.DeserializeObject<List<Item>>(cachedItemsText); loadedFromCache = true; } } } else { currentItems = await dataService.GetItems(); } } try { if (!loadedFromCache && currentItems.Count > 0) { if (fileStore.Exists("CachedItems-" + dataService.GetType().ToString())) fileStore.DeleteFile("CachedItems-" + dataService.GetType().ToString()); if (fileStore.Exists("LastRefresh-" + dataService.GetType().ToString())) fileStore.DeleteFile("LastRefresh-" + dataService.GetType().ToString()); fileStore.WriteFile("CachedItems-" + dataService.GetType().ToString(), mvxJsonConverter.SerializeObject(currentItems)); fileStore.WriteFile("LastRefresh-" + dataService.GetType().ToString(), DateTime.Now.ToString()); } foreach (var currentItem in currentItems) { if (AppSettings.ForceYoutubeVideosToLoadFullScreen) currentItem.Description = currentItem.Description.Replace("/watch?v=", "/watch_popup?v="); items.Add(currentItem); } } catch { ServiceLocator.MessageService.ShowErrorAsync("Error retrieving items from Remote Service. \n\nPossible Causes:\nNo internet connection\nRemote Service unavailable", "Application Error"); } } ItemGroups = new List<Group<Item>>(from item in items group item by item.Group into grp orderby grp.Key select new Group<Item>(grp.Key, grp)).ToList(); IsBusy = false; }
/// <summary> /// Loads Items from our Azure Mobile Service and sort into grouped enumerable /// </summary> private async void LoadItems(bool overrideCache = false) { IsBusy = true; List <Item> items = new List <Item>(); MvxJsonConverter mvxJsonConverter = new MvxJsonConverter(); var fileStore = Mvx.Resolve <IMvxFileStore>(); foreach (var dataService in EnabledDataServices) { List <Item> currentItems = new List <Item>(); bool loadedFromCache = false; if (fileStore != null) { string lastRefreshText; if (fileStore.TryReadTextFile("LastRefresh-" + dataService.GetType().ToString(), out lastRefreshText)) { var lastRefreshTime = DateTime.Parse(lastRefreshText); //has cache expired? if (overrideCache || (DateTime.Now - lastRefreshTime).Minutes > AppSettings.CacheIntervalInMinutes) { currentItems = await dataService.GetItems(); } else //load from cache { string cachedItemsText; if (fileStore.TryReadTextFile("CachedItems-" + dataService.GetType().ToString(), out cachedItemsText)) { currentItems = mvxJsonConverter.DeserializeObject <List <Item> >(cachedItemsText); loadedFromCache = true; } } } else { currentItems = await dataService.GetItems(); } } try { if (!loadedFromCache && currentItems.Count > 0) { if (fileStore.Exists("CachedItems-" + dataService.GetType().ToString())) { fileStore.DeleteFile("CachedItems-" + dataService.GetType().ToString()); } if (fileStore.Exists("LastRefresh-" + dataService.GetType().ToString())) { fileStore.DeleteFile("LastRefresh-" + dataService.GetType().ToString()); } fileStore.WriteFile("CachedItems-" + dataService.GetType().ToString(), mvxJsonConverter.SerializeObject(currentItems)); fileStore.WriteFile("LastRefresh-" + dataService.GetType().ToString(), DateTime.Now.ToString()); } foreach (var currentItem in currentItems) { if (AppSettings.ForceYoutubeVideosToLoadFullScreen) { currentItem.Description = currentItem.Description.Replace("/watch?v=", "/watch_popup?v="); } items.Add(currentItem); } } catch { ServiceLocator.MessageService.ShowErrorAsync("Error retrieving items from Remote Service. \n\nPossible Causes:\nNo internet connection\nRemote Service unavailable", "Application Error"); } } ItemGroups = new List <Group <Item> >(from item in items group item by item.Group into grp orderby grp.Key select new Group <Item>(grp.Key, grp)).ToList(); IsBusy = false; }