/// <summary>
        /// Gets a list of activities, that match specified parameters, associated with this user's Microsoft Health profile.
        /// </summary>
        /// <param name="startTime">Filters the set of returned activities to those starting after the specified <see cref="DateTime"/>, inclusive.</param>
        /// <param name="endTime">Filters the set of returned activities to those starting before the specified <see cref="DateTime"/>, exclusive. </param>
        /// <param name="ids">The comma-separated list of activity ids to return.</param>
        /// <param name="type">The <see cref="MSHealthActivityType"/> to return (supports multi-values).</param>
        /// <param name="include">The <see cref="MSHealthActivityInclude"/> properties to return: Details, MinuteSummaries, MapPoints  (supports multi-values).</param>
        /// <param name="deviceIds">Filters the set of returned activities based on the comma-separated list of device ids provided.</param>
        /// <param name="splitDistanceType">The length of splits (<see cref="MSHealthSplitDistanceType"/>) used in each activity.</param>
        /// <param name="maxPageSize">The maximum number of entries to return per page.</param>
        /// <returns>Instance of <see cref="MSHealthActivities"/> with collection of activities that matched specified parameters.</returns>
        public MSHealthActivities ListActivities(DateTime? startTime = default(DateTime?),
            DateTime? endTime = default(DateTime?),
            string ids = null,
            MSHealthActivityType type = MSHealthActivityType.Unknown,
            MSHealthActivityInclude include = MSHealthActivityInclude.None,
            string deviceIds = null,
            MSHealthSplitDistanceType splitDistanceType = MSHealthSplitDistanceType.None,
            int? maxPageSize = default(int?))
        {
            MSHealthActivities loActivities = null;
            var loQuery = new StringBuilder();
            string lsResponse;
            string lsParamValue;
            // Check StartTime, and append to query if applies
            if (startTime != null && startTime.HasValue)
                loQuery.AppendFormat("&startTime={0}", Uri.EscapeDataString(startTime.Value.ToUniversalTime().ToString("O")));
            // Check EndTime, and append to query if applies
            if (endTime != null && endTime.HasValue)
                loQuery.AppendFormat("&endTime={0}", Uri.EscapeDataString(endTime.Value.ToUniversalTime().ToString("O")));
            // Check ActivityIds, and append to query if applies
            if (!string.IsNullOrEmpty(ids))
                loQuery.AppendFormat("&activityIds={0}", Uri.EscapeDataString(ids));
            // Check ActivityTypes, and append to query if applies
            if (type != MSHealthActivityType.Unknown)
            {
                lsParamValue = string.Empty;
                if (type.HasFlag(MSHealthActivityType.Custom))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.Custom);
                if (type.HasFlag(MSHealthActivityType.CustomExercise))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.CustomExercise);
                if (type.HasFlag(MSHealthActivityType.CustomComposite))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.CustomComposite);
                if (type.HasFlag(MSHealthActivityType.Run))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.Run);
                if (type.HasFlag(MSHealthActivityType.Sleep))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.Sleep);
                if (type.HasFlag(MSHealthActivityType.FreePlay))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.FreePlay);
                if (type.HasFlag(MSHealthActivityType.GuidedWorkout))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.GuidedWorkout);
                if (type.HasFlag(MSHealthActivityType.Bike))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.Bike);
                if (type.HasFlag(MSHealthActivityType.Golf))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.Golf);
                if (type.HasFlag(MSHealthActivityType.RegularExercise))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.RegularExercise);
                if (type.HasFlag(MSHealthActivityType.Hike))
                    lsParamValue += string.Format(",{0}", MSHealthActivityType.Hike);
                lsParamValue = lsParamValue.TrimStart(new char[] { ',' });
                loQuery.AppendFormat("&activityTypes={0}", lsParamValue);
            }
            // Check ActivityIncludes, and append to query if applies
            if (include != MSHealthActivityInclude.None)
            {
                lsParamValue = string.Empty;
                if (include.HasFlag(MSHealthActivityInclude.Details))
                    lsParamValue += string.Format(",{0}", MSHealthActivityInclude.Details);
                if (include.HasFlag(MSHealthActivityInclude.MinuteSummaries))
                    lsParamValue += string.Format(",{0}", MSHealthActivityInclude.MinuteSummaries);
                if (include.HasFlag(MSHealthActivityInclude.MapPoints))
                    lsParamValue += string.Format(",{0}", MSHealthActivityInclude.MapPoints);
                lsParamValue = lsParamValue.TrimStart(new char[] { ',' });
                loQuery.AppendFormat("&activityIncludes={0}", lsParamValue);
            }
            // Check DeviceIds, and append to query if applies
            if (!string.IsNullOrEmpty(deviceIds))
                loQuery.AppendFormat("&deviceIds={0}", Uri.EscapeDataString(deviceIds));
            // Check SplitDistanceType, and append to query if applies
            switch (splitDistanceType)
            {
                case MSHealthSplitDistanceType.Mile:
                    loQuery.AppendFormat("&splitDistanceType={0}", MSHealthSplitDistanceType.Mile);
                    break;
                case MSHealthSplitDistanceType.Kilometer:
                    loQuery.AppendFormat("&splitDistanceType={0}", MSHealthSplitDistanceType.Kilometer);
                    break;
            }
            // Check MaxPageSize, and append to query if applies
            if (maxPageSize != null && maxPageSize.HasValue && maxPageSize.Value > 0)
                loQuery.AppendFormat("&maxPageSize={0}", maxPageSize.Value);

            // Perform request using BASE_URI, ACTIVITIES_PATH and query string
            lsResponse = PerformRequest(ACTIVITIES_PATH, loQuery.ToString().TrimStart(new char[] { '&' }));
            // Deserialize Json response (use Converters for Enum, DateTime and TimeSpan values)
            var loSerializerSettings = new JsonSerializerSettings();
            loSerializerSettings.Converters.Add(new StringEnumConverter());
            loSerializerSettings.Converters.Add(new IsoDateTimeConverter());
            loSerializerSettings.Converters.Add(new TimeSpanConverter());
            loActivities = JsonConvert.DeserializeObject<MSHealthActivities>(lsResponse, loSerializerSettings);

            return loActivities;
        }
Пример #2
0
        /// <summary>
        /// Lists the activities that matches selected criteria (type/period).
        /// </summary>
        private async void ListActivities()
        {
            DateTime?                 ldtStart       = null;
            DateTime?                 ldtEnd         = null;
            MSHealthActivityType      loActivityType = MSHealthActivityType.Unknown;
            MSHealthSplitDistanceType loDistance     = MSHealthSplitDistanceType.None;

            try
            {
                IsRunningRequest = true;
                Activities       = null;
                // Check if at least one Activity Type was selected
                bool lbFilterActivityType = FilterActivityExercise | FilterActivityRun | FilterActivityBike |
                                            FilterActivityGolf | FilterActivitySleep | FilterActivityGuided |
                                            FilterActivityHike;
                if (!lbFilterActivityType)
                {
#if WINDOWS_UWP
                    await moDialogService.ShowMessage(Resources.Strings.MessageContentSelectActivityType,
                                                      Resources.Strings.MessageTitleFilterActivities);
#endif
                    return;
                }
                // Determine Activity Types to filter
                if (FilterActivityExercise)
                {
                    loActivityType |= MSHealthActivityType.FreePlay;
                }
                if (FilterActivityRun)
                {
                    loActivityType |= MSHealthActivityType.Run;
                }
                if (FilterActivityBike)
                {
                    loActivityType |= MSHealthActivityType.Bike;
                }
                if (FilterActivityGolf)
                {
                    loActivityType |= MSHealthActivityType.Golf;
                }
                if (FilterActivitySleep)
                {
                    loActivityType |= MSHealthActivityType.Sleep;
                }
                if (FilterActivityGuided)
                {
                    loActivityType |= MSHealthActivityType.GuidedWorkout;
                }
                if (FilterActivityHike)
                {
                    loActivityType |= MSHealthActivityType.Hike;
                }
                // Determine Period to filter
                switch (Settings.MSHealthFilterPeriod)
                {
                case Settings.PERIOD_DAY:
                    ldtEnd   = DateTime.Today.AddDays(1).AddMilliseconds(-1);
                    ldtStart = DateTime.Today.AddDays(-1);
                    break;

                case Settings.PERIOD_WEEK:
                    ldtEnd   = DateTime.Today.AddDays(1).AddMilliseconds(-1);
                    ldtStart = DateTime.Today.AddDays(-7);
                    break;

                case Settings.PERIOD_MONTH:
                    ldtEnd   = DateTime.Today.AddDays(1).AddMilliseconds(-1);
                    ldtStart = DateTime.Today.AddMonths(-1);
                    break;

                case Settings.PERIOD_YEAR:
                    ldtEnd   = DateTime.Today.AddDays(1).AddMilliseconds(-1);
                    ldtStart = DateTime.Today.AddYears(-1);
                    break;
                }
                // Determine Distance Unit to retrieve
                switch (Settings.MSHealthFilterDistance)
                {
                case DistanceUnit.DISTANCE_MILE:
                    loDistance = MSHealthSplitDistanceType.Mile;
                    break;

                case DistanceUnit.DISTANCE_KILOMETER:
                    loDistance = MSHealthSplitDistanceType.Kilometer;
                    break;
                }
                // Find activities with selected criteria, and update MSHealth Token
                MSHealthActivities loActivities = await moMSHealthClient.ListActivities(startTime : ldtStart,
                                                                                        endTime : ldtEnd,
                                                                                        type : loActivityType,
                                                                                        splitDistanceType : loDistance);

                Settings.MSHealthToken = moMSHealthClient.Token;
                // Parse each separated activity list into one single activity list
                List <MSHealthActivity> loActivitiesList = new List <MSHealthActivity>();
                if (loActivities.BikeActivities != null &&
                    loActivities.BikeActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.BikeActivities);
                }
                if (loActivities.RunActivities != null &&
                    loActivities.RunActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.RunActivities);
                }
                if (loActivities.SleepActivities != null &&
                    loActivities.SleepActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.SleepActivities);
                }
                if (loActivities.FreePlayActivities != null &&
                    loActivities.FreePlayActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.FreePlayActivities);
                }
                if (loActivities.GolfActivities != null &&
                    loActivities.GolfActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.GolfActivities);
                }
                if (loActivities.GuidedWorkoutActivities != null &&
                    loActivities.GuidedWorkoutActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.GuidedWorkoutActivities);
                }
                if (loActivities.HikeActivities != null &&
                    loActivities.HikeActivities.Any())
                {
                    loActivitiesList.AddRange(loActivities.HikeActivities);
                }
                // Sort descending by Start Time and append to Bindable property
                loActivitiesList = loActivitiesList.OrderByDescending(loAct => loAct.StartTime).ToList();
                Activities       = new ObservableCollection <MSHealthActivity>(loActivitiesList);
            }
            catch (Exception loException)
            {
                // Handle exceptions (just for debugging purposes). TODO: Delete this code
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    System.Diagnostics.Debug.WriteLine(loException.StackTrace);
                    System.Diagnostics.Debugger.Break();
                } // Handle exceptions (just for debugging purposes)
                  // Show error message
#if WINDOWS_UWP
                await moDialogService.ShowError(Resources.Strings.MessageContentErrorOperation,
                                                Resources.Strings.MessageTitleError,
                                                Resources.Strings.MessageButtonOK,
                                                null);
#endif
            }
            finally
            {
                IsRunningRequest = false;
            }
        }