WeatherInformation WP8: MainPage with progress bar.
[CSharpForFun/.git] / WindowsPhone / WP8 / WeatherInformation / WeatherInformation / MainPage.xaml.cs
index 90589a0..d87c6d1 100644 (file)
@@ -11,7 +11,6 @@ using WeatherInformation.Resources;
 using WeatherInformation.ViewModels;
 using System.Threading.Tasks;
 using WeatherInformation.Model.JsonDataParser;
-using Microsoft.Phone.Shell;
 
 namespace WeatherInformation
 {
@@ -37,8 +36,6 @@ namespace WeatherInformation
         {
             base.OnNavigatedTo(e);
 
-            CreateFlipTile();
-
             // If _isNewPageInstance is true, the page constuctor has been called, so
             // state may need to be restored.
             if (_isNewPageInstance)
@@ -65,9 +62,20 @@ namespace WeatherInformation
                 locationItem = db.Locations.Where(location => location.IsSelected).FirstOrDefault();
             }
 
+            // Empty UI
+            this.CurrentData.Visibility = Visibility.Collapsed;
+            this.ForecastData.Visibility = Visibility.Collapsed;
+            this.ProgressBarRemoteData.Visibility = Visibility.Collapsed;
+            this.NoDataAvailable.Visibility = Visibility.Collapsed;
+
             if (locationItem == null)
             {
                 // Nothing to do.
+                // Show error message.
+                this.CurrentData.Visibility = Visibility.Collapsed;
+                this.ForecastData.Visibility = Visibility.Collapsed;
+                this.ProgressBarRemoteData.Visibility = Visibility.Collapsed;
+                this.NoDataAvailable.Visibility = Visibility.Visible;
                 return;
             }
 
@@ -76,38 +84,68 @@ namespace WeatherInformation
             WeatherData weatherData = (Application.Current as WeatherInformation.App).ApplicationDataObject;
             if (!IsDataFresh(locationItem.LastRemoteDataUpdate) || weatherData == null)
             {
-                // Load remote data (aynchronous way by means of async/await)
-
                 // Gets the data from the web.
-                (Application.Current as WeatherInformation.App).ApplicationDataObject =
-                    await GetRemoteDataAsync(locationItem);
+                this.CurrentData.Visibility = Visibility.Collapsed;
+                this.ForecastData.Visibility = Visibility.Collapsed;
+                this.ProgressBarRemoteData.Visibility = Visibility.Visible;
+                this.NoDataAvailable.Visibility = Visibility.Collapsed;
 
-                using (var db = new LocationDataContext(LocationDataContext.DBConnectionString))
-                {
-                    locationItem = db.Locations.Where(location => location.IsSelected).FirstOrDefault();
-                    locationItem.LastRemoteDataUpdate = DateTime.UtcNow;
-                    db.SubmitChanges();
-                }
+                await GetRemoteDataAndUpdateUI(locationItem);
             }
+            else
+            {
+                this.CurrentData.Visibility = Visibility.Visible;
+                this.ForecastData.Visibility = Visibility.Visible;
+                this.ProgressBarRemoteData.Visibility = Visibility.Collapsed;
+                this.NoDataAvailable.Visibility = Visibility.Collapsed;
 
-            // Call UpdateUI on the UI thread.
-            // Without ConfigureAwait(false) await returns data on the calling thread. In this case the calling one
-            // is the UI thread. So, I can save the call to Dispatcher.BeginInvoke.
-            //Dispatcher.BeginInvoke(() => UpdateUI());
-            UpdateUI();
+                UpdateUI(weatherData);
+            }
         }
 
-        void UpdateUI()
+        private void UpdateUI(WeatherData weatherData)
         {
-            // Set the ApplicationData and ApplicationDataStatus members of the ViewModel
-            WeatherData weatherData = (Application.Current as WeatherInformation.App).ApplicationDataObject;
-
             if (weatherData != null)
             {
                 _mainViewModel.LoadData(weatherData);
             }
         }
 
+        async private Task GetRemoteDataAndUpdateUI(Location locationItem)
+        {
+            // Load remote data (aynchronous way by means of async/await)
+            try
+            {
+                // Without ConfigureAwait(false) await returns data on the calling thread.
+                WeatherData weatherData = await GetRemoteDataAsync(locationItem);
+
+                this.CurrentData.Visibility = Visibility.Visible;
+                this.ForecastData.Visibility = Visibility.Visible;
+                this.ProgressBarRemoteData.Visibility = Visibility.Collapsed;
+                this.NoDataAvailable.Visibility = Visibility.Collapsed;
+
+                UpdateUI(weatherData);
+
+                (Application.Current as WeatherInformation.App).ApplicationDataObject = weatherData;
+
+                using (var db = new LocationDataContext(LocationDataContext.DBConnectionString))
+                {
+                    locationItem = db.Locations.Where(location => location.IsSelected).FirstOrDefault();
+                    locationItem.LastRemoteDataUpdate = DateTime.UtcNow;
+                    db.SubmitChanges();
+                }
+            }
+            catch(Exception e)
+            {
+                // Empty UI and show error message
+                this.CurrentData.Visibility = Visibility.Collapsed;
+                this.ForecastData.Visibility = Visibility.Collapsed;
+                this.ProgressBarRemoteData.Visibility = Visibility.Collapsed;
+                this.NoDataAvailable.Visibility = Visibility.Visible;
+            }
+
+        }
+
         private void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
             LongListSelector longListSelector = sender as LongListSelector;
@@ -174,22 +212,6 @@ namespace WeatherInformation
             NavigationService.Navigate(new Uri("/SettingsPage.xaml", UriKind.Relative));
         }
 
-        private void CreateFlipTile()
-        {
-            ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault(
-                x => x.NavigationUri.ToString().Contains("flip"));
-            tile = ShellTile.ActiveTiles.First();
-            var activeTiles = ShellTile.ActiveTiles;
-
-            var tileData = new FlipTileData();
-            tileData.Title = "GUSTAVO RULES";
-            tileData.BackTitle = "Gustavo Rules Back";
-            tileData.BackContent = "Gustavo Back Content";
-            tileData.WideBackContent = "Gustavo Wid Back Content";
-            tile.Update(tileData);
-
-        }
-
         // Código de ejemplo para compilar una ApplicationBar traducida
         //private void BuildLocalizedApplicationBar()
         //{