/// <summary>
        /// Process the notification trigger
        /// </summary>
        /// <param name="nextTriggerDetails"></param>
        /// <returns></returns>
        public async Task ProcessNotifications(IAccessoryNotificationTriggerDetails nextTriggerDetails)
        {
            System.Diagnostics.Debug.WriteLine(nextTriggerDetails.AppDisplayName);
            byte[] Cookie = new byte[4];

            bool KeepConnectionAlive = false;
            bool Talking             = false;

            await Connect();

            while (nextTriggerDetails != null || KeepConnectionAlive)
            {
                if (nextTriggerDetails != null)
                {
                    try
                    {
                        AccessoryNotificationType accessoryNotificationType = nextTriggerDetails.AccessoryNotificationType;

                        System.Diagnostics.Debug.WriteLine("Notification: " + accessoryNotificationType.ToString());

                        switch (accessoryNotificationType)
                        {
                        case AccessoryNotificationType.Email:

                            await SendEmailMessage(nextTriggerDetails);

                            break;

                        case AccessoryNotificationType.Toast:

                            await ProcessToastMessage(nextTriggerDetails);

                            break;

                        case AccessoryNotificationType.BatterySaver:

                            await SendBatterySaverMessage(nextTriggerDetails);

                            break;

                        case AccessoryNotificationType.Alarm:

                            await SendAlarmMessage((AlarmNotificationTriggerDetails)nextTriggerDetails);

                            break;

                        case AccessoryNotificationType.CortanaTile:

                            await SendCortanaMessage((CortanaTileNotificationTriggerDetails)nextTriggerDetails);

                            break;

                        case AccessoryNotificationType.Phone:

                            PhoneNotificationTriggerDetails entd = (PhoneNotificationTriggerDetails)nextTriggerDetails;

                            if (entd.PhoneNotificationType != PhoneNotificationType.LineChanged)
                            {
                                System.Diagnostics.Debug.WriteLine("Phone - " + entd.CallDetails.State.ToString());

                                switch (entd.CallDetails.State)
                                {
                                case PhoneCallState.Ringing:

                                    Cookie = BitConverter.GetBytes(_pc.GetNextMessageIdentifier());

                                    await _pc.Pebble.PhoneCallAsync(entd.CallDetails.ContactName, entd.CallDetails.PhoneNumber, Cookie);

                                    KeepConnectionAlive = true;
                                    // _pc.Pebble._protocol.StartRun();

                                    break;

                                case PhoneCallState.Ended:

                                    await _pc.Pebble.EndCallAsync(Cookie);

                                    KeepConnectionAlive = false;

                                    break;

                                case PhoneCallState.Talking:

                                    if (!Talking)
                                    {
                                        await _pc.Pebble.StartCallAsync(Cookie);

                                        Talking = true;
                                    }

                                    break;

                                default:

                                    KeepConnectionAlive = false;

                                    break;
                                }
                            }

                            break;

                        default:

                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        System.Diagnostics.Debug.WriteLine("ProcessNotifications Exception: " + e.Message);
                    }

                    /*if (KeepConnectionAlive)
                     * {
                     *  Task.Delay(500).Wait();
                     *
                     *  P3bble.P3bbleMessage msg = await _pc.Pebble._protocol.ReceiveMessage(0);
                     *
                     *  if (msg != null)
                     *  {
                     *      String abc = msg.Endpoint.ToString();
                     *  }
                     *  else
                     *  {
                     *      System.Diagnostics.Debug.WriteLine("ReceiveMessage: none");
                     *  }
                     * }*/

                    AccessoryManager.ProcessTriggerDetails(nextTriggerDetails);
                }

                nextTriggerDetails = AccessoryManager.GetNextTriggerDetails();
            }

            if (!KeepConnectionAlive)
            {
                Disconnect();
            }

            LastNotifications = DateTime.Now;
        }