/// <summary>
        /// Main loop for Activity tracking. 
        ///     Start and stops an activity.
        ///     Persists to 
        ///         - SkyDrive 
        ///         - Azure
        ///         - .gpx file viewer
        ///             as determined by SettingsView.xaml
        /// </summary>
        public async void ToggleActivity()
        {
            if (Vm == null)
                Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>();

            if (isActive)
            {
                Vm.StatusMessages += "ToggleActivity Stop";
                activityTimer.Stop();
                isActive = false;
                _activity.Stop = DateTime.Now;
                activityEnd = _CurrentGeoCoordinate;
                TimeSpan ts = _activity.Stop - _activity.Start;
                var distance = (activityEnd).GetDistanceTo(activityBegin);
                _activity.Distance = distance;
                var distanceInFeet = distance * 3.281;
                var distanceInMiles = distanceInFeet / 5280;

                if (Geos.Count > 0)
                {
                    string skyDriveFileName = "Walker";
                    skyDriveFileName += DateTime.Now.ToString("yyyy-MM-dd-hh-mm");
                    skyDriveFileName += ".gpx";
                    _logger.Log(this, skyDriveFileName);

                    byte[] bytes = Encoding.UTF8.GetBytes(ToGpx());
                    MemoryStream gpxMemoryStream = new MemoryStream(bytes);

                    try
                    {
                        if (_client == null)
                        {
                            // _client = new LiveConnectClient(e.Session);
                            _client = App.LiveConnectClient;
                        }
                        _logger.Log(this, "_client.UploadAsync(MeDetails.TopLevelSkyDriveFolder, skyDriveFileName, gpxMemoryStream,");

                        var result = await _client.UploadAsync(MeDetails.TopLevelSkyDriveFolder, skyDriveFileName, gpxMemoryStream,
                                                OverwriteOption.Overwrite);
                        _logger.Log(this, "Upload to skyDrive apparently worked!", result.ToString());
                        // var success = await Windows.System.Launcher.LaunchFileAsync(ms);
                        // var success = await Windows.System.Launcher.  LaunchFileAsync(ms);
                    }
                    catch (Exception ex)
                    {
                        _logger.Log(this, "Upload to skyDrive exception: ", ex.ToString());
                    }
                    gpxMemoryStream.Dispose();
                    if (_walkerAppSettings.GpxEnabled)
                        LaunchGpxFileAssociation(skyDriveFileName);

                    PersistIt(skyDriveFileName);
                }

                Vm.StatusMessages = string.Empty;
                Vm.StatusMessages += String.Format("Walked: {0:0000.00} meters ({2:00.000} miles) in {1} seconds.\n", distance, ts.ToString(), distanceInMiles);
                Vm.StatusMessages += String.Format("(new calc) Walked: {0:0000.00} meters \n", _CurrentDistance);
                _CurrentDistance = 0;
            }
            else
            {
                Vm.StatusMessages += "ToggleActivity Start";
                StartTimer();
                isActive = true;
                _activity = new Walk();
                _activity.Start = DateTime.Now;
                activityBegin = _CurrentGeoCoordinate;
                
                Geos = new List<GeoCoordinate>();   // clear Geos list as we're starting a new activity track.
                Geos.Add(_CurrentGeoCoordinate);    // Begin activity with current location. 
            }
        }
        /// <summary>
        /// Update view model and counters to update current elapsed time and distance travled. 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        void OnTimerTick(Object sender, EventArgs args)
        {
            if (Vm == null)
                Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>();

            _ElapsedTime = DateTime.Now - _activity.Start;
            Vm.ElapsedTime = _ElapsedTime.ToString(@"hh\:mm\:ss");
            Vm.DistanceMeters = _CurrentDistance.ToString("0\\,000");
            Vm.DistanceMiles = ((_CurrentDistance * 3.281) / 5280).ToString("0\\,000");
            //Messenger.Default.Send<AppHubViewModel>(Vm);
        }
        /// <summary>
        /// update view model and bound .xaml with geo cordinates, elapsed time and distance traveled. 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
        {
            // Unfortunately, the Location API works with Windows.Devices.Geolocation.Geocoordinate objeccts
            // and the Maps controls use System.Device.Location.GeoCoordinate objects so we have to do a
            // conversion before we do anything with it on the map
            GeoCoordinate geoCoordinate = new GeoCoordinate()
            {
                Altitude = args.Position.Coordinate.Altitude.HasValue ? args.Position.Coordinate.Altitude.Value : 0.0,
                Course = args.Position.Coordinate.Heading.HasValue ? args.Position.Coordinate.Heading.Value : 0.0,
                HorizontalAccuracy = args.Position.Coordinate.Accuracy,
                Latitude = args.Position.Coordinate.Latitude,
                Longitude = args.Position.Coordinate.Longitude,
                Speed = args.Position.Coordinate.Speed.HasValue ? args.Position.Coordinate.Speed.Value : 0.0,
                VerticalAccuracy = args.Position.Coordinate.AltitudeAccuracy.HasValue ? args.Position.Coordinate.AltitudeAccuracy.Value : 0.0
            };

            Geos.Add(geoCoordinate); // save these pups to create a .gpx file...
            _CurrentGeoCoordinate = geoCoordinate;

            if (isActive)
            {
                _CurrentDistance += _PreviousGeoCoordinate.GetDistanceTo(_CurrentGeoCoordinate);

            }
            else
            {
                _PreviousGeoCoordinate = _CurrentGeoCoordinate;
            }

            _PreviousGeoCoordinate = _CurrentGeoCoordinate;

            DispatcherHelper.CheckBeginInvokeOnUI(() =>
            {
                //TestVm.Hi = testInt++.ToString();
                //TestVm.GeoCoordinate = geoCoordinate;
                if (Vm == null)
                    Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>();
                Vm.GeoCoordinate = geoCoordinate;
                Vm.DistanceMeters = _CurrentDistance.ToString("F2");
                Vm.DistanceMiles = (999.99).ToString();
                Vm.StatusMessages += string.Format("\nlat: {0} lon: {1}", geoCoordinate.Latitude.ToString(), geoCoordinate.Longitude.ToString());
            });

            // Dispatcher.BeginInvoke(() =>
            DispatcherHelper.CheckBeginInvokeOnUI(() =>
            {
                // Draw a pushpin
                DrawPushpin(geoCoordinate);
                AddBluePoint(geoCoordinate);
                // Show progress indicator while map resolves to new position
                pi.IsVisible = true;
                pi.IsIndeterminate = true;
                pi.Text = "Resolving location...";
                // fix SystemTray.SetProgressIndicator(this, pi);
            });
        }
        /// <summary>
        /// Persist to Azure if enabled in settings. 
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        private async Task PersistIt(string fileName)
        {
            if (Vm == null)
                Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>();
            Vm.Activities.Add(_activity);

            if (_walkerAppSettings.AzureEnabled)
            {
                try
                {
                    _activity.GpxFileName = fileName;
                    await walkTable.InsertAsync(_activity);
                    _logger.Log(this, "walkTable.InsertAsync(_activity); ", "apparently worked");

                }
                catch (Exception e)
                {
                    _logger.Log(this, "walkTable.InsertAsync(_activity); ", e.ToString());
                }
            }
        }
 private void HandleMessengerMessage(Wp8AppHubViewModel obj)
 {
     StatusMessages = obj.StatusMessages; 
 }