// Generated by Apple Swift version 4.2.1 effective-3.4.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"

#if !defined(__has_include)
# define __has_include(x) 0
#endif
#if !defined(__has_attribute)
# define __has_attribute(x) 0
#endif
#if !defined(__has_feature)
# define __has_feature(x) 0
#endif
#if !defined(__has_warning)
# define __has_warning(x) 0
#endif

#if __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif

#pragma clang diagnostic ignored "-Wauto-import"
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if !defined(SWIFT_TYPEDEFS)
# define SWIFT_TYPEDEFS 1
# if __has_include(<uchar.h>)
#  include <uchar.h>
# elif !defined(__cplusplus)
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2  __attribute__((__ext_vector_type__(2)));
typedef float swift_float3  __attribute__((__ext_vector_type__(3)));
typedef float swift_float4  __attribute__((__ext_vector_type__(4)));
typedef double swift_double2  __attribute__((__ext_vector_type__(2)));
typedef double swift_double3  __attribute__((__ext_vector_type__(3)));
typedef double swift_double4  __attribute__((__ext_vector_type__(4)));
typedef int swift_int2  __attribute__((__ext_vector_type__(2)));
typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
typedef unsigned int swift_uint2  __attribute__((__ext_vector_type__(2)));
typedef unsigned int swift_uint3  __attribute__((__ext_vector_type__(3)));
typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
#endif

#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if !defined(SWIFT_CLASS_PROPERTY)
# if __has_feature(objc_class_property)
#  define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
# else
#  define SWIFT_CLASS_PROPERTY(...)
# endif
#endif

#if __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
#else
# define SWIFT_COMPILE_NAME(X)
#endif
#if __has_attribute(objc_method_family)
# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
#else
# define SWIFT_METHOD_FAMILY(X)
#endif
#if __has_attribute(noescape)
# define SWIFT_NOESCAPE __attribute__((noescape))
#else
# define SWIFT_NOESCAPE
#endif
#if __has_attribute(warn_unused_result)
# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
# define SWIFT_WARN_UNUSED_RESULT
#endif
#if __has_attribute(noreturn)
# define SWIFT_NORETURN __attribute__((noreturn))
#else
# define SWIFT_NORETURN
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if __has_attribute(objc_subclassing_restricted)
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if !defined(SWIFT_ENUM_ATTR)
# if defined(__has_attribute) && __has_attribute(enum_extensibility)
#  define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
# else
#  define SWIFT_ENUM_ATTR(_extensibility)
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
# if __has_feature(generalized_swift_name)
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
# else
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
# endif
#endif
#if !defined(SWIFT_UNAVAILABLE)
# define SWIFT_UNAVAILABLE __attribute__((unavailable))
#endif
#if !defined(SWIFT_UNAVAILABLE_MSG)
# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
#endif
#if !defined(SWIFT_AVAILABILITY)
# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
#endif
#if !defined(SWIFT_DEPRECATED)
# define SWIFT_DEPRECATED __attribute__((deprecated))
#endif
#if !defined(SWIFT_DEPRECATED_MSG)
# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
#endif
#if __has_feature(attribute_diagnose_if_objc)
# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
#else
# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
#endif
#if __has_feature(modules)
@import Dispatch;
@import Foundation;
@import ObjectiveC;
@import Security.CipherSuite;
#endif

#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"
#if __has_warning("-Wpragma-clang-attribute")
# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
#endif
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#pragma clang diagnostic ignored "-Wnullability"

#if __has_attribute(external_source_symbol)
# pragma push_macro("any")
# undef any
# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="SmartView",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
# pragma pop_macro("any")
#endif

@class Service;
@class ChannelClient;
@protocol ChannelDelegate;
@class NSError;

/// A Channel is a discreet connection where multiple clients can communicate
SWIFT_CLASS("_TtC9SmartView7Channel")
@interface Channel : NSObject
/// The connection status of the channel
@property (nonatomic, readonly) BOOL isConnected;
/// The uri of the channel (‘chat’)
@property (nonatomic, readonly, copy) NSString * _Null_unspecified uri;
/// the service that is suplaying the channel connection
@property (nonatomic, readonly, strong) Service * _Null_unspecified service;
/// The client that owns this channel instance
@property (nonatomic, strong) ChannelClient * _Null_unspecified me;
@property (nonatomic, strong) dispatch_queue_t _Nullable completionQueue;
/// The delegate for handling channel events
@property (nonatomic, weak) id <ChannelDelegate> _Nullable delegate;
/// The timeout for channel transport connection.
/// The connection will be closed if no ping is received within the defined timeout
@property (nonatomic) NSTimeInterval connectionTimeout;
/// Connects to the channel. This method will asynchronously call the delegate’s onConnect method and post a
/// ChannelEvent.Connect notification upon completion.
/// When a TV application connects to this channel, the onReady method/notification is also fired
- (void)connect;
/// Connects to the channel. This method will asynchronously call the delegate’s onConnect method and post a
/// ChannelEvent.Connect notification upon completion.
/// When a TV application connects to this channel, the onReady method/notification is also fired
/// \param attributes Any attributes you want to associate with the client (ie. [“name”:“FooBar”])
///
- (void)connect:(NSDictionary<NSString *, NSString *> * _Nullable)attributes;
/// Connects to the channel. This method will asynchronously call the delegate’s onConnect method and post a
/// ChannelEvent.Connect notification upon completion.
/// When a TV application connects to this channel, the onReady method/notification is also fired
/// \param attributes Any attributes you want to associate with the client (ie. [“name”:“FooBar”])
///
/// \param completionHandler The callback handler
///
- (void)connect:(NSDictionary<NSString *, NSString *> * _Nullable)attributes completionHandler:(void (^ _Nullable)(ChannelClient * _Nullable, NSError * _Nullable))completionHandler;
/// Disconnects from the channel. This method will asynchronously call the delegate’s onDisconnect and post a
/// ChannelEvent.Disconnect notification upon completion.
/// <ul>
///   <li>
///     client: The client that is disconnecting which is yourself
///   </li>
///   <li>
///     error: An error info if disconnect fails
///   </li>
/// </ul>
/// \param completionHandler The callback handler
///
- (void)disconnect:(void (^ _Nullable)(ChannelClient * _Nullable, NSError * _Nullable))completionHandler;
/// Disconnects from the channel. This method will asynchronously call the delegate’s onDisconnect and post a
/// ChannelEvent.Disconnect notification upon completion.
- (void)disconnect;
/// Publish an event containing a text message payload
/// \param event The event name
///
/// \param message A JSON serializable message object
///
- (void)publishWithEvent:(NSString * _Nonnull)event message:(id _Nullable)message;
/// Publish an event containing a text message and binary payload
/// \param event The event name
///
/// \param message A JSON serializable message object
///
/// \param data Any binary data to send with the message
///
- (void)publishWithEvent:(NSString * _Nonnull)event message:(id _Nullable)message data:(NSData * _Nonnull)data;
/// Publish an event with text message payload to one or more targets
/// \param event The event name
///
/// \param message A JSON serializable message object
///
/// \param target The target recipient(s) of the message.Can be a string client id, a collection of ids or a string MessageTarget (like MessageTarget.All.rawValue)
///
- (void)publishWithEvent:(NSString * _Nonnull)event message:(id _Nullable)message target:(id _Nonnull)target;
/// Publish an event containing a text message and binary payload to one or more targets
/// \param event The event name
///
/// \param message A JSON serializable message object
///
/// \param data Any binary data to send with the message
///
/// \param target The target recipient(s) of the message.Can be a string client id, a collection of ids or a string MessageTarget (like MessageTarget.All.rawValue)
///
- (void)publishWithEvent:(NSString * _Nonnull)event message:(id _Nullable)message data:(NSData * _Nonnull)data target:(id _Nonnull)target;
/// A snapshot of the list of clients currently connected to the channel
///
/// returns:
/// list of clients currently connected to the channel
- (NSArray<ChannelClient *> * _Nonnull)getClients SWIFT_WARN_UNUSED_RESULT;
/// A convenience method to subscribe for notifications using blocks.
/// \param notificationName The name of the notification.
///
/// \param performClosure The notification closure, which will be executed in the main thread.
/// Make sure to control the ownership of a variables captured by the closure you provide in this parameter
/// (e.g. use [unowned self] or [weak self] to make sure that self is released even if you did not unsubscribe from notification)
///
///
/// returns:
/// An observer handler for removing/unsubscribing the block from notifications
- (id _Nullable)on:(NSString * _Nonnull)notificationName performClosure:(void (^ _Nonnull)(NSNotification * _Nullable))performClosure SWIFT_WARN_UNUSED_RESULT;
/// A convenience method to unsubscribe from notifications
/// \param observer The observer object to unregister observations
///
- (void)off:(id _Nonnull)observer;
/// The description of the client
@property (nonatomic, readonly, copy) NSString * _Nonnull description;
- (void)setSecurityModeWithSecurity:(BOOL)security completionHandler:(void (^ _Nonnull)(BOOL, NSError * _Nullable))completionHandler;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end


/// An Application represents an application on the TV device.
/// Use this class to control various aspects of the application such as launching the app or getting information
SWIFT_CLASS("_TtC9SmartView11Application")
@interface Application : Channel
/// The id of the channel
@property (nonatomic, readonly, copy) NSString * _Nullable id;
/// start arguments
@property (nonatomic, readonly, copy) NSDictionary<NSString *, id> * _Nullable args;
/// Bundle Indentifier
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull BUNDLE_IDENTIFIER;)
+ (NSString * _Nonnull)BUNDLE_IDENTIFIER SWIFT_WARN_UNUSED_RESULT;
/// property value library
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull PROPERTY_VALUE_LIBRARY;)
+ (NSString * _Nonnull)PROPERTY_VALUE_LIBRARY SWIFT_WARN_UNUSED_RESULT;
/// Retrieves information about the Application on the TV
/// \param completionHandler The callback handler with the status dictionary and an error if any
///
- (void)getInfo:(void (^ _Nonnull)(NSDictionary<NSString *, id> * _Nullable, NSError * _Nullable))completionHandler;
/// Launches the application on the remote device, if the application is already running it returns success = true.
/// If the startOnConnect is set to false this method needs to be called in order to start the application
/// \param completionHandler The callback handler
///
- (void)start:(void (^ _Nullable)(BOOL, NSError * _Nullable))completionHandler;
/// Stops the application on the TV
/// \param completionHandler The callback handler
///
- (void)stop:(void (^ _Nullable)(BOOL, NSError * _Nullable))completionHandler;
/// Starts the application install on the TV, this method will fail for cloud applications
/// \param completionHandler The callback handler
///
- (void)install:(void (^ _Nullable)(BOOL, NSError * _Nullable))completionHandler;
/// override channel connect.
/// connects your client with the host TV app
/// \param attributes Any attributes you want to associate with the client (ie. [“name”:“FooBar”])
///
/// \param completionHandler The callback handler
///
- (void)connect:(NSDictionary<NSString *, NSString *> * _Nullable)attributes completionHandler:(void (^ _Nullable)(ChannelClient * _Nullable, NSError * _Nullable))completionHandler;
/// Disconnects your client with the host TV app
/// \param leaveHostRunning True leaves the TV app running ,False stops the TV app if yours is the last client
///
/// \param completionHandler The callback handler
///
- (void)disconnectWithLeaveHostRunning:(BOOL)leaveHostRunning completionHandler:(void (^ _Nullable)(ChannelClient * _Nullable, NSError * _Nullable))completionHandler;
/// Disconnect from the channel and leave the host application running if leaveHostRunning is set to true and you are the last client
/// \param leaveHostRunning True leaves the TV app running False stops the TV app if yours is the last client
///
- (void)disconnectWithLeaveHostRunning:(BOOL)leaveHostRunning;
/// Disconnect from the channel and terminate the host application if you are the last client
/// \param completionHandler The callback handler
///
- (void)disconnect:(void (^ _Nullable)(ChannelClient * _Nullable, NSError * _Nullable))completionHandler;
@end



@protocol ConnectionDelegate;

/// Base class for audio, video and photo player
SWIFT_CLASS("_TtC9SmartView10BasePlayer")
@interface BasePlayer : NSObject
/// The Connection delegate protocol defines the event methods available for channel Connection/DisConnection.
@property (nonatomic, weak) id <ConnectionDelegate> _Nullable connectionDelegate;
/// Disconnects to the channel. This method will asynchronously call the delegate’s onDisconnect method and post a
/// ChannelEvent.
/// \param completionHandler callback handler of OnDisconnect
///
- (void)disconnect:(BOOL)leaveHostRunning completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// connects to the DMP standby screen with provides functionality to launch with Logo or upto three Background images
/// \param screenSaverURL1 Optional Background Image Url
///
- (void)standbyConnect:(NSURL * _Nullable)screenSaverURL1 completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// connects to the DMP standby screen with provides functionality to launch with Logo or upto three Background images
/// \param screenSaverURL1 Optional Background Image Url
///
/// \param screenSaverURL2 Optional Background Image Url
///
- (void)standbyConnect:(NSURL * _Nullable)screenSaverURL1 screenSaverURL2:(NSURL * _Nullable)screenSaverURL2 completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// connects to the DMP standby screen with provides functionality to launch with Logo or upto three Background images
/// \param screenSaverURL1 Optional Background Image Url
///
/// \param screenSaverURL2 Optional Background Image Url
///
/// \param screenSaverURL3 Optional Background Image Url
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)standbyConnect:(NSURL * _Nullable)screenSaverURL1 screenSaverURL2:(NSURL * _Nullable)screenSaverURL2 screenSaverURL3:(NSURL * _Nullable)screenSaverURL3 completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// Sets the Watermark for the player
/// \param watermarkUrl Url from where watermark image will be downloaded
///
- (void)setPlayerWatermark:(NSURL * _Nullable)watermarkUrl;
/// Removes Player watermark set
- (void)removePlayerWatermark;
/// Play last sent media contents.
- (void)play;
/// Pause currently playing media.
- (void)pause;
/// Stop currently playing media.
- (void)stop;
/// Mute the volume of player on a connected device.
- (void)mute;
/// UnMute the volume of player on a connected device.
- (void)unMute;
/// Request previous to the player on a connected device.
- (void)previous;
/// Request next to the player on a connected device.
- (void)next;
/// Set volume on device playing media.
/// \param volume Integer value between 0 and 100.
///
- (void)setVolume:(uint8_t)volume;
/// Volume Up.
/// \code
/// increase volume of the player by 1.
///
/// \endcode
- (void)volumeUp;
/// decrease volume of the player by 1.
- (void)volumeDown;
/// get the control status of the player - like volume etc.
- (void)getControlStatus;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end

@protocol AudioPlayerDelegate;
enum AudioRepeatMode : NSInteger;

/// Audio Player Class handle the Audio share,control and TV Player queue.
SWIFT_CLASS("_TtC9SmartView11AudioPlayer")
@interface AudioPlayer : BasePlayer
/// The Audio Player delegate protocol defines the event methods available for a Audio.
@property (nonatomic, weak) id <AudioPlayerDelegate> _Nullable playerDelegate;
/// this method play Audio content on TV.
/// \param contentURL Audio Url
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)playContent:(NSURL * _Nonnull)contentURL completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// play Audio content on TV.
/// \param contentURL Content URL
///
/// \param title Content Title
///
/// \param albumName Content album name
///
/// \param albumArtUrl Content thumbnail URL
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)playContent:(NSURL * _Nullable)contentURL title:(NSString * _Nonnull)title albumName:(NSString * _Nonnull)albumName albumArtUrl:(NSURL * _Nullable)albumArtUrl completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// Seek the given time in currently playing media.
/// \param time Time in seconds within length of currently playing media.
///
- (void)seek:(NSTimeInterval)time;
/// resumes TV widget/application from background process.
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)resumeApplicationInForeground:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// repeat player list.
- (void)repeat;
/// Set player list mode
/// Supported mode: repeatAll,repeatOff,repeatSingle
- (void)setRepeat:(enum AudioRepeatMode)mode;
/// shuffle player list.
- (void)shuffle;
/// shuffle player list.
- (void)setShuffle:(BOOL)mode;
/// request player list i.e currently playing on TV.
- (void)getList;
/// request to delete(removeAll) player list.
- (void)clearList;
/// remove specific audio from player list.
/// \param contentURL Audio URL
///
- (void)removeFromList:(NSURL * _Nonnull)contentURL;
/// Add Audio item to player list.
/// \param contentURL URL
///
/// \param title Title
///
/// \param albumName Album NAme
///
/// \param albumArtUrl thumbnail URL
///
- (void)addToList:(NSURL * _Nonnull)contentURL title:(NSString * _Nonnull)title albumName:(NSString * _Nonnull)albumName albumArtUrl:(NSURL * _Nonnull)albumArtUrl;
/// Add Audio item to player list.
/// \param arrayDictofData list data in form array of dictionary
///
- (void)addToList:(NSArray<NSDictionary<NSString *, id> *> * _Nonnull)arrayDictofData;
/// Notification of any data received from TV player
/// \param notification contains player queue event and action
///
- (void)onMessage:(NSNotification * _Null_unspecified)notification;
@end

/// Enum for Player list mode
/// Supported mode: repeatAll,repeatOff,repeatSingle
typedef SWIFT_ENUM(NSInteger, AudioRepeatMode, closed) {
/// Repeat Off
  AudioRepeatModeRepeatOff = 0,
/// Repeat Single
  AudioRepeatModeRepeatSingle = 1,
/// repeat All
  AudioRepeatModeRepeatAll = 2,
};


SWIFT_PROTOCOL("_TtP9SmartView19AudioPlayerDelegate_")
@protocol AudioPlayerDelegate
@optional
/// event occurs on Buffering of Audio Start.
- (void)onBufferingStart;
/// event occurs on Buffering of Audio Complete.
- (void)onBufferingComplete;
/// event occurs asynchronously when audio buffering is in progress.
/// \param progress current Buffer Progerss
///
- (void)onBufferingProgress:(NSInteger)progress;
/// event occurs continously when Audio streaming is going on.
/// \param progress current playing time of Audio.
///
- (void)onCurrentPlayTime:(NSInteger)progress;
/// event occurs when Audio streaming start.
/// \param duration total duration of audio.
///
- (void)onStreamingStarted:(NSInteger)duration;
/// event occurs when Audio streaming completed.
- (void)onStreamCompleted;
/// event occurs when Audio is shared with TV for the first time.
- (void)onPlayerInitialized;
/// event occurs when different type of media is shared with TV.
/// (Audio is shared after photo/video share)
/// \param playerType current player type (photo/audio/video)
///
- (void)onPlayerChange:(NSString * _Nonnull)playerType;
/// event occurs when paused audio is played.
- (void)onPlay;
/// event occurs on audio pause.
- (void)onPause;
/// event occurs on audio stop.
- (void)onStop;
/// event occurs on Player mute.
- (void)onMute;
/// event occurs on Player unMute.
- (void)onUnMute;
/// event occurs when Player plays next content.
- (void)onNext;
/// event occurs when Player plays previous content.
- (void)onPrevious;
/// provides the status of play controls like volume, mute/unmute and mode of player like single or repeat all
/// \param volLevel player volume level
///
/// \param muteStatus player mute status
///
/// \param shuffleStatus player shuffle status
///
/// \param mode player mode single or repeat all
///
- (void)onControlStatus:(NSInteger)volLevel muteStatus:(BOOL)muteStatus shuffleStatus:(BOOL)shuffleStatus mode:(NSString * _Nonnull)mode;
/// event occurs on  player volume change.
/// \param volLevel player volume to be set.
///
- (void)onVolumeChange:(NSInteger)volLevel;
/// event occurs on audio addition in TV queue(player list).
/// \param enqueuedItem enqueued audio item.
///
- (void)onAddToList:(NSDictionary<NSString *, id> * _Nonnull)enqueuedItem;
/// event occurs on audio remove from TV queue(player list).
/// \param dequeuedItem dequeued audio Item.
///
- (void)onRemoveFromList:(NSDictionary<NSString *, id> * _Nonnull)dequeuedItem;
/// event occurs on TV queue(player list) deletion.
- (void)onClearList;
/// event occurs when player list(TV queue) is recieved.
/// \param queueList play list of TV
///
- (void)onGetList:(NSDictionary<NSString *, id> * _Nonnull)queueList;
/// event occurs when player list is shuffled.
/// \param status shuffle status(true/false)
///
- (void)onShuffle:(BOOL)status;
/// event occurs on player list repeat.
/// \param mode specify repeat all/repeat single audio
///
- (void)onRepeat:(NSString * _Nonnull)mode;
/// occurs when new audio is shared with TV.
/// \param currentItem current shared item.
///
- (void)onCurrentPlaying:(NSDictionary<NSString *, id> * _Nonnull)currentItem;
/// occurs when TV Application/widget goes into background.
- (void)onApplicationSuspend;
/// occurs when  TV Application/widget comes in foreground.
- (void)onApplicationResume;
/// occurs when error is occured in playing Audio
/// \param error eror details
///
- (void)onError:(NSError * _Nonnull)error;
@end












/// A client currently connected to the channel
SWIFT_CLASS("_TtC9SmartView13ChannelClient")
@interface ChannelClient : NSObject
/// The id of the client
@property (nonatomic, readonly, copy) NSString * _Nonnull id;
/// The time which the client connected in epoch milliseconds
@property (nonatomic, readonly, copy) NSDate * _Nullable connectTime;
/// A dictionary of attributes passed by the client when connecting
@property (nonatomic, readonly, strong) id _Nullable attributes;
/// Flag for determining if the client is the host
@property (nonatomic, readonly) BOOL isHost;
/// The description of the client
@property (nonatomic, readonly, copy) NSString * _Nonnull description;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end

@class Message;

/// The channel delegate protocol defines the event methods available for a channel
SWIFT_PROTOCOL("_TtP9SmartView15ChannelDelegate_")
@protocol ChannelDelegate
@optional
/// Called when the Channel is connected
/// \param client The Client that just connected to the Channel
///
/// \param error An error info if any
///
/// \param error An error info if any
///
- (void)onConnect:(ChannelClient * _Nullable)client error:(NSError * _Nullable)error;
/// Called when the host app is ready to send or receive messages
- (void)onReady;
/// Called when the Channel is disconnected
/// \param client The Client that just disconnected from the Channel
///
/// \param error An error info if any
///
/// \param error An error info if any
///
- (void)onDisconnect:(ChannelClient * _Nullable)client error:(NSError * _Nullable)error;
/// Called when the Channel receives a text message
/// \param message Text message received
///
- (void)onMessage:(Message * _Nonnull)message;
/// Called when the Channel receives a binary data message
/// \param message Text message received
///
/// \param payload Binary payload data
///
- (void)onData:(Message * _Nonnull)message payload:(NSData * _Nonnull)payload;
/// Called when a client connects to the Channel
/// \param client The Client that just connected to the Channel
///
- (void)onClientConnect:(ChannelClient * _Nonnull)client;
/// Called when a client disconnects from the Channel
/// \param client The Client that just disconnected from the Channel
///
- (void)onClientDisconnect:(ChannelClient * _Nonnull)client;
/// Called when a Channel Error is fired
/// \param error The error
///
- (void)onError:(NSError * _Nonnull)error;
@end


/// The Connection delegate protocol defines the event methods available for channel Connection/DisConnection.
SWIFT_PROTOCOL("_TtP9SmartView18ConnectionDelegate_")
@protocol ConnectionDelegate
@optional
/// event occur when connection occur with channel.
/// \param error connection error
///
- (void)onConnect:(NSError * _Nullable)error;
/// event occur when Disconnection occur with channel.
/// \param error disconnect error.
///
- (void)onDisconnect:(NSError * _Nullable)error;
/// event occur when other client connects with channel.
/// \param client client info.
///
- (void)onClientConnect:(ChannelClient * _Nonnull)client;
/// event occur when other client disconnects with channel.
/// \param client client info.
///
- (void)onClientDisconnect:(ChannelClient * _Nonnull)client;
/// event occur when a Channel Error is fired
/// \param error error.
///
- (void)onError:(NSError * _Nonnull)error;
/// event occur when the host app is ready to send or receive messages
- (void)onReady;
@end


/// This class is wrapper which handle tv media calls.
/// its basic functionality is to launch DMP on TV and whatever notification comes from TV side it passes on to further module.
SWIFT_CLASS("_TtC9SmartView11MediaPlayer")
@interface MediaPlayer : NSObject
/// TV service name
@property (nonatomic, readonly, strong) Service * _Nonnull service;
/// Application Connection Status with TV.
@property (nonatomic, readonly) BOOL connected;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end


@interface MediaPlayer (SWIFT_EXTENSION(SmartView)) <ChannelDelegate>
/// Notification of any data received from TV player
/// \param notification contains player queue event and action
///
- (void)onMessage:(Message * _Nonnull)message;
/// event occur when connection occur with channel
/// <ul>
///   <li>
///     client: The client that is connecting which is yourself
///   </li>
///   <li>
///     error: An error info if connect fails
///   </li>
/// </ul>
- (void)onConnect:(ChannelClient * _Nullable)client error:(NSError * _Nullable)error;
/// event occur when disconnection occur with channel.
/// <ul>
///   <li>
///     client: The client that is disconnecting which is yourself
///   </li>
///   <li>
///     error: An error info if disconnect fails
///   </li>
/// </ul>
- (void)onDisconnect:(ChannelClient * _Nullable)client error:(NSError * _Nullable)error;
- (void)onClientConnect:(ChannelClient * _Nonnull)client;
- (void)onClientDisconnect:(ChannelClient * _Nonnull)client;
- (void)onError:(NSError * _Nonnull)error;
- (void)onReady;
@end


/// This class encapsulates the message that
SWIFT_CLASS("_TtC9SmartView7Message")
@interface Message : NSObject
/// The event name
@property (nonatomic, readonly, copy) NSString * _Null_unspecified event;
/// The publisher of the event
@property (nonatomic, readonly, copy) NSString * _Null_unspecified from;
/// A dictionary containig the message
@property (nonatomic, readonly, strong) id _Nullable data;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end

@protocol PhotoPlayerDelegate;

/// Photo Player Class handle the Photo share,control and TV Player queue.
SWIFT_CLASS("_TtC9SmartView11PhotoPlayer")
@interface PhotoPlayer : BasePlayer
/// The Photo Player delegate protocol defines the event methods available for a Photo.
@property (nonatomic, weak) id <PhotoPlayerDelegate> _Nullable playerDelegate;
/// this method play image content on TV.
/// \param contentURL image Url
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)playContent:(NSURL * _Nonnull)contentURL completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// this method play image content on TV.
/// \param contentURL image URL
///
/// \param title image Title
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)playContent:(NSURL * _Nullable)contentURL title:(NSString * _Nonnull)title completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// sets background audio in slide show.
/// \param contentURL Background audio contentURL.
///
- (void)setBackgroundMusic:(NSURL * _Nonnull)contentURL;
/// stops background audio in slide show.
- (void)stopBackgroundMusic;
/// resumes TV widget/application from background process.
- (void)resumeApplicationInForeground:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// request player list i.e currently playing on TV.
- (void)getList;
/// request to delete(removeAll) player list.
- (void)clearList;
/// remove specific image from player list.
/// \param contentURL image URL
///
- (void)removeFromList:(NSURL * _Nonnull)contentURL;
/// add image to player list.
/// \param contentURL URL
///
/// \param title Title
///
/// \param albumName Album NAme
///
/// \param albumArtUrl Album Art URL
///
- (void)addToList:(NSURL * _Nonnull)contentURL title:(NSString * _Nonnull)title;
/// add Photo item to player list.
/// \param arrayDictofData list data in form array of dictionary
///
- (void)addToList:(NSArray<NSDictionary<NSString *, id> *> * _Nonnull)arrayDictofData;
/// Notification of any data received from TV player
/// \param notification contains player queue event and action
///
- (void)onMessage:(NSNotification * _Null_unspecified)notification;
@end


/// The Photo Player delegate protocol defines the event methods available for a Photo.
SWIFT_PROTOCOL("_TtP9SmartView19PhotoPlayerDelegate_")
@protocol PhotoPlayerDelegate
@optional
/// event occurs when Photo is shared with TV for the first time or after audio/video share.
- (void)onPlayerInitialized;
/// event occurs when different type of media is shared with TV.
/// (Photo is shared after audio/video share)
/// \param playerType current player type (photo/audio/video)
///
- (void)onPlayerChange:(NSString * _Nonnull)playerType;
/// event occurs when paused photo player list is played.
- (void)onPlay;
/// event occurs on photo player list pause.
- (void)onPause;
/// event occurs on photo player list stop.
- (void)onStop;
/// event occurs on Player mute.
- (void)onMute;
/// event occurs on Player unMute.
- (void)onUnMute;
/// event occurs when Player plays next content.
- (void)onNext;
/// event occurs when Player plays previous content.
- (void)onPrevious;
/// provides the status of play controls like volume, mute/unmute and mode of player like single or repeat all
/// \param volLevel player volume level
///
/// \param muteStatus player mute status
///
/// \param shuffleStatus player shuffle status
///
/// \param mode player mode single or repeat all
///
- (void)onControlStatus:(NSInteger)volLevel muteStatus:(BOOL)muteStatus;
/// event occurs on  player volume change.
/// \param volLevel player volume to be set.
///
- (void)onVolumeChange:(NSInteger)volLevel;
/// event occurs on photo(image) addition in TV queue(player list).
/// \param enqueuedItem enqueued photo item.
///
- (void)onAddToList:(NSDictionary<NSString *, id> * _Nonnull)enqueuedItem;
/// event occurs on photo remove from TV queue(player list).
/// \param dequeuedItem dequeued photo item.
///
- (void)onRemoveFromList:(NSDictionary<NSString *, id> * _Nonnull)dequeuedItem;
/// event occurs on TV queue(player list) deletion.
- (void)onClearList;
/// event occurs when player list(TV queue) is recieved.
/// \param queueList play list of TV
///
- (void)onGetList:(NSDictionary<NSString *, id> * _Nonnull)queueList;
/// occurs when new photo is shared with TV.
/// \param currentItem current shared item.
///
- (void)onCurrentPlaying:(NSDictionary<NSString *, id> * _Nonnull)currentItem;
/// occurs when TV Application/widget goes into background.
- (void)onApplicationSuspend;
/// occurs when  TV Application/widget comes in foreground.
- (void)onApplicationResume;
/// occurs when error is occured in playing Audio
/// \param error eror details
///
- (void)onError:(NSError * _Nonnull)error;
@end

enum ServiceSearchDiscoveryType : NSInteger;
@class VideoPlayer;
@class ServiceSearch;

/// A Service instance represents the multiscreen service root on the remote device
/// Use the class to control top level services of the device
SWIFT_CLASS("_TtC9SmartView7Service")
@interface Service : NSObject
/// Discovery Type LAN/BLE
@property (nonatomic, readonly) enum ServiceSearchDiscoveryType discoveryType;
/// The id of the service
@property (nonatomic, readonly, copy) NSString * _Nonnull id;
/// The uri of the service (http://<ip>:<port>/api/v2/)
@property (nonatomic, readonly, copy) NSString * _Nonnull uri;
/// The name of the service (Living Room TV)
@property (nonatomic, readonly, copy) NSString * _Nonnull name;
/// The version of the service (x.x.x)
@property (nonatomic, readonly, copy) NSString * _Nonnull version;
/// The type of the service (Samsung SmartTV)
@property (nonatomic, readonly, copy) NSString * _Nonnull type;
/// The service description
@property (nonatomic, readonly, copy) NSString * _Nonnull description;
/// This asynchronously method retrieves a dictionary of additional information about the device the service is running on
/// \param timeout timeout
///
/// \param completionHandler A block to handle the response dictionary
/// <ul>
///   <li>
///     deviceInfo: The device info dictionary
///   </li>
///   <li>
///     error: An error info if getDeviceInfo failed
///   </li>
/// </ul>
///
- (void)getDeviceInfo:(NSInteger)timeout completionHandler:(void (^ _Nonnull)(NSDictionary<NSString *, id> * _Nullable, NSError * _Nullable))completionHandler;
/// Creates an application instance belonging to that service
/// \param id The id of the application
/// <ul>
///   <li>
///     For an installed application this is the string id as provided by Samsung, If your TV app is still in development, you can use the folder name of your app as the id. Once the TV app has been released into Samsung Apps, you must use the supplied app id.`
///   </li>
///   <li>
///     For a cloud application this is the application’s URL
///   </li>
/// </ul>
///
/// \param channelURI The uri of the Channel (“com.samsung.multiscreen.helloworld”)
///
/// \param args A dictionary of command line aruguments to be passed to the Host TV App
///
///
/// returns:
/// An Application instance or nil if application id or channel id is empty
- (Application * _Nullable)createApplication:(id _Nonnull)id channelURI:(NSString * _Nonnull)channelURI args:(NSDictionary<NSString *, id> * _Nullable)args SWIFT_WARN_UNUSED_RESULT;
/// Creates a channel instance belonging to that service (“mychannel”)
/// <ul>
///   <li>
///     `: The uri of the Channel (“com.samsung.multiscreen.helloworld”)
///   </li>
/// </ul>
///
/// returns:
/// A Channel instance
- (Channel * _Nonnull)createChannel:(NSString * _Nonnull)channelURI SWIFT_WARN_UNUSED_RESULT;
/// Creates video player instance
/// \param appName 
///
///
/// returns:
/// VideoPlayer instance
- (VideoPlayer * _Nonnull)createVideoPlayer:(NSString * _Nonnull)appName SWIFT_WARN_UNUSED_RESULT;
/// Creates audio player instance
/// \param appName 
///
///
/// returns:
/// AudioPlayer instance
- (AudioPlayer * _Nonnull)createAudioPlayer:(NSString * _Nonnull)appName SWIFT_WARN_UNUSED_RESULT;
/// Creates photo player instance
/// \param appName 
///
///
/// returns:
/// PhotoPlayer instance
- (PhotoPlayer * _Nonnull)createPhotoPlayer:(NSString * _Nonnull)appName SWIFT_WARN_UNUSED_RESULT;
/// Creates a service search object
///
/// returns:
/// An instance of ServiceSearch
+ (ServiceSearch * _Nonnull)search SWIFT_WARN_UNUSED_RESULT;
/// This asynchronous method retrieves a service instance given a service URI
/// \param uri The uri of the service
///
/// \param timeOut 
///
/// \param completionHandler The completion handler with the service instance or an error
/// <ul>
///   <li>
///     service: The service instance
///   </li>
///   <li>
///     timeout: The timeout for the request
///   </li>
///   <li>
///     error: An error info if getByURI fails
///   </li>
/// </ul>
///
+ (void)getByURI:(NSString * _Nonnull)uri timeout:(NSTimeInterval)timeout completionHandler:(void (^ _Nonnull)(Service * _Nullable, NSError * _Nullable))completionHandler;
/// This asynchronous method retrieves a service instance given a service id
/// \param id The id of the service
///
/// \param completionHandler The completion handler with the service instance or an error
/// <ul>
///   <li>
///     service: The service instance
///   </li>
///   <li>
///     error: An error info if getById fails
///   </li>
/// </ul>
///
+ (void)getById:(NSString * _Nonnull)id completionHandler:(void (^ _Nonnull)(Service * _Nullable, NSError * _Nullable))completionHandler;
/// Send a packet for WakeOnWirelessLan.
/// \param macAddr Mac Address of TV
///
+ (void)WakeOnWirelessLan:(NSString * _Nonnull)macAddr;
/// Send a packet via WakeOnWirelessLan and create and connect to particular appilcation
/// \param macAddr Mac Address of TV
///
/// \param uri The uri of service
///
/// \param service The service instance
///
/// \param error An error info if getByURI fails
///
+ (void)WakeOnWirelessAndConnect:(NSString * _Nonnull)macAddr uri:(NSString * _Nonnull)uri completionHandler:(void (^ _Nonnull)(Service * _Nullable, NSError * _Nullable))completionHandler;
/// Send a packet via WakeOnWirelessLan and create and connect to particular appilcation
/// \param macAddr Mac Address of TV
///
/// \param uri The uri of service
///
/// \param timeOut timeout to wakeup
///
/// \param service The service instance
///
/// \param error An error info if getByURI fails
///
+ (void)WakeOnWirelessAndConnect:(NSString * _Nonnull)macAddr uri:(NSString * _Nonnull)uri timeOut:(NSTimeInterval)timeOut completionHandler:(void (^ _Nonnull)(Service * _Nullable, NSError * _Nullable))completionHandler;
- (void)isSecurityModeSupportedWithCompletionHandler:(void (^ _Nonnull)(BOOL, NSError * _Nullable))completionHandler;
/// Tries to Remove the standby service from the DB
- (void)remove;
/// Checks whether DMP is supported by the Service or not.
/// <ul>
///   <li>
///     returns Bool: True if DMP is supported
///   </li>
/// </ul>
- (BOOL)isDMPSupported SWIFT_WARN_UNUSED_RESULT;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end



@protocol ServiceSearchDelegate;

/// This class searches the local network for compatible multiscreen services
SWIFT_CLASS("_TtC9SmartView13ServiceSearch")
@interface ServiceSearch : NSObject
/// Set a delegate to receive search events.
@property (nonatomic, weak) id <ServiceSearchDelegate> _Nullable delegate;
/// The search status
@property (nonatomic, readonly) BOOL isSearching;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
/// request for TV list found on Network/BLE.
///
/// returns:
/// returns TV List.
- (NSArray<Service *> * _Nonnull)getServices SWIFT_WARN_UNUSED_RESULT;
/// A convenience method to suscribe for notifications using blocks
/// \param notificationName The name of the notification
///
/// \param performClosure The notification block, this block will be executed in the main thread
///
///
/// returns:
/// An observer handler for removing/unsubscribing the block from notifications
- (id _Nonnull)on:(NSString * _Nonnull)notificationName performClosure:(void (^ _Nonnull)(NSNotification * _Nullable))performClosure SWIFT_WARN_UNUSED_RESULT;
/// A convenience method to unsuscribe from notifications
/// \param observer The observer object to unregister observations
///
- (void)off:(id _Nonnull)observer;
/// Start searching for devices
- (void)start;
/// Start searching for devices, overloaded function
/// \param showStandByTv false if Standby devices not to be shown
///
- (void)start:(BOOL)showStandByTv;
/// check bluetooth searching is on or off
///
/// returns:
/// true if bluetooth discovery on otherwise false
- (BOOL)isSearchingBLE SWIFT_WARN_UNUSED_RESULT;
/// Start BLE Search Process
///
/// returns:
/// returns ‘True’ if using BLE otherwise ‘False’
- (BOOL)startUsingBLE SWIFT_WARN_UNUSED_RESULT;
/// Stop BLE Search Process
///
/// returns:
/// True
- (BOOL)stopUsingBLE SWIFT_WARN_UNUSED_RESULT;
/// Stops the Device discovery.
- (void)stop;
/// Returns what status is set to StandbyMode.
/// <ul>
///   <li>
///     returns Bool: true if standby devices are shown
///   </li>
/// </ul>
- (BOOL)getStandByMode SWIFT_WARN_UNUSED_RESULT;
@end






@interface ServiceSearch (SWIFT_EXTENSION(SmartView))
/// Clear the standby devices from the DB
/// \param None No parameter required
///
- (void)clearStandbyDevices;
@end


/// This protocol defines the methods for ServiceSearch discovery
SWIFT_PROTOCOL("_TtP9SmartView21ServiceSearchDelegate_")
@protocol ServiceSearchDelegate
@optional
/// The ServiceSearch will call this delegate method when a service is found
/// \param service The found service
///
- (void)onServiceFound:(Service * _Nonnull)service;
/// The ServiceSearch will call this delegate method when a service is lost
/// \param service The lost service
///
- (void)onServiceLost:(Service * _Nonnull)service;
/// The ServiceSearch will call this delegate method after stopping the search
- (void)onStop;
/// The ServiceSearch will call this delegate method after the search has started
- (void)onStart;
/// If BLE device is found
/// \param NameOfTV Name of TV found on Bluetooth
///
- (void)onFoundOnlyBLE:(NSString * _Nonnull)NameOfTV;
/// Find other network (other than BLE)
/// \param NameOfTV Name of TV found on Network
///
- (void)onFoundOtherNetwork:(NSString * _Nonnull)NameOfTV;
@end

/// Describe Service Search DiscoveryType
typedef SWIFT_ENUM(NSInteger, ServiceSearchDiscoveryType, closed) {
/// LAN type
  ServiceSearchDiscoveryTypeLAN = 0,
/// Cloud Type
  ServiceSearchDiscoveryTypeCLOUD = 1,
};

@protocol VideoPlayerDelegate;
enum VideoRepeatMode : NSInteger;

/// Video Player Class handle the Video share, control and TV Player queue.
SWIFT_CLASS("_TtC9SmartView11VideoPlayer")
@interface VideoPlayer : BasePlayer
/// The Video Player delegate protocol defines the event methods available for a Video.
@property (nonatomic, weak) id <VideoPlayerDelegate> _Nullable playerDelegate;
/// this method play video content on TV.
/// \param contentURL video Url
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)playContent:(NSURL * _Nonnull)contentURL completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// this method play video content on TV.
/// \param contentURL Content URL
///
/// \param title Content Title
///
/// \param thumbnailURL Content thumbnail URL
///
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)playContent:(NSURL * _Nullable)contentURL title:(NSString * _Nonnull)title thumbnailURL:(NSURL * _Nullable)thumbnailURL completionHandler:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// This method sends request to player for fast forwarding the video.
- (void)forward;
/// This method sends request to player for rewind the video.
- (void)rewind;
/// Seek the given time in currently playing media.
/// \param time Time in seconds within length of currently playing media.
///
- (void)seek:(NSTimeInterval)time;
/// repeat player list.
- (void)repeat;
/// Set player list mode
/// Supported mode: repeatAll,repeatOff,repeatSingle
- (void)setRepeat:(enum VideoRepeatMode)mode;
/// resumes TV widget/application from background process.
/// \param completionHandler The response completion closure, it will be executed in the request queue i.e. in a backgound thread.
///
- (void)resumeApplicationInForeground:(void (^ _Nullable)(NSError * _Nullable))completionHandler;
/// request player list i.e currently playing on TV.
- (void)getList;
/// request to delete(removeAll) player list.
- (void)clearList;
/// remove specific video content from player list.
/// \param contentURL video URL
///
- (void)removeFromList:(NSURL * _Nonnull)contentURL;
/// Add video item to player list.
/// \param contentURL URL
///
/// \param title Title
///
/// \param thumbnailURL thumbnail URL
///
- (void)addToList:(NSURL * _Nonnull)contentURL title:(NSString * _Nonnull)title thumbnailURL:(NSURL * _Nonnull)thumbnailURL;
/// Add video item to player list.
/// \param arrayDictofData list data in form array of dictionary
///
- (void)addToList:(NSArray<NSDictionary<NSString *, id> *> * _Nonnull)arrayDictofData;
/// Notification of any data received from TV player
/// \param notification contains player queue event and action
///
- (void)onMessage:(NSNotification * _Null_unspecified)notification;
@end

/// Enum for Player list mode
/// Supported mode: repeatAll,repeatOff,repeatSingle
typedef SWIFT_ENUM(NSInteger, VideoRepeatMode, closed) {
/// Repeat Off
  VideoRepeatModeRepeatOff = 0,
/// Repeat Single
  VideoRepeatModeRepeatSingle = 1,
/// repeat All
  VideoRepeatModeRepeatAll = 2,
};


/// The Video Player delegate protocol defines the event methods available for a Video.
SWIFT_PROTOCOL("_TtP9SmartView19VideoPlayerDelegate_")
@protocol VideoPlayerDelegate
@optional
/// event occurs on Buffering of Video Start.
- (void)onBufferingStart;
/// event occurs on Buffering of Video Complete.
- (void)onBufferingComplete;
/// event occurs asynchronously when video buffering is in progress.
/// \param progress current Buffer Progerss
///
- (void)onBufferingProgress:(NSInteger)progress;
/// event occurs continously when video streaming is going on.
/// \param progress current playing time of video.
///
- (void)onCurrentPlayTime:(NSInteger)progress;
/// event occurs when video streaming start.
/// \param duration total duration of video.
///
- (void)onStreamingStarted:(NSInteger)duration;
/// event occurs when video streaming completed.
- (void)onStreamCompleted;
/// event occurs when video is shared with TV for the first time.
- (void)onPlayerInitialized;
/// event occurs when different type of media is shared with TV.
/// (video is shared after photo/audio share)
/// \param playerType current player type (photo/audio/video)
///
- (void)onPlayerChange:(NSString * _Nonnull)playerType;
/// event occurs when paused video is played.
- (void)onPlay;
/// event occurs on video pause.
- (void)onPause;
/// event occurs on video stop.
- (void)onStop;
/// event occurs on fast forwarding the video.
- (void)onForward;
/// event occurs on rewind the video.
- (void)onRewind;
/// event occurs on Player mute.
- (void)onMute;
/// event occurs on Player unMute.
- (void)onUnMute;
/// event occurs when Player plays next content.
- (void)onNext;
/// event occurs when Player plays previous content.
- (void)onPrevious;
/// provides the status of play controls like volume, mute/unmute and mode of player like single or repeat all
/// \param volLevel player volume level
///
/// \param muteStatus player mute status
///
/// \param shuffleStatus player shuffle status
///
/// \param mode player mode single or repeat all
///
- (void)onControlStatus:(NSInteger)volLevel muteStatus:(BOOL)muteStatus mode:(NSString * _Nonnull)mode;
/// event occurs on  player volume change.
/// \param volLevel player volume to be set.
///
- (void)onVolumeChange:(NSInteger)volLevel;
/// event occurs on video addition in TV queue(player list).
/// \param enqueuedItem enqueued video item.
///
- (void)onAddToList:(NSDictionary<NSString *, id> * _Nonnull)enqueuedItem;
/// event occurs on video remove from TV queue(player list).
/// \param dequeuedItem dequeued video Item.
///
- (void)onRemoveFromList:(NSDictionary<NSString *, id> * _Nonnull)dequeuedItem;
/// event occurs on TV queue(player list) deletion.
- (void)onClearList;
/// event occurs when player list(TV queue) is recieved.
/// \param queueList play list of TV
///
- (void)onGetList:(NSDictionary<NSString *, id> * _Nonnull)queueList;
/// event occurs on player list repeat.
/// \param mode specify repeat all/repeat single audio
///
- (void)onRepeat:(NSString * _Nonnull)mode;
/// occurs when new audio is shared with TV.
/// \param currentItem current shared item.
///
- (void)onCurrentPlaying:(NSDictionary<NSString *, id> * _Nonnull)currentItem;
/// occurs when TV Application/widget goes into background.
- (void)onApplicationSuspend;
/// occurs when  TV Application/widget comes in foreground.
- (void)onApplicationResume;
/// occurs when error is occured in playing Audio
/// \param error eror details
///
- (void)onError:(NSError * _Nonnull)error;
@end

@class NSStream;

SWIFT_CLASS("_TtC9SmartView9WebSocket")
@interface WebSocket : NSObject <NSStreamDelegate>
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull ErrorDomain;)
+ (NSString * _Nonnull)ErrorDomain SWIFT_WARN_UNUSED_RESULT;
@property (nonatomic, strong) dispatch_queue_t _Nonnull callbackQueue;
@property (nonatomic, copy) void (^ _Nullable onConnect)();
@property (nonatomic, copy) void (^ _Nullable onDisconnect)(NSError * _Nullable);
@property (nonatomic, copy) void (^ _Nullable onText)(NSString * _Nonnull);
@property (nonatomic, copy) void (^ _Nullable onData)(NSData * _Nonnull);
@property (nonatomic, copy) void (^ _Nullable onPong)(NSData * _Nullable);
@property (nonatomic, copy) NSDictionary<NSString *, NSString *> * _Nonnull headers;
@property (nonatomic) BOOL voipEnabled;
@property (nonatomic) BOOL disableSSLCertValidation;
@property (nonatomic, copy) NSArray<NSNumber *> * _Nullable enabledSSLCipherSuites;
@property (nonatomic, copy) NSString * _Nullable origin;
@property (nonatomic) NSInteger timeout;
@property (nonatomic, readonly) BOOL isConnected;
@property (nonatomic, readonly, copy) NSURL * _Nonnull currentURL;
/// Used for setting protocols.
- (nonnull instancetype)initWithUrl:(NSURL * _Nonnull)url protocols:(NSArray<NSString *> * _Nullable)protocols OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithUrl:(NSURL * _Nonnull)url writeQueueQOS:(enum NSQualityOfService)writeQueueQOS protocols:(NSArray<NSString *> * _Nullable)protocols;
/// Connect to the WebSocket server on a background thread.
- (void)connect;
/// Write a string to the websocket. This sends it as a text frame.
/// If you supply a non-nil completion block, I will perform it when the write completes.
/// \param str The string to write.
///
/// \param completion The (optional) completion handler.
///
- (void)writeWithString:(NSString * _Nonnull)string completion:(void (^ _Nullable)(void))completion;
/// Write binary data to the websocket. This sends it as a binary frame.
/// If you supply a non-nil completion block, I will perform it when the write completes.
/// \param data The data to write.
///
/// \param completion The (optional) completion handler.
///
- (void)writeWithData:(NSData * _Nonnull)data completion:(void (^ _Nullable)(void))completion;
/// Write a ping to the websocket. This sends it as a control frame.
/// Yodel a   sound  to the planet.    This sends it as an astroid. http://youtu.be/Eu5ZJELRiJ8?t=42s
- (void)writeWithPing:(NSData * _Nonnull)ping completion:(void (^ _Nullable)(void))completion;
/// Delegate for the stream methods. Processes incoming bytes
- (void)stream:(NSStream * _Nonnull)aStream handleEvent:(NSStreamEvent)eventCode;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end

#if __has_attribute(external_source_symbol)
# pragma clang attribute pop
#endif
#pragma clang diagnostic pop
