using System; using System.Collections.Generic; using System.Linq; using System.Text; using Crestron.SimplSharp; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using PepperDash.Core; using PepperDash.Essentials.Core; using PepperDash.Essentials.Devices.Common.VideoCodec; namespace PepperDash.Essentials.Devices.Common.Codec { /// /// Defines the API for codecs with a directory /// public interface IHasDirectory { event EventHandler DirectoryResultReturned; CodecDirectory DirectoryRoot { get; } CodecDirectory CurrentDirectoryResult { get; } CodecPhonebookSyncState PhonebookSyncState { get; } void SearchDirectory(string searchString); void GetDirectoryFolderContents(string folderId); void SetCurrentDirectoryToRoot(); void GetDirectoryParentFolderContents(); BoolFeedback CurrentDirectoryResultIsNotDirectoryRoot { get; } /// /// Tracks the directory browse history when browsing beyond the root directory /// [Obsolete("Please use the Stack-based history instead")] List DirectoryBrowseHistory { get; } } public interface IHasDirectoryHistoryStack : IHasDirectory { Stack DirectoryBrowseHistoryStack { get; } } /// /// /// public class DirectoryEventArgs : EventArgs { public CodecDirectory Directory { get; set; } public bool DirectoryIsOnRoot { get; set; } } /// /// Represents a codec directory /// public class CodecDirectory { /// /// Represents the contents of the directory /// [JsonProperty("directoryResults")] public List CurrentDirectoryResults { get; private set; } /// /// Used to store the ID of the current folder for CurrentDirectoryResults /// [JsonProperty("resultsFolderId")] public string ResultsFolderId { get; set; } public CodecDirectory() { CurrentDirectoryResults = new List(); } /// /// Adds folders to the directory /// /// public void AddFoldersToDirectory(List folders) { if(folders != null) CurrentDirectoryResults.AddRange(folders); SortDirectory(); } /// /// Adds contacts to the directory /// /// public void AddContactsToDirectory(List contacts) { if(contacts != null) CurrentDirectoryResults.AddRange(contacts); SortDirectory(); } /// /// Sorts the DirectoryResults list to display all folders alphabetically, then all contacts alphabetically /// private void SortDirectory() { var sortedFolders = new List(); sortedFolders.AddRange(CurrentDirectoryResults.Where(f => f is DirectoryFolder)); sortedFolders.OrderBy(f => f.Name); var sortedContacts = new List(); sortedContacts.AddRange(CurrentDirectoryResults.Where(c => c is DirectoryContact)); sortedFolders.OrderBy(c => c.Name); CurrentDirectoryResults.Clear(); CurrentDirectoryResults.AddRange(sortedFolders); CurrentDirectoryResults.AddRange(sortedContacts); } } /// /// Used to decorate a contact to indicate it can be invided to a meeting /// public interface IInvitableContact { } /// /// Represents an item in the directory /// public class DirectoryItem : ICloneable { public object Clone() { return this.MemberwiseClone(); } [JsonProperty("folderId")] public string FolderId { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("parentFolderId")] public string ParentFolderId { get; set; } } /// /// Represents a folder type DirectoryItem /// public class DirectoryFolder : DirectoryItem { [JsonProperty("contacts")] public List Contacts { get; set; } public DirectoryFolder() { Contacts = new List(); } } /// /// Represents a contact type DirectoryItem /// public class DirectoryContact : DirectoryItem { [JsonProperty("contactId")] public string ContactId { get; set; } [JsonProperty("title")] public string Title { get; set; } [JsonProperty("contactMethods")] public List ContactMethods { get; set; } public DirectoryContact() { ContactMethods = new List(); } } /// /// Represents a method of contact for a contact /// public class ContactMethod { [JsonProperty("contactMethodId")] public string ContactMethodId { get; set; } [JsonProperty("number")] public string Number { get; set; } [JsonProperty("device")] [JsonConverter(typeof(StringEnumConverter))] public eContactMethodDevice Device { get; set; } [JsonProperty("callType")] [JsonConverter(typeof(StringEnumConverter))] public eContactMethodCallType CallType { get; set; } } /// /// /// public enum eContactMethodDevice { Unknown = 0, Mobile, Other, Telephone, Video } /// /// /// public enum eContactMethodCallType { Unknown = 0, Audio, Video } }