2 * Copyright(c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.ComponentModel;
19 using System.Runtime.InteropServices;
20 using Tizen.NUI.Binding;
22 namespace Tizen.NUI.BaseComponents
25 /// VideoView is a control for video playback and display.
27 /// <since_tizen> 3 </since_tizen>
28 public class VideoView : View
30 /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
31 [EditorBrowsable(EditorBrowsableState.Never)]
32 public static readonly BindableProperty VideoProperty = BindableProperty.Create(nameof(Video), typeof(PropertyMap), typeof(VideoView), null, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) =>
34 var videoView = (VideoView)bindable;
37 Tizen.NUI.Object.SetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.VIDEO, new Tizen.NUI.PropertyValue((PropertyMap)newValue));
40 defaultValueCreator: (BindableProperty.CreateDefaultValueDelegate)((bindable) =>
42 var videoView = (VideoView)bindable;
43 PropertyMap temp = new PropertyMap();
44 Tizen.NUI.Object.GetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.VIDEO).Get(temp);
47 /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
48 [EditorBrowsable(EditorBrowsableState.Never)]
49 public static readonly BindableProperty LoopingProperty = BindableProperty.Create(nameof(Looping), typeof(bool), typeof(VideoView), false, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) =>
51 var videoView = (VideoView)bindable;
54 Tizen.NUI.Object.SetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.LOOPING, new Tizen.NUI.PropertyValue((bool)newValue));
57 defaultValueCreator: (BindableProperty.CreateDefaultValueDelegate)((bindable) =>
59 var videoView = (VideoView)bindable;
61 Tizen.NUI.Object.GetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.LOOPING).Get(out temp);
64 /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
65 [EditorBrowsable(EditorBrowsableState.Never)]
66 public static readonly BindableProperty MutedProperty = BindableProperty.Create(nameof(Muted), typeof(bool), typeof(VideoView), false, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) =>
68 var videoView = (VideoView)bindable;
71 Tizen.NUI.Object.SetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.MUTED, new Tizen.NUI.PropertyValue((bool)newValue));
74 defaultValueCreator: (BindableProperty.CreateDefaultValueDelegate)((bindable) =>
76 var videoView = (VideoView)bindable;
78 Tizen.NUI.Object.GetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.MUTED).Get(out temp);
81 /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
82 [EditorBrowsable(EditorBrowsableState.Never)]
83 public static readonly BindableProperty VolumeProperty = BindableProperty.Create(nameof(Volume), typeof(PropertyMap), typeof(VideoView), null, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) =>
85 var videoView = (VideoView)bindable;
88 Tizen.NUI.Object.SetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.VOLUME, new Tizen.NUI.PropertyValue((PropertyMap)newValue));
91 defaultValueCreator: (BindableProperty.CreateDefaultValueDelegate)((bindable) =>
93 var videoView = (VideoView)bindable;
94 PropertyMap temp = new PropertyMap();
95 Tizen.NUI.Object.GetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.VOLUME).Get(temp);
98 /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
99 [EditorBrowsable(EditorBrowsableState.Never)]
100 public static readonly BindableProperty UnderlayProperty = BindableProperty.Create(nameof(Underlay), typeof(bool), typeof(VideoView), false, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) =>
102 var videoView = (VideoView)bindable;
103 if (newValue != null)
105 Tizen.NUI.Object.SetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.UNDERLAY, new Tizen.NUI.PropertyValue((bool)newValue));
108 defaultValueCreator: (BindableProperty.CreateDefaultValueDelegate)((bindable) =>
110 var videoView = (VideoView)bindable;
112 Tizen.NUI.Object.GetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.UNDERLAY).Get(out temp);
115 /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
116 [EditorBrowsable(EditorBrowsableState.Never)]
117 public static readonly BindableProperty ResourceUrlProperty = BindableProperty.Create(nameof(ResourceUrl), typeof(string), typeof(VideoView), string.Empty, propertyChanged: (BindableProperty.BindingPropertyChangedDelegate)((bindable, oldValue, newValue) =>
119 var videoView = (VideoView)bindable;
120 if (newValue != null)
122 Tizen.NUI.Object.SetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.VIDEO, new Tizen.NUI.PropertyValue((string)newValue));
125 defaultValueCreator: (BindableProperty.CreateDefaultValueDelegate)((bindable) =>
127 var videoView = (VideoView)bindable;
129 Tizen.NUI.Object.GetProperty((HandleRef)videoView.SwigCPtr, VideoView.Property.VIDEO).Get(out temp);
133 private FinishedCallbackDelegate _videoViewFinishedCallbackDelegate;
134 private EventHandler<FinishedEventArgs> _videoViewFinishedEventHandler;
137 /// Creates an initialized VideoView.
139 /// <since_tizen> 3 </since_tizen>
140 public VideoView() : this(Interop.VideoView.New(), true)
142 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
146 /// Creates an initialized VideoView.<br />
147 /// If the string is empty, VideoView will not display anything.<br />
149 /// <param name="url">The URL of the video resource to display.</param>
150 /// <since_tizen> 3 </since_tizen>
151 public VideoView(string url) : this(Interop.VideoView.New(url), true)
153 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
157 /// Hidden API (Inhouse API).
158 /// Using Uri class to provide safe sevice and secure API.
159 /// Creates an initialized VideoView.
160 /// If the string is empty, VideoView will not display anything.
162 /// <param name="uri">The URI of the video resource to display.</param>
163 [EditorBrowsable(EditorBrowsableState.Never)]
164 public VideoView(Uri uri) : this(Interop.VideoView.New((uri == null) ? String.Empty : uri.AbsoluteUri), true)
166 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
170 /// Creates an initialized VideoView.<br />
171 /// If the string is empty, VideoView will not display anything.<br />
173 /// <param name="swCodec">Video rendering by H/W codec if false.</param>
174 [EditorBrowsable(EditorBrowsableState.Never)]
175 public VideoView(bool swCodec) : this(Interop.VideoView.New(swCodec), true)
177 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
181 /// Creates an initialized VideoView.<br />
182 /// If the string is empty, VideoView will not display anything.<br />
184 /// <param name="url">The URL of the video resource to display.</param>
185 /// <param name="swCodec">Video rendering by H/W codec if false.</param>
186 [EditorBrowsable(EditorBrowsableState.Never)]
187 public VideoView(string url, bool swCodec) : this(Interop.VideoView.New(url, swCodec), true)
189 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
193 /// Hidden API (Inhouse API).
194 /// Using Uri class to provide safe sevice and secure API.
195 /// Creates an initialized VideoView.
196 /// If the string is empty, VideoView will not display anything.
198 /// <param name="uri">The URI of the video resource to display.</param>
199 /// <param name="swCodec">Video rendering by H/W codec if false.</param>
200 [EditorBrowsable(EditorBrowsableState.Never)]
201 public VideoView(Uri uri, bool swCodec) : this(Interop.VideoView.New((uri == null) ? String.Empty : uri.AbsoluteUri, swCodec), true)
203 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
206 internal VideoView(VideoView videoView) : this(Interop.VideoView.NewVideoView(VideoView.getCPtr(videoView)), true)
208 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
211 internal VideoView(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
215 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
216 private delegate void FinishedCallbackDelegate(IntPtr data);
219 /// Event for the finished signal which can be used to subscribe or unsubscribe the event handler
220 /// The finished signal is emitted when a video playback has finished.<br />
222 /// <since_tizen> 3 </since_tizen>
223 public event EventHandler<FinishedEventArgs> Finished
227 if (_videoViewFinishedEventHandler == null)
229 _videoViewFinishedCallbackDelegate = (OnFinished);
230 FinishedSignal().Connect(_videoViewFinishedCallbackDelegate);
232 _videoViewFinishedEventHandler += value;
236 _videoViewFinishedEventHandler -= value;
237 if (_videoViewFinishedEventHandler == null && FinishedSignal().Empty() == false)
239 FinishedSignal().Disconnect(_videoViewFinishedCallbackDelegate);
245 /// Video file setting type of PropertyMap.
247 /// <since_tizen> 3 </since_tizen>
248 public PropertyMap Video
252 return (PropertyMap)GetValue(VideoProperty);
256 SetValue(VideoProperty, value);
257 NotifyPropertyChanged();
262 /// The looping status, true or false.
264 /// <since_tizen> 3 </since_tizen>
269 return (bool)GetValue(LoopingProperty);
273 SetValue(LoopingProperty, value);
274 NotifyPropertyChanged();
279 /// The mute status, true or false.
281 /// <since_tizen> 3 </since_tizen>
286 return (bool)GetValue(MutedProperty);
290 SetValue(MutedProperty, value);
291 NotifyPropertyChanged();
296 /// The left and the right volume scalar as float type, PropertyMap with two values ( "left" and "right" ).
298 /// <since_tizen> 3 </since_tizen>
299 public PropertyMap Volume
303 return (PropertyMap)GetValue(VolumeProperty);
307 SetValue(VolumeProperty, value);
308 NotifyPropertyChanged();
313 /// Video rendering by underlay, true or false.<br />
314 /// This shows video composited underneath the window by the system. This means it may ignore rotation of the video-view.
316 /// <since_tizen> 4 </since_tizen>
321 return (bool)GetValue(UnderlayProperty);
325 SetValue(UnderlayProperty, value);
326 NotifyPropertyChanged();
331 /// Video file URL as string type.
333 /// <since_tizen> 4 </since_tizen>
334 public string ResourceUrl
338 return (string)GetValue(ResourceUrlProperty);
342 SetValue(ResourceUrlProperty, value);
343 NotifyPropertyChanged();
348 /// Starts the video playback.
350 /// <since_tizen> 3 </since_tizen>
353 Interop.VideoView.Play(SwigCPtr);
354 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
358 /// Pauses the video playback.
360 /// <since_tizen> 3 </since_tizen>
363 Interop.VideoView.Pause(SwigCPtr);
364 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
368 /// Stops the video playback.
370 /// <since_tizen> 3 </since_tizen>
373 Interop.VideoView.Stop(SwigCPtr);
374 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
378 /// Seeks forward by the specified number of milliseconds.
380 /// <param name="millisecond">The position for forward playback.</param>
381 /// <since_tizen> 3 </since_tizen>
382 public void Forward(int millisecond)
384 Interop.VideoView.Forward(SwigCPtr, millisecond);
385 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
389 /// Seeks backward by the specified number of milliseconds.
391 /// <param name="millisecond">The position for backward playback.</param>
392 /// <since_tizen> 3 </since_tizen>
393 public void Backward(int millisecond)
395 Interop.VideoView.Backward(SwigCPtr, millisecond);
396 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
399 internal VideoViewSignal FinishedSignal()
401 VideoViewSignal ret = new VideoViewSignal(Interop.VideoView.FinishedSignal(SwigCPtr), false);
402 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
406 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(VideoView obj)
408 return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.SwigCPtr;
414 /// <param name="type">DisposeTypes</param>
415 /// <since_tizen> 3 </since_tizen>
416 protected override void Dispose(DisposeTypes type)
423 //Release your own unmanaged resources here.
424 //You should not access any managed member here except static instance.
425 //because the execution order of Finalizes is non-deterministic.
427 if (this != null && _videoViewFinishedCallbackDelegate != null)
429 FinishedSignal().Disconnect(_videoViewFinishedCallbackDelegate);
435 /// This will not be public opened.
436 [EditorBrowsable(EditorBrowsableState.Never)]
437 protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
439 Interop.VideoView.DeleteVideoView(swigCPtr);
442 // Callback for VideoView Finished signal
443 private void OnFinished(IntPtr data)
445 FinishedEventArgs e = new FinishedEventArgs();
447 // Populate all members of "e" (FinishedEventArgs) with real data
448 e.VideoView = Registry.GetManagedBaseHandleFromNativePtr(data) as VideoView;
450 if (_videoViewFinishedEventHandler != null)
452 //here we send all data to user event handlers
453 _videoViewFinishedEventHandler(this, e);
458 /// Event arguments that passed via the finished signal.
460 /// <since_tizen> 3 </since_tizen>
461 public class FinishedEventArgs : EventArgs
463 private VideoView _videoView;
466 /// The view for video playback and display.
468 /// <since_tizen> 3 </since_tizen>
469 public VideoView VideoView
482 internal new class Property
484 internal static readonly int VIDEO = Interop.VideoView.VideoGet();
485 internal static readonly int LOOPING = Interop.VideoView.LoopingGet();
486 internal static readonly int MUTED = Interop.VideoView.MutedGet();
487 internal static readonly int VOLUME = Interop.VideoView.VolumeGet();
488 internal static readonly int UNDERLAY = Interop.VideoView.UnderlayGet();
491 internal System.IntPtr GetNativePlayerHandle()
493 var ret = Interop.VideoView.GetNativePlayerHandle(SwigCPtr);
494 NUILog.Debug($"NativePlayerHandle=0x{ret:X}");
500 /// Contains and encapsulates Native Player handle.
502 [EditorBrowsable(EditorBrowsableState.Never)]
503 public class SafeNativePlayerHandle : SafeHandle
506 /// Contructor, null handle is set.
508 [EditorBrowsable(EditorBrowsableState.Never)]
509 public SafeNativePlayerHandle() : base(global::System.IntPtr.Zero, false)
514 /// Contructor, Native player handle is set to handle.
516 [EditorBrowsable(EditorBrowsableState.Never)]
517 public SafeNativePlayerHandle(VideoView videoView) : base(global::System.IntPtr.Zero, false)
519 if (videoView != null)
521 SetHandle(videoView.GetNativePlayerHandle());
526 /// Null check if the handle is valid or not.
528 [EditorBrowsable(EditorBrowsableState.Never)]
529 public override bool IsInvalid
533 return handle == global::System.IntPtr.Zero;
537 /// Release handle itself.
539 /// <returns>true when released successfully.</returns>
540 [EditorBrowsable(EditorBrowsableState.Never)]
541 protected override bool ReleaseHandle()
543 SetHandle(global::System.IntPtr.Zero);